Commit a0fe8bf4 authored by Boaz Harrosh's avatar Boaz Harrosh

pnfs-obj: objlayout_encode_layoutcommit implementation

* Define API for io-engines to report delta_space_used in IOs
* Encode the osd-layout specific information of the layoutcommit
  XDR buffer.
Signed-off-by: default avatarBoaz Harrosh <bharrosh@panasas.com>
Signed-off-by: default avatarBenny Halevy <bhalevy@panasas.com>
parent ac7db726
...@@ -1018,6 +1018,7 @@ static struct pnfs_layoutdriver_type objlayout_type = { ...@@ -1018,6 +1018,7 @@ static struct pnfs_layoutdriver_type objlayout_type = {
.free_deviceid_node = objio_free_deviceid_node, .free_deviceid_node = objio_free_deviceid_node,
.encode_layoutcommit = objlayout_encode_layoutcommit,
.encode_layoutreturn = objlayout_encode_layoutreturn, .encode_layoutreturn = objlayout_encode_layoutreturn,
}; };
......
...@@ -225,6 +225,7 @@ objlayout_iodone(struct objlayout_io_state *state) ...@@ -225,6 +225,7 @@ objlayout_iodone(struct objlayout_io_state *state)
struct objlayout *objlay = OBJLAYOUT(state->lseg->pls_layout); struct objlayout *objlay = OBJLAYOUT(state->lseg->pls_layout);
spin_lock(&objlay->lock); spin_lock(&objlay->lock);
objlay->delta_space_valid = OBJ_DSU_INVALID;
list_add(&objlay->err_list, &state->err_list); list_add(&objlay->err_list, &state->err_list);
spin_unlock(&objlay->lock); spin_unlock(&objlay->lock);
} }
...@@ -433,6 +434,35 @@ objlayout_write_pagelist(struct nfs_write_data *wdata, ...@@ -433,6 +434,35 @@ objlayout_write_pagelist(struct nfs_write_data *wdata,
return PNFS_ATTEMPTED; return PNFS_ATTEMPTED;
} }
void
objlayout_encode_layoutcommit(struct pnfs_layout_hdr *pnfslay,
struct xdr_stream *xdr,
const struct nfs4_layoutcommit_args *args)
{
struct objlayout *objlay = OBJLAYOUT(pnfslay);
struct pnfs_osd_layoutupdate lou;
__be32 *start;
dprintk("%s: Begin\n", __func__);
spin_lock(&objlay->lock);
lou.dsu_valid = (objlay->delta_space_valid == OBJ_DSU_VALID);
lou.dsu_delta = objlay->delta_space_used;
objlay->delta_space_used = 0;
objlay->delta_space_valid = OBJ_DSU_INIT;
lou.olu_ioerr_flag = !list_empty(&objlay->err_list);
spin_unlock(&objlay->lock);
start = xdr_reserve_space(xdr, 4);
BUG_ON(pnfs_osd_xdr_encode_layoutupdate(xdr, &lou));
*start = cpu_to_be32((xdr->p - start - 1) * 4);
dprintk("%s: Return delta_space_used %lld err %d\n", __func__,
lou.dsu_delta, lou.olu_ioerr_flag);
}
static int static int
err_prio(u32 oer_errno) err_prio(u32 oer_errno)
{ {
......
...@@ -51,6 +51,14 @@ ...@@ -51,6 +51,14 @@
struct objlayout { struct objlayout {
struct pnfs_layout_hdr pnfs_layout; struct pnfs_layout_hdr pnfs_layout;
/* for layout_commit */
enum osd_delta_space_valid_enum {
OBJ_DSU_INIT = 0,
OBJ_DSU_VALID,
OBJ_DSU_INVALID,
} delta_space_valid;
s64 delta_space_used; /* consumed by write ops */
/* for layout_return */ /* for layout_return */
spinlock_t lock; spinlock_t lock;
struct list_head err_list; struct list_head err_list;
...@@ -119,6 +127,23 @@ extern void objlayout_io_set_result(struct objlayout_io_state *state, ...@@ -119,6 +127,23 @@ extern void objlayout_io_set_result(struct objlayout_io_state *state,
unsigned index, struct pnfs_osd_objid *pooid, unsigned index, struct pnfs_osd_objid *pooid,
int osd_error, u64 offset, u64 length, bool is_write); int osd_error, u64 offset, u64 length, bool is_write);
static inline void
objlayout_add_delta_space_used(struct objlayout_io_state *state, s64 space_used)
{
struct objlayout *objlay = OBJLAYOUT(state->lseg->pls_layout);
/* If one of the I/Os errored out and the delta_space_used was
* invalid we render the complete report as invalid. Protocol mandate
* the DSU be accurate or not reported.
*/
spin_lock(&objlay->lock);
if (objlay->delta_space_valid != OBJ_DSU_INVALID) {
objlay->delta_space_valid = OBJ_DSU_VALID;
objlay->delta_space_used += space_used;
}
spin_unlock(&objlay->lock);
}
extern void objlayout_read_done(struct objlayout_io_state *state, extern void objlayout_read_done(struct objlayout_io_state *state,
ssize_t status, bool sync); ssize_t status, bool sync);
extern void objlayout_write_done(struct objlayout_io_state *state, extern void objlayout_write_done(struct objlayout_io_state *state,
...@@ -149,6 +174,11 @@ extern enum pnfs_try_status objlayout_write_pagelist( ...@@ -149,6 +174,11 @@ extern enum pnfs_try_status objlayout_write_pagelist(
struct nfs_write_data *, struct nfs_write_data *,
int how); int how);
extern void objlayout_encode_layoutcommit(
struct pnfs_layout_hdr *,
struct xdr_stream *,
const struct nfs4_layoutcommit_args *);
extern void objlayout_encode_layoutreturn( extern void objlayout_encode_layoutreturn(
struct pnfs_layout_hdr *, struct pnfs_layout_hdr *,
struct xdr_stream *, struct xdr_stream *,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment