From d8794704486f7dd32e44d4df80e5d8a08c41119f Mon Sep 17 00:00:00 2001 From: yaoguangzhong Date: Sat, 7 Jan 2023 16:32:52 +0800 Subject: [PATCH] backport gfs2_jadd: Use fallocate to preallocate journals From Signed-off-by: Andrew Price commit 2010383c860ef8ca2a80e6394b9cb89942a426e0 Signed-off-by: Guangzhong Yao --- ...se-fallocate-to-preallocate-journals.patch | 82 +++++++++++++++++++ gfs2-utils.spec | 6 +- 2 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 0003-gfs2_jadd-Use-fallocate-to-preallocate-journals.patch diff --git a/0003-gfs2_jadd-Use-fallocate-to-preallocate-journals.patch b/0003-gfs2_jadd-Use-fallocate-to-preallocate-journals.patch new file mode 100644 index 0000000..7d570e4 --- /dev/null +++ b/0003-gfs2_jadd-Use-fallocate-to-preallocate-journals.patch @@ -0,0 +1,82 @@ +From 2010383c860ef8ca2a80e6394b9cb89942a426e0 Mon Sep 17 00:00:00 2001 +From: Andrew Price +Date: Thu, 18 Mar 2021 17:30:53 +0000 +Subject: [PATCH] gfs2_jadd: Use fallocate to preallocate journals + +Fall back to writes for ancient kernels and use larger writes in that +case to reduce the chance of fragmentation. + +Signed-off-by: Andrew Price +--- + gfs2/mkfs/main_jadd.c | 48 +++++++++++++++++++++++++++++++++++-------- + 1 file changed, 40 insertions(+), 8 deletions(-) + +diff --git a/gfs2/mkfs/main_jadd.c b/gfs2/mkfs/main_jadd.c +index 7583ba0f..0a18bfb2 100644 +--- a/gfs2/mkfs/main_jadd.c ++++ b/gfs2/mkfs/main_jadd.c +@@ -480,6 +480,43 @@ static uint64_t find_block_address(int fd, off_t offset, unsigned bsize) + } + #endif + ++static int alloc_new_journal(int fd, unsigned bytes) ++{ ++#define ALLOC_BUF_SIZE (4 << 20) ++ unsigned left = bytes; ++ int error; ++ char *buf; ++ ++ error = fallocate(fd, 0, 0, bytes); ++ if (error == 0) ++ return 0; ++ if (errno != EOPNOTSUPP) ++ goto out_errno; ++ ++ /* No fallocate support, fall back to writes */ ++ buf = calloc(1, ALLOC_BUF_SIZE); ++ if (buf == NULL) ++ goto out_errno; ++ ++ while (left > 0) { ++ unsigned sz = ALLOC_BUF_SIZE; ++ ++ if (left < ALLOC_BUF_SIZE) ++ sz = left; ++ ++ if (pwrite(fd, buf, sz, bytes - left) != sz) { ++ free(buf); ++ goto out_errno; ++ } ++ left -= sz; ++ } ++ free(buf); ++ return 0; ++out_errno: ++ perror("Failed to allocate space for new journal"); ++ return -1; ++} ++ + static int add_j(struct gfs2_sbd *sdp, struct jadd_opts *opts) + { + int fd, error = 0; +@@ -496,14 +533,9 @@ static int add_j(struct gfs2_sbd *sdp, struct jadd_opts *opts) + if ((error = set_flags(fd, JA_FL_CLEAR, FS_JOURNAL_DATA_FL))) + goto close_fd; + +- memset(buf, 0, sdp->bsize); +- for (x=0; xbsize) != sdp->bsize) { +- perror("add_j write"); +- error = -1; +- goto close_fd; +- } +- } ++ error = alloc_new_journal(fd, sdp->jsize << 20); ++ if (error != 0) ++ goto close_fd; + + if ((error = lseek(fd, 0, SEEK_SET)) < 0) { + perror("add_j lseek"); +-- +2.27.0 + diff --git a/gfs2-utils.spec b/gfs2-utils.spec index d4b882b..be68dea 100644 --- a/gfs2-utils.spec +++ b/gfs2-utils.spec @@ -1,6 +1,6 @@ Name: gfs2-utils Version: 3.4.1 -Release: 1 +Release: 2 Summary: Utilities for managing the global file system (GFS2) License: GPLv2+ and LGPLv2+ @@ -9,6 +9,7 @@ Source0: https://releases.pagure.org/gfs2-utils/gfs2-utils-%{version}.tar # https://github.com/andyprice/gfs2-utils/commit/17fb470 Patch0: 0001-gfs2-edit-always-use-s-style-format-for-printf-style.patch Patch1: 0002-fix-error-format-in-gfs2hex.patch +Patch2: 0003-gfs2_jadd-Use-fallocate-to-preallocate-journals.patch BuildRequires: ncurses-devel kernel-headers automake libtool zlib-devel gettext-devel BuildRequires: bison flex libblkid-devel libuuid-devel check-devel bzip2-devel make @@ -54,6 +55,9 @@ rm -f %{buildroot}%{_mandir}/man8/gfs2_lockcapture.8 %changelog +* Sat Jan 7 2023 yaoguangzhong - 3.4.1-2 +- backport gfs2_jadd: Use fallocate to preallocate journals + * Thu Oct 20 2022 yaoxin - 3.4.1-1 - upgrade to 3.4.1 -- Gitee