Module Name: src
Committed By: yamt
Date: Wed Jun 10 22:34:35 UTC 2009
Modified Files:
src/sys/kern: vfs_lockf.c
Log Message:
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.70 -r1.71 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.70 src/sys/kern/vfs_lockf.c:1.71
--- src/sys/kern/vfs_lockf.c:1.70 Wed Jun 10 22:23:15 2009
+++ src/sys/kern/vfs_lockf.c Wed Jun 10 22:34:35 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: vfs_lockf.c,v 1.70 2009/06/10 22:23:15 yamt Exp $ */
+/* $NetBSD: vfs_lockf.c,v 1.71 2009/06/10 22:34:35 yamt Exp $ */
/*
* Copyright (c) 1982, 1986, 1989, 1993
@@ -35,7 +35,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_lockf.c,v 1.70 2009/06/10 22:23:15 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_lockf.c,v 1.71 2009/06/10 22:34:35 yamt 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.
*/