Commit 80a1de29 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-3.15' of git://linux-nfs.org/~bfields/linux

Pull two nfsd bugfixes from Bruce Fields:
 "Just two bugfixes, one for a merge-window-introduced ACL regression,
  the other for a longer-standing v4 state bug"

* 'for-3.15' of git://linux-nfs.org/~bfields/linux:
  nfsd4: warn on finding lockowner without stateid's
  nfsd4: remove lockowner when removing lock stateid
  nfsd4: fix corruption on setting an ACL.
parents 03743007 27b11428
...@@ -590,7 +590,7 @@ posix_state_to_acl(struct posix_acl_state *state, unsigned int flags) ...@@ -590,7 +590,7 @@ posix_state_to_acl(struct posix_acl_state *state, unsigned int flags)
add_to_mask(state, &state->groups->aces[i].perms); add_to_mask(state, &state->groups->aces[i].perms);
} }
if (!state->users->n && !state->groups->n) { if (state->users->n || state->groups->n) {
pace++; pace++;
pace->e_tag = ACL_MASK; pace->e_tag = ACL_MASK;
low_mode_from_nfs4(state->mask.allow, &pace->e_perm, flags); low_mode_from_nfs4(state->mask.allow, &pace->e_perm, flags);
......
...@@ -3717,9 +3717,16 @@ nfs4_preprocess_stateid_op(struct net *net, struct nfsd4_compound_state *cstate, ...@@ -3717,9 +3717,16 @@ nfs4_preprocess_stateid_op(struct net *net, struct nfsd4_compound_state *cstate,
static __be32 static __be32
nfsd4_free_lock_stateid(struct nfs4_ol_stateid *stp) nfsd4_free_lock_stateid(struct nfs4_ol_stateid *stp)
{ {
if (check_for_locks(stp->st_file, lockowner(stp->st_stateowner))) struct nfs4_lockowner *lo = lockowner(stp->st_stateowner);
if (check_for_locks(stp->st_file, lo))
return nfserr_locks_held; return nfserr_locks_held;
release_lock_stateid(stp); /*
* Currently there's a 1-1 lock stateid<->lockowner
* correspondance, and we have to delete the lockowner when we
* delete the lock stateid:
*/
unhash_lockowner(lo);
return nfs_ok; return nfs_ok;
} }
...@@ -4159,6 +4166,10 @@ static bool same_lockowner_ino(struct nfs4_lockowner *lo, struct inode *inode, c ...@@ -4159,6 +4166,10 @@ static bool same_lockowner_ino(struct nfs4_lockowner *lo, struct inode *inode, c
if (!same_owner_str(&lo->lo_owner, owner, clid)) if (!same_owner_str(&lo->lo_owner, owner, clid))
return false; return false;
if (list_empty(&lo->lo_owner.so_stateids)) {
WARN_ON_ONCE(1);
return false;
}
lst = list_first_entry(&lo->lo_owner.so_stateids, lst = list_first_entry(&lo->lo_owner.so_stateids,
struct nfs4_ol_stateid, st_perstateowner); struct nfs4_ol_stateid, st_perstateowner);
return lst->st_file->fi_inode == inode; return lst->st_file->fi_inode == inode;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment