diff options
author | Boaz Harrosh <bharrosh@panasas.com> | 2010-01-28 04:58:08 -0500 |
---|---|---|
committer | Boaz Harrosh <bharrosh@panasas.com> | 2010-02-28 06:35:28 -0500 |
commit | d9c740d2253e75db8cef8f87a3125c450f3ebd82 (patch) | |
tree | 7217cf62b8d102e00257be6e0675d25852045bc6 /fs/exofs/common.h | |
parent | 46f4d973f6874c06b7a41a3bf8f4c1717d90f97a (diff) |
exofs: Define on-disk per-inode optional layout attribute
* Layouts describe the way a file is spread on multiple devices.
The layout information is stored in the objects attribute introduced
in this patch.
* There can be multiple generating function for the layout.
Currently defined:
- No attribute present - use below moving-window on global
device table, all devices.
(This is the only one currently used in exofs)
- an obj_id generated moving window - the obj_id is a randomizing
factor in the otherwise global map layout.
- An explicit layout stored, including a data_map and a device
index list.
- More might be defined in future ...
* There are two attributes defined of the same structure:
A-data-files-layout - This layout is used by data-files. If present
at a directory, all files of that directory will
be created with this layout.
A-meta-data-layout - This layout is used by a directory and other
meta-data information. Also inherited at creation
of subdirectories.
* At creation time inodes are created with the layout specified above.
A usermode utility may change the creation layout on a give directory
or file. Which in the case of directories, will also apply to newly
created files/subdirectories, children of that directory.
In the simple unaltered case of a newly created exofs, no layout
attributes are present, and all layouts adhere to the layout specified
at the device-table.
* In case of a future file system loaded in an old exofs-driver.
At iget(), the generating_function is inspected and if not supported
will return an IO error to the application and the inode will not
be loaded. So not to damage any data.
Note: After this patch we do not yet support any type of layout
only the RAID0 patch that enables striping at the super-block
level will add support for RAID0 layouts above. This way we
are past and future compatible and fully bisectable.
* Access to the device table is done by an accessor since
it will change according to above information.
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
Diffstat (limited to 'fs/exofs/common.h')
-rw-r--r-- | fs/exofs/common.h | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/fs/exofs/common.h b/fs/exofs/common.h index b1b178e61718..f0d520312d8b 100644 --- a/fs/exofs/common.h +++ b/fs/exofs/common.h | |||
@@ -55,6 +55,8 @@ | |||
55 | /* exofs Application specific page/attribute */ | 55 | /* exofs Application specific page/attribute */ |
56 | # define EXOFS_APAGE_FS_DATA (OSD_APAGE_APP_DEFINED_FIRST + 3) | 56 | # define EXOFS_APAGE_FS_DATA (OSD_APAGE_APP_DEFINED_FIRST + 3) |
57 | # define EXOFS_ATTR_INODE_DATA 1 | 57 | # define EXOFS_ATTR_INODE_DATA 1 |
58 | # define EXOFS_ATTR_INODE_FILE_LAYOUT 2 | ||
59 | # define EXOFS_ATTR_INODE_DIR_LAYOUT 3 | ||
58 | 60 | ||
59 | /* | 61 | /* |
60 | * The maximum number of files we can have is limited by the size of the | 62 | * The maximum number of files we can have is limited by the size of the |
@@ -206,4 +208,41 @@ enum { | |||
206 | (((name_len) + offsetof(struct exofs_dir_entry, name) + \ | 208 | (((name_len) + offsetof(struct exofs_dir_entry, name) + \ |
207 | EXOFS_DIR_ROUND) & ~EXOFS_DIR_ROUND) | 209 | EXOFS_DIR_ROUND) & ~EXOFS_DIR_ROUND) |
208 | 210 | ||
211 | /* | ||
212 | * The on-disk (optional) layout structure. | ||
213 | * sits in an EXOFS_ATTR_INODE_FILE_LAYOUT or EXOFS_ATTR_INODE_DIR_LAYOUT | ||
214 | * attribute, attached to any inode, usually to a directory. | ||
215 | */ | ||
216 | |||
217 | enum exofs_inode_layout_gen_functions { | ||
218 | LAYOUT_MOVING_WINDOW = 0, | ||
219 | LAYOUT_IMPLICT = 1, | ||
220 | }; | ||
221 | |||
222 | struct exofs_on_disk_inode_layout { | ||
223 | __le16 gen_func; /* One of enum exofs_inode_layout_gen_functions */ | ||
224 | __le16 pad; | ||
225 | union { | ||
226 | /* gen_func == LAYOUT_MOVING_WINDOW (default) */ | ||
227 | struct exofs_layout_sliding_window { | ||
228 | __le32 num_devices; /* first n devices in global-table*/ | ||
229 | } sliding_window __packed; | ||
230 | |||
231 | /* gen_func == LAYOUT_IMPLICT */ | ||
232 | struct exofs_layout_implict_list { | ||
233 | struct exofs_dt_data_map data_map; | ||
234 | /* Variable array of size data_map.cb_num_comps. These | ||
235 | * are device indexes of the devices in the global table | ||
236 | */ | ||
237 | __le32 dev_indexes[]; | ||
238 | } implict __packed; | ||
239 | }; | ||
240 | } __packed; | ||
241 | |||
242 | static inline size_t exofs_on_disk_inode_layout_size(unsigned max_devs) | ||
243 | { | ||
244 | return sizeof(struct exofs_on_disk_inode_layout) + | ||
245 | max_devs * sizeof(__le32); | ||
246 | } | ||
247 | |||
209 | #endif /*ifndef __EXOFS_COM_H__*/ | 248 | #endif /*ifndef __EXOFS_COM_H__*/ |