Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/vfs_vnops.c
| Show First 20 Lines • Show All 2,296 Lines • ▼ Show 20 Lines | vn_utimes_perm(struct vnode *vp, struct vattr *vap, struct ucred *cred, | ||||
| */ | */ | ||||
| error = VOP_ACCESSX(vp, VWRITE_ATTRIBUTES, cred, td); | error = VOP_ACCESSX(vp, VWRITE_ATTRIBUTES, cred, td); | ||||
| if (error != 0 && (vap->va_vaflags & VA_UTIMES_NULL) != 0) | if (error != 0 && (vap->va_vaflags & VA_UTIMES_NULL) != 0) | ||||
| error = VOP_ACCESS(vp, VWRITE, cred, td); | error = VOP_ACCESS(vp, VWRITE, cred, td); | ||||
| return (error); | return (error); | ||||
| } | } | ||||
| int | int | ||||
| vn_fill_kinfo(struct file *fp, struct kinfo_file *kif, struct filedesc *fdp) | vn_fill_kinfo(struct file *fp, struct kinfo_file *kif, struct filedesc *fdp, | ||||
| int lkflags) | |||||
| { | { | ||||
| struct vnode *vp; | struct vnode *vp; | ||||
| int error; | int error; | ||||
| if (fp->f_type == DTYPE_FIFO) | if (fp->f_type == DTYPE_FIFO) | ||||
| kif->kf_type = KF_TYPE_FIFO; | kif->kf_type = KF_TYPE_FIFO; | ||||
| else | else | ||||
| kif->kf_type = KF_TYPE_VNODE; | kif->kf_type = KF_TYPE_VNODE; | ||||
| vp = fp->f_vnode; | vp = fp->f_vnode; | ||||
| vref(vp); | vref(vp); | ||||
| FILEDESC_SUNLOCK(fdp); | FILEDESC_SUNLOCK(fdp); | ||||
| error = vn_fill_kinfo_vnode(vp, kif); | error = vn_fill_kinfo_vnode(vp, kif, lkflags); | ||||
| vrele(vp); | vrele(vp); | ||||
| FILEDESC_SLOCK(fdp); | FILEDESC_SLOCK(fdp); | ||||
| return (error); | return (error); | ||||
| } | } | ||||
| int | int | ||||
| vn_fill_kinfo_vnode(struct vnode *vp, struct kinfo_file *kif) | vn_fill_kinfo_vnode(struct vnode *vp, struct kinfo_file *kif, int lkflags) | ||||
| { | { | ||||
| struct vattr va; | struct vattr va; | ||||
| char *fullpath, *freepath; | char *fullpath, *freepath; | ||||
| int error; | int error; | ||||
| KASSERT((lkflags & ~LK_NOWAIT) == 0, | |||||
| ("invalid lkflags: %08x", lkflags)); | |||||
| kif->kf_vnode_type = vntype_to_kinfo(vp->v_type); | kif->kf_vnode_type = vntype_to_kinfo(vp->v_type); | ||||
| freepath = NULL; | freepath = NULL; | ||||
| fullpath = "-"; | fullpath = "-"; | ||||
| error = vn_fullpath(curthread, vp, &fullpath, &freepath); | error = vn_fullpath(curthread, vp, lkflags, &fullpath, &freepath); | ||||
| if (error == 0) { | if (error == 0) { | ||||
| strlcpy(kif->kf_path, fullpath, sizeof(kif->kf_path)); | strlcpy(kif->kf_path, fullpath, sizeof(kif->kf_path)); | ||||
| } | } | ||||
| if (freepath != NULL) | if (freepath != NULL) | ||||
| free(freepath, M_TEMP); | free(freepath, M_TEMP); | ||||
| /* | /* | ||||
| * Retrieve vnode attributes. | * Retrieve vnode attributes. | ||||
| */ | */ | ||||
| va.va_fsid = VNOVAL; | va.va_fsid = VNOVAL; | ||||
| va.va_rdev = NODEV; | va.va_rdev = NODEV; | ||||
| vn_lock(vp, LK_SHARED | LK_RETRY); | |||||
| lkflags |= LK_SHARED; | |||||
| if ((lkflags & LK_NOWAIT) == 0) | |||||
| lkflags |= LK_RETRY; | |||||
| error = vn_lock(vp, lkflags); | |||||
| if (error != 0) | |||||
| return (error); | |||||
| error = VOP_GETATTR(vp, &va, curthread->td_ucred); | error = VOP_GETATTR(vp, &va, curthread->td_ucred); | ||||
| VOP_UNLOCK(vp, 0); | VOP_UNLOCK(vp, 0); | ||||
| if (error != 0) | if (error != 0) | ||||
| return (error); | return (error); | ||||
| if (va.va_fsid != VNOVAL) | if (va.va_fsid != VNOVAL) | ||||
| kif->kf_un.kf_file.kf_file_fsid = va.va_fsid; | kif->kf_un.kf_file.kf_file_fsid = va.va_fsid; | ||||
| else | else | ||||
| kif->kf_un.kf_file.kf_file_fsid = | kif->kf_un.kf_file.kf_file_fsid = | ||||
| vp->v_mount->mnt_stat.f_fsid.val[0]; | vp->v_mount->mnt_stat.f_fsid.val[0]; | ||||
| kif->kf_un.kf_file.kf_file_fileid = va.va_fileid; | kif->kf_un.kf_file.kf_file_fileid = va.va_fileid; | ||||
| kif->kf_un.kf_file.kf_file_mode = MAKEIMODE(va.va_type, va.va_mode); | kif->kf_un.kf_file.kf_file_mode = MAKEIMODE(va.va_type, va.va_mode); | ||||
| kif->kf_un.kf_file.kf_file_size = va.va_size; | kif->kf_un.kf_file.kf_file_size = va.va_size; | ||||
| kif->kf_un.kf_file.kf_file_rdev = va.va_rdev; | kif->kf_un.kf_file.kf_file_rdev = va.va_rdev; | ||||
| return (0); | return (0); | ||||
| } | } | ||||