if (rc)
LBUG();
- ll_intent_drop_lock(it);
-
if (!S_ISREG(inode->i_mode))
GOTO(out, rc);
#include "lmv_internal.h"
+static inline void lmv_drop_intent_lock(struct lookup_intent *it)
+{
+ if (it->d.lustre.it_lock_mode != 0)
+ ldlm_lock_decref((void *)&it->d.lustre.it_lock_handle,
+ it->d.lustre.it_lock_mode);
+}
+
int lmv_handle_remote_inode(struct obd_export *exp, struct ll_uctxt *uctxt,
void *lmm, int lmmsize,
struct lookup_intent *it, int flags,
* order to maintain dcache consistency. thus drop UPDATE
* lock here and put LOOKUP in request */
if (rc == 0) {
- LASSERT(it->d.lustre.it_lock_mode != 0);
- ldlm_lock_decref((void *)&it->d.lustre.it_lock_handle,
- it->d.lustre.it_lock_mode);
+ lmv_drop_intent_lock(it);
memcpy(&it->d.lustre.it_lock_handle, &plock,
sizeof(plock));
it->d.lustre.it_lock_mode = pmode;
RETURN(ELDLM_LOCK_ABORTED);
if (intent_disposition(rep, DISP_LOOKUP_NEG) &&
!intent_disposition(rep, DISP_OPEN_OPEN))
-#endif
- if (rep->lock_policy_res2) {
- /* mds_open returns ENOLCK where it
- * should return zero, but it has no
- * lock to return */
- if (rep->lock_policy_res2 == ENOLCK)
- rep->lock_policy_res2 = 0;
- RETURN(ELDLM_LOCK_ABORTED);
- }
+#endif
+ /* IT_OPEN may return lock on cross-node dentry
+ * that we want to hold during attr retrival -bzzz */
+ if (rc != 0 || lockh.cookie == 0)
+ RETURN(ELDLM_LOCK_ABORTED);
break;
case IT_LOOKUP:
getattr_part = MDS_INODELOCK_LOOKUP;
}
}
- if (rc == 0) {
- struct ldlm_res_id res_id = { . name = {0} };
- ldlm_policy_data_t policy;
- int flags = 0;
- res_id.name[0] = dchild->d_inode->i_ino;
- res_id.name[1] = dchild->d_inode->i_generation;
- policy.l_inodebits.bits = MDS_INODELOCK_LOOKUP |
- MDS_INODELOCK_UPDATE;
- rc = ldlm_cli_enqueue(NULL, NULL, obd->obd_namespace,
- res_id, LDLM_IBITS, &policy,
- LCK_PR, &flags,
- mds_blocking_ast,
- ldlm_completion_ast, NULL, NULL,
- NULL, 0, NULL, child_lockh);
- if (rc == 0)
- cleanup_phase = 3;
- }
-
/* Step 5: mds_open it */
rc = mds_finish_open(req, dchild, body, rec->ur_flags, &handle, rec,
rep);
req, rc, rep ? rep->lock_policy_res1 : 0);
switch (cleanup_phase) {
- case 3:
- if (rc)
- ldlm_lock_decref(child_lockh, LCK_PR);
case 2:
if (rc && created) {
int err = vfs_unlink(dparent->d_inode, dchild);
atomic_inc(&mds->mds_open_count);
if (mea)
OBD_FREE(mea, mea_size);
- if ((cleanup_phase != 3) && !rc)
- rc = ENOLCK;
RETURN(rc);
}