summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@vrfy.org>2007-12-17 15:32:41 +0100
committerKay Sievers <kay.sievers@vrfy.org>2007-12-17 15:32:41 +0100
commit73ff769c90307e9ef2947c7ba013626fb65c1478 (patch)
tree51ec403dfb68f999a86085feef589269d77b7abb
parentbe580fa5d83ef4b73b71f29ebd76b1f26eb12e9c (diff)
volume_id: also add readable check to probe_all()
Otherwise probe_all will run two times into a timout, one for the raid, and one for the filesystem probe. Thanks to Tore Anderson for the debugging.
-rw-r--r--extras/volume_id/lib/volume_id.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/extras/volume_id/lib/volume_id.c b/extras/volume_id/lib/volume_id.c
index b82de2344d..9edbb69fb9 100644
--- a/extras/volume_id/lib/volume_id.c
+++ b/extras/volume_id/lib/volume_id.c
@@ -330,6 +330,14 @@ err:
return 0;
}
+/* run only once into a timeout for unreadable devices */
+static int device_is_readable(struct volume_id *id)
+{
+ if (volume_id_get_buffer(id, 0x00, 0x200) != NULL)
+ return 1;
+ return 0;
+}
+
/**
* volume_id_probe_raid:
* @id: Probing context.
@@ -347,8 +355,7 @@ int volume_id_probe_raid(struct volume_id *id, uint64_t off, uint64_t size)
if (id == NULL)
return -EINVAL;
- /* run only once into a timeout for unreadable devices */
- if (volume_id_get_buffer(id, 0x00, 0x200) == NULL)
+ if (!device_is_readable(id))
return -1;
info("probing at offset 0x%llx, size 0x%llx",
@@ -382,8 +389,7 @@ int volume_id_probe_filesystem(struct volume_id *id, uint64_t off, uint64_t size
if (id == NULL)
return -EINVAL;
- /* run only once into a timeout for unreadable devices */
- if (volume_id_get_buffer(id, 0x00, 0x200) == NULL)
+ if (!device_is_readable(id))
return -1;
info("probing at offset 0x%llx, size 0x%llx",
@@ -415,6 +421,9 @@ int volume_id_probe_all(struct volume_id *id, uint64_t off, uint64_t size)
if (id == NULL)
return -EINVAL;
+ if (!device_is_readable(id))
+ return -1;
+
/* probe for raid first, because fs probes may be successful on raid members */
if (volume_id_probe_raid(id, off, size) == 0)
return 0;