* [PATCH v3] nfs: split up block layout and SCSI layout support
@ 2026-09-22 18:24 Scott Mayhew
2026-09-23 4:40 ` Christoph Hellwig
0 siblings, 1 reply; 2+ messages in thread
From: Scott Mayhew @ 2026-09-22 18:24 UTC (permalink / raw)
To: trondmy, anna; +Cc: hch, linux-nfs
Add two new config options PNFS_BLOCK_LAYOUT and PNFS_SCSI_LAYOUT so
that SCSI layouts can be enabled without requiring block layouts.
Since block layouts are considered deprecated, PNFS_BLOCK_LAYOUT
is off by default.
The original PNFS_BLOCK config is now invisible and gets selected when
either of PNFS_BLOCK_LAYOUT or PNFS_SCSI_LAYOUT are enabled.
Also added a dependency on BLOCK to the Kconfig to fix undefined symbol
warnings from the kernel test robot.
Signed-off-by: Scott Mayhew <smayhew@redhat.com>
---
v3 changes:
- Make PNFS_BLOCK_LAYOUT and PNFS_SCSI_LAYOUT select PNFS_BLOCK instead
of having PNFS_BLOCK depend on PNFS_BLOCK_LAYOUT or PNFS_SCSI_LAYOUT
- Remove redundant 'default n' from PNFS_BLOCK_LAYOUT
- Shuffled stuff around in blocklayout.c to reduce the number of ifdefs
- Added separate helpers to blocklayout.c for registering/unregistering
the blocklayout and scsilayout types, along with stubs for when
either of those are disabled
- In dev.c, wrapped blocklayout-specific and scsilayout-specific
functions in appropriate ifdef blocks and created the necessary stubs
for when either of those are disabled.
- Added dependency on BLOCK to the Kconfig to fix undefined symbol
warnings from the kernel test robot
fs/nfs/Kconfig | 17 ++++-
fs/nfs/blocklayout/Makefile | 3 +-
fs/nfs/blocklayout/blocklayout.c | 113 ++++++++++++++++++++++---------
fs/nfs/blocklayout/dev.c | 32 ++++++++-
4 files changed, 129 insertions(+), 36 deletions(-)
diff --git a/fs/nfs/Kconfig b/fs/nfs/Kconfig
index 6bb30543eff0..64c249f800a9 100644
--- a/fs/nfs/Kconfig
+++ b/fs/nfs/Kconfig
@@ -123,8 +123,23 @@ config PNFS_FILE_LAYOUT
config PNFS_BLOCK
tristate
- depends on NFS_V4 && BLK_DEV_DM
+
+config PNFS_BLOCK_LAYOUT
+ bool "NFS client support for pNFS block layouts"
+ depends on NFS_V4 && BLOCK && BLK_DEV_DM
+ select PNFS_BLOCK
+ help
+ Enable support for the pNFS block-volume layout type (RFC 5663).
+
+ If unsure, say N.
+
+config PNFS_SCSI_LAYOUT
+ bool "NFS client support for pNFS SCSI layouts"
+ depends on NFS_V4 && BLOCK
default NFS_V4
+ select PNFS_BLOCK
+ help
+ Enable suport for the pNFS SCSI layout type (RFC 8154).
config PNFS_FLEXFILE_LAYOUT
tristate
diff --git a/fs/nfs/blocklayout/Makefile b/fs/nfs/blocklayout/Makefile
index 7668a1bfb5fa..3403cb7fe201 100644
--- a/fs/nfs/blocklayout/Makefile
+++ b/fs/nfs/blocklayout/Makefile
@@ -4,4 +4,5 @@
#
obj-$(CONFIG_PNFS_BLOCK) += blocklayoutdriver.o
-blocklayoutdriver-y += blocklayout.o dev.o extent_tree.o rpc_pipefs.o
+blocklayoutdriver-y += blocklayout.o dev.o extent_tree.o
+blocklayoutdriver-$(CONFIG_PNFS_BLOCK_LAYOUT) += rpc_pipefs.o
diff --git a/fs/nfs/blocklayout/blocklayout.c b/fs/nfs/blocklayout/blocklayout.c
index d54a141a89b3..680b3b343859 100644
--- a/fs/nfs/blocklayout/blocklayout.c
+++ b/fs/nfs/blocklayout/blocklayout.c
@@ -470,18 +470,6 @@ static struct pnfs_layout_hdr *__bl_alloc_layout_hdr(struct inode *inode,
return &bl->bl_layout;
}
-static struct pnfs_layout_hdr *bl_alloc_layout_hdr(struct inode *inode,
- gfp_t gfp_flags)
-{
- return __bl_alloc_layout_hdr(inode, gfp_flags, false);
-}
-
-static struct pnfs_layout_hdr *sl_alloc_layout_hdr(struct inode *inode,
- gfp_t gfp_flags)
-{
- return __bl_alloc_layout_hdr(inode, gfp_flags, true);
-}
-
static void bl_free_lseg(struct pnfs_layout_segment *lseg)
{
dprintk("%s enter\n", __func__);
@@ -954,6 +942,13 @@ static const struct nfs_pageio_ops bl_pg_write_ops = {
.pg_cleanup = pnfs_generic_pg_cleanup,
};
+#ifdef CONFIG_PNFS_BLOCK_LAYOUT
+static struct pnfs_layout_hdr *bl_alloc_layout_hdr(struct inode *inode,
+ gfp_t gfp_flags)
+{
+ return __bl_alloc_layout_hdr(inode, gfp_flags, false);
+}
+
static struct pnfs_layoutdriver_type blocklayout_type = {
.id = LAYOUT_BLOCK_VOLUME,
.name = "LAYOUT_BLOCK_VOLUME",
@@ -978,6 +973,48 @@ static struct pnfs_layoutdriver_type blocklayout_type = {
.sync = pnfs_generic_sync,
};
+static int __init pnfs_register_blocklayout(void)
+{
+ int ret;
+
+ ret = bl_init_pipefs();
+ if (ret)
+ return ret;
+
+ ret = pnfs_register_layoutdriver(&blocklayout_type);
+ if (ret) {
+ bl_cleanup_pipefs();
+ return ret;
+ }
+
+ return 0;
+}
+
+static void __exit pnfs_unregister_blocklayout(void)
+{
+ pnfs_unregister_layoutdriver(&blocklayout_type);
+ bl_cleanup_pipefs();
+}
+
+MODULE_ALIAS("nfs-layouttype4-3");
+#else
+static int __init pnfs_register_blocklayout(void)
+{
+ return 0;
+}
+
+static void __exit pnfs_unregister_blocklayout(void)
+{
+}
+#endif /* CONFIG_PNFS_BLOCK_LAYOUT */
+
+#ifdef CONFIG_PNFS_SCSI_LAYOUT
+static struct pnfs_layout_hdr *sl_alloc_layout_hdr(struct inode *inode,
+ gfp_t gfp_flags)
+{
+ return __bl_alloc_layout_hdr(inode, gfp_flags, true);
+}
+
static struct pnfs_layoutdriver_type scsilayout_type = {
.id = LAYOUT_SCSI,
.name = "LAYOUT_SCSI",
@@ -1002,6 +1039,28 @@ static struct pnfs_layoutdriver_type scsilayout_type = {
.sync = pnfs_generic_sync,
};
+static int __init pnfs_register_scsilayout(void)
+{
+ return pnfs_register_layoutdriver(&scsilayout_type);
+}
+
+static void __exit pnfs_unregister_scsilayout(void)
+{
+ pnfs_unregister_layoutdriver(&scsilayout_type);
+}
+
+MODULE_ALIAS("nfs-layouttype4-5");
+#else
+static int __init pnfs_register_scsilayout(void)
+{
+ return 0;
+}
+
+static void __exit pnfs_unregister_scsilayout(void)
+{
+}
+#endif /* CONFIG_PNFS_SCSI_LAYOUT */
+
static int __init nfs4blocklayout_init(void)
{
@@ -1009,25 +1068,17 @@ static int __init nfs4blocklayout_init(void)
dprintk("%s: NFSv4 Block Layout Driver Registering...\n", __func__);
- ret = bl_init_pipefs();
+ ret = pnfs_register_blocklayout();
if (ret)
- goto out;
+ return ret;
- ret = pnfs_register_layoutdriver(&blocklayout_type);
- if (ret)
- goto out_cleanup_pipe;
+ ret = pnfs_register_scsilayout();
+ if (ret) {
+ pnfs_unregister_blocklayout();
+ return ret;
+ }
- ret = pnfs_register_layoutdriver(&scsilayout_type);
- if (ret)
- goto out_unregister_block;
return 0;
-
-out_unregister_block:
- pnfs_unregister_layoutdriver(&blocklayout_type);
-out_cleanup_pipe:
- bl_cleanup_pipefs();
-out:
- return ret;
}
static void __exit nfs4blocklayout_exit(void)
@@ -1035,13 +1086,9 @@ static void __exit nfs4blocklayout_exit(void)
dprintk("%s: NFSv4 Block Layout Driver Unregistering...\n",
__func__);
- pnfs_unregister_layoutdriver(&scsilayout_type);
- pnfs_unregister_layoutdriver(&blocklayout_type);
- bl_cleanup_pipefs();
+ pnfs_unregister_scsilayout();
+ pnfs_unregister_blocklayout();
}
-MODULE_ALIAS("nfs-layouttype4-3");
-MODULE_ALIAS("nfs-layouttype4-5");
-
module_init(nfs4blocklayout_init);
module_exit(nfs4blocklayout_exit);
diff --git a/fs/nfs/blocklayout/dev.c b/fs/nfs/blocklayout/dev.c
index c926b7e43827..00462e6affb1 100644
--- a/fs/nfs/blocklayout/dev.c
+++ b/fs/nfs/blocklayout/dev.c
@@ -15,6 +15,7 @@
#define NFSDBG_FACILITY NFSDBG_PNFS_LD
+#ifdef CONFIG_PNFS_SCSI_LAYOUT
static void bl_unregister_scsi(struct pnfs_block_dev *dev)
{
struct block_device *bdev = file_bdev(dev->bdev_file);
@@ -45,6 +46,16 @@ static bool bl_register_scsi(struct pnfs_block_dev *dev)
trace_bl_pr_key_reg(bdev, dev->pr_key);
return true;
}
+#else
+static void bl_unregister_scsi(struct pnfs_block_dev *dev)
+{
+}
+
+static bool bl_register_scsi(struct pnfs_block_dev *dev)
+{
+ return false;
+}
+#endif /* CONFIG_PNFS_SCSI_LAYOUT */
static void bl_unregister_dev(struct pnfs_block_dev *dev)
{
@@ -292,7 +303,7 @@ static int
bl_parse_deviceid(struct nfs_server *server, struct pnfs_block_dev *d,
struct pnfs_block_volume *volumes, int idx, gfp_t gfp_mask);
-
+#ifdef CONFIG_PNFS_BLOCK_LAYOUT
static int
bl_parse_simple(struct nfs_server *server, struct pnfs_block_dev *d,
struct pnfs_block_volume *volumes, int idx, gfp_t gfp_mask)
@@ -320,7 +331,17 @@ bl_parse_simple(struct nfs_server *server, struct pnfs_block_dev *d,
file_bdev(bdev_file)->bd_disk->disk_name);
return 0;
}
+#else
+static int
+bl_parse_simple(struct nfs_server *server, struct pnfs_block_dev *d,
+ struct pnfs_block_volume *volumes, int idx, gfp_t gfp_mask)
+{
+ dprintk("unsupported volume type: %d\n", PNFS_BLOCK_VOLUME_SIMPLE);
+ return -EIO;
+}
+#endif /* CONFIG_PNFS_BLOCK_LAYOUT */
+#ifdef CONFIG_PNFS_SCSI_LAYOUT
static bool
bl_validate_designator(struct pnfs_block_volume *v)
{
@@ -449,6 +470,15 @@ bl_parse_scsi(struct nfs_server *server, struct pnfs_block_dev *d,
d->bdev_file = NULL;
return error;
}
+#else
+static int
+bl_parse_scsi(struct nfs_server *server, struct pnfs_block_dev *d,
+ struct pnfs_block_volume *volumes, int idx, gfp_t gfp_mask)
+{
+ dprintk("unsupported volume type: %d\n", PNFS_BLOCK_VOLUME_SCSI);
+ return -EIO;
+}
+#endif /* CONFIG_PNFS_SCSI_LAYOUT */
static int
bl_parse_slice(struct nfs_server *server, struct pnfs_block_dev *d,
--
2.55.0
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v3] nfs: split up block layout and SCSI layout support
2026-09-22 18:24 [PATCH v3] nfs: split up block layout and SCSI layout support Scott Mayhew
@ 2026-09-23 4:40 ` Christoph Hellwig
0 siblings, 0 replies; 2+ messages in thread
From: Christoph Hellwig @ 2026-09-23 4:40 UTC (permalink / raw)
To: Scott Mayhew; +Cc: trondmy, anna, linux-nfs
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-09-23 4:40 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-22 18:24 [PATCH v3] nfs: split up block layout and SCSI layout support Scott Mayhew
2026-09-23 4:40 ` Christoph Hellwig
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox