pnfs-obj: osd raid engine read/write implementation
With the use of the in-kernel osd library. Implement read/write
of data from/to osd-objects according to information specified
in the objects-layout.
Support for stripping over mirrors with a received stripe_unit.
There are however a few constrains which are not supported:
1. Stripe Unit must be a multiple of PAGE_SIZE
2. stripe length (stripe_unit * number_of_stripes) can not be
bigger then 32bit.
Also support raid-groups and partial-layout. Partial-layout is
when not all the groups are received on the line, addressing
only a partial range of the file.
TODO:
Only raid0! raid 4/5/6 support will come at later stage
A none supported layout will send IO through the MDS
[Important fallout from the last rebase]
Signed-off-by: Boaz Harrosh <bharrosh@panasas.com>
[gfp_flags]
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
This commit is contained in:
@@ -58,6 +58,26 @@ OBJLAYOUT(struct pnfs_layout_hdr *lo)
|
||||
return container_of(lo, struct objlayout, pnfs_layout);
|
||||
}
|
||||
|
||||
/*
|
||||
* per-I/O operation state
|
||||
* embedded in objects provider io_state data structure
|
||||
*/
|
||||
struct objlayout_io_state {
|
||||
struct pnfs_layout_segment *lseg;
|
||||
|
||||
struct page **pages;
|
||||
unsigned pgbase;
|
||||
unsigned nr_pages;
|
||||
unsigned long count;
|
||||
loff_t offset;
|
||||
bool sync;
|
||||
|
||||
void *rpcdata;
|
||||
int status; /* res */
|
||||
int eof; /* res */
|
||||
int committed; /* res */
|
||||
};
|
||||
|
||||
/*
|
||||
* Raid engine I/O API
|
||||
*/
|
||||
@@ -68,9 +88,24 @@ extern int objio_alloc_lseg(struct pnfs_layout_segment **outp,
|
||||
gfp_t gfp_flags);
|
||||
extern void objio_free_lseg(struct pnfs_layout_segment *lseg);
|
||||
|
||||
extern int objio_alloc_io_state(
|
||||
struct pnfs_layout_segment *lseg,
|
||||
struct objlayout_io_state **outp,
|
||||
gfp_t gfp_flags);
|
||||
extern void objio_free_io_state(struct objlayout_io_state *state);
|
||||
|
||||
extern ssize_t objio_read_pagelist(struct objlayout_io_state *ol_state);
|
||||
extern ssize_t objio_write_pagelist(struct objlayout_io_state *ol_state,
|
||||
bool stable);
|
||||
|
||||
/*
|
||||
* callback API
|
||||
*/
|
||||
extern void objlayout_read_done(struct objlayout_io_state *state,
|
||||
ssize_t status, bool sync);
|
||||
extern void objlayout_write_done(struct objlayout_io_state *state,
|
||||
ssize_t status, bool sync);
|
||||
|
||||
extern int objlayout_get_deviceinfo(struct pnfs_layout_hdr *pnfslay,
|
||||
struct nfs4_deviceid *d_id, struct pnfs_osd_deviceaddr **deviceaddr,
|
||||
gfp_t gfp_flags);
|
||||
@@ -89,4 +124,11 @@ extern struct pnfs_layout_segment *objlayout_alloc_lseg(
|
||||
gfp_t gfp_flags);
|
||||
extern void objlayout_free_lseg(struct pnfs_layout_segment *);
|
||||
|
||||
extern enum pnfs_try_status objlayout_read_pagelist(
|
||||
struct nfs_read_data *);
|
||||
|
||||
extern enum pnfs_try_status objlayout_write_pagelist(
|
||||
struct nfs_write_data *,
|
||||
int how);
|
||||
|
||||
#endif /* _OBJLAYOUT_H */
|
||||
|
||||
Reference in New Issue
Block a user