Message ID | 20200917051341.9811-3-hsiangkao@redhat.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | xfs: random patches on log recovery | expand |
On Thu, Sep 17, 2020 at 01:13:41PM +0800, Gao Xiang wrote: > Let's use DIV_ROUND_UP() to calculate log record header > blocks as what did in xlog_get_iclog_buffer_size() and > wrap up a common helper for log recovery. > > Signed-off-by: Gao Xiang <hsiangkao@redhat.com> > --- > v2: https://lore.kernel.org/r/20200904082516.31205-3-hsiangkao@redhat.com > > changes since v2: > - get rid of xlog_logrecv2_hblks() and use xlog_logrec_hblks() > entirely (Brian). > > fs/xfs/xfs_log.c | 4 +--- > fs/xfs/xfs_log_recover.c | 48 ++++++++++++++-------------------------- > 2 files changed, 17 insertions(+), 35 deletions(-) > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > index ad0c69ee8947..7a4ba408a3a2 100644 > --- a/fs/xfs/xfs_log.c > +++ b/fs/xfs/xfs_log.c > @@ -1604,9 +1604,7 @@ xlog_cksum( > int i; > int xheads; > > - xheads = size / XLOG_HEADER_CYCLE_SIZE; > - if (size % XLOG_HEADER_CYCLE_SIZE) > - xheads++; > + xheads = DIV_ROUND_UP(size, XLOG_HEADER_CYCLE_SIZE); > > for (i = 1; i < xheads; i++) { > crc = crc32c(crc, &xhdr[i].hic_xheader, > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > index 782ec3eeab4d..28dd98b5a703 100644 > --- a/fs/xfs/xfs_log_recover.c > +++ b/fs/xfs/xfs_log_recover.c > @@ -371,6 +371,18 @@ xlog_find_verify_cycle( > return error; > } > > +static inline int xlog_logrec_hblks(struct xlog *log, xlog_rec_header_t *rh) > +{ We're trying to gradually eliminate various structure typedefs so it's frowned upon to introduce new instances. If you replace the above with 'struct xlog_rec_header,' the rest looks good to me: Reviewed-by: Brian Foster <bfoster@redhat.com> > + if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { > + int h_size = be32_to_cpu(rh->h_size); > + > + if ((be32_to_cpu(rh->h_version) & XLOG_VERSION_2) && > + h_size > XLOG_HEADER_CYCLE_SIZE) > + return DIV_ROUND_UP(h_size, XLOG_HEADER_CYCLE_SIZE); > + } > + return 1; > +} > + > /* > * Potentially backup over partial log record write. > * > @@ -463,15 +475,7 @@ xlog_find_verify_log_record( > * reset last_blk. Only when last_blk points in the middle of a log > * record do we update last_blk. > */ > - if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { > - uint h_size = be32_to_cpu(head->h_size); > - > - xhdrs = h_size / XLOG_HEADER_CYCLE_SIZE; > - if (h_size % XLOG_HEADER_CYCLE_SIZE) > - xhdrs++; > - } else { > - xhdrs = 1; > - } > + xhdrs = xlog_logrec_hblks(log, head); > > if (*last_blk - i + extra_bblks != > BTOBB(be32_to_cpu(head->h_len)) + xhdrs) > @@ -1158,22 +1162,7 @@ xlog_check_unmount_rec( > * below. We won't want to clear the unmount record if there is one, so > * we pass the lsn of the unmount record rather than the block after it. > */ > - if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { > - int h_size = be32_to_cpu(rhead->h_size); > - int h_version = be32_to_cpu(rhead->h_version); > - > - if ((h_version & XLOG_VERSION_2) && > - (h_size > XLOG_HEADER_CYCLE_SIZE)) { > - hblks = h_size / XLOG_HEADER_CYCLE_SIZE; > - if (h_size % XLOG_HEADER_CYCLE_SIZE) > - hblks++; > - } else { > - hblks = 1; > - } > - } else { > - hblks = 1; > - } > - > + hblks = xlog_logrec_hblks(log, rhead); > after_umount_blk = xlog_wrap_logbno(log, > rhead_blk + hblks + BTOBB(be32_to_cpu(rhead->h_len))); > > @@ -2989,15 +2978,10 @@ xlog_do_recovery_pass( > if (error) > goto bread_err1; > > - if ((be32_to_cpu(rhead->h_version) & XLOG_VERSION_2) && > - (h_size > XLOG_HEADER_CYCLE_SIZE)) { > - hblks = h_size / XLOG_HEADER_CYCLE_SIZE; > - if (h_size % XLOG_HEADER_CYCLE_SIZE) > - hblks++; > + hblks = xlog_logrec_hblks(log, rhead); > + if (hblks != 1) { > kmem_free(hbp); > hbp = xlog_alloc_buffer(log, hblks); > - } else { > - hblks = 1; > } > } else { > ASSERT(log->l_sectBBsize == 1); > -- > 2.18.1 >
Hi Brian, On Tue, Sep 22, 2020 at 11:22:48AM -0400, Brian Foster wrote: > On Thu, Sep 17, 2020 at 01:13:41PM +0800, Gao Xiang wrote: > > Let's use DIV_ROUND_UP() to calculate log record header > > blocks as what did in xlog_get_iclog_buffer_size() and > > wrap up a common helper for log recovery. > > > > Signed-off-by: Gao Xiang <hsiangkao@redhat.com> > > --- > > v2: https://lore.kernel.org/r/20200904082516.31205-3-hsiangkao@redhat.com > > > > changes since v2: > > - get rid of xlog_logrecv2_hblks() and use xlog_logrec_hblks() > > entirely (Brian). > > > > fs/xfs/xfs_log.c | 4 +--- > > fs/xfs/xfs_log_recover.c | 48 ++++++++++++++-------------------------- > > 2 files changed, 17 insertions(+), 35 deletions(-) > > > > diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c > > index ad0c69ee8947..7a4ba408a3a2 100644 > > --- a/fs/xfs/xfs_log.c > > +++ b/fs/xfs/xfs_log.c > > @@ -1604,9 +1604,7 @@ xlog_cksum( > > int i; > > int xheads; > > > > - xheads = size / XLOG_HEADER_CYCLE_SIZE; > > - if (size % XLOG_HEADER_CYCLE_SIZE) > > - xheads++; > > + xheads = DIV_ROUND_UP(size, XLOG_HEADER_CYCLE_SIZE); > > > > for (i = 1; i < xheads; i++) { > > crc = crc32c(crc, &xhdr[i].hic_xheader, > > diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c > > index 782ec3eeab4d..28dd98b5a703 100644 > > --- a/fs/xfs/xfs_log_recover.c > > +++ b/fs/xfs/xfs_log_recover.c > > @@ -371,6 +371,18 @@ xlog_find_verify_cycle( > > return error; > > } > > > > +static inline int xlog_logrec_hblks(struct xlog *log, xlog_rec_header_t *rh) > > +{ > > We're trying to gradually eliminate various structure typedefs so it's > frowned upon to introduce new instances. If you replace the above with > 'struct xlog_rec_header,' the rest looks good to me: > > Reviewed-by: Brian Foster <bfoster@redhat.com> Thanks for your review. Yeah, I noticed the eliminate movement and I used xlog_rec_header_t by mistake. I will resend a follow-up "in-reply-to" patch to fix that. Thanks, Gao Xiang
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index ad0c69ee8947..7a4ba408a3a2 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c @@ -1604,9 +1604,7 @@ xlog_cksum( int i; int xheads; - xheads = size / XLOG_HEADER_CYCLE_SIZE; - if (size % XLOG_HEADER_CYCLE_SIZE) - xheads++; + xheads = DIV_ROUND_UP(size, XLOG_HEADER_CYCLE_SIZE); for (i = 1; i < xheads; i++) { crc = crc32c(crc, &xhdr[i].hic_xheader, diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c index 782ec3eeab4d..28dd98b5a703 100644 --- a/fs/xfs/xfs_log_recover.c +++ b/fs/xfs/xfs_log_recover.c @@ -371,6 +371,18 @@ xlog_find_verify_cycle( return error; } +static inline int xlog_logrec_hblks(struct xlog *log, xlog_rec_header_t *rh) +{ + if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { + int h_size = be32_to_cpu(rh->h_size); + + if ((be32_to_cpu(rh->h_version) & XLOG_VERSION_2) && + h_size > XLOG_HEADER_CYCLE_SIZE) + return DIV_ROUND_UP(h_size, XLOG_HEADER_CYCLE_SIZE); + } + return 1; +} + /* * Potentially backup over partial log record write. * @@ -463,15 +475,7 @@ xlog_find_verify_log_record( * reset last_blk. Only when last_blk points in the middle of a log * record do we update last_blk. */ - if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { - uint h_size = be32_to_cpu(head->h_size); - - xhdrs = h_size / XLOG_HEADER_CYCLE_SIZE; - if (h_size % XLOG_HEADER_CYCLE_SIZE) - xhdrs++; - } else { - xhdrs = 1; - } + xhdrs = xlog_logrec_hblks(log, head); if (*last_blk - i + extra_bblks != BTOBB(be32_to_cpu(head->h_len)) + xhdrs) @@ -1158,22 +1162,7 @@ xlog_check_unmount_rec( * below. We won't want to clear the unmount record if there is one, so * we pass the lsn of the unmount record rather than the block after it. */ - if (xfs_sb_version_haslogv2(&log->l_mp->m_sb)) { - int h_size = be32_to_cpu(rhead->h_size); - int h_version = be32_to_cpu(rhead->h_version); - - if ((h_version & XLOG_VERSION_2) && - (h_size > XLOG_HEADER_CYCLE_SIZE)) { - hblks = h_size / XLOG_HEADER_CYCLE_SIZE; - if (h_size % XLOG_HEADER_CYCLE_SIZE) - hblks++; - } else { - hblks = 1; - } - } else { - hblks = 1; - } - + hblks = xlog_logrec_hblks(log, rhead); after_umount_blk = xlog_wrap_logbno(log, rhead_blk + hblks + BTOBB(be32_to_cpu(rhead->h_len))); @@ -2989,15 +2978,10 @@ xlog_do_recovery_pass( if (error) goto bread_err1; - if ((be32_to_cpu(rhead->h_version) & XLOG_VERSION_2) && - (h_size > XLOG_HEADER_CYCLE_SIZE)) { - hblks = h_size / XLOG_HEADER_CYCLE_SIZE; - if (h_size % XLOG_HEADER_CYCLE_SIZE) - hblks++; + hblks = xlog_logrec_hblks(log, rhead); + if (hblks != 1) { kmem_free(hbp); hbp = xlog_alloc_buffer(log, hblks); - } else { - hblks = 1; } } else { ASSERT(log->l_sectBBsize == 1);
Let's use DIV_ROUND_UP() to calculate log record header blocks as what did in xlog_get_iclog_buffer_size() and wrap up a common helper for log recovery. Signed-off-by: Gao Xiang <hsiangkao@redhat.com> --- v2: https://lore.kernel.org/r/20200904082516.31205-3-hsiangkao@redhat.com changes since v2: - get rid of xlog_logrecv2_hblks() and use xlog_logrec_hblks() entirely (Brian). fs/xfs/xfs_log.c | 4 +--- fs/xfs/xfs_log_recover.c | 48 ++++++++++++++-------------------------- 2 files changed, 17 insertions(+), 35 deletions(-)