[fstools, 2/4] fstools: block: support discard in block

m.storchak at gmail.com m.storchak at gmail.com
Wed Jul 23 06:19:17 PDT 2025


From: Maxim Storchak <m.storchak at gmail.com>

Intorduce a new fstab. at swap[] attribute, "discard" that can take values
- on, 1, yes -- to enable the default discard mode
- once, pages -- to enable the corresponding discard policy
- anythinge else -- to disable discard
Discard is enabled by default.

config swap
	option enabled '1'
	option label 'swap'
	option discard '1'

Signed-off-by: Maxim Storchak <m.storchak at gmail.com>
---
 block.c | 15 +++++++++++++++
 1 file changed, 15 insertions(+)

diff --git a/block.c b/block.c
index 4553ee2..c5e54fc 100644
--- a/block.c
+++ b/block.c
@@ -153,6 +153,7 @@ enum {
 	SWAP_LABEL,
 	SWAP_DEVICE,
 	SWAP_PRIO,
+	SWAP_DISCARD,
 	__SWAP_MAX
 };
 
@@ -162,6 +163,7 @@ static const struct blobmsg_policy swap_policy[__SWAP_MAX] = {
 	[SWAP_LABEL] = { .name = "label", .type = BLOBMSG_TYPE_STRING },
 	[SWAP_DEVICE] = { .name = "device", .type = BLOBMSG_TYPE_STRING },
 	[SWAP_PRIO] = { .name = "priority", .type = BLOBMSG_TYPE_INT32 },
+	[SWAP_DISCARD] = { .name = "discard", .type = BLOBMSG_TYPE_STRING },
 };
 
 static const struct uci_blob_param_list swap_attr_list = {
@@ -317,6 +319,7 @@ static int swap_add(struct uci_section *s)
 {
 	struct blob_attr *tb[__SWAP_MAX] = { 0 };
 	struct mount *m;
+	char *discard;
 
         blob_buf_init(&b, 0);
 	uci_to_blob(&b, s, &swap_attr_list);
@@ -331,11 +334,23 @@ static int swap_add(struct uci_section *s)
 	m->uuid = blobmsg_get_strdup(tb[SWAP_UUID]);
 	m->label = blobmsg_get_strdup(tb[SWAP_LABEL]);
 	m->device = blobmsg_get_basename(tb[SWAP_DEVICE]);
+	discard = blobmsg_get_strdup(tb[SWAP_DISCARD]);
+
 	if (tb[SWAP_PRIO])
 		m->prio = blobmsg_get_u32(tb[SWAP_PRIO]);
 	if (m->prio)
 		m->prio = ((m->prio << SWAP_FLAG_PRIO_SHIFT) & SWAP_FLAG_PRIO_MASK) | SWAP_FLAG_PREFER;
 
+	if (discard) {
+		if (!strcmp(discard, "yes") || !strcmp(discard, "1") || !strcmp(discard, "on"))
+			 m->prio |= SWAP_FLAG_DISCARD;
+		else if (!strcmp(discard, "pages"))
+			 m->prio |= (SWAP_FLAG_DISCARD | SWAP_FLAG_DISCARD_PAGES);
+		else if (!strcmp(discard, "once"))
+			 m->prio |= (SWAP_FLAG_DISCARD | SWAP_FLAG_DISCARD_ONCE);
+	} else
+		 m->prio |= SWAP_FLAG_DISCARD;
+
 	if ((!tb[SWAP_ENABLE]) || blobmsg_get_u32(tb[SWAP_ENABLE])) {
 		/* store complete swap path */
 		if (tb[SWAP_DEVICE])
-- 
2.50.0




More information about the openwrt-devel mailing list