Module Name:    src
Committed By:   chs
Date:           Sun Jul 26 00:21:24 UTC 2020

Modified Files:
        src/sys/ufs/ffs: ffs_inode.c
        src/sys/ufs/ufs: ufs_inode.c

Log Message:
pull in a bit more FreeBSD code to allow specifying truncation of
the regular bmap (IO_NORMAL) independently of the extattr bmap (IO_EXT).
fixes fs corruption when removing extattrs in UFS2.


To generate a diff of this commit:
cvs rdiff -u -r1.129 -r1.130 src/sys/ufs/ffs/ffs_inode.c
cvs rdiff -u -r1.110 -r1.111 src/sys/ufs/ufs/ufs_inode.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/ufs/ffs/ffs_inode.c
diff -u src/sys/ufs/ffs/ffs_inode.c:1.129 src/sys/ufs/ffs/ffs_inode.c:1.130
--- src/sys/ufs/ffs/ffs_inode.c:1.129	Sat May  2 22:11:16 2020
+++ src/sys/ufs/ffs/ffs_inode.c	Sun Jul 26 00:21:24 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ffs_inode.c,v 1.129 2020/05/02 22:11:16 christos Exp $	*/
+/*	$NetBSD: ffs_inode.c,v 1.130 2020/07/26 00:21:24 chs Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ffs_inode.c,v 1.129 2020/05/02 22:11:16 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ffs_inode.c,v 1.130 2020/07/26 00:21:24 chs Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_ffs.h"
@@ -232,6 +232,14 @@ ffs_truncate(struct vnode *ovp, off_t le
 	if (length < 0)
 		return (EINVAL);
 
+	/*
+	 * Historically clients did not have to specify which data
+	 * they were truncating. So, if not specified, we assume
+	 * traditional behavior, e.g., just the normal data.
+	 */
+	if ((ioflag & (IO_EXT | IO_NORMAL)) == 0)
+		ioflag |= IO_NORMAL;
+
 	fs = oip->i_fs;
 #define i_din2 i_din.ffs2_din
 	extblocks = 0;
@@ -267,6 +275,8 @@ ffs_truncate(struct vnode *ovp, off_t le
 			extblocks = 0;
 		}
 	}
+	if ((ioflag & IO_NORMAL) == 0)
+		return (0);
 	if (ovp->v_type == VLNK &&
 	    (oip->i_size < ump->um_maxsymlinklen ||
 	     (ump->um_maxsymlinklen == 0 && datablocks == 0))) {
@@ -376,8 +386,7 @@ ffs_truncate(struct vnode *ovp, off_t le
 		}
 	}
 
-	if (!(ioflag & IO_EXT))
-		genfs_node_wrlock(ovp);
+	genfs_node_wrlock(ovp);
 	oip->i_size = length;
 	DIP_ASSIGN(oip, size, length);
 	uvm_vnp_setsize(ovp, length);
@@ -586,8 +595,7 @@ out:
 	oip->i_size = length;
 	DIP_ASSIGN(oip, size, length);
 	DIP_ADD(oip, blocks, -blocksreleased);
-	if (!(ioflag & IO_EXT))
-		genfs_node_unlock(ovp);
+	genfs_node_unlock(ovp);
 	oip->i_flag |= IN_CHANGE;
 	UFS_WAPBL_UPDATE(ovp, NULL, NULL, 0);
 #if defined(QUOTA) || defined(QUOTA2)

Index: src/sys/ufs/ufs/ufs_inode.c
diff -u src/sys/ufs/ufs/ufs_inode.c:1.110 src/sys/ufs/ufs/ufs_inode.c:1.111
--- src/sys/ufs/ufs/ufs_inode.c:1.110	Sat Apr 18 19:18:34 2020
+++ src/sys/ufs/ufs/ufs_inode.c	Sun Jul 26 00:21:24 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: ufs_inode.c,v 1.110 2020/04/18 19:18:34 christos Exp $	*/
+/*	$NetBSD: ufs_inode.c,v 1.111 2020/07/26 00:21:24 chs Exp $	*/
 
 /*
  * Copyright (c) 1991, 1993
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ufs_inode.c,v 1.110 2020/04/18 19:18:34 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ufs_inode.c,v 1.111 2020/07/26 00:21:24 chs Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_ffs.h"
@@ -327,5 +327,5 @@ ufs_truncate_all(struct vnode *vp)
 
 	if (isize == 0)
 		return 0;
-	return ufs_truncate_retry(vp, IO_EXT, 0, NOCRED);
+	return ufs_truncate_retry(vp, IO_NORMAL | IO_EXT, 0, NOCRED);
 }

Reply via email to