[DRBD-cvs] svn commit by phil - r2479 - in trunk: drbd user - *
More work on the sync_after code, but it still has ma
drbd-cvs at lists.linbit.com
drbd-cvs at lists.linbit.com
Fri Sep 29 22:35:07 CEST 2006
Author: phil
Date: 2006-09-29 22:35:05 +0200 (Fri, 29 Sep 2006)
New Revision: 2479
Modified:
trunk/drbd/drbd_int.h
trunk/drbd/drbd_main.c
trunk/drbd/drbd_nl.c
trunk/drbd/drbd_receiver.c
trunk/drbd/drbd_worker.c
trunk/user/drbdadm_adjust.c
trunk/user/drbdsetup.c
Log:
* More work on the sync_after code, but it still has major bugs
in it.
* Fixed bugs in drbdsetup and drbdadm to make 'drbdadm adjust rX'
work in case only the disk config is not known to the kernel.
Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h 2006-09-29 13:51:56 UTC (rev 2478)
+++ trunk/drbd/drbd_int.h 2006-09-29 20:35:05 UTC (rev 2479)
@@ -308,8 +308,6 @@
ReportSizes,
ReportState,
ReportSyncUUID,
- PauseResync,
- ResumeResync,
AuthChallenge,
AuthResponse,
StateChgRequest,
@@ -356,8 +354,6 @@
[ReportSizes] = "ReportSizes",
[ReportState] = "ReportState",
[ReportSyncUUID] = "ReportSyncUUID",
- [PauseResync] = "PauseResync",
- [ResumeResync] = "ResumeResync",
[AuthChallenge] = "AuthChallenge",
[AuthResponse] = "AuthResponse",
[Ping] = "Ping",
@@ -1289,7 +1285,7 @@
extern int is_valid_ar_handle(drbd_request_t *, sector_t);
-// drbd_fs.c
+// drbd_nl.c
extern char* ppsize(char* buf, size_t size);
extern sector_t drbd_new_dev_size(struct Drbd_Conf*, struct drbd_backing_dev*);
extern int drbd_determin_dev_size(drbd_dev*);
@@ -1302,18 +1298,11 @@
extern int drbd_khelper(drbd_dev *mdev, char* cmd);
// drbd_worker.c
-enum RSPauseReason {
- AfterDependency,
- PeerImposed,
- UserImposed
-};
-
extern int drbd_worker(struct Drbd_thread *thi);
extern void drbd_alter_sa(drbd_dev *mdev, int na);
-extern int drbd_resync_pause(drbd_dev *mdev, enum RSPauseReason);
-extern int drbd_resync_resume(drbd_dev *mdev, enum RSPauseReason);
extern void drbd_start_resync(drbd_dev *mdev, drbd_conns_t side);
extern void resume_next_sg(drbd_dev* mdev);
+extern void suspend_other_sg(drbd_dev* mdev);
extern int drbd_resync_finished(drbd_dev *mdev);
// maybe rather drbd_main.c ?
extern int drbd_md_sync_page_io(drbd_dev *mdev, struct drbd_backing_dev *bdev,
@@ -1388,6 +1377,8 @@
#define peer_mask role_mask
#define pdsk_mask disk_mask
#define susp_mask 1
+#define user_isp_mask 1
+#define aftr_isp_mask 1
#define NS(T,S) ({drbd_state_t mask; mask.i=0; mask.T = T##_mask; mask;}), \
({drbd_state_t val; val.i=0; val.T = (S); val;})
Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c 2006-09-29 13:51:56 UTC (rev 2478)
+++ trunk/drbd/drbd_main.c 2006-09-29 20:35:05 UTC (rev 2479)
@@ -647,6 +647,7 @@
}
if( ns.conn < Connected ) {
+ ns.peer_isp = 0;
ns.peer = Unknown;
if ( ns.pdsk > DUnknown ||
ns.pdsk < Inconsistent ) ns.pdsk = DUnknown;
@@ -957,16 +958,16 @@
drbd_send_state(mdev);
}
- /* We want to pause resync, tell peer. */
- if ( ( os.aftr_isp == 0 && ns.aftr_isp == 1 ) ||
- ( os.user_isp == 0 && ns.user_isp == 1 ) ) {
- drbd_send_short_cmd(mdev,PauseResync);
+ /* We want to pause/continue resync, tell peer. */
+ if ( ( os.aftr_isp != ns.aftr_isp ) ||
+ ( os.user_isp != ns.user_isp ) ) {
+ drbd_send_state(mdev);
}
- /* We want to continue resync, tell peer. */
- if ( ( os.aftr_isp == 1 || os.user_isp == 1 ) &&
- ns.aftr_isp == 0 && ns.user_isp == 0 ) {
- drbd_send_short_cmd(mdev,ResumeResync);
+ /* In case one of the isp bits got set, suspend other devices. */
+ if ( ( !os.aftr_isp && !os.peer_isp && !os.user_isp) &&
+ ( ns.aftr_isp || ns.peer_isp || ns.user_isp) ) {
+ suspend_other_sg(mdev);
}
/* We are in the progress to start a full sync... */
Modified: trunk/drbd/drbd_nl.c
===================================================================
--- trunk/drbd/drbd_nl.c 2006-09-29 13:51:56 UTC (rev 2478)
+++ trunk/drbd/drbd_nl.c 2006-09-29 20:35:05 UTC (rev 2479)
@@ -1275,8 +1275,10 @@
struct drbd_nl_cfg_reply *reply)
{
int retcode=NoError;
-
- if(!drbd_resync_pause(mdev, UserImposed)) retcode = PauseFlagAlreadySet;
+
+ if(drbd_request_state(mdev,NS(user_isp,1)) == SS_NothingToDo)
+ retcode = PauseFlagAlreadySet;
+
reply->ret_code = retcode;
return 0;
}
@@ -1286,7 +1288,9 @@
{
int retcode=NoError;
- if(!drbd_resync_resume(mdev, UserImposed)) retcode = PauseFlagAlreadyClear;
+ if(drbd_request_state(mdev,NS(user_isp,0)) == SS_NothingToDo)
+ retcode = PauseFlagAlreadyClear;
+
reply->ret_code = retcode;
return 0;
}
Modified: trunk/drbd/drbd_receiver.c
===================================================================
--- trunk/drbd/drbd_receiver.c 2006-09-29 13:51:56 UTC (rev 2478)
+++ trunk/drbd/drbd_receiver.c 2006-09-29 20:35:05 UTC (rev 2479)
@@ -2305,20 +2305,6 @@
return (size == 0);
}
-STATIC int receive_pause_resync(drbd_dev *mdev, Drbd_Header *h)
-{
- drbd_resync_pause(mdev, PeerImposed);
- return TRUE;
-
-}
-
-STATIC int receive_resume_resync(drbd_dev *mdev, Drbd_Header *h)
-{
- drbd_resync_resume(mdev, PeerImposed);
- return TRUE;
-}
-
-
STATIC int receive_UnplugRemote(drbd_dev *mdev, Drbd_Header *h)
{
if (mdev->state.disk >= Inconsistent) drbd_kick_lo(mdev);
@@ -2348,8 +2334,6 @@
[ReportState] = receive_state,
[StateChgRequest] = receive_req_state,
[ReportSyncUUID] = receive_sync_uuid,
- [PauseResync] = receive_pause_resync,
- [ResumeResync] = receive_resume_resync,
};
static drbd_cmd_handler_f *drbd_cmd_handler = drbd_default_handler;
Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c 2006-09-29 13:51:56 UTC (rev 2478)
+++ trunk/drbd/drbd_worker.c 2006-09-29 20:35:05 UTC (rev 2479)
@@ -641,60 +641,6 @@
local_irq_enable();
}
-/**
- * _drbd_rs_resume:
- * @reason: Name of the flag
- * Clears one of the three reason flags that could cause the suspension
- * of the resynchronisation process. In case all three are cleared it
- * actually changes the state to SyncSource or SyncTarget.
- * Returns 1 iff the flag got cleared; 0 iff the flag was already cleared.
- */
-STATIC int _drbd_rs_resume(drbd_dev *mdev, enum RSPauseReason reason)
-{
- drbd_state_t ns;
- int r;
-
- ns = mdev->state;
-
- switch(reason) {
- case AfterDependency: ns.aftr_isp = 0; break;
- case PeerImposed: ns.peer_isp = 0; break;
- case UserImposed: ns.user_isp = 0; break;
- }
-
- // Call _drbd_set_state() in any way to set the _isp bits.
- r = _drbd_set_state(mdev,ns,ChgStateHard|ScheduleAfter);
-
- return r != SS_NothingToDo;
-}
-
-/**
- * _drbd_rs_pause:
- * @reason: Name of the flag
- * Sets one of the three reason flags that could cause the suspension
- * of the resynchronisation process. In case the state was not alreay
- * PausedSyncT or PausedSyncS it changes the state into one of these.
- * Returns 1 iff the flag got set; 0 iff the flag was already set.
- */
-STATIC int _drbd_rs_pause(drbd_dev *mdev, enum RSPauseReason reason)
-{
- drbd_state_t ns;
- int r;
-
- ns = mdev->state;
-
- switch(reason) {
- case AfterDependency: ns.aftr_isp = 1; break;
- case PeerImposed: ns.peer_isp = 1; break;
- case UserImposed: ns.user_isp = 1; break;
- }
-
- // Call _drbd_set_state() in any way to set the _isp bits.
- r = _drbd_set_state(mdev,ns,ChgStateHard|ScheduleAfter);
-
- return r != SS_NothingToDo;
-}
-
STATIC int _drbd_may_sync_now(drbd_dev *mdev)
{
drbd_dev *odev = mdev;
@@ -703,8 +649,10 @@
if( odev->sync_conf.after == -1 ) return 1;
odev = minor_to_mdev(odev->sync_conf.after);
ERR_IF(!odev) return 1;
- if( odev->state.conn >= SyncSource &&
- odev->state.conn <= PausedSyncT ) return 0;
+ if( (odev->state.conn >= SyncSource &&
+ odev->state.conn <= PausedSyncT) ||
+ odev->state.aftr_isp || odev->state.peer_isp ||
+ odev->state.user_isp ) return 0;
}
}
@@ -712,7 +660,7 @@
* _drbd_pause_after:
* Finds all devices that may not resync now, and causes them to
* pause their resynchronisation.
- * Called from process context only ( ioctl and receiver ).
+ * Called from process context only ( ioctl and after_state_ch ).
*/
STATIC int _drbd_pause_after(drbd_dev *mdev)
{
@@ -722,7 +670,9 @@
for (i=0; i < minor_count; i++) {
if( !(odev = minor_to_mdev(i)) ) continue;
if (! _drbd_may_sync_now(odev)) {
- rv |= _drbd_rs_pause(odev,AfterDependency);
+ rv |= ( _drbd_set_state(odev,_NS(aftr_isp,1),
+ ChgStateHard|ScheduleAfter)
+ != SS_NothingToDo ) ;
}
}
@@ -742,10 +692,11 @@
for (i=0; i < minor_count; i++) {
if( !(odev = minor_to_mdev(i)) ) continue;
- if ( odev->state.conn == PausedSyncS ||
- odev->state.conn == PausedSyncT ) {
+ if ( odev->state.aftr_isp ) {
if (_drbd_may_sync_now(odev)) {
- rv |= _drbd_rs_resume(odev,AfterDependency);
+ rv |= ( _drbd_set_state(odev,_NS(aftr_isp,0),
+ ChgStateHard|ScheduleAfter)
+ != SS_NothingToDo ) ;
}
}
}
@@ -759,6 +710,13 @@
drbd_global_unlock();
}
+void suspend_other_sg(drbd_dev* mdev)
+{
+ drbd_global_lock();
+ _drbd_pause_after(mdev);
+ drbd_global_unlock();
+}
+
void drbd_alter_sa(drbd_dev *mdev, int na)
{
int changes;
@@ -774,25 +732,6 @@
drbd_global_unlock();
}
-int drbd_resync_pause(drbd_dev *mdev, enum RSPauseReason reason)
-{
- int rv;
- drbd_global_lock();
- rv = _drbd_rs_pause(mdev,reason);
- drbd_global_unlock();
- return rv;
-}
-
-int drbd_resync_resume(drbd_dev *mdev, enum RSPauseReason reason)
-{
- int rv;
- drbd_global_lock();
- rv = _drbd_rs_resume(mdev,reason);
- drbd_global_unlock();
- return rv;
-}
-
-
/**
* drbd_start_resync:
* @side: Either SyncSource or SyncTarget
Modified: trunk/user/drbdadm_adjust.c
===================================================================
--- trunk/user/drbdadm_adjust.c 2006-09-29 13:51:56 UTC (rev 2478)
+++ trunk/user/drbdadm_adjust.c 2006-09-29 20:35:05 UTC (rev 2479)
@@ -149,6 +149,9 @@
{
int eq = 1;
+ if (conf->disk == NULL && running->disk == NULL) return 1;
+ if (conf->disk == NULL || running->disk == NULL) return 0;
+
eq &= !strcmp(conf->disk,running->disk);
eq &= int_eq(conf->meta_disk,running->meta_disk);
if(!strcmp(conf->meta_disk,"internal")) return eq;
Modified: trunk/user/drbdsetup.c
===================================================================
--- trunk/user/drbdsetup.c 2006-09-29 13:51:56 UTC (rev 2478)
+++ trunk/user/drbdsetup.c 2006-09-29 20:35:05 UTC (rev 2479)
@@ -965,7 +965,7 @@
int show_scmd(struct drbd_cmd *cm, int minor, unsigned short *rtl)
{
int idx;
- char* str;
+ char *str, *backing_dev, *address;
struct sockaddr_in *addr;
// find all commands that have options and print those...
@@ -977,25 +977,31 @@
// start of spagethi code...
if(consume_tag_int(T_wire_protocol,rtl,&idx))
printf("protocol %c;\n",'A'+idx-1);
- if(consume_tag_string(T_backing_dev,rtl,&str)) {
+ backing_dev = address = NULL;
+ consume_tag_string(T_backing_dev,rtl,&backing_dev);
+ consume_tag_string(T_my_addr,rtl,&address);
+ if(backing_dev || address) {
printf("_this_host {\n");
printf("\tdevice\t\t\t\"/dev/drbd%d\";\n",minor);
- printf("\tdisk\t\t\t\"%s\";\n",str);
- consume_tag_int(T_meta_dev_idx,rtl,&idx);
- consume_tag_string(T_meta_dev,rtl,&str);
- switch(idx) {
- case DRBD_MD_INDEX_INTERNAL:
- case DRBD_MD_INDEX_FLEX_INT:
- printf("\tmeta-disk\t\tinternal;\n");
- break;
- case DRBD_MD_INDEX_FLEX_EXT:
- printf("\tflexible-meta-disk\t\"%s\";\n",str);
- break;
- default:
- printf("\tmeta-disk\t\t\"%s\" [ %d ];\n",str,idx);
+ if(backing_dev) {
+ printf("\tdisk\t\t\t\"%s\";\n",backing_dev);
+ consume_tag_int(T_meta_dev_idx,rtl,&idx);
+ consume_tag_string(T_meta_dev,rtl,&str);
+ switch(idx) {
+ case DRBD_MD_INDEX_INTERNAL:
+ case DRBD_MD_INDEX_FLEX_INT:
+ printf("\tmeta-disk\t\tinternal;\n");
+ break;
+ case DRBD_MD_INDEX_FLEX_EXT:
+ printf("\tflexible-meta-disk\t\"%s\";\n",str);
+ break;
+ default:
+ printf("\tmeta-disk\t\t\"%s\" [ %d ];\n",str,
+ idx);
+ }
}
- if(consume_tag_string(T_my_addr,rtl,&str)) {
- addr = (struct sockaddr_in *)str;
+ if(address) {
+ addr = (struct sockaddr_in *)address;
printf("\taddress\t\t\t%s:%d;\n",
inet_ntoa(addr->sin_addr),
ntohs(addr->sin_port));
More information about the drbd-cvs
mailing list