[dm-devel] [PATCH] dm-thin: stop no_space_timeout worker before switch to write-mode

Hou Tao houtao1 at huawei.com
Thu Aug 2 08:18:24 UTC 2018


Now both check_for_space() and do_no_space_timeout() will read & write
error_if_no_space in pool->pf. If these functions run concurrently as
shown in the following case, the error_if_no_space feature requested
by user may get lost.

precondition:
    * error_if_no_space = 0
    * Out-of-Data-Space occurs
    * no_space_timeout worker has been queued

CPU 0:                          CPU 1:
// delete a thin device
process_delete_mesg()
// inovked by commit()
set_pool_mode(pool, PM_WRITE)
    pool->pf.error_if_no_space = \
     pt->requested_pf.error_if_no_space

				// timeout
				do_no_space_timeout
				    // the user configuration is lost
				    pool->pf.error_if_no_space = true
    pool->pf.mode = new_mode

Fix it by stopping no_space_timeout worker before switching to write mode.

Signed-off-by: Hou Tao <houtao1 at huawei.com>
---
 drivers/md/dm-thin.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
index b900723bbd0f..c6da4afc16cf 100644
--- a/drivers/md/dm-thin.c
+++ b/drivers/md/dm-thin.c
@@ -1401,6 +1401,7 @@ static void check_for_space(struct pool *pool)
 		return;
 
 	if (nr_free) {
+		cancel_delayed_work_sync(&pool->no_space_timeout);
 		set_pool_mode(pool, PM_WRITE);
 		requeue_bios(pool);
 	}
-- 
2.16.2.dirty




More information about the dm-devel mailing list