summaryrefslogtreecommitdiffstats
path: root/fs/gfs2/ops_address.c
diff options
context:
space:
mode:
authorBob Peterson <rpeterso@redhat.com>2007-09-14 09:27:59 -0500
committerSteven Whitehouse <swhiteho@redhat.com>2007-10-10 08:56:22 +0100
commit55c0c4ac0be144014651b19e77c9b77f367955de (patch)
treedbea7f24657f8e99f4ff94519cb4f24373930320 /fs/gfs2/ops_address.c
parentd66f8277f53407754f50ae6bada68f1b68d04d48 (diff)
downloadop-kernel-dev-55c0c4ac0be144014651b19e77c9b77f367955de.zip
op-kernel-dev-55c0c4ac0be144014651b19e77c9b77f367955de.tar.gz
[GFS2] GFS2: chmod hung - fix race in thread creation
The problem boiled down to a race between the gdlm_init_threads() function initializing thread1 and its setting of blist = 1. Essentially, "if (current == ls->thread1)" was checked by the thread before the thread creator set ls->thread1. Since thread1 is the only thread who is allowed to work on the blocking queue, and since neither thread thought it was thread1, no one was working on the queue. So everything just sat. This patch reuses the ls->async_lock spin_lock to fix the race, and it fixes the problem. I've done more than 2000 iterations of the loop that was recreating the failure and it seems to work. Signed-off-by: Bob Peterson <rpeterso@redhat.com> Signed-off-by: Steven Whitehouse <swhiteho@redhat.com> --
Diffstat (limited to 'fs/gfs2/ops_address.c')
0 files changed, 0 insertions, 0 deletions
OpenPOWER on IntegriCloud