Re: [PATCH 1/2] ext4: journal all modifications in ext4_xattr_set_handle

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2009-11-06, at 15:35, Eric Sandeen wrote:
Eric Sandeen wrote:
ext4_xattr_set_handle() was modifying s_inode_size outside
of journaling constraints; this is one of the accesses that
was causing the crc errors in journal replay as seen in
kernel.org bugzilla #14354.

Oh, and for those who haven't been following the bug, big
thanks to Chris Mason for helping to look into this and coming
up with the debugging patch that made it obvious...

It would be great, IMHO, to have this debugging patch submitted to
the kernel also, and enabled under a CONFIG option.

Having a description of the side effects (i.e. page fault when a
read-only page is accessed) in the Kconfig description would be
needed, but at least if it is in the code it can be used by anyone
trying to track down the problem, rather than the perennial "where
are AKPM's buffer-head tracing patches, and how much work needs to
be done to update them for the current kernel".

I'd also be interested to see the "write shadow buffer to journal"
one-line patch that was discussed in the bug.

Signed-off-by: Eric Sandeen <sandeen@xxxxxxxxxx>
---
diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c
index fed5b01..0257019 100644
--- a/fs/ext4/xattr.c
+++ b/fs/ext4/xattr.c
@@ -988,6 +988,10 @@ ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index,
   if (error)
       goto cleanup;
+    error = ext4_journal_get_write_access(handle, is.iloc.bh);
+    if (error)
+        goto cleanup;
+
   if (EXT4_I(inode)->i_state & EXT4_STATE_NEW) {
       struct ext4_inode *raw_inode = ext4_raw_inode(&is.iloc);
       memset(raw_inode, 0, EXT4_SB(inode->i_sb)->s_inode_size);
@@ -1013,9 +1017,6 @@ ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index,
       if (flags & XATTR_CREATE)
           goto cleanup;
   }
-    error = ext4_journal_get_write_access(handle, is.iloc.bh);
-    if (error)
-        goto cleanup;
   if (!value) {
       if (!is.s.not_found)
           error = ext4_xattr_ibody_set(handle, inode, &i, &is);
--
To unsubscribe from this list: send the line "unsubscribe linux- ext4" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

--
To unsubscribe from this list: send the line "unsubscribe linux- ext4" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Cheers, Andreas
--
Andreas Dilger
Sr. Staff Engineer, Lustre Group
Sun Microsystems of Canada, Inc.

--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Reiser Filesystem Development]     [Ceph FS]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Linux FS]     [Yosemite National Park]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Device Mapper]     [Linux Media]

  Powered by Linux