Skip to content

Commit 9cf514c

Browse files
author
Christoph Hellwig
committed
nfsd: implement pNFS operations
Add support for the GETDEVICEINFO, LAYOUTGET, LAYOUTCOMMIT and LAYOUTRETURN NFSv4.1 operations, as well as backing code to manage outstanding layouts and devices. Layout management is very straight forward, with a nfs4_layout_stateid structure that extends nfs4_stid to manage layout stateids as the top-level structure. It is linked into the nfs4_file and nfs4_client structures like the other stateids, and contains a linked list of layouts that hang of the stateid. The actual layout operations are implemented in layout drivers that are not part of this commit, but will be added later. The worst part of this commit is the management of the pNFS device IDs, which suffers from a specification that is not sanely implementable due to the fact that the device-IDs are global and not bound to an export, and have a small enough size so that we can't store the fsid portion of a file handle, and must never be reused. As we still do need perform all export authentication and validation checks on a device ID passed to GETDEVICEINFO we are caught between a rock and a hard place. To work around this issue we add a new hash that maps from a 64-bit integer to a fsid so that we can look up the export to authenticate against it, a 32-bit integer as a generation that we can bump when changing the device, and a currently unused 32-bit integer that could be used in the future to handle more than a single device per export. Entries in this hash table are never deleted as we can't reuse the ids anyway, and would have a severe lifetime problem anyway as Linux export structures are temporary structures that can go away under load. Parts of the XDR data, structures and marshaling/unmarshaling code, as well as many concepts are derived from the old pNFS server implementation from Andy Adamson, Benny Halevy, Dean Hildebrand, Marc Eshel, Fred Isaman, Mike Sager, Ricardo Labiaga and many others. Signed-off-by: Christoph Hellwig <[email protected]>
1 parent 4d227fc commit 9cf514c

File tree

16 files changed

+1324
-5
lines changed

16 files changed

+1324
-5
lines changed

fs/nfsd/Kconfig

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,16 @@ config NFSD_V4
8282

8383
If unsure, say N.
8484

85+
config NFSD_PNFS
86+
bool "NFSv4.1 server support for Parallel NFS (pNFS)"
87+
depends on NFSD_V4
88+
help
89+
This option enables support for the parallel NFS features of the
90+
minor version 1 of the NFSv4 protocol (RFC5661) in the kernel's NFS
91+
server.
92+
93+
If unsure, say N.
94+
8595
config NFSD_V4_SECURITY_LABEL
8696
bool "Provide Security Label support for NFSv4 server"
8797
depends on NFSD_V4 && SECURITY

fs/nfsd/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,4 @@ nfsd-$(CONFIG_NFSD_V3) += nfs3proc.o nfs3xdr.o
1212
nfsd-$(CONFIG_NFSD_V3_ACL) += nfs3acl.o
1313
nfsd-$(CONFIG_NFSD_V4) += nfs4proc.o nfs4xdr.o nfs4state.o nfs4idmap.o \
1414
nfs4acl.o nfs4callback.o nfs4recover.o
15+
nfsd-$(CONFIG_NFSD_PNFS) += nfs4layouts.o

fs/nfsd/export.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "nfsd.h"
2121
#include "nfsfh.h"
2222
#include "netns.h"
23+
#include "pnfs.h"
2324

2425
#define NFSDDBG_FACILITY NFSDDBG_EXPORT
2526

@@ -545,6 +546,7 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen)
545546

546547
exp.ex_client = dom;
547548
exp.cd = cd;
549+
exp.ex_devid_map = NULL;
548550

549551
/* expiry */
550552
err = -EINVAL;
@@ -621,6 +623,8 @@ static int svc_export_parse(struct cache_detail *cd, char *mesg, int mlen)
621623
if (!gid_valid(exp.ex_anon_gid))
622624
goto out4;
623625
err = 0;
626+
627+
nfsd4_setup_layout_type(&exp);
624628
}
625629

626630
expp = svc_export_lookup(&exp);
@@ -703,6 +707,7 @@ static void svc_export_init(struct cache_head *cnew, struct cache_head *citem)
703707
new->ex_fslocs.locations = NULL;
704708
new->ex_fslocs.locations_count = 0;
705709
new->ex_fslocs.migrated = 0;
710+
new->ex_layout_type = 0;
706711
new->ex_uuid = NULL;
707712
new->cd = item->cd;
708713
}
@@ -717,6 +722,8 @@ static void export_update(struct cache_head *cnew, struct cache_head *citem)
717722
new->ex_anon_uid = item->ex_anon_uid;
718723
new->ex_anon_gid = item->ex_anon_gid;
719724
new->ex_fsid = item->ex_fsid;
725+
new->ex_devid_map = item->ex_devid_map;
726+
item->ex_devid_map = NULL;
720727
new->ex_uuid = item->ex_uuid;
721728
item->ex_uuid = NULL;
722729
new->ex_fslocs.locations = item->ex_fslocs.locations;
@@ -725,6 +732,7 @@ static void export_update(struct cache_head *cnew, struct cache_head *citem)
725732
item->ex_fslocs.locations_count = 0;
726733
new->ex_fslocs.migrated = item->ex_fslocs.migrated;
727734
item->ex_fslocs.migrated = 0;
735+
new->ex_layout_type = item->ex_layout_type;
728736
new->ex_nflavors = item->ex_nflavors;
729737
for (i = 0; i < MAX_SECINFO_LIST; i++) {
730738
new->ex_flavors[i] = item->ex_flavors[i];

fs/nfsd/export.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ struct svc_export {
5656
struct nfsd4_fs_locations ex_fslocs;
5757
uint32_t ex_nflavors;
5858
struct exp_flavor_info ex_flavors[MAX_SECINFO_LIST];
59+
enum pnfs_layouttype ex_layout_type;
60+
struct nfsd4_deviceid_map *ex_devid_map;
5961
struct cache_detail *cd;
6062
};
6163

0 commit comments

Comments
 (0)