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 "llite_internal.h"
48 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
49 static int ll_test_inode(struct inode *inode, unsigned long ino, void *opaque)
51 static int ll_test_inode(struct inode *inode, void *opaque)
54 struct lustre_md *md = opaque;
56 if (!(md->body->valid & (OBD_MD_FLGENER | OBD_MD_FLID)))
57 CERROR("invalid generation\n");
58 CDEBUG(D_VFSTRACE, "comparing inode %p ino %lu/%u to body %u/%u\n",
59 inode, inode->i_ino, inode->i_generation,
60 md->body->ino, md->body->generation);
62 if (inode->i_generation != md->body->generation)
65 /* Apply the attributes in 'opaque' to this inode */
66 ll_update_inode(inode, md->body, md->lsm);
70 extern struct dentry_operations ll_d_ops;
72 int ll_unlock(__u32 mode, struct lustre_handle *lockh)
76 ldlm_lock_decref(lockh, mode);
81 /* Get an inode by inode number (already instantiated by the intent lookup).
82 * Returns inode or NULL
84 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0))
85 int ll_set_inode(struct inode *inode, void *opaque)
87 ll_read_inode2(inode, opaque);
90 struct inode *ll_iget(struct super_block *sb, ino_t hash,
96 inode = iget5_locked(sb, hash, ll_test_inode, ll_set_inode, md);
99 return (NULL); /* removed ERR_PTR(-ENOMEM) -eeb */
101 if (inode->i_state & I_NEW)
102 unlock_new_inode(inode);
104 // XXX Coda always fills inodes, should Lustre?
108 struct inode *ll_iget(struct super_block *sb, ino_t hash,
109 struct lustre_md *md)
113 inode = iget4(sb, hash, ll_test_inode, md);
114 CDEBUG(D_VFSTRACE, "inode: %lu/%u(%p)\n", inode->i_ino,
115 inode->i_generation, inode);
120 static int ll_intent_to_lock_mode(struct lookup_intent *it)
122 /* CREAT needs to be tested before open (both could be set) */
123 if (it->it_op & IT_CREAT)
125 else if (it->it_op & (IT_READDIR | IT_GETATTR | IT_OPEN | IT_LOOKUP))
132 int ll_it_open_error(int phase, struct lookup_intent *it)
134 if (it_disposition(it, DISP_OPEN_OPEN)) {
135 if (phase == DISP_OPEN_OPEN)
136 return it->it_status;
141 if (it_disposition(it, DISP_OPEN_CREATE)) {
142 if (phase == DISP_OPEN_CREATE)
143 return it->it_status;
148 if (it_disposition(it, DISP_LOOKUP_EXECD)) {
149 if (phase == DISP_LOOKUP_EXECD)
150 return it->it_status;
154 CERROR("it disp: %X, status: %d\n", it->it_disposition, it->it_status);
159 int ll_mdc_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
160 void *data, int flag)
163 struct lustre_handle lockh;
164 struct inode *inode = lock->l_data;
168 case LDLM_CB_BLOCKING:
169 ldlm_lock2handle(lock, &lockh);
170 rc = ldlm_cli_cancel(&lockh);
172 CDEBUG(D_INODE, "ldlm_cli_cancel: %d\n", rc);
176 case LDLM_CB_CANCELING: {
177 /* Invalidate all dentries associated with this inode */
180 if (lock->l_resource->lr_name.name[0] != inode->i_ino ||
181 lock->l_resource->lr_name.name[1] != inode->i_generation) {
182 LDLM_ERROR(lock, "data mismatch with ino %lu/%u",
183 inode->i_ino, inode->i_generation);
185 if (S_ISDIR(inode->i_mode)) {
186 CDEBUG(D_INODE, "invalidating inode %lu\n",
189 ll_invalidate_inode_pages(inode);
192 #warning FIXME: we should probably free this inode if there are no aliases
193 if (inode->i_sb->s_root &&
194 inode != inode->i_sb->s_root->d_inode)
195 ll_unhash_aliases(inode);
205 int ll_mdc_cancel_unused(struct lustre_handle *conn, struct inode *inode,
206 int flags, void *opaque)
208 struct ldlm_res_id res_id =
209 { .name = {inode->i_ino, inode->i_generation} };
210 struct obd_device *obddev = class_conn2obd(conn);
212 RETURN(ldlm_cli_cancel_unused(obddev->obd_namespace, &res_id, flags,
216 void ll_prepare_mdc_op_data(struct mdc_op_data *data,
225 data->ino1 = i1->i_ino;
226 data->gen1 = i1->i_generation;
227 data->typ1 = i1->i_mode & S_IFMT;
228 data->gid1 = i1->i_gid;
231 data->ino2 = i2->i_ino;
232 data->gen2 = i2->i_generation;
233 data->typ2 = i2->i_mode & S_IFMT;
234 data->gid2 = i2->i_gid;
240 data->namelen = namelen;
245 *This long block is all about fixing up the local state so that it is
246 *correct as of the moment _before_ the operation was applied; that
247 *way, the VFS will think that everything is normal and call Lustre's
248 *regular VFS methods.
250 * If we're performing a creation, that means that unless the creation
251 * failed with EEXIST, we should fake up a negative dentry.
253 * For everything else, we want to lookup to succeed.
255 * One additional note: if CREATE or OPEN succeeded, we add an extra
256 * reference to the request because we need to keep it around until
257 * ll_create/ll_open gets called.
259 * The server will return to us, in it_disposition, an indication of
260 * exactly what it_status refers to.
262 * If DISP_OPEN_OPEN is set, then it_status refers to the open() call,
263 * otherwise if DISP_OPEN_CREATE is set, then it status is the
264 * creation failure mode. In either case, one of DISP_LOOKUP_NEG or
265 * DISP_LOOKUP_POS will be set, indicating whether the child lookup
268 * Else, if DISP_LOOKUP_EXECD then it_status is the rc of the child
271 int ll_intent_lock(struct inode *parent, struct dentry **de,
272 struct lookup_intent *it, int flags, intent_finish_cb intent_finish)
274 struct dentry *dentry = *de;
275 struct inode *inode = dentry->d_inode;
276 struct ll_sb_info *sbi = ll_i2sbi(parent);
277 struct lustre_handle lockh;
278 struct lookup_intent lookup_it = { .it_op = IT_LOOKUP };
279 struct ptlrpc_request *request;
281 struct mds_body *mds_body;
286 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
287 if (it && it->it_magic != INTENT_MAGIC) {
288 CERROR("WARNING: uninitialized intent\n");
290 intent_init(it, IT_LOOKUP, 0);
292 if (it->it_op == IT_GETATTR ||
294 it->it_op = IT_LOOKUP;
297 if (!it ||it->it_op == IT_GETXATTR)
300 it->it_op_release = ll_intent_release;
302 CDEBUG(D_DLMTRACE, "name: %*s, intent: %s\n", dentry->d_name.len,
303 dentry->d_name.name, ldlm_it2str(it->it_op));
305 if (dentry->d_name.len > EXT2_NAME_LEN)
306 RETURN(-ENAMETOOLONG);
308 /* This function may be called twice, we only once want to
309 execute the request associated with the intent. If it was
310 done already, we skip past this and use the results. */
311 if (!it_disposition(it, DISP_ENQ_COMPLETE)) {
312 struct mdc_op_data op_data;
314 ll_prepare_mdc_op_data(&op_data, parent, dentry->d_inode,
315 dentry->d_name.name, dentry->d_name.len,
318 rc = mdc_enqueue(&sbi->ll_mdc_conn, LDLM_PLAIN, it,
319 ll_intent_to_lock_mode(it), &op_data,
320 &lockh, NULL, 0, ldlm_completion_ast,
321 ll_mdc_blocking_ast, NULL);
324 memcpy(it->it_lock_handle, &lockh, sizeof(lockh));
326 request = it->it_data;
327 LASSERT(request != NULL);
329 if (!it_disposition(it, DISP_IT_EXECD)) {
330 /* The server failed before it even started executing the
331 * intent, i.e. because it couldn't unpack the request. */
332 LASSERT(it->it_status != 0);
333 GOTO(drop_req, rc = it->it_status);
336 mds_body = lustre_msg_buf(request->rq_repmsg, 1, sizeof(*mds_body));
337 LASSERT(mds_body != NULL); /* mdc_enqueue checked */
338 LASSERT_REPSWABBED(request, 1); /* mdc_enqueue swabbed */
340 /* XXX everything with fids please, no ino's inode's etc */
341 ino = mds_body->fid1.id;
342 mode = mds_body->mode;
344 /*We were called from revalidate2: did we find the same inode?*/
346 (ino != inode->i_ino ||
347 mds_body->fid1.generation != inode->i_generation)) {
348 it_set_disposition(it, DISP_ENQ_COMPLETE);
352 /* If we're doing an IT_OPEN which did not result in an actual
353 * successful open, then we need to remove the bit which saves
354 * this request for unconditional replay. */
355 if (it->it_op & IT_OPEN) {
356 if (!it_disposition(it, DISP_OPEN_OPEN) ||
357 it->it_status != 0) {
360 spin_lock_irqsave (&request->rq_lock, flags);
361 request->rq_replay = 0;
362 spin_unlock_irqrestore (&request->rq_lock, flags);
366 rc = ll_it_open_error(DISP_LOOKUP_EXECD, it);
370 /* keep requests around for the multiple phases of the call
371 * this shows the DISP_XX must guarantee we make it into the call
373 if (it_disposition(it, DISP_OPEN_CREATE))
374 ptlrpc_request_addref(request);
375 if (it_disposition(it, DISP_OPEN_OPEN))
376 ptlrpc_request_addref(request);
378 if (it->it_op & IT_CREAT) {
379 /* XXX this belongs in ll_create_iit */
380 } else if (it->it_op == IT_OPEN) {
381 LASSERT(!it_disposition(it, DISP_OPEN_CREATE));
383 LASSERT(it->it_op & (IT_GETATTR | IT_LOOKUP));
385 if (intent_finish != NULL) {
386 struct lustre_handle old_lock;
387 struct ldlm_lock *lock;
389 rc = intent_finish(request, parent, de, it, 1, ino);
390 dentry = *de; /* intent_finish may change *de */
391 inode = dentry->d_inode;
395 /* The intent processing may well have given us a lock different
396 * from the one we requested. If we already have a matching
397 * lock, then cancel the new one. (We have to do this here,
398 * instead of in mdc_enqueue, because we need to use the child's
399 * inode as the l_data to match, and that's not available until
400 * intent_finish has performed the iget().) */
401 lock = ldlm_handle2lock(&lockh);
403 LDLM_DEBUG(lock, "matching against this");
405 memcpy(&old_lock, &lockh, sizeof(lockh));
406 if (ldlm_lock_match(NULL,
407 LDLM_FL_BLOCK_GRANTED |
409 NULL, LDLM_PLAIN, NULL, 0, LCK_NL,
411 ldlm_lock_decref_and_cancel(&lockh,
413 memcpy(&lockh, &old_lock, sizeof(old_lock));
414 memcpy(it->it_lock_handle, &lockh,
420 ptlrpc_req_finished(request);
422 CDEBUG(D_DENTRY, "D_IT dentry %p intent: %s status %d disp %x\n",
423 dentry, ldlm_it2str(it->it_op), it->it_status, it->it_disposition);
425 /* drop IT_LOOKUP locks */
426 if (it->it_op == IT_LOOKUP)
427 ll_intent_release(it);
431 ll_intent_release(it);
433 ptlrpc_req_finished(request);
437 /* Search "inode"'s alias list for a dentry that has the same name and parent as
438 * de. If found, return it. If not found, return de. */
439 struct dentry *ll_find_alias(struct inode *inode, struct dentry *de)
441 struct list_head *tmp;
443 spin_lock(&dcache_lock);
444 list_for_each(tmp, &inode->i_dentry) {
445 struct dentry *dentry = list_entry(tmp, struct dentry, d_alias);
447 /* We are called here with 'de' already on the aliases list. */
453 if (dentry->d_parent != de->d_parent)
456 if (dentry->d_name.len != de->d_name.len)
459 if (memcmp(dentry->d_name.name, de->d_name.name,
460 de->d_name.len) != 0)
463 if (!list_empty(&dentry->d_lru))
464 list_del_init(&dentry->d_lru);
466 hlist_del_init(&dentry->d_hash);
467 __d_rehash(dentry, 0); /* avoid taking dcache_lock inside */
468 spin_unlock(&dcache_lock);
469 atomic_inc(&dentry->d_count);
471 dentry->d_flags &= ~DCACHE_LUSTRE_INVALID;
475 spin_unlock(&dcache_lock);
481 lookup2_finish(struct ptlrpc_request *request,
482 struct inode *parent, struct dentry **de,
483 struct lookup_intent *it, int offset, obd_id ino)
485 struct ll_sb_info *sbi = ll_i2sbi(parent);
486 struct dentry *dentry = *de, *saved = *de;
487 struct inode *inode = NULL;
490 /* NB 1 request reference will be taken away by ll_intent_lock()
492 if (!it_disposition(it, DISP_LOOKUP_NEG)) {
496 rc =mdc_req2lustre_md(request, offset, &sbi->ll_osc_conn, &md);
500 inode = ll_iget(dentry->d_sb, ino, &md);
502 /* free the lsm if we allocated one above */
504 obd_free_memmd(&sbi->ll_osc_conn, &md.lsm);
506 } else if (md.lsm != NULL &&
507 ll_i2info(inode)->lli_smd != md.lsm) {
508 obd_free_memmd(&sbi->ll_osc_conn, &md.lsm);
511 /* If this is a stat, get the authoritative file size */
512 if (it->it_op == IT_GETATTR && S_ISREG(inode->i_mode) &&
513 ll_i2info(inode)->lli_smd != NULL) {
514 struct ldlm_extent extent = {0, OBD_OBJECT_EOF};
515 struct lustre_handle lockh = {0};
516 struct lov_stripe_md *lsm = ll_i2info(inode)->lli_smd;
519 LASSERT(lsm->lsm_object_id != 0);
521 rc = ll_extent_lock(NULL, inode, lsm, LCK_PR, &extent,
523 if (rc != ELDLM_OK) {
527 ll_extent_unlock(NULL, inode, lsm, LCK_PR, &lockh);
530 dentry = *de = ll_find_alias(inode, dentry);
532 /* We asked for a lock on the directory, and may have been
533 * granted a lock on the inode. Just in case, fixup the data
535 CDEBUG(D_DLMTRACE, "setting l_data to inode %p (%lu/%u)\n",
536 inode, inode->i_ino, inode->i_generation);
537 ldlm_lock_set_data((struct lustre_handle*)it->it_lock_handle,
543 dentry->d_op = &ll_d_ops;
547 d_add(dentry, inode);
552 static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
553 struct lookup_intent *it, int flags)
555 struct dentry *save = dentry, *retval;
559 CDEBUG(D_VFSTRACE, "VFS Op:name=%s,dir=%lu/%u(%p),intent=%s\n",
560 dentry->d_name.name, parent->i_ino, parent->i_generation,
561 parent, LL_IT2STR(it));
563 if (d_mountpoint(dentry)) {
564 CERROR("Tell Peter, lookup on mtpt, it %s\n", LL_IT2STR(it));
567 rc = ll_intent_lock(parent, &dentry, it, flags, lookup2_finish);
569 CDEBUG(D_INFO, "ll_intent_lock: %d\n", rc);
570 GOTO(out, retval = ERR_PTR(rc));
574 GOTO(out, retval = NULL);
576 GOTO(out, retval = dentry);
581 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
582 static struct dentry *ll_lookup_nd(struct inode *parent, struct dentry *dentry,
583 struct nameidata *nd)
588 if (nd->flags & LOOKUP_LAST && !(nd->flags & LOOKUP_LINK_NOTLAST))
589 de = ll_lookup_it(parent, dentry, &nd->it, nd->flags);
591 de = ll_lookup_it(parent, dentry, NULL, 0);
597 static int ll_mdc_unlink(struct inode *dir, struct inode *child, __u32 mode,
598 const char *name, int len)
600 struct ptlrpc_request *request = NULL;
601 struct mds_body *body;
602 struct lov_mds_md *eadata;
603 struct lov_stripe_md *lsm = NULL;
604 struct obd_trans_info oti = { 0 };
605 struct mdc_op_data op_data;
610 ll_prepare_mdc_op_data(&op_data, dir, child, name, len, mode);
611 rc = mdc_unlink(&ll_i2sbi(dir)->ll_mdc_conn, &op_data, &request);
614 /* req is swabbed so this is safe */
615 body = lustre_msg_buf(request->rq_repmsg, 0, sizeof(*body));
617 if (!(body->valid & OBD_MD_FLEASIZE))
620 if (body->eadatasize == 0) {
621 CERROR("OBD_MD_FLEASIZE set but eadatasize zero\n");
622 GOTO(out, rc = -EPROTO);
625 /* The MDS sent back the EA because we unlinked the last reference
626 * to this file. Use this EA to unlink the objects on the OST.
627 * It's opaque so we don't swab here; we leave it to obd_unpackmd() to
628 * check it is complete and sensible. */
629 eadata = lustre_swab_repbuf(request, 1, body->eadatasize, NULL);
630 LASSERT(eadata != NULL);
631 if (eadata == NULL) {
632 CERROR("Can't unpack MDS EA data\n");
633 GOTO(out, rc = -EPROTO);
636 rc = obd_unpackmd(ll_i2obdconn(dir), &lsm, eadata, body->eadatasize);
638 CERROR("obd_unpackmd: %d\n", rc);
641 LASSERT(rc >= sizeof(*lsm));
645 GOTO(out_free_memmd, rc = -ENOMEM);
647 oa->o_id = lsm->lsm_object_id;
648 oa->o_mode = body->mode & S_IFMT;
649 oa->o_valid = OBD_MD_FLID | OBD_MD_FLTYPE;
651 if (body->valid & OBD_MD_FLCOOKIE) {
652 oa->o_valid |= OBD_MD_FLCOOKIE;
653 oti.oti_logcookies = lustre_msg_buf(request->rq_repmsg, 3,
657 rc = obd_destroy(ll_i2obdconn(dir), oa, lsm, &oti);
660 CERROR("obd destroy objid 0x"LPX64" error %d\n",
661 lsm->lsm_object_id, rc);
663 obd_free_memmd(ll_i2obdconn(dir), &lsm);
665 ptlrpc_req_finished(request);
669 /* We depend on "mode" being set with the proper file type/umask by now */
670 static struct inode *ll_create_node(struct inode *dir, const char *name,
671 int namelen, const void *data, int datalen,
672 int mode, __u64 extra,
673 struct lookup_intent *it)
676 struct ptlrpc_request *request = NULL;
677 struct ll_sb_info *sbi = ll_i2sbi(dir);
682 LASSERT(it && it->it_disposition);
684 ll_invalidate_inode_pages(dir);
686 request = it->it_data;
687 rc = mdc_req2lustre_md(request, 1, &sbi->ll_osc_conn, &md);
689 GOTO(out, inode = ERR_PTR(rc));
692 inode = ll_iget(dir->i_sb, md.body->ino, &md);
693 if (!inode || is_bad_inode(inode)) {
694 /* XXX might need iput() for bad inode */
696 CERROR("new_inode -fatal: rc %d\n", rc);
700 LASSERT(list_empty(&inode->i_dentry));
702 CDEBUG(D_DLMTRACE, "setting l_data to inode %p (%lu/%u)\n",
703 inode, inode->i_ino, inode->i_generation);
704 ldlm_lock_set_data((struct lustre_handle*)it->it_lock_handle,
709 ptlrpc_req_finished(request);
714 * By the time this is called, we already have created the directory cache
715 * entry for the new file, but it is so far negative - it has no inode.
717 * We defer creating the OBD object(s) until open, to keep the intent and
718 * non-intent code paths similar, and also because we do not have the MDS
719 * inode number before calling ll_create_node() (which is needed for LOV),
720 * so we would need to do yet another RPC to the MDS to store the LOV EA
721 * data on the MDS. If needed, we would pass the PACKED lmm as data and
722 * lmm_size in datalen (the MDS still has code which will handle that).
724 * If the create succeeds, we fill in the inode information
725 * with d_instantiate().
727 static int ll_create_it(struct inode *dir, struct dentry *dentry, int mode, struct lookup_intent *it)
730 struct ptlrpc_request *request = it->it_data;
734 CDEBUG(D_VFSTRACE, "VFS Op:name=%s,dir=%lu/%u(%p),intent=%s\n",
735 dentry->d_name.name, dir->i_ino, dir->i_generation, dir,
738 rc = ll_it_open_error(DISP_OPEN_CREATE, it);
740 ptlrpc_req_finished(request);
744 mdc_store_inode_generation(request, 2, 1);
745 inode = ll_create_node(dir, dentry->d_name.name, dentry->d_name.len,
746 NULL, 0, mode, 0, it);
748 RETURN(PTR_ERR(inode));
751 d_instantiate(dentry, inode);
755 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
756 static int ll_create_nd(struct inode *dir, struct dentry *dentry, int mode, struct nameidata *nd)
758 return ll_create_it(dir, dentry, mode, &nd->it);
762 static int ll_mknod_raw(struct nameidata *nd, int mode, dev_t rdev)
764 struct inode *dir = nd->dentry->d_inode;
765 const char *name = nd->last.name;
766 int len = nd->last.len;
767 struct ptlrpc_request *request = NULL;
768 time_t time = LTIME_S(CURRENT_TIME);
769 struct ll_sb_info *sbi = ll_i2sbi(dir);
770 struct mdc_op_data op_data;
774 CDEBUG(D_VFSTRACE, "VFS Op:name=%s,dir=%lu/%u(%p)\n",
775 name, dir->i_ino, dir->i_generation, dir);
777 if (dir->i_nlink >= EXT2_LINK_MAX)
780 mode &= ~current->fs->umask;
782 switch (mode & S_IFMT) {
785 mode |= S_IFREG; /* for mode = 0 case, fallthrough */
790 ll_prepare_mdc_op_data(&op_data, dir, NULL, name, len, 0);
791 err = mdc_create(&sbi->ll_mdc_conn, &op_data, NULL, 0, mode,
792 current->fsuid, current->fsgid, time,
794 ptlrpc_req_finished(request);
805 static int ll_symlink_raw(struct nameidata *nd, const char *tgt)
807 struct inode *dir = nd->dentry->d_inode;
808 const char *name = nd->last.name;
809 int len = nd->last.len;
810 struct ptlrpc_request *request = NULL;
811 time_t time = LTIME_S(CURRENT_TIME);
812 struct ll_sb_info *sbi = ll_i2sbi(dir);
813 struct mdc_op_data op_data;
817 CDEBUG(D_VFSTRACE, "VFS Op:name=%s,dir=%lu/%u(%p),target=%s\n",
818 name, dir->i_ino, dir->i_generation, dir, tgt);
820 if (dir->i_nlink >= EXT2_LINK_MAX)
823 ll_prepare_mdc_op_data(&op_data, dir, NULL, name, len, 0);
824 err = mdc_create(&sbi->ll_mdc_conn, &op_data,
825 tgt, strlen(tgt) + 1, S_IFLNK | S_IRWXUGO,
826 current->fsuid, current->fsgid, time, 0, &request);
827 ptlrpc_req_finished(request);
831 static int ll_link_raw(struct nameidata *srcnd, struct nameidata *tgtnd)
833 struct inode *src = srcnd->dentry->d_inode;
834 struct inode *dir = tgtnd->dentry->d_inode;
835 const char *name = tgtnd->last.name;
836 int len = tgtnd->last.len;
837 struct ptlrpc_request *request = NULL;
838 struct mdc_op_data op_data;
840 struct ll_sb_info *sbi = ll_i2sbi(dir);
843 CDEBUG(D_VFSTRACE, "VFS Op:inode=%lu/%u(%p),dir=%lu/%u(%p),target=%s\n",
844 src->i_ino, src->i_generation, src,
845 dir->i_ino, dir->i_generation, dir, name);
847 ll_prepare_mdc_op_data(&op_data, src, dir, name, len, 0);
848 err = mdc_link(&sbi->ll_mdc_conn, &op_data, &request);
849 ptlrpc_req_finished(request);
855 static int ll_mkdir_raw(struct nameidata *nd, int mode)
857 struct inode *dir = nd->dentry->d_inode;
858 const char *name = nd->last.name;
859 int len = nd->last.len;
860 struct ptlrpc_request *request = NULL;
861 time_t time = LTIME_S(CURRENT_TIME);
862 struct ll_sb_info *sbi = ll_i2sbi(dir);
863 struct mdc_op_data op_data;
866 CDEBUG(D_VFSTRACE, "VFS Op:name=%s,dir=%lu/%u(%p)\n",
867 name, dir->i_ino, dir->i_generation, dir);
869 if (dir->i_nlink >= EXT2_LINK_MAX)
872 mode = (mode & (S_IRWXUGO|S_ISVTX) & ~current->fs->umask) | S_IFDIR;
873 ll_prepare_mdc_op_data(&op_data, dir, NULL, name, len, 0);
874 err = mdc_create(&sbi->ll_mdc_conn, &op_data, NULL, 0, mode,
875 current->fsuid, current->fsgid, time, 0, &request);
876 ptlrpc_req_finished(request);
880 static int ll_rmdir_raw(struct nameidata *nd)
882 struct inode *dir = nd->dentry->d_inode;
883 const char *name = nd->last.name;
884 int len = nd->last.len;
887 CDEBUG(D_VFSTRACE, "VFS Op:name=%s,dir=%lu/%u(%p)\n",
888 name, dir->i_ino, dir->i_generation, dir);
890 rc = ll_mdc_unlink(dir, NULL, S_IFDIR, name, len);
894 static int ll_unlink_raw(struct nameidata *nd)
896 struct inode *dir = nd->dentry->d_inode;
897 const char *name = nd->last.name;
898 int len = nd->last.len;
901 CDEBUG(D_VFSTRACE, "VFS Op:name=%s,dir=%lu/%u(%p)\n",
902 name, dir->i_ino, dir->i_generation, dir);
904 rc = ll_mdc_unlink(dir, NULL, S_IFREG, name, len);
908 static int ll_rename_raw(struct nameidata *oldnd, struct nameidata *newnd)
910 struct inode *src = oldnd->dentry->d_inode;
911 struct inode *tgt = newnd->dentry->d_inode;
912 const char *oldname = oldnd->last.name;
913 int oldlen = oldnd->last.len;
914 const char *newname = newnd->last.name;
915 int newlen = newnd->last.len;
916 struct ptlrpc_request *request = NULL;
917 struct ll_sb_info *sbi = ll_i2sbi(src);
918 struct mdc_op_data op_data;
921 CDEBUG(D_VFSTRACE, "VFS Op:oldname=%s,src_dir=%lu/%u(%p),newname=%s,"
922 "tgt_dir=%lu/%u(%p)\n", oldname, src->i_ino, src->i_generation,
923 src, newname, tgt->i_ino, tgt->i_generation, tgt);
925 ll_prepare_mdc_op_data(&op_data, src, tgt, NULL, 0, 0);
926 err = mdc_rename(&sbi->ll_mdc_conn, &op_data,
927 oldname, oldlen, newname, newlen, &request);
928 ptlrpc_req_finished(request);
933 struct inode_operations ll_dir_inode_operations = {
934 link_raw: ll_link_raw,
935 unlink_raw: ll_unlink_raw,
936 symlink_raw: ll_symlink_raw,
937 mkdir_raw: ll_mkdir_raw,
938 rmdir_raw: ll_rmdir_raw,
939 mknod_raw: ll_mknod_raw,
940 rename_raw: ll_rename_raw,
942 setattr_raw: ll_setattr_raw,
943 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
944 create_it: ll_create_it,
945 lookup_it: ll_lookup_it,
946 revalidate_it: ll_inode_revalidate_it,
948 lookup_it: ll_lookup_nd,
949 create_nd: ll_create_nd,
950 getattr_it: ll_getattr,