Linux NFS development
 help / color / mirror / Atom feed
* [PATCH v2] nfs: split up block layout and SCSI layout support
@ 2026-09-04 17:26 Scott Mayhew
  2026-09-07  6:14 ` Christoph Hellwig
  2026-09-10 10:48 ` kernel test robot
  0 siblings, 2 replies; 3+ messages in thread
From: Scott Mayhew @ 2026-09-04 17:26 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
defaults to n.

The original PNFS_BLOCK config is now invisible and gets set whenever
either of PNFS_BLOCK_LAYOUT or PNFS_SCSI_LAYOUT are enabled.

Signed-off-by: Scott Mayhew <smayhew@redhat.com>
---
 fs/nfs/Kconfig                   | 13 +++++++++++++
 fs/nfs/blocklayout/Makefile      |  3 ++-
 fs/nfs/blocklayout/blocklayout.c | 30 ++++++++++++++++++++++++++++++
 fs/nfs/blocklayout/blocklayout.h | 12 ++++++++++++
 fs/nfs/blocklayout/dev.c         | 18 ++++++++++++++++++
 5 files changed, 75 insertions(+), 1 deletion(-)

diff --git a/fs/nfs/Kconfig b/fs/nfs/Kconfig
index 6bb30543eff0..5047ace9cafd 100644
--- a/fs/nfs/Kconfig
+++ b/fs/nfs/Kconfig
@@ -123,8 +123,21 @@ config PNFS_FILE_LAYOUT
 
 config PNFS_BLOCK
 	tristate
+	default NFS_V4 if PNFS_BLOCK_LAYOUT || PNFS_SCSI_LAYOUT
+
+config PNFS_BLOCK_LAYOUT
+	bool "NFS client support for pNFS block layouts"
 	depends on NFS_V4 && BLK_DEV_DM
+	default n
+	help
+	  Enable support for the pNFS block-volume layout type (RFC 5663).
+
+config PNFS_SCSI_LAYOUT
+	bool "NFS client support for pNFS SCSI layouts"
+	depends on NFS_V4
 	default NFS_V4
+	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..793d15e72064 100644
--- a/fs/nfs/blocklayout/blocklayout.c
+++ b/fs/nfs/blocklayout/blocklayout.c
@@ -470,17 +470,21 @@ static struct pnfs_layout_hdr *__bl_alloc_layout_hdr(struct inode *inode,
 	return &bl->bl_layout;
 }
 
+#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);
 }
+#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);
 }
+#endif /* CONFIG_PNFS_SCSI_LAYOUT */
 
 static void bl_free_lseg(struct pnfs_layout_segment *lseg)
 {
@@ -954,6 +958,7 @@ static const struct nfs_pageio_ops bl_pg_write_ops = {
 	.pg_cleanup = pnfs_generic_pg_cleanup,
 };
 
+#ifdef CONFIG_PNFS_BLOCK_LAYOUT
 static struct pnfs_layoutdriver_type blocklayout_type = {
 	.id				= LAYOUT_BLOCK_VOLUME,
 	.name				= "LAYOUT_BLOCK_VOLUME",
@@ -977,7 +982,9 @@ static struct pnfs_layoutdriver_type blocklayout_type = {
 	.pg_write_ops			= &bl_pg_write_ops,
 	.sync				= pnfs_generic_sync,
 };
+#endif /* CONFIG_PNFS_BLOCK_LAYOUT */
 
+#ifdef CONFIG_PNFS_SCSI_LAYOUT
 static struct pnfs_layoutdriver_type scsilayout_type = {
 	.id				= LAYOUT_SCSI,
 	.name				= "LAYOUT_SCSI",
@@ -1001,6 +1008,7 @@ static struct pnfs_layoutdriver_type scsilayout_type = {
 	.pg_write_ops			= &bl_pg_write_ops,
 	.sync				= pnfs_generic_sync,
 };
+#endif /* CONFIG_PNFS_SCSI_LAYOUT */
 
 
 static int __init nfs4blocklayout_init(void)
@@ -1009,6 +1017,7 @@ static int __init nfs4blocklayout_init(void)
 
 	dprintk("%s: NFSv4 Block Layout Driver Registering...\n", __func__);
 
+#ifdef CONFIG_PNFS_BLOCK_LAYOUT
 	ret = bl_init_pipefs();
 	if (ret)
 		goto out;
@@ -1016,18 +1025,31 @@ static int __init nfs4blocklayout_init(void)
 	ret = pnfs_register_layoutdriver(&blocklayout_type);
 	if (ret)
 		goto out_cleanup_pipe;
+#endif /* CONFIG_PNFS_BLOCK_LAYOUT */
 
+#ifdef CONFIG_PNFS_SCSI_LAYOUT
 	ret = pnfs_register_layoutdriver(&scsilayout_type);
 	if (ret)
+#ifdef CONFIG_PNFS_BLOCK_LAYOUT
 		goto out_unregister_block;
+#else
+		return ret;
+#endif /* CONFIG_PNFS_BLOCK_LAYOUT */
+#endif /* CONFIG_PNFS_SCSI_LAYOUT */
 	return 0;
 
+#ifdef CONFIG_PNFS_SCSI_LAYOUT
+#ifdef CONFIG_PNFS_BLOCK_LAYOUT
 out_unregister_block:
 	pnfs_unregister_layoutdriver(&blocklayout_type);
+#endif /* CONFIG_PNFS_BLOCK_LAYOUT */
+#endif /* CONFIG_PNFS_SCSI_LAYOUT */
+#ifdef CONFIG_PNFS_BLOCK_LAYOUT
 out_cleanup_pipe:
 	bl_cleanup_pipefs();
 out:
 	return ret;
+#endif /* CONFIG_PNFS_BLOCK_LAYOUT */
 }
 
 static void __exit nfs4blocklayout_exit(void)
@@ -1035,13 +1057,21 @@ static void __exit nfs4blocklayout_exit(void)
 	dprintk("%s: NFSv4 Block Layout Driver Unregistering...\n",
 	       __func__);
 
+#ifdef CONFIG_PNFS_SCSI_LAYOUT
 	pnfs_unregister_layoutdriver(&scsilayout_type);
+#endif /* CONFIG_PNFS_SCSI_LAYOUT */
+#ifdef CONFIG_PNFS_BLOCK_LAYOUT
 	pnfs_unregister_layoutdriver(&blocklayout_type);
 	bl_cleanup_pipefs();
+#endif /* CONFIG_PNFS_BLOCK_LAYOUT */
 }
 
+#ifdef CONFIG_PNFS_BLOCK_LAYOUT
 MODULE_ALIAS("nfs-layouttype4-3");
+#endif /* CONFIG_PNFS_BLOCK_LAYOUT */
+#ifdef CONFIG_PNFS_SCSI_LAYOUT
 MODULE_ALIAS("nfs-layouttype4-5");
+#endif /* CONFIG_PNFS_SCSI_LAYOUT */
 
 module_init(nfs4blocklayout_init);
 module_exit(nfs4blocklayout_exit);
diff --git a/fs/nfs/blocklayout/blocklayout.h b/fs/nfs/blocklayout/blocklayout.h
index 6da40ca19570..5f13d2df6c81 100644
--- a/fs/nfs/blocklayout/blocklayout.h
+++ b/fs/nfs/blocklayout/blocklayout.h
@@ -34,7 +34,9 @@
 
 #include <linux/device-mapper.h>
 #include <linux/nfs_fs.h>
+#ifdef CONFIG_PNFS_BLOCK_LAYOUT
 #include <linux/sunrpc/rpc_pipe_fs.h>
+#endif /* CONFIG_PNFS_BLOCK_LAYOUT */
 
 #include "../nfs4_fs.h"
 #include "../pnfs.h"
@@ -46,7 +48,9 @@
 
 struct pnfs_block_dev;
 
+#ifdef CONFIG_PNFS_BLOCK_LAYOUT
 #define PNFS_BLOCK_MAX_UUIDS	4
+#endif /* CONFIG_PNFS_BLOCK_LAYOUT */
 #define PNFS_BLOCK_MAX_DEVICES	64
 
 /*
@@ -58,6 +62,7 @@ struct pnfs_block_dev;
 struct pnfs_block_volume {
 	enum pnfs_block_volume_type	type;
 	union {
+#ifdef CONFIG_PNFS_BLOCK_LAYOUT
 		struct {
 			int		len;
 			int		nr_sigs;
@@ -67,6 +72,7 @@ struct pnfs_block_volume {
 				u8		sig[PNFS_BLOCK_UUID_LEN];
 			} sigs[PNFS_BLOCK_MAX_UUIDS];
 		} simple;
+#endif /* CONFIG_PNFS_BLOCK_LAYOUT */
 		struct {
 			u64		start;
 			u64		len;
@@ -81,6 +87,7 @@ struct pnfs_block_volume {
 			u32		volumes_count;
 			u32		volumes[PNFS_BLOCK_MAX_DEVICES];
 		} stripe;
+#ifdef CONFIG_PNFS_SCSI_LAYOUT
 		struct {
 			enum scsi_code_set		code_set;
 			enum scsi_designator_type	designator_type;
@@ -88,6 +95,7 @@ struct pnfs_block_volume {
 			u8				designator[256];
 			u64				pr_key;
 		} scsi;
+#endif /* CONFIG_PNFS_SCSI_LAYOUT */
 	};
 };
 
@@ -161,6 +169,7 @@ BLK_LSEG2EXT(struct pnfs_layout_segment *lseg)
 	return BLK_LO2EXT(lseg->pls_layout);
 }
 
+#ifdef CONFIG_PNFS_BLOCK_LAYOUT
 struct bl_pipe_msg {
 	struct rpc_pipe_msg msg;
 	wait_queue_head_t *bl_wq;
@@ -176,6 +185,7 @@ struct bl_msg_hdr {
 #define BL_DEVICE_REQUEST_INIT         0x0 /* Start request */
 #define BL_DEVICE_REQUEST_PROC         0x1 /* User level process succeeds */
 #define BL_DEVICE_REQUEST_ERR          0x2 /* User level process fails */
+#endif /* CONFIG_PNFS_BLOCK_LAYOUT */
 
 /* dev.c */
 bool bl_register_dev(struct pnfs_block_dev *d);
@@ -195,10 +205,12 @@ bool ext_tree_lookup(struct pnfs_block_layout *bl, sector_t isect,
 int ext_tree_prepare_commit(struct nfs4_layoutcommit_args *arg);
 void ext_tree_mark_committed(struct nfs4_layoutcommit_args *arg, int status);
 
+#ifdef CONFIG_PNFS_BLOCK_LAYOUT
 /* rpc_pipefs.c */
 dev_t bl_resolve_deviceid(struct nfs_server *server,
 		struct pnfs_block_volume *b, gfp_t gfp_mask);
 int __init bl_init_pipefs(void);
 void bl_cleanup_pipefs(void);
+#endif /* CONFIG_PNFS_BLOCK_LAYOUT */
 
 #endif /* FS_NFS_NFS4BLOCKLAYOUT_H */
diff --git a/fs/nfs/blocklayout/dev.c b/fs/nfs/blocklayout/dev.c
index c926b7e43827..7ead577b03b0 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,7 @@ static bool bl_register_scsi(struct pnfs_block_dev *dev)
 	trace_bl_pr_key_reg(bdev, dev->pr_key);
 	return true;
 }
+#endif /* CONFIG_PNFS_SCSI_LAYOUT */
 
 static void bl_unregister_dev(struct pnfs_block_dev *dev)
 {
@@ -56,9 +58,11 @@ static void bl_unregister_dev(struct pnfs_block_dev *dev)
 		return;
 	}
 
+#ifdef CONFIG_PNFS_SCSI_LAYOUT
 	if (dev->type == PNFS_BLOCK_VOLUME_SCSI &&
 		test_and_clear_bit(PNFS_BDEV_REGISTERED, &dev->flags))
 		bl_unregister_scsi(dev);
+#endif /* CONFIG_PNFS_SCSI_LAYOUT */
 }
 
 bool bl_register_dev(struct pnfs_block_dev *dev)
@@ -76,8 +80,10 @@ bool bl_register_dev(struct pnfs_block_dev *dev)
 		return true;
 	}
 
+#ifdef CONFIG_PNFS_SCSI_LAYOUT
 	if (dev->type == PNFS_BLOCK_VOLUME_SCSI)
 		return bl_register_scsi(dev);
+#endif /* CONFIG_PNFS_SCSI_LAYOUT */
 	return true;
 }
 
@@ -122,6 +128,7 @@ nfs4_block_decode_volume(struct xdr_stream *xdr, struct pnfs_block_volume *b)
 	b->type = be32_to_cpup(p++);
 
 	switch (b->type) {
+#ifdef CONFIG_PNFS_BLOCK_LAYOUT
 	case PNFS_BLOCK_VOLUME_SIMPLE:
 		p = xdr_inline_decode(xdr, 4);
 		if (!p)
@@ -155,6 +162,7 @@ nfs4_block_decode_volume(struct xdr_stream *xdr, struct pnfs_block_volume *b)
 				(XDR_QUADLEN(b->simple.sigs[i].sig_len) << 2);
 		}
 		break;
+#endif /* CONFIG_PNFS_BLOCK_LAYOUT */
 	case PNFS_BLOCK_VOLUME_SLICE:
 		p = xdr_inline_decode(xdr, 8 + 8 + 4);
 		if (!p)
@@ -198,6 +206,7 @@ nfs4_block_decode_volume(struct xdr_stream *xdr, struct pnfs_block_volume *b)
 		for (i = 0; i < b->stripe.volumes_count; i++)
 			b->stripe.volumes[i] = be32_to_cpup(p++);
 		break;
+#ifdef CONFIG_PNFS_SCSI_LAYOUT
 	case PNFS_BLOCK_VOLUME_SCSI:
 		p = xdr_inline_decode(xdr, 4 + 4 + 4);
 		if (!p)
@@ -216,6 +225,7 @@ nfs4_block_decode_volume(struct xdr_stream *xdr, struct pnfs_block_volume *b)
 			return -EIO;
 		p = xdr_decode_hyper(p, &b->scsi.pr_key);
 		break;
+#endif /* CONFIG_PNFS_SCSI_LAYOUT */
 	default:
 		dprintk("unknown volume type!\n");
 		return -EIO;
@@ -293,6 +303,7 @@ 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,9 @@ bl_parse_simple(struct nfs_server *server, struct pnfs_block_dev *d,
 		file_bdev(bdev_file)->bd_disk->disk_name);
 	return 0;
 }
+#endif /* CONFIG_PNFS_BLOCK_LAYOUT */
 
+#ifdef CONFIG_PNFS_SCSI_LAYOUT
 static bool
 bl_validate_designator(struct pnfs_block_volume *v)
 {
@@ -449,6 +462,7 @@ bl_parse_scsi(struct nfs_server *server, struct pnfs_block_dev *d,
 	d->bdev_file = NULL;
 	return error;
 }
+#endif /* CONFIG_PNFS_SCSI_LAYOUT */
 
 static int
 bl_parse_slice(struct nfs_server *server, struct pnfs_block_dev *d,
@@ -537,16 +551,20 @@ bl_parse_deviceid(struct nfs_server *server, struct pnfs_block_dev *d,
 	d->type = volumes[idx].type;
 
 	switch (d->type) {
+#ifdef CONFIG_PNFS_BLOCK_LAYOUT
 	case PNFS_BLOCK_VOLUME_SIMPLE:
 		return bl_parse_simple(server, d, volumes, idx, gfp_mask);
+#endif /* CONFIG_PNFS_BLOCK_LAYOUT */
 	case PNFS_BLOCK_VOLUME_SLICE:
 		return bl_parse_slice(server, d, volumes, idx, gfp_mask);
 	case PNFS_BLOCK_VOLUME_CONCAT:
 		return bl_parse_concat(server, d, volumes, idx, gfp_mask);
 	case PNFS_BLOCK_VOLUME_STRIPE:
 		return bl_parse_stripe(server, d, volumes, idx, gfp_mask);
+#ifdef CONFIG_PNFS_SCSI_LAYOUT
 	case PNFS_BLOCK_VOLUME_SCSI:
 		return bl_parse_scsi(server, d, volumes, idx, gfp_mask);
+#endif /* CONFIG_PNFS_SCSI_LAYOUT */
 	default:
 		dprintk("unsupported volume type: %d\n", d->type);
 		return -EIO;
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-09-10 10:49 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-04 17:26 [PATCH v2] nfs: split up block layout and SCSI layout support Scott Mayhew
2026-09-07  6:14 ` Christoph Hellwig
2026-09-10 10:48 ` kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox