Whamcloud - gitweb
LU-2675 obd: decruft md_enqueue() and md_intent_lock()
[fs/lustre-release.git] / lustre / llite / namei.c
index da02c9f..69da17e 100644 (file)
@@ -59,7 +59,7 @@ static int ll_create_it(struct inode *, struct dentry *,
  * In such a case there would always be dentry present.
  */
 static int ll_d_mountpoint(struct dentry *dparent, struct dentry *dchild,
-                           struct qstr *name)
+                          struct qstr *name)
 {
         int mounted = 0;
 
@@ -75,16 +75,6 @@ static int ll_d_mountpoint(struct dentry *dparent, struct dentry *dchild,
         return mounted;
 }
 
-int ll_unlock(__u32 mode, struct lustre_handle *lockh)
-{
-        ENTRY;
-
-        ldlm_lock_decref(lockh, mode);
-
-        RETURN(0);
-}
-
-
 /* called from iget5_locked->find_inode() under inode_lock spinlock */
 static int ll_test_inode(struct inode *inode, void *opaque)
 {
@@ -131,44 +121,51 @@ static int ll_set_inode(struct inode *inode, void *opaque)
 }
 
 
-/*
- * Get an inode by inode number (already instantiated by the intent lookup).
- * Returns inode or NULL
+/**
+ * Get an inode by inode number(@hash), which is already instantiated by
+ * the intent lookup).
  */
 struct inode *ll_iget(struct super_block *sb, ino_t hash,
                       struct lustre_md *md)
 {
-        struct inode         *inode;
-        ENTRY;
+       struct inode    *inode;
+       int             rc = 0;
+
+       ENTRY;
 
         LASSERT(hash != 0);
         inode = iget5_locked(sb, hash, ll_test_inode, ll_set_inode, md);
+       if (inode == NULL)
+               RETURN(ERR_PTR(-ENOMEM));
+
+       if (inode->i_state & I_NEW) {
+               rc = ll_read_inode2(inode, md);
+               if (rc == 0 && S_ISREG(inode->i_mode) &&
+                   ll_i2info(inode)->lli_clob == NULL) {
+                       CDEBUG(D_INODE, "%s: apply lsm %p to inode "DFID"\n",
+                               ll_get_fsname(sb, NULL, 0), md->lsm,
+                               PFID(ll_inode2fid(inode)));
+                       rc = cl_file_inode_init(inode, md);
+               }
+               if (rc != 0) {
+                       make_bad_inode(inode);
+                       unlock_new_inode(inode);
+                       iput(inode);
+                       inode = ERR_PTR(rc);
+               } else {
+                       unlock_new_inode(inode);
+               }
+       } else if (!(inode->i_state & (I_FREEING | I_CLEAR))) {
+               rc = ll_update_inode(inode, md);
+               CDEBUG(D_VFSTRACE, "got inode: "DFID"(%p): rc = %d\n",
+                      PFID(&md->body->fid1), inode, rc);
+               if (rc != 0) {
+                       make_bad_inode(inode);
+                       iput(inode);
+                       inode = ERR_PTR(rc);
+               }
+       }
 
-        if (inode) {
-                if (inode->i_state & I_NEW) {
-                        int rc = 0;
-
-                        ll_read_inode2(inode, md);
-                        if (S_ISREG(inode->i_mode) &&
-                            ll_i2info(inode)->lli_clob == NULL) {
-                               CDEBUG(D_INODE,
-                                       "%s: apply lsm %p to inode "DFID".\n",
-                                       ll_get_fsname(sb, NULL, 0), md->lsm,
-                                       PFID(ll_inode2fid(inode)));
-                                rc = cl_file_inode_init(inode, md);
-                       }
-                        if (rc != 0) {
-                                make_bad_inode(inode);
-                                unlock_new_inode(inode);
-                                iput(inode);
-                                inode = ERR_PTR(rc);
-                        } else
-                                unlock_new_inode(inode);
-                } else if (!(inode->i_state & (I_FREEING | I_CLEAR)))
-                        ll_update_inode(inode, md);
-                       CDEBUG(D_VFSTRACE, "got inode: "DFID"(%p)\n",
-                              PFID(&md->body->fid1), inode);
-        }
         RETURN(inode);
 }
 
@@ -350,9 +347,9 @@ int ll_md_blocking_ast(struct ldlm_lock *lock, struct ldlm_lock_desc *desc,
 __u32 ll_i2suppgid(struct inode *i)
 {
        if (in_group_p(i->i_gid))
-               return (__u32)i->i_gid;
+               return (__u32)from_kgid(&init_user_ns, i->i_gid);
        else
-               return (__u32)(-1);
+               return (__u32) __kgid_val(INVALID_GID);
 }
 
 /* Pack the required supplementary groups into the supplied groups array.
@@ -361,35 +358,15 @@ __u32 ll_i2suppgid(struct inode *i)
  * array in case it might be useful.  Not needed if doing an MDS-side upcall. */
 void ll_i2gids(__u32 *suppgids, struct inode *i1, struct inode *i2)
 {
-#if 0
-        int i;
-#endif
-
-        LASSERT(i1 != NULL);
-        LASSERT(suppgids != NULL);
-
-        suppgids[0] = ll_i2suppgid(i1);
+       LASSERT(i1 != NULL);
+       LASSERT(suppgids != NULL);
 
-        if (i2)
-                suppgids[1] = ll_i2suppgid(i2);
-                else
-                        suppgids[1] = -1;
+       suppgids[0] = ll_i2suppgid(i1);
 
-#if 0
-        for (i = 0; i < current_ngroups; i++) {
-                if (suppgids[0] == -1) {
-                        if (current_groups[i] != suppgids[1])
-                                suppgids[0] = current_groups[i];
-                        continue;
-                }
-                if (suppgids[1] == -1) {
-                        if (current_groups[i] != suppgids[0])
-                                suppgids[1] = current_groups[i];
-                        continue;
-                }
-                break;
-        }
-#endif
+       if (i2)
+               suppgids[1] = ll_i2suppgid(i2);
+       else
+               suppgids[1] = -1;
 }
 
 /*
@@ -474,12 +451,10 @@ struct dentry *ll_splice_alias(struct inode *inode, struct dentry *de)
         return de;
 }
 
-int ll_lookup_it_finish(struct ptlrpc_request *request,
-                        struct lookup_intent *it, void *data)
+static int ll_lookup_it_finish(struct ptlrpc_request *request,
+                              struct lookup_intent *it,
+                              struct inode *parent, struct dentry **de)
 {
-       struct it_cb_data        *icbd = data;
-       struct dentry           **de = icbd->icbd_childp;
-       struct inode             *parent = icbd->icbd_parent;
        struct inode             *inode = NULL;
        __u64                     bits = 0;
        int                       rc;
@@ -555,7 +530,6 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
         struct dentry *save = dentry, *retval;
         struct ptlrpc_request *req = NULL;
         struct md_op_data *op_data;
-        struct it_cb_data icbd;
         __u32 opc;
         int rc;
         ENTRY;
@@ -570,7 +544,8 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
         if (d_mountpoint(dentry))
                 CERROR("Tell Peter, lookup on mtpt, it %s\n", LL_IT2STR(it));
 
-        ll_frob_intent(&it, &lookup_it);
+       if (it == NULL || it->it_op == IT_GETXATTR)
+               it = &lookup_it;
 
         if (it->it_op == IT_GETATTR) {
                 rc = ll_statahead_enter(parent, &dentry, 0);
@@ -581,9 +556,6 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
                 }
         }
 
-        icbd.icbd_childp = &dentry;
-        icbd.icbd_parent = parent;
-
        if (it->it_op & IT_CREAT)
                opc = LUSTRE_OPC_CREATE;
        else
@@ -599,13 +571,13 @@ static struct dentry *ll_lookup_it(struct inode *parent, struct dentry *dentry,
         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, NULL, 0, it,
-                            lookup_flags, &req, ll_md_blocking_ast, 0);
+       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));
 
-        rc = ll_lookup_it_finish(req, it, &icbd);
+       rc = ll_lookup_it_finish(req, it, parent, &dentry);
         if (rc != 0) {
                 ll_intent_release(it);
                 GOTO(out, retval = ERR_PTR(rc));
@@ -741,8 +713,8 @@ out_release:
 }
 
 #else /* !HAVE_IOP_ATOMIC_OPEN */
-struct lookup_intent *ll_convert_intent(struct open_intent *oit,
-                                        int lookup_flags)
+static struct lookup_intent *
+ll_convert_intent(struct open_intent *oit, int lookup_flags)
 {
        struct lookup_intent *it;
 
@@ -834,10 +806,7 @@ static struct dentry *ll_lookup_nd(struct inode *parent, struct dentry *dentry,
 #endif /* HAVE_IOP_ATOMIC_OPEN */
 
 /* We depend on "mode" being set with the proper file type/umask by now */
-static struct inode *ll_create_node(struct inode *dir, const char *name,
-                                    int namelen, const void *data, int datalen,
-                                    int mode, __u64 extra,
-                                    struct lookup_intent *it)
+static struct inode *ll_create_node(struct inode *dir, struct lookup_intent *it)
 {
         struct inode *inode = NULL;
         struct ptlrpc_request *request = NULL;
@@ -897,20 +866,15 @@ static int ll_create_it(struct inode *dir, struct dentry *dentry, int mode,
        if (rc)
                RETURN(rc);
 
-       inode = ll_create_node(dir, dentry->d_name.name, dentry->d_name.len,
-                              NULL, 0, mode, 0, it);
+       inode = ll_create_node(dir, it);
        if (IS_ERR(inode))
                RETURN(PTR_ERR(inode));
 
-       if (filename_is_volatile(dentry->d_name.name, dentry->d_name.len, NULL))
-               ll_i2info(inode)->lli_volatile = true;
-
        d_instantiate(dentry, inode);
        RETURN(0);
 }
 
-static void ll_update_times(struct ptlrpc_request *request,
-                            struct inode *inode)
+void ll_update_times(struct ptlrpc_request *request, struct inode *inode)
 {
         struct mdt_body *body = req_capsule_server_get(&request->rq_pill,
                                                        &RMF_MDT_BODY);
@@ -949,7 +913,8 @@ static int ll_new_node(struct inode *dir, struct qstr *name,
                 GOTO(err_exit, err = PTR_ERR(op_data));
 
        err = md_create(sbi->ll_md_exp, op_data, tgt, tgt_len, mode,
-                       current_fsuid(), current_fsgid(),
+                       from_kuid(&init_user_ns, current_fsuid()),
+                       from_kgid(&init_user_ns, current_fsgid()),
                        cfs_curproc_cap_pack(), rdev, &request);
        ll_finish_md_op_data(op_data);
         if (err)
@@ -1421,7 +1386,7 @@ static int ll_rename(struct inode *old_dir, struct dentry *old_dentry,
         return err;
 }
 
-struct inode_operations ll_dir_inode_operations = {
+const struct inode_operations ll_dir_inode_operations = {
        .mknod              = ll_mknod,
 #ifdef HAVE_IOP_ATOMIC_OPEN
        .atomic_open        = ll_atomic_open,
@@ -1447,7 +1412,7 @@ struct inode_operations ll_dir_inode_operations = {
 #endif
 };
 
-struct inode_operations ll_special_inode_operations = {
+const struct inode_operations ll_special_inode_operations = {
        .setattr        = ll_setattr,
        .getattr        = ll_getattr,
        .permission     = ll_inode_permission,