[Bug 264723] the KERN_LOCKF sysctl returns kl_file_fsid that doesn't match st_dev from stat()
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264723] the KERN_LOCKF sysctl returns kl_file_fsid that doesn't match st_dev from stat()"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264723] the KERN_LOCKF sysctl returns kl_file_fsid that doesn't match st_dev from stat()"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264723] the KERN_LOCKF sysctl returns kl_file_fsid that doesn't match st_dev from stat()"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264723] the KERN_LOCKF sysctl returns kl_file_fsid that doesn't match st_dev from stat()"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264723] the KERN_LOCKF sysctl returns kl_file_fsid that doesn't match st_dev from stat()"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264723] the KERN_LOCKF sysctl returns kl_file_fsid that doesn't match st_dev from stat()"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264723] the KERN_LOCKF sysctl returns kl_file_fsid that doesn't match st_dev from stat()"
- Reply: bugzilla-noreply_a_freebsd.org: "[Bug 264723] the KERN_LOCKF sysctl returns kl_file_fsid that doesn't match st_dev from stat()"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 17 Jun 2022 01:35:54 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=264723 Bug ID: 264723 Summary: the KERN_LOCKF sysctl returns kl_file_fsid that doesn't match st_dev from stat() Product: Base System Version: CURRENT Hardware: Any OS: Any Status: New Severity: Affects Some People Priority: --- Component: kern Assignee: bugs@FreeBSD.org Reporter: damjan.jov@gmail.com The new KERN_LOCKF sysctl (great work btw) returns struct kinfo_lockf, whose kl_file_fsid matches neither the st_dev from stat(), nor the kf_file_fsid from kinfo_getfiles() (even though stat() and kinfo_getfiles() match each other). For example compare the FSID in "procstat advlock" for a locked file, with the st_dev in "stat -s" output on it. vop_stdstat() derives st_dev like this: ---snip--- if (vap->va_fsid != VNOVAL) sb->st_dev = vap->va_fsid; else sb->st_dev = vp->v_mount->mnt_stat.f_fsid.val[0]; ---snip--- vn_fill_kinfo_vnode() derives kf_file_fsid the same way: ---snip--- if (va.va_fsid != VNOVAL) kif->kf_un.kf_file.kf_file_fsid = va.va_fsid; else kif->kf_un.kf_file.kf_file_fsid = vp->v_mount->mnt_stat.f_fsid.val[0]; ---snip--- But vfs_report_lockf() uses the entire mnt_stat.f_fsid, not just array element 0, and never uses va.va_fsid: ---snip--- fsidx = mp->mnt_stat.f_fsid; ... memcpy(&klf->kl.kl_file_fsid, &fsidx, sizeof(fsidx)); ---snip--- vfs_report_lockf() does call VOP_STAT(), which is (usually?) the vop_stdstat() function above, so it should be able to just copy its correctly populated st_dev to kl_file_fsid. When I do that, as in the following patch, it seems to work, the FSID in "procstat advlock" matches the st_dev in "stat -s": ---snip--- diff --git a/sys/kern/kern_lockf.c b/sys/kern/kern_lockf.c index cad208197e7..98e29b2c929 100644 --- a/sys/kern/kern_lockf.c +++ b/sys/kern/kern_lockf.c @@ -2479,7 +2479,6 @@ vfs_report_lockf(struct mount *mp, struct sbuf *sb) struct ucred *ucred; char *fullpath, *freepath; struct stat stt; - fsid_t fsidx; STAILQ_HEAD(, kinfo_lockf_linked) locks; int error, gerror; @@ -2522,7 +2521,6 @@ vfs_report_lockf(struct mount *mp, struct sbuf *sb) gerror = 0; ucred = curthread->td_ucred; - fsidx = mp->mnt_stat.f_fsid; while ((klf = STAILQ_FIRST(&locks)) != NULL) { STAILQ_REMOVE_HEAD(&locks, link); vp = klf->vp; @@ -2532,8 +2530,7 @@ vfs_report_lockf(struct mount *mp, struct sbuf *sb) error = VOP_STAT(vp, &stt, ucred, NOCRED); VOP_UNLOCK(vp); if (error == 0) { - memcpy(&klf->kl.kl_file_fsid, &fsidx, - sizeof(fsidx)); + klf->kl.kl_file_fsid = stt.st_dev; klf->kl.kl_file_rdev = stt.st_rdev; klf->kl.kl_file_fileid = stt.st_ino; freepath = NULL; ---snip--- -- You are receiving this mail because: You are the assignee for the bug.