Skip to content

Commit 63c8ecb

Browse files
Andy Groversnitm
authored andcommitted
dm thin: include metadata_low_watermark threshold in pool status
The metadata low watermark threshold is set by the kernel. But the kernel depends on userspace to extend the thinpool metadata device when the threshold is crossed. Since the metadata low watermark threshold is not visible to userspace, upon receiving an event, userspace cannot tell that the kernel wants the metadata device extended, instead of some other eventing condition. Making it visible (but not settable) enables userspace to affirmatively know the kernel is asking for a metadata device extension, by comparing metadata_low_watermark against nr_free_blocks_metadata, also reported in status. Current solutions like dmeventd have their own thresholds for extending the data and metadata devices, and both devices are checked against their thresholds on each event. This lessens the value of the kernel-set threshold, since userspace will either extend the metadata device sooner, when receiving another event; or will receive the metadata lowater event and do nothing, if dmeventd's threshold is less than the kernel's. (This second case is dangerous. The metadata lowater event will not be re-sent, so no further event will be generated before the metadata device is out if space, unless some other event causes userspace to recheck its thresholds.) Signed-off-by: Andy Grover <agrover@redhat.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com>
1 parent 9ff07e7 commit 63c8ecb

File tree

2 files changed

+10
-3
lines changed

2 files changed

+10
-3
lines changed

Documentation/device-mapper/thin-provisioning.txt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ ii) Status
281281
<transaction id> <used metadata blocks>/<total metadata blocks>
282282
<used data blocks>/<total data blocks> <held metadata root>
283283
ro|rw|out_of_data_space [no_]discard_passdown [error|queue]_if_no_space
284-
needs_check|-
284+
needs_check|- metadata_low_watermark
285285

286286
transaction id:
287287
A 64-bit number used by userspace to help synchronise with metadata
@@ -328,6 +328,11 @@ ii) Status
328328
thin-pool can be made fully operational again. '-' indicates
329329
needs_check is not set.
330330

331+
metadata_low_watermark:
332+
Value of metadata low watermark in blocks. The kernel sets this
333+
value internally but userspace needs to know this value to
334+
determine if an event was caused by crossing this threshold.
335+
331336
iii) Messages
332337

333338
create_thin <dev id>

drivers/md/dm-thin.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3890,6 +3890,8 @@ static void pool_status(struct dm_target *ti, status_type_t type,
38903890
else
38913891
DMEMIT("- ");
38923892

3893+
DMEMIT("%llu ", (unsigned long long)calc_metadata_threshold(pt));
3894+
38933895
break;
38943896

38953897
case STATUSTYPE_TABLE:
@@ -3979,7 +3981,7 @@ static struct target_type pool_target = {
39793981
.name = "thin-pool",
39803982
.features = DM_TARGET_SINGLETON | DM_TARGET_ALWAYS_WRITEABLE |
39813983
DM_TARGET_IMMUTABLE,
3982-
.version = {1, 19, 0},
3984+
.version = {1, 20, 0},
39833985
.module = THIS_MODULE,
39843986
.ctr = pool_ctr,
39853987
.dtr = pool_dtr,
@@ -4353,7 +4355,7 @@ static void thin_io_hints(struct dm_target *ti, struct queue_limits *limits)
43534355

43544356
static struct target_type thin_target = {
43554357
.name = "thin",
4356-
.version = {1, 19, 0},
4358+
.version = {1, 20, 0},
43574359
.module = THIS_MODULE,
43584360
.ctr = thin_ctr,
43594361
.dtr = thin_dtr,

0 commit comments

Comments
 (0)