1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Copyright (c) 2002, 2003 Cluster File Systems, Inc.
6 * This file is part of Lustre, http://www.lustre.org.
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.
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.
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.
21 * derived in small part from linux/fs/ext2/namei.c
23 * Copyright (C) 1991, 1992 Linus Torvalds
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
32 #include <linux/sched.h>
34 #include <linux/smp_lock.h>
35 #include <linux/quotaops.h>
36 #include <linux/highmem.h>
37 #include <linux/pagemap.h>
39 #define DEBUG_SUBSYSTEM S_LLITE
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"
49 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
50 static int ll_test_inode(struct inode *inode, unsigned long ino, void *opaque)
52 static int ll_test_inode(struct inode *inode, void *opaque)
55 static int last_ino, last_gen, last_count;
56 struct lustre_md *md = opaque;
58 if (!(md->body->valid & (OBD_MD_FLGENER | OBD_MD_FLID))) {
59 CERROR("MDS body missing inum or generation\n");
63 if (last_ino == id_ino(&md->body->id1) &&
64 last_gen == id_gen(&md->body->id1) &&
69 CDEBUG(D_VFSTRACE, "compared %u/%u %u times\n",
70 last_ino, last_gen, last_count);
72 last_ino = id_ino(&md->body->id1);
73 last_gen = id_gen(&md->body->id1);
75 "comparing inode %p ino "DLID4" to body "DLID4"\n",
76 inode, OLID4(&ll_i2info(inode)->lli_id),
77 OLID4(&md->body->id1));
80 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
81 if (inode->i_ino != id_ino(&md->body->id1))
84 if (inode->i_generation != id_gen(&md->body->id1))
87 if (id_group(&ll_i2info(inode)->lli_id) != id_group(&md->body->id1))
90 /* apply the attributes in 'opaque' to this inode. */
91 ll_update_inode(inode, md);
95 extern struct dentry_operations ll_d_ops;
97 int ll_unlock(__u32 mode, struct lustre_handle *lockh)
101 ldlm_lock_decref(lockh, mode);
107 * get an inode by inode number (already instantiated by the intent lookup).
108 * Returns inode or NULL.
110 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
111 int ll_set_inode(struct inode *inode, void *opaque)
113 ll_read_inode2(inode, opaque);
117 struct inode *ll_iget(struct super_block *sb, ino_t hash,
118 struct lustre_md *md)
123 inode = iget5_locked(sb, hash, ll_test_inode, ll_set_inode, md);
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);
135 struct inode *ll_iget(struct super_block *sb, ino_t hash,
136 struct lustre_md *md)
140 inode = iget4(sb, hash, ll_test_inode, md);
142 CDEBUG(D_VFSTRACE, "inode: %lu/%u(%p)\n", inode->i_ino,
143 inode->i_generation, inode);
148 int ll_mdc_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
149 void *data, int flag)
152 struct lustre_handle lockh;
156 case LDLM_CB_BLOCKING:
157 ldlm_lock2handle(lock, &lockh);
158 rc = ldlm_cli_cancel(&lockh);
160 CDEBUG(D_INODE, "ldlm_cli_cancel: %d\n", rc);
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;
169 /* For lookup locks: Invalidate all dentries associated with
170 this inode, for UPDATE locks - invalidate directory pages */
174 if (lock->l_resource->lr_name.name[0] != id_fid(&li->lli_id) ||
175 lock->l_resource->lr_name.name[1] != id_group(&li->lli_id)) {
176 LDLM_ERROR(lock, "data mismatch with object %lu/%lu",
177 (unsigned long)id_fid(&li->lli_id),
178 (unsigned long)id_group(&li->lli_id));
181 if (bits & MDS_INODELOCK_OPEN) {
183 switch (lock->l_req_mode) {
194 CERROR("Unexpected lock mode for OPEN lock "
195 "%d, inode %ld\n", lock->l_req_mode,
198 ll_md_real_close(ll_i2mdexp(inode), inode, flags);
201 if (bits & MDS_INODELOCK_UPDATE)
202 clear_bit(LLI_F_HAVE_MDS_SIZE_LOCK,
203 &(ll_i2info(inode)->lli_flags));
206 /* If lookup lock is cancelled, we just drop the dentry and
207 this will cause us to reget data from MDS when we'd want to
208 access this dentry/inode again. If this is lock on
209 other parts of inode that is cancelled, we do not need to do
210 much (but need to discard data from readdir, if any), since
211 abscence of lock will cause ll_revalidate_it (called from
212 stat() and similar functions) to renew the data anyway */
213 if (S_ISDIR(inode->i_mode) &&
214 (bits & MDS_INODELOCK_UPDATE)) {
215 CDEBUG(D_INODE, "invalidating inode %lu/%u(%p)\n",
216 inode->i_ino, inode->i_generation, inode);
217 truncate_inode_pages(inode->i_mapping, 0);
220 if (inode->i_sb->s_root &&
221 inode != inode->i_sb->s_root->d_inode &&
222 (bits & MDS_INODELOCK_LOOKUP))
223 ll_unhash_aliases(inode);
234 /* Search "inode"'s alias list for a dentry that has the same name and parent as
235 * de. If found, return it. If not found, return de. */
236 struct dentry *ll_find_alias(struct inode *inode, struct dentry *de)
238 struct list_head *tmp;
240 spin_lock(&dcache_lock);
241 list_for_each(tmp, &inode->i_dentry) {
242 struct dentry *dentry = list_entry(tmp, struct dentry, d_alias);
244 /* We are called here with 'de' already on the aliases list. */
250 if (dentry->d_parent != de->d_parent)
253 if (dentry->d_name.len != de->d_name.len)
256 if (memcmp(dentry->d_name.name, de->d_name.name,
257 de->d_name.len) != 0)
260 if (!list_empty(&dentry->d_lru))
261 list_del_init(&dentry->d_lru);
263 hlist_del_init(&dentry->d_hash);
264 __d_rehash(dentry); /* avoid taking dcache_lock inside */
265 spin_unlock(&dcache_lock);
266 atomic_inc(&dentry->d_count);
268 dentry->d_flags &= ~DCACHE_LUSTRE_INVALID;
269 CDEBUG(D_DENTRY, "alias dentry %*s (%p) parent %p inode %p "
270 "refc %d\n", de->d_name.len, de->d_name.name, de,
271 de->d_parent, de->d_inode, atomic_read(&de->d_count));
275 spin_unlock(&dcache_lock);
280 static int lookup_it_finish(struct ptlrpc_request *request, int offset,
281 struct lookup_intent *it, void *data)
283 struct it_cb_data *icbd = data;
284 struct dentry **de = icbd->icbd_childp;
285 struct inode *parent = icbd->icbd_parent;
286 struct ll_sb_info *sbi = ll_i2sbi(parent);
287 struct dentry *dentry = *de, *saved = *de;
288 struct inode *inode = NULL;
291 /* NB 1 request reference will be taken away by ll_intent_lock()
293 if (!it_disposition(it, DISP_LOOKUP_NEG)) {
296 rc = ll_prep_inode(sbi->ll_dt_exp, sbi->ll_md_exp,
297 &inode, request, offset, dentry->d_sb);
301 CDEBUG(D_DLMTRACE, "setting l_data to inode %p (%lu/%u)\n",
302 inode, inode->i_ino, inode->i_generation);
304 mdc_set_lock_data(NULL, &LUSTRE_IT(it)->it_lock_handle, inode);
306 /* If this is a stat, get the authoritative file size */
307 if (it->it_op == IT_GETATTR && S_ISREG(inode->i_mode) &&
308 ll_i2info(inode)->lli_smd != NULL) {
309 struct lov_stripe_md *lsm = ll_i2info(inode)->lli_smd;
312 LASSERT(lsm->lsm_object_id != 0);
314 /* bug 2334: drop MDS lock before acquiring OST lock */
315 ll_intent_drop_lock(it);
317 rc = ll_glimpse_size(inode);
324 dentry = *de = ll_find_alias(inode, dentry);
329 dentry->d_op = &ll_d_ops;
333 d_add(dentry, inode);
338 static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
339 struct nameidata *nd, int flags)
341 struct lookup_intent *it = flags ? &nd->intent.open : NULL;
342 struct lookup_intent lookup_it = { .it_op = IT_LOOKUP };
343 struct dentry *save = dentry, *retval;
344 struct ptlrpc_request *req = NULL;
345 int rc, gns_it, gns_flags;
346 struct it_cb_data icbd;
347 struct lustre_id pid;
350 if (dentry->d_name.len > EXT3_NAME_LEN)
351 RETURN(ERR_PTR(-ENAMETOOLONG));
353 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p),intent=%s\n",
354 dentry->d_name.len, dentry->d_name.name, parent->i_ino,
355 parent->i_generation, parent, LL_IT2STR(it));
357 if (d_mountpoint(dentry))
358 CERROR("Tell Peter, lookup on mtpt, it %s\n", LL_IT2STR(it));
361 nd->mnt->mnt_last_used = jiffies;
363 gns_it = nd ? nd->intent.open.it_op : IT_OPEN;
364 gns_flags = nd ? nd->flags : LOOKUP_CONTINUE;
365 ll_frob_intent(&it, &lookup_it);
367 icbd.icbd_childp = &dentry;
368 icbd.icbd_parent = parent;
369 ll_inode2id(&pid, parent);
371 rc = md_intent_lock(ll_i2mdexp(parent), &pid, (char *)dentry->d_name.name,
372 dentry->d_name.len, NULL, 0, NULL, it, flags, &req,
373 ll_mdc_blocking_ast);
375 GOTO(out, retval = ERR_PTR(rc));
377 rc = lookup_it_finish(req, 1, it, &icbd);
379 ll_intent_release(it);
380 GOTO(out, retval = ERR_PTR(rc));
383 ll_lookup_finish_locks(it, dentry);
385 if (nd && dentry->d_inode != NULL &&
386 dentry->d_inode->i_mode & S_ISUID && S_ISDIR(dentry->d_inode->i_mode) &&
387 ((gns_flags & LOOKUP_CONTINUE) || (gns_it & (IT_CHDIR | IT_OPEN))))
389 CDEBUG(D_DENTRY, "possible GNS dentry %*s %p found, "
390 "mounting it\n", (int)dentry->d_name.len,
391 dentry->d_name.name, dentry);
393 rc = ll_gns_mount_object(dentry, nd->mnt);
396 * just reporting about GNS failures, lookup() is
397 * successful, do not stop it.
399 * GNS failure may be that object is found in SUID bit
400 * marked dir but it is not regular file and we should
401 * lookup further until we find correct mount
402 * object. This will allow to perform GNS mount is the
403 * following case for instance:
405 * /mnt/lustre/gns_mount/.mntinfo/.mntinfo/..../.mntinfo
406 * where all ".mntinfo" are dirs and only last one is
409 CDEBUG(D_DENTRY, "failed to mount %*s, err %d\n",
410 (int)dentry->d_name.len, dentry->d_name.name, rc);
415 GOTO(out, retval = NULL);
417 GOTO(out, retval = dentry);
420 ptlrpc_req_finished(req);
421 if (it == &lookup_it)
422 ll_intent_release(it);
424 CDEBUG(D_INODE, "lookup 0x%p in %lu/%lu: %*s -> %lu/%lu\n",
426 (unsigned long) parent->i_ino,
427 (unsigned long) parent->i_generation,
428 dentry->d_name.len, dentry->d_name.name,
429 (unsigned long) dentry->d_inode->i_ino,
430 (unsigned long) dentry->d_inode->i_generation);
432 CDEBUG(D_INODE, "lookup 0x%p in %lu/%lu: %*s -> ??\n",
434 (unsigned long) parent->i_ino,
435 (unsigned long) parent->i_generation,
436 dentry->d_name.len, dentry->d_name.name);
440 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
441 static struct dentry *ll_lookup_nd(struct inode *parent, struct dentry *dentry,
442 struct nameidata *nd)
447 if (nd && nd->flags & LOOKUP_LAST && !(nd->flags & LOOKUP_LINK_NOTLAST))
448 de = ll_lookup_it(parent, dentry, nd, nd->flags);
450 de = ll_lookup_it(parent, dentry, nd, 0);
456 /* We depend on "mode" being set with the proper file type/umask by now */
457 static struct inode *ll_create_node(struct inode *dir, const char *name,
458 int namelen, const void *data, int datalen,
459 int mode, __u64 extra,
460 struct lookup_intent *it)
462 struct inode *inode = NULL;
463 struct ptlrpc_request *request = NULL;
464 struct ll_sb_info *sbi = ll_i2sbi(dir);
469 LASSERT(it && LUSTRE_IT(it)->it_disposition);
471 request = LUSTRE_IT(it)->it_data;
472 rc = ll_prep_inode(sbi->ll_dt_exp, sbi->ll_md_exp,
473 &inode, request, 1, dir->i_sb);
475 GOTO(out, inode = ERR_PTR(rc));
477 LASSERT(list_empty(&inode->i_dentry));
479 /* We asked for a lock on the directory, but were granted a
480 * lock on the inode. Since we finally have an inode pointer,
481 * stuff it in the lock. */
482 CDEBUG(D_DLMTRACE, "setting l_ast_data to inode %p (%lu/%u)\n",
483 inode, inode->i_ino, inode->i_generation);
484 mdc_set_lock_data(NULL, &LUSTRE_IT(it)->it_lock_handle, inode);
487 ptlrpc_req_finished(request);
492 * By the time this is called, we already have created the directory cache
493 * entry for the new file, but it is so far negative - it has no inode.
495 * We defer creating the OBD object(s) until open, to keep the intent and
496 * non-intent code paths similar, and also because we do not have the MDS
497 * inode number before calling ll_create_node() (which is needed for LOV),
498 * so we would need to do yet another RPC to the MDS to store the LOV EA
499 * data on the MDS. If needed, we would pass the PACKED lmm as data and
500 * lmm_size in datalen (the MDS still has code which will handle that).
502 * If the create succeeds, we fill in the inode information
503 * with d_instantiate().
505 static int ll_create_it(struct inode *dir, struct dentry *dentry, int mode,
506 struct lookup_intent *it)
509 struct ptlrpc_request *request = LUSTRE_IT(it)->it_data;
510 struct obd_export *md_exp = ll_i2mdexp(dir);
514 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p),intent=%s\n",
515 dentry->d_name.len, dentry->d_name.name, dir->i_ino,
516 dir->i_generation, dir, LL_IT2STR(it));
518 rc = it_open_error(DISP_OPEN_CREATE, it);
522 mdc_store_inode_generation(md_exp, request, MDS_REQ_INTENT_REC_OFF, 1);
523 inode = ll_create_node(dir, (char *)dentry->d_name.name,
524 dentry->d_name.len, NULL, 0, mode, 0, it);
526 RETURN(PTR_ERR(inode));
528 d_instantiate(dentry, inode);
532 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
533 static int ll_create_nd(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *nd)
535 return ll_create_it(dir, dentry, mode, &nd->intent.open);
539 static void ll_update_times(struct ptlrpc_request *request, int offset,
542 struct mds_body *body = lustre_msg_buf(request->rq_repmsg, offset,
546 if (body->valid & OBD_MD_FLMTIME &&
547 body->mtime > LTIME_S(inode->i_mtime)) {
548 CDEBUG(D_INODE, "setting ino %lu mtime from %lu to %u\n",
549 inode->i_ino, LTIME_S(inode->i_mtime), body->mtime);
550 LTIME_S(inode->i_mtime) = body->mtime;
552 if (body->valid & OBD_MD_FLCTIME &&
553 body->ctime > LTIME_S(inode->i_ctime))
554 LTIME_S(inode->i_ctime) = body->ctime;
557 static int ll_mknod_raw(struct nameidata *nd, int mode, dev_t rdev)
559 struct ptlrpc_request *request = NULL;
560 struct inode *dir = nd->dentry->d_inode;
561 struct ll_sb_info *sbi = ll_i2sbi(dir);
562 struct mdc_op_data *op_data;
566 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
567 nd->last.len, nd->last.name, dir->i_ino,
568 dir->i_generation, dir);
570 mode &= ~current->fs->umask;
572 switch (mode & S_IFMT) {
575 mode |= S_IFREG; /* for mode = 0 case, fallthrough */
580 OBD_ALLOC(op_data, sizeof(*op_data));
583 ll_prepare_mdc_data(op_data, dir, NULL,
584 (char *)nd->last.name,
587 err = md_create(sbi->ll_md_exp, op_data, NULL, 0, mode,
588 current->fsuid, current->fsgid, rdev,
590 OBD_FREE(op_data, sizeof(*op_data));
592 ll_update_times(request, 0, dir);
593 ptlrpc_req_finished(request);
604 static int ll_mknod(struct inode *dir, struct dentry *dchild,
605 int mode, ll_dev_t rdev)
607 struct ptlrpc_request *request = NULL;
608 struct inode *inode = NULL;
609 struct ll_sb_info *sbi = ll_i2sbi(dir);
610 struct mdc_op_data *op_data;
614 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
615 dchild->d_name.len, dchild->d_name.name,
616 dir->i_ino, dir->i_generation, dir);
618 mode &= ~current->fs->umask;
620 switch (mode & S_IFMT) {
623 mode |= S_IFREG; /* for mode = 0 case, fallthrough */
628 OBD_ALLOC(op_data, sizeof(*op_data));
632 ll_prepare_mdc_data(op_data, dir, NULL,
633 (char *)dchild->d_name.name,
634 dchild->d_name.len, 0);
636 err = md_create(sbi->ll_md_exp, op_data, NULL, 0, mode,
637 current->fsuid, current->fsgid, rdev,
639 OBD_FREE(op_data, sizeof(*op_data));
643 ll_update_times(request, 0, dir);
644 err = ll_prep_inode(sbi->ll_dt_exp, sbi->ll_md_exp,
645 &inode, request, 0, dchild->d_sb);
656 d_instantiate(dchild, inode);
659 ptlrpc_req_finished(request);
663 static int ll_symlink_raw(struct nameidata *nd, const char *tgt)
665 const char *name = (char *)nd->last.name;
666 struct inode *dir = nd->dentry->d_inode;
667 struct ptlrpc_request *request = NULL;
668 struct ll_sb_info *sbi = ll_i2sbi(dir);
669 struct mdc_op_data *op_data;
670 int len = nd->last.len;
674 CDEBUG(D_VFSTRACE, "VFS Op:name=%*s,dir=%lu/%u(%p),target=%s\n",
675 nd->last.len, nd->last.name, dir->i_ino, dir->i_generation,
678 if (dir->i_nlink >= EXT3_LINK_MAX)
681 OBD_ALLOC(op_data, sizeof(*op_data));
684 ll_prepare_mdc_data(op_data, dir, NULL, name, len, 0);
686 err = md_create(sbi->ll_md_exp, op_data,
687 tgt, strlen(tgt) + 1, S_IFLNK | S_IRWXUGO,
688 current->fsuid, current->fsgid, 0, &request);
689 OBD_FREE(op_data, sizeof(*op_data));
691 ll_update_times(request, 0, dir);
693 ptlrpc_req_finished(request);
697 static int ll_link_raw(struct nameidata *srcnd, struct nameidata *tgtnd)
699 struct inode *src = srcnd->dentry->d_inode;
700 struct inode *dir = tgtnd->dentry->d_inode;
701 struct ptlrpc_request *request = NULL;
702 struct ll_sb_info *sbi = ll_i2sbi(dir);
703 struct mdc_op_data *op_data;
708 "VFS Op: inode=%lu/%u(%p), dir=%lu/%u(%p), target=%.*s\n",
709 src->i_ino, src->i_generation, src, dir->i_ino,
710 dir->i_generation, dir, tgtnd->last.len, tgtnd->last.name);
712 OBD_ALLOC(op_data, sizeof(*op_data));
716 ll_prepare_mdc_data(op_data, src, dir,
717 (char *)tgtnd->last.name,
720 err = md_link(sbi->ll_md_exp, op_data, &request);
721 OBD_FREE(op_data, sizeof(*op_data));
723 ll_update_times(request, 0, dir);
724 ptlrpc_req_finished(request);
729 static int ll_mkdir_raw(struct nameidata *nd, int mode)
731 struct inode *dir = nd->dentry->d_inode;
732 struct ptlrpc_request *request = NULL;
733 struct ll_sb_info *sbi = ll_i2sbi(dir);
734 struct mdc_op_data *op_data;
737 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
738 nd->last.len, nd->last.name, dir->i_ino, dir->i_generation, dir);
740 mode = (mode & (S_IRWXUGO|S_ISVTX) & ~current->fs->umask) | S_IFDIR;
741 OBD_ALLOC(op_data, sizeof(*op_data));
745 ll_prepare_mdc_data(op_data, dir, NULL,
746 (char *)nd->last.name,
749 err = md_create(sbi->ll_md_exp, op_data, NULL, 0, mode,
750 current->fsuid, current->fsgid, 0, &request);
751 OBD_FREE(op_data, sizeof(*op_data));
753 ll_update_times(request, 0, dir);
754 ptlrpc_req_finished(request);
758 static int ll_rmdir_raw(struct nameidata *nd)
760 struct inode *dir = nd->dentry->d_inode;
761 struct ptlrpc_request *request = NULL;
762 struct mdc_op_data *op_data;
766 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
767 nd->last.len, nd->last.name, dir->i_ino,
768 dir->i_generation, dir);
770 OBD_ALLOC(op_data, sizeof(*op_data));
774 ll_prepare_mdc_data(op_data, dir, NULL,
775 (char *)nd->last.name,
776 nd->last.len, S_IFDIR);
778 rc = md_unlink(ll_i2sbi(dir)->ll_md_exp, op_data, &request);
779 OBD_FREE(op_data, sizeof(*op_data));
781 ll_update_times(request, 0, dir);
782 ptlrpc_req_finished(request);
786 static int ll_unlink_raw(struct nameidata *nd)
788 struct inode *dir = nd->dentry->d_inode;
789 struct ptlrpc_request *request = NULL;
790 struct mdc_op_data *op_data;
793 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
794 nd->last.len, nd->last.name, dir->i_ino,
795 dir->i_generation, dir);
797 OBD_ALLOC(op_data, sizeof(*op_data));
800 ll_prepare_mdc_data(op_data, dir, NULL,
801 (char *)nd->last.name, nd->last.len, 0);
802 rc = md_unlink(ll_i2sbi(dir)->ll_md_exp, op_data, &request);
803 OBD_FREE(op_data, sizeof(*op_data));
806 ll_update_times(request, 0, dir);
809 ptlrpc_req_finished(request);
813 static int ll_rename_raw(struct nameidata *srcnd, struct nameidata *tgtnd)
815 struct inode *src = srcnd->dentry->d_inode;
816 struct inode *tgt = tgtnd->dentry->d_inode;
817 struct ptlrpc_request *request = NULL;
818 struct ll_sb_info *sbi = ll_i2sbi(src);
819 struct mdc_op_data *op_data;
823 if (srcnd->mnt != tgtnd->mnt)
826 CDEBUG(D_VFSTRACE,"VFS Op:oldname=%.*s,src_dir=%lu/%u(%p),newname=%.*s,"
827 "tgt_dir=%lu/%u(%p)\n", srcnd->last.len, srcnd->last.name,
828 src->i_ino, src->i_generation, src, tgtnd->last.len,
829 tgtnd->last.name, tgt->i_ino, tgt->i_generation, tgt);
831 OBD_ALLOC(op_data, sizeof(*op_data));
834 ll_prepare_mdc_data(op_data, src, tgt, NULL, 0, 0);
835 err = md_rename(sbi->ll_md_exp, op_data, (char *)srcnd->last.name,
836 srcnd->last.len, (char *)tgtnd->last.name,
837 tgtnd->last.len, &request);
838 OBD_FREE(op_data, sizeof(*op_data));
840 ll_update_times(request, 0, src);
841 ll_update_times(request, 0, tgt);
844 ptlrpc_req_finished(request);
848 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
849 #define LLITE_IT_RAWOPS (IT_MKNOD|IT_MKDIR|IT_SYMLINK|IT_LINK|IT_UNLINK|IT_RMDIR|IT_RENAME)
850 static int ll_rawop_from_intent(struct nameidata *nd)
854 if (!nd || !(nd->intent.open.op & LLITE_IT_RAWOPS))
857 switch (nd->intent.open.op) {
859 error = ll_mknod_raw(nd, nd->intent.open.create_mode,
860 nd->intent.open.create.dev);
863 error = ll_mkdir_raw(nd, nd->intent.open.create_mode);
866 error = ll_rmdir_raw(nd);
869 error = ll_unlink_raw(nd);
872 LASSERT(nd->intent.open.create.link);
873 error = ll_symlink_raw(nd, nd->intent.open.create.link);
876 error = ll_link_raw(nd->intent.open.create.source_nd, nd);
879 LASSERT(nd->intent.open.create.source_nd);
880 error = ll_rename_raw(nd->intent.open.create.source_nd, nd);
885 if (error != -EOPNOTSUPP)
886 nd->intent.open.flags |= IT_STATUS_RAW;
892 struct inode_operations ll_dir_inode_operations = {
894 .setattr = ll_setattr,
895 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
896 .create_it = ll_create_it,
897 .lookup_it = ll_lookup_it,
898 .revalidate_it = ll_inode_revalidate_it,
900 .lookup = ll_lookup_nd,
901 .create = ll_create_nd,
902 .getattr = ll_getattr,
903 .endparentlookup = ll_rawop_from_intent,
905 .setxattr = ll_setxattr,
906 .getxattr = ll_getxattr,
907 .listxattr = ll_listxattr,
908 .removexattr = ll_removexattr,
909 .permission = ll_inode_permission,