Messages in this thread |  | | Date | Sat, 14 Jan 2023 16:21:08 +0800 | Subject | Re: [PATCH 1/2] erofs: clean up erofs_iget() | From | Jingbo Xu <> |
| |
On 1/13/23 2:52 PM, Gao Xiang wrote: > Move inode hash function into inode.c and simplify erofs_iget(). > > Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
Since the v2 triggers the compiling error, this v1 is also acceptable for me.
Reviewed-by: Jingbo Xu <jefflexu@linux.alibaba.com>
> --- > fs/erofs/inode.c | 40 +++++++++++++++++++++------------------- > fs/erofs/internal.h | 9 --------- > 2 files changed, 21 insertions(+), 28 deletions(-) > > diff --git a/fs/erofs/inode.c b/fs/erofs/inode.c > index d3b8736fa124..57328691582e 100644 > --- a/fs/erofs/inode.c > +++ b/fs/erofs/inode.c > @@ -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(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; > } > diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h > index bb8501c0ff5b..168c21f16383 100644 > --- a/fs/erofs/internal.h > +++ b/fs/erofs/internal.h > @@ -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;
-- Thanks, Jingbo
|  |