[DRBD-cvs] drbd by phil; * drop write-hint packets if they can no...
drbd-user@lists.linbit.com
drbd-user@lists.linbit.com
Sat, 7 Feb 2004 17:37:55 +0100 (CET)
DRBD CVS committal
Author : phil
Module : drbd
Dir : drbd/drbd
Modified Files:
Tag: rel-0_7-branch
drbd_actlog.c drbd_dsender.c drbd_fs.c drbd_int.h drbd_main.c
drbd_receiver.c drbd_req-2.4.c
Log Message:
* drop write-hint packets if they can not be sent immediately.
* Lots of work on the disk-less-node case.
. Resync gets started if a disk-less node gets a disk again...
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_actlog.c,v
retrieving revision 1.1.2.68
retrieving revision 1.1.2.69
diff -u -3 -r1.1.2.68 -r1.1.2.69
--- drbd_actlog.c 5 Feb 2004 15:17:36 -0000 1.1.2.68
+++ drbd_actlog.c 7 Feb 2004 16:37:49 -0000 1.1.2.69
@@ -424,6 +424,8 @@
void drbd_write_bm(struct Drbd_Conf *mdev)
{
unsigned int exts,i;
+
+ if( mdev->lo_file == 0) return;
exts = div_ceil(mdev->mbds_id->size,BM_EXTENT_SIZE);
for(i=0;i<exts;i++) {
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_dsender.c,v
retrieving revision 1.1.2.68
retrieving revision 1.1.2.69
diff -u -3 -r1.1.2.68 -r1.1.2.69
--- drbd_dsender.c 3 Feb 2004 07:57:14 -0000 1.1.2.68
+++ drbd_dsender.c 7 Feb 2004 16:37:49 -0000 1.1.2.69
@@ -267,7 +267,7 @@
{
drbd_dev* mdev = (drbd_dev*) data;
- if(unlikely(test_and_clear_bit(SYNC_PAUSED,&mdev->flags))) {
+ if(unlikely(test_and_clear_bit(STOP_SYNC_TIMER,&mdev->flags))) {
mdev->resync_work.cb = w_resync_inactive;
} else {
drbd_queue_work(mdev,&mdev->data.work,&mdev->resync_work);
@@ -443,7 +443,7 @@
D_ASSERT(mdev->cstate == SyncSource || mdev->cstate == SyncTarget);
ns = mdev->cstate + (PausedSyncS - SyncSource);
- set_bit(SYNC_PAUSED,&mdev->flags);
+ if(mdev->cstate == SyncTarget) set_bit(STOP_SYNC_TIMER,&mdev->flags);
_set_cstate(mdev,ns);
INFO("Syncer waits for sync group.\n");
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.65
retrieving revision 1.28.2.66
diff -u -3 -r1.28.2.65 -r1.28.2.66
--- drbd_fs.c 6 Feb 2004 15:43:55 -0000 1.28.2.65
+++ drbd_fs.c 7 Feb 2004 16:37:49 -0000 1.28.2.66
@@ -290,12 +290,7 @@
goto release_bdev2_fail_ioctl;
}
- drbd_sync_me(mdev); // XXX does this make sense?
-
- drbd_thread_stop(&mdev->worker);
- drbd_thread_stop(&mdev->asender);
- drbd_thread_stop(&mdev->receiver);
- drbd_free_resources(mdev);
+ drbd_free_ll_dev(mdev);
mdev->md_bdev = bdev2;
mdev->md_file = filp2;
@@ -362,7 +357,10 @@
drbd_set_blocksize(mdev,INITIAL_BLOCK_SIZE);
- set_cstate(mdev,StandAlone);
+ if(mdev->cstate == Unconfigured ) set_cstate(mdev,StandAlone);
+ if(mdev->cstate >= Connected ) {
+ drbd_send_param(mdev,1);
+ }
return 0;
@@ -564,6 +562,7 @@
set_disk_ro(mdev->vdisk, FALSE );
D_ASSERT(mdev->this_bdev->bd_holder == drbd_sec_holder);
bd_release(mdev->this_bdev);
+ mdev->this_bdev->bd_disk = mdev->vdisk;
)
if(newstate & Human) {
@@ -587,7 +586,7 @@
drbd_md_write(mdev);
if (mdev->cstate >= WFReportParams)
- drbd_send_param(mdev);
+ drbd_send_param(mdev,0);
return 0;
}
@@ -733,7 +732,7 @@
drbd_determin_dev_size(mdev);
drbd_md_write(mdev); // Write mdev->la_size to disk.
//#warning "yet an other reason to serialize all state changes on a rw_semaphore"
- if (mdev->cstate == Connected) drbd_send_param(mdev);
+ if (mdev->cstate == Connected) drbd_send_param(mdev,0);
break;
case DRBD_IOCTL_SET_NET_CONFIG:
@@ -800,7 +799,7 @@
// TODO: Fix all this. Currently it is the
// blissfully ignorant implementation.
drbd_free_ll_dev(mdev);
- if (mdev->cstate == Connected) drbd_send_param(mdev);
+ if (mdev->cstate == Connected) drbd_send_param(mdev,0);
if (mdev->cstate == StandAlone) set_cstate(mdev,Unconfigured);
break;
@@ -850,8 +849,10 @@
goto out_unlocked;
case DRBD_IOCTL_INVALIDATE:
- if( mdev->cstate != Connected) {
- err = -ENXIO;
+ if( mdev->cstate != Connected ||
+ !mdev->lo_file ||
+ test_bit(PARTNER_DISKLESS,&mdev->flags) ) {
+ err = -EINPROGRESS;
break;
}
@@ -863,8 +864,10 @@
break;
case DRBD_IOCTL_INVALIDATE_REM:
- if( mdev->cstate != Connected) {
- err = -ENXIO;
+ if( mdev->cstate != Connected ||
+ !mdev->lo_file ||
+ test_bit(PARTNER_DISKLESS,&mdev->flags) ) {
+ err = -EINPROGRESS;
break;
}
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.116
retrieving revision 1.58.2.117
diff -u -3 -r1.58.2.116 -r1.58.2.117
--- drbd_int.h 6 Feb 2004 15:43:55 -0000 1.58.2.116
+++ drbd_int.h 7 Feb 2004 16:37:49 -0000 1.58.2.117
@@ -439,6 +439,7 @@
u32 sync_use_csums;
u32 skip_sync;
u32 sync_group;
+ u32 flags; // flags & 1 -> reply call drbd_send_param(mdev);
} Drbd_Parameter_Packet __attribute((packed));
typedef union {
@@ -566,7 +567,7 @@
#define COLLECT_ZOMBIES 1
#define SEND_PING 2
#define WRITER_PRESENT 3
-#define SYNC_PAUSED 4
+#define STOP_SYNC_TIMER 4
#define DO_NOT_INC_CONCNT 5
#define WRITE_HINT_QUEUED 6
#define PARTNER_DISKLESS 7
@@ -732,7 +733,7 @@
extern void drbd_free_sock(drbd_dev *mdev);
/* extern int drbd_send(drbd_dev *mdev, struct socket *sock,
void* buf, size_t size, unsigned msg_flags); */
-extern int drbd_send_param(drbd_dev *mdev);
+extern int drbd_send_param(drbd_dev *mdev, int flags);
extern int drbd_send_cmd(drbd_dev *mdev, struct socket *sock,
Drbd_Packet_Cmd cmd, Drbd_Header *h, size_t size);
extern int drbd_send_sync_param(drbd_dev *mdev, struct syncer_config *sc);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.123
retrieving revision 1.73.2.124
diff -u -3 -r1.73.2.123 -r1.73.2.124
--- drbd_main.c 6 Feb 2004 15:43:55 -0000 1.73.2.123
+++ drbd_main.c 7 Feb 2004 16:37:49 -0000 1.73.2.124
@@ -539,12 +539,12 @@
&& !sc->skip )
{
set_cstate(mdev,WFReportParams);
- ok = drbd_send_param(mdev);
+ ok = drbd_send_param(mdev,0);
}
return ok;
}
-int drbd_send_param(drbd_dev *mdev)
+int drbd_send_param(drbd_dev *mdev, int flags)
{
Drbd_Parameter_Packet p;
int ok,i;
@@ -569,6 +569,7 @@
p.sync_use_csums = cpu_to_be32(mdev->sync_conf.use_csums);
p.skip_sync = cpu_to_be32(mdev->sync_conf.skip);
p.sync_group = cpu_to_be32(mdev->sync_conf.group);
+ p.flags = cpu_to_be32(flags);
ok = drbd_send_cmd(mdev,mdev->data.socket,ReportParams,(Drbd_Header*)&p,sizeof(p));
return ok;
@@ -996,19 +997,19 @@
/* In order to avoid deadlocks the receiver should only
use blk_run_queue(). It must not use blk_run_queues() to
avoid deadlocks.
+
+ Maybe we should consider to use the plain drbd_send_cmd.
*/
- if (drbd_send_cmd_dontwait(mdev,mdev->data.socket,WriteHint,&h,sizeof(h))==1){
- spin_lock_irq(q->queue_lock);
- blk_remove_plug(q);
- spin_unlock_irq(q->queue_lock);
- } else {
- if(mdev->cstate < Connected) {
- spin_lock_irq(q->queue_lock);
- blk_remove_plug(q);
- spin_unlock_irq(q->queue_lock);
- }
+ if (drbd_send_cmd_dontwait(mdev,mdev->data.socket,WriteHint,&h,
+ sizeof(h)) != 1) {
+ WARN("Have to drop sending of an io-hint\n");
}
+
+ spin_lock_irq(q->queue_lock);
+ blk_remove_plug(q);
+ spin_unlock_irq(q->queue_lock);
+
}
#endif
@@ -1849,6 +1850,12 @@
sector_t sector;
int i;
+ONLY_IN_26(
+ if (mdev->this_bdev->bd_disk == 0) { // strange...
+ mdev->this_bdev->bd_disk = mdev->vdisk;
+ }
+)
+
if( mdev->lo_file == 0) return;
down(&mdev->md_io_mutex);
@@ -1871,6 +1878,7 @@
buffer->bm_offset = __constant_cpu_to_be32(MD_BM_OFFSET);
kunmap(mdev->md_io_page);
+
sector = drbd_md_ss(mdev) + MD_GC_OFFSET;
drbd_md_sync_page_io(mdev,sector,WRITE);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.103
retrieving revision 1.97.2.104
diff -u -3 -r1.97.2.103 -r1.97.2.104
--- drbd_receiver.c 6 Feb 2004 15:43:55 -0000 1.97.2.103
+++ drbd_receiver.c 7 Feb 2004 16:37:49 -0000 1.97.2.104
@@ -633,7 +633,7 @@
drbd_thread_start(&mdev->asender);
drbd_thread_start(&mdev->worker);
- drbd_send_param(mdev);
+ drbd_send_param(mdev,0);
return 1;
}
@@ -1050,7 +1050,7 @@
&& !mdev->sync_conf.skip )
{
set_cstate(mdev,WFReportParams);
- ok = drbd_send_param(mdev);
+ ok = drbd_send_param(mdev,0);
}
return ok;
@@ -1059,7 +1059,7 @@
STATIC int receive_param(drbd_dev *mdev, Drbd_Header *h)
{
Drbd_Parameter_Packet *p = (Drbd_Parameter_Packet*)h;
- int no_sync=0;
+ int consider_sync;
int oo_state;
unsigned long p_size;
@@ -1097,49 +1097,56 @@
mdev->receiver.t_state = Exiting;
return FALSE;
}
+ mdev->p_size=p_size;
+
+ consider_sync = (mdev->cstate == WFReportParams);
+ if(drbd_determin_dev_size(mdev)) consider_sync=0;
+
+ if(be32_to_cpu(p->flags)&1) {
+ consider_sync=1;
+ drbd_send_param(mdev,2);
+ }
+ if(be32_to_cpu(p->flags)&2) consider_sync=1;
// XXX harmless race with ioctl ...
mdev->sync_conf.rate =
max_t(int,mdev->sync_conf.rate, be32_to_cpu(p->sync_rate));
- /* FIXME how to decide when use_csums differs??
- mdev->sync_conf.use_csums = ???
- */
+
// if one of them wants to skip, both of them should skip.
mdev->sync_conf.skip =
mdev->sync_conf.skip != 0 || p->skip_sync != 0;
mdev->sync_conf.group =
min_t(int,mdev->sync_conf.group,be32_to_cpu(p->sync_group));
- /* should be removed ?
- if(be64_to_cpu(param.protocol)!=mdev->lo_usize) {
- printk(KERN_ERR DEVICE_NAME"%d: Size hints inconsistent \n",
- minor);
- set_cstate(mdev,StandAlone);
- mdev->receiver.t_state = Exiting;
- return FALSE;
- }
- */
-
- mdev->p_size=p_size;
if( mdev->lo_usize != be64_to_cpu(p->u_size) ) {
mdev->lo_usize = be64_to_cpu(p->u_size);
INFO("Peer sets u_size to %ld KB\n",mdev->lo_usize);
}
- if(p_size) clear_bit(PARTNER_DISKLESS, &mdev->flags);
- else set_bit(PARTNER_DISKLESS, &mdev->flags);
-
- no_sync=drbd_determin_dev_size(mdev);
-
- if( drbd_get_capacity(mdev->this_bdev) == 0) {
- set_cstate(mdev,StandAlone);
- mdev->receiver.t_state = Exiting;
- return FALSE;
+ if(!p_size) {
+ set_bit(PARTNER_DISKLESS, &mdev->flags);
+ if(mdev->cstate >= Connected ) {
+ if(mdev->state == Primary) tl_clear(mdev);
+ if(mdev->state == Primary ||
+ be32_to_cpu(p->state) == Primary ) {
+ drbd_md_inc(mdev,ConnectedCnt);
+ }
+ }
+ if(mdev->cstate > Connected ) {
+ WARN("Resync aborted.\n");
+ if(mdev->cstate == SyncTarget)
+ set_bit(STOP_SYNC_TIMER,&mdev->flags);
+ set_cstate(mdev,Connected);
+ }
}
+ else clear_bit(PARTNER_DISKLESS, &mdev->flags);
if (mdev->cstate == WFReportParams) {
- int have_good,sync;
INFO("Connection established.\n");
+ }
+
+ if (consider_sync) {
+ int have_good,sync;
have_good=drbd_md_compare(mdev,p);
@@ -1148,7 +1155,7 @@
//INFO("have_good=%d sync=%d\n", have_good, sync);
- if ( mdev->sync_conf.skip && sync && !no_sync ) {
+ if ( mdev->sync_conf.skip && sync ) {
if (have_good == 1)
set_cstate(mdev,SkippedSyncS);
else // have_good == -1
@@ -1156,14 +1163,14 @@
goto skipped;
}
- if( sync && !no_sync ) {
+ if( sync ) {
if(have_good == 1) {
drbd_send_bitmap(mdev);
set_cstate(mdev,WFBitMapS);
} else { // have_good == -1
mdev->gen_cnt[Flags] &= ~MDF_Consistent;
set_cstate(mdev,WFBitMapT);
- }
+ }
} else set_cstate(mdev,Connected);
if (have_good == -1) {
@@ -1174,18 +1181,19 @@
}
}
}
- drbd_md_write(mdev); // update connected indicator, la_size, ...
- // do not adopt gen counts when sync was skipped ...
-skipped:
+ if (mdev->cstate == WFReportParams) set_cstate(mdev,Connected);
+
+skipped: // do not adopt gen counts when sync was skipped ...
oo_state = mdev->o_state;
mdev->o_state = be32_to_cpu(p->state);
if(oo_state == Secondary && mdev->o_state == Primary) {
drbd_md_inc(mdev,ConnectedCnt);
- drbd_md_write(mdev);
}
+ drbd_md_write(mdev); // update connected indicator, la_size, ...
+
return TRUE;
}
@@ -1418,7 +1426,7 @@
}
}
-void drbd_disconnect(drbd_dev *mdev)
+STATIC void drbd_disconnect(drbd_dev *mdev)
{
mdev->o_state = Unknown;
drbd_thread_stop_nowait(&mdev->worker);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_req-2.4.c,v
retrieving revision 1.33.2.50
retrieving revision 1.33.2.51
diff -u -3 -r1.33.2.50 -r1.33.2.51
--- drbd_req-2.4.c 5 Feb 2004 15:17:36 -0000 1.33.2.50
+++ drbd_req-2.4.c 7 Feb 2004 16:37:49 -0000 1.33.2.51
@@ -131,8 +131,8 @@
drbd_send_drequest(mdev, DataRequest, bio->b_rsector, bio->b_size,
(unsigned long)pr);
#else
- //WORK_HERE
- //#warning "FIXME make 2.6.x clean"
+ drbd_send_drequest(mdev, DataRequest, bio->bi_sector, bio->bi_size,
+ (unsigned long)pr);
#endif
}