Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=3ee17abd14c728d4e0ca7a991c58f2250cb091af
Commit:     3ee17abd14c728d4e0ca7a991c58f2250cb091af
Parent:     9d6a8c5c213e34c475e72b245a8eb709258e968c
Author:     J. Bruce Fields <[EMAIL PROTECTED]>
AuthorDate: Wed Feb 21 00:58:50 2007 -0500
Committer:  J. Bruce Fields <[EMAIL PROTECTED]>
CommitDate: Sun May 6 18:06:44 2007 -0400

    locks: factor out generic/filesystem switch from test_lock
    
    Factor out the code that switches between generic and filesystem-specific 
lock
    methods; eventually we want to call this from lock managers (lockd and nfsd)
    too; currently they only call the generic methods.
    
    This patch does that for test_lock.
    
    Note that this hasn't been necessary until recently, because the few
    filesystems that define ->lock() (nfs, cifs...) aren't exportable via NFS.
    However GFS (and, in the future, other cluster filesystems) need to 
implement
    their own locking to get cluster-coherent locking, and also want to be able 
to
    export locking to NFS (lockd and NFSv4).
    
    So we accomplish this by factoring out code such as this and exporting it 
for
    the use of lockd and nfsd.
    
    Signed-off-by: "J. Bruce Fields" <[EMAIL PROTECTED]>
---
 fs/locks.c         |   38 +++++++++++++++++++++++++-------------
 include/linux/fs.h |    1 +
 2 files changed, 26 insertions(+), 13 deletions(-)

diff --git a/fs/locks.c b/fs/locks.c
index 749a0dc..a31648e 100644
--- a/fs/locks.c
+++ b/fs/locks.c
@@ -1611,6 +1611,24 @@ asmlinkage long sys_flock(unsigned int fd, unsigned int 
cmd)
        return error;
 }
 
+/**
+ * vfs_test_lock - test file byte range lock
+ * @filp: The file to test lock for
+ * @fl: The lock to test
+ * @conf: Place to return a copy of the conflicting lock, if found
+ *
+ * Returns -ERRNO on failure.  Indicates presence of conflicting lock by
+ * setting conf->fl_type to something other than F_UNLCK.
+ */
+int vfs_test_lock(struct file *filp, struct file_lock *fl)
+{
+       if (filp->f_op && filp->f_op->lock)
+               return filp->f_op->lock(filp, F_GETLK, fl);
+       posix_test_lock(filp, fl);
+       return 0;
+}
+EXPORT_SYMBOL_GPL(vfs_test_lock);
+
 static int posix_lock_to_flock(struct flock *flock, struct file_lock *fl)
 {
        flock->l_pid = fl->fl_pid;
@@ -1663,12 +1681,9 @@ int fcntl_getlk(struct file *filp, struct flock __user 
*l)
        if (error)
                goto out;
 
-       if (filp->f_op && filp->f_op->lock) {
-               error = filp->f_op->lock(filp, F_GETLK, &file_lock);
-               if (error < 0)
-                       goto out;
-       } else
-               posix_test_lock(filp, &file_lock);
+       error = vfs_test_lock(filp, &file_lock);
+       if (error)
+               goto out;
  
        flock.l_type = file_lock.fl_type;
        if (file_lock.fl_type != F_UNLCK) {
@@ -1797,13 +1812,10 @@ int fcntl_getlk64(struct file *filp, struct flock64 
__user *l)
        if (error)
                goto out;
 
-       if (filp->f_op && filp->f_op->lock) {
-               error = filp->f_op->lock(filp, F_GETLK, &file_lock);
-               if (error < 0)
-                       goto out;
-       } else
-               posix_test_lock(filp, &file_lock);
- 
+       error = vfs_test_lock(filp, &file_lock);
+       if (error)
+               goto out;
+
        flock.l_type = file_lock.fl_type;
        if (file_lock.fl_type != F_UNLCK)
                posix_lock_to_flock64(&flock, &file_lock);
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 9e1ddff..2a2a439 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -856,6 +856,7 @@ extern int posix_lock_file_conf(struct file *, struct 
file_lock *, struct file_l
 extern int posix_lock_file(struct file *, struct file_lock *);
 extern int posix_lock_file_wait(struct file *, struct file_lock *);
 extern int posix_unblock_lock(struct file *, struct file_lock *);
+extern int vfs_test_lock(struct file *, struct file_lock *);
 extern int flock_lock_file_wait(struct file *filp, struct file_lock *fl);
 extern int __break_lease(struct inode *inode, unsigned int flags);
 extern void lease_get_mtime(struct inode *, struct timespec *time);
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to