summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnand Jain <anand.jain@oracle.com>2013-09-27 23:45:00 +0800
committerChris Mason <chris.mason@fusionio.com>2013-10-16 08:23:11 -0400
commit844034adba58d2af50dc01ac36a0ba817ca3df9c (patch)
tree2f34931088ce6de672b9d2e826b4cd886cea71c1
parent23c47a132fe617fdde709959ee29b39df03870e3 (diff)
btrfs-progs: create helper function to use lblkid to scan for btrfs disks
Signed-off-by: Anand Jain <anand.jain@oracle.com> Signed-off-by: David Sterba <dsterba@suse.cz> Signed-off-by: Chris Mason <chris.mason@fusionio.com>
-rw-r--r--utils.c55
-rw-r--r--utils.h2
2 files changed, 57 insertions, 0 deletions
diff --git a/utils.c b/utils.c
index accecefb..2f1d54fb 100644
--- a/utils.c
+++ b/utils.c
@@ -1914,6 +1914,58 @@ int test_dev_for_mkfs(char *file, int force_overwrite, char *estr)
return 0;
}
+int test_skip_this_disk(char *path)
+{
+ int fd;
+
+ /*
+ * this will eliminate disks which are mounted (btrfs)
+ * and non-dm disk path when dm is enabled
+ */
+ fd = open(path, O_RDWR|O_EXCL);
+ if (fd < 0)
+ return 1;
+ close(fd);
+ return 0;
+}
+
+int btrfs_scan_lblkid(int update_kernel)
+{
+ int fd = -1;
+ u64 num_devices;
+ struct btrfs_fs_devices *tmp_devices;
+ blkid_dev_iterate iter = NULL;
+ blkid_dev dev = NULL;
+ blkid_cache cache = NULL;
+ char path[PATH_MAX];
+
+ if (blkid_get_cache(&cache, 0) < 0) {
+ printf("ERROR: lblkid cache get failed\n");
+ return 1;
+ }
+ blkid_probe_all(cache);
+ iter = blkid_dev_iterate_begin(cache);
+ blkid_dev_set_search(iter, "TYPE", "btrfs");
+ while (blkid_dev_next(iter, &dev) == 0) {
+ dev = blkid_verify(cache, dev);
+ if (!dev)
+ continue;
+ /* if we are here its definitly a btrfs disk*/
+ strcpy(path, blkid_dev_devname(dev));
+ if (test_skip_this_disk(path))
+ continue;
+
+ fd = open(path, O_RDONLY);
+ btrfs_scan_one_device(fd, path, &tmp_devices,
+ &num_devices, BTRFS_SUPER_INFO_OFFSET);
+ close(fd);
+ if (update_kernel)
+ btrfs_register_one_device(path);
+ }
+ blkid_dev_iterate_end(iter);
+ return 0;
+}
+
/*
* scans devs for the btrfs
*/
@@ -1928,6 +1980,9 @@ int scan_for_btrfs(int where, int update_kernel)
case BTRFS_SCAN_DEV:
ret = btrfs_scan_one_dir("/dev", update_kernel);
break;
+ case BTRFS_SCAN_LBLKID:
+ ret = btrfs_scan_lblkid(update_kernel);
+ break;
}
return ret;
}
diff --git a/utils.h b/utils.h
index 19f028f2..a6d3e5ec 100644
--- a/utils.h
+++ b/utils.h
@@ -27,6 +27,7 @@
#define BTRFS_SCAN_PROC 1
#define BTRFS_SCAN_DEV 2
+#define BTRFS_SCAN_LBLKID (1ULL << 3)
int make_btrfs(int fd, const char *device, const char *label,
u64 blocks[6], u64 num_bytes, u32 nodesize,
@@ -82,5 +83,6 @@ int csum_tree_block(struct btrfs_root *root, struct extent_buffer *buf,
int verify);
int ask_user(char *question);
int lookup_ino_rootid(int fd, u64 *rootid);
+int btrfs_scan_lblkid(int update_kernel);
#endif