Message ID | 1391755560-4721-2-git-send-email-quwenruo@cn.fujitsu.com (mailing list archive) |
---|---|
State | Under Review, archived |
Headers | show |
Whats needed is more comprehensive btrfs fi show which shows the flags (including missing) per disk. And also show the FS/Raid status. Which I am working on. sorry -p feature would be covered by default in the coming revamp of btrfs fi show. Thanks, Anand On 02/07/2014 02:46 PM, Qu Wenruo wrote: > Since a mounted btrfs filesystem contains all the devices info even a > device is removed after mount(like btrfs/003 in xfstests), > we can use the info to print the known missing device if possible. > > So -p/--print-missing options are added to print possible missing > devices. > > Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> > --- > cmds-filesystem.c | 26 ++++++++++++++++++++------ > man/btrfs.8.in | 4 +++- > 2 files changed, 23 insertions(+), 7 deletions(-) > > diff --git a/cmds-filesystem.c b/cmds-filesystem.c > index 4c9933d..77b142c 100644 > --- a/cmds-filesystem.c > +++ b/cmds-filesystem.c > @@ -360,7 +360,7 @@ static u64 calc_used_bytes(struct btrfs_ioctl_space_args *si) > static int print_one_fs(struct btrfs_ioctl_fs_info_args *fs_info, > struct btrfs_ioctl_dev_info_args *dev_info, > struct btrfs_ioctl_space_args *space_info, > - char *label, char *path) > + char *label, char *path, int print_missing) > { > int i; > int fd; > @@ -392,7 +392,14 @@ static int print_one_fs(struct btrfs_ioctl_fs_info_args *fs_info, > fd = open((char *)tmp_dev_info->path, O_RDONLY); > if (fd < 0) { > missing = 1; > - continue; > + if (print_missing) > + printf("\tdevid %4llu size %s used %s path %s (missing)\n", > + tmp_dev_info->devid, > + pretty_size(tmp_dev_info->total_bytes), > + pretty_size(tmp_dev_info->bytes_used), > + tmp_dev_info->path); > + else > + continue; > } > close(fd); > printf("\tdevid %4llu size %s used %s path %s\n", > @@ -440,7 +447,7 @@ static int check_arg_type(char *input) > return BTRFS_ARG_UNKNOWN; > } > > -static int btrfs_scan_kernel(void *search) > +static int btrfs_scan_kernel(void *search, int print_missing) > { > int ret = 0, fd; > FILE *f; > @@ -477,7 +484,8 @@ static int btrfs_scan_kernel(void *search) > fd = open(mnt->mnt_dir, O_RDONLY); > if ((fd != -1) && !get_df(fd, &space_info_arg)) { > print_one_fs(&fs_info_arg, dev_info_arg, > - space_info_arg, label, mnt->mnt_dir); > + space_info_arg, label, mnt->mnt_dir, > + print_missing); > kfree(space_info_arg); > memset(label, 0, sizeof(label)); > } > @@ -500,6 +508,7 @@ static const char * const cmd_show_usage[] = { > "Show the structure of a filesystem", > "-d|--all-devices show only disks under /dev containing btrfs filesystem", > "-m|--mounted show only mounted btrfs", > + "-p|--print-missing show known missing device if possible", > "If no argument is given, structure of all present filesystems is shown.", > NULL > }; > @@ -513,6 +522,7 @@ static int cmd_show(int argc, char **argv) > int ret; > int where = BTRFS_SCAN_LBLKID; > int type = 0; > + int print_missing = 0; > char mp[BTRFS_PATH_NAME_MAX + 1]; > char path[PATH_MAX]; > > @@ -521,9 +531,10 @@ static int cmd_show(int argc, char **argv) > static struct option long_options[] = { > { "all-devices", no_argument, NULL, 'd'}, > { "mounted", no_argument, NULL, 'm'}, > + { "print-missing", no_argument, NULL, 'p'}, > { NULL, no_argument, NULL, 0 }, > }; > - int c = getopt_long(argc, argv, "dm", long_options, > + int c = getopt_long(argc, argv, "dmp", long_options, > &long_index); > if (c < 0) > break; > @@ -534,6 +545,9 @@ static int cmd_show(int argc, char **argv) > case 'm': > where = BTRFS_SCAN_MOUNTED; > break; > + case 'p': > + print_missing = 1; > + break; > default: > usage(cmd_show_usage); > } > @@ -571,7 +585,7 @@ static int cmd_show(int argc, char **argv) > goto devs_only; > > /* show mounted btrfs */ > - ret = btrfs_scan_kernel(search); > + ret = btrfs_scan_kernel(search, print_missing); > if (search && !ret) > return 0; > > diff --git a/man/btrfs.8.in b/man/btrfs.8.in > index 8fea115..db2e355 100644 > --- a/man/btrfs.8.in > +++ b/man/btrfs.8.in > @@ -25,7 +25,7 @@ btrfs \- control a btrfs filesystem > .PP > \fBbtrfs\fP \fBfilesystem df\fP\fI <path>\fP > .PP > -\fBbtrfs\fP \fBfilesystem show\fP [\fI--mounted\fP|\fI--all-devices\fP|\fI<uuid>\fP]\fP > +\fBbtrfs\fP \fBfilesystem show\fP [\fI--mounted\fP|\fI--all-devices\fP|\fI--print-missing\fP|\fI<uuid>\fP]\fP > .PP > \fBbtrfs\fP \fBfilesystem sync\fP\fI <path> \fP > .PP > @@ -280,6 +280,8 @@ and unmounted. > If \fB--mounted\fP is passed, it would probe btrfs kernel to list mounted btrfs filesystem(s); > If \fB--all-devices\fP is passed, all the devices under /dev are scanned; > otherwise the devices list is extracted from the /proc/partitions file. > +If \fB--print-missing\fP is passed, btrfs will try its best to print the missing device. > +This option is only useful if the filesystem is already mounted since mounted filesystem may contain the device list. > .TP > > \fBfilesystem sync\fR\fI <path> \fR > -- 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
On fri, 07 Feb 2014 17:26:11 +0800, Anand Jain wrote: > > Whats needed is more comprehensive btrfs fi show > which shows the flags (including missing) per disk. Yes indeed. > And also show the FS/Raid status. Which I am working on. > > sorry -p feature would be covered by default in the > coming revamp of btrfs fi show. That's all right. Just a kind remind, if the output format changes, don't forget to modify the related xfstests testcase. Thanks, Qu > > Thanks, Anand > > > On 02/07/2014 02:46 PM, Qu Wenruo wrote: >> Since a mounted btrfs filesystem contains all the devices info even a >> device is removed after mount(like btrfs/003 in xfstests), >> we can use the info to print the known missing device if possible. >> >> So -p/--print-missing options are added to print possible missing >> devices. >> >> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> >> --- >> cmds-filesystem.c | 26 ++++++++++++++++++++------ >> man/btrfs.8.in | 4 +++- >> 2 files changed, 23 insertions(+), 7 deletions(-) >> >> diff --git a/cmds-filesystem.c b/cmds-filesystem.c >> index 4c9933d..77b142c 100644 >> --- a/cmds-filesystem.c >> +++ b/cmds-filesystem.c >> @@ -360,7 +360,7 @@ static u64 calc_used_bytes(struct >> btrfs_ioctl_space_args *si) >> static int print_one_fs(struct btrfs_ioctl_fs_info_args *fs_info, >> struct btrfs_ioctl_dev_info_args *dev_info, >> struct btrfs_ioctl_space_args *space_info, >> - char *label, char *path) >> + char *label, char *path, int print_missing) >> { >> int i; >> int fd; >> @@ -392,7 +392,14 @@ static int print_one_fs(struct >> btrfs_ioctl_fs_info_args *fs_info, >> fd = open((char *)tmp_dev_info->path, O_RDONLY); >> if (fd < 0) { >> missing = 1; >> - continue; >> + if (print_missing) >> + printf("\tdevid %4llu size %s used %s path %s >> (missing)\n", >> + tmp_dev_info->devid, >> + pretty_size(tmp_dev_info->total_bytes), >> + pretty_size(tmp_dev_info->bytes_used), >> + tmp_dev_info->path); >> + else >> + continue; >> } >> close(fd); >> printf("\tdevid %4llu size %s used %s path %s\n", >> @@ -440,7 +447,7 @@ static int check_arg_type(char *input) >> return BTRFS_ARG_UNKNOWN; >> } >> >> -static int btrfs_scan_kernel(void *search) >> +static int btrfs_scan_kernel(void *search, int print_missing) >> { >> int ret = 0, fd; >> FILE *f; >> @@ -477,7 +484,8 @@ static int btrfs_scan_kernel(void *search) >> fd = open(mnt->mnt_dir, O_RDONLY); >> if ((fd != -1) && !get_df(fd, &space_info_arg)) { >> print_one_fs(&fs_info_arg, dev_info_arg, >> - space_info_arg, label, mnt->mnt_dir); >> + space_info_arg, label, mnt->mnt_dir, >> + print_missing); >> kfree(space_info_arg); >> memset(label, 0, sizeof(label)); >> } >> @@ -500,6 +508,7 @@ static const char * const cmd_show_usage[] = { >> "Show the structure of a filesystem", >> "-d|--all-devices show only disks under /dev containing btrfs >> filesystem", >> "-m|--mounted show only mounted btrfs", >> + "-p|--print-missing show known missing device if possible", >> "If no argument is given, structure of all present filesystems >> is shown.", >> NULL >> }; >> @@ -513,6 +522,7 @@ static int cmd_show(int argc, char **argv) >> int ret; >> int where = BTRFS_SCAN_LBLKID; >> int type = 0; >> + int print_missing = 0; >> char mp[BTRFS_PATH_NAME_MAX + 1]; >> char path[PATH_MAX]; >> >> @@ -521,9 +531,10 @@ static int cmd_show(int argc, char **argv) >> static struct option long_options[] = { >> { "all-devices", no_argument, NULL, 'd'}, >> { "mounted", no_argument, NULL, 'm'}, >> + { "print-missing", no_argument, NULL, 'p'}, >> { NULL, no_argument, NULL, 0 }, >> }; >> - int c = getopt_long(argc, argv, "dm", long_options, >> + int c = getopt_long(argc, argv, "dmp", long_options, >> &long_index); >> if (c < 0) >> break; >> @@ -534,6 +545,9 @@ static int cmd_show(int argc, char **argv) >> case 'm': >> where = BTRFS_SCAN_MOUNTED; >> break; >> + case 'p': >> + print_missing = 1; >> + break; >> default: >> usage(cmd_show_usage); >> } >> @@ -571,7 +585,7 @@ static int cmd_show(int argc, char **argv) >> goto devs_only; >> >> /* show mounted btrfs */ >> - ret = btrfs_scan_kernel(search); >> + ret = btrfs_scan_kernel(search, print_missing); >> if (search && !ret) >> return 0; >> >> diff --git a/man/btrfs.8.in b/man/btrfs.8.in >> index 8fea115..db2e355 100644 >> --- a/man/btrfs.8.in >> +++ b/man/btrfs.8.in >> @@ -25,7 +25,7 @@ btrfs \- control a btrfs filesystem >> .PP >> \fBbtrfs\fP \fBfilesystem df\fP\fI <path>\fP >> .PP >> -\fBbtrfs\fP \fBfilesystem show\fP >> [\fI--mounted\fP|\fI--all-devices\fP|\fI<uuid>\fP]\fP >> +\fBbtrfs\fP \fBfilesystem show\fP >> [\fI--mounted\fP|\fI--all-devices\fP|\fI--print-missing\fP|\fI<uuid>\fP]\fP >> .PP >> \fBbtrfs\fP \fBfilesystem sync\fP\fI <path> \fP >> .PP >> @@ -280,6 +280,8 @@ and unmounted. >> If \fB--mounted\fP is passed, it would probe btrfs kernel to list >> mounted btrfs filesystem(s); >> If \fB--all-devices\fP is passed, all the devices under /dev are >> scanned; >> otherwise the devices list is extracted from the /proc/partitions >> file. >> +If \fB--print-missing\fP is passed, btrfs will try its best to print >> the missing device. >> +This option is only useful if the filesystem is already mounted >> since mounted filesystem may contain the device list. >> .TP >> >> \fBfilesystem sync\fR\fI <path> \fR >> > -- > 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
diff --git a/cmds-filesystem.c b/cmds-filesystem.c index 4c9933d..77b142c 100644 --- a/cmds-filesystem.c +++ b/cmds-filesystem.c @@ -360,7 +360,7 @@ static u64 calc_used_bytes(struct btrfs_ioctl_space_args *si) static int print_one_fs(struct btrfs_ioctl_fs_info_args *fs_info, struct btrfs_ioctl_dev_info_args *dev_info, struct btrfs_ioctl_space_args *space_info, - char *label, char *path) + char *label, char *path, int print_missing) { int i; int fd; @@ -392,7 +392,14 @@ static int print_one_fs(struct btrfs_ioctl_fs_info_args *fs_info, fd = open((char *)tmp_dev_info->path, O_RDONLY); if (fd < 0) { missing = 1; - continue; + if (print_missing) + printf("\tdevid %4llu size %s used %s path %s (missing)\n", + tmp_dev_info->devid, + pretty_size(tmp_dev_info->total_bytes), + pretty_size(tmp_dev_info->bytes_used), + tmp_dev_info->path); + else + continue; } close(fd); printf("\tdevid %4llu size %s used %s path %s\n", @@ -440,7 +447,7 @@ static int check_arg_type(char *input) return BTRFS_ARG_UNKNOWN; } -static int btrfs_scan_kernel(void *search) +static int btrfs_scan_kernel(void *search, int print_missing) { int ret = 0, fd; FILE *f; @@ -477,7 +484,8 @@ static int btrfs_scan_kernel(void *search) fd = open(mnt->mnt_dir, O_RDONLY); if ((fd != -1) && !get_df(fd, &space_info_arg)) { print_one_fs(&fs_info_arg, dev_info_arg, - space_info_arg, label, mnt->mnt_dir); + space_info_arg, label, mnt->mnt_dir, + print_missing); kfree(space_info_arg); memset(label, 0, sizeof(label)); } @@ -500,6 +508,7 @@ static const char * const cmd_show_usage[] = { "Show the structure of a filesystem", "-d|--all-devices show only disks under /dev containing btrfs filesystem", "-m|--mounted show only mounted btrfs", + "-p|--print-missing show known missing device if possible", "If no argument is given, structure of all present filesystems is shown.", NULL }; @@ -513,6 +522,7 @@ static int cmd_show(int argc, char **argv) int ret; int where = BTRFS_SCAN_LBLKID; int type = 0; + int print_missing = 0; char mp[BTRFS_PATH_NAME_MAX + 1]; char path[PATH_MAX]; @@ -521,9 +531,10 @@ static int cmd_show(int argc, char **argv) static struct option long_options[] = { { "all-devices", no_argument, NULL, 'd'}, { "mounted", no_argument, NULL, 'm'}, + { "print-missing", no_argument, NULL, 'p'}, { NULL, no_argument, NULL, 0 }, }; - int c = getopt_long(argc, argv, "dm", long_options, + int c = getopt_long(argc, argv, "dmp", long_options, &long_index); if (c < 0) break; @@ -534,6 +545,9 @@ static int cmd_show(int argc, char **argv) case 'm': where = BTRFS_SCAN_MOUNTED; break; + case 'p': + print_missing = 1; + break; default: usage(cmd_show_usage); } @@ -571,7 +585,7 @@ static int cmd_show(int argc, char **argv) goto devs_only; /* show mounted btrfs */ - ret = btrfs_scan_kernel(search); + ret = btrfs_scan_kernel(search, print_missing); if (search && !ret) return 0; diff --git a/man/btrfs.8.in b/man/btrfs.8.in index 8fea115..db2e355 100644 --- a/man/btrfs.8.in +++ b/man/btrfs.8.in @@ -25,7 +25,7 @@ btrfs \- control a btrfs filesystem .PP \fBbtrfs\fP \fBfilesystem df\fP\fI <path>\fP .PP -\fBbtrfs\fP \fBfilesystem show\fP [\fI--mounted\fP|\fI--all-devices\fP|\fI<uuid>\fP]\fP +\fBbtrfs\fP \fBfilesystem show\fP [\fI--mounted\fP|\fI--all-devices\fP|\fI--print-missing\fP|\fI<uuid>\fP]\fP .PP \fBbtrfs\fP \fBfilesystem sync\fP\fI <path> \fP .PP @@ -280,6 +280,8 @@ and unmounted. If \fB--mounted\fP is passed, it would probe btrfs kernel to list mounted btrfs filesystem(s); If \fB--all-devices\fP is passed, all the devices under /dev are scanned; otherwise the devices list is extracted from the /proc/partitions file. +If \fB--print-missing\fP is passed, btrfs will try its best to print the missing device. +This option is only useful if the filesystem is already mounted since mounted filesystem may contain the device list. .TP \fBfilesystem sync\fR\fI <path> \fR
Since a mounted btrfs filesystem contains all the devices info even a device is removed after mount(like btrfs/003 in xfstests), we can use the info to print the known missing device if possible. So -p/--print-missing options are added to print possible missing devices. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> --- cmds-filesystem.c | 26 ++++++++++++++++++++------ man/btrfs.8.in | 4 +++- 2 files changed, 23 insertions(+), 7 deletions(-)