diff options
-rw-r--r-- | fs/exofs/exofs.h | 24 | ||||
-rw-r--r-- | fs/exofs/inode.c | 14 | ||||
-rw-r--r-- | fs/exofs/ios.c | 36 | ||||
-rw-r--r-- | fs/exofs/super.c | 51 |
4 files changed, 71 insertions, 54 deletions
diff --git a/fs/exofs/exofs.h b/fs/exofs/exofs.h index 13663da2b119..33c68568b338 100644 --- a/fs/exofs/exofs.h +++ b/fs/exofs/exofs.h | |||
@@ -55,12 +55,18 @@ | |||
55 | /* u64 has problems with printk this will cast it to unsigned long long */ | 55 | /* u64 has problems with printk this will cast it to unsigned long long */ |
56 | #define _LLU(x) (unsigned long long)(x) | 56 | #define _LLU(x) (unsigned long long)(x) |
57 | 57 | ||
58 | struct exofs_layout { | ||
59 | osd_id s_pid; /* partition ID of file system*/ | ||
60 | |||
61 | unsigned s_numdevs; /* Num of devices in array */ | ||
62 | struct osd_dev *s_ods[0]; /* Variable length */ | ||
63 | }; | ||
64 | |||
58 | /* | 65 | /* |
59 | * our extension to the in-memory superblock | 66 | * our extension to the in-memory superblock |
60 | */ | 67 | */ |
61 | struct exofs_sb_info { | 68 | struct exofs_sb_info { |
62 | struct exofs_fscb s_fscb; /* Written often, pre-allocate*/ | 69 | struct exofs_fscb s_fscb; /* Written often, pre-allocate*/ |
63 | osd_id s_pid; /* partition ID of file system*/ | ||
64 | int s_timeout; /* timeout for OSD operations */ | 70 | int s_timeout; /* timeout for OSD operations */ |
65 | uint64_t s_nextid; /* highest object ID used */ | 71 | uint64_t s_nextid; /* highest object ID used */ |
66 | uint32_t s_numfiles; /* number of files on fs */ | 72 | uint32_t s_numfiles; /* number of files on fs */ |
@@ -69,9 +75,14 @@ struct exofs_sb_info { | |||
69 | atomic_t s_curr_pending; /* number of pending commands */ | 75 | atomic_t s_curr_pending; /* number of pending commands */ |
70 | uint8_t s_cred[OSD_CAP_LEN]; /* credential for the fscb */ | 76 | uint8_t s_cred[OSD_CAP_LEN]; /* credential for the fscb */ |
71 | 77 | ||
72 | struct pnfs_osd_data_map data_map; /* Default raid to use */ | 78 | struct pnfs_osd_data_map data_map; /* Default raid to use |
73 | unsigned s_numdevs; /* Num of devices in array */ | 79 | * FIXME: Needed ? |
74 | struct osd_dev *s_ods[1]; /* Variable length, minimum 1 */ | 80 | */ |
81 | /* struct exofs_layout dir_layout;*/ /* Default dir layout */ | ||
82 | struct exofs_layout layout; /* Default files layout, | ||
83 | * contains the variable osd_dev | ||
84 | * array. Keep last */ | ||
85 | struct osd_dev *_min_one_dev[1]; /* Place holder for one dev */ | ||
75 | }; | 86 | }; |
76 | 87 | ||
77 | /* | 88 | /* |
@@ -101,7 +112,7 @@ struct exofs_io_state { | |||
101 | void *private; | 112 | void *private; |
102 | exofs_io_done_fn done; | 113 | exofs_io_done_fn done; |
103 | 114 | ||
104 | struct exofs_sb_info *sbi; | 115 | struct exofs_layout *layout; |
105 | struct osd_obj_id obj; | 116 | struct osd_obj_id obj; |
106 | u8 *cred; | 117 | u8 *cred; |
107 | 118 | ||
@@ -189,7 +200,8 @@ void exofs_make_credential(u8 cred_a[OSD_CAP_LEN], | |||
189 | int exofs_read_kern(struct osd_dev *od, u8 *cred, struct osd_obj_id *obj, | 200 | int exofs_read_kern(struct osd_dev *od, u8 *cred, struct osd_obj_id *obj, |
190 | u64 offset, void *p, unsigned length); | 201 | u64 offset, void *p, unsigned length); |
191 | 202 | ||
192 | int exofs_get_io_state(struct exofs_sb_info *sbi, struct exofs_io_state** ios); | 203 | int exofs_get_io_state(struct exofs_layout *layout, |
204 | struct exofs_io_state **ios); | ||
193 | void exofs_put_io_state(struct exofs_io_state *ios); | 205 | void exofs_put_io_state(struct exofs_io_state *ios); |
194 | 206 | ||
195 | int exofs_check_io(struct exofs_io_state *ios, u64 *resid); | 207 | int exofs_check_io(struct exofs_io_state *ios, u64 *resid); |
diff --git a/fs/exofs/inode.c b/fs/exofs/inode.c index c88a0c5250cb..03189a958b33 100644 --- a/fs/exofs/inode.c +++ b/fs/exofs/inode.c | |||
@@ -65,7 +65,7 @@ static void _pcol_init(struct page_collect *pcol, unsigned expected_pages, | |||
65 | /* Create master bios on first Q, later on cloning, each clone will be | 65 | /* Create master bios on first Q, later on cloning, each clone will be |
66 | * allocated on it's destination Q | 66 | * allocated on it's destination Q |
67 | */ | 67 | */ |
68 | pcol->req_q = osd_request_queue(sbi->s_ods[0]); | 68 | pcol->req_q = osd_request_queue(sbi->layout.s_ods[0]); |
69 | pcol->inode = inode; | 69 | pcol->inode = inode; |
70 | pcol->expected_pages = expected_pages; | 70 | pcol->expected_pages = expected_pages; |
71 | 71 | ||
@@ -99,7 +99,7 @@ static int pcol_try_alloc(struct page_collect *pcol) | |||
99 | BIO_MAX_PAGES_KMALLOC); | 99 | BIO_MAX_PAGES_KMALLOC); |
100 | 100 | ||
101 | if (!pcol->ios) { /* First time allocate io_state */ | 101 | if (!pcol->ios) { /* First time allocate io_state */ |
102 | int ret = exofs_get_io_state(pcol->sbi, &pcol->ios); | 102 | int ret = exofs_get_io_state(&pcol->sbi->layout, &pcol->ios); |
103 | 103 | ||
104 | if (ret) | 104 | if (ret) |
105 | return ret; | 105 | return ret; |
@@ -872,7 +872,7 @@ static int exofs_get_inode(struct super_block *sb, struct exofs_i_info *oi, | |||
872 | int ret; | 872 | int ret; |
873 | 873 | ||
874 | *obj_size = ~0; | 874 | *obj_size = ~0; |
875 | ret = exofs_get_io_state(sbi, &ios); | 875 | ret = exofs_get_io_state(&sbi->layout, &ios); |
876 | if (unlikely(ret)) { | 876 | if (unlikely(ret)) { |
877 | EXOFS_ERR("%s: exofs_get_io_state failed.\n", __func__); | 877 | EXOFS_ERR("%s: exofs_get_io_state failed.\n", __func__); |
878 | return ret; | 878 | return ret; |
@@ -1043,7 +1043,7 @@ static void create_done(struct exofs_io_state *ios, void *p) | |||
1043 | 1043 | ||
1044 | if (unlikely(ret)) { | 1044 | if (unlikely(ret)) { |
1045 | EXOFS_ERR("object=0x%llx creation faild in pid=0x%llx", | 1045 | EXOFS_ERR("object=0x%llx creation faild in pid=0x%llx", |
1046 | _LLU(exofs_oi_objno(oi)), _LLU(sbi->s_pid)); | 1046 | _LLU(exofs_oi_objno(oi)), _LLU(sbi->layout.s_pid)); |
1047 | /*TODO: When FS is corrupted creation can fail, object already | 1047 | /*TODO: When FS is corrupted creation can fail, object already |
1048 | * exist. Get rid of this asynchronous creation, if exist | 1048 | * exist. Get rid of this asynchronous creation, if exist |
1049 | * increment the obj counter and try the next object. Until we | 1049 | * increment the obj counter and try the next object. Until we |
@@ -1104,7 +1104,7 @@ struct inode *exofs_new_inode(struct inode *dir, int mode) | |||
1104 | 1104 | ||
1105 | mark_inode_dirty(inode); | 1105 | mark_inode_dirty(inode); |
1106 | 1106 | ||
1107 | ret = exofs_get_io_state(sbi, &ios); | 1107 | ret = exofs_get_io_state(&sbi->layout, &ios); |
1108 | if (unlikely(ret)) { | 1108 | if (unlikely(ret)) { |
1109 | EXOFS_ERR("exofs_new_inode: exofs_get_io_state failed\n"); | 1109 | EXOFS_ERR("exofs_new_inode: exofs_get_io_state failed\n"); |
1110 | return ERR_PTR(ret); | 1110 | return ERR_PTR(ret); |
@@ -1202,7 +1202,7 @@ static int exofs_update_inode(struct inode *inode, int do_sync) | |||
1202 | } else | 1202 | } else |
1203 | memcpy(fcb->i_data, oi->i_data, sizeof(fcb->i_data)); | 1203 | memcpy(fcb->i_data, oi->i_data, sizeof(fcb->i_data)); |
1204 | 1204 | ||
1205 | ret = exofs_get_io_state(sbi, &ios); | 1205 | ret = exofs_get_io_state(&sbi->layout, &ios); |
1206 | if (unlikely(ret)) { | 1206 | if (unlikely(ret)) { |
1207 | EXOFS_ERR("%s: exofs_get_io_state failed.\n", __func__); | 1207 | EXOFS_ERR("%s: exofs_get_io_state failed.\n", __func__); |
1208 | goto free_args; | 1208 | goto free_args; |
@@ -1286,7 +1286,7 @@ void exofs_delete_inode(struct inode *inode) | |||
1286 | 1286 | ||
1287 | clear_inode(inode); | 1287 | clear_inode(inode); |
1288 | 1288 | ||
1289 | ret = exofs_get_io_state(sbi, &ios); | 1289 | ret = exofs_get_io_state(&sbi->layout, &ios); |
1290 | if (unlikely(ret)) { | 1290 | if (unlikely(ret)) { |
1291 | EXOFS_ERR("%s: exofs_get_io_state failed\n", __func__); | 1291 | EXOFS_ERR("%s: exofs_get_io_state failed\n", __func__); |
1292 | return; | 1292 | return; |
diff --git a/fs/exofs/ios.c b/fs/exofs/ios.c index 439c5d097b27..83e54a77b992 100644 --- a/fs/exofs/ios.c +++ b/fs/exofs/ios.c | |||
@@ -67,23 +67,24 @@ out: | |||
67 | return ret; | 67 | return ret; |
68 | } | 68 | } |
69 | 69 | ||
70 | int exofs_get_io_state(struct exofs_sb_info *sbi, struct exofs_io_state** pios) | 70 | int exofs_get_io_state(struct exofs_layout *layout, |
71 | struct exofs_io_state **pios) | ||
71 | { | 72 | { |
72 | struct exofs_io_state *ios; | 73 | struct exofs_io_state *ios; |
73 | 74 | ||
74 | /*TODO: Maybe use kmem_cach per sbi of size | 75 | /*TODO: Maybe use kmem_cach per sbi of size |
75 | * exofs_io_state_size(sbi->s_numdevs) | 76 | * exofs_io_state_size(layout->s_numdevs) |
76 | */ | 77 | */ |
77 | ios = kzalloc(exofs_io_state_size(sbi->s_numdevs), GFP_KERNEL); | 78 | ios = kzalloc(exofs_io_state_size(layout->s_numdevs), GFP_KERNEL); |
78 | if (unlikely(!ios)) { | 79 | if (unlikely(!ios)) { |
79 | EXOFS_DBGMSG("Faild kzalloc bytes=%d\n", | 80 | EXOFS_DBGMSG("Faild kzalloc bytes=%d\n", |
80 | exofs_io_state_size(sbi->s_numdevs)); | 81 | exofs_io_state_size(layout->s_numdevs)); |
81 | *pios = NULL; | 82 | *pios = NULL; |
82 | return -ENOMEM; | 83 | return -ENOMEM; |
83 | } | 84 | } |
84 | 85 | ||
85 | ios->sbi = sbi; | 86 | ios->layout = layout; |
86 | ios->obj.partition = sbi->s_pid; | 87 | ios->obj.partition = layout->s_pid; |
87 | *pios = ios; | 88 | *pios = ios; |
88 | return 0; | 89 | return 0; |
89 | } | 90 | } |
@@ -238,10 +239,10 @@ int exofs_sbi_create(struct exofs_io_state *ios) | |||
238 | { | 239 | { |
239 | int i, ret; | 240 | int i, ret; |
240 | 241 | ||
241 | for (i = 0; i < ios->sbi->s_numdevs; i++) { | 242 | for (i = 0; i < ios->layout->s_numdevs; i++) { |
242 | struct osd_request *or; | 243 | struct osd_request *or; |
243 | 244 | ||
244 | or = osd_start_request(ios->sbi->s_ods[i], GFP_KERNEL); | 245 | or = osd_start_request(ios->layout->s_ods[i], GFP_KERNEL); |
245 | if (unlikely(!or)) { | 246 | if (unlikely(!or)) { |
246 | EXOFS_ERR("%s: osd_start_request failed\n", __func__); | 247 | EXOFS_ERR("%s: osd_start_request failed\n", __func__); |
247 | ret = -ENOMEM; | 248 | ret = -ENOMEM; |
@@ -262,10 +263,10 @@ int exofs_sbi_remove(struct exofs_io_state *ios) | |||
262 | { | 263 | { |
263 | int i, ret; | 264 | int i, ret; |
264 | 265 | ||
265 | for (i = 0; i < ios->sbi->s_numdevs; i++) { | 266 | for (i = 0; i < ios->layout->s_numdevs; i++) { |
266 | struct osd_request *or; | 267 | struct osd_request *or; |
267 | 268 | ||
268 | or = osd_start_request(ios->sbi->s_ods[i], GFP_KERNEL); | 269 | or = osd_start_request(ios->layout->s_ods[i], GFP_KERNEL); |
269 | if (unlikely(!or)) { | 270 | if (unlikely(!or)) { |
270 | EXOFS_ERR("%s: osd_start_request failed\n", __func__); | 271 | EXOFS_ERR("%s: osd_start_request failed\n", __func__); |
271 | ret = -ENOMEM; | 272 | ret = -ENOMEM; |
@@ -286,10 +287,10 @@ int exofs_sbi_write(struct exofs_io_state *ios) | |||
286 | { | 287 | { |
287 | int i, ret; | 288 | int i, ret; |
288 | 289 | ||
289 | for (i = 0; i < ios->sbi->s_numdevs; i++) { | 290 | for (i = 0; i < ios->layout->s_numdevs; i++) { |
290 | struct osd_request *or; | 291 | struct osd_request *or; |
291 | 292 | ||
292 | or = osd_start_request(ios->sbi->s_ods[i], GFP_KERNEL); | 293 | or = osd_start_request(ios->layout->s_ods[i], GFP_KERNEL); |
293 | if (unlikely(!or)) { | 294 | if (unlikely(!or)) { |
294 | EXOFS_ERR("%s: osd_start_request failed\n", __func__); | 295 | EXOFS_ERR("%s: osd_start_request failed\n", __func__); |
295 | ret = -ENOMEM; | 296 | ret = -ENOMEM; |
@@ -361,8 +362,9 @@ int exofs_sbi_read(struct exofs_io_state *ios) | |||
361 | struct osd_request *or; | 362 | struct osd_request *or; |
362 | unsigned first_dev = (unsigned)ios->obj.id; | 363 | unsigned first_dev = (unsigned)ios->obj.id; |
363 | 364 | ||
364 | first_dev %= ios->sbi->s_numdevs; | 365 | first_dev %= ios->layout->s_numdevs; |
365 | or = osd_start_request(ios->sbi->s_ods[first_dev], GFP_KERNEL); | 366 | or = osd_start_request(ios->layout->s_ods[first_dev], |
367 | GFP_KERNEL); | ||
366 | if (unlikely(!or)) { | 368 | if (unlikely(!or)) { |
367 | EXOFS_ERR("%s: osd_start_request failed\n", __func__); | 369 | EXOFS_ERR("%s: osd_start_request failed\n", __func__); |
368 | ret = -ENOMEM; | 370 | ret = -ENOMEM; |
@@ -438,7 +440,7 @@ int exofs_oi_truncate(struct exofs_i_info *oi, u64 size) | |||
438 | __be64 newsize; | 440 | __be64 newsize; |
439 | int i, ret; | 441 | int i, ret; |
440 | 442 | ||
441 | if (exofs_get_io_state(sbi, &ios)) | 443 | if (exofs_get_io_state(&sbi->layout, &ios)) |
442 | return -ENOMEM; | 444 | return -ENOMEM; |
443 | 445 | ||
444 | ios->obj.id = exofs_oi_objno(oi); | 446 | ios->obj.id = exofs_oi_objno(oi); |
@@ -448,10 +450,10 @@ int exofs_oi_truncate(struct exofs_i_info *oi, u64 size) | |||
448 | attr = g_attr_logical_length; | 450 | attr = g_attr_logical_length; |
449 | attr.val_ptr = &newsize; | 451 | attr.val_ptr = &newsize; |
450 | 452 | ||
451 | for (i = 0; i < sbi->s_numdevs; i++) { | 453 | for (i = 0; i < sbi->layout.s_numdevs; i++) { |
452 | struct osd_request *or; | 454 | struct osd_request *or; |
453 | 455 | ||
454 | or = osd_start_request(sbi->s_ods[i], GFP_KERNEL); | 456 | or = osd_start_request(sbi->layout.s_ods[i], GFP_KERNEL); |
455 | if (unlikely(!or)) { | 457 | if (unlikely(!or)) { |
456 | EXOFS_ERR("%s: osd_start_request failed\n", __func__); | 458 | EXOFS_ERR("%s: osd_start_request failed\n", __func__); |
457 | ret = -ENOMEM; | 459 | ret = -ENOMEM; |
diff --git a/fs/exofs/super.c b/fs/exofs/super.c index a1d1e77b12eb..fc8875186ae8 100644 --- a/fs/exofs/super.c +++ b/fs/exofs/super.c | |||
@@ -210,7 +210,7 @@ int exofs_sync_fs(struct super_block *sb, int wait) | |||
210 | sbi = sb->s_fs_info; | 210 | sbi = sb->s_fs_info; |
211 | fscb = &sbi->s_fscb; | 211 | fscb = &sbi->s_fscb; |
212 | 212 | ||
213 | ret = exofs_get_io_state(sbi, &ios); | 213 | ret = exofs_get_io_state(&sbi->layout, &ios); |
214 | if (ret) | 214 | if (ret) |
215 | goto out; | 215 | goto out; |
216 | 216 | ||
@@ -264,12 +264,12 @@ static void _exofs_print_device(const char *msg, const char *dev_path, | |||
264 | 264 | ||
265 | void exofs_free_sbi(struct exofs_sb_info *sbi) | 265 | void exofs_free_sbi(struct exofs_sb_info *sbi) |
266 | { | 266 | { |
267 | while (sbi->s_numdevs) { | 267 | while (sbi->layout.s_numdevs) { |
268 | int i = --sbi->s_numdevs; | 268 | int i = --sbi->layout.s_numdevs; |
269 | struct osd_dev *od = sbi->s_ods[i]; | 269 | struct osd_dev *od = sbi->layout.s_ods[i]; |
270 | 270 | ||
271 | if (od) { | 271 | if (od) { |
272 | sbi->s_ods[i] = NULL; | 272 | sbi->layout.s_ods[i] = NULL; |
273 | osduld_put_device(od); | 273 | osduld_put_device(od); |
274 | } | 274 | } |
275 | } | 275 | } |
@@ -298,7 +298,8 @@ static void exofs_put_super(struct super_block *sb) | |||
298 | msecs_to_jiffies(100)); | 298 | msecs_to_jiffies(100)); |
299 | } | 299 | } |
300 | 300 | ||
301 | _exofs_print_device("Unmounting", NULL, sbi->s_ods[0], sbi->s_pid); | 301 | _exofs_print_device("Unmounting", NULL, sbi->layout.s_ods[0], |
302 | sbi->layout.s_pid); | ||
302 | 303 | ||
303 | exofs_free_sbi(sbi); | 304 | exofs_free_sbi(sbi); |
304 | sb->s_fs_info = NULL; | 305 | sb->s_fs_info = NULL; |
@@ -361,7 +362,7 @@ static int exofs_read_lookup_dev_table(struct exofs_sb_info **psbi, | |||
361 | { | 362 | { |
362 | struct exofs_sb_info *sbi = *psbi; | 363 | struct exofs_sb_info *sbi = *psbi; |
363 | struct osd_dev *fscb_od; | 364 | struct osd_dev *fscb_od; |
364 | struct osd_obj_id obj = {.partition = sbi->s_pid, | 365 | struct osd_obj_id obj = {.partition = sbi->layout.s_pid, |
365 | .id = EXOFS_DEVTABLE_ID}; | 366 | .id = EXOFS_DEVTABLE_ID}; |
366 | struct exofs_device_table *dt; | 367 | struct exofs_device_table *dt; |
367 | unsigned table_bytes = table_count * sizeof(dt->dt_dev_table[0]) + | 368 | unsigned table_bytes = table_count * sizeof(dt->dt_dev_table[0]) + |
@@ -376,9 +377,9 @@ static int exofs_read_lookup_dev_table(struct exofs_sb_info **psbi, | |||
376 | return -ENOMEM; | 377 | return -ENOMEM; |
377 | } | 378 | } |
378 | 379 | ||
379 | fscb_od = sbi->s_ods[0]; | 380 | fscb_od = sbi->layout.s_ods[0]; |
380 | sbi->s_ods[0] = NULL; | 381 | sbi->layout.s_ods[0] = NULL; |
381 | sbi->s_numdevs = 0; | 382 | sbi->layout.s_numdevs = 0; |
382 | ret = exofs_read_kern(fscb_od, sbi->s_cred, &obj, 0, dt, table_bytes); | 383 | ret = exofs_read_kern(fscb_od, sbi->s_cred, &obj, 0, dt, table_bytes); |
383 | if (unlikely(ret)) { | 384 | if (unlikely(ret)) { |
384 | EXOFS_ERR("ERROR: reading device table\n"); | 385 | EXOFS_ERR("ERROR: reading device table\n"); |
@@ -397,14 +398,15 @@ static int exofs_read_lookup_dev_table(struct exofs_sb_info **psbi, | |||
397 | goto out; | 398 | goto out; |
398 | 399 | ||
399 | if (likely(numdevs > 1)) { | 400 | if (likely(numdevs > 1)) { |
400 | unsigned size = numdevs * sizeof(sbi->s_ods[0]); | 401 | unsigned size = numdevs * sizeof(sbi->layout.s_ods[0]); |
401 | 402 | ||
402 | sbi = krealloc(sbi, sizeof(*sbi) + size, GFP_KERNEL); | 403 | sbi = krealloc(sbi, sizeof(*sbi) + size, GFP_KERNEL); |
403 | if (unlikely(!sbi)) { | 404 | if (unlikely(!sbi)) { |
404 | ret = -ENOMEM; | 405 | ret = -ENOMEM; |
405 | goto out; | 406 | goto out; |
406 | } | 407 | } |
407 | memset(&sbi->s_ods[1], 0, size - sizeof(sbi->s_ods[0])); | 408 | memset(&sbi->layout.s_ods[1], 0, |
409 | size - sizeof(sbi->layout.s_ods[0])); | ||
408 | *psbi = sbi; | 410 | *psbi = sbi; |
409 | } | 411 | } |
410 | 412 | ||
@@ -427,8 +429,8 @@ static int exofs_read_lookup_dev_table(struct exofs_sb_info **psbi, | |||
427 | * line. We always keep them in device-table order. | 429 | * line. We always keep them in device-table order. |
428 | */ | 430 | */ |
429 | if (fscb_od && osduld_device_same(fscb_od, &odi)) { | 431 | if (fscb_od && osduld_device_same(fscb_od, &odi)) { |
430 | sbi->s_ods[i] = fscb_od; | 432 | sbi->layout.s_ods[i] = fscb_od; |
431 | ++sbi->s_numdevs; | 433 | ++sbi->layout.s_numdevs; |
432 | fscb_od = NULL; | 434 | fscb_od = NULL; |
433 | continue; | 435 | continue; |
434 | } | 436 | } |
@@ -441,8 +443,8 @@ static int exofs_read_lookup_dev_table(struct exofs_sb_info **psbi, | |||
441 | goto out; | 443 | goto out; |
442 | } | 444 | } |
443 | 445 | ||
444 | sbi->s_ods[i] = od; | 446 | sbi->layout.s_ods[i] = od; |
445 | ++sbi->s_numdevs; | 447 | ++sbi->layout.s_numdevs; |
446 | 448 | ||
447 | /* Read the fscb of the other devices to make sure the FS | 449 | /* Read the fscb of the other devices to make sure the FS |
448 | * partition is there. | 450 | * partition is there. |
@@ -499,9 +501,10 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent) | |||
499 | goto free_sbi; | 501 | goto free_sbi; |
500 | } | 502 | } |
501 | 503 | ||
502 | sbi->s_ods[0] = od; | 504 | /* Default layout in case we do not have a device-table */ |
503 | sbi->s_numdevs = 1; | 505 | sbi->layout.s_ods[0] = od; |
504 | sbi->s_pid = opts->pid; | 506 | sbi->layout.s_numdevs = 1; |
507 | sbi->layout.s_pid = opts->pid; | ||
505 | sbi->s_timeout = opts->timeout; | 508 | sbi->s_timeout = opts->timeout; |
506 | 509 | ||
507 | /* fill in some other data by hand */ | 510 | /* fill in some other data by hand */ |
@@ -514,7 +517,7 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent) | |||
514 | sb->s_bdev = NULL; | 517 | sb->s_bdev = NULL; |
515 | sb->s_dev = 0; | 518 | sb->s_dev = 0; |
516 | 519 | ||
517 | obj.partition = sbi->s_pid; | 520 | obj.partition = sbi->layout.s_pid; |
518 | obj.id = EXOFS_SUPER_ID; | 521 | obj.id = EXOFS_SUPER_ID; |
519 | exofs_make_credential(sbi->s_cred, &obj); | 522 | exofs_make_credential(sbi->s_cred, &obj); |
520 | 523 | ||
@@ -578,13 +581,13 @@ static int exofs_fill_super(struct super_block *sb, void *data, int silent) | |||
578 | goto free_sbi; | 581 | goto free_sbi; |
579 | } | 582 | } |
580 | 583 | ||
581 | _exofs_print_device("Mounting", opts->dev_name, sbi->s_ods[0], | 584 | _exofs_print_device("Mounting", opts->dev_name, sbi->layout.s_ods[0], |
582 | sbi->s_pid); | 585 | sbi->layout.s_pid); |
583 | return 0; | 586 | return 0; |
584 | 587 | ||
585 | free_sbi: | 588 | free_sbi: |
586 | EXOFS_ERR("Unable to mount exofs on %s pid=0x%llx err=%d\n", | 589 | EXOFS_ERR("Unable to mount exofs on %s pid=0x%llx err=%d\n", |
587 | opts->dev_name, sbi->s_pid, ret); | 590 | opts->dev_name, sbi->layout.s_pid, ret); |
588 | exofs_free_sbi(sbi); | 591 | exofs_free_sbi(sbi); |
589 | return ret; | 592 | return ret; |
590 | } | 593 | } |
@@ -627,7 +630,7 @@ static int exofs_statfs(struct dentry *dentry, struct kstatfs *buf) | |||
627 | uint8_t cred_a[OSD_CAP_LEN]; | 630 | uint8_t cred_a[OSD_CAP_LEN]; |
628 | int ret; | 631 | int ret; |
629 | 632 | ||
630 | ret = exofs_get_io_state(sbi, &ios); | 633 | ret = exofs_get_io_state(&sbi->layout, &ios); |
631 | if (ret) { | 634 | if (ret) { |
632 | EXOFS_DBGMSG("exofs_get_io_state failed.\n"); | 635 | EXOFS_DBGMSG("exofs_get_io_state failed.\n"); |
633 | return ret; | 636 | return ret; |