diff options
author | Ricardo Labiaga <Ricardo.Labiaga@netapp.com> | 2010-10-20 00:17:58 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2010-10-24 18:07:10 -0400 |
commit | 85e174ba6b786ad336eb2df105b4f66d0932e70a (patch) | |
tree | eec6b01d897e85c47471f4166201676001c9fd21 /fs/nfs | |
parent | 504913fbc84c00bba7224d73e4aab525c1731f7d (diff) |
NFS: set layout driver
Put in the infrastructure that uses information returned from the
server at mount to select a layout driver module.
In this patch, a stub is used that always returns "no driver found".
Signed-off-by: Ricardo Labiaga <Ricardo.Labiaga@netapp.com>
Signed-off-by: Dean Hildebrand <dhildebz@umich.edu>
Signed-off-by: Marc Eshel <eshel@almaden.ibm.com>
Signed-off-by: Andy Adamson <andros@netapp.com>
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
Signed-off-by: Fred Isaman <iisaman@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r-- | fs/nfs/Makefile | 1 | ||||
-rw-r--r-- | fs/nfs/client.c | 5 | ||||
-rw-r--r-- | fs/nfs/pnfs.c | 84 | ||||
-rw-r--r-- | fs/nfs/pnfs.h | 56 |
4 files changed, 146 insertions, 0 deletions
diff --git a/fs/nfs/Makefile b/fs/nfs/Makefile index da7fda639eac..bb9e773d4312 100644 --- a/fs/nfs/Makefile +++ b/fs/nfs/Makefile | |||
@@ -15,5 +15,6 @@ nfs-$(CONFIG_NFS_V4) += nfs4proc.o nfs4xdr.o nfs4state.o nfs4renewd.o \ | |||
15 | delegation.o idmap.o \ | 15 | delegation.o idmap.o \ |
16 | callback.o callback_xdr.o callback_proc.o \ | 16 | callback.o callback_xdr.o callback_proc.o \ |
17 | nfs4namespace.o | 17 | nfs4namespace.o |
18 | nfs-$(CONFIG_NFS_V4_1) += pnfs.o | ||
18 | nfs-$(CONFIG_SYSCTL) += sysctl.o | 19 | nfs-$(CONFIG_SYSCTL) += sysctl.o |
19 | nfs-$(CONFIG_NFS_FSCACHE) += fscache.o fscache-index.o | 20 | nfs-$(CONFIG_NFS_FSCACHE) += fscache.o fscache-index.o |
diff --git a/fs/nfs/client.c b/fs/nfs/client.c index a63bce8d0596..eba0bcc1bab0 100644 --- a/fs/nfs/client.c +++ b/fs/nfs/client.c | |||
@@ -48,6 +48,7 @@ | |||
48 | #include "iostat.h" | 48 | #include "iostat.h" |
49 | #include "internal.h" | 49 | #include "internal.h" |
50 | #include "fscache.h" | 50 | #include "fscache.h" |
51 | #include "pnfs.h" | ||
51 | 52 | ||
52 | #define NFSDBG_FACILITY NFSDBG_CLIENT | 53 | #define NFSDBG_FACILITY NFSDBG_CLIENT |
53 | 54 | ||
@@ -900,6 +901,8 @@ static void nfs_server_set_fsinfo(struct nfs_server *server, struct nfs_fsinfo * | |||
900 | if (server->wsize > NFS_MAX_FILE_IO_SIZE) | 901 | if (server->wsize > NFS_MAX_FILE_IO_SIZE) |
901 | server->wsize = NFS_MAX_FILE_IO_SIZE; | 902 | server->wsize = NFS_MAX_FILE_IO_SIZE; |
902 | server->wpages = (server->wsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; | 903 | server->wpages = (server->wsize + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT; |
904 | set_pnfs_layoutdriver(server, fsinfo->layouttype); | ||
905 | |||
903 | server->wtmult = nfs_block_bits(fsinfo->wtmult, NULL); | 906 | server->wtmult = nfs_block_bits(fsinfo->wtmult, NULL); |
904 | 907 | ||
905 | server->dtsize = nfs_block_size(fsinfo->dtpref, NULL); | 908 | server->dtsize = nfs_block_size(fsinfo->dtpref, NULL); |
@@ -939,6 +942,7 @@ static int nfs_probe_fsinfo(struct nfs_server *server, struct nfs_fh *mntfh, str | |||
939 | } | 942 | } |
940 | 943 | ||
941 | fsinfo.fattr = fattr; | 944 | fsinfo.fattr = fattr; |
945 | fsinfo.layouttype = 0; | ||
942 | error = clp->rpc_ops->fsinfo(server, mntfh, &fsinfo); | 946 | error = clp->rpc_ops->fsinfo(server, mntfh, &fsinfo); |
943 | if (error < 0) | 947 | if (error < 0) |
944 | goto out_error; | 948 | goto out_error; |
@@ -1021,6 +1025,7 @@ void nfs_free_server(struct nfs_server *server) | |||
1021 | { | 1025 | { |
1022 | dprintk("--> nfs_free_server()\n"); | 1026 | dprintk("--> nfs_free_server()\n"); |
1023 | 1027 | ||
1028 | unset_pnfs_layoutdriver(server); | ||
1024 | spin_lock(&nfs_client_lock); | 1029 | spin_lock(&nfs_client_lock); |
1025 | list_del(&server->client_link); | 1030 | list_del(&server->client_link); |
1026 | list_del(&server->master_link); | 1031 | list_del(&server->master_link); |
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c new file mode 100644 index 000000000000..b483026e82aa --- /dev/null +++ b/fs/nfs/pnfs.c | |||
@@ -0,0 +1,84 @@ | |||
1 | /* | ||
2 | * pNFS functions to call and manage layout drivers. | ||
3 | * | ||
4 | * Copyright (c) 2002 [year of first publication] | ||
5 | * The Regents of the University of Michigan | ||
6 | * All Rights Reserved | ||
7 | * | ||
8 | * Dean Hildebrand <dhildebz@umich.edu> | ||
9 | * | ||
10 | * Permission is granted to use, copy, create derivative works, and | ||
11 | * redistribute this software and such derivative works for any purpose, | ||
12 | * so long as the name of the University of Michigan is not used in | ||
13 | * any advertising or publicity pertaining to the use or distribution | ||
14 | * of this software without specific, written prior authorization. If | ||
15 | * the above copyright notice or any other identification of the | ||
16 | * University of Michigan is included in any copy of any portion of | ||
17 | * this software, then the disclaimer below must also be included. | ||
18 | * | ||
19 | * This software is provided as is, without representation or warranty | ||
20 | * of any kind either express or implied, including without limitation | ||
21 | * the implied warranties of merchantability, fitness for a particular | ||
22 | * purpose, or noninfringement. The Regents of the University of | ||
23 | * Michigan shall not be liable for any damages, including special, | ||
24 | * indirect, incidental, or consequential damages, with respect to any | ||
25 | * claim arising out of or in connection with the use of the software, | ||
26 | * even if it has been or is hereafter advised of the possibility of | ||
27 | * such damages. | ||
28 | */ | ||
29 | |||
30 | #include <linux/nfs_fs.h> | ||
31 | #include "pnfs.h" | ||
32 | |||
33 | #define NFSDBG_FACILITY NFSDBG_PNFS | ||
34 | |||
35 | /* STUB that returns the equivalent of "no module found" */ | ||
36 | static struct pnfs_layoutdriver_type * | ||
37 | find_pnfs_driver(u32 id) | ||
38 | { | ||
39 | return NULL; | ||
40 | } | ||
41 | |||
42 | void | ||
43 | unset_pnfs_layoutdriver(struct nfs_server *nfss) | ||
44 | { | ||
45 | nfss->pnfs_curr_ld = NULL; | ||
46 | } | ||
47 | |||
48 | /* | ||
49 | * Try to set the server's pnfs module to the pnfs layout type specified by id. | ||
50 | * Currently only one pNFS layout driver per filesystem is supported. | ||
51 | * | ||
52 | * @id layout type. Zero (illegal layout type) indicates pNFS not in use. | ||
53 | */ | ||
54 | void | ||
55 | set_pnfs_layoutdriver(struct nfs_server *server, u32 id) | ||
56 | { | ||
57 | struct pnfs_layoutdriver_type *ld_type = NULL; | ||
58 | |||
59 | if (id == 0) | ||
60 | goto out_no_driver; | ||
61 | if (!(server->nfs_client->cl_exchange_flags & | ||
62 | (EXCHGID4_FLAG_USE_NON_PNFS | EXCHGID4_FLAG_USE_PNFS_MDS))) { | ||
63 | printk(KERN_ERR "%s: id %u cl_exchange_flags 0x%x\n", __func__, | ||
64 | id, server->nfs_client->cl_exchange_flags); | ||
65 | goto out_no_driver; | ||
66 | } | ||
67 | ld_type = find_pnfs_driver(id); | ||
68 | if (!ld_type) { | ||
69 | request_module("%s-%u", LAYOUT_NFSV4_1_MODULE_PREFIX, id); | ||
70 | ld_type = find_pnfs_driver(id); | ||
71 | if (!ld_type) { | ||
72 | dprintk("%s: No pNFS module found for %u.\n", | ||
73 | __func__, id); | ||
74 | goto out_no_driver; | ||
75 | } | ||
76 | } | ||
77 | server->pnfs_curr_ld = ld_type; | ||
78 | dprintk("%s: pNFS module for %u set\n", __func__, id); | ||
79 | return; | ||
80 | |||
81 | out_no_driver: | ||
82 | dprintk("%s: Using NFSv4 I/O\n", __func__); | ||
83 | server->pnfs_curr_ld = NULL; | ||
84 | } | ||
diff --git a/fs/nfs/pnfs.h b/fs/nfs/pnfs.h new file mode 100644 index 000000000000..c628ef131d83 --- /dev/null +++ b/fs/nfs/pnfs.h | |||
@@ -0,0 +1,56 @@ | |||
1 | /* | ||
2 | * pNFS client data structures. | ||
3 | * | ||
4 | * Copyright (c) 2002 | ||
5 | * The Regents of the University of Michigan | ||
6 | * All Rights Reserved | ||
7 | * | ||
8 | * Dean Hildebrand <dhildebz@umich.edu> | ||
9 | * | ||
10 | * Permission is granted to use, copy, create derivative works, and | ||
11 | * redistribute this software and such derivative works for any purpose, | ||
12 | * so long as the name of the University of Michigan is not used in | ||
13 | * any advertising or publicity pertaining to the use or distribution | ||
14 | * of this software without specific, written prior authorization. If | ||
15 | * the above copyright notice or any other identification of the | ||
16 | * University of Michigan is included in any copy of any portion of | ||
17 | * this software, then the disclaimer below must also be included. | ||
18 | * | ||
19 | * This software is provided as is, without representation or warranty | ||
20 | * of any kind either express or implied, including without limitation | ||
21 | * the implied warranties of merchantability, fitness for a particular | ||
22 | * purpose, or noninfringement. The Regents of the University of | ||
23 | * Michigan shall not be liable for any damages, including special, | ||
24 | * indirect, incidental, or consequential damages, with respect to any | ||
25 | * claim arising out of or in connection with the use of the software, | ||
26 | * even if it has been or is hereafter advised of the possibility of | ||
27 | * such damages. | ||
28 | */ | ||
29 | |||
30 | #ifndef FS_NFS_PNFS_H | ||
31 | #define FS_NFS_PNFS_H | ||
32 | |||
33 | #ifdef CONFIG_NFS_V4_1 | ||
34 | |||
35 | #define LAYOUT_NFSV4_1_MODULE_PREFIX "nfs-layouttype4" | ||
36 | |||
37 | /* Per-layout driver specific registration structure */ | ||
38 | struct pnfs_layoutdriver_type { | ||
39 | }; | ||
40 | |||
41 | void set_pnfs_layoutdriver(struct nfs_server *, u32 id); | ||
42 | void unset_pnfs_layoutdriver(struct nfs_server *); | ||
43 | |||
44 | #else /* CONFIG_NFS_V4_1 */ | ||
45 | |||
46 | static inline void set_pnfs_layoutdriver(struct nfs_server *s, u32 id) | ||
47 | { | ||
48 | } | ||
49 | |||
50 | static inline void unset_pnfs_layoutdriver(struct nfs_server *s) | ||
51 | { | ||
52 | } | ||
53 | |||
54 | #endif /* CONFIG_NFS_V4_1 */ | ||
55 | |||
56 | #endif /* FS_NFS_PNFS_H */ | ||