[PATCH 07/12] repair: fix another ABBA deadlock in inode prefetching

Mark Tinguely tinguely at sgi.com
Fri Jan 13 12:51:45 CST 2012




> Index: xfsprogs-dev/repair/prefetch.c
> ===================================================================
> --- xfsprogs-dev.orig/repair/prefetch.c	2011-11-25 13:46:47.195999430 +0100
> +++ xfsprogs-dev/repair/prefetch.c	2011-11-25 13:50:41.264731371 +0100
> @@ -641,7 +641,18 @@ pf_queuing_worker(
>   		pftrace("queuing irec %p in AG %d, sem count = %d",
>   			irec, args->agno, i);
>   #endif
> -		sem_wait(&args->ra_count);
> +		err = sem_trywait(&args->ra_count);
> +		if (err == EAGAIN) {
> +			/*
> +			 * Kick the queue once we have reached the limit;
> +			 * without this the threads processing the inodes
> +			 * might get stuck on a buffer that has been locked
> +			 * and added to the I/O queue but is waiting for
> +			 * the thread to be woken.
> +			 */
> +			pf_start_io_workers(args);
> +			sem_wait(&args->ra_count);
> +		}
>
>   		num_inos = 0;
>   		bno = XFS_AGINO_TO_AGBNO(mp, cur_irec->ino_startnum);
>

Could the second sem_wait() also fail with EAGAIN?

Reviewed-by: Mark Tinguely <tinguely at sgi.com>




More information about the xfs mailing list