Whamcloud - gitweb
LU-620 llite: add delete_from_page_cache and remove_from_page_cache check
[fs/lustre-release.git] / lustre / llite / dcache.c
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  *
4  * GPL HEADER START
5  *
6  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
7  *
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.
11  *
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).
17  *
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
21  *
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
24  * have any questions.
25  *
26  * GPL HEADER END
27  */
28 /*
29  * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
30  * Use is subject to license terms.
31  *
32  * Copyright (c) 2011 Whamcloud, Inc.
33  *
34  */
35 /*
36  * This file is part of Lustre, http://www.lustre.org/
37  * Lustre is a trademark of Sun Microsystems, Inc.
38  */
39
40 #include <linux/fs.h>
41 #include <linux/sched.h>
42 #include <linux/smp_lock.h>
43 #include <linux/quotaops.h>
44
45 #define DEBUG_SUBSYSTEM S_LLITE
46
47 #include <obd_support.h>
48 #include <lustre_lite.h>
49 #include <lustre/lustre_idl.h>
50 #include <lustre_dlm.h>
51 //#include <lustre_ver.h>
52 //#include <lustre_version.h>
53
54 #include "llite_internal.h"
55
56 cfs_spinlock_t ll_lookup_lock = CFS_SPIN_LOCK_UNLOCKED;
57
58 /* should NOT be called with the dcache lock, see fs/dcache.c */
59 static void ll_release(struct dentry *de)
60 {
61         struct ll_dentry_data *lld;
62         ENTRY;
63         LASSERT(de != NULL);
64         lld = ll_d2d(de);
65         if (lld == NULL) { /* NFS copies the de->d_op methods (bug 4655) */
66                 EXIT;
67                 return;
68         }
69         if (lld->lld_it) {
70                 ll_intent_release(lld->lld_it);
71                 OBD_FREE(lld->lld_it, sizeof(*lld->lld_it));
72         }
73         LASSERT(lld->lld_cwd_count == 0);
74         LASSERT(lld->lld_mnt_count == 0);
75         OBD_FREE(de->d_fsdata, sizeof(*lld));
76
77         EXIT;
78 }
79
80 /* Compare if two dentries are the same.  Don't match if the existing dentry
81  * is marked DCACHE_LUSTRE_INVALID.  Returns 1 if different, 0 if the same.
82  *
83  * This avoids a race where ll_lookup_it() instantiates a dentry, but we get
84  * an AST before calling d_revalidate_it().  The dentry still exists (marked
85  * INVALID) so d_lookup() matches it, but we have no lock on it (so
86  * lock_match() fails) and we spin around real_lookup(). */
87 int ll_dcompare(struct dentry *parent, struct qstr *d_name, struct qstr *name)
88 {
89         struct dentry *dchild;
90         ENTRY;
91
92         if (d_name->len != name->len)
93                 RETURN(1);
94
95         if (memcmp(d_name->name, name->name, name->len))
96                 RETURN(1);
97
98         /* XXX: d_name must be in-dentry structure */
99         dchild = container_of(d_name, struct dentry, d_name); /* ugh */
100
101         CDEBUG(D_DENTRY,"found name %.*s(%p) - flags %d/%x - refc %d\n",
102                name->len, name->name, dchild,
103                d_mountpoint(dchild), dchild->d_flags & DCACHE_LUSTRE_INVALID,
104                atomic_read(&dchild->d_count));
105
106          /* mountpoint is always valid */
107         if (d_mountpoint(dchild))
108                 RETURN(0);
109
110         if (dchild->d_flags & DCACHE_LUSTRE_INVALID)
111                 RETURN(1);
112
113         RETURN(0);
114 }
115
116 static inline int return_if_equal(struct ldlm_lock *lock, void *data)
117 {
118         if ((lock->l_flags &
119              (LDLM_FL_CANCELING | LDLM_FL_DISCARD_DATA)) ==
120             (LDLM_FL_CANCELING | LDLM_FL_DISCARD_DATA))
121                 return LDLM_ITER_CONTINUE;
122         return LDLM_ITER_STOP;
123 }
124
125 /* find any ldlm lock of the inode in mdc and lov
126  * return 0    not find
127  *        1    find one
128  *      < 0    error */
129 static int find_cbdata(struct inode *inode)
130 {
131         struct ll_inode_info *lli = ll_i2info(inode);
132         struct ll_sb_info *sbi = ll_i2sbi(inode);
133         int rc = 0;
134         ENTRY;
135
136         LASSERT(inode);
137         rc = md_find_cbdata(sbi->ll_md_exp, ll_inode2fid(inode),
138                             return_if_equal, NULL);
139         if (rc != 0)
140                  RETURN(rc);
141
142         if (lli->lli_smd)
143                 rc = obd_find_cbdata(sbi->ll_dt_exp, lli->lli_smd,
144                                      return_if_equal, NULL);
145
146         RETURN(rc);
147 }
148
149 /**
150  * Called when last reference to a dentry is dropped and dcache wants to know
151  * whether or not it should cache it:
152  * - return 1 to delete the dentry immediately
153  * - return 0 to cache the dentry
154  * Should NOT be called with the dcache lock, see fs/dcache.c
155  */
156 static int ll_ddelete(struct dentry *de)
157 {
158         ENTRY;
159         LASSERT(de);
160
161         CDEBUG(D_DENTRY, "%s dentry %.*s (%p, parent %p, inode %p) %s%s\n",
162                (de->d_flags & DCACHE_LUSTRE_INVALID ? "deleting" : "keeping"),
163                de->d_name.len, de->d_name.name, de, de->d_parent, de->d_inode,
164                d_unhashed(de) ? "" : "hashed,",
165                list_empty(&de->d_subdirs) ? "" : "subdirs");
166
167         /* if not ldlm lock for this inode, set i_nlink to 0 so that
168          * this inode can be recycled later b=20433 */
169         LASSERT(atomic_read(&de->d_count) == 0);
170         if (de->d_inode && !find_cbdata(de->d_inode))
171                 de->d_inode->i_nlink = 0;
172
173         if (de->d_flags & DCACHE_LUSTRE_INVALID)
174                 RETURN(1);
175
176         RETURN(0);
177 }
178
179 static int ll_set_dd(struct dentry *de)
180 {
181         ENTRY;
182         LASSERT(de != NULL);
183
184         CDEBUG(D_DENTRY, "ldd on dentry %.*s (%p) parent %p inode %p refc %d\n",
185                de->d_name.len, de->d_name.name, de, de->d_parent, de->d_inode,
186                atomic_read(&de->d_count));
187
188         if (de->d_fsdata == NULL) {
189                 struct ll_dentry_data *lld;
190
191                 OBD_ALLOC_PTR(lld);
192                 if (likely(lld != NULL)) {
193                         lock_dentry(de);
194                         if (likely(de->d_fsdata == NULL))
195                                 de->d_fsdata = lld;
196                         else
197                                 OBD_FREE_PTR(lld);
198                         unlock_dentry(de);
199                 } else {
200                         RETURN(-ENOMEM);
201                 }
202         }
203
204         RETURN(0);
205 }
206
207 int ll_dops_init(struct dentry *de, int block, int init_sa)
208 {
209         struct ll_dentry_data *lld = ll_d2d(de);
210         int rc = 0;
211
212         if (lld == NULL && block != 0) {
213                 rc = ll_set_dd(de);
214                 if (rc)
215                         return rc;
216
217                 lld = ll_d2d(de);
218         }
219
220         if (lld != NULL && init_sa != 0)
221                 lld->lld_sa_generation = 0;
222
223         de->d_op = &ll_d_ops;
224         return rc;
225 }
226
227 void ll_intent_drop_lock(struct lookup_intent *it)
228 {
229         struct lustre_handle *handle;
230
231         if (it->it_op && it->d.lustre.it_lock_mode) {
232                 handle = (struct lustre_handle *)&it->d.lustre.it_lock_handle;
233                 CDEBUG(D_DLMTRACE, "releasing lock with cookie "LPX64
234                        " from it %p\n", handle->cookie, it);
235                 ldlm_lock_decref(handle, it->d.lustre.it_lock_mode);
236
237                 /* bug 494: intent_release may be called multiple times, from
238                  * this thread and we don't want to double-decref this lock */
239                 it->d.lustre.it_lock_mode = 0;
240         }
241 }
242
243 void ll_intent_release(struct lookup_intent *it)
244 {
245         ENTRY;
246
247         CDEBUG(D_INFO, "intent %p released\n", it);
248         ll_intent_drop_lock(it);
249         /* We are still holding extra reference on a request, need to free it */
250         if (it_disposition(it, DISP_ENQ_OPEN_REF))
251                  ptlrpc_req_finished(it->d.lustre.it_data); /* ll_file_open */
252         if (it_disposition(it, DISP_ENQ_CREATE_REF)) /* create rec */
253                 ptlrpc_req_finished(it->d.lustre.it_data);
254         if (it_disposition(it, DISP_ENQ_COMPLETE)) /* saved req from revalidate
255                                                     * to lookup */
256                 ptlrpc_req_finished(it->d.lustre.it_data);
257
258         it->d.lustre.it_disposition = 0;
259         it->d.lustre.it_data = NULL;
260         EXIT;
261 }
262
263 /* Drop dentry if it is not used already, unhash otherwise.
264    Should be called with dcache lock held!
265    Returns: 1 if dentry was dropped, 0 if unhashed. */
266 int ll_drop_dentry(struct dentry *dentry)
267 {
268         lock_dentry(dentry);
269         if (atomic_read(&dentry->d_count) == 0) {
270                 CDEBUG(D_DENTRY, "deleting dentry %.*s (%p) parent %p "
271                        "inode %p\n", dentry->d_name.len,
272                        dentry->d_name.name, dentry, dentry->d_parent,
273                        dentry->d_inode);
274                 dget_locked(dentry);
275                 __d_drop(dentry);
276                 unlock_dentry(dentry);
277                 spin_unlock(&dcache_lock);
278                 cfs_spin_unlock(&ll_lookup_lock);
279                 dput(dentry);
280                 cfs_spin_lock(&ll_lookup_lock);
281                 spin_lock(&dcache_lock);
282                 return 1;
283         }
284         /* disconected dentry can not be find without lookup, because we
285          * not need his to unhash or mark invalid. */
286         if (dentry->d_flags & DCACHE_DISCONNECTED) {
287                 unlock_dentry(dentry);
288                 RETURN (0);
289         }
290
291         if (!(dentry->d_flags & DCACHE_LUSTRE_INVALID)) {
292                 CDEBUG(D_DENTRY, "unhashing dentry %.*s (%p) parent %p "
293                        "inode %p refc %d\n", dentry->d_name.len,
294                        dentry->d_name.name, dentry, dentry->d_parent,
295                        dentry->d_inode, atomic_read(&dentry->d_count));
296                 /* actually we don't unhash the dentry, rather just
297                  * mark it inaccessible for to __d_lookup(). otherwise
298                  * sys_getcwd() could return -ENOENT -bzzz */
299                 dentry->d_flags |= DCACHE_LUSTRE_INVALID;
300                 if (!dentry->d_inode || !S_ISDIR(dentry->d_inode->i_mode))
301                         __d_drop(dentry);
302         }
303         unlock_dentry(dentry);
304         return 0;
305 }
306
307 void ll_unhash_aliases(struct inode *inode)
308 {
309         struct list_head *tmp, *head;
310         ENTRY;
311
312         if (inode == NULL) {
313                 CERROR("unexpected NULL inode, tell phil\n");
314                 return;
315         }
316
317         CDEBUG(D_INODE, "marking dentries for ino %lu/%u(%p) invalid\n",
318                inode->i_ino, inode->i_generation, inode);
319
320         head = &inode->i_dentry;
321         cfs_spin_lock(&ll_lookup_lock);
322         spin_lock(&dcache_lock);
323 restart:
324         tmp = head;
325         while ((tmp = tmp->next) != head) {
326                 struct dentry *dentry = list_entry(tmp, struct dentry, d_alias);
327
328                 CDEBUG(D_DENTRY, "dentry in drop %.*s (%p) parent %p "
329                        "inode %p flags %d\n", dentry->d_name.len,
330                        dentry->d_name.name, dentry, dentry->d_parent,
331                        dentry->d_inode, dentry->d_flags);
332
333                 if (dentry->d_name.len == 1 && dentry->d_name.name[0] == '/') {
334                         CERROR("called on root (?) dentry=%p, inode=%p "
335                                "ino=%lu\n", dentry, inode, inode->i_ino);
336                         lustre_dump_dentry(dentry, 1);
337                         libcfs_debug_dumpstack(NULL);
338                 }
339
340                 if (ll_drop_dentry(dentry))
341                           goto restart;
342         }
343         spin_unlock(&dcache_lock);
344         cfs_spin_unlock(&ll_lookup_lock);
345
346         EXIT;
347 }
348
349 int ll_revalidate_it_finish(struct ptlrpc_request *request,
350                             struct lookup_intent *it,
351                             struct dentry *de)
352 {
353         int rc = 0;
354         ENTRY;
355
356         if (!request)
357                 RETURN(0);
358
359         if (it_disposition(it, DISP_LOOKUP_NEG))
360                 RETURN(-ENOENT);
361
362         rc = ll_prep_inode(&de->d_inode, request, NULL);
363
364         RETURN(rc);
365 }
366
367 void ll_lookup_finish_locks(struct lookup_intent *it, struct dentry *dentry)
368 {
369         LASSERT(it != NULL);
370         LASSERT(dentry != NULL);
371
372         if (it->d.lustre.it_lock_mode && dentry->d_inode != NULL) {
373                 struct inode *inode = dentry->d_inode;
374                 struct ll_sb_info *sbi = ll_i2sbi(dentry->d_inode);
375
376                 CDEBUG(D_DLMTRACE, "setting l_data to inode %p (%lu/%u)\n",
377                        inode, inode->i_ino, inode->i_generation);
378                 md_set_lock_data(sbi->ll_md_exp, &it->d.lustre.it_lock_handle,
379                                  inode, NULL);
380         }
381
382         /* drop lookup or getattr locks immediately */
383         if (it->it_op == IT_LOOKUP || it->it_op == IT_GETATTR) {
384                 /* on 2.6 there are situation when several lookups and
385                  * revalidations may be requested during single operation.
386                  * therefore, we don't release intent here -bzzz */
387                 ll_intent_drop_lock(it);
388         }
389 }
390
391 void ll_frob_intent(struct lookup_intent **itp, struct lookup_intent *deft)
392 {
393         struct lookup_intent *it = *itp;
394
395         if (!it || it->it_op == IT_GETXATTR)
396                 it = *itp = deft;
397
398 }
399
400 int ll_revalidate_it(struct dentry *de, int lookup_flags,
401                      struct lookup_intent *it)
402 {
403         struct md_op_data *op_data;
404         struct ptlrpc_request *req = NULL;
405         struct lookup_intent lookup_it = { .it_op = IT_LOOKUP };
406         struct obd_export *exp;
407         struct inode *parent = de->d_parent->d_inode;
408         int rc, first = 0;
409
410         ENTRY;
411         CDEBUG(D_VFSTRACE, "VFS Op:name=%s,intent=%s\n", de->d_name.name,
412                LL_IT2STR(it));
413
414         if (de->d_inode == NULL) {
415                 __u64 ibits;
416
417                 /* We can only use negative dentries if this is stat or lookup,
418                    for opens and stuff we do need to query server. */
419                 /* If there is IT_CREAT in intent op set, then we must throw
420                    away this negative dentry and actually do the request to
421                    kernel to create whatever needs to be created (if possible)*/
422                 if (it && (it->it_op & IT_CREAT))
423                         RETURN(0);
424
425                 if (de->d_flags & DCACHE_LUSTRE_INVALID)
426                         RETURN(0);
427
428                 ibits = MDS_INODELOCK_UPDATE;
429                 rc = ll_have_md_lock(parent, &ibits, LCK_MINMODE);
430                 GOTO(out_sa, rc);
431         }
432
433         /* Never execute intents for mount points.
434          * Attributes will be fixed up in ll_inode_revalidate_it */
435         if (d_mountpoint(de))
436                 GOTO(out_sa, rc = 1);
437
438         /* need to get attributes in case root got changed from other client */
439         if (de == de->d_sb->s_root) {
440                 rc = __ll_inode_revalidate_it(de, it, MDS_INODELOCK_LOOKUP);
441                 if (rc == 0)
442                         rc = 1;
443                 GOTO(out_sa, rc);
444         }
445
446         exp = ll_i2mdexp(de->d_inode);
447
448         OBD_FAIL_TIMEOUT(OBD_FAIL_MDC_REVALIDATE_PAUSE, 5);
449         ll_frob_intent(&it, &lookup_it);
450         LASSERT(it);
451
452         if (it->it_op == IT_LOOKUP && !(de->d_flags & DCACHE_LUSTRE_INVALID))
453                 GOTO(out_sa, rc = 1);
454
455         op_data = ll_prep_md_op_data(NULL, parent, de->d_inode,
456                                      de->d_name.name, de->d_name.len,
457                                      0, LUSTRE_OPC_ANY, NULL);
458         if (IS_ERR(op_data))
459                 RETURN(PTR_ERR(op_data));
460
461         if ((it->it_op == IT_OPEN) && de->d_inode) {
462                 struct inode *inode = de->d_inode;
463                 struct ll_inode_info *lli = ll_i2info(inode);
464                 struct obd_client_handle **och_p;
465                 __u64 *och_usecount;
466                 __u64 ibits;
467
468                 /*
469                  * We used to check for MDS_INODELOCK_OPEN here, but in fact
470                  * just having LOOKUP lock is enough to justify inode is the
471                  * same. And if inode is the same and we have suitable
472                  * openhandle, then there is no point in doing another OPEN RPC
473                  * just to throw away newly received openhandle.  There are no
474                  * security implications too, if file owner or access mode is
475                  * change, LOOKUP lock is revoked.
476                  */
477
478
479                 if (it->it_flags & FMODE_WRITE) {
480                         och_p = &lli->lli_mds_write_och;
481                         och_usecount = &lli->lli_open_fd_write_count;
482                 } else if (it->it_flags & FMODE_EXEC) {
483                         och_p = &lli->lli_mds_exec_och;
484                         och_usecount = &lli->lli_open_fd_exec_count;
485                 } else {
486                         och_p = &lli->lli_mds_read_och;
487                         och_usecount = &lli->lli_open_fd_read_count;
488                 }
489                 /* Check for the proper lock. */
490                 ibits = MDS_INODELOCK_LOOKUP;
491                 if (!ll_have_md_lock(inode, &ibits, LCK_MINMODE))
492                         goto do_lock;
493                 cfs_down(&lli->lli_och_sem);
494                 if (*och_p) { /* Everything is open already, do nothing */
495                         /*(*och_usecount)++;  Do not let them steal our open
496                           handle from under us */
497                         /* XXX The code above was my original idea, but in case
498                            we have the handle, but we cannot use it due to later
499                            checks (e.g. O_CREAT|O_EXCL flags set), nobody
500                            would decrement counter increased here. So we just
501                            hope the lock won't be invalidated in between. But
502                            if it would be, we'll reopen the open request to
503                            MDS later during file open path */
504                         cfs_up(&lli->lli_och_sem);
505                         ll_finish_md_op_data(op_data);
506                         RETURN(1);
507                 } else {
508                         cfs_up(&lli->lli_och_sem);
509                 }
510         }
511
512         if (it->it_op == IT_GETATTR)
513                 first = ll_statahead_enter(parent, &de, 0);
514
515 do_lock:
516         it->it_create_mode &= ~cfs_curproc_umask();
517         it->it_create_mode |= M_CHECK_STALE;
518         rc = md_intent_lock(exp, op_data, NULL, 0, it,
519                             lookup_flags,
520                             &req, ll_md_blocking_ast, 0);
521         it->it_create_mode &= ~M_CHECK_STALE;
522         ll_finish_md_op_data(op_data);
523         if (it->it_op == IT_GETATTR && !first)
524                 /* If there are too many locks on client-side, then some
525                  * locks taken by statahead maybe dropped automatically
526                  * before the real "revalidate" using them. */
527                 ll_statahead_exit(parent, de, req == NULL ? rc : 0);
528         else if (first == -EEXIST)
529                 ll_statahead_mark(parent, de);
530
531         /* If req is NULL, then md_intent_lock only tried to do a lock match;
532          * if all was well, it will return 1 if it found locks, 0 otherwise. */
533         if (req == NULL && rc >= 0) {
534                 if (!rc)
535                         goto do_lookup;
536                 GOTO(out, rc);
537         }
538
539         if (rc < 0) {
540                 if (rc != -ESTALE) {
541                         CDEBUG(D_INFO, "ll_intent_lock: rc %d : it->it_status "
542                                "%d\n", rc, it->d.lustre.it_status);
543                 }
544                 GOTO(out, rc = 0);
545         }
546
547 revalidate_finish:
548         rc = ll_revalidate_it_finish(req, it, de);
549         if (rc != 0) {
550                 if (rc != -ESTALE && rc != -ENOENT)
551                         ll_intent_release(it);
552                 GOTO(out, rc = 0);
553         }
554
555         if ((it->it_op & IT_OPEN) && de->d_inode &&
556             !S_ISREG(de->d_inode->i_mode) &&
557             !S_ISDIR(de->d_inode->i_mode)) {
558                 ll_release_openhandle(de, it);
559         }
560         rc = 1;
561
562         /* unfortunately ll_intent_lock may cause a callback and revoke our
563          * dentry */
564         cfs_spin_lock(&ll_lookup_lock);
565         spin_lock(&dcache_lock);
566         lock_dentry(de);
567         __d_drop(de);
568         unlock_dentry(de);
569         d_rehash_cond(de, 0);
570         spin_unlock(&dcache_lock);
571         cfs_spin_unlock(&ll_lookup_lock);
572
573 out:
574         /* We do not free request as it may be reused during following lookup
575          * (see comment in mdc/mdc_locks.c::mdc_intent_lock()), request will
576          * be freed in ll_lookup_it or in ll_intent_release. But if
577          * request was not completed, we need to free it. (bug 5154, 9903) */
578         if (req != NULL && !it_disposition(it, DISP_ENQ_COMPLETE))
579                 ptlrpc_req_finished(req);
580         if (rc == 0) {
581                 ll_unhash_aliases(de->d_inode);
582                 /* done in ll_unhash_aliases()
583                    dentry->d_flags |= DCACHE_LUSTRE_INVALID; */
584         } else {
585                 CDEBUG(D_DENTRY, "revalidated dentry %.*s (%p) parent %p "
586                        "inode %p refc %d\n", de->d_name.len,
587                        de->d_name.name, de, de->d_parent, de->d_inode,
588                        atomic_read(&de->d_count));
589                 if (de->d_flags & DCACHE_LUSTRE_INVALID) {
590                         lock_dentry(de);
591                         de->d_flags &= ~DCACHE_LUSTRE_INVALID;
592                         unlock_dentry(de);
593                 }
594                 ll_lookup_finish_locks(it, de);
595         }
596         RETURN(rc);
597
598         /*
599          * This part is here to combat evil-evil race in real_lookup on 2.6
600          * kernels.  The race details are: We enter do_lookup() looking for some
601          * name, there is nothing in dcache for this name yet and d_lookup()
602          * returns NULL.  We proceed to real_lookup(), and while we do this,
603          * another process does open on the same file we looking up (most simple
604          * reproducer), open succeeds and the dentry is added. Now back to
605          * us. In real_lookup() we do d_lookup() again and suddenly find the
606          * dentry, so we call d_revalidate on it, but there is no lock, so
607          * without this code we would return 0, but unpatched real_lookup just
608          * returns -ENOENT in such a case instead of retrying the lookup. Once
609          * this is dealt with in real_lookup(), all of this ugly mess can go and
610          * we can just check locks in ->d_revalidate without doing any RPCs
611          * ever.
612          */
613 do_lookup:
614         if (it != &lookup_it) {
615                 /* MDS_INODELOCK_UPDATE needed for IT_GETATTR case. */
616                 if (it->it_op == IT_GETATTR)
617                         lookup_it.it_op = IT_GETATTR;
618                 ll_lookup_finish_locks(it, de);
619                 it = &lookup_it;
620         }
621
622         /* Do real lookup here. */
623         op_data = ll_prep_md_op_data(NULL, parent, NULL, de->d_name.name,
624                                      de->d_name.len, 0, (it->it_op & IT_CREAT ?
625                                                          LUSTRE_OPC_CREATE :
626                                                          LUSTRE_OPC_ANY), NULL);
627         if (IS_ERR(op_data))
628                 RETURN(PTR_ERR(op_data));
629
630         rc = md_intent_lock(exp, op_data, NULL, 0,  it, 0, &req,
631                             ll_md_blocking_ast, 0);
632         if (rc >= 0) {
633                 struct mdt_body *mdt_body;
634                 struct lu_fid fid = {.f_seq = 0, .f_oid = 0, .f_ver = 0};
635                 mdt_body = req_capsule_server_get(&req->rq_pill, &RMF_MDT_BODY);
636
637                 if (de->d_inode)
638                         fid = *ll_inode2fid(de->d_inode);
639
640                 /* see if we got same inode, if not - return error */
641                 if (lu_fid_eq(&fid, &mdt_body->fid1)) {
642                         ll_finish_md_op_data(op_data);
643                         op_data = NULL;
644                         goto revalidate_finish;
645                 }
646                 ll_intent_release(it);
647         }
648         ll_finish_md_op_data(op_data);
649         GOTO(out, rc = 0);
650
651 out_sa:
652         /*
653          * For rc == 1 case, should not return directly to prevent losing
654          * statahead windows; for rc == 0 case, the "lookup" will be done later.
655          */
656         if (it && it->it_op == IT_GETATTR && rc == 1) {
657                 first = ll_statahead_enter(parent, &de, 0);
658                 if (first >= 0)
659                         ll_statahead_exit(parent, de, 1);
660                 else if (first == -EEXIST)
661                         ll_statahead_mark(parent, de);
662         }
663
664         return rc;
665 }
666
667 int ll_revalidate_nd(struct dentry *dentry, struct nameidata *nd)
668 {
669         int rc;
670         ENTRY;
671
672         if (nd && !(nd->flags & (LOOKUP_CONTINUE|LOOKUP_PARENT))) {
673                 struct lookup_intent *it;
674
675                 it = ll_convert_intent(&nd->intent.open, nd->flags);
676                 if (IS_ERR(it))
677                         RETURN(0);
678
679                 if (it->it_op == (IT_OPEN|IT_CREAT) &&
680                     nd->intent.open.flags & O_EXCL) {
681                         CDEBUG(D_VFSTRACE, "create O_EXCL, returning 0\n");
682                         rc = 0;
683                         goto out_it;
684                 }
685
686                 rc = ll_revalidate_it(dentry, nd->flags, it);
687
688                 if (rc && (nd->flags & LOOKUP_OPEN) &&
689                     it_disposition(it, DISP_OPEN_OPEN)) {/*Open*/
690 #ifdef HAVE_FILE_IN_STRUCT_INTENT
691 // XXX Code duplication with ll_lookup_nd
692                         if (S_ISFIFO(dentry->d_inode->i_mode)) {
693                                 // We cannot call open here as it would
694                                 // deadlock.
695                                 ptlrpc_req_finished(
696                                                (struct ptlrpc_request *)
697                                                   it->d.lustre.it_data);
698                         } else {
699 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17))
700 /* 2.6.1[456] have a bug in open_namei() that forgets to check
701  * nd->intent.open.file for error, so we need to return it as lookup's result
702  * instead */
703                                 struct file *filp;
704
705                                 nd->intent.open.file->private_data = it;
706                                 filp = lookup_instantiate_filp(nd, dentry,NULL);
707                                 if (IS_ERR(filp)) {
708                                         rc = PTR_ERR(filp);
709                                 }
710 #else
711                                 nd->intent.open.file->private_data = it;
712                                 (void)lookup_instantiate_filp(nd, dentry,NULL);
713 #endif
714                         }
715 #else
716                         ll_release_openhandle(dentry, it);
717 #endif /* HAVE_FILE_IN_STRUCT_INTENT */
718                 }
719                 if (!rc && (nd->flags & LOOKUP_CREATE) &&
720                     it_disposition(it, DISP_OPEN_CREATE)) {
721                         /* We created something but we may only return
722                          * negative dentry here, so save request in dentry,
723                          * if lookup will be called later on, it will
724                          * pick the request, otherwise it would be freed
725                          * with dentry */
726                         ll_d2d(dentry)->lld_it = it;
727                         it = NULL; /* avoid freeing */
728                 }
729
730 out_it:
731                 if (it) {
732                         ll_intent_release(it);
733                         OBD_FREE(it, sizeof(*it));
734                 }
735         } else {
736                 rc = ll_revalidate_it(dentry, 0, NULL);
737         }
738
739         RETURN(rc);
740 }
741
742 void ll_d_iput(struct dentry *de, struct inode *inode)
743 {
744         LASSERT(inode);
745         if (!find_cbdata(inode))
746                 inode->i_nlink = 0;
747         iput(inode);
748 }
749
750 struct dentry_operations ll_d_ops = {
751         .d_revalidate = ll_revalidate_nd,
752         .d_release = ll_release,
753         .d_delete  = ll_ddelete,
754         .d_iput    = ll_d_iput,
755         .d_compare = ll_dcompare,
756 };