diff options
Diffstat (limited to 'fs')
| -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; |
