Whamcloud - gitweb
- removed not used stuff (@lld and gns_mount_finished completion). Last is because
[fs/lustre-release.git] / lustre / llite / namei.c
1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2  * vim:expandtab:shiftwidth=8:tabstop=8:
3  *
4  *  Copyright (c) 2002, 2003 Cluster File Systems, Inc.
5  *
6  *   This file is part of Lustre, http://www.lustre.org.
7  *
8  *   Lustre is free software; you can redistribute it and/or
9  *   modify it under the terms of version 2 of the GNU General Public
10  *   License as published by the Free Software Foundation.
11  *
12  *   Lustre is distributed in the hope that it will be useful,
13  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  *   GNU General Public License for more details.
16  *
17  *   You should have received a copy of the GNU General Public License
18  *   along with Lustre; if not, write to the Free Software
19  *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  *
21  *  derived in small part from linux/fs/ext2/namei.c
22  *
23  *  Copyright (C) 1991, 1992  Linus Torvalds
24  *
25  *  Big-endian to little-endian byte-swapping/bitmaps by
26  *        David S. Miller (davem@caip.rutgers.edu), 1995
27  *  Directory entry file type support and forward compatibility hooks
28  *      for B-tree directories by Theodore Ts'o (tytso@mit.edu), 1998
29  */
30
31 #include <linux/fs.h>
32 #include <linux/sched.h>
33 #include <linux/mm.h>
34 #include <linux/smp_lock.h>
35 #include <linux/quotaops.h>
36 #include <linux/highmem.h>
37 #include <linux/pagemap.h>
38
39 #define DEBUG_SUBSYSTEM S_LLITE
40
41 #include <linux/obd_support.h>
42 #include <linux/lustre_lite.h>
43 #include <linux/lustre_dlm.h>
44 #include <linux/lustre_version.h>
45 #include "llite_internal.h"
46
47 /* methods */
48
49 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
50 static int ll_test_inode(struct inode *inode, unsigned long ino, void *opaque)
51 #else
52 static int ll_test_inode(struct inode *inode, void *opaque)
53 #endif
54 {
55         static int last_ino, last_gen, last_count;
56         struct lustre_md *md = opaque;
57
58         if (!(md->body->valid & (OBD_MD_FLGENER | OBD_MD_FLID))) {
59                 CERROR("MDS body missing inum or generation\n");
60                 return 0;
61         }
62
63         if (last_ino == id_ino(&md->body->id1) &&
64             last_gen == id_gen(&md->body->id1) &&
65             last_count < 500) {
66                 last_count++;
67         } else {
68                 if (last_count > 1)
69                         CDEBUG(D_VFSTRACE, "compared %u/%u %u times\n",
70                                last_ino, last_gen, last_count);
71                 last_count = 0;
72                 last_ino = id_ino(&md->body->id1);
73                 last_gen = id_gen(&md->body->id1);
74                 CDEBUG(D_VFSTRACE,
75                        "comparing inode %p ino "DLID4" to body "DLID4"\n",
76                        inode, OLID4(&ll_i2info(inode)->lli_id),
77                        OLID4(&md->body->id1));
78         }
79
80 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
81         if (inode->i_ino != id_ino(&md->body->id1))
82                 return 0;
83 #endif
84         if (inode->i_generation != id_gen(&md->body->id1))
85                 return 0;
86
87         if (id_group(&ll_i2info(inode)->lli_id) != id_group(&md->body->id1))
88                 return 0;
89         
90         /* apply the attributes in 'opaque' to this inode. */
91         ll_update_inode(inode, md);
92         return 1;
93 }
94
95 extern struct dentry_operations ll_d_ops;
96
97 int ll_unlock(__u32 mode, struct lustre_handle *lockh)
98 {
99         ENTRY;
100
101         ldlm_lock_decref(lockh, mode);
102
103         RETURN(0);
104 }
105
106 /*
107  * get an inode by inode number (already instantiated by the intent lookup).
108  * Returns inode or NULL.
109  */
110 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
111 int ll_set_inode(struct inode *inode, void *opaque)
112 {
113         ll_read_inode2(inode, opaque);
114         return 0;
115 }
116
117 struct inode *ll_iget(struct super_block *sb, ino_t hash,
118                       struct lustre_md *md)
119 {
120         struct inode *inode;
121
122         LASSERT(hash != 0);
123         inode = iget5_locked(sb, hash, ll_test_inode, ll_set_inode, md);
124
125         if (inode) {
126                 if (inode->i_state & I_NEW)
127                         unlock_new_inode(inode);
128                 CDEBUG(D_VFSTRACE, "inode: %lu/%u(%p)\n", inode->i_ino,
129                        inode->i_generation, inode);
130         }
131
132         return inode;
133 }
134 #else
135 struct inode *ll_iget(struct super_block *sb, ino_t hash,
136                       struct lustre_md *md)
137 {
138         struct inode *inode;
139         LASSERT(hash != 0);
140         inode = iget4(sb, hash, ll_test_inode, md);
141         if (inode)
142                 CDEBUG(D_VFSTRACE, "inode: %lu/%u(%p)\n", inode->i_ino,
143                        inode->i_generation, inode);
144         return inode;
145 }
146 #endif
147
148 int ll_mdc_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
149                         void *data, int flag)
150 {
151         int rc;
152         struct lustre_handle lockh;
153         ENTRY;
154
155         switch (flag) {
156         case LDLM_CB_BLOCKING:
157                 ldlm_lock2handle(lock, &lockh);
158                 rc = ldlm_cli_cancel(&lockh);
159                 if (rc < 0) {
160                         CDEBUG(D_INODE, "ldlm_cli_cancel: %d\n", rc);
161                         RETURN(rc);
162                 }
163                 break;
164         case LDLM_CB_CANCELING: {
165                 struct inode *inode = ll_inode_from_lock(lock);
166                 struct ll_inode_info *li = ll_i2info(inode);
167                 __u64 bits = lock->l_policy_data.l_inodebits.bits;
168
169                 /* For lookup locks: Invalidate all dentries associated with
170                    this inode, for UPDATE locks - invalidate directory pages */
171                 if (inode == NULL)
172                         break;
173
174                 if (bits & MDS_INODELOCK_UPDATE)
175                         clear_bit(LLI_F_HAVE_MDS_SIZE_LOCK,
176                                   &(ll_i2info(inode)->lli_flags));
177
178
179                 if (lock->l_resource->lr_name.name[0] != id_fid(&li->lli_id) ||
180                     lock->l_resource->lr_name.name[1] != id_group(&li->lli_id)) {
181                         LDLM_ERROR(lock, "data mismatch with object %lu/%lu",
182                                    (unsigned long)id_fid(&li->lli_id),
183                                    (unsigned long)id_group(&li->lli_id));
184                 }
185
186                 if (bits & MDS_INODELOCK_OPEN) {
187                         int flags = 0;
188                         switch (lock->l_req_mode) {
189                         case LCK_CW:
190                                 flags = FMODE_WRITE;
191                                 break;
192                         case LCK_PR:
193                                 flags = FMODE_EXEC;
194                                 break;
195                         case LCK_CR:
196                                 flags = FMODE_READ;
197                                 break;
198                         default:
199                                 CERROR("Unexpected lock mode for OPEN lock "
200                                        "%d, inode %ld\n", lock->l_req_mode,
201                                        inode->i_ino);
202                         }
203                         ll_md_real_close(ll_i2mdexp(inode), inode, flags);
204                 }
205
206                 if (bits & MDS_INODELOCK_UPDATE)
207                         clear_bit(LLI_F_HAVE_MDS_SIZE_LOCK,
208                                   &(ll_i2info(inode)->lli_flags));
209
210
211                 /* If lookup lock is cancelled, we just drop the dentry and
212                    this will cause us to reget data from MDS when we'd want to
213                    access this dentry/inode again. If this is lock on
214                    other parts of inode that is cancelled, we do not need to do
215                    much (but need to discard data from readdir, if any), since
216                    abscence of lock will cause ll_revalidate_it (called from
217                    stat() and similar functions) to renew the data anyway */
218                 if (S_ISDIR(inode->i_mode) &&
219                     (bits & MDS_INODELOCK_UPDATE)) {
220                         CDEBUG(D_INODE, "invalidating inode %lu/%u(%p)\n",
221                                inode->i_ino, inode->i_generation, inode);
222                         truncate_inode_pages(inode->i_mapping, 0);
223                 }
224
225                 if (inode->i_sb->s_root &&
226                     inode != inode->i_sb->s_root->d_inode &&
227                     (bits & MDS_INODELOCK_LOOKUP))
228                         ll_unhash_aliases(inode);
229                 iput(inode);
230                 break;
231         }
232         default:
233                 LBUG();
234         }
235
236         RETURN(0);
237 }
238
239 int ll_mdc_cancel_unused(struct lustre_handle *conn, struct inode *inode,
240                          int flags, void *opaque)
241 {
242         struct ll_inode_info *li = ll_i2info(inode);
243         struct ldlm_res_id res_id =
244                 { .name = {id_fid(&li->lli_id), id_group(&li->lli_id)} };
245         struct obd_device *obddev = class_conn2obd(conn);
246         ENTRY;
247         
248         RETURN(ldlm_cli_cancel_unused(obddev->obd_namespace, &res_id, flags,
249                                       opaque));
250 }
251
252 /* Search "inode"'s alias list for a dentry that has the same name and parent as
253  * de.  If found, return it.  If not found, return de. */
254 struct dentry *ll_find_alias(struct inode *inode, struct dentry *de)
255 {
256         struct list_head *tmp;
257
258         spin_lock(&dcache_lock);
259         list_for_each(tmp, &inode->i_dentry) {
260                 struct dentry *dentry = list_entry(tmp, struct dentry, d_alias);
261
262                 /* We are called here with 'de' already on the aliases list. */
263                 if (dentry == de) {
264                         CERROR("whoops\n");
265                         continue;
266                 }
267
268                 if (dentry->d_parent != de->d_parent)
269                         continue;
270
271                 if (dentry->d_name.len != de->d_name.len)
272                         continue;
273
274                 if (memcmp(dentry->d_name.name, de->d_name.name,
275                            de->d_name.len) != 0)
276                         continue;
277
278                 if (!list_empty(&dentry->d_lru))
279                         list_del_init(&dentry->d_lru);
280
281                 hlist_del_init(&dentry->d_hash);
282                 __d_rehash(dentry); /* avoid taking dcache_lock inside */
283                 spin_unlock(&dcache_lock);
284                 atomic_inc(&dentry->d_count);
285                 iput(inode);
286                 dentry->d_flags &= ~DCACHE_LUSTRE_INVALID;
287                 CDEBUG(D_DENTRY, "alias dentry %*s (%p) parent %p inode %p "
288                        "refc %d\n", de->d_name.len, de->d_name.name, de,
289                        de->d_parent, de->d_inode, atomic_read(&de->d_count));
290                 return dentry;
291         }
292
293         spin_unlock(&dcache_lock);
294
295         return de;
296 }
297
298 static int lookup_it_finish(struct ptlrpc_request *request, int offset,
299                             struct lookup_intent *it, void *data)
300 {
301         struct it_cb_data *icbd = data;
302         struct dentry **de = icbd->icbd_childp;
303         struct inode *parent = icbd->icbd_parent;
304         struct ll_sb_info *sbi = ll_i2sbi(parent);
305         struct dentry *dentry = *de, *saved = *de;
306         struct inode *inode = NULL;
307         int rc;
308
309         /* NB 1 request reference will be taken away by ll_intent_lock()
310          * when I return */
311         if (!it_disposition(it, DISP_LOOKUP_NEG)) {
312                 ENTRY;
313
314                 rc = ll_prep_inode(sbi->ll_dt_exp, sbi->ll_md_exp,
315                                    &inode, request, offset, dentry->d_sb);
316                 if (rc)
317                         RETURN(rc);
318
319                 CDEBUG(D_DLMTRACE, "setting l_data to inode %p (%lu/%u)\n",
320                        inode, inode->i_ino, inode->i_generation);
321                 
322                 mdc_set_lock_data(NULL, &LUSTRE_IT(it)->it_lock_handle, inode);
323                 
324                 /* If this is a stat, get the authoritative file size */
325                 if (it->it_op == IT_GETATTR && S_ISREG(inode->i_mode) &&
326                     ll_i2info(inode)->lli_smd != NULL) {
327                         struct lov_stripe_md *lsm = ll_i2info(inode)->lli_smd;
328                         ldlm_error_t rc;
329
330                         LASSERT(lsm->lsm_object_id != 0);
331
332                         /* bug 2334: drop MDS lock before acquiring OST lock */
333                         ll_intent_drop_lock(it);
334
335                         rc = ll_glimpse_size(inode);
336                         if (rc) {
337                                 iput(inode);
338                                 RETURN(rc);
339                         }
340                 }
341
342                 dentry = *de = ll_find_alias(inode, dentry);
343         } else {
344                 ENTRY;
345         }
346
347         dentry->d_op = &ll_d_ops;
348         ll_set_dd(dentry);
349
350         if (dentry == saved)
351                 d_add(dentry, inode);
352
353         RETURN(0);
354 }
355
356 static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
357                                    struct nameidata *nd, int flags)
358 {
359         struct dentry *save = dentry, *retval;
360         struct lookup_intent *it = flags ? &nd->intent.open : NULL;
361         struct lustre_id pid;
362         struct it_cb_data icbd;
363         struct ptlrpc_request *req = NULL;
364         struct lookup_intent lookup_it = { .it_op = IT_LOOKUP };
365         int rc, orig_it;
366         ENTRY;
367
368         if (dentry->d_name.len > EXT3_NAME_LEN)
369                 RETURN(ERR_PTR(-ENAMETOOLONG));
370
371         CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p),intent=%s\n",
372                dentry->d_name.len, dentry->d_name.name, parent->i_ino,
373                parent->i_generation, parent, LL_IT2STR(it));
374
375         if (d_mountpoint(dentry))
376                 CERROR("Tell Peter, lookup on mtpt, it %s\n", LL_IT2STR(it));
377
378         if (nd != NULL)
379                 nd->mnt->mnt_last_used = jiffies;
380
381         orig_it = it ? it->it_op : IT_OPEN;
382         ll_frob_intent(&it, &lookup_it);
383
384         icbd.icbd_childp = &dentry;
385         icbd.icbd_parent = parent;
386         ll_inode2id(&pid, parent);
387
388         rc = md_intent_lock(ll_i2mdexp(parent), &pid,
389                             dentry->d_name.name, dentry->d_name.len, NULL, 0,
390                             NULL, it, flags, &req, ll_mdc_blocking_ast);
391         if (rc < 0)
392                 GOTO(out, retval = ERR_PTR(rc));
393
394         rc = lookup_it_finish(req, 1, it, &icbd);
395         if (rc != 0) {
396                 ll_intent_release(it);
397                 GOTO(out, retval = ERR_PTR(rc));
398         }
399
400         ll_lookup_finish_locks(it, dentry);
401
402         if (nd &&
403             dentry->d_inode != NULL && dentry->d_inode->i_mode & S_ISUID &&
404             S_ISDIR(dentry->d_inode->i_mode) &&
405             ((flags & LOOKUP_CONTINUE) || (orig_it & (IT_CHDIR | IT_OPEN))))
406         {
407                 rc = ll_gns_mount_object(dentry, nd->mnt);
408                 if (rc == -EAGAIN) {
409                         /* 
410                          * making system to restart syscall as currently GNS is
411                          * in mounting progress.
412                          */
413                         GOTO(out, retval = ERR_PTR(-ERESTARTSYS));
414                 }
415
416                 if (rc) {
417                         /* 
418                          * just reporting about GNS failures, lookup() is
419                          * successful, do not stop it.
420                          *
421                          * GNS failure may be that found object is found in SUID
422                          * bit marked dir but it is not regular file and we
423                          * should lookup further until we find correct mount
424                          * object. This will allow to perform GNS mount is the
425                          * following case for instance:
426                          *
427                          * /mnt/lustre/gns_mount/.mntinfo/.mntinfo/..../.mntinfo
428                          * where all ".mntinfo" are dirs and only last one is
429                          * reg file.
430                          */
431                         CDEBUG(D_INODE, "failed to mount %*s, err %d\n",
432                                (int)dentry->d_name.len, dentry->d_name.name);
433                 }
434         }
435         
436         if (dentry == save)
437                 GOTO(out, retval = NULL);
438         else
439                 GOTO(out, retval = dentry);
440  out:
441         if (req)
442                 ptlrpc_req_finished(req);
443         if (it == &lookup_it)
444                 ll_intent_release(it);
445         if (dentry->d_inode)
446                 CDEBUG(D_INODE, "lookup 0x%p in %lu/%lu: %*s -> %lu/%lu\n",
447                        dentry,
448                        (unsigned long) parent->i_ino,
449                        (unsigned long) parent->i_generation,
450                        dentry->d_name.len, dentry->d_name.name,
451                        (unsigned long) dentry->d_inode->i_ino,
452                        (unsigned long) dentry->d_inode->i_generation);
453         else
454                 CDEBUG(D_INODE, "lookup 0x%p in %lu/%lu: %*s -> ??\n",
455                        dentry,
456                        (unsigned long) parent->i_ino,
457                        (unsigned long) parent->i_generation,
458                        dentry->d_name.len, dentry->d_name.name);
459         return retval;
460 }
461
462 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
463 static struct dentry *ll_lookup_nd(struct inode *parent, struct dentry *dentry,
464                                    struct nameidata *nd)
465 {
466         struct dentry *de;
467         ENTRY;
468
469         if (nd && nd->flags & LOOKUP_LAST && !(nd->flags & LOOKUP_LINK_NOTLAST))
470                 de = ll_lookup_it(parent, dentry, nd, nd->flags);
471         else
472                 de = ll_lookup_it(parent, dentry, nd, 0);
473
474         RETURN(de);
475 }
476 #endif
477
478 /* We depend on "mode" being set with the proper file type/umask by now */
479 static struct inode *ll_create_node(struct inode *dir, const char *name,
480                                     int namelen, const void *data, int datalen,
481                                     int mode, __u64 extra,
482                                     struct lookup_intent *it)
483 {
484         struct inode *inode = NULL;
485         struct ptlrpc_request *request = NULL;
486         struct ll_sb_info *sbi = ll_i2sbi(dir);
487         int rc;
488         ENTRY;
489
490
491         LASSERT(it && LUSTRE_IT(it)->it_disposition);
492   
493         request = LUSTRE_IT(it)->it_data;
494         rc = ll_prep_inode(sbi->ll_dt_exp, sbi->ll_md_exp,
495                            &inode, request, 1, dir->i_sb);
496         if (rc)
497                 GOTO(out, inode = ERR_PTR(rc));
498
499         LASSERT(list_empty(&inode->i_dentry));
500
501         /* We asked for a lock on the directory, but were granted a
502          * lock on the inode.  Since we finally have an inode pointer,
503          * stuff it in the lock. */
504         CDEBUG(D_DLMTRACE, "setting l_ast_data to inode %p (%lu/%u)\n",
505                inode, inode->i_ino, inode->i_generation);
506         mdc_set_lock_data(NULL, &LUSTRE_IT(it)->it_lock_handle, inode);
507         EXIT;
508  out:
509         ptlrpc_req_finished(request);
510         return inode;
511 }
512
513 /*
514  * By the time this is called, we already have created the directory cache
515  * entry for the new file, but it is so far negative - it has no inode.
516  *
517  * We defer creating the OBD object(s) until open, to keep the intent and
518  * non-intent code paths similar, and also because we do not have the MDS
519  * inode number before calling ll_create_node() (which is needed for LOV),
520  * so we would need to do yet another RPC to the MDS to store the LOV EA
521  * data on the MDS.  If needed, we would pass the PACKED lmm as data and
522  * lmm_size in datalen (the MDS still has code which will handle that).
523  *
524  * If the create succeeds, we fill in the inode information
525  * with d_instantiate().
526  */
527 static int ll_create_it(struct inode *dir, struct dentry *dentry, int mode,
528                         struct lookup_intent *it)
529 {
530         struct inode *inode;
531         struct ptlrpc_request *request = LUSTRE_IT(it)->it_data;
532         struct obd_export *md_exp = ll_i2mdexp(dir); 
533         int rc = 0;
534         ENTRY;
535
536         CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p),intent=%s\n",
537                dentry->d_name.len, dentry->d_name.name, dir->i_ino,
538                dir->i_generation, dir, LL_IT2STR(it));
539
540         rc = it_open_error(DISP_OPEN_CREATE, it);
541         if (rc)
542                 RETURN(rc);
543
544         mdc_store_inode_generation(md_exp, request, MDS_REQ_INTENT_REC_OFF, 1);
545         inode = ll_create_node(dir, dentry->d_name.name, dentry->d_name.len,
546                                NULL, 0, mode, 0, it);
547         if (IS_ERR(inode))
548                 RETURN(PTR_ERR(inode));
549
550         d_instantiate(dentry, inode);
551         RETURN(0);
552 }
553
554 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
555 static int ll_create_nd(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *nd)
556 {
557         return ll_create_it(dir, dentry, mode, &nd->intent.open);
558 }
559 #endif
560
561 static void ll_update_times(struct ptlrpc_request *request, int offset,
562                             struct inode *inode)
563 {
564         struct mds_body *body = lustre_msg_buf(request->rq_repmsg, offset,
565                                                sizeof(*body));
566         LASSERT(body);
567
568         if (body->valid & OBD_MD_FLMTIME &&
569             body->mtime > LTIME_S(inode->i_mtime)) {
570                 CDEBUG(D_INODE, "setting ino %lu mtime from %lu to %u\n",
571                        inode->i_ino, LTIME_S(inode->i_mtime), body->mtime);
572                 LTIME_S(inode->i_mtime) = body->mtime;
573         }
574         if (body->valid & OBD_MD_FLCTIME &&
575             body->ctime > LTIME_S(inode->i_ctime))
576                 LTIME_S(inode->i_ctime) = body->ctime;
577 }
578
579 static int ll_mknod_raw(struct nameidata *nd, int mode, dev_t rdev)
580 {
581         struct ptlrpc_request *request = NULL;
582         struct inode *dir = nd->dentry->d_inode;
583         struct ll_sb_info *sbi = ll_i2sbi(dir);
584         struct mdc_op_data *op_data;
585         int err = -EMLINK;
586         ENTRY;
587
588         CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
589                nd->last.len, nd->last.name, dir->i_ino, dir->i_generation, dir);
590
591         mode &= ~current->fs->umask;
592
593         switch (mode & S_IFMT) {
594         case 0:
595         case S_IFREG:
596                 mode |= S_IFREG; /* for mode = 0 case, fallthrough */
597         case S_IFCHR:
598         case S_IFBLK:
599         case S_IFIFO:
600         case S_IFSOCK:
601                 OBD_ALLOC(op_data, sizeof(*op_data));
602                 if (op_data == NULL)
603                         RETURN(-ENOMEM);
604                 ll_prepare_mdc_data(op_data, dir, NULL, nd->last.name, 
605                                     nd->last.len, 0);
606                 err = md_create(sbi->ll_md_exp, op_data, NULL, 0, mode,
607                                 current->fsuid, current->fsgid, rdev,
608                                 &request);
609                 OBD_FREE(op_data, sizeof(*op_data));
610                 if (err == 0)
611                         ll_update_times(request, 0, dir);
612                 ptlrpc_req_finished(request);
613                 break;
614         case S_IFDIR:
615                 err = -EPERM;
616                 break;
617         default:
618                 err = -EINVAL;
619         }
620         RETURN(err);
621 }
622
623 static int ll_mknod(struct inode *dir, struct dentry *dchild,
624                     int mode, ll_dev_t rdev)
625 {
626         struct ptlrpc_request *request = NULL;
627         struct inode *inode = NULL;
628         struct ll_sb_info *sbi = ll_i2sbi(dir);
629         struct mdc_op_data *op_data;
630         int err = -EMLINK;
631         ENTRY;
632
633         CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
634                dchild->d_name.len, dchild->d_name.name,
635                dir->i_ino, dir->i_generation, dir);
636
637         mode &= ~current->fs->umask;
638
639         switch (mode & S_IFMT) {
640         case 0:
641         case S_IFREG:
642                 mode |= S_IFREG; /* for mode = 0 case, fallthrough */
643         case S_IFCHR:
644         case S_IFBLK:
645         case S_IFIFO:
646         case S_IFSOCK:
647                 OBD_ALLOC(op_data, sizeof(*op_data));
648                 if (op_data == NULL)
649                         RETURN(-ENOMEM);
650                 ll_prepare_mdc_data(op_data, dir, NULL, dchild->d_name.name, 
651                                     dchild->d_name.len, 0);
652                 err = md_create(sbi->ll_md_exp, op_data, NULL, 0, mode,
653                                 current->fsuid, current->fsgid, rdev,
654                                 &request);
655                 OBD_FREE(op_data, sizeof(*op_data));
656                 if (err)
657                         GOTO(out_err, err);
658
659                 ll_update_times(request, 0, dir);
660                 err = ll_prep_inode(sbi->ll_dt_exp, sbi->ll_md_exp,
661                                     &inode, request, 0, dchild->d_sb);
662                 if (err)
663                         GOTO(out_err, err);
664                 break;
665         case S_IFDIR:
666                 RETURN(-EPERM);
667                 break;
668         default:
669                 RETURN(-EINVAL);
670         }
671
672         d_instantiate(dchild, inode);
673         EXIT;
674  out_err:
675         ptlrpc_req_finished(request);
676         return err;
677 }
678
679 static int ll_symlink_raw(struct nameidata *nd, const char *tgt)
680 {
681         struct inode *dir = nd->dentry->d_inode;
682         struct ptlrpc_request *request = NULL;
683         struct ll_sb_info *sbi = ll_i2sbi(dir);
684         const char *name = nd->last.name;
685         struct mdc_op_data *op_data;
686         int len = nd->last.len;
687         int err = -EMLINK;
688         ENTRY;
689
690         CDEBUG(D_VFSTRACE, "VFS Op:name=%*s,dir=%lu/%u(%p),target=%s\n",
691                nd->last.len, nd->last.name, dir->i_ino, dir->i_generation,
692                dir, tgt);
693
694         if (dir->i_nlink >= EXT3_LINK_MAX)
695                 RETURN(err);
696
697         OBD_ALLOC(op_data, sizeof(*op_data));
698         if (op_data == NULL)
699                 RETURN(-ENOMEM);
700         ll_prepare_mdc_data(op_data, dir, NULL, name, len, 0);
701         LASSERT(tgt);
702         err = md_create(sbi->ll_md_exp, op_data,
703                         tgt, strlen(tgt) + 1, S_IFLNK | S_IRWXUGO,
704                         current->fsuid, current->fsgid, 0, &request);
705         OBD_FREE(op_data, sizeof(*op_data));
706         if (err == 0)
707                 ll_update_times(request, 0, dir);
708         
709         ptlrpc_req_finished(request);
710         RETURN(err);
711 }
712
713 static int ll_link_raw(struct nameidata *srcnd, struct nameidata *tgtnd)
714 {
715         struct inode *src = srcnd->dentry->d_inode;
716         struct inode *dir = tgtnd->dentry->d_inode;
717         struct ptlrpc_request *request = NULL;
718         struct mdc_op_data *op_data;
719         int err;
720         struct ll_sb_info *sbi = ll_i2sbi(dir);
721         ENTRY;
722
723         CDEBUG(D_VFSTRACE,
724                "VFS Op: inode=%lu/%u(%p), dir=%lu/%u(%p), target=%.*s\n",
725                src->i_ino, src->i_generation, src, dir->i_ino,
726                dir->i_generation, dir, tgtnd->last.len, tgtnd->last.name);
727
728         OBD_ALLOC(op_data, sizeof(*op_data));
729         if (op_data == NULL)
730                 RETURN(-ENOMEM);
731         ll_prepare_mdc_data(op_data, src, dir, tgtnd->last.name, 
732                             tgtnd->last.len, 0);
733         err = md_link(sbi->ll_md_exp, op_data, &request);
734         OBD_FREE(op_data, sizeof(*op_data));
735         if (err == 0)
736                 ll_update_times(request, 0, dir);
737         ptlrpc_req_finished(request);
738         RETURN(err);
739 }
740
741
742 static int ll_mkdir_raw(struct nameidata *nd, int mode)
743 {
744         struct inode *dir = nd->dentry->d_inode;
745         struct ptlrpc_request *request = NULL;
746         struct ll_sb_info *sbi = ll_i2sbi(dir);
747         struct mdc_op_data *op_data;
748         int err = -EMLINK;
749         ENTRY;
750         CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
751                nd->last.len, nd->last.name, dir->i_ino, dir->i_generation, dir);
752
753         mode = (mode & (S_IRWXUGO|S_ISVTX) & ~current->fs->umask) | S_IFDIR;
754         OBD_ALLOC(op_data, sizeof(*op_data));
755         if (op_data == NULL)
756                 RETURN(-ENOMEM);
757         ll_prepare_mdc_data(op_data, dir, NULL, nd->last.name, 
758                             nd->last.len, 0);
759         err = md_create(sbi->ll_md_exp, op_data, NULL, 0, mode,
760                         current->fsuid, current->fsgid, 0, &request);
761         OBD_FREE(op_data, sizeof(*op_data));
762         if (err == 0)
763                 ll_update_times(request, 0, dir);
764         ptlrpc_req_finished(request);
765         RETURN(err);
766 }
767
768 static int ll_rmdir_raw(struct nameidata *nd)
769 {
770         struct inode *dir = nd->dentry->d_inode;
771         struct ptlrpc_request *request = NULL;
772         struct mdc_op_data *op_data;
773         int rc;
774
775         ENTRY;
776         CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
777                nd->last.len, nd->last.name, dir->i_ino, dir->i_generation, dir);
778
779         OBD_ALLOC(op_data, sizeof(*op_data));
780         if (op_data == NULL)
781                 RETURN(-ENOMEM);
782         ll_prepare_mdc_data(op_data, dir, NULL, nd->last.name, 
783                             nd->last.len, S_IFDIR);
784         rc = md_unlink(ll_i2sbi(dir)->ll_md_exp, op_data, &request);
785         OBD_FREE(op_data, sizeof(*op_data));
786         if (rc == 0)
787                 ll_update_times(request, 0, dir);
788         ptlrpc_req_finished(request);
789         RETURN(rc);
790 }
791
792 int ll_objects_destroy(struct ptlrpc_request *request,
793                        struct inode *dir, int offset)
794 {
795         struct mds_body *body;
796         struct lov_mds_md *eadata;
797         struct lov_stripe_md *lsm = NULL;
798         struct obd_trans_info oti = { 0 };
799         struct obdo *oa;
800         int rc;
801         ENTRY;
802
803         /* req is swabbed so this is safe */
804         body = lustre_msg_buf(request->rq_repmsg, 0, sizeof(*body));
805
806         if (!(body->valid & OBD_MD_FLEASIZE))
807                 RETURN(0);
808
809         if (body->eadatasize == 0) {
810                 CERROR("OBD_MD_FLEASIZE set but eadatasize zero\n");
811                 GOTO(out, rc = -EPROTO);
812         }
813
814         /*
815          * the MDS sent back the EA because we unlinked the last reference to
816          * this file. Use this EA to unlink the objects on the OST. It's opaque
817          * so we don't swab here; we leave it to obd_unpackmd() to check it is
818          * complete and sensible.
819          */
820         eadata = lustre_swab_repbuf(request, 1, body->eadatasize, NULL);
821         LASSERT(eadata != NULL);
822         if (eadata == NULL) {
823                 CERROR("Can't unpack MDS EA data\n");
824                 GOTO(out, rc = -EPROTO);
825         }
826
827         rc = obd_unpackmd(ll_i2dtexp(dir), &lsm, eadata, body->eadatasize);
828         if (rc < 0) {
829                 CERROR("obd_unpackmd: %d\n", rc);
830                 GOTO(out, rc);
831         }
832         LASSERT(rc >= sizeof(*lsm));
833
834         oa = obdo_alloc();
835         if (oa == NULL)
836                 GOTO(out_free_memmd, rc = -ENOMEM);
837
838         oa->o_id = lsm->lsm_object_id;
839         oa->o_gr = lsm->lsm_object_gr;
840         oa->o_mode = body->mode & S_IFMT;
841         oa->o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLGROUP;
842
843         if (body->valid & OBD_MD_FLCOOKIE) {
844                 int length = sizeof(struct llog_cookie) *
845                                 lsm->lsm_stripe_count;
846                 oa->o_valid |= OBD_MD_FLCOOKIE;
847                 oti.oti_logcookies =
848                         lustre_msg_buf(request->rq_repmsg, 2, length);
849                 if (oti.oti_logcookies == NULL) {
850                         oa->o_valid &= ~OBD_MD_FLCOOKIE;
851                         body->valid &= ~OBD_MD_FLCOOKIE;
852                 } else {
853                         /* copy llog cookies to request to replay unlink
854                          * so that the same llog file and records as those created
855                          * during fail can be re-created while doing replay 
856                          */
857                         if (offset >= 0)
858                                 memcpy(lustre_msg_buf(request->rq_reqmsg, offset, 0),
859                                        oti.oti_logcookies, length);
860                 }
861         }
862
863         rc = obd_destroy(ll_i2dtexp(dir), oa, lsm, &oti);
864         obdo_free(oa);
865         if (rc)
866                 CERROR("obd destroy objid "LPX64" error %d\n",
867                        lsm->lsm_object_id, rc);
868         EXIT;
869  out_free_memmd:
870         obd_free_memmd(ll_i2dtexp(dir), &lsm);
871  out:
872         return rc;
873 }
874
875 static int ll_unlink_raw(struct nameidata *nd)
876 {
877         struct inode *dir = nd->dentry->d_inode;
878         struct ptlrpc_request *request = NULL;
879         struct mdc_op_data *op_data;
880         int rc;
881         ENTRY;
882         CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
883                nd->last.len, nd->last.name, dir->i_ino, dir->i_generation, dir);
884
885         OBD_ALLOC(op_data, sizeof(*op_data));
886         if (op_data == NULL)
887                 RETURN(-ENOMEM);
888         ll_prepare_mdc_data(op_data, dir, NULL, nd->last.name, nd->last.len, 0);
889         rc = md_unlink(ll_i2sbi(dir)->ll_md_exp, op_data, &request);
890         OBD_FREE(op_data, sizeof(*op_data));
891         if (rc)
892                 GOTO(out, rc);
893         ll_update_times(request, 0, dir);
894         
895         rc = ll_objects_destroy(request, dir, 2);
896         EXIT;
897 out:
898         ptlrpc_req_finished(request);
899         return rc;
900 }
901
902 static int ll_rename_raw(struct nameidata *srcnd, struct nameidata *tgtnd)
903 {
904         struct inode *src = srcnd->dentry->d_inode;
905         struct inode *tgt = tgtnd->dentry->d_inode;
906         struct ptlrpc_request *request = NULL;
907         struct ll_sb_info *sbi = ll_i2sbi(src);
908         struct mdc_op_data *op_data;
909         int err;
910         ENTRY;
911         
912         CDEBUG(D_VFSTRACE,"VFS Op:oldname=%.*s,src_dir=%lu/%u(%p),newname=%.*s,"
913                "tgt_dir=%lu/%u(%p)\n", srcnd->last.len, srcnd->last.name,
914                src->i_ino, src->i_generation, src, tgtnd->last.len,
915                tgtnd->last.name, tgt->i_ino, tgt->i_generation, tgt);
916
917         OBD_ALLOC(op_data, sizeof(*op_data));
918         if (op_data == NULL)
919                 RETURN(-ENOMEM);
920         ll_prepare_mdc_data(op_data, src, tgt, NULL, 0, 0);
921         err = md_rename(sbi->ll_md_exp, op_data, srcnd->last.name, 
922                         srcnd->last.len, tgtnd->last.name, tgtnd->last.len, 
923                         &request);
924         OBD_FREE(op_data, sizeof(*op_data));
925         if (!err) {
926                 ll_update_times(request, 0, src);
927                 ll_update_times(request, 0, tgt);
928                 err = ll_objects_destroy(request, src, 3);
929         }
930
931         ptlrpc_req_finished(request);
932         RETURN(err);
933 }
934
935 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
936 #define LLITE_IT_RAWOPS (IT_MKNOD|IT_MKDIR|IT_SYMLINK|IT_LINK|IT_UNLINK|IT_RMDIR|IT_RENAME)
937 static int ll_rawop_from_intent(struct nameidata *nd)
938 {
939         int error = 0;
940
941         if (!nd || !(nd->intent.open.op & LLITE_IT_RAWOPS))
942                 return 0;
943
944         switch (nd->intent.open.op) {
945         case IT_MKNOD:
946                 error = ll_mknod_raw(nd, nd->intent.open.create_mode,
947                                      nd->intent.open.create.dev);
948                 break;
949         case IT_MKDIR:
950                 error = ll_mkdir_raw(nd, nd->intent.open.create_mode);
951                 break;
952         case IT_RMDIR:
953                 error = ll_rmdir_raw(nd);
954                 break;
955         case IT_UNLINK:
956                 error = ll_unlink_raw(nd);
957                 break;
958         case IT_SYMLINK:
959                 LASSERT(nd->intent.open.create.link);
960                 error = ll_symlink_raw(nd, nd->intent.open.create.link);
961                 break;
962         case IT_LINK:
963                 error = ll_link_raw(nd->intent.open.create.source_nd, nd);
964                 break;
965         case IT_RENAME:
966                 LASSERT(nd->intent.open.create.source_nd);
967                 error = ll_rename_raw(nd->intent.open.create.source_nd, nd);
968                 break;
969         default:
970                 LBUG();
971         }
972         if (error != -EOPNOTSUPP)
973                 nd->intent.open.flags |= IT_STATUS_RAW;
974
975         return error;
976 }
977 #endif
978
979 struct inode_operations ll_dir_inode_operations = {
980         .mknod              = ll_mknod,
981         .setattr            = ll_setattr,
982 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
983         .create_it          = ll_create_it,
984         .lookup_it          = ll_lookup_it,
985         .revalidate_it      = ll_inode_revalidate_it,
986 #else
987         .lookup             = ll_lookup_nd,
988         .create             = ll_create_nd,
989         .getattr            = ll_getattr,
990         .endparentlookup    = ll_rawop_from_intent,
991 #endif
992         .setxattr           = ll_setxattr,
993         .getxattr           = ll_getxattr,
994         .listxattr          = ll_listxattr,
995         .removexattr        = ll_removexattr,
996         .permission         = ll_inode_permission,
997 };