On Wed 02-08-23 13:57:04, Christian Brauner wrote: > Split the steps to create a superblock into a tiny helper. This will > make the next patch easier to follow. > > Reviewed-by: Josef Bacik <josef@xxxxxxxxxxxxxx> > Signed-off-by: Christian Brauner <brauner@xxxxxxxxxx> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > fs/fsopen.c | 51 ++++++++++++++++++++++++++++++++++----------------- > 1 file changed, 34 insertions(+), 17 deletions(-) > > diff --git a/fs/fsopen.c b/fs/fsopen.c > index fc9d2d9fd234..1de2b3576958 100644 > --- a/fs/fsopen.c > +++ b/fs/fsopen.c > @@ -209,6 +209,39 @@ SYSCALL_DEFINE3(fspick, int, dfd, const char __user *, path, unsigned int, flags > return ret; > } > > +static int vfs_cmd_create(struct fs_context *fc) > +{ > + struct super_block *sb; > + int ret; > + > + if (fc->phase != FS_CONTEXT_CREATE_PARAMS) > + return -EBUSY; > + > + if (!mount_capable(fc)) > + return -EPERM; > + > + fc->phase = FS_CONTEXT_CREATING; > + > + ret = vfs_get_tree(fc); > + if (ret) { > + fc->phase = FS_CONTEXT_FAILED; > + return ret; > + } > + > + sb = fc->root->d_sb; > + ret = security_sb_kern_mount(sb); > + if (unlikely(ret)) { > + fc_drop_locked(fc); > + fc->phase = FS_CONTEXT_FAILED; > + return ret; > + } > + > + /* vfs_get_tree() callchains will have grabbed @s_umount */ > + up_write(&sb->s_umount); > + fc->phase = FS_CONTEXT_AWAITING_MOUNT; > + return 0; > +} > + > /* > * Check the state and apply the configuration. Note that this function is > * allowed to 'steal' the value by setting param->xxx to NULL before returning. > @@ -224,23 +257,7 @@ static int vfs_fsconfig_locked(struct fs_context *fc, int cmd, > return ret; > switch (cmd) { > case FSCONFIG_CMD_CREATE: > - if (fc->phase != FS_CONTEXT_CREATE_PARAMS) > - return -EBUSY; > - if (!mount_capable(fc)) > - return -EPERM; > - fc->phase = FS_CONTEXT_CREATING; > - ret = vfs_get_tree(fc); > - if (ret) > - break; > - sb = fc->root->d_sb; > - ret = security_sb_kern_mount(sb); > - if (unlikely(ret)) { > - fc_drop_locked(fc); > - break; > - } > - up_write(&sb->s_umount); > - fc->phase = FS_CONTEXT_AWAITING_MOUNT; > - return 0; > + return vfs_cmd_create(fc); > case FSCONFIG_CMD_RECONFIGURE: > if (fc->phase != FS_CONTEXT_RECONF_PARAMS) > return -EBUSY; > > -- > 2.34.1 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR