Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
nfs4filelayout.h
Go to the documentation of this file.
1 /*
2  * NFSv4 file layout driver data structures.
3  *
4  * Copyright (c) 2002
5  * The Regents of the University of Michigan
6  * All Rights Reserved
7  *
8  * Dean Hildebrand <[email protected]>
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_NFS4FILELAYOUT_H
31 #define FS_NFS_NFS4FILELAYOUT_H
32 
33 #include "pnfs.h"
34 
35 /*
36  * Default data server connection timeout and retrans vaules.
37  * Set by module paramters dataserver_timeo and dataserver_retrans.
38  */
39 #define NFS4_DEF_DS_TIMEO 60
40 #define NFS4_DEF_DS_RETRANS 5
41 
42 /*
43  * Field testing shows we need to support up to 4096 stripe indices.
44  * We store each index as a u8 (u32 on the wire) to keep the memory footprint
45  * reasonable. This in turn means we support a maximum of 256
46  * RFC 5661 multipath_list4 structures.
47  */
48 #define NFS4_PNFS_MAX_STRIPE_CNT 4096
49 #define NFS4_PNFS_MAX_MULTI_CNT 256 /* 256 fit into a u8 stripe_index */
50 
51 /* error codes for internal use */
52 #define NFS4ERR_RESET_TO_MDS 12001
53 
57 };
58 
59 /* Individual ip address */
62  size_t da_addrlen;
63  struct list_head da_node; /* nfs4_pnfs_dev_hlist dev_dslist */
64  char *da_remotestr; /* human readable addr+port */
65 };
66 
67 struct nfs4_pnfs_ds {
68  struct list_head ds_node; /* nfs4_pnfs_dev_hlist dev_dslist */
69  char *ds_remotestr; /* comma sep list of addrs */
71  struct nfs_client *ds_clp;
73 };
74 
76  struct nfs4_deviceid_node id_node;
80  struct nfs4_pnfs_ds *ds_list[1];
81 };
82 
90  struct nfs4_file_layout_dsaddr *dsaddr; /* Point to GETDEVINFO data */
91  unsigned int num_fh;
92  struct nfs_fh **fh_array;
93 };
94 
96  struct pnfs_layout_hdr generic_hdr;
98 };
99 
100 static inline struct nfs4_filelayout *
101 FILELAYOUT_FROM_HDR(struct pnfs_layout_hdr *lo)
102 {
103  return container_of(lo, struct nfs4_filelayout, generic_hdr);
104 }
105 
106 static inline struct nfs4_filelayout_segment *
107 FILELAYOUT_LSEG(struct pnfs_layout_segment *lseg)
108 {
109  return container_of(lseg,
111  generic_hdr);
112 }
113 
114 static inline struct nfs4_deviceid_node *
115 FILELAYOUT_DEVID_NODE(struct pnfs_layout_segment *lseg)
116 {
117  return &FILELAYOUT_LSEG(lseg)->dsaddr->id_node;
118 }
119 
120 static inline void
121 filelayout_mark_devid_invalid(struct nfs4_deviceid_node *node)
122 {
123  u32 *p = (u32 *)&node->deviceid;
124 
125  printk(KERN_WARNING "NFS: Deviceid [%x%x%x%x] marked out of use.\n",
126  p[0], p[1], p[2], p[3]);
127 
128  set_bit(NFS_DEVICEID_INVALID, &node->flags);
129 }
130 
131 static inline bool
132 filelayout_test_devid_invalid(struct nfs4_deviceid_node *node)
133 {
134  return test_bit(NFS_DEVICEID_INVALID, &node->flags);
135 }
136 
137 extern bool
138 filelayout_test_devid_unavailable(struct nfs4_deviceid_node *node);
139 
140 extern struct nfs_fh *
142 
143 extern void print_ds(struct nfs4_pnfs_ds *ds);
144 u32 nfs4_fl_calc_j_index(struct pnfs_layout_segment *lseg, loff_t offset);
147  u32 ds_idx);
148 extern void nfs4_fl_put_deviceid(struct nfs4_file_layout_dsaddr *dsaddr);
149 extern void nfs4_fl_free_deviceid(struct nfs4_file_layout_dsaddr *dsaddr);
151 filelayout_get_device_info(struct inode *inode, struct nfs4_deviceid *dev_id, gfp_t gfp_flags);
152 
153 #endif /* FS_NFS_NFS4FILELAYOUT_H */