simplify vboxsf_dir_atomic_open()

similar to 9p et.al.

Reviewed-by: NeilBrown <neil@brown.name>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro
2025-09-12 11:45:41 -04:00
parent fe871217ac
commit 0b7543126e

View File

@@ -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_sbi *sbi = VBOXSF_SBI(parent->i_sb);
struct vboxsf_handle *sf_handle; struct vboxsf_handle *sf_handle;
struct dentry *res = NULL;
u64 handle; u64 handle;
int err; int err;
if (d_in_lookup(dentry)) { if (d_in_lookup(dentry)) {
res = vboxsf_dir_lookup(parent, dentry, 0); struct dentry *res = vboxsf_dir_lookup(parent, dentry, 0);
if (IS_ERR(res)) if (res || d_really_is_positive(dentry))
return PTR_ERR(res); return finish_no_open(file, res);
if (res)
dentry = res;
} }
/* Only creates */ /* Only creates */
if (!(flags & O_CREAT) || d_really_is_positive(dentry)) if (!(flags & O_CREAT))
return finish_no_open(file, res); return finish_no_open(file, NULL);
err = vboxsf_dir_create(parent, dentry, mode, false, flags & O_EXCL, &handle); err = vboxsf_dir_create(parent, dentry, mode, false, flags & O_EXCL, &handle);
if (err) if (err)
goto out; return err;
sf_handle = vboxsf_create_sf_handle(d_inode(dentry), handle, SHFL_CF_ACCESS_READWRITE); sf_handle = vboxsf_create_sf_handle(d_inode(dentry), handle, SHFL_CF_ACCESS_READWRITE);
if (IS_ERR(sf_handle)) { if (IS_ERR(sf_handle)) {
vboxsf_close(sbi->root, handle); vboxsf_close(sbi->root, handle);
err = PTR_ERR(sf_handle); return PTR_ERR(sf_handle);
goto out;
} }
err = finish_open(file, dentry, generic_file_open); err = finish_open(file, dentry, generic_file_open);
if (err) { if (err) {
/* This also closes the handle passed to vboxsf_create_sf_handle() */ /* This also closes the handle passed to vboxsf_create_sf_handle() */
vboxsf_release_sf_handle(d_inode(dentry), sf_handle); vboxsf_release_sf_handle(d_inode(dentry), sf_handle);
goto out; return err;
} }
file->private_data = sf_handle; file->private_data = sf_handle;
file->f_mode |= FMODE_CREATED; file->f_mode |= FMODE_CREATED;
out: return 0;
dput(res);
return err;
} }
static int vboxsf_dir_unlink(struct inode *parent, struct dentry *dentry) static int vboxsf_dir_unlink(struct inode *parent, struct dentry *dentry)