[DRBD-cvs] svn commit by phil - r2474 - in trunk: . drbd drbd/linux
user - * 'drbdsetup /dev/drbd0 resize' crashed on a device wit
drbd-cvs at lists.linbit.com
drbd-cvs at lists.linbit.com
Thu Sep 28 11:46:21 CEST 2006
Author: phil
Date: 2006-09-28 11:46:16 +0200 (Thu, 28 Sep 2006)
New Revision: 2474
Modified:
trunk/ROADMAP
trunk/drbd/drbd_nl.c
trunk/drbd/linux/drbd.h
trunk/user/drbdadm.h
trunk/user/drbdadm_adjust.c
trunk/user/drbdadm_main.c
trunk/user/drbdsetup.c
Log:
* 'drbdsetup /dev/drbd0 resize' crashed on a device without disk.
Fixed that.
* Fixed 'drbdadm adjust rX' to work with the fact that a disk or
network configuration needs to be removed first, before a
now one can be set.
Modified: trunk/ROADMAP
===================================================================
--- trunk/ROADMAP 2006-09-28 08:21:24 UTC (rev 2473)
+++ trunk/ROADMAP 2006-09-28 09:46:16 UTC (rev 2474)
@@ -838,6 +838,7 @@
39 Send mirrored write requests out of the worker context.
99% DONE
+40 Do something with FLUSHBUFS ioctl.
Maybe:
Modified: trunk/drbd/drbd_nl.c
===================================================================
--- trunk/drbd/drbd_nl.c 2006-09-28 08:21:24 UTC (rev 2473)
+++ trunk/drbd/drbd_nl.c 2006-09-28 09:46:16 UTC (rev 2474)
@@ -1154,11 +1154,18 @@
retcode = APrimaryNodeNeeded;
goto fail;
}
+
+ if(!inc_local(mdev)) {
+ retcode = HaveNoDiskConfig;
+ goto fail;
+ }
+
mdev->bc->dc.disk_size = (sector_t)rs.resize_size;
drbd_bm_lock(mdev);
drbd_determin_dev_size(mdev);
drbd_md_sync(mdev);
drbd_bm_unlock(mdev);
+ dec_local(mdev);
if (mdev->state.conn == Connected) {
drbd_send_uuids(mdev); // to start sync...
drbd_send_sizes(mdev);
Modified: trunk/drbd/linux/drbd.h
===================================================================
--- trunk/drbd/linux/drbd.h 2006-09-28 08:21:24 UTC (rev 2473)
+++ trunk/drbd/linux/drbd.h 2006-09-28 09:46:16 UTC (rev 2474)
@@ -105,6 +105,7 @@
DiskLowerThanOutdated,
FailedToClaimMyself,
UnknownNetLinkPacket,
+ HaveNoDiskConfig,
AfterLastRetCode,
};
Modified: trunk/user/drbdadm.h
===================================================================
--- trunk/user/drbdadm.h 2006-09-28 08:21:24 UTC (rev 2473)
+++ trunk/user/drbdadm.h 2006-09-28 09:46:16 UTC (rev 2474)
@@ -103,6 +103,7 @@
extern int adm_connect(struct d_resource* ,const char* );
extern int adm_resize(struct d_resource* ,const char* );
extern int adm_syncer(struct d_resource* ,const char* );
+extern int adm_generic_s(struct d_resource* ,const char* );
extern int _admm_generic(struct d_resource* ,const char*, int flags);
extern int m_system(char**,int );
extern struct d_option* find_opt(struct d_option*,char*);
@@ -111,6 +112,7 @@
extern void verify_ips(struct d_resource* res);
extern void schedule_dcmd( int (* function)(struct d_resource*,const char* ),
struct d_resource* res,
+ char* arg,
int order);
extern void uc_node(enum usage_count_type type);
Modified: trunk/user/drbdadm_adjust.c
===================================================================
--- trunk/user/drbdadm_adjust.c 2006-09-28 08:21:24 UTC (rev 2473)
+++ trunk/user/drbdadm_adjust.c 2006-09-28 09:46:16 UTC (rev 2474)
@@ -167,9 +167,8 @@
char* argv[20];
int pid,argc=0;
struct d_resource* running;
- int do_attach=0;
- int do_connect=0;
- int do_syncer=0;
+ int do_attach=0,do_connect=0,do_syncer=0;
+ int have_disk=0,have_net=0;
char config_file_dummy[250];
argv[argc++]=drbdsetup;
@@ -189,17 +188,25 @@
if(running->me) {
do_attach |= strcmp(res->me->device, running->me->device);
do_attach |= !disk_equal(res->me, running->me);
+ have_disk = (running->me->disk != NULL);
} else do_attach |= 1;
do_connect = !opts_equal(res->net_options, running->net_options);
do_connect |= !addr_equal(res,running);
do_connect |= !proto_equal(res,running);
+ have_net = (running->protocol != NULL);
do_syncer = !opts_equal(res->sync_options, running->sync_options);
- if(do_attach) schedule_dcmd(adm_attach,res,0);
- if(do_syncer) schedule_dcmd(adm_syncer,res,1);
- if(do_connect) schedule_dcmd(adm_connect,res,2);
+ if(do_attach) {
+ if(have_disk) schedule_dcmd(adm_generic_s,res,"detach",0);
+ schedule_dcmd(adm_attach,res,NULL,0);
+ }
+ if(do_syncer) schedule_dcmd(adm_syncer,res,NULL,1);
+ if(do_connect) {
+ if(have_net) schedule_dcmd(adm_generic_s,res,"disconnect",0);
+ schedule_dcmd(adm_connect,res,NULL,2);
+ }
return 0;
}
Modified: trunk/user/drbdadm_main.c
===================================================================
--- trunk/user/drbdadm_main.c 2006-09-28 08:21:24 UTC (rev 2473)
+++ trunk/user/drbdadm_main.c 2006-09-28 09:46:16 UTC (rev 2474)
@@ -74,6 +74,7 @@
struct deferred_cmd
{
int (* function)(struct d_resource*,const char* );
+ char *arg;
struct d_resource* res;
struct deferred_cmd* next;
};
@@ -134,6 +135,7 @@
void schedule_dcmd( int (* function)(struct d_resource*,const char* ),
struct d_resource* res,
+ char* arg,
int order)
{
struct deferred_cmd *d;
@@ -146,6 +148,7 @@
d->function = function;
d->res = res;
+ d->arg = arg;
d->next = deferred_cmds[order];
deferred_cmds[order] = d;
@@ -158,13 +161,13 @@
if(d->next == NULL)
{
- rv = d->function(d->res,NULL);
+ rv = d->function(d->res,d->arg);
free(d);
return rv;
}
rv = _run_dcmds(d->next);
- if(!rv) rv |= d->function(d->res,NULL);
+ if(!rv) rv |= d->function(d->res,d->arg);
free(d);
return rv;
@@ -850,9 +853,9 @@
static int adm_up(struct d_resource* res,const char* unused __attribute((unused)))
{
- schedule_dcmd(adm_attach,res,0);
- schedule_dcmd(adm_syncer,res,1);
- schedule_dcmd(adm_connect,res,2);
+ schedule_dcmd(adm_attach,res,NULL,0);
+ schedule_dcmd(adm_syncer,res,NULL,1);
+ schedule_dcmd(adm_connect,res,NULL,2);
return 0;
}
Modified: trunk/user/drbdsetup.c
===================================================================
--- trunk/user/drbdsetup.c 2006-09-28 08:21:24 UTC (rev 2473)
+++ trunk/user/drbdsetup.c 2006-09-28 09:46:16 UTC (rev 2474)
@@ -369,6 +369,7 @@
EM(PauseFlagAlreadyClear) = "PauseFlagAlreadyClear",
EM(DiskLowerThanOutdated) = "DiskLowerThanOutdated",
EM(FailedToClaimMyself) = "FailedToClaimMyself",
+ EM(HaveNoDiskConfig) = "HaveNoDiskConfig",
};
char* cmdname = 0;
More information about the drbd-cvs
mailing list