PERFORCE change 166133 for review

Aditya Sarawgi truncs at FreeBSD.org
Wed Jul 15 14:35:24 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=166133

Change 166133 by truncs at aditya on 2009/07/15 14:35:02

	Introduced buffers to sync metadata which will end the metadata corruption problem. But bdwrite() gives rise to panic saying that
	brelse: free buffer onto another queue??? on umounting. I'm not able to figure out the problem here so using a simple function which 
	just makes the buffer dirty by setting the dirty flag.

Affected files ...

.. //depot/projects/soc2009/soc_ext2fs/src/sys/gnu/fs/ext2fs/ext2_alloc.c#30 edit

Differences ...

==== //depot/projects/soc2009/soc_ext2fs/src/sys/gnu/fs/ext2fs/ext2_alloc.c#30 (text+ko) ====

@@ -60,7 +60,7 @@
 						int));
 static daddr_t	ext2_nodealloccg(struct inode *, int, daddr_t, int);
 static daddr_t  ext2_mapsearch(struct m_ext2fs *, char *, daddr_t);
-
+static void	mark_buffer_dirty2(struct buf *bh);
 /*
  * Allocate a block in the file system.
  *
@@ -457,13 +457,14 @@
 {
 	struct m_ext2fs *fs;
 	struct buf *bp;
+	struct buf *bh;
 	struct ext2_gd *gdp = NULL;
 	int cg, error;
 	char *bbp;
 
 	fs = ip->i_e2fs;
 	cg = dtog(fs, bno);
-	gdp = get_group_desc2(fs, cg, NULL);
+	gdp = get_group_desc2(fs, cg, &bh);
 	if ((u_int)bno >= fs->e2fs->e2fs_bcount) {
                 printf("bad block %lld, ino %llu\n", (long long)bno,
                     (unsigned long long)ip->i_number);
@@ -487,7 +488,7 @@
         clrbit(bbp, bno);
         fs->e2fs->e2fs_fbcount++;
         gdp->ext2bgd_nbfree++;
-
+	mark_buffer_dirty2(bh);
         fs->e2fs_fmod = 1;
         bdwrite(bp);
 }
@@ -506,6 +507,7 @@
 	struct m_ext2fs *fs;
 	struct inode *pip;
 	struct buf *bp;
+	struct buf *bh;
 	struct ext2_gd * gdp = NULL;
 	int error, cg;
 	char * ibp;
@@ -530,7 +532,7 @@
 	ext2_free_inode(pip);	
 	pip->i_mode = save_i_mode; */
 	cg = ino_to_cg(fs, ino);
-	gdp = get_group_desc2(fs, cg, NULL);
+	gdp = get_group_desc2(fs, cg, &bh);
 	error = bread(pip->i_devvp,
 		fsbtodb(fs, gdp->ext2bgd_i_bitmap),
 		(int)fs->e2fs_bsize, NOCRED, &bp);
@@ -552,6 +554,7 @@
 	if ((mode & IFMT) == IFDIR) {
 		gdp->ext2bgd_ndirs--;
 	}
+	mark_buffer_dirty2(bh);
 	fs->e2fs_fmod = 1;
 	bdwrite(bp);
 	return (0);
@@ -663,12 +666,13 @@
 	struct m_ext2fs *fs;
 	char *bbp;
 	struct buf *bp;
+	struct buf *bh;
 	struct ext2_gd *gdp = NULL;
 	/* XXX ondisk32 */
 	int error, bno, start, end, loc;
 	
 	fs = ip->i_e2fs;
-	gdp = get_group_desc2(fs, cg, NULL);
+	gdp = get_group_desc2(fs, cg, &bh);
 	if (gdp->ext2bgd_nbfree == 0)
 		return (0);
 	error = bread(ip->i_devvp, fsbtodb(fs,
@@ -731,6 +735,7 @@
 	setbit(bbp, (daddr_t)bno);
 	fs->e2fs->e2fs_fbcount--;
 	gdp->ext2bgd_nbfree--;
+	mark_buffer_dirty2(bh);
 	fs->e2fs_fmod = 1;
 	bdwrite(bp);
 	return (cg * fs->e2fs->e2fs_fpg + fs->e2fs->e2fs_first_dblock + bno);
@@ -747,7 +752,7 @@
 	struct m_ext2fs *fs;
 	char *ibp;
 	struct buf *bp;
-/*	struct buf *bh;*/
+	struct buf *bh;
 	struct ext2_gd *gdp = NULL;
 	int error, start, len, loc, map, i;
 	uprintf("1\n");
@@ -755,17 +760,18 @@
 	if (ipref == -1)
 		ipref = 0;
 	fs = ip->i_e2fs;
-	gdp = get_group_desc2(fs, cg, NULL);
+	gdp = get_group_desc2(fs, cg, &bh);
 	uprintf("2\n");
 	if (gdp->ext2bgd_nifree == 0)
 		return (0);
-/*	lock_super(DEVVP(ip)); */
+	lock_super(DEVVP(ip)); 
+	uprintf("%d\n", gdp->ext2bgd_nifree);
 	error = bread(ip->i_devvp, fsbtodb(fs,
 		gdp->ext2bgd_i_bitmap),
 		(int)fs->e2fs_bsize, NOCRED, &bp);
 	if (error) {
 		brelse(bp);
-/*		unlock_super(DEVVP(ip));  */
+		unlock_super(DEVVP(ip));  
 		uprintf("3\n");
 		return (0);
 	}
@@ -802,18 +808,20 @@
 	/* NOTREACHED */
 gotit:
 	setbit(ibp, ipref);
+	gdp->ext2bgd_nifree--;
+/*	bwrite(bh);*/
+	mark_buffer_dirty2(bh); 
 	fs->e2fs->e2fs_ficount--;
-	gdp->ext2bgd_nifree--;
 	fs->e2fs_fmod = 1;
 	if ((mode & IFMT) == IFDIR) {
 		gdp->ext2bgd_ndirs++;
 	}
 /*	mark_buffer_dirty2(bh); */
 /*	mark_buffer_dirty2(bp); */
-	
-/*	unlock_super(DEVVP(ip));  */
 	uprintf("4\n");
 	bdwrite(bp);
+	uprintf("%d\n", gdp->ext2bgd_nifree);
+	unlock_super(DEVVP(ip));
 	return (cg * fs->e2fs->e2fs_ipg + ipref +1);
 }
 
@@ -906,3 +914,11 @@
         return 0;
 }
 
+void mark_buffer_dirty2(struct buf *bh)
+{
+	int s;
+
+	s = splbio();
+	bh->b_flags |= B_DIRTY;
+	splx(s);
+} 


More information about the p4-projects mailing list