diff -rux CVS linux-2.2.16-plain/fs/lockd/svcshare.c linux-2.2.16/fs/lockd/svcshare.c --- linux-2.2.16-plain/fs/lockd/svcshare.c Mon Apr 7 20:35:30 1997 +++ linux-2.2.16/fs/lockd/svcshare.c Fri Aug 11 19:04:26 2000 @@ -61,6 +61,20 @@ return nlm_granted; } +static inline void +put_file(struct nlm_file *file, int mincount) +{ + /* + * XXX there may be race conditions here! + */ + if (file->f_count > mincount) + file->f_count--; + else + printk(KERN_WARNING + "lockd: f_count=%d when removing share\n", + (int)file->f_count); +} + /* * Delete a share. */ @@ -75,6 +89,7 @@ if (share->s_host == host && nlm_cmp_owner(share, oh)) { *shpp = share->s_next; kfree(share); + put_file(file, 1); return nlm_granted; } } @@ -101,6 +116,7 @@ if (host == NULL || host == share->s_host) { *shpp = share->s_next; kfree(share); + put_file(file, 0); continue; } }