Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
fs
nfs
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
54
enum
stripetype4
{
55
STRIPE_SPARSE
= 1,
56
STRIPE_DENSE
= 2
57
};
58
59
/* Individual ip address */
60
struct
nfs4_pnfs_ds_addr
{
61
struct
sockaddr_storage
da_addr
;
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 */
70
struct
list_head
ds_addrs
;
71
struct
nfs_client
*
ds_clp
;
72
atomic_t
ds_count
;
73
};
74
75
struct
nfs4_file_layout_dsaddr
{
76
struct
nfs4_deviceid_node
id_node
;
77
u32
stripe_count
;
78
u8
*
stripe_indices
;
79
u32
ds_num
;
80
struct
nfs4_pnfs_ds
*
ds_list
[1];
81
};
82
83
struct
nfs4_filelayout_segment
{
84
struct
pnfs_layout_segment
generic_hdr
;
85
u32
stripe_type
;
86
u32
commit_through_mds
;
87
u32
stripe_unit
;
88
u32
first_stripe_index
;
89
u64
pattern_offset
;
90
struct
nfs4_file_layout_dsaddr
*
dsaddr
;
/* Point to GETDEVINFO data */
91
unsigned
int
num_fh
;
92
struct
nfs_fh
**
fh_array
;
93
};
94
95
struct
nfs4_filelayout
{
96
struct
pnfs_layout_hdr
generic_hdr
;
97
struct
pnfs_ds_commit_info
commit_info
;
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,
110
struct
nfs4_filelayout_segment
,
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
*
141
nfs4_fl_select_ds_fh
(
struct
pnfs_layout_segment
*lseg,
u32
j
);
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
);
145
u32
nfs4_fl_calc_ds_index
(
struct
pnfs_layout_segment
*lseg,
u32
j
);
146
struct
nfs4_pnfs_ds
*
nfs4_fl_prepare_ds
(
struct
pnfs_layout_segment
*lseg,
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);
150
struct
nfs4_file_layout_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 */
Generated on Thu Jan 10 2013 14:48:30 for Linux Kernel by
1.8.2