From: "Darrick J. Wong" <djwong@kernel.org>
To: Bernd Schubert <bernd@bsbernd.com>
Cc: linux-fsdevel@vger.kernel.org, Miklos Szeredi <miklos@szeredi.hu>,
Joanne Koong <joannelkoong@gmail.com>, Kevin Chen <kchen@ddn.com>
Subject: Re: [PATCH v2 23/25] Move fuse_mnt_build_{source,type} to mount_util.c
Date: Mon, 30 Mar 2026 12:04:09 -0700 [thread overview]
Message-ID: <20260330190409.GB6202@frogsfrogsfrogs> (raw)
In-Reply-To: <20260326-fuse-init-before-mount-v2-23-b1ca8fcbf60f@bsbernd.com>
On Thu, Mar 26, 2026 at 10:34:56PM +0100, Bernd Schubert wrote:
> Also make it more generic and avoid taking struct mount_opts
> as parameter.
>
> mount_fsmount.c and fusermount.c use these functions now.
>
> Signed-off-by: Bernd Schubert <bernd@bsbernd.com>
Woot!
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
--D
> ---
> lib/mount.c | 37 +++----------------------------------
> lib/mount_fsmount.c | 29 ++++++++++++-----------------
> lib/mount_i_linux.h | 2 --
> lib/mount_util.c | 31 +++++++++++++++++++++++++++++++
> lib/mount_util.h | 5 +++++
> util/fusermount.c | 16 ++--------------
> 6 files changed, 53 insertions(+), 67 deletions(-)
>
> diff --git a/lib/mount.c b/lib/mount.c
> index f0d12525310a9ad239c0f447af60bd49b105a091..1e82adc8621da150e1ee61e8253b261a33625260 100644
> --- a/lib/mount.c
> +++ b/lib/mount.c
> @@ -651,10 +651,11 @@ int fuse_kern_do_mount(const char *mnt, struct mount_opts *mo,
> char *source = NULL;
> char *type = NULL;
> int res;
> + const char *devname = fuse_mnt_get_devname();
>
> res = -ENOMEM;
> - source = fuse_mnt_build_source(mo);
> - type = fuse_mnt_build_type(mo);
> + source = fuse_mnt_build_source(mo->fsname, mo->subtype, devname);
> + type = fuse_mnt_build_type(mo->blkdev, mo->subtype);
> if (!type || !source) {
> fuse_log(FUSE_LOG_ERR, "fuse: failed to allocate memory\n");
> goto out_close;
> @@ -834,35 +835,3 @@ out:
> free(mnt_opts);
> return res;
> }
> -
> -char *fuse_mnt_build_source(const struct mount_opts *mo)
> -{
> - const char *devname = fuse_mnt_get_devname();
> - char *source;
> - int ret;
> -
> - ret = asprintf(&source, "%s",
> - mo->fsname ? mo->fsname :
> - (mo->subtype ? mo->subtype : devname));
> - if (ret == -1)
> - return NULL;
> -
> - return source;
> -}
> -
> -char *fuse_mnt_build_type(const struct mount_opts *mo)
> -{
> - char *type;
> - int ret;
> -
> - if (mo->subtype)
> - ret = asprintf(&type, "%s.%s", mo->blkdev ? "fuseblk" : "fuse",
> - mo->subtype);
> - else
> - ret = asprintf(&type, "%s", mo->blkdev ? "fuseblk" : "fuse");
> -
> - if (ret == -1)
> - return NULL;
> -
> - return type;
> -}
> diff --git a/lib/mount_fsmount.c b/lib/mount_fsmount.c
> index f42ae97faedaf2420d97e701a22725d4293e4853..57355db89f907e0dbd910ead4ea39005ec26c44d 100644
> --- a/lib/mount_fsmount.c
> +++ b/lib/mount_fsmount.c
> @@ -329,15 +329,21 @@ int fuse_kern_fsmount(const char *mnt, unsigned long flags, int blkdev,
> const char *source_dev, const char *kernel_opts,
> const char *mnt_opts)
> {
> - const char *type;
> + char *type = NULL;
> char *source = NULL;
> int fsfd = -1;
> int mntfd = -1;
> int err, res;
> unsigned long mount_attrs;
>
> - /* Determine filesystem type */
> - type = blkdev ? "fuseblk" : "fuse";
> + /* Build type and source strings */
> + type = fuse_mnt_build_type(blkdev, subtype);
> + source = fuse_mnt_build_source(fsname, subtype, source_dev);
> + err = -ENOMEM;
> + if (!type || !source) {
> + fprintf(stderr, "fuse: failed to allocate memory\n");
> + goto out_free;
> + }
>
> /* Try to open filesystem context */
> fsfd = fsopen(type, FSOPEN_CLOEXEC);
> @@ -345,21 +351,9 @@ int fuse_kern_fsmount(const char *mnt, unsigned long flags, int blkdev,
> if (errno != EPERM)
> fprintf(stderr, "fuse: fsopen(%s) failed: %s\n", type,
> strerror(errno));
> - return -1;
> + goto out_free;
> }
>
> - /* Build source string */
> - source = malloc((fsname ? strlen(fsname) : 0) +
> - (subtype ? strlen(subtype) : 0) +
> - strlen(source_dev) + 32);
> - err = -ENOMEM;
> - if (!source) {
> - fprintf(stderr, "fuse: failed to allocate memory\n");
> - goto out_close_fsfd;
> - }
> -
> - strcpy(source, fsname ? fsname : (subtype ? subtype : source_dev));
> -
> /* Configure source */
> res = fsconfig(fsfd, FSCONFIG_SET_STRING, "source", source, 0);
> if (res == -1) {
> @@ -439,6 +433,7 @@ int fuse_kern_fsmount(const char *mnt, unsigned long flags, int blkdev,
>
> close(mntfd);
> free(source);
> + free(type);
> return 0;
>
> out_umount:
> @@ -458,7 +453,7 @@ out_close_mntfd:
> close(mntfd);
> out_free:
> free(source);
> -out_close_fsfd:
> + free(type);
> if (fsfd != -1)
> close(fsfd);
> errno = -err;
> diff --git a/lib/mount_i_linux.h b/lib/mount_i_linux.h
> index ae98296a334a2aa39c4f3e5c3e4e3c136ae38cd3..8fc27b958eab3141ab852a7cb5098febd484e04f 100644
> --- a/lib/mount_i_linux.h
> +++ b/lib/mount_i_linux.h
> @@ -41,8 +41,6 @@ int fuse_kern_fsmount(const char *mnt, unsigned long flags, int blkdev,
> int fuse_kern_fsmount_mo(const char *mnt, struct mount_opts *mo,
> const char *mnt_opts);
>
> -char *fuse_mnt_build_source(const struct mount_opts *mo);
> -char *fuse_mnt_build_type(const struct mount_opts *mo);
> int mount_fusermount_obtain_fd(const char *mountpoint,
> struct mount_opts *mo,
> const char *opts, int *sock_fd_out,
> diff --git a/lib/mount_util.c b/lib/mount_util.c
> index b6b75e60874ae9b2ec0c96f2a62b4ec1943a2a00..8cb0ce999e0df498c6777daf2bba6f47f12d7eee 100644
> --- a/lib/mount_util.c
> +++ b/lib/mount_util.c
> @@ -461,3 +461,34 @@ const char *fuse_mnt_get_devname(void)
>
> return devname ? devname : "/dev/fuse";
> }
> +
> +char *fuse_mnt_build_source(const char *fsname, const char *subtype,
> + const char *devname)
> +{
> + char *source;
> + int ret;
> +
> + ret = asprintf(&source, "%s",
> + fsname ? fsname : (subtype ? subtype : devname));
> + if (ret == -1)
> + return NULL;
> +
> + return source;
> +}
> +
> +char *fuse_mnt_build_type(int blkdev, const char *subtype)
> +{
> + char *type;
> + int ret;
> +
> + if (subtype)
> + ret = asprintf(&type, "%s.%s", blkdev ? "fuseblk" : "fuse",
> + subtype);
> + else
> + ret = asprintf(&type, "%s", blkdev ? "fuseblk" : "fuse");
> +
> + if (ret == -1)
> + return NULL;
> +
> + return type;
> +}
> diff --git a/lib/mount_util.h b/lib/mount_util.h
> index b83db556d5fdb4bd8dd5e1750c8d11faf7373d82..5ba428a1f96df0dda21c0aadd936c022c4bb751c 100644
> --- a/lib/mount_util.h
> +++ b/lib/mount_util.h
> @@ -35,4 +35,9 @@ const char *fuse_mnt_get_devname(void);
> int fuse_mnt_add_mount_helper(const char *mnt, const char *source,
> const char *type, const char *mnt_opts);
>
> +/* Build source and type strings for mounting */
> +char *fuse_mnt_build_source(const char *fsname, const char *subtype,
> + const char *devname);
> +char *fuse_mnt_build_type(int blkdev, const char *subtype);
> +
> #endif /* FUSE_MOUNT_UTIL_H_ */
> diff --git a/util/fusermount.c b/util/fusermount.c
> index bf442416c83d6da3f80eca5c9814df29f61bec56..6d3ad4b300ba6266778fc23f35fa6f4fc929ff3f 100644
> --- a/util/fusermount.c
> +++ b/util/fusermount.c
> @@ -1048,25 +1048,13 @@ static int prepare_mount(const char *opts, struct mount_params *mp)
> sprintf(d, "fd=%i,rootmode=%o,user_id=%u,group_id=%u",
> mp->fd, mp->rootmode, getuid(), getgid());
>
> - mp->source = malloc((mp->fsname ? strlen(mp->fsname) : 0) +
> - (mp->subtype ? strlen(mp->subtype) : 0) + strlen(mp->dev) + 32);
> -
> - mp->type = malloc((mp->subtype ? strlen(mp->subtype) : 0) + 32);
> + mp->source = fuse_mnt_build_source(mp->fsname, mp->subtype, mp->dev);
> + mp->type = fuse_mnt_build_type(mp->blkdev, mp->subtype);
> if (!mp->type || !mp->source) {
> fprintf(stderr, "%s: failed to allocate memory\n", progname);
> goto err;
> }
>
> - if (mp->subtype)
> - sprintf(mp->type, "%s.%s", mp->blkdev ? "fuseblk" : "fuse", mp->subtype);
> - else
> - strcpy(mp->type, mp->blkdev ? "fuseblk" : "fuse");
> -
> - if (mp->fsname)
> - strcpy(mp->source, mp->fsname);
> - else
> - strcpy(mp->source, mp->subtype ? mp->subtype : mp->dev);
> -
> return 0;
>
> err:
>
> --
> 2.43.0
>
>
next prev parent reply other threads:[~2026-03-30 19:04 UTC|newest]
Thread overview: 74+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-26 21:34 [PATCH v2 00/25] libfuse: Add support for synchronous init Bernd Schubert
2026-03-26 21:34 ` [PATCH v2 01/25] ci-build: Add environment logging Bernd Schubert
2026-03-27 3:20 ` Darrick J. Wong
2026-03-26 21:34 ` [PATCH v2 02/25] Add 'STRCPY' to the checkpatch ignore option Bernd Schubert
2026-03-26 21:34 ` [PATCH v2 03/25] checkpatch.pl: Add _Atomic to $Attribute patttern Bernd Schubert
2026-03-26 21:34 ` [PATCH v2 04/25] Add a new daemonize API Bernd Schubert
2026-03-27 22:06 ` Darrick J. Wong
2026-03-27 23:07 ` Bernd Schubert
2026-03-28 4:01 ` Darrick J. Wong
2026-03-30 17:45 ` Darrick J. Wong
2026-03-30 18:26 ` Bernd Schubert
2026-03-30 21:25 ` Darrick J. Wong
2026-03-30 17:55 ` Darrick J. Wong
2026-04-18 18:26 ` Bernd Schubert
2026-03-26 21:34 ` [PATCH v2 05/25] Sync fuse_kernel.h with linux-6.18 Bernd Schubert
2026-03-26 21:34 ` [PATCH v2 06/25] mount.c: Split fuse_mount_sys to prepare privileged sync FUSE_INIT Bernd Schubert
2026-03-26 21:34 ` [PATCH v2 07/25] Add FUSE_MOUNT_FALLBACK_NEEDED define for -2 mount errors Bernd Schubert
2026-03-27 3:20 ` Darrick J. Wong
2026-03-26 21:34 ` [PATCH v2 08/25] Refactor mount code / move common functions to mount_util.c Bernd Schubert
2026-03-26 21:34 ` [PATCH v2 09/25] Use asprintf() for fuse_mnt_build_{source,type} Bernd Schubert
2026-03-27 3:24 ` Darrick J. Wong
2026-03-30 15:34 ` Bernd Schubert
2026-03-26 21:34 ` [PATCH v2 10/25] lib/mount.c: Remove some BSD ifdefs Bernd Schubert
2026-03-27 3:28 ` Darrick J. Wong
2026-03-26 21:34 ` [PATCH v2 11/25] Move 'struct mount_flags' to util.h Bernd Schubert
2026-03-30 18:11 ` Darrick J. Wong
2026-03-26 21:34 ` [PATCH v2 12/25] conftest.py: Add more valgrind filter patterns Bernd Schubert
2026-03-30 18:16 ` Darrick J. Wong
2026-03-26 21:34 ` [PATCH v2 13/25] Add support for the new linux mount API Bernd Schubert
2026-03-30 18:27 ` Darrick J. Wong
2026-04-19 17:45 ` Bernd Schubert
2026-04-20 15:48 ` Darrick J. Wong
2026-03-26 21:34 ` [PATCH v2 14/25] fuse mount: Support synchronous FUSE_INIT (privileged daemon) Bernd Schubert
2026-03-30 18:44 ` Darrick J. Wong
2026-04-19 22:36 ` Bernd Schubert
2026-04-20 15:53 ` Darrick J. Wong
2026-04-20 16:40 ` Bernd Schubert
2026-04-20 16:43 ` Darrick J. Wong
2026-03-26 21:34 ` [PATCH v2 15/25] Add fuse_session_set_debug() to enable debug output without foreground Bernd Schubert
2026-03-26 21:34 ` [PATCH v2 16/25] Move more generic mount code to mount_util.{c,h} Bernd Schubert
2026-03-30 18:47 ` Darrick J. Wong
2026-03-26 21:34 ` [PATCH v2 17/25] Split the fusermount do_mount function Bernd Schubert
2026-03-30 18:48 ` Darrick J. Wong
2026-03-26 21:34 ` [PATCH v2 18/25] fusermout: Remove the large read check Bernd Schubert
2026-03-27 3:32 ` Darrick J. Wong
2026-03-30 15:26 ` Bernd Schubert
2026-03-30 17:57 ` Darrick J. Wong
2026-03-26 21:34 ` [PATCH v2 19/25] fusermount: Refactor extract_x_options Bernd Schubert
2026-03-26 21:34 ` [PATCH v2 20/25] Make fusermount work bidirectional for sync init Bernd Schubert
2026-03-30 19:03 ` Darrick J. Wong
2026-04-19 23:18 ` Bernd Schubert
2026-04-20 15:55 ` Darrick J. Wong
2026-03-26 21:34 ` [PATCH v2 21/25] New mount API: Filter out "user=" Bernd Schubert
2026-03-27 3:32 ` Darrick J. Wong
2026-03-26 21:34 ` [PATCH v2 22/25] Add support for sync-init of unprivileged daemons Bernd Schubert
2026-03-31 0:54 ` Darrick J. Wong
2026-04-20 0:02 ` Bernd Schubert
2026-04-20 16:31 ` Darrick J. Wong
2026-03-26 21:34 ` [PATCH v2 23/25] Move fuse_mnt_build_{source,type} to mount_util.c Bernd Schubert
2026-03-30 19:04 ` Darrick J. Wong [this message]
2026-03-26 21:34 ` [PATCH v2 24/25] Add mount and daemonization README documents Bernd Schubert
2026-03-31 1:17 ` Darrick J. Wong
2026-04-20 0:21 ` Bernd Schubert
2026-04-20 16:39 ` Darrick J. Wong
2026-03-26 21:34 ` [PATCH v2 25/25] Add a background debug option to passthrough hp Bernd Schubert
2026-03-30 19:04 ` Darrick J. Wong
2026-04-07 12:04 ` fuse-devel list on kernel.org Amir Goldstein
2026-04-07 12:25 ` Bernd Schubert
2026-04-07 12:29 ` Amir Goldstein
2026-04-07 18:05 ` Bernd Schubert
2026-04-07 19:10 ` Darrick J. Wong
2026-04-08 8:21 ` Amir Goldstein
2026-04-13 12:23 ` Amir Goldstein
2026-04-13 12:36 ` Bernd Schubert
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=20260330190409.GB6202@frogsfrogsfrogs \
--to=djwong@kernel.org \
--cc=bernd@bsbernd.com \
--cc=joannelkoong@gmail.com \
--cc=kchen@ddn.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=miklos@szeredi.hu \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.