From: Ahmad Fatoum <a.fatoum@barebox.org>
To: barebox@lists.infradead.org
Cc: Ahmad Fatoum <a.fatoum@barebox.org>
Subject: [PATCH 01/10] tftp: centralize 2 sec d_revalidate optimization to new netfs lib
Date: Fri, 6 Jun 2025 10:58:04 +0200 [thread overview]
Message-ID: <20250606085813.2183260-2-a.fatoum@barebox.org> (raw)
In-Reply-To: <20250606085813.2183260-1-a.fatoum@barebox.org>
The logic of dentries expiring after 2 seconds can be useful elsewhere
as well, so factor this out as seed for a new netfs lib that is going to
be used for 9pfs as well.
Signed-off-by: Ahmad Fatoum <a.fatoum@barebox.org>
---
fs/Kconfig | 4 +++
fs/Makefile | 1 +
fs/netfs.c | 25 ++++++++++++++
fs/tftp.c | 35 +++++--------------
include/linux/netfs.h | 78 +++++++++++++++++++++++++++++++++++++++++++
5 files changed, 116 insertions(+), 27 deletions(-)
create mode 100644 fs/netfs.c
create mode 100644 include/linux/netfs.h
diff --git a/fs/Kconfig b/fs/Kconfig
index 01ac3040438d..f94488e643bf 100644
--- a/fs/Kconfig
+++ b/fs/Kconfig
@@ -19,6 +19,9 @@ config FS_WRITABLE
invisible option selected by filesystem drivers that can
write and are not fully read-only.
+config NETFS_SUPPORT
+ bool
+
if FS_LEGACY
comment "Some selected filesystems still use the legacy FS API."
comment "Consider updating them."
@@ -51,6 +54,7 @@ config FS_TFTP
prompt "tftp support"
depends on NET
select FS_WRITABLE
+ select NETFS_SUPPORT
config FS_TFTP_MAX_WINDOW_SIZE
int
diff --git a/fs/Makefile b/fs/Makefile
index 20a26a16c5ab..b6a44ff82a38 100644
--- a/fs/Makefile
+++ b/fs/Makefile
@@ -8,6 +8,7 @@ obj-$(CONFIG_FS_LEGACY) += legacy.o
obj-$(CONFIG_FS_DEVFS) += devfs.o
obj-pbl-$(CONFIG_FS_FAT) += fat/
obj-y += fs.o libfs.o
+obj-$(CONFIG_NETFS_SUPPORT) += netfs.o
obj-$(CONFIG_FS_JFFS2) += jffs2/
obj-$(CONFIG_FS_UBIFS) += ubifs/
obj-$(CONFIG_FS_TFTP) += tftp.o
diff --git a/fs/netfs.c b/fs/netfs.c
new file mode 100644
index 000000000000..446377130d61
--- /dev/null
+++ b/fs/netfs.c
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <linux/dcache.h>
+#include <clock.h>
+#include <linux/netfs.h>
+
+
+static int netfs_lookup_revalidate(struct dentry *dentry, unsigned int flags)
+{
+ struct netfs_inode *node;
+
+ if (!dentry->d_inode)
+ return 0;
+
+ node = netfs_inode(dentry->d_inode);
+
+ if (is_timeout(node->time, NETFS_INODE_VALID_TIME))
+ return 0;
+
+ return 1;
+}
+
+const struct dentry_operations netfs_dentry_operations_timed = {
+ .d_revalidate = netfs_lookup_revalidate,
+};
diff --git a/fs/tftp.c b/fs/tftp.c
index cf91f66ed88b..5cb71431eb49 100644
--- a/fs/tftp.c
+++ b/fs/tftp.c
@@ -35,6 +35,7 @@
#include <kfifo.h>
#include <parseopt.h>
#include <linux/sizes.h>
+#include <linux/netfs.h>
#include "tftp-selftest.h"
@@ -131,13 +132,12 @@ struct tftp_priv {
};
struct tftp_inode {
- struct inode inode;
- u64 time;
+ struct netfs_inode netfs_node;
};
static struct tftp_inode *to_tftp_inode(struct inode *inode)
{
- return container_of(inode, struct tftp_inode, inode);
+ return container_of(inode, struct tftp_inode, netfs_node.inode);
}
static inline bool is_block_before(uint16_t a, uint16_t b)
@@ -957,12 +957,12 @@ static struct inode *tftp_get_inode(struct super_block *sb, const struct inode *
if (!inode)
return NULL;
- node = to_tftp_inode(inode);
- node->time = get_time_ns();
-
inode->i_ino = get_next_ino();
inode->i_mode = mode;
+ node = to_tftp_inode(inode);
+ netfs_inode_init(&node->netfs_node);
+
switch (mode & S_IFMT) {
default:
return NULL;
@@ -1040,7 +1040,7 @@ static struct inode *tftp_alloc_inode(struct super_block *sb)
if (!node)
return NULL;
- return &node->inode;
+ return &node->netfs_node.inode;
}
static void tftp_destroy_inode(struct inode *inode)
@@ -1055,25 +1055,6 @@ static const struct super_operations tftp_ops = {
.destroy_inode = tftp_destroy_inode,
};
-static int tftp_lookup_revalidate(struct dentry *dentry, unsigned int flags)
-{
- struct tftp_inode *node;
-
- if (!dentry->d_inode)
- return 0;
-
- node = to_tftp_inode(dentry->d_inode);
-
- if (is_timeout(node->time, 2 * SECOND))
- return 0;
-
- return 1;
-}
-
-static const struct dentry_operations tftp_dentry_operations = {
- .d_revalidate = tftp_lookup_revalidate,
-};
-
static int tftp_probe(struct device *dev)
{
struct fs_device *fsdev = dev_to_fs_device(dev);
@@ -1091,7 +1072,7 @@ static int tftp_probe(struct device *dev)
}
sb->s_op = &tftp_ops;
- sb->s_d_op = &tftp_dentry_operations;
+ sb->s_d_op = &netfs_dentry_operations_timed;
inode = tftp_get_inode(sb, NULL, S_IFDIR);
sb->s_root = d_make_root(inode);
diff --git a/include/linux/netfs.h b/include/linux/netfs.h
new file mode 100644
index 000000000000..4aa2e2223d4a
--- /dev/null
+++ b/include/linux/netfs.h
@@ -0,0 +1,78 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/* Network filesystem support services.
+ *
+ * Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
+ * Written by David Howells (dhowells@redhat.com)
+ *
+ * See:
+ *
+ * Documentation/filesystems/netfs_library.rst
+ *
+ * for a description of the network filesystem interface declared here.
+ */
+
+#ifndef _LINUX_NETFS_H
+#define _LINUX_NETFS_H
+
+#include <linux/fs.h>
+#include <linux/container_of.h>
+#include <clock.h>
+
+/*
+ * Per-inode context. This wraps the VFS inode.
+ */
+struct netfs_inode {
+ struct inode inode; /* The VFS inode */
+ u64 time; /* Time the inode was allocated */
+};
+
+enum netfs_io_origin {
+ NETFS_READPAGE, /* This read is a synchronous read */
+ NETFS_WRITETHROUGH, /* This write was made by netfs_perform_write() */
+} __mode(byte);
+
+/*
+ * Descriptor for an I/O helper request. This is used to make multiple I/O
+ * operations to a variety of data stores and then stitch the result together.
+ */
+struct netfs_io_request {
+ struct inode *inode; /* The file being accessed */
+ void *netfs_priv; /* Private data for the netfs */
+ enum netfs_io_origin origin; /* Origin of the request */
+};
+
+/**
+ * netfs_inode - Get the netfs inode context from the inode
+ * @inode: The inode to query
+ *
+ * Get the netfs lib inode context from the network filesystem's inode. The
+ * context struct is expected to directly follow on from the VFS inode struct.
+ */
+static inline struct netfs_inode *netfs_inode(struct inode *inode)
+{
+ return container_of(inode, struct netfs_inode, inode);
+}
+
+/**
+ * netfs_inode_init - Initialise a netfslib inode context
+ * @ctx: The netfs inode to initialise
+ *
+ * Initialise the netfs library context struct. This is expected to follow on
+ * directly from the VFS inode struct.
+ */
+static inline void netfs_inode_init(struct netfs_inode *ctx)
+{
+ ctx->time = get_time_ns();
+}
+
+#define NETFS_INODE_VALID_TIME (2 * NSEC_PER_SEC)
+
+static inline void netfs_invalidate_inode_attr(struct netfs_inode *ctx)
+{
+ /* ensure that we always detect the inode to be stale */
+ ctx->time = -NETFS_INODE_VALID_TIME;
+}
+
+extern const struct dentry_operations netfs_dentry_operations_timed;
+
+#endif /* _LINUX_NETFS_H */
--
2.39.5
next prev parent reply other threads:[~2025-06-06 8:59 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-06-06 8:58 [PATCH 00/10] fs: add virtfs (Plan 9 ove Virt I/O) Ahmad Fatoum
2025-06-06 8:58 ` Ahmad Fatoum [this message]
2025-06-06 8:58 ` [PATCH 02/10] Port Linux __cleanup() based guard infrastructure Ahmad Fatoum
2025-06-06 8:58 ` [PATCH 03/10] lib: idr: implement Linux idr_alloc/_u32 API Ahmad Fatoum
2025-06-06 8:58 ` [PATCH 04/10] lib: add iov_iter I/O vector iterator support Ahmad Fatoum
2025-06-06 8:58 ` [PATCH 05/10] lib: add parser code for mount options Ahmad Fatoum
2025-06-06 8:58 ` [PATCH 06/10] include: add definitions for UID/GID/DEV Ahmad Fatoum
2025-06-06 8:58 ` [PATCH 07/10] net: add support for 9P protocol Ahmad Fatoum
2025-06-06 8:58 ` [PATCH 08/10] fs: add new 9P2000.l (Plan 9) File system support Ahmad Fatoum
2025-06-06 8:58 ` [PATCH 09/10] fs: 9p: enable 9P over Virt I/O transport in defconfigs Ahmad Fatoum
2025-06-06 8:58 ` [PATCH 10/10] test: add support for --fs option in QEMU Ahmad Fatoum
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250606085813.2183260-2-a.fatoum@barebox.org \
--to=a.fatoum@barebox.org \
--cc=barebox@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox