]> git.sesse.net Git - bcachefs-tools-debian/commitdiff
linux/blkdev.c: Fall back to buffered IO when O_DIRECT fails
authorKent Overstreet <kent.overstreet@linux.dev>
Sat, 19 Nov 2022 23:59:55 +0000 (18:59 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sat, 19 Nov 2022 23:59:55 +0000 (18:59 -0500)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
linux/blkdev.c

index 9b3ea93f8c19aecdaa0a6c9bb3e12eda2def00bf..54cd6e9cc2d34ab5b088ad1c613a694deaf638a4 100644 (file)
@@ -180,13 +180,26 @@ struct block_device *blkdev_get_by_path(const char *path, fmode_t mode,
        if (mode & FMODE_EXCL)
                flags |= O_EXCL;
 #endif
+       buffered_fd = open(path, flags);
+       if (buffered_fd < 0)
+               return ERR_PTR(-errno);
 
        fd = open(path, flags|O_DIRECT);
        if (fd < 0)
+               fd = dup(buffered_fd);
+       if (fd < 0) {
+               close(buffered_fd);
                return ERR_PTR(-errno);
+       }
 
-       sync_fd = xopen(path, flags|O_DIRECT|O_SYNC);
-       buffered_fd = xopen(path, flags);
+       sync_fd = open(path, flags|O_DIRECT|O_SYNC);
+       if (sync_fd < 0)
+               sync_fd = open(path, flags|O_SYNC);
+       if (sync_fd < 0) {
+               close(fd);
+               close(buffered_fd);
+               return ERR_PTR(-errno);
+       }
 
        bdev = malloc(sizeof(*bdev));
        memset(bdev, 0, sizeof(*bdev));