Chen Yang
2012-Sep-24 06:42 UTC
[PATCH] Btrfs-progs: introduce ''-p'' option and <fullpath> into subvolume set-default command
In command "btrfs subvolume set-default", we used subvolume <id> and <path> to set the default subvolume of a filesystem. It''s not easy for a common user, so I improved it and the <fullpath> of a subvolume can be used to set the default subvolume of a filesystem. Signed-off-by: Cheng Yang <chenyang.fnst@cn.fujitsu.com> --- cmds-subvolume.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++-------- man/btrfs.8.in | 6 ++-- 2 files changed, 79 insertions(+), 16 deletions(-) diff --git a/cmds-subvolume.c b/cmds-subvolume.c index 8399e72..827234c 100644 --- a/cmds-subvolume.c +++ b/cmds-subvolume.c @@ -26,6 +26,7 @@ #include <getopt.h> #include "kerncompat.h" +#include "ctree.h" #include "ioctl.h" #include "qgroup.h" @@ -601,23 +602,66 @@ static int cmd_subvol_get_default(int argc, char **argv) } static const char * const cmd_subvol_set_default_usage[] = { - "btrfs subvolume set-default <subvolid> <path>", + "btrfs subvolume set-default [-p] [<subvolid>] <path>", "Set the default subvolume of a filesystem", + "-p Set the parent tree(subvolume) of the PATH", + " as the default subvolume, if PATH is not a subvolume", NULL }; static int cmd_subvol_set_default(int argc, char **argv) { - int ret=0, fd, e; - u64 objectid; + int ret = 0, fd = -1, e; + int parent = 0; + u64 objectid = -1; char *path; - char *subvolid; + char *subvolid, *inv; - if (check_argc_exact(argc, 3)) + optind = 1; + while (1) { + int c = getopt(argc, argv, "p"); + if (c < 0) + break; + + switch (c) { + case ''p'': + parent = 1; + break; + default: + usage(cmd_subvol_set_default_usage); + } + } + + if (check_argc_min(argc - optind, 1) || + check_argc_max(argc - optind, 2)) usage(cmd_subvol_set_default_usage); - subvolid = argv[1]; - path = argv[2]; + if (argc - optind == 2) { + subvolid = argv[optind]; + path = argv[optind + 1]; + + objectid = (unsigned long long)strtoll(subvolid, &inv, 0); + if (errno == ERANGE || subvolid == inv) { + fprintf(stderr, + "ERROR: invalid tree id (%s)\n", subvolid); + return 30; + } + } else { + path = argv[optind]; + + ret = test_issubvolume(path); + if (ret < 0) { + fprintf(stderr, + "ERROR: error accessing ''%s''\n", path); + return 12; + } + if (!ret && !parent) { + fprintf(stderr, + "ERROR: ''%s'' is not a subvolume\n", + path); + return 13; + } + } fd = open_file_or_dir(path); if (fd < 0) { @@ -625,16 +669,35 @@ static int cmd_subvol_set_default(int argc, char **argv) return 12; } - objectid = (unsigned long long)strtoll(subvolid, NULL, 0); - if (errno == ERANGE) { - fprintf(stderr, "ERROR: invalid tree id (%s)\n",subvolid); - return 30; + /* + When objectid is -1, it means that + subvolume id is not specified by user. + We will set default subvolume by <path>. + */ + if (objectid == -1) { + struct btrfs_ioctl_ino_lookup_args args; + + memset(&args, 0, sizeof(args)); + args.treeid = 0; + args.objectid = BTRFS_FIRST_FREE_OBJECTID; + + ret = ioctl(fd, BTRFS_IOC_INO_LOOKUP, &args); + if (ret) { + fprintf(stderr, + "ERROR: can''t perform the search - %s\n", + strerror(errno)); + return ret; + } + + objectid = args.treeid; } + ret = ioctl(fd, BTRFS_IOC_DEFAULT_SUBVOL, &objectid); e = errno; close(fd); - if( ret < 0 ){ - fprintf(stderr, "ERROR: unable to set a new default subvolume - %s\n", + if (ret < 0) { + fprintf(stderr, + "ERROR: unable to set a new default subvolume - %s\n", strerror(e)); return 30; } diff --git a/man/btrfs.8.in b/man/btrfs.8.in index 3f7765d..2bc1d97 100644 --- a/man/btrfs.8.in +++ b/man/btrfs.8.in @@ -13,7 +13,7 @@ btrfs \- control a btrfs filesystem .PP \fBbtrfs\fP \fBsubvolume list\fP\fI [-pr] [-s 0|1] [-g [+|-]value] [-c [+|-]value] [--rootid=rootid,gen,ogen,path] <path>\fP .PP -\fBbtrfs\fP \fBsubvolume set-default\fP\fI <id> <path>\fP +\fBbtrfs\fP \fBsubvolume set-default\fP\fI [-p] [<id>] <path>\fP .PP \fBbtrfs\fP \fBsubvolume get-default\fP\fI <path>\fP .PP @@ -147,9 +147,9 @@ for \fB--sort\fP you can combine some items together by '','', just like .RE .TP -\fBsubvolume set-default\fR\fI <id> <path>\fR +\fBsubvolume set-default\fR\fI [-p] [<id>] <path>\fR Set the subvolume of the filesystem \fI<path>\fR which is mounted as -\fIdefault\fR. The subvolume is identified by \fI<id>\fR, which +\fIdefault\fR. The subvolume is identified by \fI<path>\fR or by \fI<id>\fR, which is returned by the \fBsubvolume list\fR command. .TP -- 1.7.7.6 -- 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
2012-Oct-09 14:44 UTC
Re: [PATCH] Btrfs-progs: introduce ''-p'' option and <fullpath> into subvolume set-default command
On Mon, Sep 24, 2012 at 02:42:13PM +0800, Chen Yang wrote:> In command "btrfs subvolume set-default", we used subvolume <id> and <path> > to set the default subvolume of a filesystem. It''s not easy for a common > user,What is not easy? How often do you set-default subvolume that it''s a concern to do it in two steps (list and set-default)?> so I improved it and the <fullpath> of a subvolume can be used to > set the default subvolume of a filesystem.Setting the default directly from a given path would be a good UI improvement.> @@ -601,23 +602,66 @@ static int cmd_subvol_get_default(int argc, char **argv) > static const char * const cmd_subvol_set_default_usage[] = { > - "btrfs subvolume set-default <subvolid> <path>", > + "btrfs subvolume set-default [-p] [<subvolid>] <path>",This new syntax allows these forms: 1. set-default /path 2. set-default -p /path 3. set-default id /path 4. set-default -p id /path 3 is the current behaviour, can you please explain the rest to me? I''m afraid I''m not following the idea.> "Set the default subvolume of a filesystem", > + "-p Set the parent tree(subvolume) of the PATH", > + " as the default subvolume, if PATH is not a subvolume","if PATH is not a subvolume" -- so I don''t specify the mountpoint for PATH and I''m supposed to know if the path is or is not a subvolume -- this is another step I need to do (because I want to be sure that I''m setting the right subvol), this does not save the commands compared to the current status.> NULL > };thanks, 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
Chen Yang
2012-Oct-11 02:06 UTC
Re: [PATCH] Btrfs-progs: introduce ''-p'' option and <fullpath> into subvolume set-default command
On 2012-10-9 22:44, David Sterba wrote:> On Mon, Sep 24, 2012 at 02:42:13PM +0800, Chen Yang wrote: >> In command "btrfs subvolume set-default", we used subvolume <id> and <path> >> to set the default subvolume of a filesystem. It''s not easy for a common >> user, > > What is not easy? How often do you set-default subvolume that it''s a > concern to do it in two steps (list and set-default)? >This patch is mean to improve the UI If the description above if improper, I will fix it.>> so I improved it and the <fullpath> of a subvolume can be used to >> set the default subvolume of a filesystem. > > Setting the default directly from a given path would be a good UI > improvement. > >> @@ -601,23 +602,66 @@ static int cmd_subvol_get_default(int argc, char **argv) >> static const char * const cmd_subvol_set_default_usage[] = { >> - "btrfs subvolume set-default <subvolid> <path>", >> + "btrfs subvolume set-default [-p] [<subvolid>] <path>", > > This new syntax allows these forms: > > 1. set-default /pathThe "path" must be a subvolume path> 2. set-default -p /pathThe "path" can be any path under a mount point, if path is not a subvolume, The parent tree (subvolume) of the path will be find out and set to be default> 3. set-default id /pathcurrent behaviour> 4. set-default -p id /pathError! The improper description of the usage causes this misuse, I will fix it.> > 3 is the current behaviour, can you please explain the rest to me? I''m > afraid I''m not following the idea. >I''m sorry to make you confused for giving an unclear usage about the new option of the command. I''m writing a new version. I will send it later.>> "Set the default subvolume of a filesystem", >> + "-p Set the parent tree(subvolume) of the PATH", >> + " as the default subvolume, if PATH is not a subvolume", > > "if PATH is not a subvolume" -- so I don''t specify the mountpoint for > PATH and I''m supposed to know if the path is or is not a subvolume -- > this is another step I need to do (because I want to be sure that I''m > setting the right subvol), this does not save the commands compared to > the current status.The option “-p” is only used like this “set-default -p /path”, if PATH is not a subvolume -p" will help to find the parent tree (subvolume) of the PATH, and set it default.> >> NULL >> }; > > thanks, > david >thanks for your advise, chen yang -- 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