Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=0e2f6db88a6900bc9db576d6b478b12ee60d61f7
Commit:     0e2f6db88a6900bc9db576d6b478b12ee60d61f7
Parent:     4740622c5c805d88c63a50747a2d05537dd233cf
Author:     Pavel Emelyanov <[EMAIL PROTECTED]>
AuthorDate: Tue Sep 11 15:24:01 2007 -0700
Committer:  Linus Torvalds <[EMAIL PROTECTED]>
CommitDate: Tue Sep 11 17:21:27 2007 -0700

    Leases can be hidden by flocks
    
    The inode->i_flock list contains the leases, flocks and posix
    locks in the specified order. However, the flocks are added in
    the head of this list thus hiding the leases from F_GETLEASE
    command, from time_out_leases() and other code that expects
    the leases to come first.
    
    The following example will demonstrate this:
    
    #define _GNU_SOURCE
    
    #include <unistd.h>
    #include <fcntl.h>
    #include <stdio.h>
    #include <sys/file.h>
    
    static void show_lease(int fd)
    {
            int res;
    
            res = fcntl(fd, F_GETLEASE);
            switch (res) {
                    case F_RDLCK:
                            printf("Read lease\n");
                            break;
                    case F_WRLCK:
                            printf("Write lease\n");
                            break;
                    case F_UNLCK:
                            printf("No leases\n");
                            break;
                    default:
                            printf("Some shit\n");
                            break;
            }
    }
    
    int main(int argc, char **argv)
    {
            int fd, res;
    
            fd = open(argv[1], O_RDONLY);
            if (fd == -1) {
                    perror("Can't open file");
                    return 1;
            }
    
            res = fcntl(fd, F_SETLEASE, F_WRLCK);
            if (res == -1) {
                    perror("Can't set lease");
                    return 1;
            }
    
            show_lease(fd);
    
            if (flock(fd, LOCK_SH) == -1) {
                    perror("Can't flock shared");
                    return 1;
            }
    
            show_lease(fd);
    
            return 0;
    }
    
    The first call to show_lease() will show the write lease set, but
    the second will show no leases.
    
    Fix the flock adding so that the leases always stay in the head
    of this list.
    
    Found during making the flocks pid-namespaces aware.
    
    Signed-off-by: Pavel Emelyanov <[EMAIL PROTECTED]>
    Acked-by: "J. Bruce Fields" <[EMAIL PROTECTED]>
    Cc: Trond Myklebust <[EMAIL PROTECTED]>
    Cc: Andrew Morton <[EMAIL PROTECTED]>
    Cc: <[EMAIL PROTECTED]>
    Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
    Signed-off-by: Linus Torvalds <[EMAIL PROTECTED]>
---
 fs/locks.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/fs/locks.c b/fs/locks.c
index 50857d2..c795eaa 100644
--- a/fs/locks.c
+++ b/fs/locks.c
@@ -782,7 +782,7 @@ find_conflict:
        if (request->fl_flags & FL_ACCESS)
                goto out;
        locks_copy_lock(new_fl, request);
-       locks_insert_lock(&inode->i_flock, new_fl);
+       locks_insert_lock(before, new_fl);
        new_fl = NULL;
        error = 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  http://vger.kernel.org/majordomo-info.html

Reply via email to