1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * RDMA Network Block Driver 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2014 - 2018 ProfitBricks GmbH. All rights reserved. 6*4882a593Smuzhiyun * Copyright (c) 2018 - 2019 1&1 IONOS Cloud GmbH. All rights reserved. 7*4882a593Smuzhiyun * Copyright (c) 2019 - 2020 1&1 IONOS SE. All rights reserved. 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun #ifndef RNBD_SRV_DEV_H 10*4882a593Smuzhiyun #define RNBD_SRV_DEV_H 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/fs.h> 13*4882a593Smuzhiyun #include "rnbd-proto.h" 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun struct rnbd_dev { 16*4882a593Smuzhiyun struct block_device *bdev; 17*4882a593Smuzhiyun struct bio_set *ibd_bio_set; 18*4882a593Smuzhiyun fmode_t blk_open_flags; 19*4882a593Smuzhiyun char name[BDEVNAME_SIZE]; 20*4882a593Smuzhiyun }; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun struct rnbd_dev_blk_io { 23*4882a593Smuzhiyun struct rnbd_dev *dev; 24*4882a593Smuzhiyun void *priv; 25*4882a593Smuzhiyun /* have to be last member for front_pad usage of bioset_init */ 26*4882a593Smuzhiyun struct bio bio; 27*4882a593Smuzhiyun }; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun /** 30*4882a593Smuzhiyun * rnbd_dev_open() - Open a device 31*4882a593Smuzhiyun * @flags: open flags 32*4882a593Smuzhiyun * @bs: bio_set to use during block io, 33*4882a593Smuzhiyun */ 34*4882a593Smuzhiyun struct rnbd_dev *rnbd_dev_open(const char *path, fmode_t flags, 35*4882a593Smuzhiyun struct bio_set *bs); 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /** 38*4882a593Smuzhiyun * rnbd_dev_close() - Close a device 39*4882a593Smuzhiyun */ 40*4882a593Smuzhiyun void rnbd_dev_close(struct rnbd_dev *dev); 41*4882a593Smuzhiyun 42*4882a593Smuzhiyun void rnbd_endio(void *priv, int error); 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun void rnbd_dev_bi_end_io(struct bio *bio); 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun struct bio *rnbd_bio_map_kern(void *data, struct bio_set *bs, 47*4882a593Smuzhiyun unsigned int len, gfp_t gfp_mask); 48*4882a593Smuzhiyun rnbd_dev_get_max_segs(const struct rnbd_dev * dev)49*4882a593Smuzhiyunstatic inline int rnbd_dev_get_max_segs(const struct rnbd_dev *dev) 50*4882a593Smuzhiyun { 51*4882a593Smuzhiyun return queue_max_segments(bdev_get_queue(dev->bdev)); 52*4882a593Smuzhiyun } 53*4882a593Smuzhiyun rnbd_dev_get_max_hw_sects(const struct rnbd_dev * dev)54*4882a593Smuzhiyunstatic inline int rnbd_dev_get_max_hw_sects(const struct rnbd_dev *dev) 55*4882a593Smuzhiyun { 56*4882a593Smuzhiyun return queue_max_hw_sectors(bdev_get_queue(dev->bdev)); 57*4882a593Smuzhiyun } 58*4882a593Smuzhiyun rnbd_dev_get_secure_discard(const struct rnbd_dev * dev)59*4882a593Smuzhiyunstatic inline int rnbd_dev_get_secure_discard(const struct rnbd_dev *dev) 60*4882a593Smuzhiyun { 61*4882a593Smuzhiyun return blk_queue_secure_erase(bdev_get_queue(dev->bdev)); 62*4882a593Smuzhiyun } 63*4882a593Smuzhiyun rnbd_dev_get_max_discard_sects(const struct rnbd_dev * dev)64*4882a593Smuzhiyunstatic inline int rnbd_dev_get_max_discard_sects(const struct rnbd_dev *dev) 65*4882a593Smuzhiyun { 66*4882a593Smuzhiyun if (!blk_queue_discard(bdev_get_queue(dev->bdev))) 67*4882a593Smuzhiyun return 0; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun return blk_queue_get_max_sectors(bdev_get_queue(dev->bdev), 70*4882a593Smuzhiyun REQ_OP_DISCARD); 71*4882a593Smuzhiyun } 72*4882a593Smuzhiyun rnbd_dev_get_discard_granularity(const struct rnbd_dev * dev)73*4882a593Smuzhiyunstatic inline int rnbd_dev_get_discard_granularity(const struct rnbd_dev *dev) 74*4882a593Smuzhiyun { 75*4882a593Smuzhiyun return bdev_get_queue(dev->bdev)->limits.discard_granularity; 76*4882a593Smuzhiyun } 77*4882a593Smuzhiyun rnbd_dev_get_discard_alignment(const struct rnbd_dev * dev)78*4882a593Smuzhiyunstatic inline int rnbd_dev_get_discard_alignment(const struct rnbd_dev *dev) 79*4882a593Smuzhiyun { 80*4882a593Smuzhiyun return bdev_get_queue(dev->bdev)->limits.discard_alignment; 81*4882a593Smuzhiyun } 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun #endif /* RNBD_SRV_DEV_H */ 84