linux-btrfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Josef Bacik <josef@toxicpanda.com>
To: Qu Wenruo <wqu@suse.com>
Cc: linux-btrfs@vger.kernel.org
Subject: Re: [PATCH 4/6] btrfs-progs: use a unified btrfs_make_subvol() implementation
Date: Tue, 17 Oct 2023 09:49:29 -0400	[thread overview]
Message-ID: <20231017134929.GA2350212@perftesting> (raw)
In-Reply-To: <7b951f3a0619880f35f2490e2e251eb35e2f2292.1697430866.git.wqu@suse.com>

On Mon, Oct 16, 2023 at 03:08:50PM +1030, Qu Wenruo wrote:
> To create a subvolume there are several different helpers:
> 
> - create_subvol() from convert/main.c
>   This relies one using an empty fs_root tree to copy its root item.
>   But otherwise has a pretty well wrapper btrfs_ake_root_dir() helper to
>   handle the inode item/ref insertion.
> 
> - create_data_reloc_tree() from mkfs/main.c
>   This is already pretty usable for generic subvolume creation, the only
>   bad code is the open-coded rootdir setup.
> 
> So here this patch introduce a better version with all the benefit from
> the above implementations:
> 
> - Move btrfs_make_root_dir() into kernel-shared/root-tree.[ch]
> 
> - Implement a unified btrfs_make_subvol() to replace above two implementations
>   It would go with btrfs_create_root(), and btrfs_make_root_dir() to
>   remove duplicated code, and return a btrfs_root pointer for caller
>   to utilize.
> 
> Signed-off-by: Qu Wenruo <wqu@suse.com>
> ---
>  convert/main.c            | 55 +++++--------------------
>  kernel-shared/ctree.h     |  4 ++
>  kernel-shared/root-tree.c | 86 +++++++++++++++++++++++++++++++++++++++
>  mkfs/common.c             | 39 ------------------
>  mkfs/common.h             |  2 -
>  mkfs/main.c               | 78 +++--------------------------------
>  6 files changed, 107 insertions(+), 157 deletions(-)
> 
> diff --git a/convert/main.c b/convert/main.c
> index 73740fe26d55..453e2c003c20 100644
> --- a/convert/main.c
> +++ b/convert/main.c
> @@ -915,44 +915,6 @@ out:
>  	return ret;
>  }
>  
> -static int create_subvol(struct btrfs_trans_handle *trans,
> -			 struct btrfs_root *root, u64 root_objectid)
> -{
> -	struct extent_buffer *tmp;
> -	struct btrfs_root *new_root;
> -	struct btrfs_key key;
> -	struct btrfs_root_item root_item;
> -	int ret;
> -
> -	ret = btrfs_copy_root(trans, root, root->node, &tmp,
> -			      root_objectid);
> -	if (ret)
> -		return ret;
> -
> -	memcpy(&root_item, &root->root_item, sizeof(root_item));
> -	btrfs_set_root_bytenr(&root_item, tmp->start);
> -	btrfs_set_root_level(&root_item, btrfs_header_level(tmp));
> -	btrfs_set_root_generation(&root_item, trans->transid);
> -	free_extent_buffer(tmp);
> -
> -	key.objectid = root_objectid;
> -	key.type = BTRFS_ROOT_ITEM_KEY;
> -	key.offset = trans->transid;
> -	ret = btrfs_insert_root(trans, root->fs_info->tree_root,
> -				&key, &root_item);
> -
> -	key.offset = (u64)-1;
> -	new_root = btrfs_read_fs_root(root->fs_info, &key);
> -	if (!new_root || IS_ERR(new_root)) {
> -		error("unable to fs read root: %lu", PTR_ERR(new_root));
> -		return PTR_ERR(new_root);
> -	}
> -
> -	ret = btrfs_make_root_dir(trans, new_root, BTRFS_FIRST_FREE_OBJECTID);
> -
> -	return ret;
> -}
> -
>  /*
>   * New make_btrfs() has handle system and meta chunks quite well.
>   * So only need to add remaining data chunks.
> @@ -1012,6 +974,7 @@ static int make_convert_data_block_groups(struct btrfs_trans_handle *trans,
>  static int init_btrfs(struct btrfs_mkfs_config *cfg, struct btrfs_root *root,
>  			 struct btrfs_convert_context *cctx, u32 convert_flags)
>  {
> +	struct btrfs_root *created_root;
>  	struct btrfs_key location;
>  	struct btrfs_trans_handle *trans;
>  	struct btrfs_fs_info *fs_info = root->fs_info;
> @@ -1057,15 +1020,19 @@ static int init_btrfs(struct btrfs_mkfs_config *cfg, struct btrfs_root *root,
>  			     BTRFS_FIRST_FREE_OBJECTID);
>  
>  	/* subvol for fs image file */
> -	ret = create_subvol(trans, root, CONV_IMAGE_SUBVOL_OBJECTID);
> -	if (ret < 0) {
> -		error("failed to create subvolume image root: %d", ret);
> +	created_root = btrfs_create_subvol(trans, CONV_IMAGE_SUBVOL_OBJECTID);
> +	if (IS_ERR(created_root)) {
> +		ret = PTR_ERR(created_root);
> +		errno = -ret;
> +		error("failed to create subvolume image root: %m");
>  		goto err;
>  	}
>  	/* subvol for data relocation tree */
> -	ret = create_subvol(trans, root, BTRFS_DATA_RELOC_TREE_OBJECTID);
> -	if (ret < 0) {
> -		error("failed to create DATA_RELOC root: %d", ret);
> +	created_root = btrfs_create_subvol(trans, BTRFS_DATA_RELOC_TREE_OBJECTID);
> +	if (IS_ERR(created_root)) {
> +		ret = PTR_ERR(created_root);
> +		errno = -ret;
> +		error("failed to create DATA_RELOC root: %m");
>  		goto err;
>  	}
>  
> diff --git a/kernel-shared/ctree.h b/kernel-shared/ctree.h
> index 1dda40e96a60..ea459464063d 100644
> --- a/kernel-shared/ctree.h
> +++ b/kernel-shared/ctree.h
> @@ -1134,6 +1134,10 @@ int btrfs_update_root(struct btrfs_trans_handle *trans, struct btrfs_root
>  		      *item);
>  int btrfs_find_last_root(struct btrfs_root *root, u64 objectid, struct
>  			 btrfs_root_item *item, struct btrfs_key *key);
> +int btrfs_make_root_dir(struct btrfs_trans_handle *trans,
> +			struct btrfs_root *root, u64 objectid);
> +struct btrfs_root *btrfs_create_subvol(struct btrfs_trans_handle *trans,
> +				       u64 objectid);
>  /* dir-item.c */
>  int btrfs_insert_dir_item(struct btrfs_trans_handle *trans, struct btrfs_root
>  			  *root, const char *name, int name_len, u64 dir,
> diff --git a/kernel-shared/root-tree.c b/kernel-shared/root-tree.c
> index 33f9e4697b18..1fe7d535fdc7 100644
> --- a/kernel-shared/root-tree.c
> +++ b/kernel-shared/root-tree.c

We're moving towards a world where kernel-shared will be an exact-ish copy of
the kernel code.  Please put helpers like this in common/, I did this for
several of the extent tree related helpers we need for fsck, this is a good fit
for that.  Thanks,

Josef

  reply	other threads:[~2023-10-17 13:49 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-10-16  4:38 [PATCH 0/6] btrfs-progs: mkfs: introduce an experimental --subvol option Qu Wenruo
2023-10-16  4:38 ` [PATCH 1/6] btrfs-progs: enhance btrfs_mkdir() function Qu Wenruo
2023-10-16  4:38 ` [PATCH 2/6] btrfs-progs: enhance and rename btrfs_mksubvol() function Qu Wenruo
2023-10-16  4:38 ` [PATCH 3/6] btrfs-progs: enhance btrfs_create_root() function Qu Wenruo
2023-10-16  4:38 ` [PATCH 4/6] btrfs-progs: use a unified btrfs_make_subvol() implementation Qu Wenruo
2023-10-17 13:49   ` Josef Bacik [this message]
2023-10-17 20:14     ` Qu Wenruo
2023-10-17 23:11       ` David Sterba
2023-10-17 23:50         ` Qu Wenruo
2023-10-24 17:38           ` David Sterba
2023-10-24 20:44             ` Qu Wenruo
2023-10-25 16:18               ` David Sterba
2023-10-25 22:41                 ` Qu Wenruo
2023-10-25 22:57                 ` Neal Gompa
2023-10-16  4:38 ` [PATCH 5/6] btrfs-progs: mkfs: introduce experimental --subvol option Qu Wenruo
2023-10-17 13:54   ` Josef Bacik
2023-10-17 20:13     ` Qu Wenruo
2023-10-16  4:38 ` [PATCH 6/6] btrfs-progs: mkfs-tests: introduce a test case to verify " Qu Wenruo
2023-10-19 18:19 ` [PATCH 0/6] btrfs-progs: mkfs: introduce an experimental " Goffredo Baroncelli

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=20231017134929.GA2350212@perftesting \
    --to=josef@toxicpanda.com \
    --cc=linux-btrfs@vger.kernel.org \
    --cc=wqu@suse.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).