On Thu, Apr 1, 2021 at 11:46 AM Andrew Price <[email protected]> wrote:
> On 01/04/2021 10:18, Andreas Gruenbacher wrote:
> > Convert gfs2_extent_map to iomap and split it into gfs2_get_extent and
> > gfs2_alloc_extent.  Instead of hardcoding the extent size, pass it in
> > via the extlen parameter.
> >
> > Signed-off-by: Andreas Gruenbacher <[email protected]>
> > ---
> >   fs/gfs2/bmap.c     | 59 ++++++++++++++++++++++++++++++----------------
> >   fs/gfs2/bmap.h     |  6 +++--
> >   fs/gfs2/dir.c      | 13 +++++-----
> >   fs/gfs2/quota.c    |  4 ++--
> >   fs/gfs2/recovery.c |  4 ++--
> >   5 files changed, 53 insertions(+), 33 deletions(-)
> >
> > diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c
> > index cc12dc0d6955..ac959a99ea81 100644
> > --- a/fs/gfs2/bmap.c
> > +++ b/fs/gfs2/bmap.c
> > @@ -1320,28 +1320,47 @@ int gfs2_block_map(struct inode *inode, sector_t 
> > lblock,
> >       return ret;
> >   }
> >
> > -/*
> > - * Deprecated: do not use in new code
> > - */
> > -int gfs2_extent_map(struct inode *inode, u64 lblock, int *new, u64 
> > *dblock, unsigned *extlen)
> > +int gfs2_get_extent(struct inode *inode, u64 lblock, u64 *dblock,
> > +                 unsigned int *extlen)
> >   {
> > -     struct buffer_head bh = { .b_state = 0, .b_blocknr = 0 };
> > +     unsigned int blkbits = inode->i_blkbits;
> > +     struct iomap iomap = { };
> > +     unsigned int len;
> >       int ret;
> > -     int create = *new;
> > -
> > -     BUG_ON(!extlen);
> > -     BUG_ON(!dblock);
> > -     BUG_ON(!new);
> > -
> > -     bh.b_size = BIT(inode->i_blkbits + (create ? 0 : 5));
> > -     ret = gfs2_block_map(inode, lblock, &bh, create);
> > -     *extlen = bh.b_size >> inode->i_blkbits;
> > -     *dblock = bh.b_blocknr;
> > -     if (buffer_new(&bh))
> > -             *new = 1;
> > -     else
> > -             *new = 0;
> > -     return ret;
> > +
> > +     ret = gfs2_iomap_get(inode, lblock << blkbits, *extlen << blkbits,
> > +                          &iomap);
> > +     if (ret)
> > +             return ret;
> > +     if (iomap.type != IOMAP_MAPPED)
> > +             return -EIO;
> > +     *dblock = iomap.addr >> blkbits;
> > +     len = iomap.length >> blkbits;
> > +     if (len < *extlen)
> > +             *extlen = len;
> > +     return 0;
> > +}
> > +
> > +int gfs2_alloc_extent(struct inode *inode, u64 lblock, u64 *dblock,
> > +                   unsigned int *extlen, bool *new)
> > +{
> > +     unsigned int blkbits = inode->i_blkbits;
> > +     struct iomap iomap = { };
> > +     unsigned int len;
> > +     int ret;
> > +
> > +     ret = gfs2_iomap_alloc(inode, lblock << blkbits, *extlen << blkbits,
> > +                            &iomap);
> > +     if (ret)
> > +             return ret;
> > +     if (iomap.type != IOMAP_MAPPED)
> > +             return -EIO;
> > +     *dblock = iomap.addr >> blkbits;
> > +     len = iomap.length >> blkbits;
> > +     if (len < *extlen)
> > +             *extlen = len;
> > +     *new = iomap.flags & IOMAP_F_NEW;
>
> As *new is bool, shouldn't this be !!(iomap.flags & IOMAP_F_NEW) or similar?

That's implied with type bool (but not with integer types). For example,

  (bool)(1L << (8 * sizeof(long) - 1))

is always 1.

> Otherwise, the set looks good to me.
>
> Andy
>
> > +     return 0;
> >   }
> >
> >   /*
> > diff --git a/fs/gfs2/bmap.h b/fs/gfs2/bmap.h
> > index c63efee8aaa4..67ef7cf7fdac 100644
> > --- a/fs/gfs2/bmap.h
> > +++ b/fs/gfs2/bmap.h
> > @@ -53,8 +53,10 @@ extern int gfs2_iomap_get(struct inode *inode, loff_t 
> > pos, loff_t length,
> >                         struct iomap *iomap);
> >   extern int gfs2_iomap_alloc(struct inode *inode, loff_t pos, loff_t 
> > length,
> >                           struct iomap *iomap);
> > -extern int gfs2_extent_map(struct inode *inode, u64 lblock, int *new,
> > -                        u64 *dblock, unsigned *extlen);
> > +extern int gfs2_get_extent(struct inode *inode, u64 lblock, u64 *dblock,
> > +                        unsigned int *extlen);
> > +extern int gfs2_alloc_extent(struct inode *inode, u64 lblock, u64 *dblock,
> > +                          unsigned *extlen, bool *new);
> >   extern int gfs2_setattr_size(struct inode *inode, u64 size);
> >   extern void gfs2_trim_blocks(struct inode *inode);
> >   extern int gfs2_truncatei_resume(struct gfs2_inode *ip);
> > diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c
> > index c0f2875c946c..4517ffb7c13d 100644
> > --- a/fs/gfs2/dir.c
> > +++ b/fs/gfs2/dir.c
> > @@ -159,7 +159,7 @@ static int gfs2_dir_write_data(struct gfs2_inode *ip, 
> > const char *buf,
> >       unsigned int o;
> >       int copied = 0;
> >       int error = 0;
> > -     int new = 0;
> > +     bool new = false;
> >
> >       if (!size)
> >               return 0;
> > @@ -189,9 +189,9 @@ static int gfs2_dir_write_data(struct gfs2_inode *ip, 
> > const char *buf,
> >                       amount = sdp->sd_sb.sb_bsize - o;
> >
> >               if (!extlen) {
> > -                     new = 1;
> > -                     error = gfs2_extent_map(&ip->i_inode, lblock, &new,
> > -                                             &dblock, &extlen);
> > +                     extlen = 1;
> > +                     error = gfs2_alloc_extent(&ip->i_inode, lblock, 
> > &dblock,
> > +                                               &extlen, &new);
> >                       if (error)
> >                               goto fail;
> >                       error = -EIO;
> > @@ -286,15 +286,14 @@ static int gfs2_dir_read_data(struct gfs2_inode *ip, 
> > __be64 *buf,
> >       while (copied < size) {
> >               unsigned int amount;
> >               struct buffer_head *bh;
> > -             int new;
> >
> >               amount = size - copied;
> >               if (amount > sdp->sd_sb.sb_bsize - o)
> >                       amount = sdp->sd_sb.sb_bsize - o;
> >
> >               if (!extlen) {
> > -                     new = 0;
> > -                     error = gfs2_extent_map(&ip->i_inode, lblock, &new,
> > +                     extlen = 32;
> > +                     error = gfs2_get_extent(&ip->i_inode, lblock,
> >                                               &dblock, &extlen);
> >                       if (error || !dblock)
> >                               goto fail;
> > diff --git a/fs/gfs2/quota.c b/fs/gfs2/quota.c
> > index 6e173ae378c4..9b1aca7e1264 100644
> > --- a/fs/gfs2/quota.c
> > +++ b/fs/gfs2/quota.c
> > @@ -1375,8 +1375,8 @@ int gfs2_quota_init(struct gfs2_sbd *sdp)
> >               unsigned int y;
> >
> >               if (!extlen) {
> > -                     int new = 0;
> > -                     error = gfs2_extent_map(&ip->i_inode, x, &new, 
> > &dblock, &extlen);
> > +                     extlen = 32;
> > +                     error = gfs2_get_extent(&ip->i_inode, x, &dblock, 
> > &extlen);
> >                       if (error)
> >                               goto fail;
> >               }
> > diff --git a/fs/gfs2/recovery.c b/fs/gfs2/recovery.c
> > index 282173774005..4ab4cdbf774a 100644
> > --- a/fs/gfs2/recovery.c
> > +++ b/fs/gfs2/recovery.c
> > @@ -34,12 +34,12 @@ int gfs2_replay_read_block(struct gfs2_jdesc *jd, 
> > unsigned int blk,
> >   {
> >       struct gfs2_inode *ip = GFS2_I(jd->jd_inode);
> >       struct gfs2_glock *gl = ip->i_gl;
> > -     int new = 0;
> >       u64 dblock;
> >       u32 extlen;
> >       int error;
> >
> > -     error = gfs2_extent_map(&ip->i_inode, blk, &new, &dblock, &extlen);
> > +     extlen = 32;
> > +     error = gfs2_get_extent(&ip->i_inode, blk, &dblock, &extlen);
> >       if (error)
> >               return error;
> >       if (!dblock) {
> >
>

Thanks,
Andreas

Reply via email to