Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 23 Feb 2000 21:56:35 -0800 (PST)
From:      Matthew Dillon <dillon@apollo.backplane.com>
To:        Matthew Dillon <dillon@apollo.backplane.com>
Cc:        Ian Dowse <iedowse@maths.tcd.ie>, nops@maths.tcd.ie, freebsd-current@FreeBSD.ORG, diablo-list@list.bart.nl
Subject:   Re: ffs_blkfree: freeing free block (was Re: Panic (pmap)) 
Message-ID:  <200002240556.VAA34592@apollo.backplane.com>
References:  <200002232235.aa22335@salmon.maths.tcd.ie> <200002240227.SAA33299@apollo.backplane.com>

next in thread | previous in thread | raw e-mail | index | archive | help
>>> Ian's test script >>>
	mount_mfs -T fd1440 none /mnt
	cd /mnt
	dd if=/dev/zero bs=4k of=test seek=1036 count=1
	dd if=/dev/zero bs=4k of=test1 count=1
	dd if=/dev/zero bs=4k of=test2
	rm test1
	dd if=/dev/zero bs=4k of=test seek=8000 count=1
	echo > test
<<<<<<<<<<<<<<<<<<<<<<<<<

    Oops, here's a new version of my patch.  This one survives Ian's test
    script.  I was improperly blowing away an 'error' field.

						-Matt

Index: ffs_balloc.c
===================================================================
RCS file: /home/ncvs/src/sys/ufs/ffs/ffs_balloc.c,v
retrieving revision 1.25
diff -u -r1.25 ffs_balloc.c
--- ffs_balloc.c	2000/01/11 08:27:00	1.25
+++ ffs_balloc.c	2000/02/24 05:44:59
@@ -77,6 +77,7 @@
 	ufs_daddr_t newb, *bap, pref;
 	int deallocated, osize, nsize, num, i, error;
 	ufs_daddr_t *allocib, *blkp, *allocblk, allociblk[NIADDR + 1];
+	int unwindidx = -1;
 	struct proc *p = curproc;	/* XXX */
 
 	vp = ap->a_vp;
@@ -272,6 +273,8 @@
 			}
 		}
 		bap[indirs[i - 1].in_off] = nb;
+		if (allocib == NULL && unwindidx < 0)
+			unwindidx = i - 1;
 		/*
 		 * If required, write synchronously, otherwise use
 		 * delayed write.
@@ -349,8 +352,28 @@
 		ffs_blkfree(ip, *blkp, fs->fs_bsize);
 		deallocated += fs->fs_bsize;
 	}
-	if (allocib != NULL)
+	if (allocib != NULL) {
 		*allocib = 0;
+	} else if (unwindidx >= 0) {
+		int r;
+
+		r = bread(vp, indirs[unwindidx].in_lbn, 
+		    (int)fs->fs_bsize, NOCRED, &bp);
+		if (r) {
+			panic("Could not unwind indirect block, error %d", error);
+			brelse(bp);
+		} else {
+			bap = (ufs_daddr_t *)bp->b_data;
+			bap[indirs[unwindidx].in_off] = 0;
+			if (flags & B_SYNC) {
+				bwrite(bp);
+			} else {
+				if (bp->b_bufsize == fs->fs_bsize)
+					bp->b_flags |= B_CLUSTEROK;
+				bdwrite(bp);
+			}
+		}
+	}
 	if (deallocated) {
 #ifdef QUOTA
 		/*


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200002240556.VAA34592>