Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a0fe8bf4 authored by Boaz Harrosh's avatar Boaz Harrosh
Browse files

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
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1018,6 +1018,7 @@ static struct pnfs_layoutdriver_type objlayout_type = {

	.free_deviceid_node	 = objio_free_deviceid_node,

	.encode_layoutcommit	 = objlayout_encode_layoutcommit,
	.encode_layoutreturn     = objlayout_encode_layoutreturn,
};

+30 −0
Original line number Diff line number Diff line
@@ -225,6 +225,7 @@ objlayout_iodone(struct objlayout_io_state *state)
		struct objlayout *objlay = OBJLAYOUT(state->lseg->pls_layout);

		spin_lock(&objlay->lock);
		objlay->delta_space_valid = OBJ_DSU_INVALID;
		list_add(&objlay->err_list, &state->err_list);
		spin_unlock(&objlay->lock);
	}
@@ -433,6 +434,35 @@ objlayout_write_pagelist(struct nfs_write_data *wdata,
	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
err_prio(u32 oer_errno)
{
+30 −0
Original line number Diff line number Diff line
@@ -51,6 +51,14 @@
struct objlayout {
	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 */
	spinlock_t lock;
	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,
			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,
				ssize_t status, bool sync);
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 *,
	int how);

extern void objlayout_encode_layoutcommit(
	struct pnfs_layout_hdr *,
	struct xdr_stream *,
	const struct nfs4_layoutcommit_args *);

extern void objlayout_encode_layoutreturn(
	struct pnfs_layout_hdr *,
	struct xdr_stream *,