]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - linux/blkdev.c
Disable pristine-tar option in gbp.conf, since there is no pristine-tar branch.
[bcachefs-tools-debian] / linux / blkdev.c
index 611c821eaf933bf55d8d61016bb3cf0892d6630c..b7f58737298fa7280f1c949312486c363f85ad14 100644 (file)
@@ -162,18 +162,18 @@ sector_t get_capacity(struct gendisk *disk)
        return bytes >> 9;
 }
 
-void blkdev_put(struct block_device *bdev, void *holder)
+void bdev_release(struct bdev_handle *handle)
 {
-       fdatasync(bdev->bd_fd);
-       close(bdev->bd_fd);
-       free(bdev);
+       fdatasync(handle->bdev->bd_fd);
+       close(handle->bdev->bd_fd);
+       free(handle->bdev);
+       free(handle);
 }
 
-struct block_device *blkdev_get_by_path(const char *path, blk_mode_t mode,
-                                       void *holder, const struct blk_holder_ops *hop)
+struct bdev_handle *bdev_open_by_path(const char *path, blk_mode_t mode,
+                                     void *holder, const struct blk_holder_ops *hop)
 {
-       struct block_device *bdev;
-       int fd, buffered_fd, flags = 0;
+       int fd, flags = 0;
 
        if ((mode & (BLK_OPEN_READ|BLK_OPEN_WRITE)) == (BLK_OPEN_READ|BLK_OPEN_WRITE))
                flags = O_RDWR;
@@ -185,24 +185,14 @@ struct block_device *blkdev_get_by_path(const char *path, blk_mode_t mode,
        if (!(mode & BLK_OPEN_BUFFERED))
                flags |= O_DIRECT;
 
-#if 0
-       /* using O_EXCL doesn't work with opening twice for an O_SYNC fd: */
        if (mode & BLK_OPEN_EXCL)
                flags |= O_EXCL;
-#endif
-       buffered_fd = open(path, flags & ~O_DIRECT);
-       if (buffered_fd < 0)
-               return ERR_PTR(-errno);
 
        fd = open(path, flags);
        if (fd < 0)
-               fd = dup(buffered_fd);
-       if (fd < 0) {
-               close(buffered_fd);
                return ERR_PTR(-errno);
-       }
 
-       bdev = malloc(sizeof(*bdev));
+       struct block_device *bdev = malloc(sizeof(*bdev));
        memset(bdev, 0, sizeof(*bdev));
 
        strncpy(bdev->name, path, sizeof(bdev->name));
@@ -210,18 +200,17 @@ struct block_device *blkdev_get_by_path(const char *path, blk_mode_t mode,
 
        bdev->bd_dev            = xfstat(fd).st_rdev;
        bdev->bd_fd             = fd;
-       bdev->bd_buffered_fd    = buffered_fd;
        bdev->bd_holder         = holder;
        bdev->bd_disk           = &bdev->__bd_disk;
        bdev->bd_disk->bdi      = &bdev->bd_disk->__bdi;
        bdev->queue.backing_dev_info = bdev->bd_disk->bdi;
 
-       return bdev;
-}
+       struct bdev_handle *handle = calloc(sizeof(*handle), 1);
+       handle->bdev    = bdev;
+       handle->holder  = holder;
+       handle->mode    = mode;
 
-void bdput(struct block_device *bdev)
-{
-       BUG();
+       return handle;
 }
 
 int lookup_bdev(const char *path, dev_t *dev)