From: Dave Chinner <dchinner@xxxxxxxxxx> To enable phase 6 parallelisation, we need to protect the bad inode list from concurrent modification and/or access. Wrap it with a mutex and clean up the nasty typedefs. Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> Signed-off-by: Gao Xiang <hsiangkao@xxxxxxxxxx> --- RESEND: - fix broken v3 due to rebasing repair/dir2.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/repair/dir2.c b/repair/dir2.c index b6a8a5c40ae4..c1d262fb1207 100644 --- a/repair/dir2.c +++ b/repair/dir2.c @@ -26,6 +26,7 @@ struct dir2_bad { }; static struct dir2_bad dir2_bad; +pthread_mutex_t dir2_bad_lock = PTHREAD_MUTEX_INITIALIZER; static void dir2_add_badlist( @@ -33,6 +34,7 @@ dir2_add_badlist( { xfs_ino_t *itab; + pthread_mutex_lock(&dir2_bad_lock); itab = realloc(dir2_bad.itab, (dir2_bad.nr + 1) * sizeof(xfs_ino_t)); if (!itab) { do_error( @@ -42,18 +44,25 @@ _("malloc failed (%zu bytes) dir2_add_badlist:ino %" PRIu64 "\n"), } itab[dir2_bad.nr++] = ino; dir2_bad.itab = itab; + pthread_mutex_unlock(&dir2_bad_lock); } bool dir2_is_badino( xfs_ino_t ino) { - unsigned int i; + unsigned int i; + bool ret = false; - for (i = 0; i < dir2_bad.nr; ++i) - if (dir2_bad.itab[i] == ino) - return true; - return false; + pthread_mutex_lock(&dir2_bad_lock); + for (i = 0; i < dir2_bad.nr; ++i) { + if (dir2_bad.itab[i] == ino) { + ret = true; + break; + } + } + pthread_mutex_unlock(&dir2_bad_lock); + return ret; } /* -- 2.20.1