__u32 oqi_id;
};
-enum async_flags {
- ASYNC_READY = 0x1, /* ap_make_ready will not be called before this
- page is added to an rpc */
- ASYNC_URGENT = 0x2, /* page must be put into an RPC before return */
+enum oap_async_flags {
+ ASYNC_READY = 0x1, /* ap_make_ready will not be called before
+ * this page is added to an rpc */
+ ASYNC_URGENT = 0x2, /* page must be put into RPC before return */
ASYNC_COUNT_STABLE = 0x4, /* ap_refresh_count will not be called
to give the caller a chance to update
or cancel the size of the io */
- ASYNC_HP = 0x10,
+ ASYNC_HP = 0x8,
+ OAP_ASYNC_MAX,
+ 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_cmd;
+ 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;
loff_t oap_obj_off;
- unsigned oap_page_off;
- enum async_flags oap_async_flags;
-
- struct brw_page oap_brw_page;
struct ptlrpc_request *oap_request;
struct osc_object *oap_obj;
-};
+
+ struct brw_page oap_brw_page;
+} __attribute__((packed));
#define oap_page oap_brw_page.pg
#define oap_count oap_brw_page.count
static inline struct osc_async_page *brw_page2oap(struct brw_page *pga)
{
+ BUILD_BUG_ON(OAP_ASYNC_MAX - 1 >= (1 << OAP_ASYNC_BITS));
return container_of(pga, struct osc_async_page, oap_brw_page);
}
oap = &ops->ops_oap;
if (oap->oap_cmd & OBD_BRW_WRITE &&
- !list_empty(&oap->oap_pending_item))
+ !list_empty(&oap->oap_pending_item))
CL_PAGE_DEBUG(D_ERROR, env, page, "exists %llu/%s.\n",
- start, current->comm);
+ start, current->comm);
if (PageLocked(page->cp_vmpage))
- CDEBUG(D_CACHE, "page %p index %lu locked for %d.\n",
- ops, osc_index(ops),
- oap->oap_cmd & OBD_BRW_RWMASK);
+ CDEBUG(D_CACHE, "page %p index %lu locked for cmd=%d\n",
+ ops, osc_index(ops), oap->oap_cmd);
}
return true;
}
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) {
+ if (oio->oi_cap_sys_resource)
oap->oap_brw_flags |= OBD_BRW_SYS_RESOURCE;
- oap->oap_cmd |= OBD_BRW_SYS_RESOURCE;
- }
osc_page_transfer_get(opg, "transfer\0imm");
osc_page_transfer_add(env, opg, crt);