public inbox for linux-btrfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Hugo Mills <hugo@carfax.org.uk>
To: Andrei Borzenkov <arvidjaar@gmail.com>
Cc: "Misono, Tomohiro" <misono.tomohiro@jp.fujitsu.com>,
	linux-btrfs <linux-btrfs@vger.kernel.org>
Subject: Re: [PATCH v2] btrfs-progs: subvol: change subvol set-default to also accept subvol path
Date: Mon, 2 Oct 2017 09:01:29 +0000	[thread overview]
Message-ID: <20171002090129.GB3293@carfax.org.uk> (raw)
In-Reply-To: <CAA91j0WQ35e5KaZAEe_amwuDMazuAa6Mx1y3P18Y7EGvpxmAHQ@mail.gmail.com>

[-- Attachment #1: Type: text/plain, Size: 5720 bytes --]

On Mon, Oct 02, 2017 at 11:39:05AM +0300, Andrei Borzenkov wrote:
> On Mon, Oct 2, 2017 at 11:19 AM, Misono, Tomohiro
> <misono.tomohiro@jp.fujitsu.com> wrote:
> > This patch changes "subvol set-default" to also accept the subvolume path
> > for convenience.
> >
> > This is the one of the issue on github:
> > https://github.com/kdave/btrfs-progs/issues/35
> >
> > If there are two args, they are assumed as subvol id and path to the fs
> > (the same as current behavior), and if there is only one arg, it is assumed
> > as the path to the subvolume. Therefore there is no ambiguity between subvol
> > id and subvol name, which is mentioned in the above issue page.
> >
> > Only the absolute path to the subvolume is allowed, for the safety when
> > multiple filesystems are used.
> >
> > subvol id is resolved by get_subvol_info() which is used by "subvol show".
> >
> > change to v2:
> > restrict the path to only allow absolute path.
> 
> This is absolutely arbitrary restriction. Why we can do "btrfs
> subvolume create ./relative/path" but cannot do "btrfs subvolume
> set-default ./relative/path"?

   Indeed. In fact, it's precisely the _opposite_ of the way that
every other command works -- you provide the path to the subvolume in
the *current namespace*.

   This approach would be just a major misfeature at this point.

   Hugo.

> > documents are updated accordingly.
> >
> > Signed-off-by: Tomohiro Misono <misono.tomohiro@jp.fujitsu.com>
> > ---
> >  Documentation/btrfs-subvolume.asciidoc | 11 +++----
> >  cmds-subvolume.c                       | 53 +++++++++++++++++++++++++++-------
> >  2 files changed, 48 insertions(+), 16 deletions(-)
> >
> > diff --git a/Documentation/btrfs-subvolume.asciidoc b/Documentation/btrfs-subvolume.asciidoc
> > index 5cfe885..7973567 100644
> > --- a/Documentation/btrfs-subvolume.asciidoc
> > +++ b/Documentation/btrfs-subvolume.asciidoc
> > @@ -142,12 +142,13 @@ you can add \'\+' or \'-' in front of each items, \'+' means ascending,
> >  for --sort you can combine some items together by \',', just like
> >  --sort=+ogen,-gen,path,rootid.
> >
> > -*set-default* <id> <path>::
> > -Set the subvolume of the filesystem <path> which is mounted as
> > -default.
> > +*set-default* [<path>|<id> <mountpoint>]::
> > +Set the subvolume of the filesystem which is mounted as default.
> >  +
> > -The subvolume is identified by <id>, which is returned by the *subvolume list*
> > -command.
> > +Only absolute path is allowed to specify the subvolume.
> > +Alterantively, the pair of <id> and <mountpoint> can be used. In that
> > +case, the subvolume is identified by <id>, which is returned by the
> > +*subvolume list* command. The filesystem is specified by <mountpoint>.
> >
> >  *show* <path>::
> >  Show information of a given subvolume in the <path>.
> > diff --git a/cmds-subvolume.c b/cmds-subvolume.c
> > index 666f6e0..dda9e73 100644
> > --- a/cmds-subvolume.c
> > +++ b/cmds-subvolume.c
> > @@ -803,28 +803,59 @@ out:
> >  }
> >
> >  static const char * const cmd_subvol_set_default_usage[] = {
> > -       "btrfs subvolume set-default <subvolid> <path>",
> > -       "Set the default subvolume of a filesystem",
> > +       "btrfs subvolume set-default [<path>|<id> <mountpoint>]",
> > +       "Set the default subvolume of the filesystem mounted as default.",
> > +       "The subvolume can be specified by its absolute path,",
> > +       "or the pair of subvolume id and mount point to the filesystem.",
> >         NULL
> >  };
> >
> >  static int cmd_subvol_set_default(int argc, char **argv)
> >  {
> > -       int     ret=0, fd, e;
> > -       u64     objectid;
> > -       char    *path;
> > -       char    *subvolid;
> > -       DIR     *dirstream = NULL;
> > +       int ret = 0;
> > +       int fd, e;
> > +       u64 objectid;
> > +       char *path;
> > +       char *subvolid;
> > +       DIR *dirstream = NULL;
> >
> >         clean_args_no_options(argc, argv, cmd_subvol_set_default_usage);
> >
> > -       if (check_argc_exact(argc - optind, 2))
> > +       if (check_argc_min(argc - optind, 1) ||
> > +                       check_argc_max(argc - optind, 2))
> >                 usage(cmd_subvol_set_default_usage);
> >
> > -       subvolid = argv[optind];
> > -       path = argv[optind + 1];
> > +       if (argc - optind == 1) {
> > +               /* path to the subvolume is specified */
> > +               struct root_info ri;
> > +               char *fullpath;
> >
> > -       objectid = arg_strtou64(subvolid);
> > +               path = argv[optind];
> > +               if (path[0] != '/') {
> > +                       error("only absolute path is allowed");
> > +                       return 1;
> > +               }
> > +
> > +               fullpath = realpath(path, NULL);
> > +               if (!fullpath) {
> > +                       error("cannot find real path for '%s': %s",
> > +                               path, strerror(errno));
> > +                       return 1;
> > +               }
> > +
> > +               ret = get_subvol_info(fullpath, &ri);
> > +               free(fullpath);
> > +
> > +               if (ret)
> > +                       return 1;
> > +
> > +               objectid = ri.root_id;
> > +       } else {
> > +               /* subvol id and path to the filesystem are specified */
> > +               subvolid = argv[optind];
> > +               path = argv[optind + 1];
> > +               objectid = arg_strtou64(subvolid);
> > +       }
> >
> >         fd = btrfs_open_dir(path, &dirstream, 1);
> >         if (fd < 0)

-- 
Hugo Mills             | Great oxymorons of the world, no. 4:
hugo@... carfax.org.uk | Future Perfect
http://carfax.org.uk/  |
PGP: E2AB1DE4          |

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

  reply	other threads:[~2017-10-02  9:01 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-10-02  8:19 [PATCH v2] btrfs-progs: subvol: change subvol set-default to also accept subvol path Misono, Tomohiro
2017-10-02  8:39 ` Andrei Borzenkov
2017-10-02  9:01   ` Hugo Mills [this message]
2017-10-02 23:57     ` Misono, Tomohiro
2017-10-04 18:07       ` David Sterba
2017-10-05  0:57         ` Misono, Tomohiro
2017-10-05 15:14           ` David Sterba

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20171002090129.GB3293@carfax.org.uk \
    --to=hugo@carfax.org.uk \
    --cc=arvidjaar@gmail.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=misono.tomohiro@jp.fujitsu.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox