aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorMike Snitzer <snitzer@redhat.com>2012-09-26 18:45:46 -0400
committerAlasdair G Kergon <agk@redhat.com>2012-09-26 18:45:46 -0400
commit9bc142dd755d360c08a91ecb107d218787a2e9db (patch)
treeb704174c6d6d3fdf55484fc85bd29ff37808b109 /drivers/md
parent3ae706561637331aa578e52bb89ecbba5edcb7a9 (diff)
dm thin: tidy discard support
A little thin discard code refactoring to make the next patch (dm thin: fix discard support for data devices) more readable. Pull out a couple of functions (and uses bools instead of unsigned for features). No functional changes. Signed-off-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Joe Thornber <ejt@redhat.com> Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/dm-thin.c64
1 files changed, 39 insertions, 25 deletions
diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
index d4209231069d..e99f4134dbd7 100644
--- a/drivers/md/dm-thin.c
+++ b/drivers/md/dm-thin.c
@@ -509,9 +509,9 @@ enum pool_mode {
509struct pool_features { 509struct pool_features {
510 enum pool_mode mode; 510 enum pool_mode mode;
511 511
512 unsigned zero_new_blocks:1; 512 bool zero_new_blocks:1;
513 unsigned discard_enabled:1; 513 bool discard_enabled:1;
514 unsigned discard_passdown:1; 514 bool discard_passdown:1;
515}; 515};
516 516
517struct thin_c; 517struct thin_c;
@@ -1839,6 +1839,32 @@ static void __requeue_bios(struct pool *pool)
1839/*---------------------------------------------------------------- 1839/*----------------------------------------------------------------
1840 * Binding of control targets to a pool object 1840 * Binding of control targets to a pool object
1841 *--------------------------------------------------------------*/ 1841 *--------------------------------------------------------------*/
1842static bool data_dev_supports_discard(struct pool_c *pt)
1843{
1844 struct request_queue *q = bdev_get_queue(pt->data_dev->bdev);
1845
1846 return q && blk_queue_discard(q);
1847}
1848
1849/*
1850 * If discard_passdown was enabled verify that the data device
1851 * supports discards. Disable discard_passdown if not; otherwise
1852 * -EOPNOTSUPP will be returned.
1853 */
1854static void disable_passdown_if_not_supported(struct pool_c *pt,
1855 struct pool_features *pf)
1856{
1857 char buf[BDEVNAME_SIZE];
1858
1859 if (!pf->discard_passdown || data_dev_supports_discard(pt))
1860 return;
1861
1862 DMWARN("Discard unsupported by data device (%s): Disabling discard passdown.",
1863 bdevname(pt->data_dev->bdev, buf));
1864
1865 pf->discard_passdown = false;
1866}
1867
1842static int bind_control_target(struct pool *pool, struct dm_target *ti) 1868static int bind_control_target(struct pool *pool, struct dm_target *ti)
1843{ 1869{
1844 struct pool_c *pt = ti->private; 1870 struct pool_c *pt = ti->private;
@@ -1855,23 +1881,9 @@ static int bind_control_target(struct pool *pool, struct dm_target *ti)
1855 pool->ti = ti; 1881 pool->ti = ti;
1856 pool->low_water_blocks = pt->low_water_blocks; 1882 pool->low_water_blocks = pt->low_water_blocks;
1857 pool->pf = pt->pf; 1883 pool->pf = pt->pf;
1858 set_pool_mode(pool, new_mode);
1859 1884
1860 /* 1885 disable_passdown_if_not_supported(pt, &pool->pf);
1861 * If discard_passdown was enabled verify that the data device 1886 set_pool_mode(pool, new_mode);
1862 * supports discards. Disable discard_passdown if not; otherwise
1863 * -EOPNOTSUPP will be returned.
1864 */
1865 /* FIXME: pull this out into a sep fn. */
1866 if (pt->pf.discard_passdown) {
1867 struct request_queue *q = bdev_get_queue(pt->data_dev->bdev);
1868 if (!q || !blk_queue_discard(q)) {
1869 char buf[BDEVNAME_SIZE];
1870 DMWARN("Discard unsupported by data device (%s): Disabling discard passdown.",
1871 bdevname(pt->data_dev->bdev, buf));
1872 pool->pf.discard_passdown = 0;
1873 }
1874 }
1875 1887
1876 return 0; 1888 return 0;
1877} 1889}
@@ -1889,9 +1901,9 @@ static void unbind_control_target(struct pool *pool, struct dm_target *ti)
1889static void pool_features_init(struct pool_features *pf) 1901static void pool_features_init(struct pool_features *pf)
1890{ 1902{
1891 pf->mode = PM_WRITE; 1903 pf->mode = PM_WRITE;
1892 pf->zero_new_blocks = 1; 1904 pf->zero_new_blocks = true;
1893 pf->discard_enabled = 1; 1905 pf->discard_enabled = true;
1894 pf->discard_passdown = 1; 1906 pf->discard_passdown = true;
1895} 1907}
1896 1908
1897static void __pool_destroy(struct pool *pool) 1909static void __pool_destroy(struct pool *pool)
@@ -2119,13 +2131,13 @@ static int parse_pool_features(struct dm_arg_set *as, struct pool_features *pf,
2119 argc--; 2131 argc--;
2120 2132
2121 if (!strcasecmp(arg_name, "skip_block_zeroing")) 2133 if (!strcasecmp(arg_name, "skip_block_zeroing"))
2122 pf->zero_new_blocks = 0; 2134 pf->zero_new_blocks = false;
2123 2135
2124 else if (!strcasecmp(arg_name, "ignore_discard")) 2136 else if (!strcasecmp(arg_name, "ignore_discard"))
2125 pf->discard_enabled = 0; 2137 pf->discard_enabled = false;
2126 2138
2127 else if (!strcasecmp(arg_name, "no_discard_passdown")) 2139 else if (!strcasecmp(arg_name, "no_discard_passdown"))
2128 pf->discard_passdown = 0; 2140 pf->discard_passdown = false;
2129 2141
2130 else if (!strcasecmp(arg_name, "read_only")) 2142 else if (!strcasecmp(arg_name, "read_only"))
2131 pf->mode = PM_READ_ONLY; 2143 pf->mode = PM_READ_ONLY;
@@ -2261,6 +2273,7 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv)
2261 pt->low_water_blocks = low_water_blocks; 2273 pt->low_water_blocks = low_water_blocks;
2262 pt->pf = pf; 2274 pt->pf = pf;
2263 ti->num_flush_requests = 1; 2275 ti->num_flush_requests = 1;
2276
2264 /* 2277 /*
2265 * Only need to enable discards if the pool should pass 2278 * Only need to enable discards if the pool should pass
2266 * them down to the data device. The thin device's discard 2279 * them down to the data device. The thin device's discard
@@ -2268,6 +2281,7 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv)
2268 */ 2281 */
2269 if (pf.discard_enabled && pf.discard_passdown) { 2282 if (pf.discard_enabled && pf.discard_passdown) {
2270 ti->num_discard_requests = 1; 2283 ti->num_discard_requests = 1;
2284
2271 /* 2285 /*
2272 * Setting 'discards_supported' circumvents the normal 2286 * Setting 'discards_supported' circumvents the normal
2273 * stacking of discard limits (this keeps the pool and 2287 * stacking of discard limits (this keeps the pool and