@@ -800,14 +800,16 @@ void nfs4_close_sync(struct nfs4_state *state, fmode_t fmode)
* that is compatible with current->files
*/
static struct nfs4_lock_state *
-__nfs4_find_lock_state(struct nfs4_state *state, fl_owner_t fl_owner)
+__nfs4_find_lock_state(struct nfs4_state *state,
+ const struct nfs_lockowner *lockowner)
{
struct nfs4_lock_state *pos;
list_for_each_entry(pos, &state->lock_states, ls_locks) {
- if (pos->ls_owner != fl_owner)
- continue;
- atomic_inc(&pos->ls_count);
- return pos;
+ if (pos->ls_owner == lockowner->l_owner_posix ||
+ pos->ls_owner == lockowner->l_owner_ofd) {
+ atomic_inc(&pos->ls_count);
+ return pos;
+ }
}
return NULL;
}
@@ -854,10 +856,13 @@ void nfs4_free_lock_state(struct nfs_server *server, struct nfs4_lock_state *lsp
static struct nfs4_lock_state *nfs4_get_lock_state(struct nfs4_state *state, fl_owner_t owner)
{
struct nfs4_lock_state *lsp, *new = NULL;
+ const struct nfs_lockowner lockowner = {
+ .l_owner_posix = owner,
+ };
for(;;) {
spin_lock(&state->state_lock);
- lsp = __nfs4_find_lock_state(state, owner);
+ lsp = __nfs4_find_lock_state(state, &lockowner);
if (lsp != NULL)
break;
if (new != NULL) {
@@ -942,7 +947,6 @@ static int nfs4_copy_lock_stateid(nfs4_stateid *dst,
const struct nfs_lockowner *lockowner)
{
struct nfs4_lock_state *lsp;
- fl_owner_t fl_owner;
int ret = -ENOENT;
@@ -952,9 +956,8 @@ static int nfs4_copy_lock_stateid(nfs4_stateid *dst,
if (test_bit(LK_STATE_IN_USE, &state->flags) == 0)
goto out;
- fl_owner = lockowner->l_owner_posix;
spin_lock(&state->state_lock);
- lsp = __nfs4_find_lock_state(state, fl_owner);
+ lsp = __nfs4_find_lock_state(state, lockowner);
if (lsp && test_bit(NFS_LOCK_LOST, &lsp->ls_flags))
ret = -EIO;
else if (lsp != NULL && test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags) != 0) {
@@ -859,6 +859,7 @@ static bool nfs_match_lock_context(const struct nfs_lock_context *l1,
const struct nfs_lock_context *l2)
{
return l1->lockowner.l_owner_posix == l2->lockowner.l_owner_posix
+ && l1->lockowner.l_owner_ofd == l2->lockowner.l_owner_ofd
&& l1->lockowner.l_pid == l2->lockowner.l_pid;
}
@@ -1162,6 +1162,7 @@ int nfs_flush_incompatible(struct file *file, struct page *page)
!(list_empty_careful(&flctx->flc_posix) &&
list_empty_careful(&flctx->flc_flock))) {
do_flush |= l_ctx->lockowner.l_owner_posix != current->files
+ || l_ctx->lockowner.l_owner_ofd != file
|| l_ctx->lockowner.l_pid != current->tgid;
}
nfs_release_request(req);
Now that our lock context contains owners for OFD locks we can use those owners to reference an appropriate nfs4_lock_state. Signed-off-by: Benjamin Coddington <bcodding@redhat.com> --- fs/nfs/nfs4state.c | 21 ++++++++++++--------- fs/nfs/pagelist.c | 1 + fs/nfs/write.c | 1 + 3 files changed, 14 insertions(+), 9 deletions(-)