07 Jan, 2006

2 commits

  • If the server receives an NLM cancel call and finds no waiting lock to
    cancel, then chances are the lock has already been applied, and the client
    just hadn't yet processed the NLM granted callback before it sent the
    cancel.

    The Open Group text, for example, perimts a server to return either success
    (LCK_GRANTED) or failure (LCK_DENIED) in this case. But returning an error
    seems more helpful; the client may be able to use it to recognize that a
    race has occurred and to recover from the race.

    So, modify the relevant functions to return an error in this case.

    Signed-off-by: J. Bruce Fields
    Signed-off-by: Trond Myklebust

    J. Bruce Fields
     
  • Currently when lockd gets an NLM_CANCEL request, it also does an unlock for
    the same range. This is incorrect.

    The Open Group documentation says that "This procedure cancels an
    *outstanding* blocked lock request." (Emphasis mine.)

    Also, consider a client that holds a lock on the first byte of a file, and
    requests a lock on the entire file. If the client cancels that request
    (perhaps because the requesting process is signalled), the server shouldn't
    apply perform an unlock on the entire file, since that will also remove the
    previous lock that the client was already granted.

    Or consider a lock request that actually *downgraded* an exclusive lock to
    a shared lock.

    Signed-off-by: J. Bruce Fields
    Signed-off-by: Trond Myklebust

    J. Bruce Fields
     

14 Nov, 2005

2 commits

  • Remove time_out_leases() printk that's easily triggered by users.

    Signed-off-by: Chris Wright
    Signed-off-by: Trond Myklebust

    Chris Wright
     
  • The patch
    http://linux.bkbits.net:8080/linux-2.6/diffs/fs/locks.c@1.70??nav=index.html
    introduced a pretty nasty memory leak in the lease code. When freeing
    the lease, the code in locks_delete_lock() will correctly clean up
    the fasync queue, but when we return to fcntl_setlease(), the freed
    fasync entry will be reinstated.

    This patch ensures that we skip the call to fasync_helper() when we're
    freeing up the lease.

    Signed-off-by: J. Bruce Fields
    Signed-off-by: Trond Myklebust

    J. Bruce Fields
     

19 Oct, 2005

1 commit


24 Sep, 2005

1 commit

  • [PATCH] Fix miscompare in __posix_lock_file

    If an application requests the same lock twice, the
    kernel should just leave the existing lock in place.
    Currently, it will install a second lock of the same type.

    Signed-off-by: Olaf Kirch
    Signed-off-by: Trond Myklebust

    Olaf Kirch
     

18 Sep, 2005

1 commit

  • With the new fdtable locking rules, you have to protect fdtable with either
    ->file_lock or rcu_read_lock/unlock(). There are some places where we
    aren't doing either. This patch fixes those places.

    Signed-off-by: Dipankar Sarma
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Dipankar Sarma
     

10 Sep, 2005

1 commit

  • In order for the RCU to work, the file table array, sets and their sizes must
    be updated atomically. Instead of ensuring this through too many memory
    barriers, we put the arrays and their sizes in a separate structure. This
    patch takes the first step of putting the file table elements in a separate
    structure fdtable that is embedded withing files_struct. It also changes all
    the users to refer to the file table using files_fdtable() macro. Subsequent
    applciation of RCU becomes easier after this.

    Signed-off-by: Dipankar Sarma
    Signed-Off-By: David Howells
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Dipankar Sarma
     

28 Jul, 2005

1 commit

  • I believe that there is a problem with the handling of POSIX locks, which
    the attached patch should address.

    The problem appears to be a race between fcntl(2) and close(2). A
    multithreaded application could close a file descriptor at the same time as
    it is trying to acquire a lock using the same file descriptor. I would
    suggest that that multithreaded application is not providing the proper
    synchronization for itself, but the OS should still behave correctly.

    SUS3 (Single UNIX Specification Version 3, read: POSIX) indicates that when
    a file descriptor is closed, that all POSIX locks on the file, owned by the
    process which closed the file descriptor, should be released.

    The trick here is when those locks are released. The current code releases
    all locks which exist when close is processing, but any locks in progress
    are handled when the last reference to the open file is released.

    There are three cases to consider.

    One is the simple case, a multithreaded (mt) process has a file open and
    races to close it and acquire a lock on it. In this case, the close will
    release one reference to the open file and when the fcntl is done, it will
    release the other reference. For this situation, no locks should exist on
    the file when both the close and fcntl operations are done. The current
    system will handle this case because the last reference to the open file is
    being released.

    The second case is when the mt process has dup(2)'d the file descriptor.
    The close will release one reference to the file and the fcntl, when done,
    will release another, but there will still be at least one more reference
    to the open file. One could argue that the existence of a lock on the file
    after the close has completed is okay, because it was acquired after the
    close operation and there is still a way for the application to release the
    lock on the file, using an existing file descriptor.

    The third case is when the mt process has forked, after opening the file
    and either before or after becoming an mt process. In this case, each
    process would hold a reference to the open file. For each process, this
    degenerates to first case above. However, the lock continues to exist
    until both processes have released their references to the open file. This
    lock could block other lock requests.

    The changes to release the lock when the last reference to the open file
    aren't quite right because they would allow the lock to exist as long as
    there was a reference to the open file. This is too long.

    The new proposed solution is to add support in the fcntl code path to
    detect a race with close and then to release the lock which was just
    acquired when such as race is detected. This causes locks to be released
    in a timely fashion and for the system to conform to the POSIX semantic
    specification.

    This was tested by instrumenting a kernel to detect the handling locks and
    then running a program which generates case #3 above. A dangling lock
    could be reliably generated. When the changes to detect the close/fcntl
    race were added, a dangling lock could no longer be generated.

    Cc: Matthew Wilcox
    Cc: Trond Myklebust
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Peter Staubach
     

08 Jul, 2005

1 commit

  • We're dereferencing `flp' and then we're testing it for NULLness.

    Either the compiler accidentally saved us or the existing null-pointer checdk
    is redundant.

    This defect was found automatically by Coverity Prevent, a static analysis tool.

    Signed-off-by: Zaur Kambarov
    Cc: Matthew Wilcox
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    KAMBAROV, ZAUR
     

23 Jun, 2005

1 commit


06 May, 2005

1 commit


17 Apr, 2005

1 commit

  • Initial git repository build. I'm not bothering with the full history,
    even though we have it. We can create a separate "historical" git
    archive of that later if we want to, and in the meantime it's about
    3.2GB when imported into git - space that would just make the early
    git days unnecessarily complicated, when we don't have a lot of good
    infrastructure for it.

    Let it rip!

    Linus Torvalds