diff options
Diffstat (limited to 'fs/nfsd/nfs4state.c')
-rw-r--r-- | fs/nfsd/nfs4state.c | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 96c7578cbe1e..9daa0b9feb8d 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
@@ -123,7 +123,7 @@ static void release_stateid(struct nfs4_stateid *stp, int flags); | |||
123 | */ | 123 | */ |
124 | 124 | ||
125 | /* recall_lock protects the del_recall_lru */ | 125 | /* recall_lock protects the del_recall_lru */ |
126 | static spinlock_t recall_lock = SPIN_LOCK_UNLOCKED; | 126 | static DEFINE_SPINLOCK(recall_lock); |
127 | static struct list_head del_recall_lru; | 127 | static struct list_head del_recall_lru; |
128 | 128 | ||
129 | static void | 129 | static void |
@@ -529,8 +529,7 @@ move_to_confirmed(struct nfs4_client *clp) | |||
529 | 529 | ||
530 | dprintk("NFSD: move_to_confirm nfs4_client %p\n", clp); | 530 | dprintk("NFSD: move_to_confirm nfs4_client %p\n", clp); |
531 | list_del_init(&clp->cl_strhash); | 531 | list_del_init(&clp->cl_strhash); |
532 | list_del_init(&clp->cl_idhash); | 532 | list_move(&clp->cl_idhash, &conf_id_hashtbl[idhashval]); |
533 | list_add(&clp->cl_idhash, &conf_id_hashtbl[idhashval]); | ||
534 | strhashval = clientstr_hashval(clp->cl_recdir); | 533 | strhashval = clientstr_hashval(clp->cl_recdir); |
535 | list_add(&clp->cl_strhash, &conf_str_hashtbl[strhashval]); | 534 | list_add(&clp->cl_strhash, &conf_str_hashtbl[strhashval]); |
536 | renew_client(clp); | 535 | renew_client(clp); |
@@ -1238,8 +1237,15 @@ find_file(struct inode *ino) | |||
1238 | return NULL; | 1237 | return NULL; |
1239 | } | 1238 | } |
1240 | 1239 | ||
1241 | #define TEST_ACCESS(x) ((x > 0 || x < 4)?1:0) | 1240 | static int access_valid(u32 x) |
1242 | #define TEST_DENY(x) ((x >= 0 || x < 5)?1:0) | 1241 | { |
1242 | return (x > 0 && x < 4); | ||
1243 | } | ||
1244 | |||
1245 | static int deny_valid(u32 x) | ||
1246 | { | ||
1247 | return (x >= 0 && x < 5); | ||
1248 | } | ||
1243 | 1249 | ||
1244 | static void | 1250 | static void |
1245 | set_access(unsigned int *access, unsigned long bmap) { | 1251 | set_access(unsigned int *access, unsigned long bmap) { |
@@ -1746,7 +1752,8 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf | |||
1746 | int status; | 1752 | int status; |
1747 | 1753 | ||
1748 | status = nfserr_inval; | 1754 | status = nfserr_inval; |
1749 | if (!TEST_ACCESS(open->op_share_access) || !TEST_DENY(open->op_share_deny)) | 1755 | if (!access_valid(open->op_share_access) |
1756 | || !deny_valid(open->op_share_deny)) | ||
1750 | goto out; | 1757 | goto out; |
1751 | /* | 1758 | /* |
1752 | * Lookup file; if found, lookup stateid and check open request, | 1759 | * Lookup file; if found, lookup stateid and check open request, |
@@ -1783,10 +1790,10 @@ nfsd4_process_open2(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nf | |||
1783 | } else { | 1790 | } else { |
1784 | /* Stateid was not found, this is a new OPEN */ | 1791 | /* Stateid was not found, this is a new OPEN */ |
1785 | int flags = 0; | 1792 | int flags = 0; |
1793 | if (open->op_share_access & NFS4_SHARE_ACCESS_READ) | ||
1794 | flags |= MAY_READ; | ||
1786 | if (open->op_share_access & NFS4_SHARE_ACCESS_WRITE) | 1795 | if (open->op_share_access & NFS4_SHARE_ACCESS_WRITE) |
1787 | flags = MAY_WRITE; | 1796 | flags |= MAY_WRITE; |
1788 | else | ||
1789 | flags = MAY_READ; | ||
1790 | status = nfs4_new_open(rqstp, &stp, dp, current_fh, flags); | 1797 | status = nfs4_new_open(rqstp, &stp, dp, current_fh, flags); |
1791 | if (status) | 1798 | if (status) |
1792 | goto out; | 1799 | goto out; |
@@ -2071,16 +2078,12 @@ nfs4_preprocess_stateid_op(struct svc_fh *current_fh, stateid_t *stateid, int fl | |||
2071 | if (!stateid->si_fileid) { /* delegation stateid */ | 2078 | if (!stateid->si_fileid) { /* delegation stateid */ |
2072 | if(!(dp = find_delegation_stateid(ino, stateid))) { | 2079 | if(!(dp = find_delegation_stateid(ino, stateid))) { |
2073 | dprintk("NFSD: delegation stateid not found\n"); | 2080 | dprintk("NFSD: delegation stateid not found\n"); |
2074 | if (nfs4_in_grace()) | ||
2075 | status = nfserr_grace; | ||
2076 | goto out; | 2081 | goto out; |
2077 | } | 2082 | } |
2078 | stidp = &dp->dl_stateid; | 2083 | stidp = &dp->dl_stateid; |
2079 | } else { /* open or lock stateid */ | 2084 | } else { /* open or lock stateid */ |
2080 | if (!(stp = find_stateid(stateid, flags))) { | 2085 | if (!(stp = find_stateid(stateid, flags))) { |
2081 | dprintk("NFSD: open or lock stateid not found\n"); | 2086 | dprintk("NFSD: open or lock stateid not found\n"); |
2082 | if (nfs4_in_grace()) | ||
2083 | status = nfserr_grace; | ||
2084 | goto out; | 2087 | goto out; |
2085 | } | 2088 | } |
2086 | if ((flags & CHECK_FH) && nfs4_check_fh(current_fh, stp)) | 2089 | if ((flags & CHECK_FH) && nfs4_check_fh(current_fh, stp)) |
@@ -2253,8 +2256,9 @@ nfsd4_open_confirm(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct nfs | |||
2253 | (int)current_fh->fh_dentry->d_name.len, | 2256 | (int)current_fh->fh_dentry->d_name.len, |
2254 | current_fh->fh_dentry->d_name.name); | 2257 | current_fh->fh_dentry->d_name.name); |
2255 | 2258 | ||
2256 | if ((status = fh_verify(rqstp, current_fh, S_IFREG, 0))) | 2259 | status = fh_verify(rqstp, current_fh, S_IFREG, 0); |
2257 | goto out; | 2260 | if (status) |
2261 | return status; | ||
2258 | 2262 | ||
2259 | nfs4_lock_state(); | 2263 | nfs4_lock_state(); |
2260 | 2264 | ||
@@ -2321,7 +2325,8 @@ nfsd4_open_downgrade(struct svc_rqst *rqstp, struct svc_fh *current_fh, struct n | |||
2321 | (int)current_fh->fh_dentry->d_name.len, | 2325 | (int)current_fh->fh_dentry->d_name.len, |
2322 | current_fh->fh_dentry->d_name.name); | 2326 | current_fh->fh_dentry->d_name.name); |
2323 | 2327 | ||
2324 | if (!TEST_ACCESS(od->od_share_access) || !TEST_DENY(od->od_share_deny)) | 2328 | if (!access_valid(od->od_share_access) |
2329 | || !deny_valid(od->od_share_deny)) | ||
2325 | return nfserr_inval; | 2330 | return nfserr_inval; |
2326 | 2331 | ||
2327 | nfs4_lock_state(); | 2332 | nfs4_lock_state(); |