* [PATCH] btrfs-progs: create helper function to use lblkid to scan for btrfs disks
@ 2013-09-27 15:45 Anand Jain
2013-09-27 16:10 ` Anand Jain
0 siblings, 1 reply; 5+ messages in thread
From: Anand Jain @ 2013-09-27 15:45 UTC (permalink / raw)
To: linux-btrfs
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
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] btrfs-progs: create helper function to use lblkid to scan for btrfs disks
2013-09-27 15:45 [PATCH] btrfs-progs: create helper function to use lblkid to scan for btrfs disks Anand Jain
@ 2013-09-27 16:10 ` Anand Jain
2013-09-27 16:21 ` Wang Shilong
0 siblings, 1 reply; 5+ messages in thread
From: Anand Jain @ 2013-09-27 16:10 UTC (permalink / raw)
To: linux-btrfs
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
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] btrfs-progs: create helper function to use lblkid to scan for btrfs disks
2013-09-27 16:10 ` Anand Jain
@ 2013-09-27 16:21 ` Wang Shilong
2013-10-01 12:03 ` David Sterba
0 siblings, 1 reply; 5+ messages in thread
From: Wang Shilong @ 2013-09-27 16:21 UTC (permalink / raw)
To: Anand Jain; +Cc: linux-btrfs
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
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] btrfs-progs: create helper function to use lblkid to scan for btrfs disks
2013-09-27 16:21 ` Wang Shilong
@ 2013-10-01 12:03 ` David Sterba
2013-10-07 10:21 ` Anand Jain
0 siblings, 1 reply; 5+ messages in thread
From: David Sterba @ 2013-10-01 12:03 UTC (permalink / raw)
To: Wang Shilong; +Cc: Anand Jain, linux-btrfs
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
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] btrfs-progs: create helper function to use lblkid to scan for btrfs disks
2013-10-01 12:03 ` David Sterba
@ 2013-10-07 10:21 ` Anand Jain
0 siblings, 0 replies; 5+ messages in thread
From: Anand Jain @ 2013-10-07 10:21 UTC (permalink / raw)
To: dsterba, Wang Shilong, linux-btrfs
>>> 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
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-10-07 10:14 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-09-27 15:45 [PATCH] btrfs-progs: create helper function to use lblkid to scan for btrfs disks Anand Jain
2013-09-27 16:10 ` Anand Jain
2013-09-27 16:21 ` Wang Shilong
2013-10-01 12:03 ` David Sterba
2013-10-07 10:21 ` Anand Jain
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).