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 mailing list