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
objlayout
objlayout.h
Go to the documentation of this file.
1
/*
2
* Data types and function declerations for interfacing with the
3
* pNFS standard object layout driver.
4
*
5
* Copyright (C) 2007 Panasas Inc. [year of first publication]
6
* All rights reserved.
7
*
8
* Benny Halevy <
[email protected]
>
9
* Boaz Harrosh <
[email protected]
>
10
*
11
* This program is free software; you can redistribute it and/or modify
12
* it under the terms of the GNU General Public License version 2
13
* See the file COPYING included with this distribution for more details.
14
*
15
* Redistribution and use in source and binary forms, with or without
16
* modification, are permitted provided that the following conditions
17
* are met:
18
*
19
* 1. Redistributions of source code must retain the above copyright
20
* notice, this list of conditions and the following disclaimer.
21
* 2. Redistributions in binary form must reproduce the above copyright
22
* notice, this list of conditions and the following disclaimer in the
23
* documentation and/or other materials provided with the distribution.
24
* 3. Neither the name of the Panasas company nor the names of its
25
* contributors may be used to endorse or promote products derived
26
* from this software without specific prior written permission.
27
*
28
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
29
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
30
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
31
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
32
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
33
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
34
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
35
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
36
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
37
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
38
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39
*/
40
41
#ifndef _OBJLAYOUT_H
42
#define _OBJLAYOUT_H
43
44
#include <linux/nfs_fs.h>
45
#include <
linux/pnfs_osd_xdr.h
>
46
#include "../pnfs.h"
47
48
/*
49
* per-inode layout
50
*/
51
struct
objlayout
{
52
struct
pnfs_layout_hdr
pnfs_layout
;
53
54
/* for layout_commit */
55
enum
osd_delta_space_valid_enum
{
56
OBJ_DSU_INIT
= 0,
57
OBJ_DSU_VALID
,
58
OBJ_DSU_INVALID
,
59
}
delta_space_valid
;
60
s64
delta_space_used
;
/* consumed by write ops */
61
62
/* for layout_return */
63
spinlock_t
lock
;
64
struct
list_head
err_list
;
65
};
66
67
static
inline
struct
objlayout
*
68
OBJLAYOUT(
struct
pnfs_layout_hdr *lo)
69
{
70
return
container_of
(lo,
struct
objlayout
,
pnfs_layout
);
71
}
72
73
/*
74
* per-I/O operation state
75
* embedded in objects provider io_state data structure
76
*/
77
struct
objlayout_io_res
{
78
struct
objlayout
*
objlay
;
79
80
void
*
rpcdata
;
81
int
status
;
/* res */
82
int
committed
;
/* res */
83
84
/* Error reporting (layout_return) */
85
struct
list_head
err_list
;
86
unsigned
num_comps
;
87
/* Pointer to array of error descriptors of size num_comps.
88
* It should contain as many entries as devices in the osd_layout
89
* that participate in the I/O. It is up to the io_engine to allocate
90
* needed space and set num_comps.
91
*/
92
struct
pnfs_osd_ioerr
*
ioerrs
;
93
};
94
95
static
inline
96
void
objlayout_init_ioerrs(
struct
objlayout_io_res
*oir,
unsigned
num_comps,
97
struct
pnfs_osd_ioerr
*ioerrs,
void
*rpcdata,
98
struct
pnfs_layout_hdr *pnfs_layout_type)
99
{
100
oir->
objlay
= OBJLAYOUT(pnfs_layout_type);
101
oir->
rpcdata
= rpcdata;
102
INIT_LIST_HEAD(&oir->
err_list
);
103
oir->
num_comps
= num_comps;
104
oir->
ioerrs
= ioerrs;
105
}
106
107
/*
108
* Raid engine I/O API
109
*/
110
extern
int
objio_alloc_lseg
(
struct
pnfs_layout_segment
**
outp
,
111
struct
pnfs_layout_hdr *pnfslay,
112
struct
pnfs_layout_range
*
range
,
113
struct
xdr_stream *xdr,
114
gfp_t
gfp_flags);
115
extern
void
objio_free_lseg
(
struct
pnfs_layout_segment
*lseg);
116
117
/* objio_free_result will free these @oir structs recieved from
118
* objlayout_{read,write}_done
119
*/
120
extern
void
objio_free_result
(
struct
objlayout_io_res
*oir);
121
122
extern
int
objio_read_pagelist
(
struct
nfs_read_data
*rdata);
123
extern
int
objio_write_pagelist
(
struct
nfs_write_data
*wdata,
int
how);
124
125
/*
126
* callback API
127
*/
128
extern
void
objlayout_io_set_result
(
struct
objlayout_io_res
*oir,
129
unsigned
index
,
struct
pnfs_osd_objid
*pooid,
130
int
osd_error,
u64
offset
,
u64
length
,
bool
is_write);
131
132
static
inline
void
133
objlayout_add_delta_space_used(
struct
objlayout
*objlay,
s64
space_used
)
134
{
135
/* If one of the I/Os errored out and the delta_space_used was
136
* invalid we render the complete report as invalid. Protocol mandate
137
* the DSU be accurate or not reported.
138
*/
139
spin_lock(&objlay->
lock
);
140
if
(objlay->
delta_space_valid
!= OBJ_DSU_INVALID) {
141
objlay->
delta_space_valid
= OBJ_DSU_VALID;
142
objlay->
delta_space_used
+=
space_used
;
143
}
144
spin_unlock(&objlay->
lock
);
145
}
146
147
extern
void
objlayout_read_done
(
struct
objlayout_io_res
*oir,
148
ssize_t
status
,
bool
sync
);
149
extern
void
objlayout_write_done
(
struct
objlayout_io_res
*oir,
150
ssize_t
status
,
bool
sync
);
151
152
extern
int
objlayout_get_deviceinfo
(
struct
pnfs_layout_hdr *pnfslay,
153
struct
nfs4_deviceid
*
d_id
,
struct
pnfs_osd_deviceaddr
**deviceaddr,
154
gfp_t
gfp_flags);
155
extern
void
objlayout_put_deviceinfo
(
struct
pnfs_osd_deviceaddr
*deviceaddr);
156
157
/*
158
* exported generic objects function vectors
159
*/
160
161
extern
struct
pnfs_layout_hdr *
objlayout_alloc_layout_hdr
(
struct
inode
*,
gfp_t
gfp_flags);
162
extern
void
objlayout_free_layout_hdr
(
struct
pnfs_layout_hdr *);
163
164
extern
struct
pnfs_layout_segment
*
objlayout_alloc_lseg
(
165
struct
pnfs_layout_hdr *,
166
struct
nfs4_layoutget_res
*,
167
gfp_t
gfp_flags);
168
extern
void
objlayout_free_lseg
(
struct
pnfs_layout_segment
*);
169
170
extern
enum
pnfs_try_status
objlayout_read_pagelist
(
171
struct
nfs_read_data
*);
172
173
extern
enum
pnfs_try_status
objlayout_write_pagelist
(
174
struct
nfs_write_data
*,
175
int
how);
176
177
extern
void
objlayout_encode_layoutcommit
(
178
struct
pnfs_layout_hdr *,
179
struct
xdr_stream *,
180
const
struct
nfs4_layoutcommit_args
*);
181
182
extern
void
objlayout_encode_layoutreturn
(
183
struct
pnfs_layout_hdr *,
184
struct
xdr_stream *,
185
const
struct
nfs4_layoutreturn_args
*);
186
187
extern
int
objlayout_autologin
(
struct
pnfs_osd_deviceaddr
*deviceaddr);
188
189
#endif
/* _OBJLAYOUT_H */
Generated on Thu Jan 10 2013 14:48:44 for Linux Kernel by
1.8.2