[DRBD-cvs] r1792 - in trunk: drbd drbd/linux user
www-data
www-data at garcon.linbit.com
Tue May 10 22:02:46 CEST 2005
Author: phil
Date: 2005-05-10 22:02:44 +0200 (Tue, 10 May 2005)
New Revision: 1792
Modified:
trunk/drbd/drbd_fs.c
trunk/drbd/drbd_int.h
trunk/drbd/drbd_main.c
trunk/drbd/drbd_receiver.c
trunk/drbd/drbd_strings.c
trunk/drbd/linux/drbd.h
trunk/user/drbdadm_main.c
trunk/user/drbdmeta.c
trunk/user/drbdsetup.c
Log:
* Removed the "Unconfigured" conn state. Converted remaining
uses to "StandAlone".
* drbdsetup primary/secondary now report the error string of
drbd_set_state()/set_st_err_name(). No more duplication of
error messages!
* In case we get "Unconfigured" (which is StandAlone and Diskless)
we forget the pdsk state (set it to DUnknown).
* Fixed a bug with __module_get() and made the call to module_put()
analog to __module_get()
* make 'drbdmeta outdate res' work again, was broken since the
introductions of UUIDs.
Modified: trunk/drbd/drbd_fs.c
===================================================================
--- trunk/drbd/drbd_fs.c 2005-05-10 18:22:13 UTC (rev 1791)
+++ trunk/drbd/drbd_fs.c 2005-05-10 20:02:44 UTC (rev 1792)
@@ -555,13 +555,13 @@
#define O_ADDR(A) (((struct sockaddr_in *)&A.other_addr)->sin_addr.s_addr)
#define O_PORT(A) (((struct sockaddr_in *)&A.other_addr)->sin_port)
for(i=0;i<minor_count;i++) {
- if( i!=minor && drbd_conf[i].state.s.conn==Unconfigured &&
+ if( i!=minor && drbd_conf[i].state.s.conn > StandAlone &&
M_ADDR(new_conf) == M_ADDR(drbd_conf[i].conf) &&
M_PORT(new_conf) == M_PORT(drbd_conf[i].conf) ) {
retcode=LAAlreadyInUse;
goto fail_ioctl;
}
- if( i!=minor && drbd_conf[i].state.s.conn!=Unconfigured &&
+ if( i!=minor && drbd_conf[i].state.s.conn > StandAlone &&
O_ADDR(new_conf) == O_ADDR(drbd_conf[i].conf) &&
O_PORT(new_conf) == O_PORT(drbd_conf[i].conf) ) {
retcode=OAAlreadyInUse;
@@ -731,8 +731,9 @@
return nps;
}
-int drbd_set_role(drbd_dev *mdev,drbd_role_t newstate)
+int drbd_set_role(drbd_dev *mdev, int* arg)
{
+ drbd_role_t newstate = *arg;
int r,forced = 0;
drbd_state_t os,ns;
@@ -763,11 +764,12 @@
spin_unlock_irq(&mdev->req_lock);
after_state_ch(mdev,os,ns);
- if ( r == 2 ) { return 0; }
+ if ( r == 2 ) { return 0; /* nothing to do */ }
if ( r == -2 ) {
/* request state does not like the new state. */
if (! (newstate & DontBlameDrbd)) {
print_st_err(mdev,os,ns,r);
+ *arg = r;
return -EIO;
}
@@ -776,7 +778,10 @@
WARN("Forcefully set to UpToDate!\n");
r = drbd_request_state(mdev,NS2(role,newstate & role_mask,
disk,UpToDate));
- if(r<=0) return -EIO;
+ if ( r <= 0 ) {
+ *arg = r;
+ return -EIO;
+ }
forced = 1;
}
@@ -786,7 +791,10 @@
r = drbd_request_state(mdev,NS2(role,newstate & role_mask,pdsk,nps));
} else if ( r <= 0 ) print_st_err(mdev,os,ns,r);
- if ( r <= 0 ) return -EACCES;
+ if ( r <= 0 ) {
+ *arg = r;
+ return -EIO;
+ }
drbd_sync_me(mdev);
@@ -1055,10 +1063,17 @@
break;
case DRBD_IOCTL_SET_STATE:
- if (arg & ~(Primary|Secondary|DontBlameDrbd) ) {
+ if (copy_from_user(&r, (int *) arg, sizeof(int)))
+ return -EFAULT;
+
+ if (r & ~(Primary|Secondary|DontBlameDrbd) ) {
err = -EINVAL;
} else {
- err = drbd_set_role(mdev,arg);
+ err = drbd_set_role(mdev, &r);
+ if ( err == -EIO ) {
+ err = put_user(r, (int *) arg);
+ if(err == 0) err=-EIO;
+ }
}
break;
@@ -1102,7 +1117,7 @@
break;
case DRBD_IOCTL_UNCONFIG_NET:
- if ( mdev->state.s.conn == Unconfigured) break;
+ if ( mdev->state.s.conn == StandAlone) break;
r = drbd_request_state(mdev,NS(conn,StandAlone));
if( r == 2 ) { break; }
@@ -1121,12 +1136,6 @@
drbd_thread_stop(&mdev->receiver);
- if ( mdev->state.s.conn == StandAlone &&
- mdev->state.s.disk == Diskless ) {
- drbd_mdev_cleanup(mdev); // Move to after_state_ch() ?
- module_put(THIS_MODULE);
- }
-
break;
case DRBD_IOCTL_UNCONFIG_DISK:
Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h 2005-05-10 18:22:13 UTC (rev 1791)
+++ trunk/drbd/drbd_int.h 2005-05-10 20:02:44 UTC (rev 1792)
@@ -1000,7 +1000,7 @@
extern char* ppsize(char* buf, size_t size);
extern int drbd_determin_dev_size(drbd_dev*);
extern void drbd_setup_queue_param(drbd_dev *mdev, unsigned int);
-extern int drbd_set_role(drbd_dev *mdev,drbd_role_t newstate);
+extern int drbd_set_role(drbd_dev *mdev, int *arg);
extern int drbd_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg);
drbd_disks_t drbd_try_outdate_peer(drbd_dev *mdev);
Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c 2005-05-10 18:22:13 UTC (rev 1791)
+++ trunk/drbd/drbd_main.c 2005-05-10 20:02:44 UTC (rev 1792)
@@ -555,6 +555,10 @@
if ( ns.s.pdsk > DUnknown ) ns.s.pdsk = DUnknown;
}
+ if( ns.s.conn == StandAlone && ns.s.disk == Diskless ) {
+ ns.s.pdsk = DUnknown;
+ }
+
if( ns.s.conn > Connected && ns.s.disk <= Failed ) {
warn_sync_abort=1;
ns.s.conn = Connected;
@@ -668,11 +672,17 @@
mod_timer(&mdev->resync_timer,jiffies);
}
- if ( os.s.disk == Diskless && os.s.peer == StandAlone &&
- (ns.s.disk >= Inconsistent || ns.s.peer > StandAlone) ) {
+ if ( os.s.disk == Diskless && os.s.conn == StandAlone &&
+ (ns.s.disk >= Inconsistent || ns.s.conn > StandAlone) ) {
__module_get(THIS_MODULE);
}
+ if ( (os.s.disk >= Inconsistent || ns.s.conn > StandAlone) &&
+ ns.s.disk == Diskless && ns.s.conn == StandAlone ) {
+ drbd_mdev_cleanup(mdev);
+ module_put(THIS_MODULE);
+ }
+
if ( ns.s.role == Primary && ns.s.conn < Connected &&
ns.s.disk < Consistent ) {
drbd_panic("No access to good data anymore.\n");
@@ -1876,7 +1886,8 @@
if (mdev) {
down(&mdev->device_mutex);
- drbd_set_role(mdev,Secondary);
+ rr = Secondary;
+ drbd_set_role(mdev,&rr);
up(&mdev->device_mutex);
drbd_sync_me(mdev);
drbd_thread_stop(&mdev->receiver);
Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c 2005-05-10 18:22:13 UTC (rev 1791)
+++ trunk/drbd/drbd_receiver.c 2005-05-10 20:02:44 UTC (rev 1792)
@@ -616,7 +616,7 @@
{
struct socket *sock,*msock;
- D_ASSERT(mdev->state.s.conn > Unconfigured);
+ D_ASSERT(mdev->state.s.conn > StandAlone);
D_ASSERT(!mdev->data.socket);
if(drbd_request_state(mdev,NS(conn,WFConnection)) <= 0 ) return 0;
Modified: trunk/drbd/drbd_strings.c
===================================================================
--- trunk/drbd/drbd_strings.c 2005-05-10 18:22:13 UTC (rev 1791)
+++ trunk/drbd/drbd_strings.c 2005-05-10 20:02:44 UTC (rev 1792)
@@ -23,7 +23,6 @@
#include <linux/drbd.h>
static const char *drbd_conn_s_names[] = {
- [Unconfigured] = "Unconfigured",
[StandAlone] = "StandAlone",
[Unconnected] = "Unconnected",
[Timeout] = "Timeout",
@@ -69,7 +68,7 @@
};
const char* conns_to_name(drbd_conns_t s) {
- return s < Unconfigured ? "TO_SMALL" :
+ return s < StandAlone ? "TO_SMALL" :
s > PausedSyncT ? "TO_LARGE"
: drbd_conn_s_names[s];
}
Modified: trunk/drbd/linux/drbd.h
===================================================================
--- trunk/drbd/linux/drbd.h 2005-05-10 18:22:13 UTC (rev 1791)
+++ trunk/drbd/linux/drbd.h 2005-05-10 20:02:44 UTC (rev 1792)
@@ -188,7 +188,6 @@
* so writes on a Primary after Skipped sync are not mirrored either ?
*/
typedef enum {
- Unconfigured,
StandAlone,
Unconnected,
Timeout,
@@ -296,7 +295,7 @@
*/
#define DRBD_IOCTL_LETTER 'D'
#define DRBD_IOCTL_GET_VERSION _IOR( DRBD_IOCTL_LETTER, 0x00, int )
-#define DRBD_IOCTL_SET_STATE _IOW( DRBD_IOCTL_LETTER, 0x02, drbd_role_t )
+#define DRBD_IOCTL_SET_STATE _IOW( DRBD_IOCTL_LETTER, 0x02, int )
#define DRBD_IOCTL_SET_DISK_CONFIG _IOW( DRBD_IOCTL_LETTER, 0x06, struct ioctl_disk_config )
#define DRBD_IOCTL_SET_NET_CONFIG _IOW( DRBD_IOCTL_LETTER, 0x07, struct ioctl_net_config )
#define DRBD_IOCTL_UNCONFIG_NET _IO ( DRBD_IOCTL_LETTER, 0x08 )
@@ -308,7 +307,6 @@
#define DRBD_IOCTL_WAIT_CONNECT _IOR( DRBD_IOCTL_LETTER, 0x11, struct ioctl_wait )
#define DRBD_IOCTL_WAIT_SYNC _IOR( DRBD_IOCTL_LETTER, 0x12, struct ioctl_wait )
#define DRBD_IOCTL_UNCONFIG_DISK _IO ( DRBD_IOCTL_LETTER, 0x13 )
-#define DRBD_IOCTL_SET_STATE_FLAGS _IOW( DRBD_IOCTL_LETTER, 0x14, drbd_role_t )
#define DRBD_IOCTL_OUTDATE_DISK _IOW( DRBD_IOCTL_LETTER, 0x15, int )
#define DRBD_IOCTL_GET_UUIDS _IOR( DRBD_IOCTL_LETTER, 0x16, struct ioctl_get_uuids )
Modified: trunk/user/drbdadm_main.c
===================================================================
--- trunk/user/drbdadm_main.c 2005-05-10 18:22:13 UTC (rev 1791)
+++ trunk/user/drbdadm_main.c 2005-05-10 20:02:44 UTC (rev 1792)
@@ -672,7 +672,7 @@
if(rv == 17) return rv;
// 17 returned by drbdsetup outdate, if it is already primary.
- if( rv ) {
+ if( rv || dry_run ) {
rv = admm_generic(res,cmd);
}
return rv;
Modified: trunk/user/drbdmeta.c
===================================================================
--- trunk/user/drbdmeta.c 2005-05-10 18:22:13 UTC (rev 1791)
+++ trunk/user/drbdmeta.c 2005-05-10 20:02:44 UTC (rev 1792)
@@ -500,6 +500,7 @@
void (*get_gi) (struct md_cpu *md);
void (*show_gi) (struct md_cpu *md);
void (*set_gi) (struct md_cpu *md, char **argv, int argc);
+ int (*outdate_gi) (struct md_cpu *md);
};
/*
@@ -517,9 +518,11 @@
void m_get_gc(struct md_cpu *md);
void m_show_gc(struct md_cpu *md);
void m_set_gc(struct md_cpu *md, char **argv, int argc);
+int m_outdate_gc(struct md_cpu *md);
void m_get_uuid(struct md_cpu *md);
void m_show_uuid(struct md_cpu *md);
void m_set_uuid(struct md_cpu *md, char **argv, int argc);
+int m_outdate_uuid(struct md_cpu *md);
int v06_md_close(struct format *cfg);
int v06_md_cpu_to_disk(struct format *cfg);
@@ -553,6 +556,7 @@
.get_gi = m_get_gc,
.show_gi = m_show_gc,
.set_gi = m_set_gc,
+ .outdate_gi = m_outdate_gc,
},
[Drbd_07] = {
.name = "v07",
@@ -566,6 +570,7 @@
.get_gi = m_get_gc,
.show_gi = m_show_gc,
.set_gi = m_set_gc,
+ .outdate_gi = m_outdate_gc,
},
[Drbd_08] = {
.name = "v08",
@@ -579,6 +584,7 @@
.get_gi = m_get_uuid,
.show_gi = m_show_uuid,
.set_gi = m_set_uuid,
+ .outdate_gi = m_outdate_uuid,
},
};
@@ -923,9 +929,30 @@
} while (0);
}
+int m_outdate_gc(struct md_cpu *md)
+{
+ if ( !(md->gc[Flags] & MDF_Consistent) ) {
+ return 5;
+ }
+ md->gc[Flags] &= ~MDF_WasUpToDate;
+ return 0;
+}
+int m_outdate_uuid(struct md_cpu *md)
+{
+ if ( !(md->flags & MDF_Consistent) ) {
+ return 5;
+ }
+
+ md->flags &= ~MDF_WasUpToDate;
+
+ return 0;
+}
+
+
+
/******************************************
begin of v06 {{{
******************************************/
@@ -1777,13 +1804,11 @@
if (cfg->ops->open(cfg))
return -1;
- if ( !(cfg->md.gc[Flags] & MDF_Consistent) ) {
+ if (cfg->ops->outdate_gi(&cfg->md)) {
fprintf(stderr, "Device is inconsistent.\n");
exit(5);
}
- cfg->md.gc[Flags] &= ~MDF_WasUpToDate;
-
err = cfg->ops->md_cpu_to_disk(cfg)
|| cfg->ops->close(cfg);
if (err)
Modified: trunk/user/drbdsetup.c
===================================================================
--- trunk/user/drbdsetup.c 2005-05-10 18:22:13 UTC (rev 1791)
+++ trunk/user/drbdsetup.c 2005-05-10 20:02:44 UTC (rev 1792)
@@ -698,8 +698,8 @@
int set_state(int drbd_fd,drbd_role_t state)
{
- int err;
- err=ioctl(drbd_fd,DRBD_IOCTL_SET_STATE,state);
+ int err, arg = state;
+ err=ioctl(drbd_fd,DRBD_IOCTL_SET_STATE,&arg);
if(err) {
err=errno;
PERROR("ioctl(,SET_STATE,) failed");
@@ -708,17 +708,9 @@
case EBUSY:
fprintf(stderr,"Someone has opened the device for RW access!\n");
break;
- case EINPROGRESS:
- fprintf(stderr,"Resynchronization process currently running!\n");
- break;
- case ENXIO:
- fprintf(stderr,"Device not configured\n");
- break;
- case EACCES:
- fprintf(stderr,"Partner is already primary\n");
- break;
case EIO:
- fprintf(stderr,"Local replica is inconsistent (--do-what-I-say ?)\n");
+ fprintf(stderr,"%s\n", set_st_err_name(arg));
+ break;
}
return 20;
}
More information about the drbd-cvs
mailing list