Thread: [Jfs-discussion] [PATCH 3.9-stable] jfs: fix a couple races
Brought to you by:
blaschke-oss,
shaggyk
From: Dave K. <dav...@or...> - 2013-05-28 14:49:45
|
Commit 73aaa22d5ffb2630456bac2f9a4ed9b81d0d7271 upstream This fixes a real-world hang reported against the 3.9.3 kernel. From: Dave Kleikamp <dav...@or...> This patch fixes races uncovered by xfstests testcase 068. One race is the result of jfs_sync() trying to write a sync point to the journal after it has been frozen (or possibly in the process). Since freezing sync's the journal, there is no need to write a sync point so we simply want to return. The second involves jfs_write_inode() being called on a deleted inode. It calls jfs_flush_journal which is held up by the jfs_commit thread doing the final iput on the same deleted inode, which itself is waiting for the I_SYNC flag to be cleared. jfs_write_inode need not do anything when i_nlink is zero, which is the easy fix. Reported-by: Michael L. Semon <mls...@gm...> Signed-off-by: Dave Kleikamp <dav...@or...> --- fs/jfs/inode.c | 2 +- fs/jfs/jfs_logmgr.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c index b7dc47b..77554b6 100644 --- a/fs/jfs/inode.c +++ b/fs/jfs/inode.c @@ -125,7 +125,7 @@ int jfs_write_inode(struct inode *inode, struct writeback_control *wbc) { int wait = wbc->sync_mode == WB_SYNC_ALL; - if (test_cflag(COMMIT_Nolink, inode)) + if (inode->i_nlink == 0) return 0; /* * If COMMIT_DIRTY is not set, the inode isn't really dirty. diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c index 2eb952c..cbe48ea 100644 --- a/fs/jfs/jfs_logmgr.c +++ b/fs/jfs/jfs_logmgr.c @@ -1058,7 +1058,8 @@ static int lmLogSync(struct jfs_log * log, int hard_sync) */ void jfs_syncpt(struct jfs_log *log, int hard_sync) { LOG_LOCK(log); - lmLogSync(log, hard_sync); + if (!test_bit(log_QUIESCE, &log->flag)) + lmLogSync(log, hard_sync); LOG_UNLOCK(log); } -- 1.8.3 |
From: Luis H. <lui...@ca...> - 2013-05-29 14:59:43
|
Dave Kleikamp <dav...@or...> writes: > Commit 73aaa22d5ffb2630456bac2f9a4ed9b81d0d7271 upstream > > This fixes a real-world hang reported against the 3.9.3 kernel. The races described in the commit seem to be present in all the other stable kernels. Could you please confirm this is also applicable for older kernels? Cheers, -- Luis > > From: Dave Kleikamp <dav...@or...> > > This patch fixes races uncovered by xfstests testcase 068. > > One race is the result of jfs_sync() trying to write a sync point to the > journal after it has been frozen (or possibly in the process). Since > freezing sync's the journal, there is no need to write a sync point so > we simply want to return. > > The second involves jfs_write_inode() being called on a deleted inode. > It calls jfs_flush_journal which is held up by the jfs_commit thread > doing the final iput on the same deleted inode, which itself is > waiting for the I_SYNC flag to be cleared. jfs_write_inode need not > do anything when i_nlink is zero, which is the easy fix. > > Reported-by: Michael L. Semon <mls...@gm...> > Signed-off-by: Dave Kleikamp <dav...@or...> > --- > fs/jfs/inode.c | 2 +- > fs/jfs/jfs_logmgr.c | 3 ++- > 2 files changed, 3 insertions(+), 2 deletions(-) > > diff --git a/fs/jfs/inode.c b/fs/jfs/inode.c > index b7dc47b..77554b6 100644 > --- a/fs/jfs/inode.c > +++ b/fs/jfs/inode.c > @@ -125,7 +125,7 @@ int jfs_write_inode(struct inode *inode, struct writeback_control *wbc) > { > int wait = wbc->sync_mode == WB_SYNC_ALL; > > - if (test_cflag(COMMIT_Nolink, inode)) > + if (inode->i_nlink == 0) > return 0; > /* > * If COMMIT_DIRTY is not set, the inode isn't really dirty. > diff --git a/fs/jfs/jfs_logmgr.c b/fs/jfs/jfs_logmgr.c > index 2eb952c..cbe48ea 100644 > --- a/fs/jfs/jfs_logmgr.c > +++ b/fs/jfs/jfs_logmgr.c > @@ -1058,7 +1058,8 @@ static int lmLogSync(struct jfs_log * log, int hard_sync) > */ > void jfs_syncpt(struct jfs_log *log, int hard_sync) > { LOG_LOCK(log); > - lmLogSync(log, hard_sync); > + if (!test_bit(log_QUIESCE, &log->flag)) > + lmLogSync(log, hard_sync); > LOG_UNLOCK(log); > } |
From: Dave K. <dav...@or...> - 2013-05-29 15:48:14
|
On 05/29/2013 09:59 AM, Luis Henriques wrote: > Dave Kleikamp <dav...@or...> writes: > >> Commit 73aaa22d5ffb2630456bac2f9a4ed9b81d0d7271 upstream >> >> This fixes a real-world hang reported against the 3.9.3 kernel. > > The races described in the commit seem to be present in all the other > stable kernels. Could you please confirm this is also applicable for > older kernels? This patch is applicable and safe for older kernels as well. As the problem has only been seen recently, I suspect that it might be triggered by the writeback changes that were merged into 3.5 (commit 90324cc1) but I'm not certain of that. Thanks, Shaggy |
From: Luis H. <lui...@ca...> - 2013-05-29 16:15:32
|
Dave Kleikamp <dav...@or...> writes: > On 05/29/2013 09:59 AM, Luis Henriques wrote: >> Dave Kleikamp <dav...@or...> writes: >> >>> Commit 73aaa22d5ffb2630456bac2f9a4ed9b81d0d7271 upstream >>> >>> This fixes a real-world hang reported against the 3.9.3 kernel. >> >> The races described in the commit seem to be present in all the other >> stable kernels. Could you please confirm this is also applicable for >> older kernels? > > This patch is applicable and safe for older kernels as well. As the > problem has only been seen recently, I suspect that it might be > triggered by the writeback changes that were merged into 3.5 (commit > 90324cc1) but I'm not certain of that. Thanks for confirming that. I'll queue it for the 3.5 kernel. Cheers, -- Luis |
From: Ben H. <be...@de...> - 2013-06-13 02:42:33
Attachments:
signature.asc
|
On Wed, 2013-05-29 at 10:48 -0500, Dave Kleikamp wrote: > On 05/29/2013 09:59 AM, Luis Henriques wrote: > > Dave Kleikamp <dav...@or...> writes: > > > >> Commit 73aaa22d5ffb2630456bac2f9a4ed9b81d0d7271 upstream > >> > >> This fixes a real-world hang reported against the 3.9.3 kernel. > > > > The races described in the commit seem to be present in all the other > > stable kernels. Could you please confirm this is also applicable for > > older kernels? > > This patch is applicable and safe for older kernels as well. As the > problem has only been seen recently, I suspect that it might be > triggered by the writeback changes that were merged into 3.5 (commit > 90324cc1) but I'm not certain of that. I've queued this up for 3.2, thanks. Ben. -- Ben Hutchings friends: People who know you well, but like you anyway. |