open_last_lookups(): consolidate fsnotify_create() calls
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 5 Mar 2020 18:25:20 +0000 (13:25 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 2 Apr 2020 05:09:28 +0000 (01:09 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/namei.c

index 329ade3..6cb4160 100644 (file)
@@ -2957,8 +2957,6 @@ static struct dentry *atomic_open(struct nameidata *nd, struct dentry *dentry,
                                dput(dentry);
                                dentry = dget(file->f_path.dentry);
                        }
-                       if (file->f_mode & FMODE_CREATED)
-                               fsnotify_create(dir, dentry);
                } else if (WARN_ON(file->f_path.dentry == DENTRY_NOT_SET)) {
                        error = -EIO;
                } else {
@@ -2966,8 +2964,6 @@ static struct dentry *atomic_open(struct nameidata *nd, struct dentry *dentry,
                                dput(dentry);
                                dentry = file->f_path.dentry;
                        }
-                       if (file->f_mode & FMODE_CREATED)
-                               fsnotify_create(dir, dentry);
                        if (unlikely(d_is_negative(dentry)))
                                error = -ENOENT;
                }
@@ -3103,7 +3099,6 @@ no_open:
                                                open_flag & O_EXCL);
                if (error)
                        goto out_dput;
-               fsnotify_create(dir_inode, dentry);
        }
        if (unlikely(create_error) && !dentry->d_inode) {
                error = create_error;
@@ -3182,6 +3177,8 @@ static const char *open_last_lookups(struct nameidata *nd,
        else
                inode_lock_shared(dir->d_inode);
        dentry = lookup_open(nd, file, op, got_write);
+       if (!IS_ERR(dentry) && (file->f_mode & FMODE_CREATED))
+               fsnotify_create(dir->d_inode, dentry);
        if (open_flag & O_CREAT)
                inode_unlock(dir->d_inode);
        else