spin_lock(&dcache_lock);
return 1;
}
- /* disconected dentry can not be find without lookup, because we
+ /* disconected dentry can not be find without lookup, because we
* not need his to unhash or mark invalid. */
if (dentry->d_flags & DCACHE_DISCONNECTED) {
unlock_dentry(dentry);
if (!request)
RETURN(0);
- if (it_disposition(it, DISP_LOOKUP_NEG))
+ if (it_disposition(it, DISP_LOOKUP_NEG))
RETURN(-ENOENT);
rc = ll_prep_inode(&de->d_inode, request, NULL);
struct lookup_intent *it = *itp;
#ifdef HAVE_VFS_INTENT_PATCHES
if (it) {
- LASSERTF(it->it_magic == INTENT_MAGIC,
+ LASSERTF(it->it_magic == INTENT_MAGIC,
"%p has bad intent magic: %x\n",
it, it->it_magic);
}
it->it_flags &= ~O_CHECK_STALE;
ll_finish_md_op_data(op_data);
if (it->it_op == IT_GETATTR && !first)
- ll_statahead_exit(de, rc);
+ /* If there are too many locks on client-side, then some
+ * locks taken by statahead maybe dropped automatically
+ * before the real "revalidate" using them. */
+ ll_statahead_exit(de, req == NULL ? rc : 0);
else if (first == -EEXIST)
ll_statahead_mark(de);
if (rc != -ESTALE) {
CDEBUG(D_INFO, "ll_intent_lock: rc %d : it->it_status "
"%d\n", rc, it->d.lustre.it_status);
+ } else {
+#ifndef HAVE_VFS_INTENT_PATCHES
+ if (it_disposition(it, DISP_OPEN_OPEN) &&
+ !it_open_error(DISP_OPEN_OPEN, it))
+ /* server have valid open - close file first*/
+ ll_release_openhandle(de, it);
+#endif
}
GOTO(out, rc = 0);
}
GOTO(out, rc = 0);
}
- if ((it->it_op & IT_OPEN) && de->d_inode &&
- !S_ISREG(de->d_inode->i_mode) &&
+ if ((it->it_op & IT_OPEN) && de->d_inode &&
+ !S_ISREG(de->d_inode->i_mode) &&
!S_ISDIR(de->d_inode->i_mode)) {
ll_release_openhandle(de, it);
}
if (it && it->it_op == IT_GETATTR && rc == 1) {
first = ll_statahead_enter(de->d_parent->d_inode, &de, 0);
if (!first)
- ll_statahead_exit(de, rc);
+ ll_statahead_exit(de, 1);
else if (first == -EEXIST)
ll_statahead_mark(de);
}
(struct ptlrpc_request *)
it->d.lustre.it_data);
} else {
- struct file *filp;
-
- nd->intent.open.file->private_data = it;
- filp = lookup_instantiate_filp(nd, dentry,NULL);
#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17))
/* 2.6.1[456] have a bug in open_namei() that forgets to check
* nd->intent.open.file for error, so we need to return it as lookup's result
* instead */
- if (IS_ERR(filp))
- rc = 0;
+ struct file *filp;
+
+ nd->intent.open.file->private_data = it;
+ filp = lookup_instantiate_filp(nd, dentry,NULL);
+ if (IS_ERR(filp)) {
+ rc = PTR_ERR(filp);
+ }
+#else
+ nd->intent.open.file->private_data = it;
+ (void)lookup_instantiate_filp(nd, dentry,NULL);
#endif
}
#else