mdc_set_lock_data(&it->d.lustre.it_lock_handle, inode);
}
- /* drop IT_LOOKUP locks */
- if (it->it_op == IT_LOOKUP)
+ /* drop lookup/getattr locks */
+ if (it->it_op == IT_LOOKUP || it->it_op == IT_GETATTR)
ll_intent_release(it);
}
GOTO(out, rc = 0);
rc = pnode_revalidate_finish(req, 1, it, pnode);
+ if (rc != 0) {
+ ll_intent_release(it);
+ GOTO(out, rc = 0);
+ }
+ rc = 1;
/* Note: ll_intent_lock may cause a callback, check this! */
- if (it->it_op & (IT_OPEN | IT_GETATTR))
+ if (it->it_op & IT_OPEN)
LL_SAVE_INTENT(pb->pb_ino, it);
- RETURN(1);
+
out:
- if (req)
+ if (req && rc == 1)
ptlrpc_req_finished(req);
if (rc == 0) {
LASSERT(pb->pb_ino);
- if (S_ISDIR(llu_i2info(pb->pb_ino)->lli_st_mode))
- llu_invalidate_inode_pages(pb->pb_ino);
- llu_i2info(pb->pb_ino)->lli_stale_flag = 1;
- unhook_stale_inode(pnode);
+ I_RELE(pb->pb_ino);
+ pb->pb_ino = NULL;
} else {
llu_lookup_finish_locks(it, pnode);
llu_i2info(pb->pb_ino)->lli_stale_flag = 0;
- if (it->it_op & (IT_OPEN | IT_GETATTR))
- LL_SAVE_INTENT(pb->pb_ino, it);
}
RETURN(rc);
}
int rc;
/* NB 1 request reference will be taken away by ll_intent_lock()
- * when I return
+ * when I return
* Note: libsysio require the inode must be generated here
*/
if ((it->it_op & IT_CREAT) || !it_disposition(it, DISP_LOOKUP_NEG)) {
/* If this is a stat, get the authoritative file size */
if (it->it_op == IT_GETATTR && S_ISREG(lli->lli_st_mode) &&
lli->lli_smd != NULL) {
- struct ldlm_extent extent = {0, OBD_OBJECT_EOF};
- struct lustre_handle lockh = {0};
struct lov_stripe_md *lsm = lli->lli_smd;
+ struct ost_lvb lvb;
ldlm_error_t rc;
LASSERT(lsm->lsm_object_id != 0);
/* bug 2334: drop MDS lock before acquiring OST lock */
ll_intent_drop_lock(it);
- rc = llu_extent_lock(NULL, inode, lsm, LCK_PR, &extent,
- &lockh);
- if (rc != ELDLM_OK) {
+ rc = llu_glimpse_size(inode, &lvb);
+ if (rc) {
I_RELE(inode);
- RETURN(-EIO);
+ RETURN(rc);
}
- llu_extent_unlock(NULL, inode, lsm, LCK_PR, &lockh);
+ lli->lli_st_size = lvb.lvb_size;
}
} else {
ENTRY;
}
/* intent will be further used in cases of open()/getattr() */
- if (inode && (it->it_op & (IT_OPEN | IT_GETATTR)))
+ if (inode && (it->it_op & IT_OPEN))
LL_SAVE_INTENT(inode, it);
child->p_base->pb_ino = inode;