mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 20:54:10 +08:00
erofs: clean up erofs_iget()
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>
This commit is contained in:
parent
2241ab53cb
commit
7c3511a2c8
@ -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;
|
||||
|
||||
return EROFS_I(inode)->nid == nid;
|
||||
if (sizeof(ino_t) < sizeof(erofs_nid_t))
|
||||
ino ^= nid >> (sizeof(erofs_nid_t) - sizeof(ino_t)) * 8;
|
||||
return ino;
|
||||
}
|
||||
|
||||
static int erofs_iget_set_actor(struct inode *inode, void *opaque)
|
||||
static int erofs_iget5_eq(struct inode *inode, void *opaque)
|
||||
{
|
||||
return EROFS_I(inode)->nid == *(erofs_nid_t *)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);
|
||||
int err = erofs_fill_inode(inode);
|
||||
|
||||
vi->nid = nid;
|
||||
|
||||
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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user