Module Name:    src
Committed By:   dholland
Date:           Tue Sep  1 06:13:09 UTC 2015

Modified Files:
        src/sys/ufs/lfs: lfs_accessors.h lfs_inode.c

Log Message:
Fix up indirect block handling in truncate to be 32/64 clean.


To generate a diff of this commit:
cvs rdiff -u -r1.20 -r1.21 src/sys/ufs/lfs/lfs_accessors.h
cvs rdiff -u -r1.146 -r1.147 src/sys/ufs/lfs/lfs_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/lfs/lfs_accessors.h
diff -u src/sys/ufs/lfs/lfs_accessors.h:1.20 src/sys/ufs/lfs/lfs_accessors.h:1.21
--- src/sys/ufs/lfs/lfs_accessors.h:1.20	Tue Sep  1 06:12:33 2015
+++ src/sys/ufs/lfs/lfs_accessors.h	Tue Sep  1 06:13:09 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_accessors.h,v 1.20 2015/09/01 06:12:33 dholland Exp $	*/
+/*	$NetBSD: lfs_accessors.h,v 1.21 2015/09/01 06:13:09 dholland Exp $	*/
 
 /*  from NetBSD: lfs.h,v 1.165 2015/07/24 06:59:32 dholland Exp  */
 /*  from NetBSD: dinode.h,v 1.22 2013/01/22 09:39:18 dholland Exp  */
@@ -214,11 +214,6 @@
 #define LFS_MAXSYMLINKLEN(fs) \
 	((fs)->lfs_is64 ? LFS64_MAXSYMLINKLEN : LFS32_MAXSYMLINKLEN)
 
-/* get rid of this eventually */
-#define ULFS_MAXSYMLINKLEN(ip) \
-	((ip)->i_ump->um_fstype == ULFS1) ? \
-	LFS32_MAXSYMLINKLEN : LFS64_MAXSYMLINKLEN
-
 #define DINOSIZE(fs) ((fs)->lfs_is64 ? sizeof(struct lfs64_dinode) : sizeof(struct lfs32_dinode))
 
 #define DINO_IN_BLOCK(fs, base, ix) \

Index: src/sys/ufs/lfs/lfs_inode.c
diff -u src/sys/ufs/lfs/lfs_inode.c:1.146 src/sys/ufs/lfs/lfs_inode.c:1.147
--- src/sys/ufs/lfs/lfs_inode.c:1.146	Tue Sep  1 06:08:37 2015
+++ src/sys/ufs/lfs/lfs_inode.c	Tue Sep  1 06:13:09 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: lfs_inode.c,v 1.146 2015/09/01 06:08:37 dholland Exp $	*/
+/*	$NetBSD: lfs_inode.c,v 1.147 2015/09/01 06:13:09 dholland Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2000, 2001, 2002, 2003 The NetBSD Foundation, Inc.
@@ -60,7 +60,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: lfs_inode.c,v 1.146 2015/09/01 06:08:37 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: lfs_inode.c,v 1.147 2015/09/01 06:13:09 dholland Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_quota.h"
@@ -726,10 +726,10 @@ lfs_indirtrunc(struct inode *ip, daddr_t
 	int i;
 	struct buf *bp;
 	struct lfs *fs = ip->i_lfs;
-	int32_t *bap;	/* XXX ondisk32 */
+	void *bap;
+	bool bap_needs_free;
 	struct vnode *vp;
 	daddr_t nb, nlbn, last;
-	int32_t *copy = NULL;	/* XXX ondisk32 */
 	daddr_t blkcount, rblkcount, factor;
 	int nblocks;
 	daddr_t blocksreleased = 0, real_released = 0;
@@ -777,17 +777,25 @@ lfs_indirtrunc(struct inode *ip, daddr_t
 		return (error);
 	}
 
-	bap = (int32_t *)bp->b_data;	/* XXX ondisk32 */
 	if (lastbn >= 0) {
-		copy = lfs_malloc(fs, lfs_sb_getbsize(fs), LFS_NB_IBLOCK);
-		memcpy((void *)copy, (void *)bap, lfs_sb_getbsize(fs));
-		memset((void *)&bap[last + 1], 0,
-		/* XXX ondisk32 */
-		  (u_int)(LFS_NINDIR(fs) - (last + 1)) * sizeof (int32_t));
+		/*
+		 * We still need this block, so copy the data for
+		 * subsequent processing; then in the original block,
+		 * zero out the dying block pointers and send it off.
+		 */
+		bap = lfs_malloc(fs, lfs_sb_getbsize(fs), LFS_NB_IBLOCK);
+		memcpy(bap, bp->b_data, lfs_sb_getbsize(fs));
+		bap_needs_free = true;
+
+		for (i = last + 1; i < LFS_NINDIR(fs); i++) {
+			lfs_iblock_set(fs, bp->b_data, i, 0);
+		}
 		error = VOP_BWRITE(bp->b_vp, bp);
 		if (error)
 			allerror = error;
-		bap = copy;
+	} else {
+		bap = bp->b_data;
+		bap_needs_free = false;
 	}
 
 	/*
@@ -795,7 +803,7 @@ lfs_indirtrunc(struct inode *ip, daddr_t
 	 */
 	for (i = LFS_NINDIR(fs) - 1, nlbn = lbn + 1 - i * factor; i > last;
 	    i--, nlbn += factor) {
-		nb = bap[i];
+		nb = lfs_iblock_get(fs, bap, i);
 		if (nb == 0)
 			continue;
 		if (level > SINGLE) {
@@ -809,7 +817,7 @@ lfs_indirtrunc(struct inode *ip, daddr_t
 			real_released += rblkcount;
 		}
 		lfs_blkfree(fs, ip, nb, lfs_sb_getbsize(fs), lastsegp, bcp);
-		if (bap[i] > 0)
+		if (lfs_iblock_get(fs, bap, i) > 0)
 			real_released += nblocks;
 		blocksreleased += nblocks;
 	}
@@ -819,7 +827,7 @@ lfs_indirtrunc(struct inode *ip, daddr_t
 	 */
 	if (level > SINGLE && lastbn >= 0) {
 		last = lastbn % factor;
-		nb = bap[i];
+		nb = lfs_iblock_get(fs, bap, i);
 		if (nb != 0) {
 			error = lfs_indirtrunc(ip, nlbn, nb,
 					       last, level - 1, &blkcount,
@@ -831,8 +839,8 @@ lfs_indirtrunc(struct inode *ip, daddr_t
 		}
 	}
 
-	if (copy != NULL) {
-		lfs_free(fs, copy, LFS_NB_IBLOCK);
+	if (bap_needs_free) {
+		lfs_free(fs, bap, LFS_NB_IBLOCK);
 	} else {
 		mutex_enter(&bufcache_lock);
 		if (bp->b_oflags & BO_DELWRI) {

Reply via email to