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