[lkml]   [2007]   [Sep]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
Messages in this thread
    Patch in this message
    Subject[26/50] Leases can be hidden by flocks

    From: Pavel Emelyanov <>

    commit 0e2f6db88a6900bc9db576d6b478b12ee60d61f7 in mainline.

    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");
    case F_WRLCK:
    printf("Write lease\n");
    case F_UNLCK:
    printf("No leases\n");
    printf("Some shit\n");

    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;


    if (flock(fd, LOCK_SH) == -1) {
    perror("Can't flock shared");
    return 1;


    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 <>
    Acked-by: "J. Bruce Fields" <>
    Cc: Trond Myklebust <>
    Cc: Andrew Morton <>
    Signed-off-by: Andrew Morton <>
    Signed-off-by: Linus Torvalds <>
    Signed-off-by: Greg Kroah-Hartman <>

    fs/locks.c | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    --- a/fs/locks.c
    +++ b/fs/locks.c
    @@ -786,7 +786,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 linux-kernel" in
    the body of a message to
    More majordomo info at
    Please read the FAQ at

     \ /
      Last update: 2007-09-24 18:37    [W:0.024 / U:57.336 seconds]
    ©2003-2017 Jasper Spaans. hosted at Digital OceanAdvertise on this site