/* SPDX-License-Identifier: GPL-2.0-only */ #ifndef __BLOCK_H #define __BLOCK_H #include #include #include struct block_device; struct block_device_ops { int (*read)(struct block_device *, void *buf, sector_t block, blkcnt_t num_blocks); int (*write)(struct block_device *, const void *buf, sector_t block, blkcnt_t num_blocks); int (*flush)(struct block_device *); }; struct chunk; struct block_device { struct device_d *dev; struct list_head list; struct block_device_ops *ops; int blockbits; blkcnt_t num_blocks; int rdbufsize; int blkmask; sector_t discard_start; blkcnt_t discard_size; struct list_head buffered_blocks; struct list_head idle_blocks; struct cdev cdev; }; extern struct list_head block_device_list; #define for_each_block_device(bdev) list_for_each_entry(bdev, &block_device_list, list) int blockdevice_register(struct block_device *blk); int blockdevice_unregister(struct block_device *blk); int block_read(struct block_device *blk, void *buf, sector_t block, blkcnt_t num_blocks); int block_write(struct block_device *blk, void *buf, sector_t block, blkcnt_t num_blocks); static inline int block_flush(struct block_device *blk) { return cdev_flush(&blk->cdev); } #endif /* __BLOCK_H */