OAP_ASYNC_BITS = 4
};
-/* add explicit padding to keep fields aligned despite "packed",
- * which is needed to pack with following field in osc_page */
-#define OAP_PAD_BITS (16 - OBD_BRW_WRITE - OAP_ASYNC_BITS)
struct osc_async_page {
- unsigned short oap_page_off /* :PAGE_SHIFT */;
- unsigned int oap_cmd:OBD_BRW_WRITE;
- enum oap_async_flags oap_async_flags:OAP_ASYNC_BITS;
- unsigned int oap_padding1:OAP_PAD_BITS; /* unused */
- unsigned int oap_padding2; /* unused */
-
struct list_head oap_pending_item;
struct list_head oap_rpc_item;
struct osc_object *oap_obj;
struct brw_page oap_brw_page;
+
+ unsigned int oap_page_off:PAGE_SHIFT,
+ oap_cmd:OBD_BRW_WRITE,
+ oap_async_flags:OAP_ASYNC_BITS;
} __attribute__((packed));
#define oap_page oap_brw_page.bp_page
struct osc_page {
struct cl_page_slice ops_cl;
/**
- * Page queues used by osc to detect when RPC can be formed.
- */
- struct osc_async_page ops_oap;
- /**
- * An offset within page from which next transfer starts. This is used
- * by cl_page_clip() to submit partial page transfers.
+ * lru page list. See osc_lru_{del|use}() in osc_page.c for usage.
*/
- unsigned int ops_from:PAGE_SHIFT,
+ struct list_head ops_lru;
/**
- * An offset within page at which next transfer ends(inclusive).
- *
- * \see osc_page::ops_from.
+ * Page queues used by osc to detect when RPC can be formed.
*/
- ops_to:PAGE_SHIFT,
+ struct osc_async_page ops_oap;
/**
* Boolean, true iff page is under transfer. Used for sanity checking.
*/
- ops_transfer_pinned:1,
+ unsigned char ops_transfer_pinned:1,
/**
* in LRU?
*/
* If the page is in osc_object::oo_tree.
*/
ops_intree:1;
- /**
- * lru page list. See osc_lru_{del|use}() in osc_page.c for usage.
- */
- struct list_head ops_lru;
};
struct osc_brw_async_args {
oap->oap_obj = osc;
oap->oap_page = page->cp_vmpage;
oap->oap_obj_off = offset;
+ oap->oap_page_off = 0;
+ oap->oap_count = PAGE_SIZE;
LASSERT(!(offset & ~PAGE_MASK));
/* Count of transient (direct i/o) pages is always stable by the time
}
oap->oap_cmd = cmd;
- oap->oap_page_off = ops->ops_from;
- oap->oap_count = ops->ops_to - ops->ops_from + 1;
/* No need to hold a lock here,
* since this page is not in any list yet. */
oap->oap_async_flags = 0;
++page_count;
mppr <<= (page_count > mppr);
- if (unlikely(opg->ops_from > 0 ||
- opg->ops_to < PAGE_SIZE - 1))
+ if (unlikely(oap->oap_count < PAGE_SIZE))
can_merge = false;
}
CDEBUG(D_CACHE, "from %d, to %d\n", from, to);
- opg->ops_from = from;
- /* argument @to is exclusive, but @ops_to is inclusive */
- opg->ops_to = to - 1;
+ oap->oap_page_off = from;
+ oap->oap_count = to - from;
oap->oap_async_flags |= ASYNC_COUNT_STABLE;
}
struct osc_io *oio = osc_env_io(env);
int result;
- opg->ops_from = 0;
- opg->ops_to = PAGE_SIZE - 1;
-
INIT_LIST_HEAD(&opg->ops_lru);
result = osc_prep_async_page(osc, opg, cl_page, index << PAGE_SHIFT);
LASSERT(oap->oap_async_flags & ASYNC_COUNT_STABLE);
oap->oap_cmd = crt == CRT_WRITE ? OBD_BRW_WRITE : OBD_BRW_READ;
- oap->oap_page_off = opg->ops_from;
- oap->oap_count = opg->ops_to - opg->ops_from + 1;
oap->oap_brw_flags = OBD_BRW_SYNC | brw_flags;
if (oio->oi_cap_sys_resource)