struct ldlm_request {
__u32 lock_flags; /* LDLM_FL_*,(lustre_dlm_flags.h) */
__u32 lock_count; /* Num of locks in lock_handle[] */
- struct ldlm_lock_desc lock_desc; /* lock descriptor */
- struct lustre_handle lock_handle[LDLM_LOCKREQ_HANDLES];
+ struct ldlm_lock_desc lock_desc; /* lock descriptor */
+ struct lustre_handle lock_handle[]; /* was LDLM_LOCKREQ_HANDLES */
};
struct ldlm_reply {
ENTRY;
size = req_capsule_get_size(&req->rq_pill, &RMF_DLM_REQ, RCL_CLIENT);
- if (size <= offsetof(struct ldlm_request, lock_handle) ||
- (size - offsetof(struct ldlm_request, lock_handle)) /
- sizeof(struct lustre_handle) < dlm_req->lock_count)
+ if (size <= sizeof(*dlm_req) || dlm_req->lock_count >
+ (size - sizeof(*dlm_req)) / sizeof(struct lustre_handle))
RETURN(0);
count = dlm_req->lock_count ? dlm_req->lock_count : 1;
* LDLM_LOCKREQ_HANDLE -1 slots are available.
* Otherwise, LDLM_LOCKREQ_HANDLE slots are available.
*
- * \param[in] count
- * \param[in] type
+ * \param[in] count - total number of lock handles to include for cancel
+ * \param[in] type - LDLM RPC request type
*
* \retval size of the request buffer
*/
static int ldlm_request_bufsize(int count, int type)
{
- int avail = LDLM_LOCKREQ_HANDLES;
-
if (type == LDLM_ENQUEUE)
- avail -= LDLM_ENQUEUE_CANCEL_OFF;
+ count++;
- if (count > avail)
- avail = (count - avail) * sizeof(struct lustre_handle);
- else
- avail = 0;
+ /* keep minimum handles to keep struct size for compatibility */
+ if (count < LDLM_LOCKREQ_HANDLES)
+ count = LDLM_LOCKREQ_HANDLES;
- return sizeof(struct ldlm_request) + avail;
+ return offsetof(struct ldlm_request, lock_handle[count]);
}
static void ldlm_expired_completion_wait(struct lock_wait_data *lwd)
struct req_msg_field RMF_DLM_REQ =
DEFINE_MSGF("dlm_req", RMF_F_NO_SIZE_CHECK /* ldlm_request_bufsize */,
- sizeof(struct ldlm_request),
+ offsetof(struct ldlm_request,
+ lock_handle[LDLM_LOCKREQ_HANDLES]),
lustre_swab_ldlm_request, NULL);
EXPORT_SYMBOL(RMF_DLM_REQ);
(long long)(int)sizeof(((struct ldlm_lock_desc *)0)->l_policy_data));
/* Checks for struct ldlm_request */
- LASSERTF((int)sizeof(struct ldlm_request) == 104, "found %lld\n",
+ LASSERTF((int)sizeof(struct ldlm_request) == 88, "found %lld\n",
(long long)(int)sizeof(struct ldlm_request));
LASSERTF((int)offsetof(struct ldlm_request, lock_flags) == 0, "found %lld\n",
(long long)(int)offsetof(struct ldlm_request, lock_flags));
(long long)(int)sizeof(((struct ldlm_request *)0)->lock_desc));
LASSERTF((int)offsetof(struct ldlm_request, lock_handle) == 88, "found %lld\n",
(long long)(int)offsetof(struct ldlm_request, lock_handle));
- LASSERTF((int)sizeof(((struct ldlm_request *)0)->lock_handle) == 16, "found %lld\n",
- (long long)(int)sizeof(((struct ldlm_request *)0)->lock_handle));
+ LASSERTF((int)sizeof(*((struct ldlm_request *)0)->lock_handle) == 8, "found %lld\n",
+ (long long)(int)sizeof(*((struct ldlm_request *)0)->lock_handle));
+ BUILD_BUG_ON(offsetof(struct ldlm_request, lock_handle) != sizeof(struct ldlm_request));
/* Checks for struct ldlm_reply */
LASSERTF((int)sizeof(struct ldlm_reply) == 112, "found %lld\n",
CHECK_MEMBER(ldlm_request, lock_flags);
CHECK_MEMBER(ldlm_request, lock_count);
CHECK_MEMBER(ldlm_request, lock_desc);
- CHECK_MEMBER(ldlm_request, lock_handle);
+ CHECK_MEMBER_IS_FLEXIBLE(ldlm_request, lock_handle);
}
static void
(long long)(int)sizeof(((struct ldlm_lock_desc *)0)->l_policy_data));
/* Checks for struct ldlm_request */
- LASSERTF((int)sizeof(struct ldlm_request) == 104, "found %lld\n",
+ LASSERTF((int)sizeof(struct ldlm_request) == 88, "found %lld\n",
(long long)(int)sizeof(struct ldlm_request));
LASSERTF((int)offsetof(struct ldlm_request, lock_flags) == 0, "found %lld\n",
(long long)(int)offsetof(struct ldlm_request, lock_flags));
(long long)(int)sizeof(((struct ldlm_request *)0)->lock_desc));
LASSERTF((int)offsetof(struct ldlm_request, lock_handle) == 88, "found %lld\n",
(long long)(int)offsetof(struct ldlm_request, lock_handle));
- LASSERTF((int)sizeof(((struct ldlm_request *)0)->lock_handle) == 16, "found %lld\n",
- (long long)(int)sizeof(((struct ldlm_request *)0)->lock_handle));
+ LASSERTF((int)sizeof(*((struct ldlm_request *)0)->lock_handle) == 8, "found %lld\n",
+ (long long)(int)sizeof(*((struct ldlm_request *)0)->lock_handle));
+ BUILD_BUG_ON(offsetof(struct ldlm_request, lock_handle) != sizeof(struct ldlm_request));
/* Checks for struct ldlm_reply */
LASSERTF((int)sizeof(struct ldlm_reply) == 112, "found %lld\n",