Changeset View
Changeset View
Standalone View
Standalone View
sys/fs/fuse/fuse_internal.c
Show First 20 Lines • Show All 919 Lines • ▼ Show 20 Lines | |||||
fuse_internal_do_getattr(struct vnode *vp, struct vattr *vap, | fuse_internal_do_getattr(struct vnode *vp, struct vattr *vap, | ||||
struct ucred *cred, struct thread *td) | struct ucred *cred, struct thread *td) | ||||
{ | { | ||||
struct fuse_dispatcher fdi; | struct fuse_dispatcher fdi; | ||||
struct fuse_vnode_data *fvdat = VTOFUD(vp); | struct fuse_vnode_data *fvdat = VTOFUD(vp); | ||||
struct fuse_getattr_in *fgai; | struct fuse_getattr_in *fgai; | ||||
struct fuse_attr_out *fao; | struct fuse_attr_out *fao; | ||||
off_t old_filesize = fvdat->cached_attrs.va_size; | off_t old_filesize = fvdat->cached_attrs.va_size; | ||||
struct timespec old_atime = fvdat->cached_attrs.va_atime; | |||||
struct timespec old_ctime = fvdat->cached_attrs.va_ctime; | struct timespec old_ctime = fvdat->cached_attrs.va_ctime; | ||||
struct timespec old_mtime = fvdat->cached_attrs.va_mtime; | struct timespec old_mtime = fvdat->cached_attrs.va_mtime; | ||||
enum vtype vtyp; | enum vtype vtyp; | ||||
int err; | int err; | ||||
fdisp_init(&fdi, sizeof(*fgai)); | fdisp_init(&fdi, sizeof(*fgai)); | ||||
fdisp_make_vp(&fdi, FUSE_GETATTR, vp, td, cred); | fdisp_make_vp(&fdi, FUSE_GETATTR, vp, td, cred); | ||||
fgai = fdi.indata; | fgai = fdi.indata; | ||||
/* | /* | ||||
* We could look up a file handle and set it in fgai->fh, but that | * We could look up a file handle and set it in fgai->fh, but that | ||||
* involves extra runtime work and I'm unaware of any file systems that | * involves extra runtime work and I'm unaware of any file systems that | ||||
* care. | * care. | ||||
*/ | */ | ||||
fgai->getattr_flags = 0; | fgai->getattr_flags = 0; | ||||
if ((err = fdisp_wait_answ(&fdi))) { | if ((err = fdisp_wait_answ(&fdi))) { | ||||
if (err == ENOENT) | if (err == ENOENT) | ||||
fuse_internal_vnode_disappear(vp); | fuse_internal_vnode_disappear(vp); | ||||
goto out; | goto out; | ||||
} | } | ||||
fao = (struct fuse_attr_out *)fdi.answ; | fao = (struct fuse_attr_out *)fdi.answ; | ||||
vtyp = IFTOVT(fao->attr.mode); | vtyp = IFTOVT(fao->attr.mode); | ||||
if (fvdat->flag & FN_SIZECHANGE) | if (fvdat->flag & FN_SIZECHANGE) | ||||
fao->attr.size = old_filesize; | fao->attr.size = old_filesize; | ||||
if (fvdat->flag & FN_ATIMECHANGE) { | |||||
fao->attr.atime = old_atime.tv_sec; | |||||
fao->attr.atimensec = old_atime.tv_nsec; | |||||
} | |||||
if (fvdat->flag & FN_CTIMECHANGE) { | if (fvdat->flag & FN_CTIMECHANGE) { | ||||
fao->attr.ctime = old_ctime.tv_sec; | fao->attr.ctime = old_ctime.tv_sec; | ||||
fao->attr.ctimensec = old_ctime.tv_nsec; | fao->attr.ctimensec = old_ctime.tv_nsec; | ||||
} | } | ||||
if (fvdat->flag & FN_MTIMECHANGE) { | if (fvdat->flag & FN_MTIMECHANGE) { | ||||
fao->attr.mtime = old_mtime.tv_sec; | fao->attr.mtime = old_mtime.tv_sec; | ||||
fao->attr.mtimensec = old_mtime.tv_nsec; | fao->attr.mtimensec = old_mtime.tv_nsec; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 243 Lines • ▼ Show 20 Lines | if (vap->va_size != VNOVAL) { | ||||
VTOFUD(vp)->flag &= ~FN_SIZECHANGE; | VTOFUD(vp)->flag &= ~FN_SIZECHANGE; | ||||
} | } | ||||
if (vap->va_atime.tv_sec != VNOVAL) { | if (vap->va_atime.tv_sec != VNOVAL) { | ||||
fsai->atime = vap->va_atime.tv_sec; | fsai->atime = vap->va_atime.tv_sec; | ||||
fsai->atimensec = vap->va_atime.tv_nsec; | fsai->atimensec = vap->va_atime.tv_nsec; | ||||
fsai->valid |= FATTR_ATIME; | fsai->valid |= FATTR_ATIME; | ||||
if (vap->va_vaflags & VA_UTIMES_NULL) | if (vap->va_vaflags & VA_UTIMES_NULL) | ||||
fsai->valid |= FATTR_ATIME_NOW; | fsai->valid |= FATTR_ATIME_NOW; | ||||
} else if (fvdat->flag & FN_ATIMECHANGE) { | |||||
fsai->atime = fvdat->cached_attrs.va_atime.tv_sec; | |||||
fsai->atimensec = fvdat->cached_attrs.va_atime.tv_nsec; | |||||
fsai->valid |= FATTR_ATIME; | |||||
} | } | ||||
if (vap->va_mtime.tv_sec != VNOVAL) { | if (vap->va_mtime.tv_sec != VNOVAL) { | ||||
fsai->mtime = vap->va_mtime.tv_sec; | fsai->mtime = vap->va_mtime.tv_sec; | ||||
fsai->mtimensec = vap->va_mtime.tv_nsec; | fsai->mtimensec = vap->va_mtime.tv_nsec; | ||||
fsai->valid |= FATTR_MTIME; | fsai->valid |= FATTR_MTIME; | ||||
if (vap->va_vaflags & VA_UTIMES_NULL) | if (vap->va_vaflags & VA_UTIMES_NULL) | ||||
fsai->valid |= FATTR_MTIME_NOW; | fsai->valid |= FATTR_MTIME_NOW; | ||||
} else if (fvdat->flag & FN_MTIMECHANGE) { | } else if (fvdat->flag & FN_MTIMECHANGE) { | ||||
Show All 32 Lines | if (vnode_vtype(vp) == VNON && vtyp != VNON) { | ||||
* try again, if interested. | * try again, if interested. | ||||
*/ | */ | ||||
fuse_internal_vnode_disappear(vp); | fuse_internal_vnode_disappear(vp); | ||||
err = EAGAIN; | err = EAGAIN; | ||||
} | } | ||||
} | } | ||||
if (err == 0) { | if (err == 0) { | ||||
struct fuse_attr_out *fao = (struct fuse_attr_out*)fdi.answ; | struct fuse_attr_out *fao = (struct fuse_attr_out*)fdi.answ; | ||||
fuse_vnode_undirty_cached_timestamps(vp); | fuse_vnode_undirty_cached_timestamps(vp, true); | ||||
fuse_internal_cache_attrs(vp, &fao->attr, fao->attr_valid, | fuse_internal_cache_attrs(vp, &fao->attr, fao->attr_valid, | ||||
fao->attr_valid_nsec, NULL, false); | fao->attr_valid_nsec, NULL, false); | ||||
} | } | ||||
out: | out: | ||||
fdisp_destroy(&fdi); | fdisp_destroy(&fdi); | ||||
return err; | return err; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 69 Lines • Show Last 20 Lines |