Dave Kleikamp <[email protected]> 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 <[email protected]>
>
> 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 <[email protected]>
> Signed-off-by: Dave Kleikamp <[email protected]>
> ---
>  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);
>  }
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to