All of lore.kernel.org
 help / color / mirror / Atom feed
From: Scott Mayhew <smayhew@redhat.com>
To: trondmy@kernel.org, anna@kernel.org
Cc: hch@infradead.org, linux-nfs@vger.kernel.org
Subject: [PATCH v2] nfs: split up block layout and SCSI layout support
Date: Fri,  4 Sep 2026 13:26:27 -0400	[thread overview]
Message-ID: <20260904172627.1347637-1-smayhew@redhat.com> (raw)

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


             reply	other threads:[~2026-09-04 17:26 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-04 17:26 Scott Mayhew [this message]
2026-09-07  6:14 ` [PATCH v2] nfs: split up block layout and SCSI layout support Christoph Hellwig
2026-09-10 10:48 ` kernel test robot

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=20260904172627.1347637-1-smayhew@redhat.com \
    --to=smayhew@redhat.com \
    --cc=anna@kernel.org \
    --cc=hch@infradead.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=trondmy@kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.