diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/nfsd/nfs4acl.c | 2 | ||||
| -rw-r--r-- | fs/nfsd/nfs4state.c | 15 |
2 files changed, 14 insertions, 3 deletions
diff --git a/fs/nfsd/nfs4acl.c b/fs/nfsd/nfs4acl.c index b6f46013dddf..f66c66b9f182 100644 --- a/fs/nfsd/nfs4acl.c +++ b/fs/nfsd/nfs4acl.c | |||
| @@ -590,7 +590,7 @@ posix_state_to_acl(struct posix_acl_state *state, unsigned int flags) | |||
| 590 | add_to_mask(state, &state->groups->aces[i].perms); | 590 | add_to_mask(state, &state->groups->aces[i].perms); |
| 591 | } | 591 | } |
| 592 | 592 | ||
| 593 | if (!state->users->n && !state->groups->n) { | 593 | if (state->users->n || state->groups->n) { |
| 594 | pace++; | 594 | pace++; |
| 595 | pace->e_tag = ACL_MASK; | 595 | pace->e_tag = ACL_MASK; |
| 596 | low_mode_from_nfs4(state->mask.allow, &pace->e_perm, flags); | 596 | low_mode_from_nfs4(state->mask.allow, &pace->e_perm, flags); |
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 32b699bebb9c..9a77a5a21557 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c | |||
| @@ -3717,9 +3717,16 @@ out: | |||
| 3717 | static __be32 | 3717 | static __be32 |
| 3718 | nfsd4_free_lock_stateid(struct nfs4_ol_stateid *stp) | 3718 | nfsd4_free_lock_stateid(struct nfs4_ol_stateid *stp) |
| 3719 | { | 3719 | { |
| 3720 | if (check_for_locks(stp->st_file, lockowner(stp->st_stateowner))) | 3720 | struct nfs4_lockowner *lo = lockowner(stp->st_stateowner); |
| 3721 | |||
| 3722 | if (check_for_locks(stp->st_file, lo)) | ||
| 3721 | return nfserr_locks_held; | 3723 | return nfserr_locks_held; |
| 3722 | release_lock_stateid(stp); | 3724 | /* |
| 3725 | * Currently there's a 1-1 lock stateid<->lockowner | ||
| 3726 | * correspondance, and we have to delete the lockowner when we | ||
| 3727 | * delete the lock stateid: | ||
| 3728 | */ | ||
| 3729 | unhash_lockowner(lo); | ||
| 3723 | return nfs_ok; | 3730 | return nfs_ok; |
| 3724 | } | 3731 | } |
| 3725 | 3732 | ||
| @@ -4159,6 +4166,10 @@ static bool same_lockowner_ino(struct nfs4_lockowner *lo, struct inode *inode, c | |||
| 4159 | 4166 | ||
| 4160 | if (!same_owner_str(&lo->lo_owner, owner, clid)) | 4167 | if (!same_owner_str(&lo->lo_owner, owner, clid)) |
| 4161 | return false; | 4168 | return false; |
| 4169 | if (list_empty(&lo->lo_owner.so_stateids)) { | ||
| 4170 | WARN_ON_ONCE(1); | ||
| 4171 | return false; | ||
| 4172 | } | ||
| 4162 | lst = list_first_entry(&lo->lo_owner.so_stateids, | 4173 | lst = list_first_entry(&lo->lo_owner.so_stateids, |
| 4163 | struct nfs4_ol_stateid, st_perstateowner); | 4174 | struct nfs4_ol_stateid, st_perstateowner); |
| 4164 | return lst->st_file->fi_inode == inode; | 4175 | return lst->st_file->fi_inode == inode; |
