lkml.org 
[lkml]   [2018]   [Nov]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 11/12] locks: merge posix_unblock_lock() and locks_delete_block()
    posix_unblock_lock() is not specific to posix locks, and behaves
    nearly identically to locks_delete_block() - the former returning a
    status while the later doesn't.

    So discard posix_unblock_lock() and use locks_delete_block() instead,
    after giving that function an appropriate return value.

    Signed-off-by: NeilBrown <neilb@suse.com>
    ---
    fs/cifs/file.c | 2 +-
    fs/lockd/svclock.c | 2 +-
    fs/locks.c | 36 +++++++++++++-----------------------
    fs/nfsd/nfs4state.c | 6 +++---
    include/linux/fs.h | 4 ++--
    5 files changed, 20 insertions(+), 30 deletions(-)

    diff --git a/fs/cifs/file.c b/fs/cifs/file.c
    index d7ed895e05d1..94c3575e850c 100644
    --- a/fs/cifs/file.c
    +++ b/fs/cifs/file.c
    @@ -1106,7 +1106,7 @@ cifs_posix_lock_set(struct file *file, struct file_lock *flock)
    rc = wait_event_interruptible(flock->fl_wait, !flock->fl_blocker);
    if (!rc)
    goto try_again;
    - posix_unblock_lock(flock);
    + locks_delete_block(flock);
    }
    return rc;
    }
    diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c
    index 74330daeab71..ea719cdd6a36 100644
    --- a/fs/lockd/svclock.c
    +++ b/fs/lockd/svclock.c
    @@ -276,7 +276,7 @@ static int nlmsvc_unlink_block(struct nlm_block *block)
    dprintk("lockd: unlinking block %p...\n", block);

    /* Remove block from list */
    - status = posix_unblock_lock(&block->b_call->a_args.lock.fl);
    + status = locks_delete_block(&block->b_call->a_args.lock.fl);
    nlmsvc_remove_block(block);
    return status;
    }
    diff --git a/fs/locks.c b/fs/locks.c
    index 1b0eac6b2918..d00a36523c3f 100644
    --- a/fs/locks.c
    +++ b/fs/locks.c
    @@ -698,13 +698,25 @@ static void __locks_wake_up_blocks(struct file_lock *blocker)
    }
    }

    -static void locks_delete_block(struct file_lock *waiter)
    +/**
    + * locks_delete_lock - stop waiting for a file lock
    + * @waiter: the lock which was waiting
    + *
    + * lockd/nfsd need to disconnect the lock while working on it.
    + */
    +int locks_delete_block(struct file_lock *waiter)
    {
    + int status = -ENOENT;
    +
    spin_lock(&blocked_lock_lock);
    + if (waiter->fl_blocker)
    + status = 0;
    __locks_wake_up_blocks(waiter);
    __locks_delete_block(waiter);
    spin_unlock(&blocked_lock_lock);
    + return status;
    }
    +EXPORT_SYMBOL(locks_delete_block);

    /* Insert waiter into blocker's block list.
    * We use a circular list so that processes can be easily woken up in
    @@ -2610,28 +2622,6 @@ void locks_remove_file(struct file *filp)
    spin_unlock(&ctx->flc_lock);
    }

    -/**
    - * posix_unblock_lock - stop waiting for a file lock
    - * @waiter: the lock which was waiting
    - *
    - * lockd needs to block waiting for locks.
    - */
    -int
    -posix_unblock_lock(struct file_lock *waiter)
    -{
    - int status = -ENOENT;
    -
    - spin_lock(&blocked_lock_lock);
    - if (waiter->fl_blocker) {
    - __locks_wake_up_blocks(waiter);
    - __locks_delete_block(waiter);
    - status = 0;
    - }
    - spin_unlock(&blocked_lock_lock);
    - return status;
    -}
    -EXPORT_SYMBOL(posix_unblock_lock);
    -
    /**
    * vfs_cancel_lock - file byte range unblock lock
    * @filp: The file to apply the unblock to
    diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
    index f093fbe47133..a334828723fa 100644
    --- a/fs/nfsd/nfs4state.c
    +++ b/fs/nfsd/nfs4state.c
    @@ -238,7 +238,7 @@ find_blocked_lock(struct nfs4_lockowner *lo, struct knfsd_fh *fh,
    }
    spin_unlock(&nn->blocked_locks_lock);
    if (found)
    - posix_unblock_lock(&found->nbl_lock);
    + locks_delete_block(&found->nbl_lock);
    return found;
    }

    @@ -293,7 +293,7 @@ remove_blocked_locks(struct nfs4_lockowner *lo)
    nbl = list_first_entry(&reaplist, struct nfsd4_blocked_lock,
    nbl_lru);
    list_del_init(&nbl->nbl_lru);
    - posix_unblock_lock(&nbl->nbl_lock);
    + locks_delete_block(&nbl->nbl_lock);
    free_blocked_lock(nbl);
    }
    }
    @@ -4863,7 +4863,7 @@ nfs4_laundromat(struct nfsd_net *nn)
    nbl = list_first_entry(&reaplist,
    struct nfsd4_blocked_lock, nbl_lru);
    list_del_init(&nbl->nbl_lru);
    - posix_unblock_lock(&nbl->nbl_lock);
    + locks_delete_block(&nbl->nbl_lock);
    free_blocked_lock(nbl);
    }
    out:
    diff --git a/include/linux/fs.h b/include/linux/fs.h
    index a161bcdca8a2..a47bf97cb964 100644
    --- a/include/linux/fs.h
    +++ b/include/linux/fs.h
    @@ -1122,7 +1122,7 @@ extern void locks_remove_file(struct file *);
    extern void locks_release_private(struct file_lock *);
    extern void posix_test_lock(struct file *, struct file_lock *);
    extern int posix_lock_file(struct file *, struct file_lock *, struct file_lock *);
    -extern int posix_unblock_lock(struct file_lock *);
    +extern int locks_delete_block(struct file_lock *);
    extern int vfs_test_lock(struct file *, struct file_lock *);
    extern int vfs_lock_file(struct file *, unsigned int, struct file_lock *, struct file_lock *);
    extern int vfs_cancel_lock(struct file *filp, struct file_lock *fl);
    @@ -1212,7 +1212,7 @@ static inline int posix_lock_file(struct file *filp, struct file_lock *fl,
    return -ENOLCK;
    }

    -static inline int posix_unblock_lock(struct file_lock *waiter)
    +static inline int locks_delete_block(struct file_lock *waiter)
    {
    return -ENOENT;
    }

    \
     
     \ /
      Last update: 2018-11-05 02:33    [W:2.430 / U:0.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site