diff options
author | David Howells <dhowells@redhat.com> | 2006-08-22 20:06:10 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2006-09-22 23:24:33 -0400 |
commit | 24c8dbbb5f777187d660393599641ab3307b4b97 (patch) | |
tree | 9d50fdd57c7593d925a21e4bb049095a4e4ead6f /include/linux | |
parent | e9326dcab413848e70ab746c7c5363da13e5f801 (diff) |
NFS: Generalise the nfs_client structure
Generalise the nfs_client structure by:
(1) Moving nfs_client to a more general place (nfs_fs_sb.h).
(2) Renaming its maintenance routines to be non-NFS4 specific.
(3) Move those maintenance routines to a new non-NFS4 specific file (client.c)
and move the declarations to internal.h.
(4) Make nfs_find/get_client() take a full sockaddr_in to include the port
number (will be required for NFS2/3).
(5) Make nfs_find/get_client() take the NFS protocol version (again will be
required to differentiate NFS2, 3 & 4 client records).
Also:
(6) Make nfs_client construction proceed akin to inodes, marking them as under
construction and providing a function to indicate completion.
(7) Make nfs_get_client() wait interruptibly if it finds a client that it can
share, but that client is currently being constructed.
(8) Make nfs4_create_client() use (6) and (7) instead of locking cl_sem.
Signed-Off-By: David Howells <dhowells@redhat.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/nfs_fs.h | 1 | ||||
-rw-r--r-- | include/linux/nfs_fs_sb.h | 60 |
2 files changed, 61 insertions, 0 deletions
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index a36e01cd6321..70e1dc9162e2 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
@@ -586,6 +586,7 @@ extern void * nfs_root_data(void); | |||
586 | #define NFSDBG_FILE 0x0040 | 586 | #define NFSDBG_FILE 0x0040 |
587 | #define NFSDBG_ROOT 0x0080 | 587 | #define NFSDBG_ROOT 0x0080 |
588 | #define NFSDBG_CALLBACK 0x0100 | 588 | #define NFSDBG_CALLBACK 0x0100 |
589 | #define NFSDBG_CLIENT 0x0200 | ||
589 | #define NFSDBG_ALL 0xFFFF | 590 | #define NFSDBG_ALL 0xFFFF |
590 | 591 | ||
591 | #ifdef __KERNEL__ | 592 | #ifdef __KERNEL__ |
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index fc20d6b934fb..a727657e0ad3 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h | |||
@@ -7,6 +7,66 @@ | |||
7 | struct nfs_iostats; | 7 | struct nfs_iostats; |
8 | 8 | ||
9 | /* | 9 | /* |
10 | * The nfs_client identifies our client state to the server. | ||
11 | */ | ||
12 | struct nfs_client { | ||
13 | atomic_t cl_count; | ||
14 | int cl_cons_state; /* current construction state (-ve: init error) */ | ||
15 | #define NFS_CS_READY 0 /* ready to be used */ | ||
16 | #define NFS_CS_INITING 1 /* busy initialising */ | ||
17 | int cl_nfsversion; /* NFS protocol version */ | ||
18 | unsigned long cl_res_state; /* NFS resources state */ | ||
19 | #define NFS_CS_RPCIOD 0 /* - rpciod started */ | ||
20 | #define NFS_CS_CALLBACK 1 /* - callback started */ | ||
21 | #define NFS_CS_IDMAP 2 /* - idmap started */ | ||
22 | struct sockaddr_in cl_addr; /* server identifier */ | ||
23 | char * cl_hostname; /* hostname of server */ | ||
24 | struct list_head cl_share_link; /* link in global client list */ | ||
25 | struct list_head cl_superblocks; /* List of nfs_server structs */ | ||
26 | |||
27 | struct rpc_clnt * cl_rpcclient; | ||
28 | |||
29 | #ifdef CONFIG_NFS_V4 | ||
30 | u64 cl_clientid; /* constant */ | ||
31 | nfs4_verifier cl_confirm; | ||
32 | unsigned long cl_state; | ||
33 | |||
34 | u32 cl_lockowner_id; | ||
35 | |||
36 | /* | ||
37 | * The following rwsem ensures exclusive access to the server | ||
38 | * while we recover the state following a lease expiration. | ||
39 | */ | ||
40 | struct rw_semaphore cl_sem; | ||
41 | |||
42 | struct list_head cl_delegations; | ||
43 | struct list_head cl_state_owners; | ||
44 | struct list_head cl_unused; | ||
45 | int cl_nunused; | ||
46 | spinlock_t cl_lock; | ||
47 | |||
48 | unsigned long cl_lease_time; | ||
49 | unsigned long cl_last_renewal; | ||
50 | struct work_struct cl_renewd; | ||
51 | struct work_struct cl_recoverd; | ||
52 | |||
53 | struct rpc_wait_queue cl_rpcwaitq; | ||
54 | |||
55 | /* used for the setclientid verifier */ | ||
56 | struct timespec cl_boot_time; | ||
57 | |||
58 | /* idmapper */ | ||
59 | struct idmap * cl_idmap; | ||
60 | |||
61 | /* Our own IP address, as a null-terminated string. | ||
62 | * This is used to generate the clientid, and the callback address. | ||
63 | */ | ||
64 | char cl_ipaddr[16]; | ||
65 | unsigned char cl_id_uniquifier; | ||
66 | #endif | ||
67 | }; | ||
68 | |||
69 | /* | ||
10 | * NFS client parameters stored in the superblock. | 70 | * NFS client parameters stored in the superblock. |
11 | */ | 71 | */ |
12 | struct nfs_server { | 72 | struct nfs_server { |