diff options
author | Anand Jain <anand.jain@oracle.com> | 2013-09-27 23:45:00 +0800 |
---|---|---|
committer | Chris Mason <chris.mason@fusionio.com> | 2013-10-16 08:23:11 -0400 |
commit | 844034adba58d2af50dc01ac36a0ba817ca3df9c (patch) | |
tree | 2f34931088ce6de672b9d2e826b4cd886cea71c1 | |
parent | 23c47a132fe617fdde709959ee29b39df03870e3 (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.c | 55 | ||||
-rw-r--r-- | utils.h | 2 |
2 files changed, 57 insertions, 0 deletions
@@ -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; } @@ -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 |