diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2020-01-26 18:32:22 +0300 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2020-03-14 04:09:12 +0300 |
commit | 5a2d3edd8dad8c8870419c614e3a7449effe87cb (patch) | |
tree | 7b27b0eace440bc312cdc977889fac4229e8c3e9 /fs | |
parent | 59e96e65833e05a9410327627d91ccef39392a25 (diff) | |
download | linux-5a2d3edd8dad8c8870419c614e3a7449effe87cb.tar.xz |
do_last(): rejoing the common path earlier in FMODE_{OPENED,CREATED} case
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/namei.c | 21 |
1 files changed, 8 insertions, 13 deletions
diff --git a/fs/namei.c b/fs/namei.c index 2eef41f505db..c85fdfd6b33d 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -3200,13 +3200,6 @@ static const char *do_last(struct nameidata *nd, return ERR_CAST(dentry); if (file->f_mode & FMODE_OPENED) { - if (file->f_mode & FMODE_CREATED) { - open_flag &= ~O_TRUNC; - will_truncate = false; - acc_mode = 0; - } else if (!S_ISREG(file_inode(file)->i_mode)) - will_truncate = false; - audit_inode(nd->name, file->f_path.dentry, 0); dput(nd->path.dentry); nd->path.dentry = dentry; @@ -3214,10 +3207,6 @@ static const char *do_last(struct nameidata *nd, } if (file->f_mode & FMODE_CREATED) { - /* Don't check for write permission, don't truncate */ - open_flag &= ~O_TRUNC; - will_truncate = false; - acc_mode = 0; dput(nd->path.dentry); nd->path.dentry = dentry; goto finish_open_created; @@ -3252,10 +3241,16 @@ finish_open: } if ((nd->flags & LOOKUP_DIRECTORY) && !d_can_lookup(nd->path.dentry)) return ERR_PTR(-ENOTDIR); - if (!d_is_reg(nd->path.dentry)) - will_truncate = false; finish_open_created: + if (file->f_mode & FMODE_CREATED) { + /* Don't check for write permission, don't truncate */ + open_flag &= ~O_TRUNC; + will_truncate = false; + acc_mode = 0; + } else if (!d_is_reg(nd->path.dentry)) { + will_truncate = false; + } if (will_truncate) { error = mnt_want_write(nd->path.mnt); if (error) |