chiark / gitweb /
import: also set NOCOW for gpt disk images
authorLennart Poettering <lennart@poettering.net>
Thu, 8 Jan 2015 00:25:40 +0000 (01:25 +0100)
committerLennart Poettering <lennart@poettering.net>
Thu, 8 Jan 2015 00:25:40 +0000 (01:25 +0100)
Given the write patterns on disk images, we better should turn COW off
for them. In particular as the file systems used inside the disk images
should do their own data integrity checks anyway and we don't need
multiple layers of it.

src/import/import-gpt.c

index a85ceee337218e8440477cb850056ca040e42a4b..d304a399fb86c2845aae74e5387351e6a63c7f72 100644 (file)
@@ -20,6 +20,7 @@
 ***/
 
 #include <sys/xattr.h>
+#include <linux/fs.h>
 #include <curl/curl.h>
 
 #include "hashmap.h"
@@ -165,7 +166,7 @@ static void gpt_import_file_success(GptImportFile *f) {
 
                         f->disk_fd = open(f->final_path, O_RDONLY|O_NOCTTY|O_CLOEXEC);
                         if (f->disk_fd < 0) {
-                                r = log_error_errno(errno, "Failed top open vendor image: %m");
+                                r = log_error_errno(errno, "Failed to open vendor image: %m");
                                 goto finish;
                         }
                 }
@@ -186,6 +187,14 @@ static void gpt_import_file_success(GptImportFile *f) {
                         goto finish;
                 }
 
+                /* Turn off COW writing. This should greatly improve
+                 * performance on COW file systems like btrfs, since it
+                 * reduces fragmentation caused by not allowing in-place
+                 * writes. */
+                r = chattr_fd(dfd, true, FS_NOCOW_FL);
+                if (r < 0)
+                        log_warning_errno(errno, "Failed to set file attributes on %s: %m", f->temp_path);
+
                 r = copy_bytes(f->disk_fd, dfd, (off_t) -1, true);
                 if (r < 0) {
                         log_error_errno(r, "Failed to make writable copy of image: %m");