- 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:
parent
b58635504c
commit
013e6650ca
@ -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;
|
||||||
|
@ -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_ */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user