You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'for-2.6.39/stack-plug' into for-2.6.39/core
Conflicts: block/blk-core.c block/blk-flush.c drivers/md/raid1.c drivers/md/raid10.c drivers/md/raid5.c fs/nilfs2/btnode.c fs/nilfs2/mdt.c Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
This commit is contained in:
@@ -963,11 +963,6 @@ elevator_dispatch_fn* fills the dispatch queue with ready requests.
|
||||
|
||||
elevator_add_req_fn* called to add a new request into the scheduler
|
||||
|
||||
elevator_queue_empty_fn returns true if the merge queue is empty.
|
||||
Drivers shouldn't use this, but rather check
|
||||
if elv_next_request is NULL (without losing the
|
||||
request if one exists!)
|
||||
|
||||
elevator_former_req_fn
|
||||
elevator_latter_req_fn These return the request before or after the
|
||||
one specified in disk sort order. Used by the
|
||||
|
||||
+308
-232
File diff suppressed because it is too large
Load Diff
+2
-2
@@ -54,8 +54,8 @@ void blk_execute_rq_nowait(struct request_queue *q, struct gendisk *bd_disk,
|
||||
rq->end_io = done;
|
||||
WARN_ON(irqs_disabled());
|
||||
spin_lock_irq(q->queue_lock);
|
||||
__elv_add_request(q, rq, where, 1);
|
||||
__generic_unplug_device(q);
|
||||
__elv_add_request(q, rq, where);
|
||||
__blk_run_queue(q, false);
|
||||
/* the queue is stopped so it won't be plugged+unplugged */
|
||||
if (rq->cmd_type == REQ_TYPE_PM_RESUME)
|
||||
q->request_fn(q);
|
||||
|
||||
+2
-4
@@ -194,7 +194,6 @@ static void flush_end_io(struct request *flush_rq, int error)
|
||||
{
|
||||
struct request_queue *q = flush_rq->q;
|
||||
struct list_head *running = &q->flush_queue[q->flush_running_idx];
|
||||
bool was_empty = elv_queue_empty(q);
|
||||
bool queued = false;
|
||||
struct request *rq, *n;
|
||||
|
||||
@@ -218,7 +217,7 @@ static void flush_end_io(struct request *flush_rq, int error)
|
||||
* from request completion path and calling directly into
|
||||
* request_fn may confuse the driver. Always use kblockd.
|
||||
*/
|
||||
if (queued && was_empty)
|
||||
if (queued)
|
||||
__blk_run_queue(q, true);
|
||||
}
|
||||
|
||||
@@ -269,13 +268,12 @@ static bool blk_kick_flush(struct request_queue *q)
|
||||
static void flush_data_end_io(struct request *rq, int error)
|
||||
{
|
||||
struct request_queue *q = rq->q;
|
||||
bool was_empty = elv_queue_empty(q);
|
||||
|
||||
/*
|
||||
* After populating an empty queue, kick it to avoid stall. Read
|
||||
* the comment in flush_end_io().
|
||||
*/
|
||||
if (blk_flush_complete_seq(rq, REQ_FSEQ_DATA, error) && was_empty)
|
||||
if (blk_flush_complete_seq(rq, REQ_FSEQ_DATA, error))
|
||||
__blk_run_queue(q, true);
|
||||
}
|
||||
|
||||
|
||||
@@ -164,14 +164,6 @@ void blk_queue_make_request(struct request_queue *q, make_request_fn *mfn)
|
||||
blk_queue_congestion_threshold(q);
|
||||
q->nr_batching = BLK_BATCH_REQ;
|
||||
|
||||
q->unplug_thresh = 4; /* hmm */
|
||||
q->unplug_delay = msecs_to_jiffies(3); /* 3 milliseconds */
|
||||
if (q->unplug_delay == 0)
|
||||
q->unplug_delay = 1;
|
||||
|
||||
q->unplug_timer.function = blk_unplug_timeout;
|
||||
q->unplug_timer.data = (unsigned long)q;
|
||||
|
||||
blk_set_default_limits(&q->limits);
|
||||
blk_queue_max_hw_sectors(q, BLK_SAFE_MAX_SECTORS);
|
||||
|
||||
|
||||
@@ -768,6 +768,7 @@ static int throtl_dispatch(struct request_queue *q)
|
||||
unsigned int nr_disp = 0;
|
||||
struct bio_list bio_list_on_stack;
|
||||
struct bio *bio;
|
||||
struct blk_plug plug;
|
||||
|
||||
spin_lock_irq(q->queue_lock);
|
||||
|
||||
@@ -796,9 +797,10 @@ out:
|
||||
* immediate dispatch
|
||||
*/
|
||||
if (nr_disp) {
|
||||
blk_start_plug(&plug);
|
||||
while((bio = bio_list_pop(&bio_list_on_stack)))
|
||||
generic_make_request(bio);
|
||||
blk_unplug(q);
|
||||
blk_finish_plug(&plug);
|
||||
}
|
||||
return nr_disp;
|
||||
}
|
||||
|
||||
@@ -18,8 +18,6 @@ int blk_rq_append_bio(struct request_queue *q, struct request *rq,
|
||||
void blk_dequeue_request(struct request *rq);
|
||||
void __blk_queue_free_tags(struct request_queue *q);
|
||||
|
||||
void blk_unplug_work(struct work_struct *work);
|
||||
void blk_unplug_timeout(unsigned long data);
|
||||
void blk_rq_timed_out_timer(unsigned long data);
|
||||
void blk_delete_timer(struct request *);
|
||||
void blk_add_timer(struct request *);
|
||||
|
||||
@@ -500,13 +500,6 @@ static inline void cfq_schedule_dispatch(struct cfq_data *cfqd)
|
||||
}
|
||||
}
|
||||
|
||||
static int cfq_queue_empty(struct request_queue *q)
|
||||
{
|
||||
struct cfq_data *cfqd = q->elevator->elevator_data;
|
||||
|
||||
return !cfqd->rq_queued;
|
||||
}
|
||||
|
||||
/*
|
||||
* Scale schedule slice based on io priority. Use the sync time slice only
|
||||
* if a queue is marked sync and has sync io queued. A sync queue with async
|
||||
@@ -4080,7 +4073,6 @@ static struct elevator_type iosched_cfq = {
|
||||
.elevator_add_req_fn = cfq_insert_request,
|
||||
.elevator_activate_req_fn = cfq_activate_request,
|
||||
.elevator_deactivate_req_fn = cfq_deactivate_request,
|
||||
.elevator_queue_empty_fn = cfq_queue_empty,
|
||||
.elevator_completed_req_fn = cfq_completed_request,
|
||||
.elevator_former_req_fn = elv_rb_former_request,
|
||||
.elevator_latter_req_fn = elv_rb_latter_request,
|
||||
|
||||
@@ -326,14 +326,6 @@ dispatch_request:
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int deadline_queue_empty(struct request_queue *q)
|
||||
{
|
||||
struct deadline_data *dd = q->elevator->elevator_data;
|
||||
|
||||
return list_empty(&dd->fifo_list[WRITE])
|
||||
&& list_empty(&dd->fifo_list[READ]);
|
||||
}
|
||||
|
||||
static void deadline_exit_queue(struct elevator_queue *e)
|
||||
{
|
||||
struct deadline_data *dd = e->elevator_data;
|
||||
@@ -445,7 +437,6 @@ static struct elevator_type iosched_deadline = {
|
||||
.elevator_merge_req_fn = deadline_merged_requests,
|
||||
.elevator_dispatch_fn = deadline_dispatch_requests,
|
||||
.elevator_add_req_fn = deadline_add_request,
|
||||
.elevator_queue_empty_fn = deadline_queue_empty,
|
||||
.elevator_former_req_fn = elv_rb_former_request,
|
||||
.elevator_latter_req_fn = elv_rb_latter_request,
|
||||
.elevator_init_fn = deadline_init_queue,
|
||||
|
||||
+8
-41
@@ -113,7 +113,7 @@ int elv_rq_merge_ok(struct request *rq, struct bio *bio)
|
||||
}
|
||||
EXPORT_SYMBOL(elv_rq_merge_ok);
|
||||
|
||||
static inline int elv_try_merge(struct request *__rq, struct bio *bio)
|
||||
int elv_try_merge(struct request *__rq, struct bio *bio)
|
||||
{
|
||||
int ret = ELEVATOR_NO_MERGE;
|
||||
|
||||
@@ -421,6 +421,8 @@ void elv_dispatch_sort(struct request_queue *q, struct request *rq)
|
||||
struct list_head *entry;
|
||||
int stop_flags;
|
||||
|
||||
BUG_ON(rq->cmd_flags & REQ_ON_PLUG);
|
||||
|
||||
if (q->last_merge == rq)
|
||||
q->last_merge = NULL;
|
||||
|
||||
@@ -617,21 +619,12 @@ void elv_quiesce_end(struct request_queue *q)
|
||||
|
||||
void elv_insert(struct request_queue *q, struct request *rq, int where)
|
||||
{
|
||||
int unplug_it = 1;
|
||||
|
||||
trace_block_rq_insert(q, rq);
|
||||
|
||||
rq->q = q;
|
||||
|
||||
switch (where) {
|
||||
case ELEVATOR_INSERT_REQUEUE:
|
||||
/*
|
||||
* Most requeues happen because of a busy condition,
|
||||
* don't force unplug of the queue for that case.
|
||||
* Clear unplug_it and fall through.
|
||||
*/
|
||||
unplug_it = 0;
|
||||
|
||||
case ELEVATOR_INSERT_FRONT:
|
||||
rq->cmd_flags |= REQ_SOFTBARRIER;
|
||||
list_add(&rq->queuelist, &q->queue_head);
|
||||
@@ -677,25 +670,17 @@ void elv_insert(struct request_queue *q, struct request *rq, int where)
|
||||
rq->cmd_flags |= REQ_SOFTBARRIER;
|
||||
blk_insert_flush(rq);
|
||||
break;
|
||||
|
||||
default:
|
||||
printk(KERN_ERR "%s: bad insertion point %d\n",
|
||||
__func__, where);
|
||||
BUG();
|
||||
}
|
||||
|
||||
if (unplug_it && blk_queue_plugged(q)) {
|
||||
int nrq = q->rq.count[BLK_RW_SYNC] + q->rq.count[BLK_RW_ASYNC]
|
||||
- queue_in_flight(q);
|
||||
|
||||
if (nrq >= q->unplug_thresh)
|
||||
__generic_unplug_device(q);
|
||||
}
|
||||
}
|
||||
|
||||
void __elv_add_request(struct request_queue *q, struct request *rq, int where,
|
||||
int plug)
|
||||
void __elv_add_request(struct request_queue *q, struct request *rq, int where)
|
||||
{
|
||||
BUG_ON(rq->cmd_flags & REQ_ON_PLUG);
|
||||
|
||||
if (rq->cmd_flags & REQ_SOFTBARRIER) {
|
||||
/* barriers are scheduling boundary, update end_sector */
|
||||
if (rq->cmd_type == REQ_TYPE_FS ||
|
||||
@@ -707,38 +692,20 @@ void __elv_add_request(struct request_queue *q, struct request *rq, int where,
|
||||
where == ELEVATOR_INSERT_SORT)
|
||||
where = ELEVATOR_INSERT_BACK;
|
||||
|
||||
if (plug)
|
||||
blk_plug_device(q);
|
||||
|
||||
elv_insert(q, rq, where);
|
||||
}
|
||||
EXPORT_SYMBOL(__elv_add_request);
|
||||
|
||||
void elv_add_request(struct request_queue *q, struct request *rq, int where,
|
||||
int plug)
|
||||
void elv_add_request(struct request_queue *q, struct request *rq, int where)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(q->queue_lock, flags);
|
||||
__elv_add_request(q, rq, where, plug);
|
||||
__elv_add_request(q, rq, where);
|
||||
spin_unlock_irqrestore(q->queue_lock, flags);
|
||||
}
|
||||
EXPORT_SYMBOL(elv_add_request);
|
||||
|
||||
int elv_queue_empty(struct request_queue *q)
|
||||
{
|
||||
struct elevator_queue *e = q->elevator;
|
||||
|
||||
if (!list_empty(&q->queue_head))
|
||||
return 0;
|
||||
|
||||
if (e->ops->elevator_queue_empty_fn)
|
||||
return e->ops->elevator_queue_empty_fn(q);
|
||||
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL(elv_queue_empty);
|
||||
|
||||
struct request *elv_latter_request(struct request_queue *q, struct request *rq)
|
||||
{
|
||||
struct elevator_queue *e = q->elevator;
|
||||
|
||||
@@ -39,13 +39,6 @@ static void noop_add_request(struct request_queue *q, struct request *rq)
|
||||
list_add_tail(&rq->queuelist, &nd->queue);
|
||||
}
|
||||
|
||||
static int noop_queue_empty(struct request_queue *q)
|
||||
{
|
||||
struct noop_data *nd = q->elevator->elevator_data;
|
||||
|
||||
return list_empty(&nd->queue);
|
||||
}
|
||||
|
||||
static struct request *
|
||||
noop_former_request(struct request_queue *q, struct request *rq)
|
||||
{
|
||||
@@ -90,7 +83,6 @@ static struct elevator_type elevator_noop = {
|
||||
.elevator_merge_req_fn = noop_merged_requests,
|
||||
.elevator_dispatch_fn = noop_dispatch,
|
||||
.elevator_add_req_fn = noop_add_request,
|
||||
.elevator_queue_empty_fn = noop_queue_empty,
|
||||
.elevator_former_req_fn = noop_former_request,
|
||||
.elevator_latter_req_fn = noop_latter_request,
|
||||
.elevator_init_fn = noop_init_queue,
|
||||
|
||||
@@ -3170,12 +3170,6 @@ static void do_cciss_request(struct request_queue *q)
|
||||
int sg_index = 0;
|
||||
int chained = 0;
|
||||
|
||||
/* We call start_io here in case there is a command waiting on the
|
||||
* queue that has not been sent.
|
||||
*/
|
||||
if (blk_queue_plugged(q))
|
||||
goto startio;
|
||||
|
||||
queue:
|
||||
creq = blk_peek_request(q);
|
||||
if (!creq)
|
||||
|
||||
@@ -911,9 +911,6 @@ static void do_ida_request(struct request_queue *q)
|
||||
struct scatterlist tmp_sg[SG_MAX];
|
||||
int i, dir, seg;
|
||||
|
||||
if (blk_queue_plugged(q))
|
||||
goto startio;
|
||||
|
||||
queue_next:
|
||||
creq = blk_peek_request(q);
|
||||
if (!creq)
|
||||
|
||||
@@ -80,7 +80,7 @@ static int _drbd_md_sync_page_io(struct drbd_conf *mdev,
|
||||
|
||||
if ((rw & WRITE) && !test_bit(MD_NO_FUA, &mdev->flags))
|
||||
rw |= REQ_FUA;
|
||||
rw |= REQ_UNPLUG | REQ_SYNC;
|
||||
rw |= REQ_SYNC;
|
||||
|
||||
bio = bio_alloc(GFP_NOIO, 1);
|
||||
bio->bi_bdev = bdev->md_bdev;
|
||||
@@ -689,8 +689,6 @@ void drbd_al_to_on_disk_bm(struct drbd_conf *mdev)
|
||||
}
|
||||
}
|
||||
|
||||
drbd_blk_run_queue(bdev_get_queue(mdev->ldev->md_bdev));
|
||||
|
||||
/* always (try to) flush bitmap to stable storage */
|
||||
drbd_md_flush(mdev);
|
||||
|
||||
|
||||
@@ -840,7 +840,6 @@ static int bm_rw(struct drbd_conf *mdev, int rw) __must_hold(local)
|
||||
for (i = 0; i < num_pages; i++)
|
||||
bm_page_io_async(mdev, b, i, rw);
|
||||
|
||||
drbd_blk_run_queue(bdev_get_queue(mdev->ldev->md_bdev));
|
||||
wait_event(b->bm_io_wait, atomic_read(&b->bm_async_io) == 0);
|
||||
|
||||
if (test_bit(BM_MD_IO_ERROR, &b->bm_flags)) {
|
||||
|
||||
@@ -377,7 +377,7 @@ union p_header {
|
||||
#define DP_HARDBARRIER 1 /* depricated */
|
||||
#define DP_RW_SYNC 2 /* equals REQ_SYNC */
|
||||
#define DP_MAY_SET_IN_SYNC 4
|
||||
#define DP_UNPLUG 8 /* equals REQ_UNPLUG */
|
||||
#define DP_UNPLUG 8 /* not used anymore */
|
||||
#define DP_FUA 16 /* equals REQ_FUA */
|
||||
#define DP_FLUSH 32 /* equals REQ_FLUSH */
|
||||
#define DP_DISCARD 64 /* equals REQ_DISCARD */
|
||||
@@ -2382,20 +2382,6 @@ static inline int drbd_queue_order_type(struct drbd_conf *mdev)
|
||||
return QUEUE_ORDERED_NONE;
|
||||
}
|
||||
|
||||
static inline void drbd_blk_run_queue(struct request_queue *q)
|
||||
{
|
||||
if (q && q->unplug_fn)
|
||||
q->unplug_fn(q);
|
||||
}
|
||||
|
||||
static inline void drbd_kick_lo(struct drbd_conf *mdev)
|
||||
{
|
||||
if (get_ldev(mdev)) {
|
||||
drbd_blk_run_queue(bdev_get_queue(mdev->ldev->backing_bdev));
|
||||
put_ldev(mdev);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void drbd_md_flush(struct drbd_conf *mdev)
|
||||
{
|
||||
int r;
|
||||
|
||||
@@ -2477,12 +2477,11 @@ static u32 bio_flags_to_wire(struct drbd_conf *mdev, unsigned long bi_rw)
|
||||
{
|
||||
if (mdev->agreed_pro_version >= 95)
|
||||
return (bi_rw & REQ_SYNC ? DP_RW_SYNC : 0) |
|
||||
(bi_rw & REQ_UNPLUG ? DP_UNPLUG : 0) |
|
||||
(bi_rw & REQ_FUA ? DP_FUA : 0) |
|
||||
(bi_rw & REQ_FLUSH ? DP_FLUSH : 0) |
|
||||
(bi_rw & REQ_DISCARD ? DP_DISCARD : 0);
|
||||
else
|
||||
return bi_rw & (REQ_SYNC | REQ_UNPLUG) ? DP_RW_SYNC : 0;
|
||||
return bi_rw & REQ_SYNC ? DP_RW_SYNC : 0;
|
||||
}
|
||||
|
||||
/* Used to send write requests
|
||||
@@ -2719,35 +2718,6 @@ static int drbd_release(struct gendisk *gd, fmode_t mode)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void drbd_unplug_fn(struct request_queue *q)
|
||||
{
|
||||
struct drbd_conf *mdev = q->queuedata;
|
||||
|
||||
/* unplug FIRST */
|
||||
spin_lock_irq(q->queue_lock);
|
||||
blk_remove_plug(q);
|
||||
spin_unlock_irq(q->queue_lock);
|
||||
|
||||
/* only if connected */
|
||||
spin_lock_irq(&mdev->req_lock);
|
||||
if (mdev->state.pdsk >= D_INCONSISTENT && mdev->state.conn >= C_CONNECTED) {
|
||||
D_ASSERT(mdev->state.role == R_PRIMARY);
|
||||
if (test_and_clear_bit(UNPLUG_REMOTE, &mdev->flags)) {
|
||||
/* add to the data.work queue,
|
||||
* unless already queued.
|
||||
* XXX this might be a good addition to drbd_queue_work
|
||||
* anyways, to detect "double queuing" ... */
|
||||
if (list_empty(&mdev->unplug_work.list))
|
||||
drbd_queue_work(&mdev->data.work,
|
||||
&mdev->unplug_work);
|
||||
}
|
||||
}
|
||||
spin_unlock_irq(&mdev->req_lock);
|
||||
|
||||
if (mdev->state.disk >= D_INCONSISTENT)
|
||||
drbd_kick_lo(mdev);
|
||||
}
|
||||
|
||||
static void drbd_set_defaults(struct drbd_conf *mdev)
|
||||
{
|
||||
/* This way we get a compile error when sync_conf grows,
|
||||
@@ -3222,9 +3192,7 @@ struct drbd_conf *drbd_new_device(unsigned int minor)
|
||||
blk_queue_max_segment_size(q, DRBD_MAX_SEGMENT_SIZE);
|
||||
blk_queue_bounce_limit(q, BLK_BOUNCE_ANY);
|
||||
blk_queue_merge_bvec(q, drbd_merge_bvec);
|
||||
q->queue_lock = &mdev->req_lock; /* needed since we use */
|
||||
/* plugging on a queue, that actually has no requests! */
|
||||
q->unplug_fn = drbd_unplug_fn;
|
||||
q->queue_lock = &mdev->req_lock;
|
||||
|
||||
mdev->md_io_page = alloc_page(GFP_KERNEL);
|
||||
if (!mdev->md_io_page)
|
||||
|
||||
@@ -187,15 +187,6 @@ static struct page *drbd_pp_first_pages_or_try_alloc(struct drbd_conf *mdev, int
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* kick lower level device, if we have more than (arbitrary number)
|
||||
* reference counts on it, which typically are locally submitted io
|
||||
* requests. don't use unacked_cnt, so we speed up proto A and B, too. */
|
||||
static void maybe_kick_lo(struct drbd_conf *mdev)
|
||||
{
|
||||
if (atomic_read(&mdev->local_cnt) >= mdev->net_conf->unplug_watermark)
|
||||
drbd_kick_lo(mdev);
|
||||
}
|
||||
|
||||
static void reclaim_net_ee(struct drbd_conf *mdev, struct list_head *to_be_freed)
|
||||
{
|
||||
struct drbd_epoch_entry *e;
|
||||
@@ -219,7 +210,6 @@ static void drbd_kick_lo_and_reclaim_net(struct drbd_conf *mdev)
|
||||
LIST_HEAD(reclaimed);
|
||||
struct drbd_epoch_entry *e, *t;
|
||||
|
||||
maybe_kick_lo(mdev);
|
||||
spin_lock_irq(&mdev->req_lock);
|
||||
reclaim_net_ee(mdev, &reclaimed);
|
||||
spin_unlock_irq(&mdev->req_lock);
|
||||
@@ -436,8 +426,7 @@ void _drbd_wait_ee_list_empty(struct drbd_conf *mdev, struct list_head *head)
|
||||
while (!list_empty(head)) {
|
||||
prepare_to_wait(&mdev->ee_wait, &wait, TASK_UNINTERRUPTIBLE);
|
||||
spin_unlock_irq(&mdev->req_lock);
|
||||
drbd_kick_lo(mdev);
|
||||
schedule();
|
||||
io_schedule();
|
||||
finish_wait(&mdev->ee_wait, &wait);
|
||||
spin_lock_irq(&mdev->req_lock);
|
||||
}
|
||||
@@ -1111,8 +1100,6 @@ next_bio:
|
||||
/* > e->sector, unless this is the first bio */
|
||||
bio->bi_sector = sector;
|
||||
bio->bi_bdev = mdev->ldev->backing_bdev;
|
||||
/* we special case some flags in the multi-bio case, see below
|
||||
* (REQ_UNPLUG) */
|
||||
bio->bi_rw = rw;
|
||||
bio->bi_private = e;
|
||||
bio->bi_end_io = drbd_endio_sec;
|
||||
@@ -1141,13 +1128,8 @@ next_bio:
|
||||
bios = bios->bi_next;
|
||||
bio->bi_next = NULL;
|
||||
|
||||
/* strip off REQ_UNPLUG unless it is the last bio */
|
||||
if (bios)
|
||||
bio->bi_rw &= ~REQ_UNPLUG;
|
||||
|
||||
drbd_generic_make_request(mdev, fault_type, bio);
|
||||
} while (bios);
|
||||
maybe_kick_lo(mdev);
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
@@ -1167,9 +1149,6 @@ static int receive_Barrier(struct drbd_conf *mdev, enum drbd_packets cmd, unsign
|
||||
|
||||
inc_unacked(mdev);
|
||||
|
||||
if (mdev->net_conf->wire_protocol != DRBD_PROT_C)
|
||||
drbd_kick_lo(mdev);
|
||||
|
||||
mdev->current_epoch->barrier_nr = p->barrier;
|
||||
rv = drbd_may_finish_epoch(mdev, mdev->current_epoch, EV_GOT_BARRIER_NR);
|
||||
|
||||
@@ -1636,12 +1615,11 @@ static unsigned long write_flags_to_bio(struct drbd_conf *mdev, u32 dpf)
|
||||
{
|
||||
if (mdev->agreed_pro_version >= 95)
|
||||
return (dpf & DP_RW_SYNC ? REQ_SYNC : 0) |
|
||||
(dpf & DP_UNPLUG ? REQ_UNPLUG : 0) |
|
||||
(dpf & DP_FUA ? REQ_FUA : 0) |
|
||||
(dpf & DP_FLUSH ? REQ_FUA : 0) |
|
||||
(dpf & DP_DISCARD ? REQ_DISCARD : 0);
|
||||
else
|
||||
return dpf & DP_RW_SYNC ? (REQ_SYNC | REQ_UNPLUG) : 0;
|
||||
return dpf & DP_RW_SYNC ? REQ_SYNC : 0;
|
||||
}
|
||||
|
||||
/* mirrored write */
|
||||
@@ -3556,9 +3534,6 @@ static int receive_skip(struct drbd_conf *mdev, enum drbd_packets cmd, unsigned
|
||||
|
||||
static int receive_UnplugRemote(struct drbd_conf *mdev, enum drbd_packets cmd, unsigned int data_size)
|
||||
{
|
||||
if (mdev->state.disk >= D_INCONSISTENT)
|
||||
drbd_kick_lo(mdev);
|
||||
|
||||
/* Make sure we've acked all the TCP data associated
|
||||
* with the data requests being unplugged */
|
||||
drbd_tcp_quickack(mdev->data.socket);
|
||||
|
||||
@@ -960,10 +960,6 @@ allocate_barrier:
|
||||
bio_endio(req->private_bio, -EIO);
|
||||
}
|
||||
|
||||
/* we need to plug ALWAYS since we possibly need to kick lo_dev.
|
||||
* we plug after submit, so we won't miss an unplug event */
|
||||
drbd_plug_device(mdev);
|
||||
|
||||
return 0;
|
||||
|
||||
fail_conflicting:
|
||||
|
||||
@@ -792,7 +792,6 @@ int drbd_resync_finished(struct drbd_conf *mdev)
|
||||
* queue (or even the read operations for those packets
|
||||
* is not finished by now). Retry in 100ms. */
|
||||
|
||||
drbd_kick_lo(mdev);
|
||||
__set_current_state(TASK_INTERRUPTIBLE);
|
||||
schedule_timeout(HZ / 10);
|
||||
w = kmalloc(sizeof(struct drbd_work), GFP_ATOMIC);
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user