Commit:     129a84de2347002f09721cda3155ccfd19fade40
Parent:     a9deecba19b8f384d97f82c75379da48bccb2588
Author:     J. Bruce Fields <[EMAIL PROTECTED]>
AuthorDate: Thu May 10 18:38:43 2007 -0400
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Thu May 10 20:25:59 2007 -0700

    locks: fix F_GETLK regression (failure to find conflicts)
    In 9d6a8c5c213e34c475e72b245a8eb709258e968c we changed posix_test_lock
    to modify its single file_lock argument instead of taking separate input
    and output arguments.  This makes it no longer safe to set the output
    lock's fl_type to F_UNLCK before looking for a conflict, since that
    means searching for a conflict against a lock with type F_UNLCK.
    This fixes a regression which causes F_GETLK to incorrectly report no
    conflict on most filesystems (including any filesystem that doesn't do
    its own locking).
    Also fix posix_lock_to_flock() to copy the lock type.  This isn't
    strictly necessary, since the caller already does this; but it seems
    less likely to cause confusion in the future.
    Thanks to Doug Chapman for the bug report.
    Signed-off-by: "J. Bruce Fields" <[EMAIL PROTECTED]>
    Acked-by: Doug Chapman <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
 fs/locks.c |    5 +++--
 1 files changed, 3 insertions(+), 2 deletions(-)

diff --git a/fs/locks.c b/fs/locks.c
index 671a034..8ec16ab 100644
--- a/fs/locks.c
+++ b/fs/locks.c
@@ -669,7 +669,6 @@ posix_test_lock(struct file *filp, struct file_lock *fl)
        struct file_lock *cfl;
-       fl->fl_type = F_UNLCK;
        for (cfl = filp->f_path.dentry->d_inode->i_flock; cfl; cfl = 
cfl->fl_next) {
                if (!IS_POSIX(cfl))
@@ -681,7 +680,8 @@ posix_test_lock(struct file *filp, struct file_lock *fl)
                __locks_copy_lock(fl, cfl);
                return 1;
-       }
+       } else
+               fl->fl_type = F_UNLCK;
        return 0;
@@ -1632,6 +1632,7 @@ static int posix_lock_to_flock(struct flock *flock, 
struct file_lock *fl)
        flock->l_len = fl->fl_end == OFFSET_MAX ? 0 :
                fl->fl_end - fl->fl_start + 1;
        flock->l_whence = 0;
+       flock->l_type = fl->fl_type;
        return 0;
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

Reply via email to