typedef __u32 obd_flag;
typedef __u32 obd_count;
-#define OBD_FL_INLINEDATA (0x00000001)
-#define OBD_FL_OBDMDEXISTS (0x00000002)
-#define OBD_FL_DELORPHAN (0x00000004) /* if set in o_flags delete orphans */
-#define OBD_FL_NORPC (0x00000008) /* set in o_flags do in OSC not OST */
-#define OBD_FL_IDONLY (0x00000010) /* set in o_flags only adjust obj id*/
-#define OBD_FL_RECREATE_OBJS (0x00000020) /* recreate missing obj */
-#define OBD_FL_DEBUG_CHECK (0x00000040) /* echo client/server debug check */
-#define OBD_FL_NO_USRQUOTA (0x00000100) /* the object's owner is over quota */
-#define OBD_FL_NO_GRPQUOTA (0x00000200) /* the object's group is over quota */
-#define OBD_FL_CREATE_CROW (0x00000400) /* object should be create on write */
-#define OBD_FL_TRUNCLOCK (0x00000800) /* delegate DLM locking during punch */
-#define OBD_FL_CKSUM_CRC32 (0x00001000) /* CRC32 checksum type */
-#define OBD_FL_CKSUM_ADLER (0x00002000) /* ADLER checksum type */
-#define OBD_FL_CKSUM_RESV1 (0x00004000) /* reserved for future checksum type */
-#define OBD_FL_CKSUM_RESV2 (0x00008000) /* reserved for future checksum type */
-#define OBD_FL_CKSUM_RESV3 (0x00010000) /* reserved for future checksum type */
-#define OBD_FL_SHRINK_GRANT (0x00020000) /* object shrink the grant */
-
-
-#define OBD_FL_CKSUM_ALL (OBD_FL_CKSUM_CRC32 | OBD_FL_CKSUM_ADLER)
+enum obdo_flags {
+ OBD_FL_INLINEDATA = 0x00000001,
+ OBD_FL_OBDMDEXISTS = 0x00000002,
+ OBD_FL_DELORPHAN = 0x00000004, /* if set in o_flags delete orphans */
+ OBD_FL_NORPC = 0x00000008, /* set in o_flags do in OSC not OST */
+ OBD_FL_IDONLY = 0x00000010, /* set in o_flags only adjust obj id*/
+ OBD_FL_RECREATE_OBJS= 0x00000020, /* recreate missing obj */
+ OBD_FL_DEBUG_CHECK = 0x00000040, /* echo client/server debug check */
+ OBD_FL_NO_USRQUOTA = 0x00000100, /* the object's owner is over quota */
+ OBD_FL_NO_GRPQUOTA = 0x00000200, /* the object's group is over quota */
+ OBD_FL_CREATE_CROW = 0x00000400, /* object should be create on write */
+ OBD_FL_TRUNCLOCK = 0x00000800, /* delegate DLM locking during punch*/
+ OBD_FL_CKSUM_CRC32 = 0x00001000, /* CRC32 checksum type */
+ OBD_FL_CKSUM_ADLER = 0x00002000, /* ADLER checksum type */
+ OBD_FL_CKSUM_RSVD1 = 0x00004000, /* for future cksum types */
+ OBD_FL_CKSUM_RSVD2 = 0x00008000, /* for future cksum types */
+ OBD_FL_CKSUM_RSVD3 = 0x00010000, /* for future cksum types */
+ OBD_FL_SHRINK_GRANT = 0x00020000, /* object shrink the grant */
+
+ OBD_FL_CKSUM_ALL = OBD_FL_CKSUM_CRC32 | OBD_FL_CKSUM_ADLER,
+
+ /* mask for local-only flag, which won't be sent over network */
+ OBD_FL_LOCAL_MASK = 0xF0000000,
+ /* temporary OBDO used by osc_brw_async (see bug 18364) */
+ OBD_FL_TEMPORARY = 0x10000000,
+};
#define LOV_MAGIC_V1 0x0BD10BD0
#define LOV_MAGIC LOV_MAGIC_V1
#define o_dropped o_misc
#define o_cksum o_nlink
+static inline void lustre_set_wire_obdo(struct obdo *wobdo, struct obdo *lobdo)
+{
+ memcpy(wobdo, lobdo, sizeof(*lobdo));
+ wobdo->o_flags &= ~OBD_FL_LOCAL_MASK;
+}
+
+static inline void lustre_get_wire_obdo(struct obdo *lobdo, struct obdo *wobdo)
+{
+ obd_flag local_flags = lobdo->o_flags & OBD_FL_LOCAL_MASK;
+
+ LASSERT(!(wobdo->o_flags & OBD_FL_LOCAL_MASK));
+
+ memcpy(lobdo, wobdo, sizeof(*lobdo));
+ lobdo->o_flags &= ~OBD_FL_LOCAL_MASK;
+ lobdo->o_flags |= local_flags;
+}
+
extern void lustre_swab_obdo (struct obdo *o);
/* request structure for OST's */
lustre_swab_ost_body);
if (body) {
CDEBUG(D_INODE, "mode: %o\n", body->oa.o_mode);
- memcpy(aa->aa_oi->oi_oa, &body->oa, sizeof(*aa->aa_oi->oi_oa));
+ lustre_get_wire_obdo(aa->aa_oi->oi_oa, &body->oa);
/* This should really be sent by the OST */
aa->aa_oi->oi_oa->o_blksize = PTLRPC_MAX_BRW_SIZE;
RETURN(-ENOMEM);
body = lustre_msg_buf(req->rq_reqmsg, REQ_REC_OFF, sizeof(*body));
- memcpy(&body->oa, oinfo->oi_oa, sizeof(*oinfo->oi_oa));
+ lustre_set_wire_obdo(&body->oa, oinfo->oi_oa);
ptlrpc_req_set_repsize(req, 2, size);
req->rq_interpret_reply = osc_getattr_interpret;
RETURN(-ENOMEM);
body = lustre_msg_buf(req->rq_reqmsg, REQ_REC_OFF, sizeof(*body));
- memcpy(&body->oa, oinfo->oi_oa, sizeof(*oinfo->oi_oa));
+ lustre_set_wire_obdo(&body->oa, oinfo->oi_oa);
ptlrpc_req_set_repsize(req, 2, size);
}
CDEBUG(D_INODE, "mode: %o\n", body->oa.o_mode);
- memcpy(oinfo->oi_oa, &body->oa, sizeof(*oinfo->oi_oa));
+ lustre_get_wire_obdo(oinfo->oi_oa, &body->oa);
/* This should really be sent by the OST */
oinfo->oi_oa->o_blksize = PTLRPC_MAX_BRW_SIZE;
RETURN(-ENOMEM);
body = lustre_msg_buf(req->rq_reqmsg, REQ_REC_OFF, sizeof(*body));
- memcpy(&body->oa, oinfo->oi_oa, sizeof(*oinfo->oi_oa));
+ lustre_set_wire_obdo(&body->oa, oinfo->oi_oa);
ptlrpc_req_set_repsize(req, 2, size);
if (body == NULL)
GOTO(out, rc = -EPROTO);
- memcpy(oinfo->oi_oa, &body->oa, sizeof(*oinfo->oi_oa));
+ lustre_get_wire_obdo(oinfo->oi_oa, &body->oa);
EXIT;
out:
GOTO(out, rc = -EPROTO);
}
- memcpy(aa->aa_oi->oi_oa, &body->oa, sizeof(*aa->aa_oi->oi_oa));
+ lustre_get_wire_obdo(aa->aa_oi->oi_oa, &body->oa);
out:
rc = aa->aa_oi->oi_cb_up(aa->aa_oi, rc);
RETURN(rc);
oinfo->oi_oa->o_lcookie = *oti->oti_logcookies;
}
- memcpy(&body->oa, oinfo->oi_oa, sizeof(*oinfo->oi_oa));
+ lustre_set_wire_obdo(&body->oa, oinfo->oi_oa);
ptlrpc_req_set_repsize(req, 2, size);
/* do mds to ost setattr asynchronouly */
if (!rqset) {
GOTO(out, rc = -ENOMEM);
body = lustre_msg_buf(req->rq_reqmsg, REQ_REC_OFF, sizeof(*body));
- memcpy(&body->oa, oa, sizeof(body->oa));
+ lustre_set_wire_obdo(&body->oa, oa);
ptlrpc_req_set_repsize(req, 2, size);
if ((oa->o_valid & OBD_MD_FLFLAGS) &&
GOTO (out_req, rc = -EPROTO);
}
- memcpy(oa, &body->oa, sizeof(*oa));
+ lustre_get_wire_obdo(oa, &body->oa);
/* This should really be sent by the OST */
oa->o_blksize = PTLRPC_MAX_BRW_SIZE;
GOTO(out, rc = -EPROTO);
}
- memcpy(aa->aa_oi->oi_oa, &body->oa, sizeof(*aa->aa_oi->oi_oa));
+ lustre_get_wire_obdo(aa->aa_oi->oi_oa, &body->oa);
out:
rc = aa->aa_oi->oi_cb_up(aa->aa_oi, rc);
RETURN(rc);
ptlrpc_at_set_req_timeout(req);
body = lustre_msg_buf(req->rq_reqmsg, REQ_REC_OFF, sizeof(*body));
- memcpy(&body->oa, oinfo->oi_oa, sizeof(*oinfo->oi_oa));
+ lustre_set_wire_obdo(&body->oa, oinfo->oi_oa);
/* overload the size and blocks fields in the oa with start/end */
body->oa.o_size = oinfo->oi_policy.l_extent.start;
RETURN(-ENOMEM);
body = lustre_msg_buf(req->rq_reqmsg, REQ_REC_OFF, sizeof(*body));
- memcpy(&body->oa, oa, sizeof(*oa));
+ lustre_set_wire_obdo(&body->oa, oa);
/* overload the size and blocks fields in the oa with start/end */
body->oa.o_size = start;
GOTO (out, rc = -EPROTO);
}
- memcpy(oa, &body->oa, sizeof(*oa));
+ lustre_get_wire_obdo(oa, &body->oa);
EXIT;
out:
oa->o_lcookie = *oti->oti_logcookies;
}
- memcpy(&body->oa, oa, sizeof(*oa));
+ lustre_set_wire_obdo(&body->oa, oa);
ptlrpc_req_set_repsize(req, 2, size);
/* don't throttle destroy RPCs for the MDT */
niobuf = lustre_msg_buf(req->rq_reqmsg, REQ_REC_OFF + 2,
niocount * sizeof(*niobuf));
- memcpy(&body->oa, oa, sizeof(*oa));
-
+ lustre_set_wire_obdo(&body->oa, oa);
obdo_to_ioobj(oa, ioobj);
ioobj->ioo_bufcnt = niocount;
* it can be changed via lprocfs */
cksum_type_t cksum_type = cli->cl_cksum_type;
- if ((body->oa.o_valid & OBD_MD_FLFLAGS) == 0)
- oa->o_flags = body->oa.o_flags = 0;
+ if ((body->oa.o_valid & OBD_MD_FLFLAGS) == 0) {
+ oa->o_flags &= OBD_FL_LOCAL_MASK;
+ body->oa.o_flags = 0;
+ }
body->oa.o_flags |= cksum_type_pack(cksum_type);
body->oa.o_valid |= OBD_MD_FLCKSUM | OBD_MD_FLFLAGS;
body->oa.o_cksum = osc_checksum_bulk(requested_nob,
}
out:
if (rc >= 0)
- memcpy(aa->aa_oa, &body->oa, sizeof(*aa->aa_oa));
+ lustre_get_wire_obdo(aa->aa_oa, &body->oa);
RETURN(rc);
}
sort_brw_pages(ppga, page_count);
while (page_count) {
struct brw_page **copy;
+ struct obdo *oa;
obd_count pages_per_brw;
pages_per_brw = min_t(obd_count, page_count,
if (copy == NULL)
GOTO(out, rc = -ENOMEM);
memcpy(copy, ppga, pages_per_brw * sizeof(*copy));
- } else
+
+ OBDO_ALLOC(oa);
+ if (oa == NULL) {
+ OBD_FREE(copy, pages_per_brw * sizeof(*copy));
+ GOTO(out, rc = -ENOMEM);
+ }
+ memcpy(oa, oinfo->oi_oa, sizeof(*oa));
+ oa->o_flags |= OBD_FL_TEMPORARY;
+ } else {
copy = ppga;
+ oa = oinfo->oi_oa;
+ LASSERT(!(oa->o_flags & OBD_FL_TEMPORARY));
+ }
- rc = async_internal(cmd, exp, oinfo->oi_oa, oinfo->oi_md,
- pages_per_brw, copy, set);
+ rc = async_internal(cmd, exp, oa, oinfo->oi_md, pages_per_brw,
+ copy, set);
if (rc != 0) {
if (copy != ppga)
OBD_FREE(copy, pages_per_brw * sizeof(*copy));
+
+ if (oa->o_flags & OBD_FL_TEMPORARY)
+ OBDO_FREE(oa);
break;
}
obd_count i;
for (i = 0; i < aa->aa_page_count; i++)
osc_release_write_grant(aa->aa_cli, aa->aa_ppga[i], 1);
+
+ if (aa->aa_oa->o_flags & OBD_FL_TEMPORARY)
+ OBDO_FREE(aa->aa_oa);
}
osc_wake_cache_waiters(cli);
osc_check_rpcs(cli);