| Message ID | 20250917232736.2556586-5-viro@zeniv.linux.org.uk |
|---|---|
| State | New |
| Headers | show |
| Series | [1/9] allow finish_no_open(file, ERR_PTR(-E...)) | expand |
Hi, On 18-Sep-25 1:27 AM, Al Viro wrote: > similar to 9p et.al. > > Reviewed-by: NeilBrown <neil@brown.name> > Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Thanks, patch looks good to me: Reviewed-by: Hans de Goede <hansg@kernel.org> Regards, Hans > --- > fs/vboxsf/dir.c | 25 +++++++++---------------- > 1 file changed, 9 insertions(+), 16 deletions(-) > > diff --git a/fs/vboxsf/dir.c b/fs/vboxsf/dir.c > index 770e29ec3557..42bedc4ec7af 100644 > --- a/fs/vboxsf/dir.c > +++ b/fs/vboxsf/dir.c > @@ -315,46 +315,39 @@ static int vboxsf_dir_atomic_open(struct inode *parent, struct dentry *dentry, > { > struct vboxsf_sbi *sbi = VBOXSF_SBI(parent->i_sb); > struct vboxsf_handle *sf_handle; > - struct dentry *res = NULL; > u64 handle; > int err; > > if (d_in_lookup(dentry)) { > - res = vboxsf_dir_lookup(parent, dentry, 0); > - if (IS_ERR(res)) > - return PTR_ERR(res); > - > - if (res) > - dentry = res; > + struct dentry *res = vboxsf_dir_lookup(parent, dentry, 0); > + if (res || d_really_is_positive(dentry)) > + return finish_no_open(file, res); > } > > /* Only creates */ > - if (!(flags & O_CREAT) || d_really_is_positive(dentry)) > - return finish_no_open(file, res); > + if (!(flags & O_CREAT)) > + return finish_no_open(file, NULL); > > err = vboxsf_dir_create(parent, dentry, mode, false, flags & O_EXCL, &handle); > if (err) > - goto out; > + return err; > > sf_handle = vboxsf_create_sf_handle(d_inode(dentry), handle, SHFL_CF_ACCESS_READWRITE); > if (IS_ERR(sf_handle)) { > vboxsf_close(sbi->root, handle); > - err = PTR_ERR(sf_handle); > - goto out; > + return PTR_ERR(sf_handle); > } > > err = finish_open(file, dentry, generic_file_open); > if (err) { > /* This also closes the handle passed to vboxsf_create_sf_handle() */ > vboxsf_release_sf_handle(d_inode(dentry), sf_handle); > - goto out; > + return err; > } > > file->private_data = sf_handle; > file->f_mode |= FMODE_CREATED; > -out: > - dput(res); > - return err; > + return 0; > } > > static int vboxsf_dir_unlink(struct inode *parent, struct dentry *dentry)
diff --git a/fs/vboxsf/dir.c b/fs/vboxsf/dir.c index 770e29ec3557..42bedc4ec7af 100644 --- a/fs/vboxsf/dir.c +++ b/fs/vboxsf/dir.c @@ -315,46 +315,39 @@ static int vboxsf_dir_atomic_open(struct inode *parent, struct dentry *dentry, { struct vboxsf_sbi *sbi = VBOXSF_SBI(parent->i_sb); struct vboxsf_handle *sf_handle; - struct dentry *res = NULL; u64 handle; int err; if (d_in_lookup(dentry)) { - res = vboxsf_dir_lookup(parent, dentry, 0); - if (IS_ERR(res)) - return PTR_ERR(res); - - if (res) - dentry = res; + struct dentry *res = vboxsf_dir_lookup(parent, dentry, 0); + if (res || d_really_is_positive(dentry)) + return finish_no_open(file, res); } /* Only creates */ - if (!(flags & O_CREAT) || d_really_is_positive(dentry)) - return finish_no_open(file, res); + if (!(flags & O_CREAT)) + return finish_no_open(file, NULL); err = vboxsf_dir_create(parent, dentry, mode, false, flags & O_EXCL, &handle); if (err) - goto out; + return err; sf_handle = vboxsf_create_sf_handle(d_inode(dentry), handle, SHFL_CF_ACCESS_READWRITE); if (IS_ERR(sf_handle)) { vboxsf_close(sbi->root, handle); - err = PTR_ERR(sf_handle); - goto out; + return PTR_ERR(sf_handle); } err = finish_open(file, dentry, generic_file_open); if (err) { /* This also closes the handle passed to vboxsf_create_sf_handle() */ vboxsf_release_sf_handle(d_inode(dentry), sf_handle); - goto out; + return err; } file->private_data = sf_handle; file->f_mode |= FMODE_CREATED; -out: - dput(res); - return err; + return 0; } static int vboxsf_dir_unlink(struct inode *parent, struct dentry *dentry)