Unverified Commit 2c2b67af authored by Hongbo Li's avatar Hongbo Li Committed by Christian Brauner
Browse files

hostfs: Fix only passing host root in boot stage with new mount



In the old mount proceedure, hostfs could only pass root directory during
boot. This is because it constructed the root directory using the @root_ino
event without any mount options. However, when using it with the new mount
API, this step is no longer triggered. As a result, if users mounts without
specifying any mount options, the @host_root_path remains uninitialized. To
prevent this issue, the @host_root_path should be initialized at the time
of allocation.

Reported-by: default avatarGeoffrey Thorpe <geoff@geoffthorpe.net>
Closes: https://lore.kernel.org/all/643333a0-f434-42fb-82ac-d25a0b56f3b7@geoffthorpe.net/


Fixes: cd140ce9 ("hostfs: convert hostfs to use the new mount API")
Signed-off-by: default avatarHongbo Li <lihongbo22@huawei.com>
Link: https://patch.msgid.link/20251011092235.29880-1-lihongbo22@huawei.com


Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent 0778ac7d
Loading
Loading
Loading
Loading
+18 −11
Original line number Diff line number Diff line
@@ -979,7 +979,7 @@ static int hostfs_parse_param(struct fs_context *fc, struct fs_parameter *param)
{
	struct hostfs_fs_info *fsi = fc->s_fs_info;
	struct fs_parse_result result;
	char *host_root;
	char *host_root, *tmp_root;
	int opt;

	opt = fs_parse(fc, hostfs_param_specs, param, &result);
@@ -990,11 +990,13 @@ static int hostfs_parse_param(struct fs_context *fc, struct fs_parameter *param)
	case Opt_hostfs:
		host_root = param->string;
		if (!*host_root)
			host_root = "";
		fsi->host_root_path =
			kasprintf(GFP_KERNEL, "%s/%s", root_ino, host_root);
		if (fsi->host_root_path == NULL)
			break;
		tmp_root = kasprintf(GFP_KERNEL, "%s%s",
				     fsi->host_root_path, host_root);
		if (!tmp_root)
			return -ENOMEM;
		kfree(fsi->host_root_path);
		fsi->host_root_path = tmp_root;
		break;
	}

@@ -1004,17 +1006,17 @@ static int hostfs_parse_param(struct fs_context *fc, struct fs_parameter *param)
static int hostfs_parse_monolithic(struct fs_context *fc, void *data)
{
	struct hostfs_fs_info *fsi = fc->s_fs_info;
	char *host_root = (char *)data;
	char *tmp_root, *host_root = (char *)data;

	/* NULL is printed as '(null)' by printf(): avoid that. */
	if (host_root == NULL)
		host_root = "";
		return 0;

	fsi->host_root_path =
		kasprintf(GFP_KERNEL, "%s/%s", root_ino, host_root);
	if (fsi->host_root_path == NULL)
	tmp_root = kasprintf(GFP_KERNEL, "%s%s", fsi->host_root_path, host_root);
	if (!tmp_root)
		return -ENOMEM;

	kfree(fsi->host_root_path);
	fsi->host_root_path = tmp_root;
	return 0;
}

@@ -1049,6 +1051,11 @@ static int hostfs_init_fs_context(struct fs_context *fc)
	if (!fsi)
		return -ENOMEM;

	fsi->host_root_path = kasprintf(GFP_KERNEL, "%s/", root_ino);
	if (!fsi->host_root_path) {
		kfree(fsi);
		return -ENOMEM;
	}
	fc->s_fs_info = fsi;
	fc->ops = &hostfs_context_ops;
	return 0;