diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2008-12-20 04:54:54 -0500 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2008-12-20 04:54:54 -0500 | 
| commit | 93b8eef1c098efbea2f1fc0be7e3c681f259a7e7 (patch) | |
| tree | 462cc8c2bc07bbc825dab2a200891a28d8643329 /fs/ext4/super.c | |
| parent | a2d781fc8d9b16113dd9440107d73c0f21d7cbef (diff) | |
| parent | 929096fe9ff1f4b3645cf3919527ab47e8d5e17c (diff) | |
| download | olio-linux-3.10-93b8eef1c098efbea2f1fc0be7e3c681f259a7e7.tar.xz olio-linux-3.10-93b8eef1c098efbea2f1fc0be7e3c681f259a7e7.zip  | |
Merge commit 'v2.6.28-rc9' into next
Diffstat (limited to 'fs/ext4/super.c')
| -rw-r--r-- | fs/ext4/super.c | 35 | 
1 files changed, 17 insertions, 18 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index bdddea14e78..e4a241c65db 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c @@ -333,7 +333,8 @@ void ext4_abort(struct super_block *sb, const char *function,  	EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS;  	sb->s_flags |= MS_RDONLY;  	EXT4_SB(sb)->s_mount_opt |= EXT4_MOUNT_ABORT; -	jbd2_journal_abort(EXT4_SB(sb)->s_journal, -EIO); +	if (EXT4_SB(sb)->s_journal) +		jbd2_journal_abort(EXT4_SB(sb)->s_journal, -EIO);  }  void ext4_warning(struct super_block *sb, const char *function, @@ -442,14 +443,16 @@ static void ext4_put_super(struct super_block *sb)  {  	struct ext4_sb_info *sbi = EXT4_SB(sb);  	struct ext4_super_block *es = sbi->s_es; -	int i; +	int i, err;  	ext4_mb_release(sb);  	ext4_ext_release(sb);  	ext4_xattr_put_super(sb); -	if (jbd2_journal_destroy(sbi->s_journal) < 0) -		ext4_abort(sb, __func__, "Couldn't clean up the journal"); +	err = jbd2_journal_destroy(sbi->s_journal);  	sbi->s_journal = NULL; +	if (err < 0) +		ext4_abort(sb, __func__, "Couldn't clean up the journal"); +  	if (!(sb->s_flags & MS_RDONLY)) {  		EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER);  		es->s_state = cpu_to_le16(sbi->s_mount_state); @@ -1455,9 +1458,8 @@ static int ext4_fill_flex_info(struct super_block *sb)  	/* We allocate both existing and potentially added groups */  	flex_group_count = ((sbi->s_groups_count + groups_per_flex - 1) + -			    ((sbi->s_es->s_reserved_gdt_blocks +1 ) << -			      EXT4_DESC_PER_BLOCK_BITS(sb))) / -			   groups_per_flex; +			((le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks) + 1) << +			      EXT4_DESC_PER_BLOCK_BITS(sb))) / groups_per_flex;  	sbi->s_flex_groups = kzalloc(flex_group_count *  				     sizeof(struct flex_groups), GFP_KERNEL);  	if (sbi->s_flex_groups == NULL) { @@ -2882,12 +2884,9 @@ int ext4_force_commit(struct super_block *sb)  /*   * Ext4 always journals updates to the superblock itself, so we don't   * have to propagate any other updates to the superblock on disk at this - * point.  Just start an async writeback to get the buffers on their way - * to the disk. - * - * This implicitly triggers the writebehind on sync(). + * point.  (We can probably nuke this function altogether, and remove + * any mention to sb->s_dirt in all of fs/ext4; eventual cleanup...)   */ -  static void ext4_write_super(struct super_block *sb)  {  	if (mutex_trylock(&sb->s_lock) != 0) @@ -2897,15 +2896,15 @@ static void ext4_write_super(struct super_block *sb)  static int ext4_sync_fs(struct super_block *sb, int wait)  { -	tid_t target; +	int ret = 0;  	trace_mark(ext4_sync_fs, "dev %s wait %d", sb->s_id, wait);  	sb->s_dirt = 0; -	if (jbd2_journal_start_commit(EXT4_SB(sb)->s_journal, &target)) { -		if (wait) -			jbd2_log_wait_commit(EXT4_SB(sb)->s_journal, target); -	} -	return 0; +	if (wait) +		ret = ext4_force_commit(sb); +	else +		jbd2_journal_start_commit(EXT4_SB(sb)->s_journal, NULL); +	return ret;  }  /*  |