mirror of
https://github.com/torvalds/linux.git
synced 2026-05-24 07:03:03 +02:00
simplify gfs2_atomic_open()
the difference from 9p et.al. is that on gfs2 the lookup side might end up opening the file. That's what the FMODE_OPENED check there is about - and it might actually be seen with finish_open() having failed, if it fails late enough. Reviewed-by: NeilBrown <neil@brown.name> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
1d7b343785
commit
d71cbf0d3b
|
|
@ -1368,27 +1368,19 @@ static int gfs2_atomic_open(struct inode *dir, struct dentry *dentry,
|
|||
struct file *file, unsigned flags,
|
||||
umode_t mode)
|
||||
{
|
||||
struct dentry *d;
|
||||
bool excl = !!(flags & O_EXCL);
|
||||
|
||||
if (!d_in_lookup(dentry))
|
||||
goto skip_lookup;
|
||||
|
||||
d = __gfs2_lookup(dir, dentry, file);
|
||||
if (IS_ERR(d))
|
||||
return PTR_ERR(d);
|
||||
if (d != NULL)
|
||||
dentry = d;
|
||||
if (d_really_is_positive(dentry)) {
|
||||
if (!(file->f_mode & FMODE_OPENED))
|
||||
if (d_in_lookup(dentry)) {
|
||||
struct dentry *d = __gfs2_lookup(dir, dentry, file);
|
||||
if (file->f_mode & FMODE_OPENED) {
|
||||
if (IS_ERR(d))
|
||||
return PTR_ERR(d);
|
||||
dput(d);
|
||||
return excl && (flags & O_CREAT) ? -EEXIST : 0;
|
||||
}
|
||||
if (d || d_really_is_positive(dentry))
|
||||
return finish_no_open(file, d);
|
||||
dput(d);
|
||||
return excl && (flags & O_CREAT) ? -EEXIST : 0;
|
||||
}
|
||||
|
||||
BUG_ON(d != NULL);
|
||||
|
||||
skip_lookup:
|
||||
if (!(flags & O_CREAT))
|
||||
return -ENOENT;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user