changeset 1303:52a373257894 draft

objstore/posix: use copy_file_range for COW Instead of looping page-at-a-time in userspace, use the copy_file_range syscall to speed up COW. Signed-off-by: Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
author Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
date Thu, 01 Feb 2024 11:49:46 -0500
parents b14fd508b72a
children b3e0798761b7
files src/objstore/posix/obj.c
diffstat 1 files changed, 9 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/objstore/posix/obj.c	Mon Dec 19 19:55:24 2022 -0500
+++ b/src/objstore/posix/obj.c	Thu Feb 01 11:49:46 2024 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018-2020 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
+ * Copyright (c) 2018-2020,2024 Josef 'Jeff' Sipek <jeffpc@josefsipek.net>
  *
  * Permission is hereby granted, free of charge, to any person obtaining a copy
  * of this software and associated documentation files (the "Software"), to deal
@@ -257,8 +257,9 @@
 	const uint64_t full_size = sizeof(struct posix_ver_header) +
 		p2roundup(old->attrs.size, BLOCK_SIZE);
 	int src_fd, dst_fd;
-	off_t off;
-	int ret;
+	off_t srcoff = 0;
+	off_t dstoff = 0;
+	ssize_t ret;
 
 	src_fd = open_ver(old->obj, &old->clock, false, false);
 	if (src_fd < 0)
@@ -272,17 +273,11 @@
 
 	VERIFY0(full_size % BLOCK_SIZE);
 
-	for (off = 0; off < full_size; off += BLOCK_SIZE) {
-		uint8_t buf[BLOCK_SIZE];
-
-		ret = xpread(src_fd, buf, sizeof(buf), off);
-		if (ret)
-			goto err_close2;
-
-		ret = xpwrite(dst_fd, buf, sizeof(buf), off);
-		if (ret)
-			goto err_close2;
-	}
+	ret = copy_file_range(src_fd, &srcoff,
+			      dst_fd, &dstoff,
+			      full_size, 0);
+	if (ret != full_size)
+		goto err_close2;
 
 	xclose(dst_fd);
 	xclose(src_fd);