svn commit: r350528 - stable/12/sys/ufs/ufs
Rick Macklem
rmacklem at FreeBSD.org
Fri Aug 2 01:59:59 UTC 2019
Author: rmacklem
Date: Fri Aug 2 01:59:58 2019
New Revision: 350528
URL: https://svnweb.freebsd.org/changeset/base/350528
Log:
MFC: r350367
Lock the vnode before calling ufs_bmap_seekdata().
r346932 replaced a call to vn_bmap_seekhole() with a call to
ufs_bmap_seekdata(). Although vn_bmap_seekhole() locks the vnode,
ufs_bmap_seekdata() assumes it is already locked.
This patch adds locking of the vnode before the ufs_bmap_seekdata() call.
If the vn_lock() call fails, it returns EBADF since that is the normal
error returned when a file system is forced dismounted and is already
listed as an error return in the lseek(2) man page.
Thanks go to Harry Schmalzbauer (freebsd at omnilan.de) for noting that
this MFC was required.
Modified:
stable/12/sys/ufs/ufs/ufs_vnops.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/ufs/ufs/ufs_vnops.c
==============================================================================
--- stable/12/sys/ufs/ufs/ufs_vnops.c Fri Aug 2 00:13:11 2019 (r350527)
+++ stable/12/sys/ufs/ufs/ufs_vnops.c Fri Aug 2 01:59:58 2019 (r350528)
@@ -2695,11 +2695,18 @@ static int
ufs_ioctl(struct vop_ioctl_args *ap)
{
struct vnode *vp;
+ int error;
vp = ap->a_vp;
switch (ap->a_command) {
case FIOSEEKDATA:
- return (ufs_bmap_seekdata(vp, (off_t *)ap->a_data));
+ error = vn_lock(vp, LK_SHARED);
+ if (error == 0) {
+ error = ufs_bmap_seekdata(vp, (off_t *)ap->a_data);
+ VOP_UNLOCK(vp, 0);
+ } else
+ error = EBADF;
+ return (error);
case FIOSEEKHOLE:
return (vn_bmap_seekhole(vp, ap->a_command, (off_t *)ap->a_data,
ap->a_cred));
More information about the svn-src-stable-12
mailing list