up_write(&mo->mot_dom_sem);
}
-/**
- * Lock prolongation for Data-on-MDT.
- * This is similar to OFD code but for DOM ibits lock.
- */
-static inline time64_t prolong_timeout(struct ptlrpc_request *req)
-{
- struct ptlrpc_service_part *svcpt = req->rq_rqbd->rqbd_svcpt;
- time64_t req_timeout;
-
- if (AT_OFF)
- return obd_timeout / 2;
-
- req_timeout = req->rq_deadline - req->rq_arrival_time.tv_sec;
- return max_t(time64_t, at_est2timeout(at_get(&svcpt->scp_at_estimate)),
- req_timeout);
-}
-
static void mdt_dom_resource_prolong(struct ldlm_prolong_args *arg)
{
struct ldlm_resource *res;
enum ldlm_mode mode;
struct ldlm_lock *lock;
struct ldlm_glimpse_work *gl_work;
- struct list_head gl_list;
+ LIST_HEAD(gl_list);
int rc;
ENTRY;
gl_work->gl_lock = LDLM_LOCK_GET(lock);
/* The glimpse callback is sent to one single IO lock. As a result,
* the gl_work list is just composed of one element */
- INIT_LIST_HEAD(&gl_list);
list_add_tail(&gl_work->gl_list, &gl_list);
/* There is actually no need for a glimpse descriptor when glimpsing
* IO locks */
}
mbo = req_capsule_server_get(pill, &RMF_MDT_BODY);
+ if (!(mbo->mbo_valid & OBD_MD_DOM_SIZE))
+ RETURN(0);
+
+ if (!mbo->mbo_dom_size)
+ RETURN(0);
if (lustre_handle_is_used(lh)) {
struct ldlm_lock *lock;
if (!dom_lock || !mdt->mdt_opts.mo_dom_read_open)
RETURN(0);
- if (!(mbo->mbo_valid & OBD_MD_DOM_SIZE))
- RETURN(0);
-
- if (mbo->mbo_dom_size == 0)
- RETURN(0);
-
CDEBUG(D_INFO, "File size %llu, reply sizes %d/%d\n",
mbo->mbo_dom_size, req->rq_reqmsg->lm_repsize, req->rq_replen);
len = req->rq_reqmsg->lm_repsize - req->rq_replen;
/* can fit whole data */
len = mbo->mbo_dom_size;
offset = 0;
- } else {
+ } else if (mbo->mbo_dom_size <
+ mdt_lmm_dom_stripesize(mti->mti_attr.ma_lmm)) {
int tail, pgbits;
/* File tail offset must be aligned with larger page size
len = tail;
offset = mbo->mbo_dom_size - len;
+ } else {
+ /* DOM stripe is fully written, so don't expect its tail
+ * will be used by append.
+ */
+ RETURN(0);
}
- LASSERT((offset % PAGE_SIZE) == 0);
+
+ LASSERT((offset & ~PAGE_MASK) == 0);
rc = req_capsule_server_grow(pill, &RMF_NIOBUF_INLINE,
sizeof(*rnb) + len);
if (rc != 0) {