]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - fs/ext3/inode.c
Merge branch 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
[karo-tx-linux.git] / fs / ext3 / inode.c
index 15cb47088aac79083efa18203be0e35bea759292..2d0afeca0b479a9e5f3c80f6a98511a47643235a 100644 (file)
@@ -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;
        }