From: Kay Sievers Date: Fri, 21 Nov 2008 06:26:44 +0000 (+0100) Subject: volume_id: clear probing result before probing and do not probe a second time, if... X-Git-Tag: 174~1292 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f1ab8f912e06e50e6e42c3e3ece259d7f3e81f6b;p=systemd volume_id: clear probing result before probing and do not probe a second time, if not needed On Thu, Nov 20, 2008 at 14:17, Karel Zak wrote: > I see the patch (volume_id_probe_filesystem()) and a few things come > to mind: > > - shouldn't be the relevant parts (label, uuid, version, ...) of > the "struct volume_id" zeroized when you found a signature and > before you call the next probing function? > > - it seems as overkill to use two for()s and probe two times for all > filesystems. What about to store the first result and re-use it? > > - .. or at least never use the second for() when the fist for() found > nothing ;-) --- diff --git a/extras/volume_id/lib/volume_id.c b/extras/volume_id/lib/volume_id.c index aaa15e1e..a93ade64 100644 --- a/extras/volume_id/lib/volume_id.c +++ b/extras/volume_id/lib/volume_id.c @@ -383,6 +383,18 @@ found: return 0; } +static void volume_id_reset_result(struct volume_id *id) +{ + id->label_raw_len = 0; + id->label[0] = '\0'; + id->uuid_raw_len = 0; + id->uuid[0] = '\0'; + id->usage_id = VOLUME_ID_UNUSED; + id->usage = NULL; + id->type = NULL; + id->type_version[0] = '\0'; +} + /** * volume_id_probe_filesystem: * @id: Probing context. @@ -423,25 +435,41 @@ int volume_id_probe_filesystem(struct volume_id *id, uint64_t off, uint64_t size if (size > 1440 * 1024) { int found = 0; int force_unique_result = 0; + int first_match = -1; + volume_id_reset_result(id); for (i = 0; i < ARRAY_SIZE(prober_filesystem); i++) { int match; match = (prober_filesystem[i].prober(id, off, size) == 0); if (match) { - info("signature '%s' detected\n", id->type); + info("signature '%s' %i detected\n", id->type, i); if (id->force_unique_result) force_unique_result = 1; if (found && force_unique_result) { info("conflicting signatures found, skip results\n"); return -1; } - found = 1; + found++; + if (first_match < 0) + first_match = i; } } + if (found < 1) + return -1; + if (found == 1) + goto found; + if (found > 1) { + volume_id_reset_result(id); + info("re-read first match metadata %i\n", first_match); + if (prober_filesystem[first_match].prober(id, off, size) == 0) + goto found; + return -1; + } } /* return the first match */ + volume_id_reset_result(id); for (i = 0; i < ARRAY_SIZE(prober_filesystem); i++) { if (prober_filesystem[i].prober(id, off, size) == 0) { info("signature '%s' detected\n", id->type);