diff options
Diffstat (limited to 'fs/ext3/super.c')
| -rw-r--r-- | fs/ext3/super.c | 45 | 
1 files changed, 29 insertions, 16 deletions
| diff --git a/fs/ext3/super.c b/fs/ext3/super.c index 5d047a030a73..b70d90e08a3c 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c @@ -48,8 +48,8 @@ static int ext3_load_journal(struct super_block *, struct ext3_super_block *,  			     unsigned long journal_devnum);  static int ext3_create_journal(struct super_block *, struct ext3_super_block *,  			       unsigned int); -static void ext3_commit_super (struct super_block * sb, -			       struct ext3_super_block * es, +static int ext3_commit_super(struct super_block *sb, +			       struct ext3_super_block *es,  			       int sync);  static void ext3_mark_recovery_complete(struct super_block * sb,  					struct ext3_super_block * es); @@ -60,9 +60,9 @@ static const char *ext3_decode_error(struct super_block * sb, int errno,  				     char nbuf[16]);  static int ext3_remount (struct super_block * sb, int * flags, char * data);  static int ext3_statfs (struct dentry * dentry, struct kstatfs * buf); -static void ext3_unlockfs(struct super_block *sb); +static int ext3_unfreeze(struct super_block *sb);  static void ext3_write_super (struct super_block * sb); -static void ext3_write_super_lockfs(struct super_block *sb); +static int ext3_freeze(struct super_block *sb);  /*   * Wrappers for journal_start/end. @@ -759,8 +759,8 @@ static const struct super_operations ext3_sops = {  	.put_super	= ext3_put_super,  	.write_super	= ext3_write_super,  	.sync_fs	= ext3_sync_fs, -	.write_super_lockfs = ext3_write_super_lockfs, -	.unlockfs	= ext3_unlockfs, +	.freeze_fs	= ext3_freeze, +	.unfreeze_fs	= ext3_unfreeze,  	.statfs		= ext3_statfs,  	.remount_fs	= ext3_remount,  	.clear_inode	= ext3_clear_inode, @@ -2311,21 +2311,23 @@ static int ext3_create_journal(struct super_block * sb,  	return 0;  } -static void ext3_commit_super (struct super_block * sb, -			       struct ext3_super_block * es, +static int ext3_commit_super(struct super_block *sb, +			       struct ext3_super_block *es,  			       int sync)  {  	struct buffer_head *sbh = EXT3_SB(sb)->s_sbh; +	int error = 0;  	if (!sbh) -		return; +		return error;  	es->s_wtime = cpu_to_le32(get_seconds());  	es->s_free_blocks_count = cpu_to_le32(ext3_count_free_blocks(sb));  	es->s_free_inodes_count = cpu_to_le32(ext3_count_free_inodes(sb));  	BUFFER_TRACE(sbh, "marking dirty");  	mark_buffer_dirty(sbh);  	if (sync) -		sync_dirty_buffer(sbh); +		error = sync_dirty_buffer(sbh); +	return error;  } @@ -2439,12 +2441,14 @@ static int ext3_sync_fs(struct super_block *sb, int wait)   * LVM calls this function before a (read-only) snapshot is created.  This   * gives us a chance to flush the journal completely and mark the fs clean.   */ -static void ext3_write_super_lockfs(struct super_block *sb) +static int ext3_freeze(struct super_block *sb)  { +	int error = 0; +	journal_t *journal;  	sb->s_dirt = 0;  	if (!(sb->s_flags & MS_RDONLY)) { -		journal_t *journal = EXT3_SB(sb)->s_journal; +		journal = EXT3_SB(sb)->s_journal;  		/* Now we set up the journal barrier. */  		journal_lock_updates(journal); @@ -2453,20 +2457,28 @@ static void ext3_write_super_lockfs(struct super_block *sb)  		 * We don't want to clear needs_recovery flag when we failed  		 * to flush the journal.  		 */ -		if (journal_flush(journal) < 0) -			return; +		error = journal_flush(journal); +		if (error < 0) +			goto out;  		/* Journal blocked and flushed, clear needs_recovery flag. */  		EXT3_CLEAR_INCOMPAT_FEATURE(sb, EXT3_FEATURE_INCOMPAT_RECOVER); -		ext3_commit_super(sb, EXT3_SB(sb)->s_es, 1); +		error = ext3_commit_super(sb, EXT3_SB(sb)->s_es, 1); +		if (error) +			goto out;  	} +	return 0; + +out: +	journal_unlock_updates(journal); +	return error;  }  /*   * Called by LVM after the snapshot is done.  We need to reset the RECOVER   * flag here, even though the filesystem is not technically dirty yet.   */ -static void ext3_unlockfs(struct super_block *sb) +static int ext3_unfreeze(struct super_block *sb)  {  	if (!(sb->s_flags & MS_RDONLY)) {  		lock_super(sb); @@ -2476,6 +2488,7 @@ static void ext3_unlockfs(struct super_block *sb)  		unlock_super(sb);  		journal_unlock_updates(EXT3_SB(sb)->s_journal);  	} +	return 0;  }  static int ext3_remount (struct super_block * sb, int * flags, char * data) | 
