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 | |
| 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>
| -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 | ||||
| -rw-r--r-- | include/linux/nfs_fs.h | 1 | ||||
| -rw-r--r-- | include/linux/nfs_fs_sb.h | 1 |
6 files changed, 148 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 */ | ||
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index d929b1883644..aba3da2a6227 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
| @@ -615,6 +615,7 @@ nfs_fileid_to_ino_t(u64 fileid) | |||
| 615 | #define NFSDBG_CLIENT 0x0200 | 615 | #define NFSDBG_CLIENT 0x0200 |
| 616 | #define NFSDBG_MOUNT 0x0400 | 616 | #define NFSDBG_MOUNT 0x0400 |
| 617 | #define NFSDBG_FSCACHE 0x0800 | 617 | #define NFSDBG_FSCACHE 0x0800 |
| 618 | #define NFSDBG_PNFS 0x1000 | ||
| 618 | #define NFSDBG_ALL 0xFFFF | 619 | #define NFSDBG_ALL 0xFFFF |
| 619 | 620 | ||
| 620 | #ifdef __KERNEL__ | 621 | #ifdef __KERNEL__ |
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index 5eef862ec187..c38619d95a57 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h | |||
| @@ -145,6 +145,7 @@ struct nfs_server { | |||
| 145 | u32 acl_bitmask; /* V4 bitmask representing the ACEs | 145 | u32 acl_bitmask; /* V4 bitmask representing the ACEs |
| 146 | that are supported on this | 146 | that are supported on this |
| 147 | filesystem */ | 147 | filesystem */ |
| 148 | struct pnfs_layoutdriver_type *pnfs_curr_ld; /* Active layout driver */ | ||
| 148 | #endif | 149 | #endif |
| 149 | void (*destroy)(struct nfs_server *); | 150 | void (*destroy)(struct nfs_server *); |
| 150 | 151 | ||
