NFSv4: check FMODE_EXEC from open context mode in nfs4_opendata_access()
authorChenXiaoSong <chenxiaosong2@huawei.com>
Fri, 23 Sep 2022 05:40:15 +0000 (13:40 +0800)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Tue, 6 Dec 2022 15:39:17 +0000 (10:39 -0500)
After converting file f_flags to open context mode by flags_to_mode(), open
context mode will have FMODE_EXEC when file open for exec, so we check
FMODE_EXEC from open context mode.

No functional change, just simplify the code.

Signed-off-by: ChenXiaoSong <chenxiaosong2@huawei.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/nfs4proc.c

index e51044a5f550f8c405a82e617e5180a6c75371c2..44f1dcb6020fb5a189bb534e5037d5092764f5a9 100644 (file)
@@ -2630,8 +2630,7 @@ static int _nfs4_recover_proc_open(struct nfs4_opendata *data)
  */
 static int nfs4_opendata_access(const struct cred *cred,
                                struct nfs4_opendata *opendata,
-                               struct nfs4_state *state, fmode_t fmode,
-                               int openflags)
+                               struct nfs4_state *state, fmode_t fmode)
 {
        struct nfs_access_entry cache;
        u32 mask, flags;
@@ -2642,11 +2641,7 @@ static int nfs4_opendata_access(const struct cred *cred,
                return 0;
 
        mask = 0;
-       /*
-        * Use openflags to check for exec, because fmode won't
-        * always have FMODE_EXEC set when file open for exec.
-        */
-       if (openflags & __FMODE_EXEC) {
+       if (fmode & FMODE_EXEC) {
                /* ONLY check for exec rights */
                if (S_ISDIR(state->inode->i_mode))
                        mask = NFS4_ACCESS_LOOKUP;
@@ -3034,7 +3029,7 @@ static unsigned nfs4_exclusive_attrset(struct nfs4_opendata *opendata,
 }
 
 static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,
-               int flags, struct nfs_open_context *ctx)
+               struct nfs_open_context *ctx)
 {
        struct nfs4_state_owner *sp = opendata->owner;
        struct nfs_server *server = sp->so_server;
@@ -3095,8 +3090,7 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,
        /* Parse layoutget results before we check for access */
        pnfs_parse_lgopen(state->inode, opendata->lgp, ctx);
 
-       ret = nfs4_opendata_access(sp->so_cred, opendata, state,
-                       acc_mode, flags);
+       ret = nfs4_opendata_access(sp->so_cred, opendata, state, acc_mode);
        if (ret != 0)
                goto out;
 
@@ -3170,7 +3164,7 @@ static int _nfs4_do_open(struct inode *dir,
        if (d_really_is_positive(dentry))
                opendata->state = nfs4_get_open_state(d_inode(dentry), sp);
 
-       status = _nfs4_open_and_get_state(opendata, flags, ctx);
+       status = _nfs4_open_and_get_state(opendata, ctx);
        if (status != 0)
                goto err_opendata_put;
        state = ctx->state;