Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 9383e745e23602bc45f9c92184feea59 > files > 116

gfs2-utils-0.1.62-28.el5.src.rpm

commit 4e3322cb8fcb1109fc5f16131b467127c229fa5d
Author: Bob Peterson <rpeterso@redhat.com>
Date:   Fri Jun 25 13:45:36 2010 -0500

    gfs2_fsck ends on journal recovery
    
    This patch adds a return code to function write_journal and correctly
    processes it as it does in the upstream code.
    
    rhbz#606468

diff --git a/gfs2/fsck/fs_recovery.c b/gfs2/fsck/fs_recovery.c
index 654556c..d5ccb75 100644
--- a/gfs2/fsck/fs_recovery.c
+++ b/gfs2/fsck/fs_recovery.c
@@ -553,9 +553,9 @@ out:
 	log_info( _("jid=%u: Failed\n"), j);
 reinit:
 	if (query( _("Do you want to clear the journal instead? (y/n)")))
-		write_journal(sdp, sdp->md.journal[j], j,
-			      sdp->md.journal[j]->i_di.di_size /
-			      sdp->sd_sb.sb_bsize);
+		error = write_journal(sdp, sdp->md.journal[j], j,
+				      sdp->md.journal[j]->i_di.di_size /
+				      sdp->sd_sb.sb_bsize);
 	else
 		log_err( _("jid=%u: journal not cleared.\n"), j);
 	return error;
diff --git a/gfs2/libgfs2/libgfs2.h b/gfs2/libgfs2/libgfs2.h
index c94c05d..c8cb958 100644
--- a/gfs2/libgfs2/libgfs2.h
+++ b/gfs2/libgfs2/libgfs2.h
@@ -478,8 +478,8 @@ extern int gfs2_dirent_next(struct gfs2_inode *dip, struct gfs2_buffer_head *bh,
 extern void build_height(struct gfs2_inode *ip, int height);
 extern void unstuff_dinode(struct gfs2_inode *ip);
 extern unsigned int calc_tree_height(struct gfs2_inode *ip, uint64_t size);
-extern void write_journal(struct gfs2_sbd *sdp, struct gfs2_inode *ip,
-			  unsigned int j, unsigned int blocks);
+extern int write_journal(struct gfs2_sbd *sdp, struct gfs2_inode *ip,
+			 unsigned int j, unsigned int blocks);
 
 /**
  * device_size - figure out a device's size
diff --git a/gfs2/libgfs2/structures.c b/gfs2/libgfs2/structures.c
index ea0ca6a..ce12174 100644
--- a/gfs2/libgfs2/structures.c
+++ b/gfs2/libgfs2/structures.c
@@ -86,12 +86,12 @@ build_sb(struct gfs2_sbd *sdp, const unsigned char *uuid)
 	}
 }
 
-void write_journal(struct gfs2_sbd *sdp, struct gfs2_inode *ip, unsigned int j,
-				   unsigned int blocks)
+int write_journal(struct gfs2_sbd *sdp, struct gfs2_inode *ip, unsigned int j,
+		  unsigned int blocks)
 {
 	struct gfs2_log_header lh;
 	unsigned int x;
-	uint64_t seq = RANDOM(blocks);
+	uint64_t seq = ((blocks) * (random() / (RAND_MAX + 1.0)));
 	uint32_t hash;
 	unsigned int height;
 
@@ -109,14 +109,14 @@ void write_journal(struct gfs2_sbd *sdp, struct gfs2_inode *ip, unsigned int j,
 	for (x = 0; x < blocks; x++) {
 		struct gfs2_buffer_head *bh = get_file_buf(ip, x, TRUE);
 		if (!bh)
-			die("write_journal\n");
+			return -1;
 		bmodified(bh);
 		brelse(bh);
 	}
 	for (x = 0; x < blocks; x++) {
 		struct gfs2_buffer_head *bh = get_file_buf(ip, x, FALSE);
 		if (!bh)
-			die("write_journal\n");
+			return -1;
 
 		memset(bh->b_data, 0, sdp->bsize);
 		lh.lh_sequence = seq;
@@ -136,6 +136,7 @@ void write_journal(struct gfs2_sbd *sdp, struct gfs2_inode *ip, unsigned int j,
 		printf("\nJournal %u:\n", j);
 		gfs2_dinode_print(&ip->i_di);
 	}
+	return 0;
 }
 
 void