aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@redhat.com>2013-12-20 18:09:02 -0500
committerMike Snitzer <snitzer@redhat.com>2014-01-07 10:14:31 -0500
commit6d16202be7bca169771e2cec140a6c6c53ce9df5 (patch)
tree466546ddd4dea5779b6493de14126f5795bfac66
parent787a996cb251e20f560e1615cd85693562541a7a (diff)
dm thin: eliminate the no_free_space flag
The pool's error_if_no_space flag can easily serve the same purpose that no_free_space did, namely: control whether handle_unserviceable_bio() will error a bio or requeue it. This is cleaner since error_if_no_space is established when the pool's features are processed during table load. So it avoids managing the no_free_space flag by taking the pool's spinlock. Signed-off-by: Mike Snitzer <snitzer@redhat.com>
-rw-r--r--drivers/md/dm-thin.c26
1 files changed, 4 insertions, 22 deletions
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
index 075c39edea21..a55c5ebb4031 100644
--- a/drivers/md/dm-thin.c
+++ b/drivers/md/dm-thin.c
@@ -165,7 +165,6 @@ struct pool {
165 165
166 struct pool_features pf; 166 struct pool_features pf;
167 bool low_water_triggered:1; /* A dm event has been sent */ 167 bool low_water_triggered:1; /* A dm event has been sent */
168 bool no_free_space:1; /* bios will be requeued if set */
169 168
170 struct dm_bio_prison *prison; 169 struct dm_bio_prison *prison;
171 struct dm_kcopyd_client *copier; 170 struct dm_kcopyd_client *copier;
@@ -991,10 +990,10 @@ static void handle_unserviceable_bio(struct pool *pool, struct bio *bio)
991 */ 990 */
992 WARN_ON_ONCE(get_pool_mode(pool) != PM_READ_ONLY); 991 WARN_ON_ONCE(get_pool_mode(pool) != PM_READ_ONLY);
993 992
994 if (pool->no_free_space) 993 if (pool->pf.error_if_no_space)
995 retry_on_resume(bio);
996 else
997 bio_io_error(bio); 994 bio_io_error(bio);
995 else
996 retry_on_resume(bio);
998} 997}
999 998
1000static void retry_bios_on_resume(struct pool *pool, struct dm_bio_prison_cell *cell) 999static void retry_bios_on_resume(struct pool *pool, struct dm_bio_prison_cell *cell)
@@ -1437,18 +1436,6 @@ static void set_pool_mode(struct pool *pool, enum pool_mode mode)
1437 } 1436 }
1438} 1437}
1439 1438
1440static void set_no_free_space(struct pool *pool)
1441{
1442 unsigned long flags;
1443
1444 if (pool->pf.error_if_no_space)
1445 return;
1446
1447 spin_lock_irqsave(&pool->lock, flags);
1448 pool->no_free_space = true;
1449 spin_unlock_irqrestore(&pool->lock, flags);
1450}
1451
1452/* 1439/*
1453 * Rather than calling set_pool_mode directly, use these which describe the 1440 * Rather than calling set_pool_mode directly, use these which describe the
1454 * reason for mode degradation. 1441 * reason for mode degradation.
@@ -1457,7 +1444,6 @@ static void out_of_data_space(struct pool *pool)
1457{ 1444{
1458 DMERR_LIMIT("%s: no free data space available.", 1445 DMERR_LIMIT("%s: no free data space available.",
1459 dm_device_name(pool->pool_md)); 1446 dm_device_name(pool->pool_md));
1460 set_no_free_space(pool);
1461 set_pool_mode(pool, PM_READ_ONLY); 1447 set_pool_mode(pool, PM_READ_ONLY);
1462} 1448}
1463 1449
@@ -1470,11 +1456,9 @@ static void metadata_operation_failed(struct pool *pool, const char *op, int r)
1470 1456
1471 if (r == -ENOSPC && 1457 if (r == -ENOSPC &&
1472 !dm_pool_get_free_metadata_block_count(pool->pmd, &free_blocks) && 1458 !dm_pool_get_free_metadata_block_count(pool->pmd, &free_blocks) &&
1473 !free_blocks) { 1459 !free_blocks)
1474 DMERR_LIMIT("%s: no free metadata space available.", 1460 DMERR_LIMIT("%s: no free metadata space available.",
1475 dm_device_name(pool->pool_md)); 1461 dm_device_name(pool->pool_md));
1476 set_no_free_space(pool);
1477 }
1478 1462
1479 set_pool_mode(pool, PM_READ_ONLY); 1463 set_pool_mode(pool, PM_READ_ONLY);
1480} 1464}
@@ -1819,7 +1803,6 @@ static struct pool *pool_create(struct mapped_device *pool_md,
1819 INIT_LIST_HEAD(&pool->prepared_mappings); 1803 INIT_LIST_HEAD(&pool->prepared_mappings);
1820 INIT_LIST_HEAD(&pool->prepared_discards); 1804 INIT_LIST_HEAD(&pool->prepared_discards);
1821 pool->low_water_triggered = false; 1805 pool->low_water_triggered = false;
1822 pool->no_free_space = false;
1823 bio_list_init(&pool->retry_on_resume_list); 1806 bio_list_init(&pool->retry_on_resume_list);
1824 1807
1825 pool->shared_read_ds = dm_deferred_set_create(); 1808 pool->shared_read_ds = dm_deferred_set_create();
@@ -2346,7 +2329,6 @@ static void pool_resume(struct dm_target *ti)
2346 2329
2347 spin_lock_irqsave(&pool->lock, flags); 2330 spin_lock_irqsave(&pool->lock, flags);
2348 pool->low_water_triggered = false; 2331 pool->low_water_triggered = false;
2349 pool->no_free_space = false;
2350 __requeue_bios(pool); 2332 __requeue_bios(pool);
2351 spin_unlock_irqrestore(&pool->lock, flags); 2333 spin_unlock_irqrestore(&pool->lock, flags);
2352 2334