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 (bits & MDS_INODELOCK_UPDATE)
175 clear_bit(LLI_F_HAVE_MDS_SIZE_LOCK,
176 &(ll_i2info(inode)->lli_flags));
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));
186 if (bits & MDS_INODELOCK_OPEN) {
188 switch (lock->l_req_mode) {
199 CERROR("Unexpected lock mode for OPEN lock "
200 "%d, inode %ld\n", lock->l_req_mode,
203 ll_md_real_close(ll_i2mdexp(inode), inode, flags);
206 if (bits & MDS_INODELOCK_UPDATE)
207 clear_bit(LLI_F_HAVE_MDS_SIZE_LOCK,
208 &(ll_i2info(inode)->lli_flags));
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);
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);
239 int ll_mdc_cancel_unused(struct lustre_handle *conn, struct inode *inode,
240 int flags, void *opaque)
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);
248 RETURN(ldlm_cli_cancel_unused(obddev->obd_namespace, &res_id, flags,
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)
256 struct list_head *tmp;
258 spin_lock(&dcache_lock);
259 list_for_each(tmp, &inode->i_dentry) {
260 struct dentry *dentry = list_entry(tmp, struct dentry, d_alias);
262 /* We are called here with 'de' already on the aliases list. */
268 if (dentry->d_parent != de->d_parent)
271 if (dentry->d_name.len != de->d_name.len)
274 if (memcmp(dentry->d_name.name, de->d_name.name,
275 de->d_name.len) != 0)
278 if (!list_empty(&dentry->d_lru))
279 list_del_init(&dentry->d_lru);
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);
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));
293 spin_unlock(&dcache_lock);
298 static int lookup_it_finish(struct ptlrpc_request *request, int offset,
299 struct lookup_intent *it, void *data)
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;
309 /* NB 1 request reference will be taken away by ll_intent_lock()
311 if (!it_disposition(it, DISP_LOOKUP_NEG)) {
314 rc = ll_prep_inode(sbi->ll_dt_exp, sbi->ll_md_exp,
315 &inode, request, offset, dentry->d_sb);
319 CDEBUG(D_DLMTRACE, "setting l_data to inode %p (%lu/%u)\n",
320 inode, inode->i_ino, inode->i_generation);
322 mdc_set_lock_data(NULL, &LUSTRE_IT(it)->it_lock_handle, inode);
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;
330 LASSERT(lsm->lsm_object_id != 0);
332 /* bug 2334: drop MDS lock before acquiring OST lock */
333 ll_intent_drop_lock(it);
335 rc = ll_glimpse_size(inode);
342 dentry = *de = ll_find_alias(inode, dentry);
347 dentry->d_op = &ll_d_ops;
351 d_add(dentry, inode);
356 static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
357 struct nameidata *nd, int flags)
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 };
368 if (dentry->d_name.len > EXT3_NAME_LEN)
369 RETURN(ERR_PTR(-ENAMETOOLONG));
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));
375 if (d_mountpoint(dentry))
376 CERROR("Tell Peter, lookup on mtpt, it %s\n", LL_IT2STR(it));
379 nd->mnt->mnt_last_used = jiffies;
381 orig_it = it ? it->it_op : IT_OPEN;
382 ll_frob_intent(&it, &lookup_it);
384 icbd.icbd_childp = &dentry;
385 icbd.icbd_parent = parent;
386 ll_inode2id(&pid, parent);
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);
392 GOTO(out, retval = ERR_PTR(rc));
394 rc = lookup_it_finish(req, 1, it, &icbd);
396 ll_intent_release(it);
397 GOTO(out, retval = ERR_PTR(rc));
400 ll_lookup_finish_locks(it, dentry);
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))))
407 rc = ll_gns_mount_object(dentry, nd->mnt);
408 if (rc == -ERESTARTSYS) {
409 /* causing syscall restart */
410 GOTO(out, retval = ERR_PTR(-ERESTARTSYS));
415 * just reporting about GNS failures, lookup() is
416 * successful, do not stop it.
418 * GNS failure may be that found object is found in SUID
419 * bit marked dir but it is not regular file and we
420 * should lookup further until we find correct mount
421 * object. This will allow to perform GNS mount is the
422 * following case for instance:
424 * /mnt/lustre/gns_mount/.mntinfo/.mntinfo/..../.mntinfo
425 * where all ".mntinfo" are dirs and only last one is
428 CDEBUG(D_INODE, "failed to mount %*s, err %d\n",
429 (int)dentry->d_name.len, dentry->d_name.name, rc);
434 GOTO(out, retval = NULL);
436 GOTO(out, retval = dentry);
439 ptlrpc_req_finished(req);
440 if (it == &lookup_it)
441 ll_intent_release(it);
443 CDEBUG(D_INODE, "lookup 0x%p in %lu/%lu: %*s -> %lu/%lu\n",
445 (unsigned long) parent->i_ino,
446 (unsigned long) parent->i_generation,
447 dentry->d_name.len, dentry->d_name.name,
448 (unsigned long) dentry->d_inode->i_ino,
449 (unsigned long) dentry->d_inode->i_generation);
451 CDEBUG(D_INODE, "lookup 0x%p in %lu/%lu: %*s -> ??\n",
453 (unsigned long) parent->i_ino,
454 (unsigned long) parent->i_generation,
455 dentry->d_name.len, dentry->d_name.name);
459 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
460 static struct dentry *ll_lookup_nd(struct inode *parent, struct dentry *dentry,
461 struct nameidata *nd)
466 if (nd && nd->flags & LOOKUP_LAST && !(nd->flags & LOOKUP_LINK_NOTLAST))
467 de = ll_lookup_it(parent, dentry, nd, nd->flags);
469 de = ll_lookup_it(parent, dentry, nd, 0);
475 /* We depend on "mode" being set with the proper file type/umask by now */
476 static struct inode *ll_create_node(struct inode *dir, const char *name,
477 int namelen, const void *data, int datalen,
478 int mode, __u64 extra,
479 struct lookup_intent *it)
481 struct inode *inode = NULL;
482 struct ptlrpc_request *request = NULL;
483 struct ll_sb_info *sbi = ll_i2sbi(dir);
488 LASSERT(it && LUSTRE_IT(it)->it_disposition);
490 request = LUSTRE_IT(it)->it_data;
491 rc = ll_prep_inode(sbi->ll_dt_exp, sbi->ll_md_exp,
492 &inode, request, 1, dir->i_sb);
494 GOTO(out, inode = ERR_PTR(rc));
496 LASSERT(list_empty(&inode->i_dentry));
498 /* We asked for a lock on the directory, but were granted a
499 * lock on the inode. Since we finally have an inode pointer,
500 * stuff it in the lock. */
501 CDEBUG(D_DLMTRACE, "setting l_ast_data to inode %p (%lu/%u)\n",
502 inode, inode->i_ino, inode->i_generation);
503 mdc_set_lock_data(NULL, &LUSTRE_IT(it)->it_lock_handle, inode);
506 ptlrpc_req_finished(request);
511 * By the time this is called, we already have created the directory cache
512 * entry for the new file, but it is so far negative - it has no inode.
514 * We defer creating the OBD object(s) until open, to keep the intent and
515 * non-intent code paths similar, and also because we do not have the MDS
516 * inode number before calling ll_create_node() (which is needed for LOV),
517 * so we would need to do yet another RPC to the MDS to store the LOV EA
518 * data on the MDS. If needed, we would pass the PACKED lmm as data and
519 * lmm_size in datalen (the MDS still has code which will handle that).
521 * If the create succeeds, we fill in the inode information
522 * with d_instantiate().
524 static int ll_create_it(struct inode *dir, struct dentry *dentry, int mode,
525 struct lookup_intent *it)
528 struct ptlrpc_request *request = LUSTRE_IT(it)->it_data;
529 struct obd_export *md_exp = ll_i2mdexp(dir);
533 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p),intent=%s\n",
534 dentry->d_name.len, dentry->d_name.name, dir->i_ino,
535 dir->i_generation, dir, LL_IT2STR(it));
537 rc = it_open_error(DISP_OPEN_CREATE, it);
541 mdc_store_inode_generation(md_exp, request, MDS_REQ_INTENT_REC_OFF, 1);
542 inode = ll_create_node(dir, dentry->d_name.name, dentry->d_name.len,
543 NULL, 0, mode, 0, it);
545 RETURN(PTR_ERR(inode));
547 d_instantiate(dentry, inode);
551 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
552 static int ll_create_nd(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *nd)
554 return ll_create_it(dir, dentry, mode, &nd->intent.open);
558 static void ll_update_times(struct ptlrpc_request *request, int offset,
561 struct mds_body *body = lustre_msg_buf(request->rq_repmsg, offset,
565 if (body->valid & OBD_MD_FLMTIME &&
566 body->mtime > LTIME_S(inode->i_mtime)) {
567 CDEBUG(D_INODE, "setting ino %lu mtime from %lu to %u\n",
568 inode->i_ino, LTIME_S(inode->i_mtime), body->mtime);
569 LTIME_S(inode->i_mtime) = body->mtime;
571 if (body->valid & OBD_MD_FLCTIME &&
572 body->ctime > LTIME_S(inode->i_ctime))
573 LTIME_S(inode->i_ctime) = body->ctime;
576 static int ll_mknod_raw(struct nameidata *nd, int mode, dev_t rdev)
578 struct ptlrpc_request *request = NULL;
579 struct inode *dir = nd->dentry->d_inode;
580 struct ll_sb_info *sbi = ll_i2sbi(dir);
581 struct mdc_op_data *op_data;
585 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
586 nd->last.len, nd->last.name, dir->i_ino, dir->i_generation, dir);
588 mode &= ~current->fs->umask;
590 switch (mode & S_IFMT) {
593 mode |= S_IFREG; /* for mode = 0 case, fallthrough */
598 OBD_ALLOC(op_data, sizeof(*op_data));
601 ll_prepare_mdc_data(op_data, dir, NULL, nd->last.name,
603 err = md_create(sbi->ll_md_exp, op_data, NULL, 0, mode,
604 current->fsuid, current->fsgid, rdev,
606 OBD_FREE(op_data, sizeof(*op_data));
608 ll_update_times(request, 0, dir);
609 ptlrpc_req_finished(request);
620 static int ll_mknod(struct inode *dir, struct dentry *dchild,
621 int mode, ll_dev_t rdev)
623 struct ptlrpc_request *request = NULL;
624 struct inode *inode = NULL;
625 struct ll_sb_info *sbi = ll_i2sbi(dir);
626 struct mdc_op_data *op_data;
630 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
631 dchild->d_name.len, dchild->d_name.name,
632 dir->i_ino, dir->i_generation, dir);
634 mode &= ~current->fs->umask;
636 switch (mode & S_IFMT) {
639 mode |= S_IFREG; /* for mode = 0 case, fallthrough */
644 OBD_ALLOC(op_data, sizeof(*op_data));
647 ll_prepare_mdc_data(op_data, dir, NULL, dchild->d_name.name,
648 dchild->d_name.len, 0);
649 err = md_create(sbi->ll_md_exp, op_data, NULL, 0, mode,
650 current->fsuid, current->fsgid, rdev,
652 OBD_FREE(op_data, sizeof(*op_data));
656 ll_update_times(request, 0, dir);
657 err = ll_prep_inode(sbi->ll_dt_exp, sbi->ll_md_exp,
658 &inode, request, 0, dchild->d_sb);
669 d_instantiate(dchild, inode);
672 ptlrpc_req_finished(request);
676 static int ll_symlink_raw(struct nameidata *nd, const char *tgt)
678 struct inode *dir = nd->dentry->d_inode;
679 struct ptlrpc_request *request = NULL;
680 struct ll_sb_info *sbi = ll_i2sbi(dir);
681 const char *name = nd->last.name;
682 struct mdc_op_data *op_data;
683 int len = nd->last.len;
687 CDEBUG(D_VFSTRACE, "VFS Op:name=%*s,dir=%lu/%u(%p),target=%s\n",
688 nd->last.len, nd->last.name, dir->i_ino, dir->i_generation,
691 if (dir->i_nlink >= EXT3_LINK_MAX)
694 OBD_ALLOC(op_data, sizeof(*op_data));
697 ll_prepare_mdc_data(op_data, dir, NULL, name, len, 0);
699 err = md_create(sbi->ll_md_exp, op_data,
700 tgt, strlen(tgt) + 1, S_IFLNK | S_IRWXUGO,
701 current->fsuid, current->fsgid, 0, &request);
702 OBD_FREE(op_data, sizeof(*op_data));
704 ll_update_times(request, 0, dir);
706 ptlrpc_req_finished(request);
710 static int ll_link_raw(struct nameidata *srcnd, struct nameidata *tgtnd)
712 struct inode *src = srcnd->dentry->d_inode;
713 struct inode *dir = tgtnd->dentry->d_inode;
714 struct ptlrpc_request *request = NULL;
715 struct mdc_op_data *op_data;
717 struct ll_sb_info *sbi = ll_i2sbi(dir);
721 "VFS Op: inode=%lu/%u(%p), dir=%lu/%u(%p), target=%.*s\n",
722 src->i_ino, src->i_generation, src, dir->i_ino,
723 dir->i_generation, dir, tgtnd->last.len, tgtnd->last.name);
725 OBD_ALLOC(op_data, sizeof(*op_data));
728 ll_prepare_mdc_data(op_data, src, dir, tgtnd->last.name,
730 err = md_link(sbi->ll_md_exp, op_data, &request);
731 OBD_FREE(op_data, sizeof(*op_data));
733 ll_update_times(request, 0, dir);
734 ptlrpc_req_finished(request);
739 static int ll_mkdir_raw(struct nameidata *nd, int mode)
741 struct inode *dir = nd->dentry->d_inode;
742 struct ptlrpc_request *request = NULL;
743 struct ll_sb_info *sbi = ll_i2sbi(dir);
744 struct mdc_op_data *op_data;
747 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
748 nd->last.len, nd->last.name, dir->i_ino, dir->i_generation, dir);
750 mode = (mode & (S_IRWXUGO|S_ISVTX) & ~current->fs->umask) | S_IFDIR;
751 OBD_ALLOC(op_data, sizeof(*op_data));
754 ll_prepare_mdc_data(op_data, dir, NULL, 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, dir->i_generation, dir);
776 OBD_ALLOC(op_data, sizeof(*op_data));
779 ll_prepare_mdc_data(op_data, dir, NULL, nd->last.name,
780 nd->last.len, S_IFDIR);
781 rc = md_unlink(ll_i2sbi(dir)->ll_md_exp, op_data, &request);
782 OBD_FREE(op_data, sizeof(*op_data));
784 ll_update_times(request, 0, dir);
785 ptlrpc_req_finished(request);
789 int ll_objects_destroy(struct ptlrpc_request *request,
790 struct inode *dir, int offset)
792 struct mds_body *body;
793 struct lov_mds_md *eadata;
794 struct lov_stripe_md *lsm = NULL;
795 struct obd_trans_info oti = { 0 };
800 /* req is swabbed so this is safe */
801 body = lustre_msg_buf(request->rq_repmsg, 0, sizeof(*body));
803 if (!(body->valid & OBD_MD_FLEASIZE))
806 if (body->eadatasize == 0) {
807 CERROR("OBD_MD_FLEASIZE set but eadatasize zero\n");
808 GOTO(out, rc = -EPROTO);
812 * the MDS sent back the EA because we unlinked the last reference to
813 * this file. Use this EA to unlink the objects on the OST. It's opaque
814 * so we don't swab here; we leave it to obd_unpackmd() to check it is
815 * complete and sensible.
817 eadata = lustre_swab_repbuf(request, 1, body->eadatasize, NULL);
818 LASSERT(eadata != NULL);
819 if (eadata == NULL) {
820 CERROR("Can't unpack MDS EA data\n");
821 GOTO(out, rc = -EPROTO);
824 rc = obd_unpackmd(ll_i2dtexp(dir), &lsm, eadata, body->eadatasize);
826 CERROR("obd_unpackmd: %d\n", rc);
829 LASSERT(rc >= sizeof(*lsm));
833 GOTO(out_free_memmd, rc = -ENOMEM);
835 oa->o_id = lsm->lsm_object_id;
836 oa->o_gr = lsm->lsm_object_gr;
837 oa->o_mode = body->mode & S_IFMT;
838 oa->o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLGROUP;
840 if (body->valid & OBD_MD_FLCOOKIE) {
841 int length = sizeof(struct llog_cookie) *
842 lsm->lsm_stripe_count;
843 oa->o_valid |= OBD_MD_FLCOOKIE;
845 lustre_msg_buf(request->rq_repmsg, 2, length);
846 if (oti.oti_logcookies == NULL) {
847 oa->o_valid &= ~OBD_MD_FLCOOKIE;
848 body->valid &= ~OBD_MD_FLCOOKIE;
850 /* copy llog cookies to request to replay unlink
851 * so that the same llog file and records as those created
852 * during fail can be re-created while doing replay
855 memcpy(lustre_msg_buf(request->rq_reqmsg, offset, 0),
856 oti.oti_logcookies, length);
860 rc = obd_destroy(ll_i2dtexp(dir), oa, lsm, &oti);
863 CERROR("obd destroy objid "LPX64" error %d\n",
864 lsm->lsm_object_id, rc);
867 obd_free_memmd(ll_i2dtexp(dir), &lsm);
872 static int ll_unlink_raw(struct nameidata *nd)
874 struct inode *dir = nd->dentry->d_inode;
875 struct ptlrpc_request *request = NULL;
876 struct mdc_op_data *op_data;
879 CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s,dir=%lu/%u(%p)\n",
880 nd->last.len, nd->last.name, dir->i_ino, dir->i_generation, dir);
882 OBD_ALLOC(op_data, sizeof(*op_data));
885 ll_prepare_mdc_data(op_data, dir, NULL, nd->last.name, nd->last.len, 0);
886 rc = md_unlink(ll_i2sbi(dir)->ll_md_exp, op_data, &request);
887 OBD_FREE(op_data, sizeof(*op_data));
890 ll_update_times(request, 0, dir);
892 rc = ll_objects_destroy(request, dir, 2);
895 ptlrpc_req_finished(request);
899 static int ll_rename_raw(struct nameidata *srcnd, struct nameidata *tgtnd)
901 struct inode *src = srcnd->dentry->d_inode;
902 struct inode *tgt = tgtnd->dentry->d_inode;
903 struct ptlrpc_request *request = NULL;
904 struct ll_sb_info *sbi = ll_i2sbi(src);
905 struct mdc_op_data *op_data;
909 if (srcnd->mnt != tgtnd->mnt)
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);
917 OBD_ALLOC(op_data, sizeof(*op_data));
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,
924 OBD_FREE(op_data, sizeof(*op_data));
926 ll_update_times(request, 0, src);
927 ll_update_times(request, 0, tgt);
928 err = ll_objects_destroy(request, src, 3);
931 ptlrpc_req_finished(request);
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)
941 if (!nd || !(nd->intent.open.op & LLITE_IT_RAWOPS))
944 switch (nd->intent.open.op) {
946 error = ll_mknod_raw(nd, nd->intent.open.create_mode,
947 nd->intent.open.create.dev);
950 error = ll_mkdir_raw(nd, nd->intent.open.create_mode);
953 error = ll_rmdir_raw(nd);
956 error = ll_unlink_raw(nd);
959 LASSERT(nd->intent.open.create.link);
960 error = ll_symlink_raw(nd, nd->intent.open.create.link);
963 error = ll_link_raw(nd->intent.open.create.source_nd, nd);
966 LASSERT(nd->intent.open.create.source_nd);
967 error = ll_rename_raw(nd->intent.open.create.source_nd, nd);
972 if (error != -EOPNOTSUPP)
973 nd->intent.open.flags |= IT_STATUS_RAW;
979 struct inode_operations ll_dir_inode_operations = {
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,
987 .lookup = ll_lookup_nd,
988 .create = ll_create_nd,
989 .getattr = ll_getattr,
990 .endparentlookup = ll_rawop_from_intent,
992 .setxattr = ll_setxattr,
993 .getxattr = ll_getxattr,
994 .listxattr = ll_listxattr,
995 .removexattr = ll_removexattr,
996 .permission = ll_inode_permission,