mirror of
https://git.yoctoproject.org/meta-ti
synced 2026-07-26 22:07:51 +00:00
2177f80076
Duplicate patches between PSP and 3.2.17 have been dropped from the 3.2.17 series Signed-off-by: Koen Kooi <koen@dominion.thruhere.net> Signed-off-by: Denys Dmytriyenko <denys@ti.com>
65 lines
2.2 KiB
Diff
65 lines
2.2 KiB
Diff
From ee9d8cc0c47d0095d5d27b81b7459fa534c56a67 Mon Sep 17 00:00:00 2001
|
|
From: Eric Sandeen <sandeen@redhat.com>
|
|
Date: Mon, 20 Feb 2012 23:06:18 -0500
|
|
Subject: [PATCH 36/56] ext4: avoid deadlock on sync-mounted FS w/o journal
|
|
|
|
commit c1bb05a657fb3d8c6179a4ef7980261fae4521d7 upstream.
|
|
|
|
Processes hang forever on a sync-mounted ext2 file system that
|
|
is mounted with the ext4 module (default in Fedora 16).
|
|
|
|
I can reproduce this reliably by mounting an ext2 partition with
|
|
"-o sync" and opening a new file an that partition with vim. vim
|
|
will hang in "D" state forever. The same happens on ext4 without
|
|
a journal.
|
|
|
|
I am attaching a small patch here that solves this issue for me.
|
|
In the sync mounted case without a journal,
|
|
ext4_handle_dirty_metadata() may call sync_dirty_buffer(), which
|
|
can't be called with buffer lock held.
|
|
|
|
Also move mb_cache_entry_release inside lock to avoid race
|
|
fixed previously by 8a2bfdcb ext[34]: EA block reference count racing fix
|
|
Note too that ext2 fixed this same problem in 2006 with
|
|
b2f49033 [PATCH] fix deadlock in ext2
|
|
|
|
Signed-off-by: Martin.Wilck@ts.fujitsu.com
|
|
[sandeen@redhat.com: move mb_cache_entry_release before unlock, edit commit msg]
|
|
Signed-off-by: Eric Sandeen <sandeen@redhat.com>
|
|
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
|
|
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
|
|
---
|
|
fs/ext4/xattr.c | 7 ++++---
|
|
1 files changed, 4 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c
|
|
index 93a00d8..4410ae7 100644
|
|
--- a/fs/ext4/xattr.c
|
|
+++ b/fs/ext4/xattr.c
|
|
@@ -487,18 +487,19 @@ ext4_xattr_release_block(handle_t *handle, struct inode *inode,
|
|
ext4_free_blocks(handle, inode, bh, 0, 1,
|
|
EXT4_FREE_BLOCKS_METADATA |
|
|
EXT4_FREE_BLOCKS_FORGET);
|
|
+ unlock_buffer(bh);
|
|
} else {
|
|
le32_add_cpu(&BHDR(bh)->h_refcount, -1);
|
|
+ if (ce)
|
|
+ mb_cache_entry_release(ce);
|
|
+ unlock_buffer(bh);
|
|
error = ext4_handle_dirty_metadata(handle, inode, bh);
|
|
if (IS_SYNC(inode))
|
|
ext4_handle_sync(handle);
|
|
dquot_free_block(inode, 1);
|
|
ea_bdebug(bh, "refcount now=%d; releasing",
|
|
le32_to_cpu(BHDR(bh)->h_refcount));
|
|
- if (ce)
|
|
- mb_cache_entry_release(ce);
|
|
}
|
|
- unlock_buffer(bh);
|
|
out:
|
|
ext4_std_error(inode->i_sb, error);
|
|
return;
|
|
--
|
|
1.7.7.6
|
|
|