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.
...@@ -258,8 +258,8 @@ static int irqdma_allocated; ...@@ -258,8 +258,8 @@ static int irqdma_allocated;
#include <linux/completion.h> #include <linux/completion.h>
static struct request *current_req; static struct request *current_req;
static struct request_queue *floppy_queue;
static void do_fd_request(struct request_queue *q); static void do_fd_request(struct request_queue *q);
static int set_next_request(void);
#ifndef fd_get_dma_residue #ifndef fd_get_dma_residue
#define fd_get_dma_residue() get_dma_residue(FLOPPY_DMA) #define fd_get_dma_residue() get_dma_residue(FLOPPY_DMA)
...@@ -413,6 +413,7 @@ static struct gendisk *disks[N_DRIVE]; ...@@ -413,6 +413,7 @@ static struct gendisk *disks[N_DRIVE];
static struct block_device *opened_bdev[N_DRIVE]; static struct block_device *opened_bdev[N_DRIVE];
static DEFINE_MUTEX(open_lock); static DEFINE_MUTEX(open_lock);
static struct floppy_raw_cmd *raw_cmd, default_raw_cmd; static struct floppy_raw_cmd *raw_cmd, default_raw_cmd;
static int fdc_queue;
/* /*
* This struct defines the different floppy types. * This struct defines the different floppy types.
...@@ -890,8 +891,8 @@ static void unlock_fdc(void) ...@@ -890,8 +891,8 @@ static void unlock_fdc(void)
del_timer(&fd_timeout); del_timer(&fd_timeout);
cont = NULL; cont = NULL;
clear_bit(0, &fdc_busy); clear_bit(0, &fdc_busy);
if (current_req || blk_peek_request(floppy_queue)) if (current_req || set_next_request())
do_fd_request(floppy_queue); do_fd_request(current_req->q);
spin_unlock_irqrestore(&floppy_lock, flags); spin_unlock_irqrestore(&floppy_lock, flags);
wake_up(&fdc_wait); wake_up(&fdc_wait);
} }
...@@ -2243,8 +2244,8 @@ static void floppy_end_request(struct request *req, int error) ...@@ -2243,8 +2244,8 @@ static void floppy_end_request(struct request *req, int error)
* logical buffer */ * logical buffer */
static void request_done(int uptodate) static void request_done(int uptodate)
{ {
struct request_queue *q = floppy_queue;
struct request *req = current_req; struct request *req = current_req;
struct request_queue *q;
unsigned long flags; unsigned long flags;
int block; int block;
char msg[sizeof("request done ") + sizeof(int) * 3]; char msg[sizeof("request done ") + sizeof(int) * 3];
...@@ -2258,6 +2259,8 @@ static void request_done(int uptodate) ...@@ -2258,6 +2259,8 @@ static void request_done(int uptodate)
return; return;
} }
q = req->q;
if (uptodate) { if (uptodate) {
/* maintain values for invalidation on geometry /* maintain values for invalidation on geometry
* change */ * change */
...@@ -2811,6 +2814,28 @@ static int make_raw_rw_request(void) ...@@ -2811,6 +2814,28 @@ static int make_raw_rw_request(void)
return 2; return 2;
} }
/*
* Round-robin between our available drives, doing one request from each
*/
static int set_next_request(void)
{
struct request_queue *q;
int old_pos = fdc_queue;
do {
q = disks[fdc_queue]->queue;
if (++fdc_queue == N_DRIVE)
fdc_queue = 0;
if (q) {
current_req = blk_fetch_request(q);
if (current_req)
break;
}
} while (fdc_queue != old_pos);
return current_req != NULL;
}
static void redo_fd_request(void) static void redo_fd_request(void)
{ {
int drive; int drive;
...@@ -2822,17 +2847,17 @@ static void redo_fd_request(void) ...@@ -2822,17 +2847,17 @@ static void redo_fd_request(void)
do_request: do_request:
if (!current_req) { if (!current_req) {
struct request *req; int pending;
spin_lock_irq(&floppy_lock);
pending = set_next_request();
spin_unlock_irq(&floppy_lock);
spin_lock_irq(floppy_queue->queue_lock); if (!pending) {
req = blk_fetch_request(floppy_queue);
spin_unlock_irq(floppy_queue->queue_lock);
if (!req) {
do_floppy = NULL; do_floppy = NULL;
unlock_fdc(); unlock_fdc();
return; return;
} }
current_req = req;
} }
drive = (long)current_req->rq_disk->private_data; drive = (long)current_req->rq_disk->private_data;
set_fdc(drive); set_fdc(drive);
...@@ -4165,6 +4190,13 @@ static int __init floppy_init(void) ...@@ -4165,6 +4190,13 @@ static int __init floppy_init(void)
goto out_put_disk; goto out_put_disk;
} }
disks[dr]->queue = blk_init_queue(do_fd_request, &floppy_lock);
if (!disks[dr]->queue) {
err = -ENOMEM;
goto out_put_disk;
}
blk_queue_max_hw_sectors(disks[dr]->queue, 64);
disks[dr]->major = FLOPPY_MAJOR; disks[dr]->major = FLOPPY_MAJOR;
disks[dr]->first_minor = TOMINOR(dr); disks[dr]->first_minor = TOMINOR(dr);
disks[dr]->fops = &floppy_fops; disks[dr]->fops = &floppy_fops;
...@@ -4183,13 +4215,6 @@ static int __init floppy_init(void) ...@@ -4183,13 +4215,6 @@ static int __init floppy_init(void)
if (err) if (err)
goto out_unreg_blkdev; goto out_unreg_blkdev;
floppy_queue = blk_init_queue(do_fd_request, &floppy_lock);
if (!floppy_queue) {
err = -ENOMEM;
goto out_unreg_driver;
}
blk_queue_max_hw_sectors(floppy_queue, 64);
blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE, blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
floppy_find, NULL, NULL); floppy_find, NULL, NULL);
...@@ -4317,7 +4342,6 @@ static int __init floppy_init(void) ...@@ -4317,7 +4342,6 @@ static int __init floppy_init(void)
/* to be cleaned up... */ /* to be cleaned up... */
disks[drive]->private_data = (void *)(long)drive; disks[drive]->private_data = (void *)(long)drive;
disks[drive]->queue = floppy_queue;
disks[drive]->flags |= GENHD_FL_REMOVABLE; disks[drive]->flags |= GENHD_FL_REMOVABLE;
disks[drive]->driverfs_dev = &floppy_device[drive].dev; disks[drive]->driverfs_dev = &floppy_device[drive].dev;
add_disk(disks[drive]); add_disk(disks[drive]);
...@@ -4333,8 +4357,6 @@ static int __init floppy_init(void) ...@@ -4333,8 +4357,6 @@ static int __init floppy_init(void)
floppy_release_irq_and_dma(); floppy_release_irq_and_dma();
out_unreg_region: out_unreg_region:
blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256); blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
blk_cleanup_queue(floppy_queue);
out_unreg_driver:
platform_driver_unregister(&floppy_driver); platform_driver_unregister(&floppy_driver);
out_unreg_blkdev: out_unreg_blkdev:
unregister_blkdev(FLOPPY_MAJOR, "fd"); unregister_blkdev(FLOPPY_MAJOR, "fd");
...@@ -4342,6 +4364,8 @@ static int __init floppy_init(void) ...@@ -4342,6 +4364,8 @@ static int __init floppy_init(void)
while (dr--) { while (dr--) {
del_timer(&motor_off_timer[dr]); del_timer(&motor_off_timer[dr]);
put_disk(disks[dr]); put_disk(disks[dr]);
if (disks[dr]->queue)
blk_cleanup_queue(disks[dr]->queue);
} }
return err; return err;
} }
...@@ -4550,11 +4574,11 @@ static void __exit floppy_module_exit(void) ...@@ -4550,11 +4574,11 @@ static void __exit floppy_module_exit(void)
platform_device_unregister(&floppy_device[drive]); platform_device_unregister(&floppy_device[drive]);
} }
put_disk(disks[drive]); put_disk(disks[drive]);
blk_cleanup_queue(disks[drive]->queue);
} }
del_timer_sync(&fd_timeout); del_timer_sync(&fd_timeout);
del_timer_sync(&fd_timer); del_timer_sync(&fd_timer);
blk_cleanup_queue(floppy_queue);
if (atomic_read(&usage_count)) if (atomic_read(&usage_count))
floppy_release_irq_and_dma(); floppy_release_irq_and_dma();
......
...@@ -74,6 +74,7 @@ ...@@ -74,6 +74,7 @@
#include <linux/highmem.h> #include <linux/highmem.h>
#include <linux/kthread.h> #include <linux/kthread.h>
#include <linux/splice.h> #include <linux/splice.h>
#include <linux/sysfs.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
...@@ -738,6 +739,103 @@ static inline int is_loop_device(struct file *file) ...@@ -738,6 +739,103 @@ static inline int is_loop_device(struct file *file)
return i && S_ISBLK(i->i_mode) && MAJOR(i->i_rdev) == LOOP_MAJOR; return i && S_ISBLK(i->i_mode) && MAJOR(i->i_rdev) == LOOP_MAJOR;
} }
/* loop sysfs attributes */
static ssize_t loop_attr_show(struct device *dev, char *page,
ssize_t (*callback)(struct loop_device *, char *))
{
struct loop_device *l, *lo = NULL;
mutex_lock(&loop_devices_mutex);
list_for_each_entry(l, &loop_devices, lo_list)
if (disk_to_dev(l->lo_disk) == dev) {
lo = l;
break;
}
mutex_unlock(&loop_devices_mutex);
return lo ? callback(lo, page) : -EIO;
}
#define LOOP_ATTR_RO(_name) \
static ssize_t loop_attr_##_name##_show(struct loop_device *, char *); \
static ssize_t loop_attr_do_show_##_name(struct device *d, \
struct device_attribute *attr, char *b) \
{ \
return loop_attr_show(d, b, loop_attr_##_name##_show); \
} \
static struct device_attribute loop_attr_##_name = \
__ATTR(_name, S_IRUGO, loop_attr_do_show_##_name, NULL);
static ssize_t loop_attr_backing_file_show(struct loop_device *lo, char *buf)
{
ssize_t ret;
char *p = NULL;
mutex_lock(&lo->lo_ctl_mutex);
if (lo->lo_backing_file)
p = d_path(&lo->lo_backing_file->f_path, buf, PAGE_SIZE - 1);
mutex_unlock(&lo->lo_ctl_mutex);
if (IS_ERR_OR_NULL(p))
ret = PTR_ERR(p);
else {
ret = strlen(p);
memmove(buf, p, ret);
buf[ret++] = '\n';
buf[ret] = 0;
}
return ret;
}
static ssize_t loop_attr_offset_show(struct loop_device *lo, char *buf)
{
return sprintf(buf, "%llu\n", (unsigned long long)lo->lo_offset);
}
static ssize_t loop_attr_sizelimit_show(struct loop_device *lo, char *buf)
{
return sprintf(buf, "%llu\n", (unsigned long long)lo->lo_sizelimit);
}
static ssize_t loop_attr_autoclear_show(struct loop_device *lo, char *buf)
{
int autoclear = (lo->lo_flags & LO_FLAGS_AUTOCLEAR);
return sprintf(buf, "%s\n", autoclear ? "1" : "0");
}
LOOP_ATTR_RO(backing_file);
LOOP_ATTR_RO(offset);
LOOP_ATTR_RO(sizelimit);
LOOP_ATTR_RO(autoclear);
static struct attribute *loop_attrs[] = {
&loop_attr_backing_file.attr,
&loop_attr_offset.attr,
&loop_attr_sizelimit.attr,
&loop_attr_autoclear.attr,
NULL,
};
static struct attribute_group loop_attribute_group = {
.name = "loop",
.attrs= loop_attrs,
};
static int loop_sysfs_init(struct loop_device *lo)
{
return sysfs_create_group(&disk_to_dev(lo->lo_disk)->kobj,
&loop_attribute_group);
}
static void loop_sysfs_exit(struct loop_device *lo)
{
sysfs_remove_group(&disk_to_dev(lo->lo_disk)->kobj,
&loop_attribute_group);
}
static int loop_set_fd(struct loop_device *lo, fmode_t mode, static int loop_set_fd(struct loop_device *lo, fmode_t mode,
struct block_device *bdev, unsigned int arg) struct block_device *bdev, unsigned int arg)
{ {
...@@ -837,6 +935,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, ...@@ -837,6 +935,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
set_capacity(lo->lo_disk, size); set_capacity(lo->lo_disk, size);
bd_set_size(bdev, size << 9); bd_set_size(bdev, size << 9);
loop_sysfs_init(lo);
/* let user-space know about the new size */ /* let user-space know about the new size */
kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE); kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE);
...@@ -855,6 +954,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode, ...@@ -855,6 +954,7 @@ static int loop_set_fd(struct loop_device *lo, fmode_t mode,
return 0; return 0;
out_clr: out_clr:
loop_sysfs_exit(lo);
lo->lo_thread = NULL; lo->lo_thread = NULL;
lo->lo_device = NULL; lo->lo_device = NULL;
lo->lo_backing_file = NULL; lo->lo_backing_file = NULL;
...@@ -951,6 +1051,7 @@ static int loop_clr_fd(struct loop_device *lo, struct block_device *bdev) ...@@ -951,6 +1051,7 @@ static int loop_clr_fd(struct loop_device *lo, struct block_device *bdev)
set_capacity(lo->lo_disk, 0); set_capacity(lo->lo_disk, 0);
if (bdev) { if (bdev) {
bd_set_size(bdev, 0); bd_set_size(bdev, 0);
loop_sysfs_exit(lo);
/* let user-space know about this change */ /* let user-space know about this change */
kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE); kobject_uevent(&disk_to_dev(bdev->bd_disk)->kobj, KOBJ_CHANGE);
} }
......
...@@ -53,10 +53,10 @@ ...@@ -53,10 +53,10 @@
extern const char *drbd_buildtag(void); extern const char *drbd_buildtag(void);
#define REL_VERSION "8.3.8.1" #define REL_VERSION "8.3.9rc2"
#define API_VERSION 88 #define API_VERSION 88
#define PRO_VERSION_MIN 86 #define PRO_VERSION_MIN 86
#define PRO_VERSION_MAX 94 #define PRO_VERSION_MAX 95
enum drbd_io_error_p { enum drbd_io_error_p {
...@@ -91,6 +91,11 @@ enum drbd_after_sb_p { ...@@ -91,6 +91,11 @@ enum drbd_after_sb_p {
ASB_VIOLENTLY ASB_VIOLENTLY
}; };
enum drbd_on_no_data {
OND_IO_ERROR,
OND_SUSPEND_IO
};
/* KEEP the order, do not delete or insert. Only append. */ /* KEEP the order, do not delete or insert. Only append. */
enum drbd_ret_codes { enum drbd_ret_codes {
ERR_CODE_BASE = 100, ERR_CODE_BASE = 100,
...@@ -140,6 +145,7 @@ enum drbd_ret_codes { ...@@ -140,6 +145,7 @@ enum drbd_ret_codes {
ERR_CONNECTED = 151, /* DRBD 8.3 only */ ERR_CONNECTED = 151, /* DRBD 8.3 only */
ERR_PERM = 152, ERR_PERM = 152,
ERR_NEED_APV_93 = 153, ERR_NEED_APV_93 = 153,
ERR_STONITH_AND_PROT_A = 154,
/* insert new ones above this line */ /* insert new ones above this line */
AFTER_LAST_ERR_CODE AFTER_LAST_ERR_CODE
...@@ -226,13 +232,17 @@ union drbd_state { ...@@ -226,13 +232,17 @@ union drbd_state {
unsigned conn:5 ; /* 17/32 cstates */ unsigned conn:5 ; /* 17/32 cstates */
unsigned disk:4 ; /* 8/16 from D_DISKLESS to D_UP_TO_DATE */ unsigned disk:4 ; /* 8/16 from D_DISKLESS to D_UP_TO_DATE */
unsigned pdsk:4 ; /* 8/16 from D_DISKLESS to D_UP_TO_DATE */ unsigned pdsk:4 ; /* 8/16 from D_DISKLESS to D_UP_TO_DATE */
unsigned susp:1 ; /* 2/2 IO suspended no/yes */ unsigned susp:1 ; /* 2/2 IO suspended no/yes (by user) */
unsigned aftr_isp:1 ; /* isp .. imposed sync pause */ unsigned aftr_isp:1 ; /* isp .. imposed sync pause */
unsigned peer_isp:1 ; unsigned peer_isp:1 ;
unsigned user_isp:1 ; unsigned user_isp:1 ;
unsigned _pad:11; /* 0 unused */ unsigned susp_nod:1 ; /* IO suspended because no data */
unsigned susp_fen:1 ; /* IO suspended because fence peer handler runs*/
unsigned _pad:9; /* 0 unused */
#elif defined(__BIG_ENDIAN_BITFIELD) #elif defined(__BIG_ENDIAN_BITFIELD)
unsigned _pad:11; /* 0 unused */ unsigned _pad:9;
unsigned susp_fen:1 ;
unsigned susp_nod:1 ;
unsigned user_isp:1 ; unsigned user_isp:1 ;
unsigned peer_isp:1 ; unsigned peer_isp:1 ;
unsigned aftr_isp:1 ; /* isp .. imposed sync pause */ unsigned aftr_isp:1 ; /* isp .. imposed sync pause */
...@@ -312,6 +322,8 @@ enum drbd_timeout_flag { ...@@ -312,6 +322,8 @@ enum drbd_timeout_flag {
#define DRBD_MAGIC 0x83740267 #define DRBD_MAGIC 0x83740267
#define BE_DRBD_MAGIC __constant_cpu_to_be32(DRBD_MAGIC) #define BE_DRBD_MAGIC __constant_cpu_to_be32(DRBD_MAGIC)
#define DRBD_MAGIC_BIG 0x835a
#define BE_DRBD_MAGIC_BIG __constant_cpu_to_be16(DRBD_MAGIC_BIG)
/* these are of type "int" */ /* these are of type "int" */
#define DRBD_MD_INDEX_INTERNAL -1 #define DRBD_MD_INDEX_INTERNAL -1
......
...@@ -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
...@@ -87,6 +87,12 @@ NL_PACKET(syncer_conf, 8, ...@@ -87,6 +87,12 @@ NL_PACKET(syncer_conf, 8,
NL_STRING( 51, T_MAY_IGNORE, cpu_mask, 32) NL_STRING( 51, T_MAY_IGNORE, cpu_mask, 32)
NL_STRING( 64, T_MAY_IGNORE, csums_alg, SHARED_SECRET_MAX) NL_STRING( 64, T_MAY_IGNORE, csums_alg, SHARED_SECRET_MAX)
NL_BIT( 65, T_MAY_IGNORE, use_rle) NL_BIT( 65, T_MAY_IGNORE, use_rle)
NL_INTEGER( 75, T_MAY_IGNORE, on_no_data)
NL_INTEGER( 76, T_MAY_IGNORE, c_plan_ahead)
NL_INTEGER( 77, T_MAY_IGNORE, c_delay_target)
NL_INTEGER( 78, T_MAY_IGNORE, c_fill_target)
NL_INTEGER( 79, T_MAY_IGNORE, c_max_rate)
NL_INTEGER( 80, T_MAY_IGNORE, c_min_rate)
) )
NL_PACKET(invalidate, 9, ) NL_PACKET(invalidate, 9, )
......
...@@ -83,7 +83,7 @@ static inline int ddebug_remove_module(const char *mod) ...@@ -83,7 +83,7 @@ static inline int ddebug_remove_module(const char *mod)
#define dynamic_pr_debug(fmt, ...) \ #define dynamic_pr_debug(fmt, ...) \
do { if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0) do { if (0) printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); } while (0)
#define dynamic_dev_dbg(dev, format, ...) \ #define dynamic_dev_dbg(dev, fmt, ...) \
do { if (0) dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); } while (0) do { if (0) dev_printk(KERN_DEBUG, dev, fmt, ##__VA_ARGS__); } while (0)
#endif #endif
......
...@@ -743,6 +743,7 @@ ...@@ -743,6 +743,7 @@
#define PCI_DEVICE_ID_HP_CISSC 0x3230 #define PCI_DEVICE_ID_HP_CISSC 0x3230
#define PCI_DEVICE_ID_HP_CISSD 0x3238 #define PCI_DEVICE_ID_HP_CISSD 0x3238
#define PCI_DEVICE_ID_HP_CISSE 0x323a #define PCI_DEVICE_ID_HP_CISSE 0x323a
#define PCI_DEVICE_ID_HP_CISSF 0x323b
#define PCI_DEVICE_ID_HP_ZX2_IOC 0x4031 #define PCI_DEVICE_ID_HP_ZX2_IOC 0x4031
#define PCI_VENDOR_ID_PCTECH 0x1042 #define PCI_VENDOR_ID_PCTECH 0x1042
......
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