EXIT;
}
-void ll_intent_release(struct lookup_intent *it)
+void ll_intent_drop_lock(struct lookup_intent *it)
{
struct lustre_handle *handle;
- ENTRY;
if (it->it_op && it->d.lustre.it_lock_mode) {
handle = (struct lustre_handle *)&it->d.lustre.it_lock_handle;
" from it %p\n", handle->cookie, it);
ldlm_lock_decref(handle, it->d.lustre.it_lock_mode);
- /* intent_release may be called multiple times, from
- this thread and we don't want to double-decref this
- lock (see bug 494) */
+ /* bug 494: intent_release may be called multiple times, from
+ * this thread and we don't want to double-decref this lock */
it->d.lustre.it_lock_mode = 0;
}
+}
+
+void ll_intent_release(struct lookup_intent *it)
+{
+ ENTRY;
+
+ ll_intent_drop_lock(it);
it->it_magic = 0;
it->it_op_release = 0;
it->d.lustre.it_disposition = 0;
extern struct file_operations ll_special_sock_inode_fops;
/* llite/dcache.c */
+void ll_intent_drop_lock(struct lookup_intent *);
void ll_intent_release(struct lookup_intent *);
extern void ll_set_dd(struct dentry *de);
void ll_unhash_aliases(struct inode *);
if (rc < 0)
GOTO(out, retval = ERR_PTR(rc));
+ /* bug 2334: drop MDS lock before acquiring OST lock */
+ ll_intent_drop_lock(it);
+
rc = lookup_it_finish(req, 1, it, &icbd);
if (rc != 0) {
ll_intent_release(it);