• Miklos Szeredi's avatar
    [PATCH] locks: don't unnecessarily fail posix lock operations · 0d9a490a
    Miklos Szeredi authored
    posix_lock_file() was too cautious, failing operations on OOM, even if they
    didn't actually require an allocation.
    
    This has the disadvantage, that a failing unlock on process exit could lead to
    a memory leak.  There are two possibilites for this:
    
    - filesystem implements .lock() and calls back to posix_lock_file().  On
    cleanup of files_struct locks_remove_posix() is called which should remove all
    locks belonging to files_struct.  However if filesystem calls
    posix_lock_file() which fails, then those locks will never be freed.
    
    - if a file is closed while a lock is blocked, then after acquiring
    fcntl_setlk() will undo the lock.  But this unlock itself might fail on OOM,
    again possibly leaking the lock.
    
    The solution is to move the checking of the allocations until after it is sure
    that they will be needed.  This will solve the above problem since unlock will
    always succeed unless it splits an existing region.
    Signed-off-by: default avatarMiklos Szeredi <miklos@szeredi.hu>
    Cc: Trond Myklebust <trond.myklebust@fys.uio.no>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    0d9a490a
locks.c 54.6 KB