Skip to content

Commit

Permalink
erofs: cleanup erofs_iget()
Browse files Browse the repository at this point in the history
Move inode hash function into inode.c and simplify erofs_iget().
No logic changes.

Reviewed-by: Yue Hu <huyue2@coolpad.com>
Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
  • Loading branch information
hsiangkao authored and intel-lab-lkp committed Jan 14, 2023
1 parent 35626ac commit ede350f
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 28 deletions.
40 changes: 21 additions & 19 deletions fs/erofs/inode.c
Expand Up @@ -308,47 +308,49 @@ static int erofs_fill_inode(struct inode *inode)
}

/*
* 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(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;
}
Expand Down
9 changes: 0 additions & 9 deletions fs/erofs/internal.h
Expand Up @@ -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;
Expand Down

0 comments on commit ede350f

Please sign in to comment.