Merge tag 'dm-3.4-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/agk/linux-dm
Pull a dm fix from Alasdair G Kergon: "A fix to the thin provisioning userspace interface." * tag 'dm-3.4-fixes-2' of git://git.kernel.org/pub/scm/linux/kernel/git/agk/linux-dm: dm thin: fix table output when pool target disables discard passdown internally
This commit is contained in:
@@ -1632,6 +1632,21 @@ static int bind_control_target(struct pool *pool, struct dm_target *ti)
|
|||||||
pool->low_water_blocks = pt->low_water_blocks;
|
pool->low_water_blocks = pt->low_water_blocks;
|
||||||
pool->pf = pt->pf;
|
pool->pf = pt->pf;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If discard_passdown was enabled verify that the data device
|
||||||
|
* supports discards. Disable discard_passdown if not; otherwise
|
||||||
|
* -EOPNOTSUPP will be returned.
|
||||||
|
*/
|
||||||
|
if (pt->pf.discard_passdown) {
|
||||||
|
struct request_queue *q = bdev_get_queue(pt->data_dev->bdev);
|
||||||
|
if (!q || !blk_queue_discard(q)) {
|
||||||
|
char buf[BDEVNAME_SIZE];
|
||||||
|
DMWARN("Discard unsupported by data device (%s): Disabling discard passdown.",
|
||||||
|
bdevname(pt->data_dev->bdev, buf));
|
||||||
|
pool->pf.discard_passdown = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1988,19 +2003,6 @@ static int pool_ctr(struct dm_target *ti, unsigned argc, char **argv)
|
|||||||
goto out_flags_changed;
|
goto out_flags_changed;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* If discard_passdown was enabled verify that the data device
|
|
||||||
* supports discards. Disable discard_passdown if not; otherwise
|
|
||||||
* -EOPNOTSUPP will be returned.
|
|
||||||
*/
|
|
||||||
if (pf.discard_passdown) {
|
|
||||||
struct request_queue *q = bdev_get_queue(data_dev->bdev);
|
|
||||||
if (!q || !blk_queue_discard(q)) {
|
|
||||||
DMWARN("Discard unsupported by data device: Disabling discard passdown.");
|
|
||||||
pf.discard_passdown = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pt->pool = pool;
|
pt->pool = pool;
|
||||||
pt->ti = ti;
|
pt->ti = ti;
|
||||||
pt->metadata_dev = metadata_dev;
|
pt->metadata_dev = metadata_dev;
|
||||||
@@ -2385,7 +2387,7 @@ static int pool_status(struct dm_target *ti, status_type_t type,
|
|||||||
(unsigned long long)pt->low_water_blocks);
|
(unsigned long long)pt->low_water_blocks);
|
||||||
|
|
||||||
count = !pool->pf.zero_new_blocks + !pool->pf.discard_enabled +
|
count = !pool->pf.zero_new_blocks + !pool->pf.discard_enabled +
|
||||||
!pool->pf.discard_passdown;
|
!pt->pf.discard_passdown;
|
||||||
DMEMIT("%u ", count);
|
DMEMIT("%u ", count);
|
||||||
|
|
||||||
if (!pool->pf.zero_new_blocks)
|
if (!pool->pf.zero_new_blocks)
|
||||||
@@ -2394,7 +2396,7 @@ static int pool_status(struct dm_target *ti, status_type_t type,
|
|||||||
if (!pool->pf.discard_enabled)
|
if (!pool->pf.discard_enabled)
|
||||||
DMEMIT("ignore_discard ");
|
DMEMIT("ignore_discard ");
|
||||||
|
|
||||||
if (!pool->pf.discard_passdown)
|
if (!pt->pf.discard_passdown)
|
||||||
DMEMIT("no_discard_passdown ");
|
DMEMIT("no_discard_passdown ");
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user