diff options
author | Darrick J. Wong <djwong@kernel.org> | 2023-12-20 08:53:45 -0800 |
---|---|---|
committer | Darrick J. Wong <djwong@kernel.org> | 2023-12-21 18:29:14 -0800 |
commit | 2cbc52f5c9a9588e1e9c8e54c0435c121424fe5a (patch) | |
tree | 618f5c43aef983d8dd56d6db7040a72ee612605b | |
parent | abb66bd7bd856ea6c6d552f3125ea84855038123 (diff) | |
download | xfsprogs-dev-2cbc52f5c9a9588e1e9c8e54c0435c121424fe5a.tar.gz |
xfs_mdrestore: refactor progress printing and sb fixup code
Now that we've fixed the dissimilarities between the two progress
printing callsites, refactor them into helpers. Do the same for the
duplicate code that clears sb_inprogress from the primary superblock
after the copy succeeds.
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
-rw-r--r-- | mdrestore/xfs_mdrestore.c | 109 |
1 files changed, 59 insertions, 50 deletions
diff --git a/mdrestore/xfs_mdrestore.c b/mdrestore/xfs_mdrestore.c index 685ca4c167..8e3998db06 100644 --- a/mdrestore/xfs_mdrestore.c +++ b/mdrestore/xfs_mdrestore.c @@ -58,6 +58,58 @@ print_progress(const char *fmt, ...) mdrestore.progress_since_warning = true; } +static inline void +maybe_print_progress( + int64_t *cursor, + int64_t bytes_read) +{ + int64_t mb_now = bytes_read >> 20; + + if (!mdrestore.show_progress) + return; + + if (mb_now != *cursor) { + print_progress("%lld MB read", mb_now); + *cursor = mb_now; + } +} + +static inline void +final_print_progress( + int64_t *cursor, + int64_t bytes_read) +{ + if (!mdrestore.show_progress) + goto done; + + if (bytes_read <= (*cursor << 20)) + goto done; + + print_progress("%lld MB read", howmany_64(bytes_read, 1U << 20)); + +done: + if (mdrestore.progress_since_warning) + putchar('\n'); +} + +static void +fixup_superblock( + int ddev_fd, + char *block_buffer, + struct xfs_sb *sb) +{ + memset(block_buffer, 0, sb->sb_sectsize); + sb->sb_inprogress = 0; + libxfs_sb_to_disk((struct xfs_dsb *)block_buffer, sb); + if (xfs_sb_version_hascrc(sb)) { + xfs_update_cksum(block_buffer, sb->sb_sectsize, + offsetof(struct xfs_sb, sb_crc)); + } + + if (pwrite(ddev_fd, block_buffer, sb->sb_sectsize, 0) < 0) + fatal("error writing primary superblock: %s\n", strerror(errno)); +} + static int open_device( char *path, @@ -210,14 +262,7 @@ restore_v1( bytes_read = 0; for (;;) { - if (mdrestore.show_progress) { - int64_t mb_now = bytes_read >> 20; - - if (mb_now != mb_read) { - print_progress("%lld MB read", mb_now); - mb_read = mb_now; - } - } + maybe_print_progress(&mb_read, bytes_read); for (cur_index = 0; cur_index < mb_count; cur_index++) { if (pwrite(ddev_fd, &block_buffer[cur_index << @@ -247,22 +292,9 @@ restore_v1( bytes_read += block_size + (mb_count << h->v1.mb_blocklog); } - if (mdrestore.show_progress && bytes_read > (mb_read << 20)) - print_progress("%lld MB read", howmany_64(bytes_read, 1U << 20)); + final_print_progress(&mb_read, bytes_read); - if (mdrestore.progress_since_warning) - putchar('\n'); - - memset(block_buffer, 0, sb.sb_sectsize); - sb.sb_inprogress = 0; - libxfs_sb_to_disk((struct xfs_dsb *)block_buffer, &sb); - if (xfs_sb_version_hascrc(&sb)) { - xfs_update_cksum(block_buffer, sb.sb_sectsize, - offsetof(struct xfs_sb, sb_crc)); - } - - if (pwrite(ddev_fd, block_buffer, sb.sb_sectsize, 0) < 0) - fatal("error writing primary superblock: %s\n", strerror(errno)); + fixup_superblock(ddev_fd, block_buffer, &sb); free(metablock); } @@ -401,6 +433,8 @@ restore_v2( char *device; int fd; + maybe_print_progress(&mb_read, bytes_read); + if (fread(&xme, sizeof(xme), 1, md_fp) != 1) { if (feof(md_fp)) break; @@ -428,38 +462,13 @@ restore_v2( len); bytes_read += len; - - if (mdrestore.show_progress) { - int64_t mb_now = bytes_read >> 20; - - if (mb_now != mb_read) { - print_progress("%lld mb read", mb_now); - mb_read = mb_now; - } - } } while (1); - if (mdrestore.show_progress && bytes_read > (mb_read << 20)) - print_progress("%lld mb read", howmany_64(bytes_read, 1U << 20)); - - if (mdrestore.progress_since_warning) - putchar('\n'); - - memset(block_buffer, 0, sb.sb_sectsize); - sb.sb_inprogress = 0; - libxfs_sb_to_disk((struct xfs_dsb *)block_buffer, &sb); - if (xfs_sb_version_hascrc(&sb)) { - xfs_update_cksum(block_buffer, sb.sb_sectsize, - offsetof(struct xfs_sb, sb_crc)); - } + final_print_progress(&mb_read, bytes_read); - if (pwrite(ddev_fd, block_buffer, sb.sb_sectsize, 0) < 0) - fatal("error writing primary superblock: %s\n", - strerror(errno)); + fixup_superblock(ddev_fd, block_buffer, &sb); free(block_buffer); - - return; } static struct mdrestore_ops mdrestore_ops_v2 = { |