nfs: split up block layout and SCSI layout support

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>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Anna Schumaker <anna.schumaker@hammerspace.com>
This commit is contained in:
Scott Mayhew 2026-09-22 14:24:36 -04:00 committed by Anna Schumaker
parent 9ba13ef0e3
commit 65a83a613c
4 changed files with 129 additions and 36 deletions

View File

@ -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

View File

@ -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

View File

@ -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__);
@ -956,6 +944,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",
@ -980,6 +975,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",
@ -1004,6 +1041,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)
{
@ -1011,25 +1070,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)
@ -1037,13 +1088,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);

View File

@ -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,