gfs2-utils/0003-gfs2_jadd-Use-fallocate-to-preallocate-journals.patch
yaoguangzhong e04748d57b backport gfs2_jadd: Use fallocate to preallocate journals
From Signed-off-by: Andrew Price <anprice@redhat.com>
commit 2010383c860ef8ca2a80e6394b9cb89942a426e0
Signed-off-by: Guangzhong Yao <yaoguangzhong@xfusion.com>
2023-01-07 16:20:44 +08:00

83 lines
2.0 KiB
Diff

From 2010383c860ef8ca2a80e6394b9cb89942a426e0 Mon Sep 17 00:00:00 2001
From: Andrew Price <anprice@redhat.com>
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 <anprice@redhat.com>
---
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; x<blocks; x++) {
- if (write(fd, buf, sdp->bsize) != 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