erofs: clean up erofs_iget()
authorGao Xiang <hsiangkao@linux.alibaba.com>
Fri, 13 Jan 2023 06:52:25 +0000 (14:52 +0800)
committerGao Xiang <hsiangkao@linux.alibaba.com>
Wed, 15 Feb 2023 00:10:46 +0000 (08:10 +0800)
Move inode hash function into inode.c and simplify erofs_iget().

Link: https://lore.kernel.org/r/20230113065226.68801-1-hsiangkao@linux.alibaba.com
Reviewed-by: Yue Hu <huyue2@coolpad.com>
Reviewed-by: Jingbo Xu <jefflexu@linux.alibaba.com>
Reviewed-by: Chao Yu <chao@kernel.org>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
fs/erofs/inode.c
fs/erofs/internal.h

index d3b8736..5732869 100644 (file)
@@ -308,47 +308,49 @@ out_unlock:
 }
 
 /*
- * erofs nid is 64bits, but i_ino is 'unsigned long', therefore
- * we should do more for 32-bit platform to find the right inode.
+ * ino_t is 32-bits on 32-bit arch. We have to squash the 64-bit value down
+ * so that it will fit.
  */
-static int erofs_ilookup_test_actor(struct inode *inode, void *opaque)
+static ino_t erofs_squash_ino(erofs_nid_t nid)
 {
-       const erofs_nid_t nid = *(erofs_nid_t *)opaque;
+       ino_t ino = (ino_t)nid;
+
+       if (sizeof(ino_t) < sizeof(erofs_nid_t))
+               ino ^= nid >> (sizeof(erofs_nid_t) - sizeof(ino_t)) * 8;
+       return ino;
+}
 
-       return EROFS_I(inode)->nid == nid;
+static int erofs_iget5_eq(struct inode *inode, void *opaque)
+{
+       return EROFS_I(inode)->nid == *(erofs_nid_t *)opaque;
 }
 
-static int erofs_iget_set_actor(struct inode *inode, void *opaque)
+static int erofs_iget5_set(struct inode *inode, void *opaque)
 {
        const erofs_nid_t nid = *(erofs_nid_t *)opaque;
 
-       inode->i_ino = erofs_inode_hash(nid);
+       inode->i_ino = erofs_squash_ino(nid);
+       EROFS_I(inode)->nid = nid;
        return 0;
 }
 
 struct inode *erofs_iget(struct super_block *sb, erofs_nid_t nid)
 {
-       const unsigned long hashval = erofs_inode_hash(nid);
        struct inode *inode;
 
-       inode = iget5_locked(sb, hashval, erofs_ilookup_test_actor,
-               erofs_iget_set_actor, &nid);
+       inode = iget5_locked(sb, erofs_squash_ino(nid), erofs_iget5_eq,
+                            erofs_iget5_set, &nid);
        if (!inode)
                return ERR_PTR(-ENOMEM);
 
        if (inode->i_state & I_NEW) {
-               int err;
-               struct erofs_inode *vi = EROFS_I(inode);
-
-               vi->nid = nid;
+               int err = erofs_fill_inode(inode);
 
-               err = erofs_fill_inode(inode);
-               if (!err) {
-                       unlock_new_inode(inode);
-               } else {
+               if (err) {
                        iget_failed(inode);
-                       inode = ERR_PTR(err);
+                       return ERR_PTR(err);
                }
+               unlock_new_inode(inode);
        }
        return inode;
 }
index bb8501c..168c21f 100644 (file)
@@ -480,15 +480,6 @@ int erofs_map_blocks(struct inode *inode,
                     struct erofs_map_blocks *map, int flags);
 
 /* inode.c */
-static inline unsigned long erofs_inode_hash(erofs_nid_t nid)
-{
-#if BITS_PER_LONG == 32
-       return (nid >> 32) ^ (nid & 0xffffffff);
-#else
-       return nid;
-#endif
-}
-
 extern const struct inode_operations erofs_generic_iops;
 extern const struct inode_operations erofs_symlink_iops;
 extern const struct inode_operations erofs_fast_symlink_iops;