[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