xref: /OK3568_Linux_fs/kernel/drivers/block/rnbd/rnbd-srv-dev.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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*4882a593Smuzhiyun static 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