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

Mark Tinguely
2012-01-13T18:51:47Z

> 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@sgi.com>