diff options
author | Joel Becker <joel.becker@oracle.com> | 2007-02-06 18:45:39 -0500 |
---|---|---|
committer | Mark Fasheh <mark.fasheh@oracle.com> | 2007-07-10 20:19:46 -0400 |
commit | e6df3a663a5d1ee68aeae7f007197f272700d9cc (patch) | |
tree | e484382e0ae46553febd3dd56c0f8a9e882ec71b | |
parent | 16c6a4f24de2933b26477ad5dfb71f518220d641 (diff) |
ocfs2: Wake up a starting region if it gets killed in the background.
Tell o2cb_region_dev_write() to wake up if rmdir(2) happens on the
heartbeat region while it is starting up. Then o2hb_region_dev_write()
can check to see if it is alive and act accordingly. This prevents a hang
(not being woken) and a crash (if it's woken by a signal).
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
-rw-r--r-- | fs/ocfs2/cluster/heartbeat.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/fs/ocfs2/cluster/heartbeat.c b/fs/ocfs2/cluster/heartbeat.c index 2877d468f115..2bd7f788cf34 100644 --- a/fs/ocfs2/cluster/heartbeat.c +++ b/fs/ocfs2/cluster/heartbeat.c | |||
@@ -1335,6 +1335,7 @@ static ssize_t o2hb_region_dev_write(struct o2hb_region *reg, | |||
1335 | ret = wait_event_interruptible(o2hb_steady_queue, | 1335 | ret = wait_event_interruptible(o2hb_steady_queue, |
1336 | atomic_read(®->hr_steady_iterations) == 0); | 1336 | atomic_read(®->hr_steady_iterations) == 0); |
1337 | if (ret) { | 1337 | if (ret) { |
1338 | /* We got interrupted (hello ptrace!). Clean up */ | ||
1338 | spin_lock(&o2hb_live_lock); | 1339 | spin_lock(&o2hb_live_lock); |
1339 | hb_task = reg->hr_task; | 1340 | hb_task = reg->hr_task; |
1340 | reg->hr_task = NULL; | 1341 | reg->hr_task = NULL; |
@@ -1345,7 +1346,16 @@ static ssize_t o2hb_region_dev_write(struct o2hb_region *reg, | |||
1345 | goto out; | 1346 | goto out; |
1346 | } | 1347 | } |
1347 | 1348 | ||
1348 | ret = count; | 1349 | /* Ok, we were woken. Make sure it wasn't by drop_item() */ |
1350 | spin_lock(&o2hb_live_lock); | ||
1351 | hb_task = reg->hr_task; | ||
1352 | spin_unlock(&o2hb_live_lock); | ||
1353 | |||
1354 | if (hb_task) | ||
1355 | ret = count; | ||
1356 | else | ||
1357 | ret = -EIO; | ||
1358 | |||
1349 | out: | 1359 | out: |
1350 | if (filp) | 1360 | if (filp) |
1351 | fput(filp); | 1361 | fput(filp); |
@@ -1523,6 +1533,15 @@ static void o2hb_heartbeat_group_drop_item(struct config_group *group, | |||
1523 | if (hb_task) | 1533 | if (hb_task) |
1524 | kthread_stop(hb_task); | 1534 | kthread_stop(hb_task); |
1525 | 1535 | ||
1536 | /* | ||
1537 | * If we're racing a dev_write(), we need to wake them. They will | ||
1538 | * check reg->hr_task | ||
1539 | */ | ||
1540 | if (atomic_read(®->hr_steady_iterations) != 0) { | ||
1541 | atomic_set(®->hr_steady_iterations, 0); | ||
1542 | wake_up(&o2hb_steady_queue); | ||
1543 | } | ||
1544 | |||
1526 | config_item_put(item); | 1545 | config_item_put(item); |
1527 | } | 1546 | } |
1528 | 1547 | ||