Commit 8abfc6e7 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-2.6.37/drivers' of git://git.kernel.dk/linux-2.6-block

* 'for-2.6.37/drivers' of git://git.kernel.dk/linux-2.6-block: (95 commits)
  cciss: fix PCI IDs for new Smart Array controllers
  drbd: add race-breaker to drbd_go_diskless
  drbd: use dynamic_dev_dbg to optionally log uuid changes
  dynamic_debug.h: Fix dynamic_dev_dbg() macro if CONFIG_DYNAMIC_DEBUG not set
  drbd: cleanup: change "<= 0" to "== 0"
  drbd: relax the grace period of the md_sync timer again
  drbd: add some more explicit drbd_md_sync
  drbd: drop wrong debug asserts, fix recently introduced race
  drbd: cleanup useless leftover warn/error printk's
  drbd: add explicit drbd_md_sync to drbd_resync_finished
  drbd: Do not log an ASSERT for P_OV_REQUEST packets while C_CONNECTED
  drbd: fix for possible deadlock on IO error during resync
  drbd: fix unlikely access after free and list corruption
  drbd: fix for spurious fullsync (uuids rotated too fast)
  drbd: allow for explicit resync-finished notifications
  drbd: preparation commit, using full state in receive_state()
  drbd: drbd_send_ack_dp must not rely on header information
  drbd: Fix regression in recv_bm_rle_bits (compressed bitmap)
  drbd: Fixed a stupid copy and paste error
  drbd: Allow larger values for c-fill-target.
  ...

Fix up trivial conflict in drivers/block/ataflop.c due to BKL removal
parents e9dd2b68 6362beea
...@@ -115,8 +115,6 @@ static unsigned long int fd_def_df0 = FD_DD_3; /* default for df0 if it does ...@@ -115,8 +115,6 @@ static unsigned long int fd_def_df0 = FD_DD_3; /* default for df0 if it does
module_param(fd_def_df0, ulong, 0); module_param(fd_def_df0, ulong, 0);
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
static struct request_queue *floppy_queue;
/* /*
* Macros * Macros
*/ */
...@@ -165,6 +163,7 @@ static volatile int selected = -1; /* currently selected drive */ ...@@ -165,6 +163,7 @@ static volatile int selected = -1; /* currently selected drive */
static int writepending; static int writepending;
static int writefromint; static int writefromint;
static char *raw_buf; static char *raw_buf;
static int fdc_queue;
static DEFINE_SPINLOCK(amiflop_lock); static DEFINE_SPINLOCK(amiflop_lock);
...@@ -1335,6 +1334,42 @@ static int get_track(int drive, int track) ...@@ -1335,6 +1334,42 @@ static int get_track(int drive, int track)
return -1; return -1;
} }
/*
* Round-robin between our available drives, doing one request from each
*/
static struct request *set_next_request(void)
{
struct request_queue *q;
int cnt = FD_MAX_UNITS;
struct request *rq;
/* Find next queue we can dispatch from */
fdc_queue = fdc_queue + 1;
if (fdc_queue == FD_MAX_UNITS)
fdc_queue = 0;
for(cnt = FD_MAX_UNITS; cnt > 0; cnt--) {
if (unit[fdc_queue].type->code == FD_NODRIVE) {
if (++fdc_queue == FD_MAX_UNITS)
fdc_queue = 0;
continue;
}
q = unit[fdc_queue].gendisk->queue;
if (q) {
rq = blk_fetch_request(q);
if (rq)
break;
}
if (++fdc_queue == FD_MAX_UNITS)
fdc_queue = 0;
}
return rq;
}
static void redo_fd_request(void) static void redo_fd_request(void)
{ {
struct request *rq; struct request *rq;
...@@ -1346,7 +1381,7 @@ static void redo_fd_request(void) ...@@ -1346,7 +1381,7 @@ static void redo_fd_request(void)
int err; int err;
next_req: next_req:
rq = blk_fetch_request(floppy_queue); rq = set_next_request();
if (!rq) { if (!rq) {
/* Nothing left to do */ /* Nothing left to do */
return; return;
...@@ -1683,6 +1718,13 @@ static int __init fd_probe_drives(void) ...@@ -1683,6 +1718,13 @@ static int __init fd_probe_drives(void)
continue; continue;
} }
unit[drive].gendisk = disk; unit[drive].gendisk = disk;
disk->queue = blk_init_queue(do_fd_request, &amiflop_lock);
if (!disk->queue) {
unit[drive].type->code = FD_NODRIVE;
continue;
}
drives++; drives++;
if ((unit[drive].trackbuf = kmalloc(FLOPPY_MAX_SECTORS * 512, GFP_KERNEL)) == NULL) { if ((unit[drive].trackbuf = kmalloc(FLOPPY_MAX_SECTORS * 512, GFP_KERNEL)) == NULL) {
printk("no mem for "); printk("no mem for ");
...@@ -1696,7 +1738,6 @@ static int __init fd_probe_drives(void) ...@@ -1696,7 +1738,6 @@ static int __init fd_probe_drives(void)
disk->fops = &floppy_fops; disk->fops = &floppy_fops;
sprintf(disk->disk_name, "fd%d", drive); sprintf(disk->disk_name, "fd%d", drive);
disk->private_data = &unit[drive]; disk->private_data = &unit[drive];
disk->queue = floppy_queue;
set_capacity(disk, 880*2); set_capacity(disk, 880*2);
add_disk(disk); add_disk(disk);
} }
...@@ -1744,11 +1785,6 @@ static int __init amiga_floppy_probe(struct platform_device *pdev) ...@@ -1744,11 +1785,6 @@ static int __init amiga_floppy_probe(struct platform_device *pdev)
goto out_irq2; goto out_irq2;
} }
ret = -ENOMEM;
floppy_queue = blk_init_queue(do_fd_request, &amiflop_lock);
if (!floppy_queue)
goto out_queue;
ret = -ENODEV; ret = -ENODEV;
if (fd_probe_drives() < 1) /* No usable drives */ if (fd_probe_drives() < 1) /* No usable drives */
goto out_probe; goto out_probe;
...@@ -1792,8 +1828,6 @@ static int __init amiga_floppy_probe(struct platform_device *pdev) ...@@ -1792,8 +1828,6 @@ static int __init amiga_floppy_probe(struct platform_device *pdev)
return 0; return 0;
out_probe: out_probe:
blk_cleanup_queue(floppy_queue);
out_queue:
free_irq(IRQ_AMIGA_CIAA_TB, NULL); free_irq(IRQ_AMIGA_CIAA_TB, NULL);
out_irq2: out_irq2:
free_irq(IRQ_AMIGA_DSKBLK, NULL); free_irq(IRQ_AMIGA_DSKBLK, NULL);
...@@ -1811,9 +1845,12 @@ static int __exit amiga_floppy_remove(struct platform_device *pdev) ...@@ -1811,9 +1845,12 @@ static int __exit amiga_floppy_remove(struct platform_device *pdev)
for( i = 0; i < FD_MAX_UNITS; i++) { for( i = 0; i < FD_MAX_UNITS; i++) {
if (unit[i].type->code != FD_NODRIVE) { if (unit[i].type->code != FD_NODRIVE) {
struct request_queue *q = unit[i].gendisk->queue;
del_gendisk(unit[i].gendisk); del_gendisk(unit[i].gendisk);
put_disk(unit[i].gendisk); put_disk(unit[i].gendisk);
kfree(unit[i].trackbuf); kfree(unit[i].trackbuf);
if (q)
blk_cleanup_queue(q);
} }
} }
blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256); blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
...@@ -1821,7 +1858,6 @@ static int __exit amiga_floppy_remove(struct platform_device *pdev) ...@@ -1821,7 +1858,6 @@ static int __exit amiga_floppy_remove(struct platform_device *pdev)
free_irq(IRQ_AMIGA_DSKBLK, NULL); free_irq(IRQ_AMIGA_DSKBLK, NULL);
custom.dmacon = DMAF_DISK; /* disable DMA */ custom.dmacon = DMAF_DISK; /* disable DMA */
amiga_chip_free(raw_buf); amiga_chip_free(raw_buf);
blk_cleanup_queue(floppy_queue);
unregister_blkdev(FLOPPY_MAJOR, "fd"); unregister_blkdev(FLOPPY_MAJOR, "fd");
} }
#endif #endif
......
...@@ -80,8 +80,8 @@ ...@@ -80,8 +80,8 @@
#undef DEBUG #undef DEBUG
static DEFINE_MUTEX(ataflop_mutex); static DEFINE_MUTEX(ataflop_mutex);
static struct request_queue *floppy_queue;
static struct request *fd_request; static struct request *fd_request;
static int fdc_queue;
/* Disk types: DD, HD, ED */ /* Disk types: DD, HD, ED */
static struct atari_disk_type { static struct atari_disk_type {
...@@ -1392,6 +1392,29 @@ static void setup_req_params( int drive ) ...@@ -1392,6 +1392,29 @@ static void setup_req_params( int drive )
ReqTrack, ReqSector, (unsigned long)ReqData )); ReqTrack, ReqSector, (unsigned long)ReqData ));
} }
/*
* Round-robin between our available drives, doing one request from each
*/
static struct request *set_next_request(void)
{
struct request_queue *q;
int old_pos = fdc_queue;
struct request *rq;
do {
q = unit[fdc_queue].disk->queue;
if (++fdc_queue == FD_MAX_UNITS)
fdc_queue = 0;
if (q) {
rq = blk_fetch_request(q);
if (rq)
break;
}
} while (fdc_queue != old_pos);
return rq;
}
static void redo_fd_request(void) static void redo_fd_request(void)
{ {
...@@ -1406,7 +1429,7 @@ static void redo_fd_request(void) ...@@ -1406,7 +1429,7 @@ static void redo_fd_request(void)
repeat: repeat:
if (!fd_request) { if (!fd_request) {
fd_request = blk_fetch_request(floppy_queue); fd_request = set_next_request();
if (!fd_request) if (!fd_request)
goto the_end; goto the_end;
} }
...@@ -1933,10 +1956,6 @@ static int __init atari_floppy_init (void) ...@@ -1933,10 +1956,6 @@ static int __init atari_floppy_init (void)
PhysTrackBuffer = virt_to_phys(TrackBuffer); PhysTrackBuffer = virt_to_phys(TrackBuffer);
BufferDrive = BufferSide = BufferTrack = -1; BufferDrive = BufferSide = BufferTrack = -1;
floppy_queue = blk_init_queue(do_fd_request, &ataflop_lock);
if (!floppy_queue)
goto Enomem;
for (i = 0; i < FD_MAX_UNITS; i++) { for (i = 0; i < FD_MAX_UNITS; i++) {
unit[i].track = -1; unit[i].track = -1;
unit[i].flags = 0; unit[i].flags = 0;
...@@ -1945,7 +1964,10 @@ static int __init atari_floppy_init (void) ...@@ -1945,7 +1964,10 @@ static int __init atari_floppy_init (void)
sprintf(unit[i].disk->disk_name, "fd%d", i); sprintf(unit[i].disk->disk_name, "fd%d", i);
unit[i].disk->fops = &floppy_fops; unit[i].disk->fops = &floppy_fops;
unit[i].disk->private_data = &unit[i]; unit[i].disk->private_data = &unit[i];
unit[i].disk->queue = floppy_queue; unit[i].disk->queue = blk_init_queue(do_fd_request,
&ataflop_lock);
if (!unit[i].disk->queue)
goto Enomem;
set_capacity(unit[i].disk, MAX_DISK_SIZE * 2); set_capacity(unit[i].disk, MAX_DISK_SIZE * 2);
add_disk(unit[i].disk); add_disk(unit[i].disk);
} }
...@@ -1960,10 +1982,14 @@ static int __init atari_floppy_init (void) ...@@ -1960,10 +1982,14 @@ static int __init atari_floppy_init (void)
return 0; return 0;
Enomem: Enomem:
while (i--) while (i--) {
struct request_queue *q = unit[i].disk->queue;
put_disk(unit[i].disk); put_disk(unit[i].disk);
if (floppy_queue) if (q)
blk_cleanup_queue(floppy_queue); blk_cleanup_queue(q);
}
unregister_blkdev(FLOPPY_MAJOR, "fd"); unregister_blkdev(FLOPPY_MAJOR, "fd");
return -ENOMEM; return -ENOMEM;
} }
...@@ -2012,12 +2038,14 @@ static void __exit atari_floppy_exit(void) ...@@ -2012,12 +2038,14 @@ static void __exit atari_floppy_exit(void)
int i; int i;
blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256); blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
for (i = 0; i < FD_MAX_UNITS; i++) { for (i = 0; i < FD_MAX_UNITS; i++) {
struct request_queue *q = unit[i].disk->queue;
del_gendisk(unit[i].disk); del_gendisk(unit[i].disk);
put_disk(unit[i].disk); put_disk(unit[i].disk);
blk_cleanup_queue(q);
} }
unregister_blkdev(FLOPPY_MAJOR, "fd"); unregister_blkdev(FLOPPY_MAJOR, "fd");
blk_cleanup_queue(floppy_queue);
del_timer_sync(&fd_timer); del_timer_sync(&fd_timer);
atari_stram_free( DMABuffer ); atari_stram_free( DMABuffer );
} }
......
This diff is collapsed.
...@@ -965,29 +965,30 @@ void __drbd_set_in_sync(struct drbd_conf *mdev, sector_t sector, int size, ...@@ -965,29 +965,30 @@ void __drbd_set_in_sync(struct drbd_conf *mdev, sector_t sector, int size,
* ok, (capacity & 7) != 0 sometimes, but who cares... * ok, (capacity & 7) != 0 sometimes, but who cares...
* we count rs_{total,left} in bits, not sectors. * we count rs_{total,left} in bits, not sectors.
*/ */
spin_lock_irqsave(&mdev->al_lock, flags);
count = drbd_bm_clear_bits(mdev, sbnr, ebnr); count = drbd_bm_clear_bits(mdev, sbnr, ebnr);
if (count) { if (count && get_ldev(mdev)) {
/* we need the lock for drbd_try_clear_on_disk_bm */ unsigned long now = jiffies;
if (jiffies - mdev->rs_mark_time > HZ*10) { unsigned long last = mdev->rs_mark_time[mdev->rs_last_mark];
/* should be rolling marks, int next = (mdev->rs_last_mark + 1) % DRBD_SYNC_MARKS;
* but we estimate only anyways. */ if (time_after_eq(now, last + DRBD_SYNC_MARK_STEP)) {
if (mdev->rs_mark_left != drbd_bm_total_weight(mdev) && unsigned long tw = drbd_bm_total_weight(mdev);
if (mdev->rs_mark_left[mdev->rs_last_mark] != tw &&
mdev->state.conn != C_PAUSED_SYNC_T && mdev->state.conn != C_PAUSED_SYNC_T &&
mdev->state.conn != C_PAUSED_SYNC_S) { mdev->state.conn != C_PAUSED_SYNC_S) {
mdev->rs_mark_time = jiffies; mdev->rs_mark_time[next] = now;
mdev->rs_mark_left = drbd_bm_total_weight(mdev); mdev->rs_mark_left[next] = tw;
mdev->rs_last_mark = next;
} }
} }
if (get_ldev(mdev)) { spin_lock_irqsave(&mdev->al_lock, flags);
drbd_try_clear_on_disk_bm(mdev, sector, count, TRUE); drbd_try_clear_on_disk_bm(mdev, sector, count, TRUE);
put_ldev(mdev); spin_unlock_irqrestore(&mdev->al_lock, flags);
}
/* just wake_up unconditional now, various lc_chaged(), /* just wake_up unconditional now, various lc_chaged(),
* lc_put() in drbd_try_clear_on_disk_bm(). */ * lc_put() in drbd_try_clear_on_disk_bm(). */
wake_up = 1; wake_up = 1;
put_ldev(mdev);
} }
spin_unlock_irqrestore(&mdev->al_lock, flags);
if (wake_up) if (wake_up)
wake_up(&mdev->al_wait); wake_up(&mdev->al_wait);
} }
...@@ -1118,7 +1119,7 @@ static int _is_in_al(struct drbd_conf *mdev, unsigned int enr) ...@@ -1118,7 +1119,7 @@ static int _is_in_al(struct drbd_conf *mdev, unsigned int enr)
* @mdev: DRBD device. * @mdev: DRBD device.
* @sector: The sector number. * @sector: The sector number.
* *
* This functions sleeps on al_wait. Returns 1 on success, 0 if interrupted. * This functions sleeps on al_wait. Returns 0 on success, -EINTR if interrupted.
*/ */
int drbd_rs_begin_io(struct drbd_conf *mdev, sector_t sector) int drbd_rs_begin_io(struct drbd_conf *mdev, sector_t sector)
{ {
...@@ -1129,10 +1130,10 @@ int drbd_rs_begin_io(struct drbd_conf *mdev, sector_t sector) ...@@ -1129,10 +1130,10 @@ int drbd_rs_begin_io(struct drbd_conf *mdev, sector_t sector)
sig = wait_event_interruptible(mdev->al_wait, sig = wait_event_interruptible(mdev->al_wait,
(bm_ext = _bme_get(mdev, enr))); (bm_ext = _bme_get(mdev, enr)));
if (sig) if (sig)
return 0; return -EINTR;
if (test_bit(BME_LOCKED, &bm_ext->flags)) if (test_bit(BME_LOCKED, &bm_ext->flags))
return 1; return 0;
for (i = 0; i < AL_EXT_PER_BM_SECT; i++) { for (i = 0; i < AL_EXT_PER_BM_SECT; i++) {
sig = wait_event_interruptible(mdev->al_wait, sig = wait_event_interruptible(mdev->al_wait,
...@@ -1145,13 +1146,11 @@ int drbd_rs_begin_io(struct drbd_conf *mdev, sector_t sector) ...@@ -1145,13 +1146,11 @@ int drbd_rs_begin_io(struct drbd_conf *mdev, sector_t sector)
wake_up(&mdev->al_wait); wake_up(&mdev->al_wait);
} }
spin_unlock_irq(&mdev->al_lock); spin_unlock_irq(&mdev->al_lock);
return 0; return -EINTR;
} }
} }
set_bit(BME_LOCKED, &bm_ext->flags); set_bit(BME_LOCKED, &bm_ext->flags);
return 0;
return 1;
} }
/** /**
......
...@@ -569,7 +569,7 @@ int drbd_bm_resize(struct drbd_conf *mdev, sector_t capacity, int set_new_bits) ...@@ -569,7 +569,7 @@ int drbd_bm_resize(struct drbd_conf *mdev, sector_t capacity, int set_new_bits)
* *
* maybe bm_set should be atomic_t ? * maybe bm_set should be atomic_t ?
*/ */
static unsigned long _drbd_bm_total_weight(struct drbd_conf *mdev) unsigned long _drbd_bm_total_weight(struct drbd_conf *mdev)
{ {
struct drbd_bitmap *b = mdev->bitmap; struct drbd_bitmap *b = mdev->bitmap;
unsigned long s; unsigned long s;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -57,6 +57,7 @@ static void drbd_syncer_progress(struct drbd_conf *mdev, struct seq_file *seq) ...@@ -57,6 +57,7 @@ static void drbd_syncer_progress(struct drbd_conf *mdev, struct seq_file *seq)
unsigned long db, dt, dbdt, rt, rs_left; unsigned long db, dt, dbdt, rt, rs_left;
unsigned int res; unsigned int res;
int i, x, y; int i, x, y;
int stalled = 0;
drbd_get_syncer_progress(mdev, &rs_left, &res); drbd_get_syncer_progress(mdev, &rs_left, &res);
...@@ -90,18 +91,17 @@ static void drbd_syncer_progress(struct drbd_conf *mdev, struct seq_file *seq) ...@@ -90,18 +91,17 @@ static void drbd_syncer_progress(struct drbd_conf *mdev, struct seq_file *seq)
* db: blocks written from mark until now * db: blocks written from mark until now
* rt: remaining time * rt: remaining time
*/ */
dt = (jiffies - mdev->rs_mark_time) / HZ; /* Rolling marks. last_mark+1 may just now be modified. last_mark+2 is
* at least (DRBD_SYNC_MARKS-2)*DRBD_SYNC_MARK_STEP old, and has at
if (dt > 20) { * least DRBD_SYNC_MARK_STEP time before it will be modified. */
/* if we made no update to rs_mark_time for too long, i = (mdev->rs_last_mark + 2) % DRBD_SYNC_MARKS;
* we are stalled. show that. */ dt = (jiffies - mdev->rs_mark_time[i]) / HZ;
seq_printf(seq, "stalled\n"); if (dt > (DRBD_SYNC_MARK_STEP * DRBD_SYNC_MARKS))
return; stalled = 1;
}
if (!dt) if (!dt)
dt++; dt++;
db = mdev->rs_mark_left - rs_left; db = mdev->rs_mark_left[i] - rs_left;
rt = (dt * (rs_left / (db/100+1)))/100; /* seconds */ rt = (dt * (rs_left / (db/100+1)))/100; /* seconds */
seq_printf(seq, "finish: %lu:%02lu:%02lu", seq_printf(seq, "finish: %lu:%02lu:%02lu",
...@@ -118,7 +118,7 @@ static void drbd_syncer_progress(struct drbd_conf *mdev, struct seq_file *seq) ...@@ -118,7 +118,7 @@ static void drbd_syncer_progress(struct drbd_conf *mdev, struct seq_file *seq)
/* mean speed since syncer started /* mean speed since syncer started
* we do account for PausedSync periods */ * we do account for PausedSync periods */
dt = (jiffies - mdev->rs_start - mdev->rs_paused) / HZ; dt = (jiffies - mdev->rs_start - mdev->rs_paused) / HZ;
if (dt <= 0) if (dt == 0)
dt = 1; dt = 1;
db = mdev->rs_total - rs_left; db = mdev->rs_total - rs_left;
dbdt = Bit2KB(db/dt); dbdt = Bit2KB(db/dt);
...@@ -128,7 +128,14 @@ static void drbd_syncer_progress(struct drbd_conf *mdev, struct seq_file *seq) ...@@ -128,7 +128,14 @@ static void drbd_syncer_progress(struct drbd_conf *mdev, struct seq_file *seq)
else else
seq_printf(seq, " (%ld)", dbdt); seq_printf(seq, " (%ld)", dbdt);
seq_printf(seq, " K/sec\n"); if (mdev->state.conn == C_SYNC_TARGET) {
if (mdev->c_sync_rate > 1000)
seq_printf(seq, " want: %d,%03d",
mdev->c_sync_rate / 1000, mdev->c_sync_rate % 1000);
else
seq_printf(seq, " want: %d", mdev->c_sync_rate);
}
seq_printf(seq, " K/sec%s\n", stalled ? " (stalled)" : "");
} }
static void resync_dump_detail(struct seq_file *seq, struct lc_element *e) static void resync_dump_detail(struct seq_file *seq, struct lc_element *e)
...@@ -196,7 +203,7 @@ static int drbd_seq_show(struct seq_file *seq, void *v) ...@@ -196,7 +203,7 @@ static int drbd_seq_show(struct seq_file *seq, void *v)
seq_printf(seq, "%2d: cs:Unconfigured\n", i); seq_printf(seq, "%2d: cs:Unconfigured\n", i);
} else { } else {
seq_printf(seq, seq_printf(seq,
"%2d: cs:%s ro:%s/%s ds:%s/%s %c %c%c%c%c%c\n" "%2d: cs:%s ro:%s/%s ds:%s/%s %c %c%c%c%c%c%c\n"
" ns:%u nr:%u dw:%u dr:%u al:%u bm:%u " " ns:%u nr:%u dw:%u dr:%u al:%u bm:%u "
"lo:%d pe:%d ua:%d ap:%d ep:%d wo:%c", "lo:%d pe:%d ua:%d ap:%d ep:%d wo:%c",
i, sn, i, sn,
...@@ -206,11 +213,12 @@ static int drbd_seq_show(struct seq_file *seq, void *v) ...@@ -206,11 +213,12 @@ static int drbd_seq_show(struct seq_file *seq, void *v)
drbd_disk_str(mdev->state.pdsk), drbd_disk_str(mdev->state.pdsk),
(mdev->net_conf == NULL ? ' ' : (mdev->net_conf == NULL ? ' ' :
(mdev->net_conf->wire_protocol - DRBD_PROT_A+'A')), (mdev->net_conf->wire_protocol - DRBD_PROT_A+'A')),
mdev->state.susp ? 's' : 'r', is_susp(mdev->state) ? 's' : 'r',
mdev->state.aftr_isp ? 'a' : '-', mdev->state.aftr_isp ? 'a' : '-',
mdev->state.peer_isp ? 'p' : '-', mdev->state.peer_isp ? 'p' : '-',
mdev->state.user_isp ? 'u' : '-', mdev->state.user_isp ? 'u' : '-',
mdev->congestion_reason ?: '-', mdev->congestion_reason ?: '-',
test_bit(AL_SUSPENDED, &mdev->flags) ? 's' : '-',
mdev->send_cnt/2, mdev->send_cnt/2,
mdev->recv_cnt/2, mdev->recv_cnt/2,
mdev->writ_cnt/2, mdev->writ_cnt/2,
......
This diff is collapsed.
This diff is collapsed.
...@@ -104,6 +104,9 @@ enum drbd_req_event { ...@@ -104,6 +104,9 @@ enum drbd_req_event {
read_ahead_completed_with_error, read_ahead_completed_with_error,
write_completed_with_error, write_completed_with_error,
completed_ok, completed_ok,
resend,
fail_frozen_disk_io,
restart_frozen_disk_io,
nothing, /* for tracing only */ nothing, /* for tracing only */
}; };
...@@ -183,6 +186,12 @@ enum drbd_req_state_bits { ...@@ -183,6 +186,12 @@ enum drbd_req_state_bits {
/* keep this last, its for the RQ_NET_MASK */ /* keep this last, its for the RQ_NET_MASK */
__RQ_NET_MAX, __RQ_NET_MAX,
/* Set when this is a write, clear for a read */
__RQ_WRITE,
/* Should call drbd_al_complete_io() for this request... */
__RQ_IN_ACT_LOG,
}; };
#define RQ_LOCAL_PENDING (1UL << __RQ_LOCAL_PENDING) #define RQ_LOCAL_PENDING (1UL << __RQ_LOCAL_PENDING)
...@@ -201,6 +210,16 @@ enum drbd_req_state_bits { ...@@ -201,6 +210,16 @@ enum drbd_req_state_bits {
/* 0x1f8 */ /* 0x1f8 */
#define RQ_NET_MASK (((1UL << __RQ_NET_MAX)-1) & ~RQ_LOCAL_MASK) #define RQ_NET_MASK (((1UL << __RQ_NET_MAX)-1) & ~RQ_LOCAL_MASK)
#define RQ_WRITE (1UL << __RQ_WRITE)
#define RQ_IN_ACT_LOG (1UL << __RQ_IN_ACT_LOG)
/* For waking up the frozen transfer log mod_req() has to return if the request
should be counted in the epoch object*/
#define MR_WRITE_SHIFT 0
#define MR_WRITE (1 << MR_WRITE_SHIFT)
#define MR_READ_SHIFT 1
#define MR_READ (1 << MR_READ_SHIFT)
/* epoch entries */ /* epoch entries */
static inline static inline
struct hlist_head *ee_hash_slot(struct drbd_conf *mdev, sector_t sector) struct hlist_head *ee_hash_slot(struct drbd_conf *mdev, sector_t sector)
...@@ -244,30 +263,36 @@ static inline struct drbd_request *_ar_id_to_req(struct drbd_conf *mdev, ...@@ -244,30 +263,36 @@ static inline struct drbd_request *_ar_id_to_req(struct drbd_conf *mdev,
return NULL; return NULL;
} }
static inline void drbd_req_make_private_bio(struct drbd_request *req, struct bio *bio_src)
{
struct bio *bio;
bio = bio_clone(bio_src, GFP_NOIO); /* XXX cannot fail?? */
req->private_bio = bio;
bio->bi_private = req;
bio->bi_end_io = drbd_endio_pri;
bio->bi_next = NULL;
}
static inline struct drbd_request *drbd_req_new(struct drbd_conf *mdev, static inline struct drbd_request *drbd_req_new(struct drbd_conf *mdev,
struct bio *bio_src) struct bio *bio_src)
{ {
struct bio *bio;
struct drbd_request *req = struct drbd_request *req =
mempool_alloc(drbd_request_mempool, GFP_NOIO); mempool_alloc(drbd_request_mempool, GFP_NOIO);
if (likely(req)) { if (likely(req)) {
bio = bio_clone(bio_src, GFP_NOIO); /* XXX cannot fail?? */ drbd_req_make_private_bio(req, bio_src);
req->rq_state = 0; req->rq_state = bio_data_dir(bio_src) == WRITE ? RQ_WRITE : 0;
req->mdev = mdev; req->mdev = mdev;
req->master_bio = bio_src; req->master_bio = bio_src;
req->private_bio = bio;
req->epoch = 0; req->epoch = 0;
req->sector = bio->bi_sector; req->sector = bio_src->bi_sector;
req->size = bio->bi_size; req->size = bio_src->bi_size;
req->start_time = jiffies; req->start_time = jiffies;
INIT_HLIST_NODE(&req->colision); INIT_HLIST_NODE(&req->colision);
INIT_LIST_HEAD(&req->tl_requests); INIT_LIST_HEAD(&req->tl_requests);
INIT_LIST_HEAD(&req->w.list); INIT_LIST_HEAD(&req->w.list);
bio->bi_private = req;
bio->bi_end_io = drbd_endio_pri;
bio->bi_next = NULL;
} }
return req; return req;
} }
...@@ -292,36 +317,43 @@ struct bio_and_error { ...@@ -292,36 +317,43 @@ struct bio_and_error {
extern void _req_may_be_done(struct drbd_request *req, extern void _req_may_be_done(struct drbd_request *req,
struct bio_and_error *m); struct bio_and_error *m);
extern void __req_mod(struct drbd_request *req, enum drbd_req_event what, extern int __req_mod(struct drbd_request *req, enum drbd_req_event what,
struct bio_and_error *m); struct bio_and_error *m);
extern void complete_master_bio(struct drbd_conf *mdev, extern void complete_master_bio(struct drbd_conf *mdev,
struct bio_and_error *m); struct bio_and_error *m);
/* use this if you don't want to deal with calling complete_master_bio() /* use this if you don't want to deal with calling complete_master_bio()
* outside the spinlock, e.g. when walking some list on cleanup. */ * outside the spinlock, e.g. when walking some list on cleanup. */
static inline void _req_mod(struct drbd_request *req, enum drbd_req_event what) static inline int _req_mod(struct drbd_request *req, enum drbd_req_event what)
{ {
struct drbd_conf *mdev = req->mdev; struct drbd_conf *mdev = req->mdev;
struct bio_and_error m; struct bio_and_error m;
int rv;
/* __req_mod possibly frees req, do not touch req after that! */ /* __req_mod possibly frees req, do not touch req after that! */
__req_mod(req, what, &m); rv = __req_mod(req, what, &m);
if (m.bio) if (m.bio)
complete_master_bio(mdev, &m); complete_master_bio(mdev, &m);
return rv;
} }
/* completion of master bio is outside of spinlock. /* completion of master bio is outside of spinlock.
* If you need it irqsave, do it your self! */ * If you need it irqsave, do it your self! */
static inline void req_mod(struct drbd_request *req, static inline int req_mod(struct drbd_request *req,
enum drbd_req_event what) enum drbd_req_event what)
{ {
struct drbd_conf *mdev = req->mdev; struct drbd_conf *mdev = req->mdev;
struct bio_and_error m; struct bio_and_error m;
int rv;
spin_lock_irq(&mdev->req_lock); spin_lock_irq(&mdev->req_lock);
__req_mod(req, what, &m); rv = __req_mod(req, what, &m);
spin_unlock_irq(&mdev->req_lock); spin_unlock_irq(&mdev->req_lock);
if (m.bio) if (m.bio)
complete_master_bio(mdev, &m); complete_master_bio(mdev, &m);
return rv;
} }
#endif #endif
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -128,26 +128,31 @@ ...@@ -128,26 +128,31 @@
#define DRBD_AFTER_SB_1P_DEF ASB_DISCONNECT #define DRBD_AFTER_SB_1P_DEF ASB_DISCONNECT
#define DRBD_AFTER_SB_2P_DEF ASB_DISCONNECT #define DRBD_AFTER_SB_2P_DEF ASB_DISCONNECT
#define DRBD_RR_CONFLICT_DEF ASB_DISCONNECT #define DRBD_RR_CONFLICT_DEF ASB_DISCONNECT
#define DRBD_ON_NO_DATA_DEF OND_IO_ERROR
#define DRBD_MAX_BIO_BVECS_MIN 0 #define DRBD_MAX_BIO_BVECS_MIN 0
#define DRBD_MAX_BIO_BVECS_MAX 128 #define DRBD_MAX_BIO_BVECS_MAX 128
#define DRBD_MAX_BIO_BVECS_DEF 0 #define DRBD_MAX_BIO_BVECS_DEF 0
#define DRBD_DP_VOLUME_MIN 4 #define DRBD_C_PLAN_AHEAD_MIN 0
#define DRBD_DP_VOLUME_MAX 1048576 #define DRBD_C_PLAN_AHEAD_MAX 300
#define DRBD_DP_VOLUME_DEF 16384 #define DRBD_C_PLAN_AHEAD_DEF 0 /* RS rate controller disabled by default */
#define DRBD_DP_INTERVAL_MIN 1 #define DRBD_C_DELAY_TARGET_MIN 1
#define DRBD_DP_INTERVAL_MAX 600 #define DRBD_C_DELAY_TARGET_MAX 100
#define DRBD_DP_INTERVAL_DEF 5 #define DRBD_C_DELAY_TARGET_DEF 10
#define DRBD_RS_THROTTLE_TH_MIN 1 #define DRBD_C_FILL_TARGET_MIN 0
#define DRBD_RS_THROTTLE_TH_MAX 600 #define DRBD_C_FILL_TARGET_MAX (1<<20) /* 500MByte in sec */
#define DRBD_RS_THROTTLE_TH_DEF 20 #define DRBD_C_FILL_TARGET_DEF 0 /* By default disabled -> controlled by delay_target */
#define DRBD_RS_HOLD_OFF_TH_MIN 1 #define DRBD_C_MAX_RATE_MIN 250 /* kByte/sec */
#define DRBD_RS_HOLD_OFF_TH_MAX 6000 #define DRBD_C_MAX_RATE_MAX (4 << 20)
#define DRBD_RS_HOLD_OFF_TH_DEF 100 #define DRBD_C_MAX_RATE_DEF 102400
#define DRBD_C_MIN_RATE_MIN 0 /* kByte/sec */
#define DRBD_C_MIN_RATE_MAX (4 << 20)
#define DRBD_C_MIN_RATE_DEF 4096
#undef RANGE #undef RANGE
#endif #endif
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment