diff options
Diffstat (limited to 'fs/exofs/exofs.h')
-rw-r--r-- | fs/exofs/exofs.h | 104 |
1 files changed, 59 insertions, 45 deletions
diff --git a/fs/exofs/exofs.h b/fs/exofs/exofs.h index 5a77fc76433..39ad5016516 100644 --- a/fs/exofs/exofs.h +++ b/fs/exofs/exofs.h @@ -52,9 +52,12 @@ /* u64 has problems with printk this will cast it to unsigned long long */ #define _LLU(x) (unsigned long long)(x) -struct exofs_layout { - osd_id s_pid; /* partition ID of file system*/ +struct exofs_comp { + struct osd_obj_id obj; + u8 cred[OSD_CAP_LEN]; +}; +struct exofs_layout { /* Our way of looking at the data_map */ unsigned stripe_unit; unsigned mirrors_p1; @@ -62,11 +65,18 @@ struct exofs_layout { unsigned group_width; u64 group_depth; unsigned group_count; +}; - enum exofs_inode_layout_gen_functions lay_func; - - unsigned s_numdevs; /* Num of devices in array */ - struct osd_dev **s_ods; /* osd_dev array */ +struct exofs_components { + unsigned numdevs; /* Num of devices in array */ + /* If @single_comp == EC_SINGLE_COMP, @comps points to a single + * component. else there are @numdevs components + */ + enum EC_COMP_USAGE { + EC_SINGLE_COMP = 0, EC_MULTPLE_COMPS = 0xffffffff + } single_comp; + struct exofs_comp *comps; + struct osd_dev **ods; /* osd_dev array */ }; /* @@ -81,12 +91,13 @@ struct exofs_sb_info { spinlock_t s_next_gen_lock; /* spinlock for gen # update */ u32 s_next_generation; /* next gen # to use */ atomic_t s_curr_pending; /* number of pending commands */ - uint8_t s_cred[OSD_CAP_LEN]; /* credential for the fscb */ struct pnfs_osd_data_map data_map; /* Default raid to use * FIXME: Needed ? */ struct exofs_layout layout; /* Default files layout */ + struct exofs_comp one_comp; /* id & cred of partition id=0*/ + struct exofs_components comps; /* comps for the partition */ struct osd_dev *_min_one_dev[1]; /* Place holder for one dev */ }; @@ -100,7 +111,8 @@ struct exofs_i_info { uint32_t i_data[EXOFS_IDATA];/*short symlink names and device #s*/ uint32_t i_dir_start_lookup; /* which page to start lookup */ uint64_t i_commit_size; /* the object's written length */ - uint8_t i_cred[OSD_CAP_LEN];/* all-powerful credential */ + struct exofs_comp one_comp; /* same component for all devices */ + struct exofs_components comps; /* inode view of the device table */ }; static inline osd_id exofs_oi_objno(struct exofs_i_info *oi) @@ -118,8 +130,7 @@ struct exofs_io_state { exofs_io_done_fn done; struct exofs_layout *layout; - struct osd_obj_id obj; - u8 *cred; + struct exofs_components *comps; /* Global read/write IO*/ loff_t offset; @@ -200,20 +211,6 @@ static inline struct exofs_i_info *exofs_i(struct inode *inode) } /* - * Given a layout, object_number and stripe_index return the associated global - * dev_index - */ -unsigned exofs_layout_od_id(struct exofs_layout *layout, - osd_id obj_no, unsigned layout_index); - -static inline struct osd_dev *exofs_ios_od(struct exofs_io_state *ios, - unsigned layout_index) -{ - return ios->layout->s_ods[ - exofs_layout_od_id(ios->layout, ios->obj.id, layout_index)]; -} - -/* * Maximum count of links to a file */ #define EXOFS_LINK_MAX 32000 @@ -223,10 +220,13 @@ static inline struct osd_dev *exofs_ios_od(struct exofs_io_state *ios, *************************/ /* ios.c */ -int exofs_get_rw_state(struct exofs_layout *layout, bool is_reading, - u64 offset, u64 length, struct exofs_io_state **ios); -int exofs_get_io_state(struct exofs_layout *layout, - struct exofs_io_state **ios); +int exofs_get_rw_state(struct exofs_layout *layout, + struct exofs_components *comps, + bool is_reading, u64 offset, u64 length, + struct exofs_io_state **ios); +int exofs_get_io_state(struct exofs_layout *layout, + struct exofs_components *comps, + struct exofs_io_state **ios); void exofs_put_io_state(struct exofs_io_state *ios); int exofs_check_io(struct exofs_io_state *ios, u64 *resid); @@ -235,27 +235,12 @@ int exofs_sbi_create(struct exofs_io_state *ios); int exofs_sbi_remove(struct exofs_io_state *ios); int exofs_sbi_write(struct exofs_io_state *ios); int exofs_sbi_read(struct exofs_io_state *ios); +int exofs_truncate(struct exofs_layout *layout, struct exofs_components *comps, + u64 size); int extract_attr_from_ios(struct exofs_io_state *ios, struct osd_attr *attr); extern const struct osd_attr g_attr_logical_length; -int exofs_oi_truncate(struct exofs_i_info *oi, u64 new_len); -static inline int exofs_oi_write(struct exofs_i_info *oi, - struct exofs_io_state *ios) -{ - ios->obj.id = exofs_oi_objno(oi); - ios->cred = oi->i_cred; - return exofs_sbi_write(ios); -} - -static inline int exofs_oi_read(struct exofs_i_info *oi, - struct exofs_io_state *ios) -{ - ios->obj.id = exofs_oi_objno(oi); - ios->cred = oi->i_cred; - return exofs_sbi_read(ios); -} - /* inode.c */ unsigned exofs_max_io_pages(struct exofs_layout *layout, unsigned expected_pages); @@ -307,4 +292,33 @@ extern const struct inode_operations exofs_special_inode_operations; extern const struct inode_operations exofs_symlink_inode_operations; extern const struct inode_operations exofs_fast_symlink_inode_operations; +/* exofs_init_comps will initialize an exofs_components device array + * pointing to a single exofs_comp struct, and a round-robin view + * of the device table. + * The first device of each inode is the [inode->ino % num_devices] + * and the rest of the devices sequentially following where the + * first device is after the last device. + * It is assumed that the global device array at @sbi is twice + * bigger and that the device table repeats twice. + * See: exofs_read_lookup_dev_table() + */ +static inline void exofs_init_comps(struct exofs_components *comps, + struct exofs_comp *one_comp, + struct exofs_sb_info *sbi, osd_id oid) +{ + unsigned dev_mod = (unsigned)oid, first_dev; + + one_comp->obj.partition = sbi->one_comp.obj.partition; + one_comp->obj.id = oid; + exofs_make_credential(one_comp->cred, &one_comp->obj); + + comps->numdevs = sbi->comps.numdevs; + comps->single_comp = EC_SINGLE_COMP; + comps->comps = one_comp; + + /* Round robin device view of the table */ + first_dev = (dev_mod * sbi->layout.mirrors_p1) % sbi->comps.numdevs; + comps->ods = sbi->comps.ods + first_dev; +} + #endif |