aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--block/scsi_ioctl.c5
-rw-r--r--drivers/block/drbd/Makefile1
-rw-r--r--drivers/block/drbd/drbd_actlog.c518
-rw-r--r--drivers/block/drbd/drbd_bitmap.c150
-rw-r--r--drivers/block/drbd/drbd_debugfs.c958
-rw-r--r--drivers/block/drbd/drbd_debugfs.h39
-rw-r--r--drivers/block/drbd/drbd_int.h383
-rw-r--r--drivers/block/drbd/drbd_interval.h4
-rw-r--r--drivers/block/drbd/drbd_main.c302
-rw-r--r--drivers/block/drbd/drbd_nl.c110
-rw-r--r--drivers/block/drbd/drbd_proc.c125
-rw-r--r--drivers/block/drbd/drbd_receiver.c316
-rw-r--r--drivers/block/drbd/drbd_req.c527
-rw-r--r--drivers/block/drbd/drbd_req.h1
-rw-r--r--drivers/block/drbd/drbd_state.c90
-rw-r--r--drivers/block/drbd/drbd_worker.c348
-rw-r--r--drivers/block/virtio_blk.c104
-rw-r--r--drivers/md/bcache/alloc.c2
-rw-r--r--drivers/md/bcache/bcache.h4
-rw-r--r--drivers/md/bcache/bset.c2
-rw-r--r--drivers/md/bcache/bset.h2
-rw-r--r--drivers/md/bcache/btree.c50
-rw-r--r--drivers/md/bcache/btree.h5
-rw-r--r--drivers/md/bcache/extents.c13
-rw-r--r--drivers/md/bcache/extents.h1
-rw-r--r--drivers/md/bcache/journal.c24
-rw-r--r--drivers/md/bcache/request.c3
-rw-r--r--drivers/md/bcache/super.c57
-rw-r--r--drivers/md/bcache/util.h4
-rw-r--r--drivers/md/bcache/writeback.c14
-rw-r--r--drivers/md/bcache/writeback.h3
-rw-r--r--include/linux/drbd.h4
-rw-r--r--include/linux/drbd_genl.h4
-rw-r--r--include/linux/drbd_limits.h6
-rw-r--r--include/scsi/sg.h4
-rw-r--r--include/trace/events/bcache.h21
-rw-r--r--include/uapi/linux/bsg.h11
-rw-r--r--include/uapi/linux/virtio_blk.h5
-rw-r--r--lib/lru_cache.c23
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
3drbd-y += drbd_main.o drbd_strings.o drbd_nl.o 3drbd-y += drbd_main.o drbd_strings.o drbd_nl.o
4drbd-y += drbd_interval.o drbd_state.o 4drbd-y += drbd_interval.o drbd_state.o
5drbd-y += drbd_nla.o 5drbd-y += drbd_nla.o
6drbd-$(CONFIG_DEBUG_FS) += drbd_debugfs.o
6 7
7obj-$(CONFIG_BLK_DEV_DRBD) += drbd.o 8obj-$(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
95struct update_odbm_work { 95void *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
101struct update_al_work {
102 struct drbd_work w;
103 struct drbd_device *device;
104 struct completion event;
105 int err;
106};
107
108
109void *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
120void drbd_md_put_buffer(struct drbd_device *device) 112void 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
146static int _drbd_md_sync_page_io(struct drbd_device *device, 138static 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;