- Make lf_print static and move its prototype into kern_lockf.c

- Protect all of the advlock code with Giant as some filesystems
   may not be entering with Giant held now.

Sponsored by:	Isilon Systems, Inc.
This commit is contained in:
Jeff Roberson 2005-01-25 10:15:26 +00:00
parent b58635504c
commit 013e6650ca
2 changed files with 40 additions and 23 deletions

View File

@ -82,6 +82,10 @@ static int lf_getlock(struct lockf *, struct flock *);
static int lf_setlock(struct lockf *); static int lf_setlock(struct lockf *);
static void lf_split(struct lockf *, struct lockf *); static void lf_split(struct lockf *, struct lockf *);
static void lf_wakelock(struct lockf *); static void lf_wakelock(struct lockf *);
#ifdef LOCKF_DEBUG
static void lf_print(char *, struct lockf *);
static void lf_printlist(char *, struct lockf *);
#endif
/* /*
* Advisory record locking support * Advisory record locking support
@ -103,6 +107,7 @@ lf_advlock(ap, head, size)
off_t start, end, oadd; off_t start, end, oadd;
int error; int error;
mtx_lock(&Giant);
/* /*
* Convert the flock structure into a start and end. * Convert the flock structure into a start and end.
*/ */
@ -119,29 +124,40 @@ lf_advlock(ap, head, size)
case SEEK_END: case SEEK_END:
if (size > OFF_MAX || if (size > OFF_MAX ||
(fl->l_start > 0 && size > OFF_MAX - fl->l_start)) (fl->l_start > 0 && size > OFF_MAX - fl->l_start)) {
return (EOVERFLOW); error = EOVERFLOW;
goto out;
}
start = size + fl->l_start; start = size + fl->l_start;
break; break;
default: default:
return (EINVAL); error = EINVAL;
goto out;
}
if (start < 0) {
error = EINVAL;
goto out;
} }
if (start < 0)
return (EINVAL);
if (fl->l_len < 0) { if (fl->l_len < 0) {
if (start == 0) if (start == 0) {
return (EINVAL); error = EINVAL;
goto out;
}
end = start - 1; end = start - 1;
start += fl->l_len; start += fl->l_len;
if (start < 0) if (start < 0) {
return (EINVAL); error = EINVAL;
goto out;
}
} else if (fl->l_len == 0) } else if (fl->l_len == 0)
end = -1; end = -1;
else { else {
oadd = fl->l_len - 1; oadd = fl->l_len - 1;
if (oadd > OFF_MAX - start) if (oadd > OFF_MAX - start) {
return (EOVERFLOW); error = EOVERFLOW;
goto out;
}
end = start + oadd; end = start + oadd;
} }
/* /*
@ -150,7 +166,8 @@ lf_advlock(ap, head, size)
if (*head == (struct lockf *)0) { if (*head == (struct lockf *)0) {
if (ap->a_op != F_SETLK) { if (ap->a_op != F_SETLK) {
fl->l_type = F_UNLCK; fl->l_type = F_UNLCK;
return (0); error = 0;
goto out;
} }
} }
/* /*
@ -177,23 +194,28 @@ lf_advlock(ap, head, size)
*/ */
switch(ap->a_op) { switch(ap->a_op) {
case F_SETLK: case F_SETLK:
return (lf_setlock(lock)); error = lf_setlock(lock);
goto out;
case F_UNLCK: case F_UNLCK:
error = lf_clearlock(lock); error = lf_clearlock(lock);
FREE(lock, M_LOCKF); FREE(lock, M_LOCKF);
return (error); goto out;
case F_GETLK: case F_GETLK:
error = lf_getlock(lock, fl); error = lf_getlock(lock, fl);
FREE(lock, M_LOCKF); FREE(lock, M_LOCKF);
return (error); goto out;
default: default:
free(lock, M_LOCKF); free(lock, M_LOCKF);
return (EINVAL); error = EINVAL;
goto out;
} }
/* NOTREACHED */ /* NOTREACHED */
out:
mtx_unlock(&Giant);
return (error);
} }
/* /*
@ -760,7 +782,7 @@ lf_wakelock(listhead)
/* /*
* Print out a lock. * Print out a lock.
*/ */
void static void
lf_print(tag, lock) lf_print(tag, lock)
char *tag; char *tag;
register struct lockf *lock; register struct lockf *lock;
@ -792,7 +814,7 @@ lf_print(tag, lock)
printf("\n"); printf("\n");
} }
void static void
lf_printlist(tag, lock) lf_printlist(tag, lock)
char *tag; char *tag;
struct lockf *lock; struct lockf *lock;

View File

@ -70,9 +70,4 @@ struct lockf {
int lf_advlock(struct vop_advlock_args *, struct lockf **, u_quad_t); int lf_advlock(struct vop_advlock_args *, struct lockf **, u_quad_t);
#ifdef LOCKF_DEBUG
void lf_print(char *, struct lockf *);
void lf_printlist(char *, struct lockf *);
#endif
#endif /* !_SYS_LOCKF_H_ */ #endif /* !_SYS_LOCKF_H_ */