git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
[pandora-kernel.git]
/
drivers
/
md
/
raid10.c
diff --git
a/drivers/md/raid10.c
b/drivers/md/raid10.c
index
2da83d5
..
8e94626
100644
(file)
--- a/
drivers/md/raid10.c
+++ b/
drivers/md/raid10.c
@@
-634,12
+634,6
@@
static void flush_pending_writes(conf_t *conf)
spin_unlock_irq(&conf->device_lock);
}
spin_unlock_irq(&conf->device_lock);
}
-static void md_kick_device(mddev_t *mddev)
-{
- blk_flush_plug(current);
- md_wakeup_thread(mddev->thread);
-}
-
/* Barriers....
* Sometimes we need to suspend IO while we do something else,
* either some resync/recovery, or reconfigure the array.
/* Barriers....
* Sometimes we need to suspend IO while we do something else,
* either some resync/recovery, or reconfigure the array.
@@
-669,15
+663,15
@@
static void raise_barrier(conf_t *conf, int force)
/* Wait until no block IO is waiting (unless 'force') */
wait_event_lock_irq(conf->wait_barrier, force || !conf->nr_waiting,
/* Wait until no block IO is waiting (unless 'force') */
wait_event_lock_irq(conf->wait_barrier, force || !conf->nr_waiting,
- conf->resync_lock,
md_kick_device(conf->mddev)
);
+ conf->resync_lock, );
/* block any new IO from starting */
conf->barrier++;
/* block any new IO from starting */
conf->barrier++;
- /* No wait for all pending IO to complete */
+ /* No
w
wait for all pending IO to complete */
wait_event_lock_irq(conf->wait_barrier,
!conf->nr_pending && conf->barrier < RESYNC_DEPTH,
wait_event_lock_irq(conf->wait_barrier,
!conf->nr_pending && conf->barrier < RESYNC_DEPTH,
- conf->resync_lock,
md_kick_device(conf->mddev)
);
+ conf->resync_lock, );
spin_unlock_irq(&conf->resync_lock);
}
spin_unlock_irq(&conf->resync_lock);
}
@@
-698,7
+692,7
@@
static void wait_barrier(conf_t *conf)
conf->nr_waiting++;
wait_event_lock_irq(conf->wait_barrier, !conf->barrier,
conf->resync_lock,
conf->nr_waiting++;
wait_event_lock_irq(conf->wait_barrier, !conf->barrier,
conf->resync_lock,
-
md_kick_device(conf->mddev)
);
+ );
conf->nr_waiting--;
}
conf->nr_pending++;
conf->nr_waiting--;
}
conf->nr_pending++;
@@
-734,8
+728,8
@@
static void freeze_array(conf_t *conf)
wait_event_lock_irq(conf->wait_barrier,
conf->nr_pending == conf->nr_queued+1,
conf->resync_lock,
wait_event_lock_irq(conf->wait_barrier,
conf->nr_pending == conf->nr_queued+1,
conf->resync_lock,
-
({ flush_pending_writes(conf
);
- md_kick_device(conf->mddev); }));
+
flush_pending_writes(conf)
);
+
spin_unlock_irq(&conf->resync_lock);
}
spin_unlock_irq(&conf->resync_lock);
}
@@
-762,6
+756,7
@@
static int make_request(mddev_t *mddev, struct bio * bio)
const unsigned long do_fua = (bio->bi_rw & REQ_FUA);
unsigned long flags;
mdk_rdev_t *blocked_rdev;
const unsigned long do_fua = (bio->bi_rw & REQ_FUA);
unsigned long flags;
mdk_rdev_t *blocked_rdev;
+ int plugged;
if (unlikely(bio->bi_rw & REQ_FLUSH)) {
md_flush_request(mddev, bio);
if (unlikely(bio->bi_rw & REQ_FLUSH)) {
md_flush_request(mddev, bio);
@@
-870,6
+865,8
@@
static int make_request(mddev_t *mddev, struct bio * bio)
* inc refcount on their rdev. Record them by setting
* bios[x] to bio
*/
* inc refcount on their rdev. Record them by setting
* bios[x] to bio
*/
+ plugged = mddev_check_plugged(mddev);
+
raid10_find_phys(conf, r10_bio);
retry_write:
blocked_rdev = NULL;
raid10_find_phys(conf, r10_bio);
retry_write:
blocked_rdev = NULL;
@@
-946,9
+943,8
@@
static int make_request(mddev_t *mddev, struct bio * bio)
/* In case raid10d snuck in to freeze_array */
wake_up(&conf->wait_barrier);
/* In case raid10d snuck in to freeze_array */
wake_up(&conf->wait_barrier);
- if (do_sync || !mddev->bitmap)
+ if (do_sync || !mddev->bitmap
|| !plugged
)
md_wakeup_thread(mddev->thread);
md_wakeup_thread(mddev->thread);
-
return 0;
}
return 0;
}
@@
-1640,9
+1636,11
@@
static void raid10d(mddev_t *mddev)
conf_t *conf = mddev->private;
struct list_head *head = &conf->retry_list;
mdk_rdev_t *rdev;
conf_t *conf = mddev->private;
struct list_head *head = &conf->retry_list;
mdk_rdev_t *rdev;
+ struct blk_plug plug;
md_check_recovery(mddev);
md_check_recovery(mddev);
+ blk_start_plug(&plug);
for (;;) {
char b[BDEVNAME_SIZE];
for (;;) {
char b[BDEVNAME_SIZE];
@@
-1716,6
+1714,7
@@
static void raid10d(mddev_t *mddev)
}
cond_resched();
}
}
cond_resched();
}
+ blk_finish_plug(&plug);
}
}