[v2,06/10] btrfs-progs: undelete-subvol: introduce link_subvol_to_lostfound
diff mbox

Message ID 20180327070658.13064-7-lufq.fnst@cn.fujitsu.com
State New
Headers show

Commit Message

Lu Fengqi March 27, 2018, 7:06 a.m. UTC
The function will create lost+found directory, link the deleted
subvolume specified by the subvol_id to the directory, update the
information of root_item and cleanup the associated orphan item.

Signed-off-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com>
---
 undelete-subvol.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 76 insertions(+)

Comments

Qu Wenruo April 18, 2018, 5:21 a.m. UTC | #1
On 2018年03月27日 15:06, Lu Fengqi wrote:
> The function will create lost+found directory, link the deleted
> subvolume specified by the subvol_id to the directory, update the
> information of root_item and cleanup the associated orphan item.
> 
> Signed-off-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com>
> ---
>  undelete-subvol.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 76 insertions(+)
> 
> diff --git a/undelete-subvol.c b/undelete-subvol.c
> index 781057df2b84..9243e35545c5 100644
> --- a/undelete-subvol.c
> +++ b/undelete-subvol.c
> @@ -106,3 +106,79 @@ out:
>  	btrfs_release_path(&path);
>  	return ret;
>  }
> +
> +/*
> + * Recover a subvolume specified by subvol_id, and link it to the lost+found
> + * directory.
> + *
> + * @root: the root of the root tree.

In that case, @fs_info would case less confusion.

Otherwise looks good.

Reviewed-by: Qu Wenruo <wqu@suse.com>

Thanks,
Qu

> + * @subvol_id: specify the subvolume which will be linked, and also be the part
> + * of the subvolume name.
> + *
> + * Return 0 if no error occurred.
> + */
> +static int link_subvol_to_lostfound(struct btrfs_root *root, u64 subvol_id)
> +{
> +	struct btrfs_trans_handle *trans;
> +	struct btrfs_fs_info *fs_info = root->fs_info;
> +	struct btrfs_root *fs_root = fs_info->fs_root;
> +	char buf[BTRFS_NAME_LEN + 1] = {0}; /* 1 for snprintf null */
> +	char *dir_name = "lost+found";
> +	u64 lost_found_ino = 0;
> +	u32 mode = 0700;
> +	int ret;
> +
> +	/*
> +	 * For link subvolume to lost+found,
> +	 * 2 for parent(256)'s dir_index and dir_item
> +	 * 2 for lost+found dir's inode_item and inode_ref
> +	 * 2 for lost+found dir's dir_index and dir_item for the subvolume
> +	 * 2 for the subvolume's root_ref and root_backref
> +	 */
> +	trans = btrfs_start_transaction(fs_root, 8);
> +	if (IS_ERR(trans)) {
> +		error("unable to start transaction");
> +		ret = PTR_ERR(trans);
> +		goto out;
> +	}
> +
> +	/* Create lost+found directory */
> +	ret = btrfs_mkdir(trans, fs_root, dir_name, strlen(dir_name),
> +			  BTRFS_FIRST_FREE_OBJECTID, &lost_found_ino,
> +			  mode);
> +	if (ret < 0) {
> +		error("failed to create '%s' dir: %d", dir_name, ret);
> +		goto out;
> +	}
> +
> +	/* Link the subvolume to lost+found directory */
> +	snprintf(buf, BTRFS_NAME_LEN + 1, "sub%llu", subvol_id);
> +	ret = btrfs_link_subvol(trans, fs_root, buf, subvol_id, lost_found_ino,
> +				false);
> +	if (ret) {
> +		error("failed to link the subvol %llu: %d", subvol_id, ret);
> +		goto out;
> +	}
> +
> +	/* Clear root flags BTRFS_ROOT_SUBVOL_DEAD and increase root refs */
> +	ret = recover_dead_root(trans, root, subvol_id);
> +	if (ret)
> +		goto out;
> +
> +	/* Delete the orphan item after undeletion is completed. */
> +	ret = btrfs_del_orphan_item(trans, root, subvol_id);
> +	if (ret) {
> +		error("failed to delete the orphan_item for %llu: %d",
> +				subvol_id, ret);
> +		goto out;
> +	}
> +
> +	ret = btrfs_commit_transaction(trans, fs_root);
> +	if (ret) {
> +		error("transaction commit failed: %d", ret);
> +		goto out;
> +	}
> +
> +out:
> +	return ret;
> +}
>
Lu Fengqi May 7, 2018, 2:06 a.m. UTC | #2
On 04/18/2018 01:21 PM, Qu Wenruo wrote:
> 
> 
> On 2018年03月27日 15:06, Lu Fengqi wrote:
>> The function will create lost+found directory, link the deleted
>> subvolume specified by the subvol_id to the directory, update the
>> information of root_item and cleanup the associated orphan item.
>>
>> Signed-off-by: Lu Fengqi <lufq.fnst@cn.fujitsu.com>
>> ---
>>   undelete-subvol.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 76 insertions(+)
>>
>> diff --git a/undelete-subvol.c b/undelete-subvol.c
>> index 781057df2b84..9243e35545c5 100644
>> --- a/undelete-subvol.c
>> +++ b/undelete-subvol.c
>> @@ -106,3 +106,79 @@ out:
>>   	btrfs_release_path(&path);
>>   	return ret;
>>   }
>> +
>> +/*
>> + * Recover a subvolume specified by subvol_id, and link it to the lost+found
>> + * directory.
>> + *
>> + * @root: the root of the root tree.
> 
> In that case, @fs_info would case less confusion.
> 
> Otherwise looks good.
> 
> Reviewed-by: Qu Wenruo <wqu@suse.com>


Make sense.

Patch
diff mbox

diff --git a/undelete-subvol.c b/undelete-subvol.c
index 781057df2b84..9243e35545c5 100644
--- a/undelete-subvol.c
+++ b/undelete-subvol.c
@@ -106,3 +106,79 @@  out:
 	btrfs_release_path(&path);
 	return ret;
 }
+
+/*
+ * Recover a subvolume specified by subvol_id, and link it to the lost+found
+ * directory.
+ *
+ * @root: the root of the root tree.
+ * @subvol_id: specify the subvolume which will be linked, and also be the part
+ * of the subvolume name.
+ *
+ * Return 0 if no error occurred.
+ */
+static int link_subvol_to_lostfound(struct btrfs_root *root, u64 subvol_id)
+{
+	struct btrfs_trans_handle *trans;
+	struct btrfs_fs_info *fs_info = root->fs_info;
+	struct btrfs_root *fs_root = fs_info->fs_root;
+	char buf[BTRFS_NAME_LEN + 1] = {0}; /* 1 for snprintf null */
+	char *dir_name = "lost+found";
+	u64 lost_found_ino = 0;
+	u32 mode = 0700;
+	int ret;
+
+	/*
+	 * For link subvolume to lost+found,
+	 * 2 for parent(256)'s dir_index and dir_item
+	 * 2 for lost+found dir's inode_item and inode_ref
+	 * 2 for lost+found dir's dir_index and dir_item for the subvolume
+	 * 2 for the subvolume's root_ref and root_backref
+	 */
+	trans = btrfs_start_transaction(fs_root, 8);
+	if (IS_ERR(trans)) {
+		error("unable to start transaction");
+		ret = PTR_ERR(trans);
+		goto out;
+	}
+
+	/* Create lost+found directory */
+	ret = btrfs_mkdir(trans, fs_root, dir_name, strlen(dir_name),
+			  BTRFS_FIRST_FREE_OBJECTID, &lost_found_ino,
+			  mode);
+	if (ret < 0) {
+		error("failed to create '%s' dir: %d", dir_name, ret);
+		goto out;
+	}
+
+	/* Link the subvolume to lost+found directory */
+	snprintf(buf, BTRFS_NAME_LEN + 1, "sub%llu", subvol_id);
+	ret = btrfs_link_subvol(trans, fs_root, buf, subvol_id, lost_found_ino,
+				false);
+	if (ret) {
+		error("failed to link the subvol %llu: %d", subvol_id, ret);
+		goto out;
+	}
+
+	/* Clear root flags BTRFS_ROOT_SUBVOL_DEAD and increase root refs */
+	ret = recover_dead_root(trans, root, subvol_id);
+	if (ret)
+		goto out;
+
+	/* Delete the orphan item after undeletion is completed. */
+	ret = btrfs_del_orphan_item(trans, root, subvol_id);
+	if (ret) {
+		error("failed to delete the orphan_item for %llu: %d",
+				subvol_id, ret);
+		goto out;
+	}
+
+	ret = btrfs_commit_transaction(trans, fs_root);
+	if (ret) {
+		error("transaction commit failed: %d", ret);
+		goto out;
+	}
+
+out:
+	return ret;
+}