aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChuck Lever <chuck.lever@oracle.com>2012-09-14 17:24:41 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-10-01 18:33:33 -0400
commit6f2ea7f2a3ff3cd342bface43f8b4bf5e431cf36 (patch)
treec20a5610aa8f934cb46bbb38c901e16d43ea602a
parent05f4c350ee02e9461c6ae3a880ea326a06835e37 (diff)
NFS: Add nfs4_unique_id boot parameter
An optional boot parameter is introduced to allow client administrators to specify a string that the Linux NFS client can insert into its nfs_client_id4 id string, to make it both more globally unique, and to ensure that it doesn't change even if the client's nodename changes. If this boot parameter is not specified, the client's nodename is used, as before. Client installation procedures can create a unique string (typically, a UUID) which remains unchanged during the lifetime of that client instance. This works just like creating a UUID for the label of the system's root and boot volumes. Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r--Documentation/filesystems/nfs/nfs.txt44
-rw-r--r--Documentation/kernel-parameters.txt5
-rw-r--r--fs/nfs/nfs4_fs.h3
-rw-r--r--fs/nfs/nfs4proc.c6
-rw-r--r--fs/nfs/super.c5
5 files changed, 59 insertions, 4 deletions
diff --git a/Documentation/filesystems/nfs/nfs.txt b/Documentation/filesystems/nfs/nfs.txt
index f50f26ce6cd0..f2571c8bef74 100644
--- a/Documentation/filesystems/nfs/nfs.txt
+++ b/Documentation/filesystems/nfs/nfs.txt
@@ -12,9 +12,47 @@ and work is in progress on adding support for minor version 1 of the NFSv4
12protocol. 12protocol.
13 13
14The purpose of this document is to provide information on some of the 14The purpose of this document is to provide information on some of the
15upcall interfaces that are used in order to provide the NFS client with 15special features of the NFS client that can be configured by system
16some of the information that it requires in order to fully comply with 16administrators.
17the NFS spec. 17
18
19The nfs4_unique_id parameter
20============================
21
22NFSv4 requires clients to identify themselves to servers with a unique
23string. File open and lock state shared between one client and one server
24is associated with this identity. To support robust NFSv4 state recovery
25and transparent state migration, this identity string must not change
26across client reboots.
27
28Without any other intervention, the Linux client uses a string that contains
29the local system's node name. System administrators, however, often do not
30take care to ensure that node names are fully qualified and do not change
31over the lifetime of a client system. Node names can have other
32administrative requirements that require particular behavior that does not
33work well as part of an nfs_client_id4 string.
34
35The nfs.nfs4_unique_id boot parameter specifies a unique string that can be
36used instead of a system's node name when an NFS client identifies itself to
37a server. Thus, if the system's node name is not unique, or it changes, its
38nfs.nfs4_unique_id stays the same, preventing collision with other clients
39or loss of state during NFS reboot recovery or transparent state migration.
40
41The nfs.nfs4_unique_id string is typically a UUID, though it can contain
42anything that is believed to be unique across all NFS clients. An
43nfs4_unique_id string should be chosen when a client system is installed,
44just as a system's root file system gets a fresh UUID in its label at
45install time.
46
47The string should remain fixed for the lifetime of the client. It can be
48changed safely if care is taken that the client shuts down cleanly and all
49outstanding NFSv4 state has expired, to prevent loss of NFSv4 state.
50
51This string can be stored in an NFS client's grub.conf, or it can be provided
52via a net boot facility such as PXE. It may also be specified as an nfs.ko
53module parameter. Specifying a uniquifier string is not support for NFS
54clients running in containers.
55
18 56
19The DNS resolver 57The DNS resolver
20================ 58================
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index ad7e2e5088c1..396a1e66e0ae 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -1719,6 +1719,11 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
1719 will be autodetected by the client, and it will fall 1719 will be autodetected by the client, and it will fall
1720 back to using the idmapper. 1720 back to using the idmapper.
1721 To turn off this behaviour, set the value to '0'. 1721 To turn off this behaviour, set the value to '0'.
1722 nfs.nfs4_unique_id=
1723 [NFS4] Specify an additional fixed unique ident-
1724 ification string that NFSv4 clients can insert into
1725 their nfs_client_id4 string. This is typically a
1726 UUID that is generated at system install time.
1722 1727
1723 nfs.send_implementation_id = 1728 nfs.send_implementation_id =
1724 [NFSv4.1] Send client implementation identification 1729 [NFSv4.1] Send client implementation identification
diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
index 832503c7a00e..a525fdefccde 100644
--- a/fs/nfs/nfs4_fs.h
+++ b/fs/nfs/nfs4_fs.h
@@ -380,6 +380,9 @@ extern bool nfs4_disable_idmapping;
380extern unsigned short max_session_slots; 380extern unsigned short max_session_slots;
381extern unsigned short send_implementation_id; 381extern unsigned short send_implementation_id;
382 382
383#define NFS4_CLIENT_ID_UNIQ_LEN (64)
384extern char nfs4_client_id_uniquifier[NFS4_CLIENT_ID_UNIQ_LEN];
385
383/* nfs4sysctl.c */ 386/* nfs4sysctl.c */
384#ifdef CONFIG_SYSCTL 387#ifdef CONFIG_SYSCTL
385int nfs4_register_sysctl(void); 388int nfs4_register_sysctl(void);
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index b5834abfcbff..9aa97112426f 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -4068,9 +4068,13 @@ static unsigned int
4068nfs4_init_uniform_client_string(const struct nfs_client *clp, 4068nfs4_init_uniform_client_string(const struct nfs_client *clp,
4069 char *buf, size_t len) 4069 char *buf, size_t len)
4070{ 4070{
4071 char *nodename = clp->cl_rpcclient->cl_nodename;
4072
4073 if (nfs4_client_id_uniquifier[0] != '\0')
4074 nodename = nfs4_client_id_uniquifier;
4071 return scnprintf(buf, len, "Linux NFSv%u.%u %s", 4075 return scnprintf(buf, len, "Linux NFSv%u.%u %s",
4072 clp->rpc_ops->version, clp->cl_minorversion, 4076 clp->rpc_ops->version, clp->cl_minorversion,
4073 clp->cl_rpcclient->cl_nodename); 4077 nodename);
4074} 4078}
4075 4079
4076/** 4080/**
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index 056138d45c11..56f02a9bd6d3 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -2662,6 +2662,7 @@ unsigned int nfs_idmap_cache_timeout = 600;
2662bool nfs4_disable_idmapping = true; 2662bool nfs4_disable_idmapping = true;
2663unsigned short max_session_slots = NFS4_DEF_SLOT_TABLE_SIZE; 2663unsigned short max_session_slots = NFS4_DEF_SLOT_TABLE_SIZE;
2664unsigned short send_implementation_id = 1; 2664unsigned short send_implementation_id = 1;
2665char nfs4_client_id_uniquifier[NFS4_CLIENT_ID_UNIQ_LEN] = "";
2665 2666
2666EXPORT_SYMBOL_GPL(nfs_callback_set_tcpport); 2667EXPORT_SYMBOL_GPL(nfs_callback_set_tcpport);
2667EXPORT_SYMBOL_GPL(nfs_callback_tcpport); 2668EXPORT_SYMBOL_GPL(nfs_callback_tcpport);
@@ -2669,6 +2670,7 @@ EXPORT_SYMBOL_GPL(nfs_idmap_cache_timeout);
2669EXPORT_SYMBOL_GPL(nfs4_disable_idmapping); 2670EXPORT_SYMBOL_GPL(nfs4_disable_idmapping);
2670EXPORT_SYMBOL_GPL(max_session_slots); 2671EXPORT_SYMBOL_GPL(max_session_slots);
2671EXPORT_SYMBOL_GPL(send_implementation_id); 2672EXPORT_SYMBOL_GPL(send_implementation_id);
2673EXPORT_SYMBOL_GPL(nfs4_client_id_uniquifier);
2672 2674
2673#define NFS_CALLBACK_MAXPORTNR (65535U) 2675#define NFS_CALLBACK_MAXPORTNR (65535U)
2674 2676
@@ -2694,6 +2696,8 @@ static struct kernel_param_ops param_ops_portnr = {
2694module_param_named(callback_tcpport, nfs_callback_set_tcpport, portnr, 0644); 2696module_param_named(callback_tcpport, nfs_callback_set_tcpport, portnr, 0644);
2695module_param(nfs_idmap_cache_timeout, int, 0644); 2697module_param(nfs_idmap_cache_timeout, int, 0644);
2696module_param(nfs4_disable_idmapping, bool, 0644); 2698module_param(nfs4_disable_idmapping, bool, 0644);
2699module_param_string(nfs4_unique_id, nfs4_client_id_uniquifier,
2700 NFS4_CLIENT_ID_UNIQ_LEN, 0600);
2697MODULE_PARM_DESC(nfs4_disable_idmapping, 2701MODULE_PARM_DESC(nfs4_disable_idmapping,
2698 "Turn off NFSv4 idmapping when using 'sec=sys'"); 2702 "Turn off NFSv4 idmapping when using 'sec=sys'");
2699module_param(max_session_slots, ushort, 0644); 2703module_param(max_session_slots, ushort, 0644);
@@ -2702,6 +2706,7 @@ MODULE_PARM_DESC(max_session_slots, "Maximum number of outstanding NFSv4.1 "
2702module_param(send_implementation_id, ushort, 0644); 2706module_param(send_implementation_id, ushort, 0644);
2703MODULE_PARM_DESC(send_implementation_id, 2707MODULE_PARM_DESC(send_implementation_id,
2704 "Send implementation ID with NFSv4.1 exchange_id"); 2708 "Send implementation ID with NFSv4.1 exchange_id");
2709MODULE_PARM_DESC(nfs4_unique_id, "nfs_client_id4 uniquifier string");
2705MODULE_ALIAS("nfs4"); 2710MODULE_ALIAS("nfs4");
2706 2711
2707#endif /* CONFIG_NFS_V4 */ 2712#endif /* CONFIG_NFS_V4 */