ChangeSet@1.1136.1.75 2003-12-07 21:20:48-02:00 willy at debian.org [PATCH] Remove broken file lock accounting On Mon, Jul 01, 2002 at 11:13:55PM +0100, Matthew Wilcox wrote: > The file lock accounting code is horribly broken (and I wrote it, I > should know). I think the best solution to 2.4 is simply to delete it, > at least for BSD-style flocks. > > Patch to follow. Note that 2.5 has the same issue, but I'll fix it > differently there. Here's the patch for 2.4: --- linux-2.4.23/fs/locks.c.orig Tue Dec 9 00:11:23 2003 +++ linux-2.4.23/fs/locks.c Tue Dec 9 00:13:00 2003 @@ -135,15 +135,9 @@ static kmem_cache_t *filelock_cache; /* Allocate an empty lock structure. */ -static struct file_lock *locks_alloc_lock(int account) +static struct file_lock *locks_alloc_lock(void) { - struct file_lock *fl; - if (account && current->locks >= current->rlim[RLIMIT_LOCKS].rlim_cur) - return NULL; - fl = kmem_cache_alloc(filelock_cache, SLAB_KERNEL); - if (fl) - current->locks++; - return fl; + return kmem_cache_alloc(filelock_cache, SLAB_KERNEL); } /* Free a lock which is not in use. */ @@ -153,7 +147,6 @@ BUG(); return; } - current->locks--; if (waitqueue_active(&fl->fl_wait)) panic("Attempting to free lock with active wait queue"); @@ -220,7 +213,7 @@ /* Fill in a file_lock structure with an appropriate FLOCK lock. */ static struct file_lock *flock_make_lock(struct file *filp, unsigned int type) { - struct file_lock *fl = locks_alloc_lock(1); + struct file_lock *fl = locks_alloc_lock(); if (fl == NULL) return NULL; @@ -358,7 +351,7 @@ /* Allocate a file_lock initialised to this type of lease */ static int lease_alloc(struct file *filp, int type, struct file_lock **flp) { - struct file_lock *fl = locks_alloc_lock(1); + struct file_lock *fl = locks_alloc_lock(); if (fl == NULL) return -ENOMEM; @@ -721,7 +714,7 @@ size_t count) { struct file_lock *fl; - struct file_lock *new_fl = locks_alloc_lock(0); + struct file_lock *new_fl = locks_alloc_lock(); int error; if (new_fl == NULL) @@ -881,8 +874,8 @@ * We may need two file_lock structures for this operation, * so we get them in advance to avoid races. */ - new_fl = locks_alloc_lock(0); - new_fl2 = locks_alloc_lock(0); + new_fl = locks_alloc_lock(); + new_fl2 = locks_alloc_lock(); error = -ENOLCK; /* "no luck" */ if (!(new_fl && new_fl2)) goto out_nolock; @@ -1488,7 +1481,7 @@ int fcntl_setlk(unsigned int fd, unsigned int cmd, struct flock *l) { struct file *filp; - struct file_lock *file_lock = locks_alloc_lock(0); + struct file_lock *file_lock = locks_alloc_lock(); struct flock flock; struct inode *inode; int error; @@ -1644,7 +1637,7 @@ int fcntl_setlk64(unsigned int fd, unsigned int cmd, struct flock64 *l) { struct file *filp; - struct file_lock *file_lock = locks_alloc_lock(0); + struct file_lock *file_lock = locks_alloc_lock(); struct flock64 flock; struct inode *inode; int error;