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) && LLI_HAVE_FLSIZE(inode)) {
202 CDEBUG(D_OTHER, "isize for %lu/%u(%p) from mds "
203 "is not actual\n", inode->i_ino,
204 inode->i_generation, inode);
205 clear_bit(LLI_F_HAVE_MDS_SIZE_LOCK,
206 &(ll_i2info(inode)->lli_flags));
210 /* If lookup lock is cancelled, we just drop the dentry and
211 this will cause us to reget data from MDS when we'd want to
212 access this dentry/inode again. If this is lock on
213 other parts of inode that is cancelled, we do not need to do
214 much (but need to discard data from readdir, if any), since
215 abscence of lock will cause ll_revalidate_it (called from
216 stat() and similar functions) to renew the data anyway */
217 if (S_ISDIR(inode->i_mode) &&
218 (bits & MDS_INODELOCK_UPDATE)) {
219 CDEBUG(D_INODE, "invalidating inode %lu/%u(%p)\n",
220 inode->i_ino, inode->i_generation, inode);
221 truncate_inode_pages(inode->i_mapping, 0);
224 if (inode->i_sb->s_root &&
225 inode != inode->i_sb->s_root->d_inode &&
226 (bits & MDS_INODELOCK_LOOKUP))
227 ll_unhash_aliases(inode);
238 /* Search "inode"'s alias list for a dentry that has the same name and parent as
239 * de. If found, return it. If not found, return de. */
240 struct dentry *ll_find_alias(struct inode *inode, struct dentry *de)
242 struct list_head *tmp;
244 spin_lock(&dcache_lock);
245 list_for_each(tmp, &inode->i_dentry) {
246 struct dentry *dentry = list_entry(tmp, struct dentry, d_alias);
248 /* We are called here with 'de' already on the aliases list. */
254 if (dentry->d_parent != de->d_parent)
257 if (dentry->d_name.len != de->d_name.len)
260 if (memcmp(dentry->d_name.name, de->d_name.name,
261 de->d_name.len) != 0)
264 if (!list_empty(&dentry->d_lru))
265 list_del_init(&dentry->d_lru);
267 hlist_del_init(&dentry->d_hash);
268 __d_rehash(dentry); /* avoid taking dcache_lock inside */
269 spin_unlock(&dcache_lock);
270 atomic_inc(&dentry->d_count);
272 dentry->d_flags &= ~DCACHE_LUSTRE_INVALID;
273 CDEBUG(D_DENTRY, "alias dentry %*s (%p) parent %p inode %p "
274 "refc %d\n", de->d_name.len, de->d_name.name, de,
275 de->d_parent, de->d_inode, atomic_read(&de->d_count));
279 spin_unlock(&dcache_lock);
284 static int lookup_it_finish(struct ptlrpc_request *request, int offset,
285 struct lookup_intent *it, void *data)
287 struct it_cb_data *icbd = data;
288 struct dentry **de = icbd->icbd_childp;
289 struct inode *parent = icbd->icbd_parent;
290 struct ll_sb_info *sbi = ll_i2sbi(parent);
291 struct dentry *dentry = *de, *saved = *de;
292 struct inode *inode = NULL;
295 /* NB 1 request reference will be taken away by ll_intent_lock()
297 if (!it_disposition(it, DISP_LOOKUP_NEG)) {
300 rc = ll_prep_inode(sbi->ll_dt_exp, sbi->ll_md_exp,
301 &inode, request, offset, dentry->d_sb);
305 CDEBUG(D_DLMTRACE, "setting l_data to inode %p (%lu/%u)\n",
306 inode, inode->i_ino, inode->i_generation);
308 mdc_set_lock_data(NULL, &LUSTRE_IT(it)->it_lock_handle, inode);
310 /* If this is a stat, get the authoritative file size */
311 if (it->it_op == IT_GETATTR && S_ISREG(inode->i_mode) &&
312 ll_i2info(inode)->lli_smd != NULL) {
313 struct lov_stripe_md *lsm = ll_i2info(inode)->lli_smd;
316 LASSERT(lsm->lsm_object_id != 0);
318 /* bug 2334: drop MDS lock before acquiring OST lock */
319 ll_intent_drop_lock(it);
321 if (!LLI_HAVE_FLSIZE(inode)) {
322 CDEBUG(D_INODE, "retrieve size from OSS\n");
323 rc = ll_glimpse_size(inode);
331 dentry = *de = ll_find_alias(inode, dentry);
336 dentry->d_op = &ll_d_ops;
340 d_add(dentry, inode);
345 static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
346 struct nameidata *nd, int flags)
348 struct lookup_intent *it = flags ? &nd->intent.open : NULL;
349 struct lookup_intent lookup_it = { .it_op = IT_LOOKUP };
350 struct dentry *save = dentry, *retval;
351 struct ptlrpc_request *req = NULL;
352 int rc, gns_it, gns_flags;
353 struct it_cb_data icbd;
354 struct lustre_id pid;
357 if (dentry->d_name.len > EXT3_NAME_LEN)
358 RETURN(ERR_PTR(-ENAMETOOLONG));
360 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p),intent=%s\n",
361 dentry->d_name.len, dentry->d_name.name, parent->i_ino,
362 parent->i_generation, parent, LL_IT2STR(it));
364 if (d_mountpoint(dentry))
365 CERROR("Tell Peter, lookup on mtpt, it %s\n", LL_IT2STR(it));
368 nd->mnt->mnt_last_used = jiffies;
370 gns_it = nd ? nd->intent.open.it_op : IT_OPEN;
371 gns_flags = nd ? nd->flags : LOOKUP_CONTINUE;
372 ll_frob_intent(&it, &lookup_it);
374 icbd.icbd_childp = &dentry;
375 icbd.icbd_parent = parent;
376 ll_inode2id(&pid, parent);
378 rc = md_intent_lock(ll_i2mdexp(parent), &pid, (char *)dentry->d_name.name,
379 dentry->d_name.len, NULL, 0, NULL, it, flags, &req,
380 ll_mdc_blocking_ast);
382 GOTO(out, retval = ERR_PTR(rc));
384 rc = lookup_it_finish(req, 1, it, &icbd);
386 ll_intent_release(it);
387 GOTO(out, retval = ERR_PTR(rc));
390 ll_lookup_finish_locks(it, dentry);
392 if (nd && dentry->d_inode != NULL &&
393 dentry->d_inode->i_mode & S_ISUID && S_ISDIR(dentry->d_inode->i_mode) &&
394 ((gns_flags & LOOKUP_CONTINUE) || (gns_it & (IT_CHDIR | IT_OPEN))))
396 CDEBUG(D_DENTRY, "possible GNS dentry %*s %p found, "
397 "mounting it\n", (int)dentry->d_name.len,
398 dentry->d_name.name, dentry);
400 rc = ll_gns_mount_object(dentry, nd->mnt);
403 * just reporting about GNS failures, lookup() is
404 * successful, do not stop it.
406 * GNS failure may be that object is found in SUID bit
407 * marked dir but it is not regular file and we should
408 * lookup further until we find correct mount
409 * object. This will allow to perform GNS mount is the
410 * following case for instance:
412 * /mnt/lustre/gns_mount/.mntinfo/.mntinfo/..../.mntinfo
413 * where all ".mntinfo" are dirs and only last one is
416 CDEBUG(D_DENTRY, "failed to mount %*s, err %d\n",
417 (int)dentry->d_name.len, dentry->d_name.name, rc);
422 GOTO(out, retval = NULL);
424 GOTO(out, retval = dentry);
427 ptlrpc_req_finished(req);
428 if (it == &lookup_it)
429 ll_intent_release(it);
431 CDEBUG(D_INODE, "lookup 0x%p in %lu/%lu: %*s -> %lu/%lu\n",
433 (unsigned long) parent->i_ino,
434 (unsigned long) parent->i_generation,
435 dentry->d_name.len, dentry->d_name.name,
436 (unsigned long) dentry->d_inode->i_ino,
437 (unsigned long) dentry->d_inode->i_generation);
439 CDEBUG(D_INODE, "lookup 0x%p in %lu/%lu: %*s -> ??\n",
441 (unsigned long) parent->i_ino,
442 (unsigned long) parent->i_generation,
443 dentry->d_name.len, dentry->d_name.name);
447 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
448 static struct dentry *ll_lookup_nd(struct inode *parent, struct dentry *dentry,
449 struct nameidata *nd)
454 if (nd && nd->flags & LOOKUP_LAST && !(nd->flags & LOOKUP_LINK_NOTLAST))
455 de = ll_lookup_it(parent, dentry, nd, nd->flags);
457 de = ll_lookup_it(parent, dentry, nd, 0);
463 /* We depend on "mode" being set with the proper file type/umask by now */
464 static struct inode *ll_create_node(struct inode *dir, const char *name,
465 int namelen, const void *data, int datalen,
466 int mode, __u64 extra,
467 struct lookup_intent *it)
469 struct inode *inode = NULL;
470 struct ptlrpc_request *request = NULL;
471 struct ll_sb_info *sbi = ll_i2sbi(dir);
476 LASSERT(it && LUSTRE_IT(it)->it_disposition);
478 request = LUSTRE_IT(it)->it_data;
479 rc = ll_prep_inode(sbi->ll_dt_exp, sbi->ll_md_exp,
480 &inode, request, 1, dir->i_sb);
482 GOTO(out, inode = ERR_PTR(rc));
484 LASSERT(list_empty(&inode->i_dentry));
486 /* We asked for a lock on the directory, but were granted a
487 * lock on the inode. Since we finally have an inode pointer,
488 * stuff it in the lock. */
489 CDEBUG(D_DLMTRACE, "setting l_ast_data to inode %p (%lu/%u)\n",
490 inode, inode->i_ino, inode->i_generation);
491 mdc_set_lock_data(NULL, &LUSTRE_IT(it)->it_lock_handle, inode);
494 ptlrpc_req_finished(request);
499 * By the time this is called, we already have created the directory cache
500 * entry for the new file, but it is so far negative - it has no inode.
502 * We defer creating the OBD object(s) until open, to keep the intent and
503 * non-intent code paths similar, and also because we do not have the MDS
504 * inode number before calling ll_create_node() (which is needed for LOV),
505 * so we would need to do yet another RPC to the MDS to store the LOV EA
506 * data on the MDS. If needed, we would pass the PACKED lmm as data and
507 * lmm_size in datalen (the MDS still has code which will handle that).
509 * If the create succeeds, we fill in the inode information
510 * with d_instantiate().
512 static int ll_create_it(struct inode *dir, struct dentry *dentry, int mode,
513 struct lookup_intent *it)
516 struct ptlrpc_request *request = LUSTRE_IT(it)->it_data;
517 struct obd_export *md_exp = ll_i2mdexp(dir);
521 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p),intent=%s\n",
522 dentry->d_name.len, dentry->d_name.name, dir->i_ino,
523 dir->i_generation, dir, LL_IT2STR(it));
525 rc = it_open_error(DISP_OPEN_CREATE, it);
529 mdc_store_inode_generation(md_exp, request, MDS_REQ_INTENT_REC_OFF, 1);
530 inode = ll_create_node(dir, (char *)dentry->d_name.name,
531 dentry->d_name.len, NULL, 0, mode, 0, it);
533 RETURN(PTR_ERR(inode));
535 d_instantiate(dentry, inode);
539 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
540 static int ll_create_nd(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *nd)
542 return ll_create_it(dir, dentry, mode, &nd->intent.open);
546 static void ll_update_times(struct ptlrpc_request *request, int offset,
549 struct mds_body *body = lustre_msg_buf(request->rq_repmsg, offset,
553 if (body->valid & OBD_MD_FLMTIME &&
554 body->mtime > LTIME_S(inode->i_mtime)) {
555 CDEBUG(D_INODE, "setting ino %lu mtime from %lu to %u\n",
556 inode->i_ino, LTIME_S(inode->i_mtime), body->mtime);
557 LTIME_S(inode->i_mtime) = body->mtime;
559 if (body->valid & OBD_MD_FLCTIME &&
560 body->ctime > LTIME_S(inode->i_ctime))
561 LTIME_S(inode->i_ctime) = body->ctime;
564 static int ll_mknod_raw(struct nameidata *nd, int mode, dev_t rdev)
566 struct ptlrpc_request *request = NULL;
567 struct inode *dir = nd->dentry->d_inode;
568 struct ll_sb_info *sbi = ll_i2sbi(dir);
569 struct mdc_op_data *op_data;
573 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
574 nd->last.len, nd->last.name, dir->i_ino,
575 dir->i_generation, dir);
577 mode &= ~current->fs->umask;
579 switch (mode & S_IFMT) {
582 mode |= S_IFREG; /* for mode = 0 case, fallthrough */
587 OBD_ALLOC(op_data, sizeof(*op_data));
590 ll_prepare_mdc_data(op_data, dir, NULL,
591 (char *)nd->last.name,
594 err = md_create(sbi->ll_md_exp, op_data, NULL, 0, mode,
595 current->fsuid, current->fsgid, rdev,
597 OBD_FREE(op_data, sizeof(*op_data));
599 ll_update_times(request, 0, dir);
600 ptlrpc_req_finished(request);
611 static int ll_mknod(struct inode *dir, struct dentry *dchild,
612 int mode, ll_dev_t rdev)
614 struct ptlrpc_request *request = NULL;
615 struct inode *inode = NULL;
616 struct ll_sb_info *sbi = ll_i2sbi(dir);
617 struct mdc_op_data *op_data;
621 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
622 dchild->d_name.len, dchild->d_name.name,
623 dir->i_ino, dir->i_generation, dir);
625 mode &= ~current->fs->umask;
627 switch (mode & S_IFMT) {
630 mode |= S_IFREG; /* for mode = 0 case, fallthrough */
635 OBD_ALLOC(op_data, sizeof(*op_data));
639 ll_prepare_mdc_data(op_data, dir, NULL,
640 (char *)dchild->d_name.name,
641 dchild->d_name.len, 0);
643 err = md_create(sbi->ll_md_exp, op_data, NULL, 0, mode,
644 current->fsuid, current->fsgid, rdev,
646 OBD_FREE(op_data, sizeof(*op_data));
650 ll_update_times(request, 0, dir);
651 err = ll_prep_inode(sbi->ll_dt_exp, sbi->ll_md_exp,
652 &inode, request, 0, dchild->d_sb);
663 d_instantiate(dchild, inode);
666 ptlrpc_req_finished(request);
670 static int ll_symlink_raw(struct nameidata *nd, const char *tgt)
672 const char *name = (char *)nd->last.name;
673 struct inode *dir = nd->dentry->d_inode;
674 struct ptlrpc_request *request = NULL;
675 struct ll_sb_info *sbi = ll_i2sbi(dir);
676 struct mdc_op_data *op_data;
677 int len = nd->last.len;
681 CDEBUG(D_VFSTRACE, "VFS Op:name=%*s,dir=%lu/%u(%p),target=%s\n",
682 nd->last.len, nd->last.name, dir->i_ino, dir->i_generation,
685 if (dir->i_nlink >= EXT3_LINK_MAX)
688 OBD_ALLOC(op_data, sizeof(*op_data));
691 ll_prepare_mdc_data(op_data, dir, NULL, name, len, 0);
693 err = md_create(sbi->ll_md_exp, op_data,
694 tgt, strlen(tgt) + 1, S_IFLNK | S_IRWXUGO,
695 current->fsuid, current->fsgid, 0, &request);
696 OBD_FREE(op_data, sizeof(*op_data));
698 ll_update_times(request, 0, dir);
700 ptlrpc_req_finished(request);
704 static int ll_link_raw(struct nameidata *srcnd, struct nameidata *tgtnd)
706 struct inode *src = srcnd->dentry->d_inode;
707 struct inode *dir = tgtnd->dentry->d_inode;
708 struct ptlrpc_request *request = NULL;
709 struct ll_sb_info *sbi = ll_i2sbi(dir);
710 struct mdc_op_data *op_data;
715 "VFS Op: inode=%lu/%u(%p), dir=%lu/%u(%p), target=%.*s\n",
716 src->i_ino, src->i_generation, src, dir->i_ino,
717 dir->i_generation, dir, tgtnd->last.len, tgtnd->last.name);
719 OBD_ALLOC(op_data, sizeof(*op_data));
723 ll_prepare_mdc_data(op_data, src, dir,
724 (char *)tgtnd->last.name,
727 err = md_link(sbi->ll_md_exp, op_data, &request);
728 OBD_FREE(op_data, sizeof(*op_data));
730 ll_update_times(request, 0, dir);
731 ptlrpc_req_finished(request);
736 static int ll_mkdir_raw(struct nameidata *nd, int mode)
738 struct inode *dir = nd->dentry->d_inode;
739 struct ptlrpc_request *request = NULL;
740 struct ll_sb_info *sbi = ll_i2sbi(dir);
741 struct mdc_op_data *op_data;
744 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
745 nd->last.len, nd->last.name, dir->i_ino, dir->i_generation, dir);
747 mode = (mode & (S_IRWXUGO|S_ISVTX) & ~current->fs->umask) | S_IFDIR;
748 OBD_ALLOC(op_data, sizeof(*op_data));
752 ll_prepare_mdc_data(op_data, dir, NULL,
753 (char *)nd->last.name,
756 err = md_create(sbi->ll_md_exp, op_data, NULL, 0, mode,
757 current->fsuid, current->fsgid, 0, &request);
758 OBD_FREE(op_data, sizeof(*op_data));
760 ll_update_times(request, 0, dir);
761 ptlrpc_req_finished(request);
765 static int ll_rmdir_raw(struct nameidata *nd)
767 struct inode *dir = nd->dentry->d_inode;
768 struct ptlrpc_request *request = NULL;
769 struct mdc_op_data *op_data;
773 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
774 nd->last.len, nd->last.name, dir->i_ino,
775 dir->i_generation, dir);
777 OBD_ALLOC(op_data, sizeof(*op_data));
781 ll_prepare_mdc_data(op_data, dir, NULL,
782 (char *)nd->last.name,
783 nd->last.len, S_IFDIR);
785 rc = md_unlink(ll_i2sbi(dir)->ll_md_exp, op_data, &request);
786 OBD_FREE(op_data, sizeof(*op_data));
788 ll_update_times(request, 0, dir);
789 ptlrpc_req_finished(request);
793 static int ll_unlink_raw(struct nameidata *nd)
795 struct inode *dir = nd->dentry->d_inode;
796 struct ptlrpc_request *request = NULL;
797 struct mdc_op_data *op_data;
800 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
801 nd->last.len, nd->last.name, dir->i_ino,
802 dir->i_generation, dir);
804 OBD_ALLOC(op_data, sizeof(*op_data));
807 ll_prepare_mdc_data(op_data, dir, NULL,
808 (char *)nd->last.name, nd->last.len, 0);
809 rc = md_unlink(ll_i2sbi(dir)->ll_md_exp, op_data, &request);
810 OBD_FREE(op_data, sizeof(*op_data));
813 ll_update_times(request, 0, dir);
816 ptlrpc_req_finished(request);
820 static int ll_rename_raw(struct nameidata *srcnd, struct nameidata *tgtnd)
822 struct inode *src = srcnd->dentry->d_inode;
823 struct inode *tgt = tgtnd->dentry->d_inode;
824 struct ptlrpc_request *request = NULL;
825 struct ll_sb_info *sbi = ll_i2sbi(src);
826 struct mdc_op_data *op_data;
830 if (srcnd->mnt != tgtnd->mnt)
833 CDEBUG(D_VFSTRACE,"VFS Op:oldname=%.*s,src_dir=%lu/%u(%p),newname=%.*s,"
834 "tgt_dir=%lu/%u(%p)\n", srcnd->last.len, srcnd->last.name,
835 src->i_ino, src->i_generation, src, tgtnd->last.len,
836 tgtnd->last.name, tgt->i_ino, tgt->i_generation, tgt);
838 OBD_ALLOC(op_data, sizeof(*op_data));
841 ll_prepare_mdc_data(op_data, src, tgt, NULL, 0, 0);
842 err = md_rename(sbi->ll_md_exp, op_data, (char *)srcnd->last.name,
843 srcnd->last.len, (char *)tgtnd->last.name,
844 tgtnd->last.len, &request);
845 OBD_FREE(op_data, sizeof(*op_data));
847 ll_update_times(request, 0, src);
848 ll_update_times(request, 0, tgt);
851 ptlrpc_req_finished(request);
855 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
856 #define LLITE_IT_RAWOPS (IT_MKNOD|IT_MKDIR|IT_SYMLINK|IT_LINK|IT_UNLINK|IT_RMDIR|IT_RENAME)
857 static int ll_rawop_from_intent(struct nameidata *nd)
861 if (!nd || !(nd->intent.open.op & LLITE_IT_RAWOPS))
864 switch (nd->intent.open.op) {
866 error = ll_mknod_raw(nd, nd->intent.open.create_mode,
867 nd->intent.open.create.dev);
870 error = ll_mkdir_raw(nd, nd->intent.open.create_mode);
873 error = ll_rmdir_raw(nd);
876 error = ll_unlink_raw(nd);
879 LASSERT(nd->intent.open.create.link);
880 error = ll_symlink_raw(nd, nd->intent.open.create.link);
883 error = ll_link_raw(nd->intent.open.create.source_nd, nd);
886 LASSERT(nd->intent.open.create.source_nd);
887 error = ll_rename_raw(nd->intent.open.create.source_nd, nd);
892 if (error != -EOPNOTSUPP)
893 nd->intent.open.flags |= IT_STATUS_RAW;
899 struct inode_operations ll_dir_inode_operations = {
901 .setattr = ll_setattr,
902 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
903 .create_it = ll_create_it,
904 .lookup_it = ll_lookup_it,
905 .revalidate_it = ll_inode_revalidate_it,
907 .lookup = ll_lookup_nd,
908 .create = ll_create_nd,
909 .getattr = ll_getattr,
910 .endparentlookup = ll_rawop_from_intent,
912 .setxattr = ll_setxattr,
913 .getxattr = ll_getxattr,
914 .listxattr = ll_listxattr,
915 .removexattr = ll_removexattr,
916 .permission = ll_inode_permission,