Re: [PATCH v2 2/2] btrfs-progs: use kernel for mounted and lblkid to scan disks

2013-09-13 Thread Anand Jain



Thanks for implementing it! I found a few things to fix, comments below.

I wonder if we should keep --all-devices as a last resort fallback eg.


 Any idea whats the real use of --all-devices option anyway
 I am unsure. Anyway will restore --all-devices so now.

 all other suggestion were considered as well.


I see this warning and there are no mounted filesystems listed in the
output:

$ ./btrfs fi show
ERROR: scan kernel failed, -1



when does this happen ? I can't reproduce it.

Thanks, Anand
--
To unsubscribe from this list: send the line unsubscribe linux-btrfs in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 2/2] btrfs-progs: use kernel for mounted and lblkid to scan disks

2013-09-13 Thread David Sterba
On Fri, Sep 13, 2013 at 06:49:10PM +0800, Anand Jain wrote:
 I wonder if we should keep --all-devices as a last resort fallback eg.
 
  Any idea whats the real use of --all-devices option anyway
  I am unsure. Anyway will restore --all-devices so now.

That's when udev breaks or is not present on the system at all.

http://thread.gmane.org/gmane.comp.file-systems.btrfs/11336

It's hard to know if there are users or not, from the thread above there
is at least one.

A good practice is to leave some deprecation period before removing a
functionality, so we should rather add a warning that the option is
about to be removed -- because udev is everywhere and computers don't
break, right?

 I see this warning and there are no mounted filesystems listed in the
 output:
 
 $ ./btrfs fi show
 ERROR: scan kernel failed, -1
 
 when does this happen ? I can't reproduce it.

Reproduced with today's linus tree (btrfs pull is there), progs contain the
patches in question:

blkid lists btrfs filesysems:
/dev/sda5
/dev/sda6
/dev/sda7
/dev/sda8
/dev/sda9
/dev/sda11
/dev/sda15
/dev/sdb

mounted filesystems:
/dev/sda5 /mnt/a1 btrfs rw,relatime,space_cache 0 0
/dev/sdb /mnt/test btrfs rw,relatime,space_cache 0 0

$ ./btrfs fi show
ERROR: scan kernel failed, -1
Label: none  uuid: 7c7c948e-c8bc-40fb-88e3-19a3dd4fe6f9 (unmounted)
Total devices 2 FS bytes used 288.00KiB
devid2 size 4.04GiB used 0.00 path /dev/sda15
*** Some devices missing

Label: none  uuid: a7e96a20-eceb-4593-a836-a8657c66e24b (unmounted)
Total devices 2 FS bytes used 6.87GiB
devid1 size 10.00GiB used 9.03GiB path /dev/sda11
devid0 size 10.00GiB used 4.01GiB path /dev/sda9

sda6/7/8/9 belong to sda5 and are not listed here
--
To unsubscribe from this list: send the line unsubscribe linux-btrfs in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 2/2] btrfs-progs: use kernel for mounted and lblkid to scan disks

2013-09-13 Thread David Sterba
On Fri, Sep 13, 2013 at 05:56:46PM +0200, David Sterba wrote:
 Reproduced with today's linus tree (btrfs pull is there), progs contain the
 patches in question:

Reproduces with the updated patches you sent today.
--
To unsubscribe from this list: send the line unsubscribe linux-btrfs in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v2 2/2] btrfs-progs: use kernel for mounted and lblkid to scan disks

2013-09-12 Thread David Sterba
On Fri, Sep 06, 2013 at 05:37:53PM +0800, Anand Jain wrote:
 Further, to scan for the disks this patch will use
 lblkid, so that we don't have to manually scan the
 /dev or /dev/mapper which means we don't need the
 all-devices options.

Thanks for implementing it! I found a few things to fix, comments below.

I wonder if we should keep --all-devices as a last resort fallback eg.
when blkid cache is not available.

 --- a/cmds-filesystem.c
 +++ b/cmds-filesystem.c
 -static int uuid_search(struct btrfs_fs_devices *fs_devices, char *search)
 -{
 - char uuidbuf[37];
 - struct list_head *cur;
 - struct btrfs_device *device;
 - int search_len = strlen(search);
 -
 - search_len = min(search_len, 37);
 - uuid_unparse(fs_devices-fsid, uuidbuf);
 - if (!strncmp(uuidbuf, search, search_len))
 - return 1;
 -
 - list_for_each(cur, fs_devices-devices) {
 - device = list_entry(cur, struct btrfs_device, dev_list);
 - if ((device-label  strcmp(device-label, search) == 0) ||
 - strcmp(device-name, search) == 0)
 - return 1;
 - }
 - return 0;
 -}

This is removing functionality and I don't understand why. It's used for

$ btrfs fi show 9f135b48-cc15-424b-8730-a6432c67dc34
[prints only the given filesystem]

and with your patch does not work as such. Can it be implemented on top
of the code you're adding in this patch? If yes, please make a separate
patch for that.

 @@ -232,8 +214,108 @@ static void print_one_uuid(struct btrfs_fs_devices 
 *fs_devices)
   printf(\n);
  }
  
 +/* adds up all the used spaces as reported by the space info ioctl
 + */
 +static u64 cal_used_bytes(struct btrfs_ioctl_space_args *si)

calc_used_bytes

 +static int btrfs_scan_kernel(void *input, int type)
 +{
 + int ret = 0, fd;
 + FILE *f;
 + struct mntent *mnt;
 + struct btrfs_ioctl_fs_info_args fi;
 + struct btrfs_ioctl_dev_info_args *di = NULL;
 + struct btrfs_ioctl_space_args *si;

the variable names are not very descriptive

 + char label[BTRFS_LABEL_SIZE];
 +
 + f = setmntent(/proc/mounts, r);

should be /proc/self/mounts

 + if (f == NULL)
 + return -errno;

man says that setmntent does not set errno 

 +
 + while ((mnt = getmntent(f)) != NULL) {
 + if (strcmp(mnt-mnt_type, btrfs))
 + continue;
 + ret = get_fs_info(mnt-mnt_dir, fi, di);
 + if (ret)
 + return ret;
 +
 + switch (type) {

Please add defines instead of the integers representing 'type'.

 + case 0:
 + break;
 + case 1:
 + if (uuid_compare(fi.fsid, (u8 *)input))
 + continue;
 + break;
 + case 2:
 + if (strcmp(input, mnt-mnt_dir))
 + continue;
 + break;

I haven't seen 1 and 2 used anywhere

 + default:
 + break;
 + }
 +
 + fd = open(mnt-mnt_dir, O_RDONLY);
 + if (fd  0  !get_df(fd, si)) {
 + get_label_mounted(mnt-mnt_dir, label);
 + print_one_fs(fi, di, si, label, mnt-mnt_dir);
 + free(si);
 + }
 + if (fd  0)
 + close(fd);
 + free(di);
 + }
 + return ret;
 +}
 @@ -244,36 +326,42 @@ static int cmd_show(int argc, char **argv)
 + /* show only mounted btrfs disks */
 + if (argc  1  !strcmp(argv[1], --mounted))
 + where = BTRFS_SCAN_MOUNTED;
  
 - all_uuids = btrfs_scanned_uuids();
 - list_for_each(cur_uuid, all_uuids) {
 - fs_devices = list_entry(cur_uuid, struct btrfs_fs_devices,
 + switch (where) {
 + case 0:
 + /* no option : show both mounted and unmounted
 +  */
 + /* mounted */
 + ret = btrfs_scan_kernel(NULL, 0);
 + if (ret)
 + fprintf(stderr, ERROR: scan kernel failed, %d\n,
 + ret);

I see this warning and there are no mounted filesystems listed in the
output:

$ ./btrfs fi show
ERROR: scan kernel failed, -1


 +
 + /* unmounted */
 + scan_for_btrfs_v2(!BTRFS_UPDATE_KERNEL);
 + all_uuids = btrfs_scanned_uuids();
 + list_for_each(cur_uuid, all_uuids) {
 + fs_devices = list_entry(cur_uuid,
 + struct btrfs_fs_devices,
   list);
 - if (search  uuid_search(fs_devices, search) == 0)
 - continue;
 - print_one_uuid(fs_devices);
 + print_one_uuid(fs_devices);
 + }
 + break;
 + case BTRFS_SCAN_MOUNTED:
 + ret = btrfs_scan_kernel(NULL, 0);
 + if (ret)
 +