Changeset View
Changeset View
Standalone View
Standalone View
sys/fs/fuse/fuse_vnops.c
Show First 20 Lines • Show All 472 Lines • ▼ Show 20 Lines | fuse_vnop_advlock(struct vop_advlock_args *ap) | ||||
struct flock *fl = ap->a_fl; | struct flock *fl = ap->a_fl; | ||||
struct thread *td = curthread; | struct thread *td = curthread; | ||||
struct ucred *cred = td->td_ucred; | struct ucred *cred = td->td_ucred; | ||||
pid_t pid = td->td_proc->p_pid; | pid_t pid = td->td_proc->p_pid; | ||||
struct fuse_filehandle *fufh; | struct fuse_filehandle *fufh; | ||||
struct fuse_dispatcher fdi; | struct fuse_dispatcher fdi; | ||||
struct fuse_lk_in *fli; | struct fuse_lk_in *fli; | ||||
struct fuse_lk_out *flo; | struct fuse_lk_out *flo; | ||||
struct vattr vattr; | |||||
enum fuse_opcode op; | enum fuse_opcode op; | ||||
off_t size, start; | |||||
int dataflags, err; | int dataflags, err; | ||||
int flags = ap->a_flags; | int flags = ap->a_flags; | ||||
dataflags = fuse_get_mpdata(vnode_mount(vp))->dataflags; | dataflags = fuse_get_mpdata(vnode_mount(vp))->dataflags; | ||||
if (fuse_isdeadfs(vp)) { | if (fuse_isdeadfs(vp)) { | ||||
return ENXIO; | return ENXIO; | ||||
} | } | ||||
Show All 18 Lines | fuse_vnop_advlock(struct vop_advlock_args *ap) | ||||
if (!(dataflags & FSESS_POSIX_LOCKS)) | if (!(dataflags & FSESS_POSIX_LOCKS)) | ||||
return vop_stdadvlock(ap); | return vop_stdadvlock(ap); | ||||
/* FUSE doesn't properly support flock until protocol 7.17 */ | /* FUSE doesn't properly support flock until protocol 7.17 */ | ||||
if (flags & F_FLOCK) | if (flags & F_FLOCK) | ||||
return vop_stdadvlock(ap); | return vop_stdadvlock(ap); | ||||
vn_lock(vp, LK_SHARED | LK_RETRY); | vn_lock(vp, LK_SHARED | LK_RETRY); | ||||
switch (fl->l_whence) { | |||||
case SEEK_SET: | |||||
case SEEK_CUR: | |||||
/* | |||||
* Caller is responsible for adding any necessary offset | |||||
* when SEEK_CUR is used. | |||||
*/ | |||||
start = fl->l_start; | |||||
break; | |||||
case SEEK_END: | |||||
err = fuse_internal_getattr(vp, &vattr, cred, td); | |||||
if (err) | |||||
goto out; | |||||
size = vattr.va_size; | |||||
if (size > OFF_MAX || | |||||
(fl->l_start > 0 && size > OFF_MAX - fl->l_start)) { | |||||
err = EOVERFLOW; | |||||
goto out; | |||||
} | |||||
start = size + fl->l_start; | |||||
break; | |||||
default: | |||||
return (EINVAL); | |||||
} | |||||
err = fuse_filehandle_get_anyflags(vp, &fufh, cred, pid); | err = fuse_filehandle_get_anyflags(vp, &fufh, cred, pid); | ||||
if (err) | if (err) | ||||
goto out; | goto out; | ||||
fdisp_init(&fdi, sizeof(*fli)); | fdisp_init(&fdi, sizeof(*fli)); | ||||
fdisp_make_vp(&fdi, op, vp, td, cred); | fdisp_make_vp(&fdi, op, vp, td, cred); | ||||
fli = fdi.indata; | fli = fdi.indata; | ||||
fli->fh = fufh->fh_id; | fli->fh = fufh->fh_id; | ||||
fli->owner = td->td_proc->p_pid; | fli->owner = td->td_proc->p_pid; | ||||
fli->lk.start = fl->l_start; | fli->lk.start = start; | ||||
if (fl->l_len != 0) | if (fl->l_len != 0) | ||||
fli->lk.end = fl->l_start + fl->l_len - 1; | fli->lk.end = start + fl->l_len - 1; | ||||
else | else | ||||
fli->lk.end = INT64_MAX; | fli->lk.end = INT64_MAX; | ||||
fli->lk.type = fl->l_type; | fli->lk.type = fl->l_type; | ||||
fli->lk.pid = td->td_proc->p_pid; | fli->lk.pid = td->td_proc->p_pid; | ||||
err = fdisp_wait_answ(&fdi); | err = fdisp_wait_answ(&fdi); | ||||
fdisp_destroy(&fdi); | fdisp_destroy(&fdi); | ||||
▲ Show 20 Lines • Show All 2,641 Lines • Show Last 20 Lines |