From: "Goffredo Baroncelli <kreijack@libero.it>" <kreijack@libero.it>
To: <xin.zhong@intel.com>
Cc: <linux-btrfs@vger.kernel.org>
Subject: R: [PATCH V2] Btrfs-progs: add "btrfs subvolume get-default" subcommand
Date: Mon, 11 Jul 2011 14:02:45 +0200 (CEST) [thread overview]
Message-ID: <1989742.2131011310385765409.JavaMail.defaultUser@defaultHost> (raw)
>----Messaggio originale----
>Da: xin.zhong@intel.com
>Data: 11/07/2011 10.56
>A: <linux-btrfs@vger.kernel.org>
>Cc: <xin.zhong@intel.com>
>Ogg: [PATCH V2] Btrfs-progs: add "btrfs subvolume get-default"
subcommand
>
>Add subcommand to get the default subvolume of btrfs filesystem
>
>Reported-by: Yang, Yi <yi.y.yang@intel.com>
>Signed-off-by: Zhong, Xin <xin.zhong@intel.com>
>---
> btrfs-list.c | 57
+++++++++++++++++++++++++++++++++++++++++++++++++++++++--
> btrfs.c | 3 +++
> btrfs_cmds.c | 31 ++++++++++++++++++++++++++++++-
> btrfs_cmds.h | 3 ++-
> 4 files changed, 90 insertions(+), 4 deletions(-)
please update the man page too.
>
>diff --git a/btrfs-list.c b/btrfs-list.c
>index 93766a8..aa6a9b4 100644
>--- a/btrfs-list.c
>+++ b/btrfs-list.c
>@@ -536,7 +536,7 @@ build:
> return full;
[...]
>+ /* search dir item */
>+ sk->max_type = BTRFS_DIR_ITEM_KEY;
>+ sk->min_type = BTRFS_DIR_ITEM_KEY;
>+
>+ sk->max_objectid = BTRFS_ROOT_TREE_DIR_OBJECTID;
>+ sk->min_objectid = BTRFS_ROOT_TREE_DIR_OBJECTID;
>+ sk->max_offset = (u64)-1;
>+ sk->max_transid = (u64)-1;
>+
[...]
>+ /* go through each item to find dir item named "default" */
>+ for (i = 0; i < sk->nr_items; i++) {
>+ sh = (struct btrfs_ioctl_search_header *)(args.buf +
>+ off);
>+ off += sizeof(*sh);
>+ if (sh->type == BTRFS_DIR_ITEM_KEY) {
>+ di = (struct btrfs_dir_item *)(args.buf + off);
>+ name_len = le16_to_cpu(di->name_len);
>+ name = (char *)di + sizeof(struct btrfs_dir_item);
>+ if (!strncmp("default", name, name_len)) {
>+ subvol_id = btrfs_disk_key_objectid(
>+ &di->location);
>+ break;
>+ }
>+ }
>+
>+ off += sh->len;
>+ }
I am not familiar with the "default subvolume key", but are you sure that the
key is always in the first set of returned keys ?
>+ }
>+
> /* now that we have all the subvol-relative paths filled in,
> * we have to string the subvols together so that we can get
> * a path all the way back to the FS root
>@@ -650,7 +698,12 @@ int list_subvols(int fd)
> while (n) {
> struct root_info *entry;
> entry = rb_entry(n, struct root_info, rb_node);
>- resolve_root(&root_lookup, entry);
>+ if(!get_default)
>+ resolve_root(&root_lookup, entry);
>+ /* we only want the default subvolume */
>+ else if(subvol_id == entry->root_id)
>+ resolve_root(&root_lookup, entry);
>+
What happens if there no is a default subvolume (for example a very old btrfs
filesystem, and/or after removing the "default" subvolume) ?
I suggest to handle this case printing something like "No default subvolume
found"
BR
G.Baroncelli
> n = rb_prev(n);
> }
>
>diff --git a/btrfs.c b/btrfs.c
>index 46314cf..6b73f88 100644
>--- a/btrfs.c
>+++ b/btrfs.c
>@@ -73,6 +73,9 @@ static struct Command commands[] = {
> "Set the subvolume of the filesystem <path> which will be mounted\n"
> "as default."
> },
>+ { do_get_default_subvol, 1, "subvolume get-default", "<path>\n"
>+ "Get the default subvolume of a filesystem."
>+ },
> { do_fssync, 1,
> "filesystem sync", "<path>\n"
> "Force a sync on the filesystem <path>."
>diff --git a/btrfs_cmds.c b/btrfs_cmds.c
>index 8031c58..11c56f6 100644
>--- a/btrfs_cmds.c
>+++ b/btrfs_cmds.c
>@@ -301,7 +301,7 @@ int do_subvol_list(int argc, char **argv)
> fprintf(stderr, "ERROR: can't access '%s'\n", subvol);
> return 12;
> }
>- ret = list_subvols(fd);
>+ ret = list_subvols(fd, 0);
> if (ret)
> return 19;
> return 0;
>@@ -834,6 +834,35 @@ int do_set_default_subvol(int nargs, char **argv)
> return 0;
> }
>
>+int do_get_default_subvol(int nargs, char **argv)
>+{
>+ int fd;
>+ int ret;
>+ char *subvol;
>+
>+ subvol = argv[1];
>+
>+ ret = test_issubvolume(subvol);
>+ if (ret < 0) {
>+ fprintf(stderr, "ERROR: error accessing '%s'\n", subvol);
>+ return 12;
>+ }
>+ if (!ret) {
>+ fprintf(stderr, "ERROR: '%s' is not a subvolume\n", subvol);
>+ return 13;
>+ }
>+
>+ fd = open_file_or_dir(subvol);
>+ if (fd < 0) {
>+ fprintf(stderr, "ERROR: can't access '%s'\n", subvol);
>+ return 12;
>+ }
>+ ret = list_subvols(fd, 1);
>+ if (ret)
>+ return 19;
>+ return 0;
>+}
>+
> int do_df_filesystem(int nargs, char **argv)
> {
> struct btrfs_ioctl_space_args *sargs;
>diff --git a/btrfs_cmds.h b/btrfs_cmds.h
>index 7bde191..9cf1ca1 100644
>--- a/btrfs_cmds.h
>+++ b/btrfs_cmds.h
>@@ -28,7 +28,8 @@ int do_scan(int nargs, char **argv);
> int do_resize(int nargs, char **argv);
> int do_subvol_list(int nargs, char **argv);
> int do_set_default_subvol(int nargs, char **argv);
>-int list_subvols(int fd);
>+int do_get_default_subvol(int nargs, char **argv);
>+int list_subvols(int fd, int get_default);
> int do_df_filesystem(int nargs, char **argv);
> int find_updated_files(int fd, u64 root_id, u64 oldest_gen);
> int do_find_newer(int argc, char **argv);
>--
>1.7.0.4
>
>--
>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
next reply other threads:[~2011-07-11 12:02 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-07-11 12:02 Goffredo Baroncelli <kreijack@libero.it> [this message]
2011-07-12 2:48 ` [PATCH V2] Btrfs-progs: add "btrfs subvolume get-default" subcommand Zhong, Xin
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=1989742.2131011310385765409.JavaMail.defaultUser@defaultHost \
--to=kreijack@libero.it \
--cc=linux-btrfs@vger.kernel.org \
--cc=xin.zhong@intel.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;
as well as URLs for NNTP newsgroup(s).