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
next 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox