1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
6 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 only,
10 * as published by the Free Software Foundation.
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License version 2 for more details (a copy is included
16 * in the LICENSE file that accompanied this code).
18 * You should have received a copy of the GNU General Public License
19 * version 2 along with this program; If not, see
20 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
22 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
23 * CA 95054 USA or visit www.sun.com if you need additional information or
29 * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
30 * Use is subject to license terms.
33 * This file is part of Lustre, http://www.lustre.org/
34 * Lustre is a trademark of Sun Microsystems, Inc.
38 #include <linux/sched.h>
39 #include <linux/smp_lock.h>
40 #include <linux/quotaops.h>
42 #define DEBUG_SUBSYSTEM S_LLITE
44 #include <obd_support.h>
45 #include <lustre_lite.h>
46 #include <lustre/lustre_idl.h>
47 #include <lustre_dlm.h>
48 #include <linux/lustre_version.h>
50 #include "llite_internal.h"
52 spinlock_t ll_lookup_lock = SPIN_LOCK_UNLOCKED;
54 /* should NOT be called with the dcache lock, see fs/dcache.c */
55 static void ll_release(struct dentry *de)
57 struct ll_dentry_data *lld;
61 if (lld == NULL) { /* NFS copies the de->d_op methods (bug 4655) */
65 #ifndef HAVE_VFS_INTENT_PATCHES
67 ll_intent_release(lld->lld_it);
68 OBD_FREE(lld->lld_it, sizeof(*lld->lld_it));
71 LASSERT(lld->lld_cwd_count == 0);
72 LASSERT(lld->lld_mnt_count == 0);
73 OBD_FREE(de->d_fsdata, sizeof(*lld));
78 /* Compare if two dentries are the same. Don't match if the existing dentry
79 * is marked DCACHE_LUSTRE_INVALID. Returns 1 if different, 0 if the same.
81 * This avoids a race where ll_lookup_it() instantiates a dentry, but we get
82 * an AST before calling d_revalidate_it(). The dentry still exists (marked
83 * INVALID) so d_lookup() matches it, but we have no lock on it (so
84 * lock_match() fails) and we spin around real_lookup(). */
85 int ll_dcompare(struct dentry *parent, struct qstr *d_name, struct qstr *name)
87 struct dentry *dchild;
90 /* XXX: d_name must be in-dentry structure */
91 dchild = container_of(d_name, struct dentry, d_name); /* ugh */
93 if (d_name->len != name->len)
96 if (memcmp(d_name->name, name->name, name->len))
99 CDEBUG(D_DENTRY,"found name %.*s(%p) - flags %d/%x - refc %d\n",
100 name->len, name->name, dchild,
101 d_mountpoint(dchild), dchild->d_flags & DCACHE_LUSTRE_INVALID,
102 atomic_read(&dchild->d_count));
104 /* mountpoint is always valid */
105 if (d_mountpoint(dchild))
108 if (dchild->d_flags & DCACHE_LUSTRE_INVALID)
114 static inline int return_if_equal(struct ldlm_lock *lock, void *data)
116 if (lock->l_flags & LDLM_FL_CANCELING)
117 return LDLM_ITER_CONTINUE;
118 return LDLM_ITER_STOP;
121 /* find any ldlm lock of the inode in mdc and lov
125 int find_cbdata(struct inode *inode)
128 struct ll_inode_info *lli = ll_i2info(inode);
129 struct ll_sb_info *sbi = ll_i2sbi(inode);
134 ll_inode2fid(&fid, inode);
135 rc = mdc_find_cbdata(sbi->ll_mdc_exp, &fid, return_if_equal, NULL);
140 rc = obd_find_cbdata(sbi->ll_osc_exp, lli->lli_smd,
141 return_if_equal, NULL);
146 /* should NOT be called with the dcache lock, see fs/dcache.c */
147 static int ll_ddelete(struct dentry *de)
152 CDEBUG(D_DENTRY, "%s dentry %.*s (%p, parent %p, inode %p) %s%s\n",
153 (de->d_flags & DCACHE_LUSTRE_INVALID ? "hiden" : "keeping"),
154 de->d_name.len, de->d_name.name, de, de->d_parent, de->d_inode,
155 d_unhashed(de) ? "" : "hashed,",
156 list_empty(&de->d_subdirs) ? "" : "subdirs");
158 /* if not ldlm lock for this inode, set i_nlink to 0 so that
159 * this inode can be recycled later b=20433 */
160 LASSERT(atomic_read(&de->d_count) == 0);
161 if (de->d_inode && !find_cbdata(de->d_inode))
162 de->d_inode->i_nlink = 0;
164 if (de->d_flags & DCACHE_LUSTRE_INVALID)
170 void ll_set_dd(struct dentry *de)
175 CDEBUG(D_DENTRY, "ldd on dentry %.*s (%p) parent %p inode %p refc %d\n",
176 de->d_name.len, de->d_name.name, de, de->d_parent, de->d_inode,
177 atomic_read(&de->d_count));
179 if (de->d_fsdata == NULL) {
180 struct ll_dentry_data *lld;
183 if (likely(lld != NULL)) {
185 if (likely(de->d_fsdata == NULL))
196 void ll_intent_drop_lock(struct lookup_intent *it)
198 struct lustre_handle *handle;
200 if (it->it_op && it->d.lustre.it_lock_mode) {
201 handle = (struct lustre_handle *)&it->d.lustre.it_lock_handle;
202 CDEBUG(D_DLMTRACE, "releasing lock with cookie "LPX64
203 " from it %p\n", handle->cookie, it);
204 ldlm_lock_decref(handle, it->d.lustre.it_lock_mode);
206 /* bug 494: intent_release may be called multiple times, from
207 * this thread and we don't want to double-decref this lock */
208 it->d.lustre.it_lock_mode = 0;
212 void ll_intent_release(struct lookup_intent *it)
216 ll_intent_drop_lock(it);
217 #ifdef HAVE_VFS_INTENT_PATCHES
219 it->it_op_release = 0;
221 /* We are still holding extra reference on a request, need to free it */
222 if (it_disposition(it, DISP_ENQ_OPEN_REF)) /* open req for llfile_open*/
223 ptlrpc_req_finished(it->d.lustre.it_data);
224 if (it_disposition(it, DISP_ENQ_CREATE_REF)) /* create rec */
225 ptlrpc_req_finished(it->d.lustre.it_data);
226 if (it_disposition(it, DISP_ENQ_COMPLETE)) /* saved req from revalidate
228 ptlrpc_req_finished(it->d.lustre.it_data);
230 it->d.lustre.it_disposition = 0;
231 it->d.lustre.it_data = NULL;
235 /* Drop dentry if it is not used already, unhash otherwise.
236 Should be called with dcache lock held!
237 Returns: 1 if dentry was dropped, 0 if unhashed. */
238 int ll_drop_dentry(struct dentry *dentry)
241 if (atomic_read(&dentry->d_count) == 0) {
242 CDEBUG(D_DENTRY, "deleting dentry %.*s (%p) parent %p "
243 "inode %p\n", dentry->d_name.len,
244 dentry->d_name.name, dentry, dentry->d_parent,
248 unlock_dentry(dentry);
249 spin_unlock(&dcache_lock);
250 spin_unlock(&ll_lookup_lock);
252 spin_lock(&ll_lookup_lock);
253 spin_lock(&dcache_lock);
256 /* disconected dentry can not be find without lookup, because we
257 * not need his to unhash or mark invalid. */
258 if (dentry->d_flags & DCACHE_DISCONNECTED) {
259 unlock_dentry(dentry);
263 #ifdef DCACHE_LUSTRE_INVALID
264 if (!(dentry->d_flags & DCACHE_LUSTRE_INVALID)) {
266 if (!d_unhashed(dentry)) {
268 CDEBUG(D_DENTRY, "unhashing dentry %.*s (%p) parent %p "
269 "inode %p refc %d\n", dentry->d_name.len,
270 dentry->d_name.name, dentry, dentry->d_parent,
271 dentry->d_inode, atomic_read(&dentry->d_count));
272 /* actually we don't unhash the dentry, rather just
273 * mark it inaccessible for to __d_lookup(). otherwise
274 * sys_getcwd() could return -ENOENT -bzzz */
275 #ifdef DCACHE_LUSTRE_INVALID
276 dentry->d_flags |= DCACHE_LUSTRE_INVALID;
278 if (!dentry->d_inode || !S_ISDIR(dentry->d_inode->i_mode))
283 unlock_dentry(dentry);
287 void ll_unhash_aliases(struct inode *inode)
289 struct list_head *tmp, *head;
293 CERROR("unexpected NULL inode, tell phil\n");
297 CDEBUG(D_INODE, "marking dentries for ino %lu/%u(%p) invalid\n",
298 inode->i_ino, inode->i_generation, inode);
300 head = &inode->i_dentry;
301 spin_lock(&ll_lookup_lock);
302 spin_lock(&dcache_lock);
305 while ((tmp = tmp->next) != head) {
306 struct dentry *dentry = list_entry(tmp, struct dentry, d_alias);
308 if (dentry->d_name.len == 1 && dentry->d_name.name[0] == '/') {
309 CERROR("called on root (?) dentry=%p, inode=%p "
310 "ino=%lu\n", dentry, inode, inode->i_ino);
311 lustre_dump_dentry(dentry, 1);
312 libcfs_debug_dumpstack(NULL);
315 if (ll_drop_dentry(dentry))
318 spin_unlock(&dcache_lock);
319 spin_unlock(&ll_lookup_lock);
324 int revalidate_it_finish(struct ptlrpc_request *request, int offset,
325 struct lookup_intent *it, struct dentry *de)
333 if (it_disposition(it, DISP_LOOKUP_NEG))
336 rc = ll_prep_inode(ll_i2sbi(de->d_inode)->ll_osc_exp, &de->d_inode,
337 request, offset, NULL);
342 void ll_lookup_finish_locks(struct lookup_intent *it, struct dentry *dentry)
345 LASSERT(dentry != NULL);
347 if (it->d.lustre.it_lock_mode && dentry->d_inode != NULL) {
348 struct inode *inode = dentry->d_inode;
349 CDEBUG(D_DLMTRACE, "setting l_data to inode %p (%lu/%u)\n",
350 inode, inode->i_ino, inode->i_generation);
351 mdc_set_lock_data(&it->d.lustre.it_lock_handle, inode, NULL);
354 /* drop lookup or getattr locks immediately */
355 if (it->it_op == IT_LOOKUP || it->it_op == IT_GETATTR) {
356 /* on 2.6 there are situation when several lookups and
357 * revalidations may be requested during single operation.
358 * therefore, we don't release intent here -bzzz */
359 ll_intent_drop_lock(it);
363 void ll_frob_intent(struct lookup_intent **itp, struct lookup_intent *deft)
365 struct lookup_intent *it = *itp;
366 #ifdef HAVE_VFS_INTENT_PATCHES
368 LASSERTF(it->it_magic == INTENT_MAGIC, "bad intent magic: %x\n",
373 if (!it || it->it_op == IT_GETXATTR)
376 #ifdef HAVE_VFS_INTENT_PATCHES
377 it->it_op_release = ll_intent_release;
381 int ll_revalidate_it(struct dentry *de, int lookup_flags,
382 struct lookup_intent *it)
384 struct mdc_op_data op_data = { { 0 } };
385 struct ptlrpc_request *req = NULL;
386 struct lookup_intent lookup_it = { .it_op = IT_LOOKUP };
387 struct obd_export *exp;
388 struct inode *parent = de->d_parent->d_inode;
392 CDEBUG(D_VFSTRACE, "VFS Op:name=%s,intent=%s\n", de->d_name.name,
395 if (de->d_inode == NULL) {
396 /* We can only use negative dentries if this is stat or lookup,
397 for opens and stuff we do need to query server. */
398 /* If there is IT_CREAT in intent op set, then we must throw
399 away this negative dentry and actually do the request to
400 kernel to create whatever needs to be created (if possible)*/
401 if (it && (it->it_op & IT_CREAT))
404 #ifdef DCACHE_LUSTRE_INVALID
405 if (de->d_flags & DCACHE_LUSTRE_INVALID)
409 rc = ll_have_md_lock(parent, MDS_INODELOCK_UPDATE, LCK_MINMODE);
413 exp = ll_i2mdcexp(de->d_inode);
415 /* Never execute intents for mount points.
416 * Attributes will be fixed up in ll_inode_revalidate_it */
417 if (d_mountpoint(de))
418 GOTO(out_sa, rc = 1);
420 /*need to get attributes in case it got changed from other client*/
421 if (de == de->d_sb->s_root) {
422 rc = __ll_inode_revalidate_it(de, it, MDS_INODELOCK_LOOKUP);
428 OBD_FAIL_TIMEOUT(OBD_FAIL_MDC_REVALIDATE_PAUSE, 5);
429 ll_frob_intent(&it, &lookup_it);
432 if (it->it_op == IT_LOOKUP && !(de->d_flags & DCACHE_LUSTRE_INVALID))
433 GOTO(out_sa, rc = 1);
435 ll_prepare_mdc_op_data(&op_data, parent, de->d_inode,
436 de->d_name.name, de->d_name.len, 0, NULL);
438 if ((it->it_op == IT_OPEN) && de->d_inode) {
439 struct inode *inode = de->d_inode;
440 struct ll_inode_info *lli = ll_i2info(inode);
441 struct obd_client_handle **och_p;
443 /* We used to check for MDS_INODELOCK_OPEN here, but in fact
444 * just having LOOKUP lock is enough to justify inode is the
445 * same. And if inode is the same and we have suitable
446 * openhandle, then there is no point in doing another OPEN RPC
447 * just to throw away newly received openhandle.
448 * There are no security implications too, if file owner or
449 * access mode is change, LOOKUP lock is revoked */
451 if (it->it_flags & FMODE_WRITE) {
452 och_p = &lli->lli_mds_write_och;
453 och_usecount = &lli->lli_open_fd_write_count;
454 } else if (it->it_flags & FMODE_EXEC) {
455 och_p = &lli->lli_mds_exec_och;
456 och_usecount = &lli->lli_open_fd_exec_count;
458 och_p = &lli->lli_mds_read_och;
459 och_usecount = &lli->lli_open_fd_read_count;
461 /* Check for the proper lock. */
462 if (!ll_have_md_lock(inode, MDS_INODELOCK_LOOKUP, LCK_MINMODE))
464 down(&lli->lli_och_sem);
465 if (*och_p) { /* Everything is open already, do nothing */
466 /*(*och_usecount)++; Do not let them steal our open
467 handle from under us */
468 /* XXX The code above was my original idea, but in case
469 we have the handle, but we cannot use it due to later
470 checks (e.g. O_CREAT|O_EXCL flags set), nobody
471 would decrement counter increased here. So we just
472 hope the lock won't be invalidated in between. But
473 if it would be, we'll reopen the open request to
474 MDS later during file open path */
475 up(&lli->lli_och_sem);
478 up(&lli->lli_och_sem);
482 if (it->it_op == IT_GETATTR)
483 first = ll_statahead_enter(parent, &de, 0);
486 it->it_create_mode &= ~current->fs->umask;
487 it->it_create_mode |= M_CHECK_STALE;
488 rc = mdc_intent_lock(exp, &op_data, NULL, 0, it, lookup_flags,
489 &req, ll_mdc_blocking_ast, 0);
490 it->it_create_mode &= ~M_CHECK_STALE;
491 if (it->it_op == IT_GETATTR && !first)
492 /* If there are too many locks on client-side, then some
493 * locks taken by statahead maybe dropped automatically
494 * before the real "revalidate" using them. */
495 ll_statahead_exit(parent, de, req == NULL ? rc : 0);
496 else if (first == -EEXIST)
497 ll_statahead_mark(parent, de);
499 /* If req is NULL, then mdc_intent_lock only tried to do a lock match;
500 * if all was well, it will return 1 if it found locks, 0 otherwise. */
501 if (req == NULL && rc >= 0) {
509 CDEBUG(D_INFO, "ll_intent_lock: rc %d : it->it_status "
510 "%d\n", rc, it->d.lustre.it_status);
516 rc = revalidate_it_finish(req, DLM_REPLY_REC_OFF, it, de);
518 /* we are going release the intent, so clear DISP_ENQ_COMPLETE
519 * to prevent a double free of the request */
520 it_clear_disposition(it, DISP_ENQ_COMPLETE);
521 ll_intent_release(it);
524 if ((it->it_op & IT_OPEN) && de->d_inode &&
525 !S_ISREG(de->d_inode->i_mode) &&
526 !S_ISDIR(de->d_inode->i_mode)) {
527 ll_release_openhandle(de, it);
531 /* unfortunately ll_intent_lock may cause a callback and revoke our
533 spin_lock(&ll_lookup_lock);
534 spin_lock(&dcache_lock);
538 d_rehash_cond(de, 0);
539 spin_unlock(&dcache_lock);
540 spin_unlock(&ll_lookup_lock);
543 /* We do not free request as it may be reused during following lookup
544 * (see comment in mdc/mdc_locks.c::mdc_intent_lock()), request will
545 * be freed in ll_lookup_it or in ll_intent_release. But if
546 * request was not completed, we need to free it. (bug 5154, 9903) */
547 if (req != NULL && !it_disposition(it, DISP_ENQ_COMPLETE))
548 ptlrpc_req_finished(req);
550 #ifdef DCACHE_LUSTRE_INVALID
551 ll_unhash_aliases(de->d_inode);
552 /* done in ll_unhash_aliases()
553 dentry->d_flags |= DCACHE_LUSTRE_INVALID; */
555 /* We do not want d_invalidate to kill all child dentries too */
559 CDEBUG(D_DENTRY, "revalidated dentry %.*s (%p) parent %p "
560 "inode %p refc %d\n", de->d_name.len,
561 de->d_name.name, de, de->d_parent, de->d_inode,
562 atomic_read(&de->d_count));
563 ll_lookup_finish_locks(it, de);
564 #ifdef DCACHE_LUSTRE_INVALID
566 de->d_flags &= ~DCACHE_LUSTRE_INVALID;
571 /* This part is here to combat evil-evil race in real_lookup on 2.6 kernels.
572 * The race details are: We enter do_lookup() looking for some name,
573 * there is nothing in dcache for this name yet and d_lookup() returns NULL.
574 * We proceed to real_lookup(), and while we do this, another process does
575 * open on the same file we looking up (most simple reproducer), open succeeds
576 * and the dentry is added. Now back to us. In real_lookup() we do d_lookup()
577 * again and suddenly find the dentry, so we call d_revalidate on it, but there
578 * is no lock, so without this code we would return 0, but unpatched
579 * real_lookup just returns -ENOENT in such a case instead of retrying the
580 * lookup. Once this is dealt with in real_lookup(), all of this ugly mess
581 * can go and we can just check locks in ->d_revalidate without doing any
584 if (it != &lookup_it) {
585 ll_lookup_finish_locks(it, de);
588 /*do real lookup here */
589 ll_prepare_mdc_op_data(&op_data, parent, NULL,
590 de->d_name.name, de->d_name.len, 0, NULL);
591 rc = mdc_intent_lock(exp, &op_data, NULL, 0, it, 0, &req,
592 ll_mdc_blocking_ast, 0);
594 struct mds_body *mds_body = lustre_msg_buf(req->rq_repmsg,
597 struct ll_fid fid = { 0 };
600 ll_inode2fid(&fid, de->d_inode);
602 /* see if we got same inode, if not - return error */
603 if(!memcmp(&fid, &mds_body->fid1, sizeof(struct ll_fid)))
604 goto revalidate_finish;
605 /* we are going release the intent, so clear DISP_ENQ_COMPLETE
606 * to prevent a double free of the request */
607 it_clear_disposition(it, DISP_ENQ_COMPLETE);
608 ll_intent_release(it);
614 * For rc == 1 case, should not return directly to prevent losing
615 * statahead windows; for rc == 0 case, the "lookup" will be done later.
617 if (it && it->it_op == IT_GETATTR && rc == 1) {
618 first = ll_statahead_enter(parent, &de, 0);
620 ll_statahead_exit(parent, de, 1);
621 else if (first == -EEXIST)
622 ll_statahead_mark(parent, de);
628 /*static*/ void ll_pin(struct dentry *de, struct vfsmount *mnt, int flag)
630 struct inode *inode= de->d_inode;
631 struct ll_sb_info *sbi = ll_i2sbi(inode);
632 struct ll_dentry_data *ldd = ll_d2d(de);
633 struct obd_client_handle *handle;
639 /* Strictly speaking this introduces an additional race: the
640 * increments should wait until the rpc has returned.
641 * However, given that at present the function is void, this
643 if (flag == 1 && (++ldd->lld_mnt_count) > 1) {
649 if (flag == 0 && (++ldd->lld_cwd_count) > 1) {
656 handle = (flag) ? &ldd->lld_mnt_och : &ldd->lld_cwd_och;
657 rc = obd_pin(sbi->ll_mdc_exp, ll_inode_ll_fid(inode),
662 memset(handle, 0, sizeof(*handle));
664 ldd->lld_cwd_count--;
666 ldd->lld_mnt_count--;
674 /*static*/ void ll_unpin(struct dentry *de, struct vfsmount *mnt, int flag)
676 struct ll_sb_info *sbi = ll_i2sbi(de->d_inode);
677 struct ll_dentry_data *ldd = ll_d2d(de);
678 struct obd_client_handle handle;
684 /* Strictly speaking this introduces an additional race: the
685 * increments should wait until the rpc has returned.
686 * However, given that at present the function is void, this
688 handle = (flag) ? ldd->lld_mnt_och : ldd->lld_cwd_och;
689 if (handle.och_magic != OBD_CLIENT_HANDLE_MAGIC) {
690 /* the "pin" failed */
697 count = --ldd->lld_mnt_count;
699 count = --ldd->lld_cwd_count;
707 rc = obd_unpin(sbi->ll_mdc_exp, &handle, flag);
712 #ifdef HAVE_VFS_INTENT_PATCHES
713 int ll_revalidate_nd(struct dentry *dentry, struct nameidata *nd)
718 if (nd && nd->flags & LOOKUP_LAST && !(nd->flags & LOOKUP_LINK_NOTLAST))
719 rc = ll_revalidate_it(dentry, nd->flags, &nd->intent);
721 rc = ll_revalidate_it(dentry, 0, NULL);
726 int ll_revalidate_nd(struct dentry *dentry, struct nameidata *nd)
731 if (nd && !(nd->flags & (LOOKUP_CONTINUE|LOOKUP_PARENT))) {
732 struct lookup_intent *it;
733 it = ll_convert_intent(&nd->intent.open, nd->flags);
736 if (it->it_op == (IT_OPEN|IT_CREAT))
737 if (nd->intent.open.flags & O_EXCL) {
739 "create O_EXCL, returning 0\n");
744 rc = ll_revalidate_it(dentry, nd->flags, it);
746 if (rc && (nd->flags & LOOKUP_OPEN) &&
747 it_disposition(it, DISP_OPEN_OPEN)) {/*Open*/
748 #ifdef HAVE_FILE_IN_STRUCT_INTENT
749 // XXX Code duplication with ll_lookup_nd
750 if (S_ISFIFO(dentry->d_inode->i_mode)) {
751 // We cannot call open here as it would
754 (struct ptlrpc_request *)
755 it->d.lustre.it_data);
757 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17))
758 /* 2.6.1[456] have a bug in open_namei() that forgets to check
759 * nd->intent.open.file for error, so we need to return it as lookup's result
763 nd->intent.open.file->private_data = it;
764 filp = lookup_instantiate_filp(nd, dentry,NULL);
769 nd->intent.open.file->private_data = it;
770 (void)lookup_instantiate_filp(nd, dentry,NULL);
774 ll_release_openhandle(dentry, it);
775 #endif /* HAVE_FILE_IN_STRUCT_INTENT */
777 if (!rc && (nd->flags & LOOKUP_CREATE) &&
778 it_disposition(it, DISP_OPEN_CREATE)) {
779 /* We created something but we may only return
780 * negative dentry here, so save request in dentry,
781 * if lookup will be called later on, it will
782 * pick the request, otherwise it would be freed
784 ll_d2d(dentry)->lld_it = it;
785 it = NULL; /* avoid freeing */
790 ll_intent_release(it);
791 OBD_FREE(it, sizeof(*it));
794 rc = ll_revalidate_it(dentry, 0, NULL);
801 void ll_d_iput(struct dentry *de, struct inode *inode)
804 if (inode && !find_cbdata(inode))
809 struct dentry_operations ll_d_ops = {
810 .d_revalidate = ll_revalidate_nd,
811 .d_release = ll_release,
812 .d_delete = ll_ddelete,
814 #ifdef DCACHE_LUSTRE_INVALID
815 .d_compare = ll_dcompare,