X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=extras%2Fvolume_id%2Flib%2Fvolume_id.c;h=a93ade6427363176b68010cc9f18f57021380cf5;hp=e4d2ed4cfac725adc092ffc7fe1fa73e6edca181;hb=f1ab8f912e06e50e6e42c3e3ece259d7f3e81f6b;hpb=779d2d851ee5dbd4c759bb973113373897d3adce diff --git a/extras/volume_id/lib/volume_id.c b/extras/volume_id/lib/volume_id.c index e4d2ed4cf..a93ade642 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. @@ -412,36 +424,52 @@ int volume_id_probe_filesystem(struct volume_id *id, uint64_t off, uint64_t size * we do not return a probing result. * * We can not afford to mount a volume with the wrong filesystem code and - * possibly corrupt it. Linux ssytems have the problem of dozens of possible + * possibly corrupt it. Linux sytems have the problem of dozens of possible * filesystem types, and volumes with left-over signatures from former - * filesystem types. Invalid signature need to be removed from the volume + * filesystem types. Invalid signatures need to be removed from the volume * to make the filesystem detection successful. * * We do not want to read that many bytes from probed floppies, skip volumes - * smaller than a usual floppy disk + * smaller than a usual floppy disk. */ 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 = 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);