diff options
Diffstat (limited to 'fs/ext3/inode.c')
| -rw-r--r-- | fs/ext3/inode.c | 45 | 
1 files changed, 33 insertions, 12 deletions
diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c index 85fe655fe3e0..2d0afeca0b47 100644 --- a/fs/ext3/inode.c +++ b/fs/ext3/inode.c @@ -22,7 +22,6 @@   *  Assorted race fixes, rewrite of ext3_get_block() by Al Viro, 2000   */ -#include <linux/module.h>  #include <linux/fs.h>  #include <linux/time.h>  #include <linux/ext3_jbd.h> @@ -223,8 +222,12 @@ void ext3_evict_inode (struct inode *inode)  	 *  	 * Note that directories do not have this problem because they don't  	 * use page cache. +	 * +	 * The s_journal check handles the case when ext3_get_journal() fails +	 * and puts the journal inode.  	 */  	if (inode->i_nlink && ext3_should_journal_data(inode) && +	    EXT3_SB(inode->i_sb)->s_journal &&  	    (S_ISLNK(inode->i_mode) || S_ISREG(inode->i_mode))) {  		tid_t commit_tid = atomic_read(&ei->i_datasync_tid);  		journal_t *journal = EXT3_SB(inode->i_sb)->s_journal; @@ -1132,9 +1135,11 @@ struct buffer_head *ext3_bread(handle_t *handle, struct inode *inode,  	bh = ext3_getblk(handle, inode, block, create, err);  	if (!bh)  		return bh; -	if (buffer_uptodate(bh)) +	if (bh_uptodate_or_lock(bh))  		return bh; -	ll_rw_block(READ | REQ_META | REQ_PRIO, 1, &bh); +	get_bh(bh); +	bh->b_end_io = end_buffer_read_sync; +	submit_bh(READ | REQ_META | REQ_PRIO, bh);  	wait_on_buffer(bh);  	if (buffer_uptodate(bh))  		return bh; @@ -1617,7 +1622,13 @@ static int ext3_ordered_writepage(struct page *page,  	int err;  	J_ASSERT(PageLocked(page)); -	WARN_ON_ONCE(IS_RDONLY(inode)); +	/* +	 * We don't want to warn for emergency remount. The condition is +	 * ordered to avoid dereferencing inode->i_sb in non-error case to +	 * avoid slow-downs. +	 */ +	WARN_ON_ONCE(IS_RDONLY(inode) && +		     !(EXT3_SB(inode->i_sb)->s_mount_state & EXT3_ERROR_FS));  	/*  	 * We give up here if we're reentered, because it might be for a @@ -1692,7 +1703,13 @@ static int ext3_writeback_writepage(struct page *page,  	int err;  	J_ASSERT(PageLocked(page)); -	WARN_ON_ONCE(IS_RDONLY(inode)); +	/* +	 * We don't want to warn for emergency remount. The condition is +	 * ordered to avoid dereferencing inode->i_sb in non-error case to +	 * avoid slow-downs. +	 */ +	WARN_ON_ONCE(IS_RDONLY(inode) && +		     !(EXT3_SB(inode->i_sb)->s_mount_state & EXT3_ERROR_FS));  	if (ext3_journal_current_handle())  		goto out_fail; @@ -1735,7 +1752,13 @@ static int ext3_journalled_writepage(struct page *page,  	int err;  	J_ASSERT(PageLocked(page)); -	WARN_ON_ONCE(IS_RDONLY(inode)); +	/* +	 * We don't want to warn for emergency remount. The condition is +	 * ordered to avoid dereferencing inode->i_sb in non-error case to +	 * avoid slow-downs. +	 */ +	WARN_ON_ONCE(IS_RDONLY(inode) && +		     !(EXT3_SB(inode->i_sb)->s_mount_state & EXT3_ERROR_FS));  	if (ext3_journal_current_handle())  		goto no_write; @@ -2064,12 +2087,10 @@ static int ext3_block_truncate_page(struct inode *inode, loff_t from)  	if (PageUptodate(page))  		set_buffer_uptodate(bh); -	if (!buffer_uptodate(bh)) { -		err = -EIO; -		ll_rw_block(READ, 1, &bh); -		wait_on_buffer(bh); +	if (!bh_uptodate_or_lock(bh)) { +		err = bh_submit_read(bh);  		/* Uhhuh. Read error. Complain and punt. */ -		if (!buffer_uptodate(bh)) +		if (err)  			goto unlock;  	} @@ -2490,7 +2511,7 @@ int ext3_can_truncate(struct inode *inode)   * transaction, and VFS/VM ensures that ext3_truncate() cannot run   * simultaneously on behalf of the same inode.   * - * As we work through the truncate and commmit bits of it to the journal there + * As we work through the truncate and commit bits of it to the journal there   * is one core, guiding principle: the file's tree must always be consistent on   * disk.  We must be able to restart the truncate after a crash.   *  |