mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 10:01:39 -05:00
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:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user