Anand Jain
2013-Sep-27 15:45 UTC
[PATCH] btrfs-progs: create helper function to use lblkid to scan for btrfs disks
Signed-off-by: Anand Jain <anand.jain@oracle.com> --- utils.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ utils.h | 2 ++ 2 files changed, 56 insertions(+) diff --git a/utils.c b/utils.c index c6022fc..ccb5199 100644 --- a/utils.c +++ b/utils.c @@ -1914,6 +1914,57 @@ 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); + fd = -1; + if (update_kernel) + btrfs_register_one_device(path); + } + blkid_dev_iterate_end(iter); + return 0; +} + /* * scans devs for the btrfs */ @@ -1928,6 +1979,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 e944685..0f31db7 100644 --- a/utils.h +++ b/utils.h @@ -28,6 +28,7 @@ #define BTRFS_SCAN_PROC (1ULL << 0) #define BTRFS_SCAN_DEV (1ULL << 1) #define BTRFS_SCAN_MOUNTED (1ULL << 2) +#define BTRFS_SCAN_LBLKID (1ULL << 3) #define BTRFS_UPDATE_KERNEL 1 @@ -89,5 +90,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 -- 1.8.4.rc4.1.g0d8beaa -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Anand Jain
2013-Sep-27 16:10 UTC
Re: [PATCH] btrfs-progs: create helper function to use lblkid to scan for btrfs disks
Following this patch the idea is to use lblkid to scan for the btrfs disks by default which means we don''t use BTRFS_SCAN_PROC any more. which implies commands btrfs filesystem show and btrfs device scan will use lblkid to scan disks instead of current /proc/partitions by default. So now the question is, if there is any need to have option to scan using /proc/partitions ? and instead of removing it completely would we need it under a new option ''-p'' (in filesystem show and device scan) so that user can use /proc/partitions when needed, I really don''t know what would be that circumstance though, Any thoughts? Thanks Anand On 09/27/2013 11:45 PM, Anand Jain wrote:> Signed-off-by: Anand Jain <anand.jain@oracle.com> > --- > utils.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ > utils.h | 2 ++ > 2 files changed, 56 insertions(+) > > diff --git a/utils.c b/utils.c > index c6022fc..ccb5199 100644 > --- a/utils.c > +++ b/utils.c > @@ -1914,6 +1914,57 @@ 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); > + fd = -1; > + if (update_kernel) > + btrfs_register_one_device(path); > + } > + blkid_dev_iterate_end(iter); > + return 0; > +} > + > /* > * scans devs for the btrfs > */ > @@ -1928,6 +1979,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 e944685..0f31db7 100644 > --- a/utils.h > +++ b/utils.h > @@ -28,6 +28,7 @@ > #define BTRFS_SCAN_PROC (1ULL << 0) > #define BTRFS_SCAN_DEV (1ULL << 1) > #define BTRFS_SCAN_MOUNTED (1ULL << 2) > +#define BTRFS_SCAN_LBLKID (1ULL << 3) > > #define BTRFS_UPDATE_KERNEL 1 > > @@ -89,5 +90,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 >-- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Wang Shilong
2013-Sep-27 16:21 UTC
Re: [PATCH] btrfs-progs: create helper function to use lblkid to scan for btrfs disks
Helo Anand,> > > Following this patch the idea is to use lblkid to scan > for the btrfs disks by default which means we don''t > use BTRFS_SCAN_PROC any more.Firstly, i would like to know if we will get any different results between scanning /proc/partions and using lbkid. If not, why we can use liblkid totally,since this is more simple. Thanks, Wang> which implies commands btrfs filesystem show and btrfs device scan will > use lblkid to scan disks instead of current /proc/partitions > by default. > > So now the question is, if there is any need to have option to scan > using /proc/partitions ? and instead of removing it completely > would we need it under a new option ''-p'' (in filesystem show and > device scan) so that user can use /proc/partitions when needed, > I really don''t know what would be that circumstance though, > > Any thoughts? > > Thanks Anand > > > > On 09/27/2013 11:45 PM, Anand Jain wrote: >> Signed-off-by: Anand Jain <anand.jain@oracle.com> >> --- >> utils.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ >> utils.h | 2 ++ >> 2 files changed, 56 insertions(+) >> >> diff --git a/utils.c b/utils.c >> index c6022fc..ccb5199 100644 >> --- a/utils.c >> +++ b/utils.c >> @@ -1914,6 +1914,57 @@ 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); >> + fd = -1; >> + if (update_kernel) >> + btrfs_register_one_device(path); >> + } >> + blkid_dev_iterate_end(iter); >> + return 0; >> +} >> + >> /* >> * scans devs for the btrfs >> */ >> @@ -1928,6 +1979,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 e944685..0f31db7 100644 >> --- a/utils.h >> +++ b/utils.h >> @@ -28,6 +28,7 @@ >> #define BTRFS_SCAN_PROC (1ULL << 0) >> #define BTRFS_SCAN_DEV (1ULL << 1) >> #define BTRFS_SCAN_MOUNTED (1ULL << 2) >> +#define BTRFS_SCAN_LBLKID (1ULL << 3) >> >> #define BTRFS_UPDATE_KERNEL 1 >> >> @@ -89,5 +90,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 >> > > -- > To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html-- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
David Sterba
2013-Oct-01 12:03 UTC
Re: [PATCH] btrfs-progs: create helper function to use lblkid to scan for btrfs disks
On Sat, Sep 28, 2013 at 12:21:51AM +0800, Wang Shilong wrote:> > Following this patch the idea is to use lblkid to scan > > for the btrfs disks by default which means we don''t > > use BTRFS_SCAN_PROC any more. > > Firstly, i would like to know if we will get any different results between scanning > /proc/partions and using lbkid.I take blkid as a more authoritative source, /proc/partitions was a workaround to avoid scanning the whole /dev directory.> If not, why we can use liblkid totally,since this is more simple.Agreed, blkid by default and --all-devices as a last resort fallback. The proc workaround can go away. david -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Anand Jain
2013-Oct-07 10:21 UTC
Re: [PATCH] btrfs-progs: create helper function to use lblkid to scan for btrfs disks
>>> Following this patch the idea is to use lblkid to scan >>> for the btrfs disks by default which means we don''t >>> use BTRFS_SCAN_PROC any more. >> >> Firstly, i would like to know if we will get any different results between scanning >> /proc/partions and using lbkid. > > I take blkid as a more authoritative source, /proc/partitions was a > workaround to avoid scanning the whole /dev directory. > >> If not, why we can use liblkid totally,since this is more simple. > > Agreed, blkid by default and --all-devices as a last resort fallback.compiled using BTRFS_SCAN_LBLKID as default. --- --- a/cmds-filesystem.c +++ b/cmds-filesystem.c @@ -402,7 +402,8 @@ static int cmd_show(int argc, char **argv) struct list_head *cur_uuid; char *search = NULL; int ret; - int where = BTRFS_SCAN_PROC; + int where = BTRFS_SCAN_LBLKID; int type = 0; while (1) { ------ # btrfs fi show Label: none uuid: c114c6ce-58a1-4e2c-839e-b53c5ba5ba75 Total devices 1 FS bytes used 756.00KiB devid 1 size 1.10GiB used 324.00MiB path /dev/mapper/mpathg --- recompiled to use BTRFS_SCAN_PROC as in original. --- # btrfs fi show Label: none uuid: c114c6ce-58a1-4e2c-839e-b53c5ba5ba75 Total devices 1 FS bytes used 36.00KiB devid 1 size 1.10GiB used 148.62MiB path /dev/dm-2 --- > The proc workaround can go away. The other choice is to use both, ''BTRFS_SCAN_PROC | BTRFS_SCAN_DEV'' for --all-devices option. in that way proc-way will still be in there. Thanks, Anand -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html