Re: [PATCH 3.9-stable] jfs: fix a couple races

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

 



Dave Kleikamp <dave.kleikamp@xxxxxxxxxx> 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 <dave.kleikamp@xxxxxxxxxx>
>
> 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 <mlsemon35@xxxxxxxxx>
> Signed-off-by: Dave Kleikamp <dave.kleikamp@xxxxxxxxxx>
> ---
>  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 majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]