aboutsummaryrefslogtreecommitdiffstats
path: root/fs/exofs/exofs.h
diff options
context:
space:
mode:
authorAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
committerAndrea Bastoni <bastoni@cs.unc.edu>2010-05-30 19:16:45 -0400
commitada47b5fe13d89735805b566185f4885f5a3f750 (patch)
tree644b88f8a71896307d71438e9b3af49126ffb22b /fs/exofs/exofs.h
parent43e98717ad40a4ae64545b5ba047c7b86aa44f4f (diff)
parent3280f21d43ee541f97f8cda5792150d2dbec20d5 (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.h142
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
59struct 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 */
57struct exofs_sb_info { 79struct 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 */
72struct exofs_i_info { 103struct 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
113static inline osd_id exofs_oi_objno(struct exofs_i_info *oi)
114{
115 return oi->vfs_inode.i_ino + EXOFS_OBJ_OFF;
116}
117
118struct exofs_io_state;
119typedef void (*exofs_io_done_fn)(struct exofs_io_state *or, void *private);
120
121struct 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
158static 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 */
211unsigned 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 */
223void exofs_make_credential(u8 cred_a[OSD_CAP_LEN],
224 const struct osd_obj_id *obj);
225int exofs_read_kern(struct osd_dev *od, u8 *cred, struct osd_obj_id *obj,
226 u64 offset, void *p, unsigned length);
227
228int exofs_get_io_state(struct exofs_layout *layout,
229 struct exofs_io_state **ios);
230void exofs_put_io_state(struct exofs_io_state *ios);
231
232int exofs_check_io(struct exofs_io_state *ios, u64 *resid);
233
234int exofs_sbi_create(struct exofs_io_state *ios);
235int exofs_sbi_remove(struct exofs_io_state *ios);
236int exofs_sbi_write(struct exofs_io_state *ios);
237int exofs_sbi_read(struct exofs_io_state *ios);
238
239int extract_attr_from_ios(struct exofs_io_state *ios, struct osd_attr *attr);
240
241int exofs_oi_truncate(struct exofs_i_info *oi, u64 new_len);
242static 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
250static 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 */
134void exofs_truncate(struct inode *inode); 259void exofs_truncate(struct inode *inode);
135int exofs_setattr(struct dentry *, struct iattr *); 260int 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);
139extern struct inode *exofs_iget(struct super_block *, unsigned long); 264extern struct inode *exofs_iget(struct super_block *, unsigned long);
140struct inode *exofs_new_inode(struct inode *, int); 265struct inode *exofs_new_inode(struct inode *, int);
141extern int exofs_write_inode(struct inode *, int); 266extern int exofs_write_inode(struct inode *, struct writeback_control *wbc);
142extern void exofs_delete_inode(struct inode *); 267extern 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 */
171extern const struct address_space_operations exofs_aops; 296extern const struct address_space_operations exofs_aops;
297extern const struct osd_attr g_attr_logical_length;
172 298
173/* namei.c */ 299/* namei.c */
174extern const struct inode_operations exofs_dir_inode_operations; 300extern const struct inode_operations exofs_dir_inode_operations;