| #ifndef _DRBD_WRAPPERS_H |
| #define _DRBD_WRAPPERS_H |
| |
| #include <linux/ctype.h> |
| #include <linux/mm.h> |
| |
| /* see get_sb_bdev and bd_claim */ |
| extern char *drbd_sec_holder; |
| |
| /* sets the number of 512 byte sectors of our virtual device */ |
| static inline void drbd_set_my_capacity(struct drbd_conf *mdev, |
| sector_t size) |
| { |
| /* set_capacity(mdev->this_bdev->bd_disk, size); */ |
| set_capacity(mdev->vdisk, size); |
| mdev->this_bdev->bd_inode->i_size = (loff_t)size << 9; |
| } |
| |
| #define drbd_bio_uptodate(bio) bio_flagged(bio, BIO_UPTODATE) |
| |
| static inline int drbd_bio_has_active_page(struct bio *bio) |
| { |
| struct bio_vec *bvec; |
| int i; |
| |
| __bio_for_each_segment(bvec, bio, i, 0) { |
| if (page_count(bvec->bv_page) > 1) |
| return 1; |
| } |
| |
| return 0; |
| } |
| |
| /* bi_end_io handlers */ |
| extern void drbd_md_io_complete(struct bio *bio, int error); |
| extern void drbd_endio_read_sec(struct bio *bio, int error); |
| extern void drbd_endio_write_sec(struct bio *bio, int error); |
| extern void drbd_endio_pri(struct bio *bio, int error); |
| |
| /* |
| * used to submit our private bio |
| */ |
| static inline void drbd_generic_make_request(struct drbd_conf *mdev, |
| int fault_type, struct bio *bio) |
| { |
| __release(local); |
| if (!bio->bi_bdev) { |
| printk(KERN_ERR "drbd%d: drbd_generic_make_request: " |
| "bio->bi_bdev == NULL\n", |
| mdev_to_minor(mdev)); |
| dump_stack(); |
| bio_endio(bio, -ENODEV); |
| return; |
| } |
| |
| if (FAULT_ACTIVE(mdev, fault_type)) |
| bio_endio(bio, -EIO); |
| else |
| generic_make_request(bio); |
| } |
| |
| static inline void drbd_plug_device(struct drbd_conf *mdev) |
| { |
| struct request_queue *q; |
| q = bdev_get_queue(mdev->this_bdev); |
| |
| spin_lock_irq(q->queue_lock); |
| |
| /* XXX the check on !blk_queue_plugged is redundant, |
| * implicitly checked in blk_plug_device */ |
| |
| if (!blk_queue_plugged(q)) { |
| blk_plug_device(q); |
| del_timer(&q->unplug_timer); |
| /* unplugging should not happen automatically... */ |
| } |
| spin_unlock_irq(q->queue_lock); |
| } |
| |
| static inline int drbd_crypto_is_hash(struct crypto_tfm *tfm) |
| { |
| return (crypto_tfm_alg_type(tfm) & CRYPTO_ALG_TYPE_HASH_MASK) |
| == CRYPTO_ALG_TYPE_HASH; |
| } |
| |
| #ifndef __CHECKER__ |
| # undef __cond_lock |
| # define __cond_lock(x,c) (c) |
| #endif |
| |
| #endif |