]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - fs/ext4/ext4_jbd2.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6
[mv-sheeva.git] / fs / ext4 / ext4_jbd2.c
index 53d2764d71caee518c5a3639c65d5708456ed25c..6e272ef6ba96c4938cc357ef498c760bde67d39e 100644 (file)
@@ -6,29 +6,29 @@
 
 #include <trace/events/ext4.h>
 
-int __ext4_journal_get_undo_access(const char *where, handle_t *handle,
-                               struct buffer_head *bh)
+int __ext4_journal_get_undo_access(const char *where, unsigned int line,
+                                  handle_t *handle, struct buffer_head *bh)
 {
        int err = 0;
 
        if (ext4_handle_valid(handle)) {
                err = jbd2_journal_get_undo_access(handle, bh);
                if (err)
-                       ext4_journal_abort_handle(where, __func__, bh,
+                       ext4_journal_abort_handle(where, line, __func__, bh,
                                                  handle, err);
        }
        return err;
 }
 
-int __ext4_journal_get_write_access(const char *where, handle_t *handle,
-                               struct buffer_head *bh)
+int __ext4_journal_get_write_access(const char *where, unsigned int line,
+                                   handle_t *handle, struct buffer_head *bh)
 {
        int err = 0;
 
        if (ext4_handle_valid(handle)) {
                err = jbd2_journal_get_write_access(handle, bh);
                if (err)
-                       ext4_journal_abort_handle(where, __func__, bh,
+                       ext4_journal_abort_handle(where, line, __func__, bh,
                                                  handle, err);
        }
        return err;
@@ -46,9 +46,9 @@ int __ext4_journal_get_write_access(const char *where, handle_t *handle,
  * If the handle isn't valid we're not journaling, but we still need to
  * call into ext4_journal_revoke() to put the buffer head.
  */
-int __ext4_forget(const char *where, handle_t *handle, int is_metadata,
-                 struct inode *inode, struct buffer_head *bh,
-                 ext4_fsblk_t blocknr)
+int __ext4_forget(const char *where, unsigned int line, handle_t *handle,
+                 int is_metadata, struct inode *inode,
+                 struct buffer_head *bh, ext4_fsblk_t blocknr)
 {
        int err;
 
@@ -79,8 +79,8 @@ int __ext4_forget(const char *where, handle_t *handle, int is_metadata,
                        BUFFER_TRACE(bh, "call jbd2_journal_forget");
                        err = jbd2_journal_forget(handle, bh);
                        if (err)
-                               ext4_journal_abort_handle(where, __func__, bh,
-                                                         handle, err);
+                               ext4_journal_abort_handle(where, line, __func__,
+                                                         bh, handle, err);
                        return err;
                }
                return 0;
@@ -92,15 +92,16 @@ int __ext4_forget(const char *where, handle_t *handle, int is_metadata,
        BUFFER_TRACE(bh, "call jbd2_journal_revoke");
        err = jbd2_journal_revoke(handle, blocknr, bh);
        if (err) {
-               ext4_journal_abort_handle(where, __func__, bh, handle, err);
-               ext4_abort(inode->i_sb, __func__,
+               ext4_journal_abort_handle(where, line, __func__,
+                                         bh, handle, err);
+               __ext4_abort(inode->i_sb, where, line,
                           "error %d when attempting revoke", err);
        }
        BUFFER_TRACE(bh, "exit");
        return err;
 }
 
-int __ext4_journal_get_create_access(const char *where,
+int __ext4_journal_get_create_access(const char *where, unsigned int line,
                                handle_t *handle, struct buffer_head *bh)
 {
        int err = 0;
@@ -108,22 +109,23 @@ int __ext4_journal_get_create_access(const char *where,
        if (ext4_handle_valid(handle)) {
                err = jbd2_journal_get_create_access(handle, bh);
                if (err)
-                       ext4_journal_abort_handle(where, __func__, bh,
-                                                 handle, err);
+                       ext4_journal_abort_handle(where, line, __func__,
+                                                 bh, handle, err);
        }
        return err;
 }
 
-int __ext4_handle_dirty_metadata(const char *where, handle_t *handle,
-                                struct inode *inode, struct buffer_head *bh)
+int __ext4_handle_dirty_metadata(const char *where, unsigned int line,
+                                handle_t *handle, struct inode *inode,
+                                struct buffer_head *bh)
 {
        int err = 0;
 
        if (ext4_handle_valid(handle)) {
                err = jbd2_journal_dirty_metadata(handle, bh);
                if (err)
-                       ext4_journal_abort_handle(where, __func__, bh,
-                                                 handle, err);
+                       ext4_journal_abort_handle(where, line, __func__,
+                                                 bh, handle, err);
        } else {
                if (inode)
                        mark_buffer_dirty_inode(bh, inode);
@@ -132,14 +134,33 @@ int __ext4_handle_dirty_metadata(const char *where, handle_t *handle,
                if (inode && inode_needs_sync(inode)) {
                        sync_dirty_buffer(bh);
                        if (buffer_req(bh) && !buffer_uptodate(bh)) {
-                               ext4_error(inode->i_sb,
-                                          "IO error syncing inode, "
-                                          "inode=%lu, block=%llu",
-                                          inode->i_ino,
-                                          (unsigned long long) bh->b_blocknr);
+                               struct ext4_super_block *es;
+
+                               es = EXT4_SB(inode->i_sb)->s_es;
+                               es->s_last_error_block =
+                                       cpu_to_le64(bh->b_blocknr);
+                               ext4_error_inode(inode, where, line,
+                                                bh->b_blocknr,
+                                       "IO error syncing itable block");
                                err = -EIO;
                        }
                }
        }
        return err;
 }
+
+int __ext4_handle_dirty_super(const char *where, unsigned int line,
+                             handle_t *handle, struct super_block *sb)
+{
+       struct buffer_head *bh = EXT4_SB(sb)->s_sbh;
+       int err = 0;
+
+       if (ext4_handle_valid(handle)) {
+               err = jbd2_journal_dirty_metadata(handle, bh);
+               if (err)
+                       ext4_journal_abort_handle(where, line, __func__,
+                                                 bh, handle, err);
+       } else
+               sb->s_dirt = 1;
+       return err;
+}