Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/kern_descrip.c
Show First 20 Lines • Show All 595 Lines • ▼ Show 20 Lines | if (error != 0) | ||||
break; | break; | ||||
tmp = arg; | tmp = arg; | ||||
error = fo_ioctl(fp, FIOSETOWN, &tmp, td->td_ucred, td); | error = fo_ioctl(fp, FIOSETOWN, &tmp, td->td_ucred, td); | ||||
fdrop(fp, td); | fdrop(fp, td); | ||||
break; | break; | ||||
case F_SETLK_REMOTE: | case F_SETLK_REMOTE: | ||||
error = priv_check(td, PRIV_NFS_LOCKD); | error = priv_check(td, PRIV_NFS_LOCKD); | ||||
if (error) | if (error != 0) | ||||
return (error); | return (error); | ||||
flg = F_REMOTE; | flg = F_REMOTE; | ||||
goto do_setlk; | goto do_setlk; | ||||
case F_SETLKW: | case F_SETLKW: | ||||
flg |= F_WAIT; | flg |= F_WAIT; | ||||
/* FALLTHROUGH F_SETLK */ | /* FALLTHROUGH F_SETLK */ | ||||
case F_SETLK: | case F_SETLK: | ||||
do_setlk: | do_setlk: | ||||
flp = (struct flock *)arg; | |||||
if ((flg & F_REMOTE) != 0 && flp->l_sysid == 0) { | |||||
error = EINVAL; | |||||
break; | |||||
} | |||||
error = fget_unlocked(fdp, fd, &cap_flock_rights, &fp, NULL); | error = fget_unlocked(fdp, fd, &cap_flock_rights, &fp, NULL); | ||||
if (error != 0) | if (error != 0) | ||||
break; | break; | ||||
if (fp->f_type != DTYPE_VNODE) { | if (fp->f_type != DTYPE_VNODE) { | ||||
error = EBADF; | error = EBADF; | ||||
fdrop(fp, td); | fdrop(fp, td); | ||||
break; | break; | ||||
} | } | ||||
flp = (struct flock *)arg; | |||||
if (flp->l_whence == SEEK_CUR) { | if (flp->l_whence == SEEK_CUR) { | ||||
foffset = foffset_get(fp); | foffset = foffset_get(fp); | ||||
if (foffset < 0 || | if (foffset < 0 || | ||||
(flp->l_start > 0 && | (flp->l_start > 0 && | ||||
foffset > OFF_MAX - flp->l_start)) { | foffset > OFF_MAX - flp->l_start)) { | ||||
error = EOVERFLOW; | error = EOVERFLOW; | ||||
fdrop(fp, td); | fdrop(fp, td); | ||||
break; | break; | ||||
Show All 29 Lines | case F_WRLCK: | ||||
error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_SETLK, | error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_SETLK, | ||||
flp, flg); | flp, flg); | ||||
break; | break; | ||||
case F_UNLCK: | case F_UNLCK: | ||||
error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_UNLCK, | error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, F_UNLCK, | ||||
flp, flg); | flp, flg); | ||||
break; | break; | ||||
case F_UNLCKSYS: | case F_UNLCKSYS: | ||||
/* | |||||
* Temporary api for testing remote lock | |||||
* infrastructure. | |||||
*/ | |||||
if (flg != F_REMOTE) { | if (flg != F_REMOTE) { | ||||
error = EINVAL; | error = EINVAL; | ||||
break; | break; | ||||
} | } | ||||
error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, | error = VOP_ADVLOCK(vp, (caddr_t)p->p_leader, | ||||
F_UNLCKSYS, flp, flg); | F_UNLCKSYS, flp, flg); | ||||
break; | break; | ||||
default: | default: | ||||
▲ Show 20 Lines • Show All 3,551 Lines • Show Last 20 Lines |