diff options
author | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
---|---|---|
committer | Andrea Bastoni <bastoni@cs.unc.edu> | 2010-05-30 19:16:45 -0400 |
commit | ada47b5fe13d89735805b566185f4885f5a3f750 (patch) | |
tree | 644b88f8a71896307d71438e9b3af49126ffb22b /fs/exofs/exofs.h | |
parent | 43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff) | |
parent | 3280f21d43ee541f97f8cda5792150d2dbec20d5 (diff) |
Merge branch 'wip-2.6.34' into old-private-masterarchived-private-master
Diffstat (limited to 'fs/exofs/exofs.h')
-rw-r--r-- | fs/exofs/exofs.h | 142 |
1 files changed, 134 insertions, 8 deletions
diff --git a/fs/exofs/exofs.h b/fs/exofs/exofs.h index 5ec72e020b22..22721b2fd890 100644 --- a/fs/exofs/exofs.h +++ b/fs/exofs/exofs.h | |||
@@ -30,13 +30,18 @@ | |||
30 | * along with exofs; if not, write to the Free Software | 30 | * along with exofs; if not, write to the Free Software |
31 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 31 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
32 | */ | 32 | */ |
33 | #ifndef __EXOFS_H__ | ||
34 | #define __EXOFS_H__ | ||
33 | 35 | ||
34 | #include <linux/fs.h> | 36 | #include <linux/fs.h> |
35 | #include <linux/time.h> | 37 | #include <linux/time.h> |
38 | #include <linux/backing-dev.h> | ||
36 | #include "common.h" | 39 | #include "common.h" |
37 | 40 | ||
38 | #ifndef __EXOFS_H__ | 41 | /* FIXME: Remove once pnfs hits mainline |
39 | #define __EXOFS_H__ | 42 | * #include <linux/exportfs/pnfs_osd_xdr.h> |
43 | */ | ||
44 | #include "pnfs.h" | ||
40 | 45 | ||
41 | #define EXOFS_ERR(fmt, a...) printk(KERN_ERR "exofs: " fmt, ##a) | 46 | #define EXOFS_ERR(fmt, a...) printk(KERN_ERR "exofs: " fmt, ##a) |
42 | 47 | ||
@@ -51,34 +56,111 @@ | |||
51 | /* u64 has problems with printk this will cast it to unsigned long long */ | 56 | /* u64 has problems with printk this will cast it to unsigned long long */ |
52 | #define _LLU(x) (unsigned long long)(x) | 57 | #define _LLU(x) (unsigned long long)(x) |
53 | 58 | ||
59 | struct exofs_layout { | ||
60 | osd_id s_pid; /* partition ID of file system*/ | ||
61 | |||
62 | /* Our way of looking at the data_map */ | ||
63 | unsigned stripe_unit; | ||
64 | unsigned mirrors_p1; | ||
65 | |||
66 | unsigned group_width; | ||
67 | u64 group_depth; | ||
68 | unsigned group_count; | ||
69 | |||
70 | enum exofs_inode_layout_gen_functions lay_func; | ||
71 | |||
72 | unsigned s_numdevs; /* Num of devices in array */ | ||
73 | struct osd_dev *s_ods[0]; /* Variable length */ | ||
74 | }; | ||
75 | |||
54 | /* | 76 | /* |
55 | * our extension to the in-memory superblock | 77 | * our extension to the in-memory superblock |
56 | */ | 78 | */ |
57 | struct exofs_sb_info { | 79 | struct exofs_sb_info { |
58 | struct osd_dev *s_dev; /* returned by get_osd_dev */ | 80 | struct exofs_fscb s_fscb; /* Written often, pre-allocate*/ |
59 | osd_id s_pid; /* partition ID of file system*/ | ||
60 | int s_timeout; /* timeout for OSD operations */ | 81 | int s_timeout; /* timeout for OSD operations */ |
61 | uint64_t s_nextid; /* highest object ID used */ | 82 | uint64_t s_nextid; /* highest object ID used */ |
62 | uint32_t s_numfiles; /* number of files on fs */ | 83 | uint32_t s_numfiles; /* number of files on fs */ |
63 | spinlock_t s_next_gen_lock; /* spinlock for gen # update */ | 84 | spinlock_t s_next_gen_lock; /* spinlock for gen # update */ |
64 | u32 s_next_generation; /* next gen # to use */ | 85 | u32 s_next_generation; /* next gen # to use */ |
65 | atomic_t s_curr_pending; /* number of pending commands */ | 86 | atomic_t s_curr_pending; /* number of pending commands */ |
66 | uint8_t s_cred[OSD_CAP_LEN]; /* all-powerful credential */ | 87 | uint8_t s_cred[OSD_CAP_LEN]; /* credential for the fscb */ |
88 | struct backing_dev_info bdi; /* register our bdi with VFS */ | ||
89 | |||
90 | struct pnfs_osd_data_map data_map; /* Default raid to use | ||
91 | * FIXME: Needed ? | ||
92 | */ | ||
93 | /* struct exofs_layout dir_layout;*/ /* Default dir layout */ | ||
94 | struct exofs_layout layout; /* Default files layout, | ||
95 | * contains the variable osd_dev | ||
96 | * array. Keep last */ | ||
97 | struct osd_dev *_min_one_dev[1]; /* Place holder for one dev */ | ||
67 | }; | 98 | }; |
68 | 99 | ||
69 | /* | 100 | /* |
70 | * our extension to the in-memory inode | 101 | * our extension to the in-memory inode |
71 | */ | 102 | */ |
72 | struct exofs_i_info { | 103 | struct exofs_i_info { |
104 | struct inode vfs_inode; /* normal in-memory inode */ | ||
105 | wait_queue_head_t i_wq; /* wait queue for inode */ | ||
73 | unsigned long i_flags; /* various atomic flags */ | 106 | unsigned long i_flags; /* various atomic flags */ |
74 | uint32_t i_data[EXOFS_IDATA];/*short symlink names and device #s*/ | 107 | uint32_t i_data[EXOFS_IDATA];/*short symlink names and device #s*/ |
75 | uint32_t i_dir_start_lookup; /* which page to start lookup */ | 108 | uint32_t i_dir_start_lookup; /* which page to start lookup */ |
76 | wait_queue_head_t i_wq; /* wait queue for inode */ | ||
77 | uint64_t i_commit_size; /* the object's written length */ | 109 | uint64_t i_commit_size; /* the object's written length */ |
78 | uint8_t i_cred[OSD_CAP_LEN];/* all-powerful credential */ | 110 | uint8_t i_cred[OSD_CAP_LEN];/* all-powerful credential */ |
79 | struct inode vfs_inode; /* normal in-memory inode */ | ||
80 | }; | 111 | }; |
81 | 112 | ||
113 | static inline osd_id exofs_oi_objno(struct exofs_i_info *oi) | ||
114 | { | ||
115 | return oi->vfs_inode.i_ino + EXOFS_OBJ_OFF; | ||
116 | } | ||
117 | |||
118 | struct exofs_io_state; | ||
119 | typedef void (*exofs_io_done_fn)(struct exofs_io_state *or, void *private); | ||
120 | |||
121 | struct exofs_io_state { | ||
122 | struct kref kref; | ||
123 | |||
124 | void *private; | ||
125 | exofs_io_done_fn done; | ||
126 | |||
127 | struct exofs_layout *layout; | ||
128 | struct osd_obj_id obj; | ||
129 | u8 *cred; | ||
130 | |||
131 | /* Global read/write IO*/ | ||
132 | loff_t offset; | ||
133 | unsigned long length; | ||
134 | void *kern_buff; | ||
135 | |||
136 | struct page **pages; | ||
137 | unsigned nr_pages; | ||
138 | unsigned pgbase; | ||
139 | unsigned pages_consumed; | ||
140 | |||
141 | /* Attributes */ | ||
142 | unsigned in_attr_len; | ||
143 | struct osd_attr *in_attr; | ||
144 | unsigned out_attr_len; | ||
145 | struct osd_attr *out_attr; | ||
146 | |||
147 | /* Variable array of size numdevs */ | ||
148 | unsigned numdevs; | ||
149 | struct exofs_per_dev_state { | ||
150 | struct osd_request *or; | ||
151 | struct bio *bio; | ||
152 | loff_t offset; | ||
153 | unsigned length; | ||
154 | unsigned dev; | ||
155 | } per_dev[]; | ||
156 | }; | ||
157 | |||
158 | static inline unsigned exofs_io_state_size(unsigned numdevs) | ||
159 | { | ||
160 | return sizeof(struct exofs_io_state) + | ||
161 | sizeof(struct exofs_per_dev_state) * numdevs; | ||
162 | } | ||
163 | |||
82 | /* | 164 | /* |
83 | * our inode flags | 165 | * our inode flags |
84 | */ | 166 | */ |
@@ -123,6 +205,12 @@ static inline struct exofs_i_info *exofs_i(struct inode *inode) | |||
123 | } | 205 | } |
124 | 206 | ||
125 | /* | 207 | /* |
208 | * Given a layout, object_number and stripe_index return the associated global | ||
209 | * dev_index | ||
210 | */ | ||
211 | unsigned exofs_layout_od_id(struct exofs_layout *layout, | ||
212 | osd_id obj_no, unsigned layout_index); | ||
213 | /* | ||
126 | * Maximum count of links to a file | 214 | * Maximum count of links to a file |
127 | */ | 215 | */ |
128 | #define EXOFS_LINK_MAX 32000 | 216 | #define EXOFS_LINK_MAX 32000 |
@@ -130,6 +218,43 @@ static inline struct exofs_i_info *exofs_i(struct inode *inode) | |||
130 | /************************* | 218 | /************************* |
131 | * function declarations * | 219 | * function declarations * |
132 | *************************/ | 220 | *************************/ |
221 | |||
222 | /* ios.c */ | ||
223 | void exofs_make_credential(u8 cred_a[OSD_CAP_LEN], | ||
224 | const struct osd_obj_id *obj); | ||
225 | int exofs_read_kern(struct osd_dev *od, u8 *cred, struct osd_obj_id *obj, | ||
226 | u64 offset, void *p, unsigned length); | ||
227 | |||
228 | int exofs_get_io_state(struct exofs_layout *layout, | ||
229 | struct exofs_io_state **ios); | ||
230 | void exofs_put_io_state(struct exofs_io_state *ios); | ||
231 | |||
232 | int exofs_check_io(struct exofs_io_state *ios, u64 *resid); | ||
233 | |||
234 | int exofs_sbi_create(struct exofs_io_state *ios); | ||
235 | int exofs_sbi_remove(struct exofs_io_state *ios); | ||
236 | int exofs_sbi_write(struct exofs_io_state *ios); | ||
237 | int exofs_sbi_read(struct exofs_io_state *ios); | ||
238 | |||
239 | int extract_attr_from_ios(struct exofs_io_state *ios, struct osd_attr *attr); | ||
240 | |||
241 | int exofs_oi_truncate(struct exofs_i_info *oi, u64 new_len); | ||
242 | static inline int exofs_oi_write(struct exofs_i_info *oi, | ||
243 | struct exofs_io_state *ios) | ||
244 | { | ||
245 | ios->obj.id = exofs_oi_objno(oi); | ||
246 | ios->cred = oi->i_cred; | ||
247 | return exofs_sbi_write(ios); | ||
248 | } | ||
249 | |||
250 | static inline int exofs_oi_read(struct exofs_i_info *oi, | ||
251 | struct exofs_io_state *ios) | ||
252 | { | ||
253 | ios->obj.id = exofs_oi_objno(oi); | ||
254 | ios->cred = oi->i_cred; | ||
255 | return exofs_sbi_read(ios); | ||
256 | } | ||
257 | |||
133 | /* inode.c */ | 258 | /* inode.c */ |
134 | void exofs_truncate(struct inode *inode); | 259 | void exofs_truncate(struct inode *inode); |
135 | int exofs_setattr(struct dentry *, struct iattr *); | 260 | int exofs_setattr(struct dentry *, struct iattr *); |
@@ -138,7 +263,7 @@ int exofs_write_begin(struct file *file, struct address_space *mapping, | |||
138 | struct page **pagep, void **fsdata); | 263 | struct page **pagep, void **fsdata); |
139 | extern struct inode *exofs_iget(struct super_block *, unsigned long); | 264 | extern struct inode *exofs_iget(struct super_block *, unsigned long); |
140 | struct inode *exofs_new_inode(struct inode *, int); | 265 | struct inode *exofs_new_inode(struct inode *, int); |
141 | extern int exofs_write_inode(struct inode *, int); | 266 | extern int exofs_write_inode(struct inode *, struct writeback_control *wbc); |
142 | extern void exofs_delete_inode(struct inode *); | 267 | extern void exofs_delete_inode(struct inode *); |
143 | 268 | ||
144 | /* dir.c: */ | 269 | /* dir.c: */ |
@@ -169,6 +294,7 @@ extern const struct file_operations exofs_file_operations; | |||
169 | 294 | ||
170 | /* inode.c */ | 295 | /* inode.c */ |
171 | extern const struct address_space_operations exofs_aops; | 296 | extern const struct address_space_operations exofs_aops; |
297 | extern const struct osd_attr g_attr_logical_length; | ||
172 | 298 | ||
173 | /* namei.c */ | 299 | /* namei.c */ |
174 | extern const struct inode_operations exofs_dir_inode_operations; | 300 | extern const struct inode_operations exofs_dir_inode_operations; |