diff options
39 files changed, 2932 insertions, 1311 deletions
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index bda1497add4c..51bf5155ee75 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c | |||
| @@ -290,6 +290,7 @@ static int sg_io(struct request_queue *q, struct gendisk *bd_disk, | |||
| 290 | unsigned long start_time; | 290 | unsigned long start_time; |
| 291 | ssize_t ret = 0; | 291 | ssize_t ret = 0; |
| 292 | int writing = 0; | 292 | int writing = 0; |
| 293 | int at_head = 0; | ||
| 293 | struct request *rq; | 294 | struct request *rq; |
| 294 | char sense[SCSI_SENSE_BUFFERSIZE]; | 295 | char sense[SCSI_SENSE_BUFFERSIZE]; |
| 295 | struct bio *bio; | 296 | struct bio *bio; |
| @@ -313,6 +314,8 @@ static int sg_io(struct request_queue *q, struct gendisk *bd_disk, | |||
| 313 | case SG_DXFER_FROM_DEV: | 314 | case SG_DXFER_FROM_DEV: |
| 314 | break; | 315 | break; |
| 315 | } | 316 | } |
| 317 | if (hdr->flags & SG_FLAG_Q_AT_HEAD) | ||
| 318 | at_head = 1; | ||
| 316 | 319 | ||
| 317 | rq = blk_get_request(q, writing ? WRITE : READ, GFP_KERNEL); | 320 | rq = blk_get_request(q, writing ? WRITE : READ, GFP_KERNEL); |
| 318 | if (!rq) | 321 | if (!rq) |
| @@ -369,7 +372,7 @@ static int sg_io(struct request_queue *q, struct gendisk *bd_disk, | |||
| 369 | * (if he doesn't check that is his problem). | 372 | * (if he doesn't check that is his problem). |
| 370 | * N.B. a non-zero SCSI status is _not_ necessarily an error. | 373 | * N.B. a non-zero SCSI status is _not_ necessarily an error. |
| 371 | */ | 374 | */ |
| 372 | blk_execute_rq(q, bd_disk, rq, 0); | 375 | blk_execute_rq(q, bd_disk, rq, at_head); |
| 373 | 376 | ||
| 374 | hdr->duration = jiffies_to_msecs(jiffies - start_time); | 377 | hdr->duration = jiffies_to_msecs(jiffies - start_time); |
| 375 | 378 | ||
diff --git a/drivers/block/drbd/Makefile b/drivers/block/drbd/Makefile index 8b450338075e..4464e353c1e8 100644 --- a/drivers/block/drbd/Makefile +++ b/drivers/block/drbd/Makefile | |||
| @@ -3,5 +3,6 @@ drbd-y += drbd_worker.o drbd_receiver.o drbd_req.o drbd_actlog.o | |||
| 3 | drbd-y += drbd_main.o drbd_strings.o drbd_nl.o | 3 | drbd-y += drbd_main.o drbd_strings.o drbd_nl.o |
| 4 | drbd-y += drbd_interval.o drbd_state.o | 4 | drbd-y += drbd_interval.o drbd_state.o |
| 5 | drbd-y += drbd_nla.o | 5 | drbd-y += drbd_nla.o |
| 6 | drbd-$(CONFIG_DEBUG_FS) += drbd_debugfs.o | ||
| 6 | 7 | ||
| 7 | obj-$(CONFIG_BLK_DEV_DRBD) += drbd.o | 8 | obj-$(CONFIG_BLK_DEV_DRBD) += drbd.o |
diff --git a/drivers/block/drbd/drbd_actlog.c b/drivers/block/drbd/drbd_actlog.c index 05a1780ffa85..d26a3fa63688 100644 --- a/drivers/block/drbd/drbd_actlog.c +++ b/drivers/block/drbd/drbd_actlog.c | |||
| @@ -92,34 +92,26 @@ struct __packed al_transaction_on_disk { | |||
| 92 | __be32 context[AL_CONTEXT_PER_TRANSACTION]; | 92 | __be32 context[AL_CONTEXT_PER_TRANSACTION]; |
| 93 | }; | 93 | }; |
| 94 | 94 | ||
| 95 | struct update_odbm_work { | 95 | void *drbd_md_get_buffer(struct drbd_device *device, const char *intent) |
| 96 | struct drbd_work w; | ||
| 97 | struct drbd_device *device; | ||
| 98 | unsigned int enr; | ||
| 99 | }; | ||
| 100 | |||
| 101 | struct update_al_work { | ||
| 102 | struct drbd_work w; | ||
| 103 | struct drbd_device *device; | ||
| 104 | struct completion event; | ||
| 105 | int err; | ||
| 106 | }; | ||
| 107 | |||
| 108 | |||
| 109 | void *drbd_md_get_buffer(struct drbd_device *device) | ||
| 110 | { | 96 | { |
| 111 | int r; | 97 | int r; |
| 112 | 98 | ||
| 113 | wait_event(device->misc_wait, | 99 | wait_event(device->misc_wait, |
| 114 | (r = atomic_cmpxchg(&device->md_io_in_use, 0, 1)) == 0 || | 100 | (r = atomic_cmpxchg(&device->md_io.in_use, 0, 1)) == 0 || |
| 115 | device->state.disk <= D_FAILED); | 101 | device->state.disk <= D_FAILED); |
| 116 | 102 | ||
| 117 | return r ? NULL : page_address(device->md_io_page); | 103 | if (r) |
| 104 | return NULL; | ||
| 105 | |||
| 106 | device->md_io.current_use = intent; | ||
| 107 | device->md_io.start_jif = jiffies; | ||
| 108 | device->md_io.submit_jif = device->md_io.start_jif - 1; | ||
| 109 | return page_address(device->md_io.page); | ||
| 118 | } | 110 | } |
| 119 | 111 | ||
| 120 | void drbd_md_put_buffer(struct drbd_device *device) | 112 | void drbd_md_put_buffer(struct drbd_device *device) |
| 121 | { | 113 | { |
| 122 | if (atomic_dec_and_test(&device->md_io_in_use)) | 114 | if (atomic_dec_and_test(&device->md_io.in_use)) |
| 123 | wake_up(&device->misc_wait); | 115 | wake_up(&device->misc_wait); |
| 124 | } | 116 | } |
| 125 | 117 | ||
| @@ -145,10 +137,11 @@ void wait_until_done_or_force_detached(struct drbd_device *device, struct drbd_b | |||
| 145 | 137 | ||
| 146 | static int _drbd_md_sync_page_io(struct drbd_device *device, | 138 | static int _drbd_md_sync_page_io(struct drbd_device *device, |
| 147 | struct drbd_backing_dev *bdev, | 139 | struct drbd_backing_dev *bdev, |
| 148 | struct page *page, sector_t sector, | 140 | sector_t sector, int rw) |
| 149 | int rw, int size) | ||
| 150 | { | 141 | { |
| 151 | struct bio *bio; | 142 | struct bio *bio; |
| 143 | /* we do all our meta data IO in aligned 4k blocks. */ | ||
| 144 | const int size = 4096; | ||
| 152 | int err; | 145 | int err; |
| 153 | 146 | ||
| 154 | device->md_io.done = 0; | 147 | device->md_io.done = 0; |
| @@ -156,15 +149,15 @@ static int _drbd_md_sync_page_io(struct drbd_device *device, | |||
| 156 | 149 | ||
| 157 | if ((rw & WRITE) && !test_bit(MD_NO_FUA, &device->flags)) | 150 | if ((rw & WRITE) && !test_bit(MD_NO_FUA, &device->flags)) |
| 158 | rw |= REQ_FUA | REQ_FLUSH; | 151 | rw |= REQ_FUA | REQ_FLUSH; |
| 159 | rw |= REQ_SYNC; | 152 | rw |= REQ_SYNC | REQ_NOIDLE; |
| 160 | 153 | ||
| 161 | bio = bio_alloc_drbd(GFP_NOIO); | 154 | bio = bio_alloc_drbd(GFP_NOIO); |
| 162 | bio->bi_bdev = bdev->md_bdev; | 155 | bio->bi_bdev = bdev->md_bdev; |
| 163 | bio->bi_iter.bi_sector = sector; | 156 | bio->bi_iter.bi_sector = sector; |
| 164 | err = -EIO; | 157 | err = -EIO; |
| 165 | if (bio_add_page(bio, page, size, 0) != size) | 158 | if (bio_add_page(bio, device->md_io.page, size, 0) != size) |
| 166 | goto out; | 159 | goto out; |
| 167 | bio->bi_private = &device->md_io; | 160 | bio->bi_private = device; |
