Whamcloud - gitweb
LU-5423 llite: pack suppgid to MDS correctly
[fs/lustre-release.git] / lustre / llite / namei.c
index 7770a61..97ea1f1 100644 (file)
@@ -27,7 +27,7 @@
  * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
  *
- * Copyright (c) 2011, 2013, Intel Corporation.
+ * Copyright (c) 2011, 2014, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
 
 #include <obd_support.h>
 #include <lustre_fid.h>
-#include <lustre_lite.h>
 #include <lustre_dlm.h>
 #include <lustre_ver.h>
 #include "llite_internal.h"
 
-static int ll_create_it(struct inode *, struct dentry *,
-                       int, struct lookup_intent *);
-
-/*
- * Check if we have something mounted at the named dchild.
- * In such a case there would always be dentry present.
- */
-static int ll_d_mountpoint(struct dentry *dparent, struct dentry *dchild,
-                          struct qstr *name)
-{
-        int mounted = 0;
-
-        if (unlikely(dchild)) {
-                mounted = d_mountpoint(dchild);
-        } else if (dparent) {
-                dchild = d_lookup(dparent, name);
-                if (dchild) {
-                        mounted = d_mountpoint(dchild);
-                        dput(dchild);
-                }
-        }
-        return mounted;
-}
+static int ll_create_it(struct inode *dir, struct dentry *dentry,
+                       struct lookup_intent *it);
 
 /* called from iget5_locked->find_inode() under inode_lock spinlock */
 static int ll_test_inode(struct inode *inode, void *opaque)
@@ -161,7 +139,6 @@ struct inode *ll_iget(struct super_block *sb, ino_t hash,
                CDEBUG(D_VFSTRACE, "got inode: "DFID"(%p): rc = %d\n",
                       PFID(&md->body->mbo_fid1), inode, rc);
                if (rc != 0) {
-                       make_bad_inode(inode);
                        iput(inode);
                        inode = ERR_PTR(rc);
                }
@@ -439,7 +416,7 @@ struct dentry *ll_splice_alias(struct inode *inode, struct dentry *de)
                        iput(inode);
                        CDEBUG(D_DENTRY,
                               "Reuse dentry %p inode %p refc %d flags %#x\n",
-                             new, new->d_inode, d_count(new), new->d_flags);
+                             new, new->d_inode, ll_d_count(new), new->d_flags);
                        return new;
                }
        }
@@ -448,7 +425,7 @@ struct dentry *ll_splice_alias(struct inode *inode, struct dentry *de)
                return ERR_PTR(rc);
        d_add(de, inode);
        CDEBUG(D_DENTRY, "Add dentry %p inode %p refc %d flags %#x\n",
-              de, de->d_inode, d_count(de), de->d_flags);
+              de, de->d_inode, ll_d_count(de), de->d_flags);
         return de;
 }
 
@@ -536,12 +513,12 @@ static int ll_lookup_it_finish(struct ptlrpc_request *request,
 }
 
 static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
-                                   struct lookup_intent *it, int lookup_flags)
+                                  struct lookup_intent *it)
 {
-        struct lookup_intent lookup_it = { .it_op = IT_LOOKUP };
-        struct dentry *save = dentry, *retval;
-        struct ptlrpc_request *req = NULL;
-        struct md_op_data *op_data;
+       struct lookup_intent lookup_it = { .it_op = IT_LOOKUP };
+       struct dentry *save = dentry, *retval;
+       struct ptlrpc_request *req = NULL;
+       struct md_op_data *op_data = NULL;
         __u32 opc;
         int rc;
         ENTRY;
@@ -559,35 +536,56 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
        if (it == NULL || it->it_op == IT_GETXATTR)
                it = &lookup_it;
 
-        if (it->it_op == IT_GETATTR) {
-                rc = ll_statahead_enter(parent, &dentry, 0);
-                if (rc == 1) {
-                        if (dentry == save)
-                                GOTO(out, retval = NULL);
-                        GOTO(out, retval = dentry);
-                }
-        }
+       if (it->it_op == IT_GETATTR && dentry_may_statahead(parent, dentry)) {
+               rc = ll_statahead(parent, &dentry, 0);
+               if (rc == 1)
+                       RETURN(dentry == save ? NULL : dentry);
+       }
 
        if (it->it_op & IT_CREAT)
                opc = LUSTRE_OPC_CREATE;
        else
                opc = LUSTRE_OPC_ANY;
 
-        op_data = ll_prep_md_op_data(NULL, parent, NULL, dentry->d_name.name,
-                                     dentry->d_name.len, lookup_flags, opc,
-                                     NULL);
-        if (IS_ERR(op_data))
-                RETURN((void *)op_data);
+       op_data = ll_prep_md_op_data(NULL, parent, NULL, dentry->d_name.name,
+                                    dentry->d_name.len, 0, opc, NULL);
+       if (IS_ERR(op_data))
+               RETURN((void *)op_data);
 
-        /* enforce umask if acl disabled or MDS doesn't support umask */
-        if (!IS_POSIXACL(parent) || !exp_connect_umask(ll_i2mdexp(parent)))
+       /* enforce umask if acl disabled or MDS doesn't support umask */
+       if (!IS_POSIXACL(parent) || !exp_connect_umask(ll_i2mdexp(parent)))
                it->it_create_mode &= ~current_umask();
 
        rc = md_intent_lock(ll_i2mdexp(parent), op_data, it, &req,
                            &ll_md_blocking_ast, 0);
-        ll_finish_md_op_data(op_data);
-        if (rc < 0)
-                GOTO(out, retval = ERR_PTR(rc));
+       /* If the MDS allows the client to chgrp (CFS_SETGRP_PERM), but the
+        * client does not know which suppgid should be sent to the MDS, or
+        * some other(s) changed the target file's GID after this RPC sent
+        * to the MDS with the suppgid as the original GID, then we should
+        * try again with right suppgid. */
+       if (rc == -EACCES && it->it_op & IT_OPEN &&
+           it_disposition(it, DISP_OPEN_DENY)) {
+               struct mdt_body *body;
+
+               LASSERT(req != NULL);
+
+               body = req_capsule_server_get(&req->rq_pill, &RMF_MDT_BODY);
+               if (op_data->op_suppgids[0] == body->mbo_gid ||
+                   op_data->op_suppgids[1] == body->mbo_gid ||
+                   !in_group_p(make_kgid(&init_user_ns, body->mbo_gid)))
+                       GOTO(out, retval = ERR_PTR(-EACCES));
+
+               fid_zero(&op_data->op_fid2);
+               op_data->op_suppgids[1] = body->mbo_gid;
+               ptlrpc_req_finished(req);
+               req = NULL;
+               ll_intent_release(it);
+               rc = md_intent_lock(ll_i2mdexp(parent), op_data, it, &req,
+                                   &ll_md_blocking_ast, 0);
+       }
+
+       if (rc < 0)
+               GOTO(out, retval = ERR_PTR(rc));
 
        rc = ll_lookup_it_finish(req, it, parent, &dentry);
         if (rc != 0) {
@@ -602,16 +600,14 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
         }
         ll_lookup_finish_locks(it, dentry);
 
-        if (dentry == save)
-                GOTO(out, retval = NULL);
-        else
-                GOTO(out, retval = dentry);
- out:
-        if (req)
-                ptlrpc_req_finished(req);
-        if (it->it_op == IT_GETATTR && (retval == NULL || retval == dentry))
-                ll_statahead_mark(parent, dentry);
-        return retval;
+       GOTO(out, retval = (dentry == save) ? NULL : dentry);
+
+out:
+       if (op_data != NULL && !IS_ERR(op_data))
+               ll_finish_md_op_data(op_data);
+
+       ptlrpc_req_finished(req);
+       return retval;
 }
 
 #ifdef HAVE_IOP_ATOMIC_OPEN
@@ -633,7 +629,7 @@ static struct dentry *ll_lookup_nd(struct inode *parent, struct dentry *dentry,
                itp = NULL;
        else
                itp = &it;
-       de = ll_lookup_it(parent, dentry, itp, 0);
+       de = ll_lookup_it(parent, dentry, itp);
 
        if (itp != NULL)
                ll_intent_release(itp);
@@ -674,7 +670,7 @@ static int ll_atomic_open(struct inode *dir, struct dentry *dentry,
        it->it_flags &= ~MDS_OPEN_FL_INTERNAL;
 
        /* Dentry added to dcache tree in ll_lookup_it */
-       de = ll_lookup_it(dir, dentry, it, lookup_flags);
+       de = ll_lookup_it(dir, dentry, it);
        if (IS_ERR(de))
                rc = PTR_ERR(de);
        else if (de != NULL)
@@ -683,7 +679,7 @@ static int ll_atomic_open(struct inode *dir, struct dentry *dentry,
        if (!rc) {
                if (it_disposition(it, DISP_OPEN_CREATE)) {
                        /* Dentry instantiated in ll_create_it. */
-                       rc = ll_create_it(dir, dentry, mode, it);
+                       rc = ll_create_it(dir, dentry, it);
                        if (rc) {
                                /* We dget in ll_splice_alias. */
                                if (de != NULL)
@@ -771,7 +767,7 @@ static struct dentry *ll_lookup_nd(struct inode *parent, struct dentry *dentry,
                                 RETURN((struct dentry *)it);
                 }
 
-                de = ll_lookup_it(parent, dentry, it, nd->flags);
+               de = ll_lookup_it(parent, dentry, it);
                 if (de)
                         dentry = de;
                 if ((nd->flags & LOOKUP_OPEN) && !IS_ERR(dentry)) { /* Open */
@@ -812,10 +808,10 @@ static struct dentry *ll_lookup_nd(struct inode *parent, struct dentry *dentry,
                         OBD_FREE(it, sizeof(*it));
                 }
         } else {
-                de = ll_lookup_it(parent, dentry, NULL, 0);
-        }
+               de = ll_lookup_it(parent, dentry, NULL);
+       }
 
-        RETURN(de);
+       RETURN(de);
 }
 #endif /* HAVE_IOP_ATOMIC_OPEN */
 
@@ -865,7 +861,7 @@ static struct inode *ll_create_node(struct inode *dir, struct lookup_intent *it)
  * If the create succeeds, we fill in the inode information
  * with d_instantiate().
  */
-static int ll_create_it(struct inode *dir, struct dentry *dentry, int mode,
+static int ll_create_it(struct inode *dir, struct dentry *dentry,
                        struct lookup_intent *it)
 {
        struct inode *inode;
@@ -907,10 +903,10 @@ void ll_update_times(struct ptlrpc_request *request, struct inode *inode)
                LTIME_S(inode->i_ctime) = body->mbo_ctime;
 }
 
-static int ll_new_node(struct inode *dir, struct qstr *name,
-                       const char *tgt, int mode, int rdev,
-                       struct dentry *dchild, __u32 opc)
+static int ll_new_node(struct inode *dir, struct dentry *dchild,
+                      const char *tgt, umode_t mode, int rdev, __u32 opc)
 {
+       struct qstr *name = &dchild->d_name;
         struct ptlrpc_request *request = NULL;
         struct md_op_data *op_data;
         struct inode *inode = NULL;
@@ -937,13 +933,12 @@ static int ll_new_node(struct inode *dir, struct qstr *name,
 
         ll_update_times(request, dir);
 
-        if (dchild) {
-                err = ll_prep_inode(&inode, request, dchild->d_sb, NULL);
-                if (err)
-                     GOTO(err_exit, err);
+       err = ll_prep_inode(&inode, request, dchild->d_sb, NULL);
+       if (err)
+               GOTO(err_exit, err);
+
+       d_instantiate(dchild, inode);
 
-                d_instantiate(dchild, inode);
-        }
         EXIT;
 err_exit:
         ptlrpc_req_finished(request);
@@ -951,10 +946,11 @@ err_exit:
         return err;
 }
 
-static int ll_mknod_generic(struct inode *dir, struct qstr *name, int mode,
-                            unsigned rdev, struct dentry *dchild)
+static int ll_mknod(struct inode *dir, struct dentry *dchild, ll_umode_t mode,
+                   dev_t rdev)
 {
-        int err;
+       struct qstr *name = &dchild->d_name;
+       int err;
         ENTRY;
 
        CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s, dir="DFID"(%p) mode %o dev %x\n",
@@ -972,8 +968,8 @@ static int ll_mknod_generic(struct inode *dir, struct qstr *name, int mode,
         case S_IFBLK:
         case S_IFIFO:
         case S_IFSOCK:
-                err = ll_new_node(dir, name, NULL, mode, rdev, dchild,
-                                  LUSTRE_OPC_MKNOD);
+               err = ll_new_node(dir, dchild, NULL, mode, old_encode_dev(rdev),
+                                 LUSTRE_OPC_MKNOD);
                 break;
         case S_IFDIR:
                 err = -EPERM;
@@ -1002,7 +998,7 @@ static int ll_create_nd(struct inode *dir, struct dentry *dentry,
               dentry->d_name.name, PFID(ll_inode2fid(dir)),
               dir, mode, want_excl);
 
-       rc = ll_mknod_generic(dir, &dentry->d_name, mode, 0, dentry);
+       rc = ll_mknod(dir, dentry, mode, 0);
 
        ll_stats_ops_tally(ll_i2sbi(dir), LPROC_LL_CREATE, 1);
 
@@ -1023,7 +1019,7 @@ static int ll_create_nd(struct inode *dir, struct dentry *dentry,
                it = lld->lld_it;
 
         if (!it)
-                return ll_mknod_generic(dir, &dentry->d_name, mode, 0, dentry);
+               return ll_mknod(dir, dentry, mode, 0);
 
        lld->lld_it = NULL;
 
@@ -1033,7 +1029,7 @@ static int ll_create_nd(struct inode *dir, struct dentry *dentry,
                 goto out;
         }
 
-        rc = ll_create_it(dir, dentry, mode, it);
+       rc = ll_create_it(dir, dentry, it);
         if (nd && (nd->flags & LOOKUP_OPEN) && dentry->d_inode) { /* Open */
                struct file *filp;
 
@@ -1054,18 +1050,19 @@ out:
 }
 #endif /* HAVE_IOP_ATOMIC_OPEN */
 
-static int ll_symlink_generic(struct inode *dir, struct qstr *name,
-                              const char *tgt, struct dentry *dchild)
+static int ll_symlink(struct inode *dir, struct dentry *dchild,
+                     const char *oldpath)
 {
-        int err;
-        ENTRY;
+       struct qstr *name = &dchild->d_name;
+       int err;
+       ENTRY;
 
        CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s, dir="DFID"(%p), target=%.*s\n",
               name->len, name->name, PFID(ll_inode2fid(dir)),
-              dir, 3000, tgt);
+              dir, 3000, oldpath);
 
-        err = ll_new_node(dir, name, (char *)tgt, S_IFLNK | S_IRWXUGO,
-                          0, dchild, LUSTRE_OPC_SYMLINK);
+       err = ll_new_node(dir, dchild, oldpath, S_IFLNK | S_IRWXUGO, 0,
+                         LUSTRE_OPC_SYMLINK);
 
         if (!err)
                 ll_stats_ops_tally(ll_i2sbi(dir), LPROC_LL_SYMLINK, 1);
@@ -1073,17 +1070,19 @@ static int ll_symlink_generic(struct inode *dir, struct qstr *name,
         RETURN(err);
 }
 
-static int ll_link_generic(struct inode *src,  struct inode *dir,
-                           struct qstr *name, struct dentry *dchild)
+static int ll_link(struct dentry *old_dentry, struct inode *dir,
+                  struct dentry *new_dentry)
 {
-        struct ll_sb_info *sbi = ll_i2sbi(dir);
-        struct ptlrpc_request *request = NULL;
-        struct md_op_data *op_data;
-        int err;
+       struct inode *src = old_dentry->d_inode;
+       struct qstr *name = &new_dentry->d_name;
+       struct ll_sb_info *sbi = ll_i2sbi(dir);
+       struct ptlrpc_request *request = NULL;
+       struct md_op_data *op_data;
+       int err;
 
-        ENTRY;
-       CDEBUG(D_VFSTRACE, "VFS Op: inode="DFID"(%p), dir="DFID
-              "(%p), target=%.*s\n", PFID(ll_inode2fid(src)), src,
+       ENTRY;
+       CDEBUG(D_VFSTRACE, "VFS Op: inode="DFID"(%p), dir="DFID"(%p), "
+              "target=%.*s\n", PFID(ll_inode2fid(src)), src,
               PFID(ll_inode2fid(dir)), dir, name->len, name->name);
 
         op_data = ll_prep_md_op_data(NULL, src, dir, name->name, name->len,
@@ -1104,10 +1103,9 @@ out:
         RETURN(err);
 }
 
-static int ll_mkdir_generic(struct inode *dir, struct qstr *name,
-                            int mode, struct dentry *dchild)
-
+static int ll_mkdir(struct inode *dir, struct dentry *dchild, ll_umode_t mode)
 {
+       struct qstr *name = &dchild->d_name;
         int err;
         ENTRY;
 
@@ -1116,18 +1114,19 @@ static int ll_mkdir_generic(struct inode *dir, struct qstr *name,
 
        if (!IS_POSIXACL(dir) || !exp_connect_umask(ll_i2mdexp(dir)))
                mode &= ~current_umask();
+
        mode = (mode & (S_IRWXUGO|S_ISVTX)) | S_IFDIR;
-       err = ll_new_node(dir, name, NULL, mode, 0, dchild, LUSTRE_OPC_MKDIR);
 
-        if (!err)
-                ll_stats_ops_tally(ll_i2sbi(dir), LPROC_LL_MKDIR, 1);
+       err = ll_new_node(dir, dchild, NULL, mode, 0, LUSTRE_OPC_MKDIR);
+       if (err == 0)
+               ll_stats_ops_tally(ll_i2sbi(dir), LPROC_LL_MKDIR, 1);
 
-        RETURN(err);
+       RETURN(err);
 }
 
-static int ll_rmdir_generic(struct inode *dir, struct dentry *dparent,
-                            struct dentry *dchild, struct qstr *name)
+static int ll_rmdir(struct inode *dir, struct dentry *dchild)
 {
+       struct qstr *name = &dchild->d_name;
         struct ptlrpc_request *request = NULL;
         struct md_op_data *op_data;
         int rc;
@@ -1136,7 +1135,7 @@ static int ll_rmdir_generic(struct inode *dir, struct dentry *dparent,
        CDEBUG(D_VFSTRACE, "VFS Op:name=%.*s, dir="DFID"(%p)\n",
               name->len, name->name, PFID(ll_inode2fid(dir)), dir);
 
-        if (unlikely(ll_d_mountpoint(dparent, dchild, name)))
+       if (unlikely(d_mountpoint(dchild)))
                 RETURN(-EBUSY);
 
         op_data = ll_prep_md_op_data(NULL, dir, NULL, name->name, name->len,
@@ -1144,8 +1143,9 @@ static int ll_rmdir_generic(struct inode *dir, struct dentry *dparent,
         if (IS_ERR(op_data))
                 RETURN(PTR_ERR(op_data));
 
-       if (dchild != NULL && dchild->d_inode != NULL)
+       if (dchild->d_inode != NULL)
                op_data->op_fid3 = *ll_inode2fid(dchild->d_inode);
+
        op_data->op_fid2 = op_data->op_fid3;
         rc = md_unlink(ll_i2sbi(dir)->ll_md_exp, op_data, &request);
         ll_finish_md_op_data(op_data);
@@ -1187,89 +1187,13 @@ int ll_rmdir_entry(struct inode *dir, char *name, int namelen)
        RETURN(rc);
 }
 
-int ll_objects_destroy(struct ptlrpc_request *request, struct inode *dir)
-{
-        struct mdt_body *body;
-        struct lov_mds_md *eadata;
-        struct lov_stripe_md *lsm = NULL;
-        struct obd_trans_info oti = { 0 };
-        struct obdo *oa;
-        struct obd_capa *oc = NULL;
-        int rc;
-        ENTRY;
-
-        /* req is swabbed so this is safe */
-       body = req_capsule_server_get(&request->rq_pill, &RMF_MDT_BODY);
-       if (!(body->mbo_valid & OBD_MD_FLEASIZE))
-               RETURN(0);
-
-       if (body->mbo_eadatasize == 0) {
-                CERROR("OBD_MD_FLEASIZE set but eadatasize zero\n");
-                GOTO(out, rc = -EPROTO);
-        }
-
-        /* The MDS sent back the EA because we unlinked the last reference
-         * to this file. Use this EA to unlink the objects on the OST.
-         * It's opaque so we don't swab here; we leave it to obd_unpackmd() to
-         * check it is complete and sensible. */
-       eadata = req_capsule_server_sized_get(&request->rq_pill, &RMF_MDT_MD,
-                                             body->mbo_eadatasize);
-       LASSERT(eadata != NULL);
-
-       rc = obd_unpackmd(ll_i2dtexp(dir), &lsm, eadata, body->mbo_eadatasize);
-        if (rc < 0) {
-                CERROR("obd_unpackmd: %d\n", rc);
-                GOTO(out, rc);
-        }
-        LASSERT(rc >= sizeof(*lsm));
-
-        OBDO_ALLOC(oa);
-        if (oa == NULL)
-                GOTO(out_free_memmd, rc = -ENOMEM);
-
-       oa->o_oi = lsm->lsm_oi;
-       oa->o_mode = body->mbo_mode & S_IFMT;
-       oa->o_valid = OBD_MD_FLID | OBD_MD_FLTYPE | OBD_MD_FLGROUP;
-
-       if (body->mbo_valid & OBD_MD_FLCOOKIE) {
-                oa->o_valid |= OBD_MD_FLCOOKIE;
-                oti.oti_logcookies =
-                        req_capsule_server_sized_get(&request->rq_pill,
-                                                     &RMF_LOGCOOKIES,
-                                                   sizeof(struct llog_cookie) *
-                                                     lsm->lsm_stripe_count);
-                if (oti.oti_logcookies == NULL) {
-                        oa->o_valid &= ~OBD_MD_FLCOOKIE;
-                       body->mbo_valid &= ~OBD_MD_FLCOOKIE;
-               }
-       }
-
-       if (body->mbo_valid & OBD_MD_FLOSSCAPA) {
-                rc = md_unpack_capa(ll_i2mdexp(dir), request, &RMF_CAPA2, &oc);
-                if (rc)
-                        GOTO(out_free_memmd, rc);
-        }
-
-       rc = obd_destroy(NULL, ll_i2dtexp(dir), oa, lsm, &oti,
-                        ll_i2mdexp(dir), oc);
-       capa_put(oc);
-       if (rc)
-               CERROR("obd destroy objid "DOSTID" error %d\n",
-                      POSTID(&lsm->lsm_oi), rc);
-out_free_memmd:
-       obd_free_memmd(ll_i2dtexp(dir), &lsm);
-       OBDO_FREE(oa);
-out:
-       return rc;
-}
-
-/* ll_unlink_generic() doesn't update the inode with the new link count.
- * Instead, ll_ddelete() and ll_d_iput() will update it based upon if there
- * is any lock existing. They will recycle dentries and inodes based upon locks
- * too. b=20433 */
-static int ll_unlink_generic(struct inode *dir, struct dentry *dparent,
-                             struct dentry *dchild, struct qstr *name)
+/* ll_unlink() doesn't update the inode with the new link count.
+ * Instead, ll_ddelete() and ll_d_iput() will update it based upon if
+ * there is any lock existing. They will recycle dentries and inodes
+ * based upon locks too. b=20433 */
+static int ll_unlink(struct inode *dir, struct dentry *dchild)
 {
+       struct qstr *name = &dchild->d_name;
         struct ptlrpc_request *request = NULL;
         struct md_op_data *op_data;
         int rc;
@@ -1281,15 +1205,15 @@ static int ll_unlink_generic(struct inode *dir, struct dentry *dparent,
          * XXX: unlink bind mountpoint maybe call to here,
          * just check it as vfs_unlink does.
          */
-        if (unlikely(ll_d_mountpoint(dparent, dchild, name)))
-                RETURN(-EBUSY);
+       if (unlikely(d_mountpoint(dchild)))
+               RETURN(-EBUSY);
 
-        op_data = ll_prep_md_op_data(NULL, dir, NULL, name->name,
-                                     name->len, 0, LUSTRE_OPC_ANY, NULL);
-        if (IS_ERR(op_data))
-                RETURN(PTR_ERR(op_data));
+       op_data = ll_prep_md_op_data(NULL, dir, NULL, name->name, name->len, 0,
+                                    LUSTRE_OPC_ANY, NULL);
+       if (IS_ERR(op_data))
+               RETURN(PTR_ERR(op_data));
 
-       if (dchild != NULL && dchild->d_inode != NULL)
+       if (dchild->d_inode != NULL)
                op_data->op_fid3 = *ll_inode2fid(dchild->d_inode);
 
        op_data->op_fid2 = op_data->op_fid3;
@@ -1301,17 +1225,16 @@ static int ll_unlink_generic(struct inode *dir, struct dentry *dparent,
         ll_update_times(request, dir);
         ll_stats_ops_tally(ll_i2sbi(dir), LPROC_LL_UNLINK, 1);
 
-        rc = ll_objects_destroy(request, dir);
  out:
         ptlrpc_req_finished(request);
         RETURN(rc);
 }
 
-static int ll_rename_generic(struct inode *src, struct dentry *src_dparent,
-                             struct dentry *src_dchild, struct qstr *src_name,
-                             struct inode *tgt, struct dentry *tgt_dparent,
-                             struct dentry *tgt_dchild, struct qstr *tgt_name)
+static int ll_rename(struct inode *src, struct dentry *src_dchild,
+                    struct inode *tgt, struct dentry *tgt_dchild)
 {
+       struct qstr *src_name = &src_dchild->d_name;
+       struct qstr *tgt_name = &tgt_dchild->d_name;
         struct ptlrpc_request *request = NULL;
         struct ll_sb_info *sbi = ll_i2sbi(src);
         struct md_op_data *op_data;
@@ -1323,18 +1246,18 @@ static int ll_rename_generic(struct inode *src, struct dentry *src_dparent,
               PFID(ll_inode2fid(src)), src, tgt_name->len,
               tgt_name->name, PFID(ll_inode2fid(tgt)), tgt);
 
-        if (unlikely(ll_d_mountpoint(src_dparent, src_dchild, src_name) ||
-            ll_d_mountpoint(tgt_dparent, tgt_dchild, tgt_name)))
-                RETURN(-EBUSY);
+       if (unlikely(d_mountpoint(src_dchild) || d_mountpoint(tgt_dchild)))
+               RETURN(-EBUSY);
 
-        op_data = ll_prep_md_op_data(NULL, src, tgt, NULL, 0, 0,
-                                     LUSTRE_OPC_ANY, NULL);
-        if (IS_ERR(op_data))
-                RETURN(PTR_ERR(op_data));
+       op_data = ll_prep_md_op_data(NULL, src, tgt, NULL, 0, 0,
+                                    LUSTRE_OPC_ANY, NULL);
+       if (IS_ERR(op_data))
+               RETURN(PTR_ERR(op_data));
 
-       if (src_dchild != NULL && src_dchild->d_inode != NULL)
+       if (src_dchild->d_inode != NULL)
                op_data->op_fid3 = *ll_inode2fid(src_dchild->d_inode);
-       if (tgt_dchild != NULL && tgt_dchild->d_inode != NULL)
+
+       if (tgt_dchild->d_inode != NULL)
                op_data->op_fid4 = *ll_inode2fid(tgt_dchild->d_inode);
 
         err = md_rename(sbi->ll_md_exp, op_data,
@@ -1345,60 +1268,14 @@ static int ll_rename_generic(struct inode *src, struct dentry *src_dparent,
                 ll_update_times(request, src);
                 ll_update_times(request, tgt);
                 ll_stats_ops_tally(sbi, LPROC_LL_RENAME, 1);
-                err = ll_objects_destroy(request, src);
         }
 
         ptlrpc_req_finished(request);
 
-        RETURN(err);
-}
-
-static int ll_mknod(struct inode *dir, struct dentry *dchild, ll_umode_t mode,
-                   dev_t rdev)
-{
-       return ll_mknod_generic(dir, &dchild->d_name, mode,
-                               old_encode_dev(rdev), dchild);
-}
-
-static int ll_unlink(struct inode * dir, struct dentry *dentry)
-{
-        return ll_unlink_generic(dir, NULL, dentry, &dentry->d_name);
-}
-
-static int ll_mkdir(struct inode *dir, struct dentry *dentry, ll_umode_t mode)
-{
-        return ll_mkdir_generic(dir, &dentry->d_name, mode, dentry);
-}
+       if (err == 0)
+               d_move(src_dchild, tgt_dchild);
 
-static int ll_rmdir(struct inode *dir, struct dentry *dentry)
-{
-        return ll_rmdir_generic(dir, NULL, dentry, &dentry->d_name);
-}
-
-static int ll_symlink(struct inode *dir, struct dentry *dentry,
-                      const char *oldname)
-{
-        return ll_symlink_generic(dir, &dentry->d_name, oldname, dentry);
-}
-
-static int ll_link(struct dentry *old_dentry, struct inode *dir,
-                   struct dentry *new_dentry)
-{
-        return ll_link_generic(old_dentry->d_inode, dir, &new_dentry->d_name,
-                               new_dentry);
-}
-
-static int ll_rename(struct inode *old_dir, struct dentry *old_dentry,
-                     struct inode *new_dir, struct dentry *new_dentry)
-{
-        int err;
-        err = ll_rename_generic(old_dir, NULL,
-                                 old_dentry, &old_dentry->d_name,
-                                 new_dir, NULL, new_dentry,
-                                 &new_dentry->d_name);
-       if (!err)
-                        d_move(old_dentry, new_dentry);
-        return err;
+       RETURN(err);
 }
 
 const struct inode_operations ll_dir_inode_operations = {