Module Name: src Committed By: snj Date: Wed Jul 1 22:49:43 UTC 2009
Modified Files: src/sys/kern [netbsd-5]: vfs_lockf.c Log Message: Pull up following revision(s) (requested by rmind in ticket #842): sys/kern/vfs_lockf.c: revision 1.71 don't make F_GETLK or the common case of F_UNLCK fail for per-user limit. To generate a diff of this commit: cvs rdiff -u -r1.69.4.1 -r1.69.4.2 src/sys/kern/vfs_lockf.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/vfs_lockf.c diff -u src/sys/kern/vfs_lockf.c:1.69.4.1 src/sys/kern/vfs_lockf.c:1.69.4.2 --- src/sys/kern/vfs_lockf.c:1.69.4.1 Wed Jul 1 22:45:03 2009 +++ src/sys/kern/vfs_lockf.c Wed Jul 1 22:49:43 2009 @@ -1,4 +1,4 @@ -/* $NetBSD: vfs_lockf.c,v 1.69.4.1 2009/07/01 22:45:03 snj Exp $ */ +/* $NetBSD: vfs_lockf.c,v 1.69.4.2 2009/07/01 22:49:43 snj Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1993 @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: vfs_lockf.c,v 1.69.4.1 2009/07/01 22:45:03 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: vfs_lockf.c,v 1.69.4.2 2009/07/01 22:49:43 snj Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -190,11 +190,12 @@ * 0 - always allocate. 1 - cutoff at limit. 2 - cutoff at double limit. */ static struct lockf * -lf_alloc(uid_t uid, int allowfail) +lf_alloc(int allowfail) { struct uidinfo *uip; struct lockf *lock; u_long lcnt; + const uid_t uid = kauth_cred_geteuid(kauth_cred_get()); uip = uid_find(uid); lcnt = atomic_inc_ulong_nv(&uip->ui_lockcnt); @@ -807,7 +808,6 @@ int lf_advlock(struct vop_advlock_args *ap, struct lockf **head, off_t size) { - struct lwp *l = curlwp; struct flock *fl = ap->a_fl; struct lockf *lock = NULL; struct lockf *sparelock; @@ -852,7 +852,7 @@ /* * Byte-range lock might need one more lock. */ - sparelock = lf_alloc(kauth_cred_geteuid(l->l_cred), 0); + sparelock = lf_alloc(0); if (sparelock == NULL) { error = ENOMEM; goto quit; @@ -869,8 +869,28 @@ return EINVAL; } - lock = lf_alloc(kauth_cred_geteuid(l->l_cred), - ap->a_op != F_UNLCK ? 1 : 2); + if (fl->l_len == 0) + end = -1; + else + end = start + fl->l_len - 1; + + switch (ap->a_op) { + case F_SETLK: + lock = lf_alloc(1); + break; + case F_UNLCK: + if (start == 0 || end == -1) { + /* never split */ + lock = lf_alloc(0); + } else { + /* might split */ + lock = lf_alloc(2); + } + break; + case F_GETLK: + lock = lf_alloc(0); + break; + } if (lock == NULL) { error = ENOMEM; goto quit; @@ -889,10 +909,6 @@ } } - if (fl->l_len == 0) - end = -1; - else - end = start + fl->l_len - 1; /* * Create the lockf structure. */