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: Boaz Harrosh <bharrosh@panasas.com> Signed-off-by: Benny Halevy <bhalevy@panasas.com>
This commit is contained in:
@@ -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)
|
|||||||
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,
|
|||||||
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 @@
|
|||||||
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,
|
|||||||
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(
|
|||||||
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 *,
|
||||||
|
Reference in New Issue
Block a user