|
@@ -797,21 +797,33 @@ void nfs4_close_sync(struct nfs4_state *state, fmode_t fmode)
|
|
|
|
|
|
/*
|
|
|
* Search the state->lock_states for an existing lock_owner
|
|
|
- * that is compatible with current->files
|
|
|
+ * that is compatible with either of the given owners.
|
|
|
+ * If the second is non-zero, then the first refers to a Posix-lock
|
|
|
+ * owner (current->files) and the second refers to a flock/OFD
|
|
|
+ * owner (struct file*). In that case, prefer a match for the first
|
|
|
+ * owner.
|
|
|
+ * If both sorts of locks are held on the one file we cannot know
|
|
|
+ * which stateid was intended to be used, so a "correct" choice cannot
|
|
|
+ * be made. Failing that, a "consistent" choice is preferable. The
|
|
|
+ * consistent choice we make is to prefer the first owner, that of a
|
|
|
+ * Posix lock.
|
|
|
*/
|
|
|
static struct nfs4_lock_state *
|
|
|
__nfs4_find_lock_state(struct nfs4_state *state,
|
|
|
fl_owner_t fl_owner, fl_owner_t fl_owner2)
|
|
|
{
|
|
|
- struct nfs4_lock_state *pos;
|
|
|
+ struct nfs4_lock_state *pos, *ret = NULL;
|
|
|
list_for_each_entry(pos, &state->lock_states, ls_locks) {
|
|
|
- if (pos->ls_owner != fl_owner &&
|
|
|
- pos->ls_owner != fl_owner2)
|
|
|
- continue;
|
|
|
- atomic_inc(&pos->ls_count);
|
|
|
- return pos;
|
|
|
+ if (pos->ls_owner == fl_owner) {
|
|
|
+ ret = pos;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (pos->ls_owner == fl_owner2)
|
|
|
+ ret = pos;
|
|
|
}
|
|
|
- return NULL;
|
|
|
+ if (ret)
|
|
|
+ atomic_inc(&ret->ls_count);
|
|
|
+ return ret;
|
|
|
}
|
|
|
|
|
|
/*
|