[DRBD-cvs] r1745 - in trunk: . drbd user

svn at svn.drbd.org svn at svn.drbd.org
Mon Jan 31 18:14:16 CET 2005


Author: phil
Date: 2005-01-31 18:14:14 +0100 (Mon, 31 Jan 2005)
New Revision: 1745

Modified:
   trunk/
   trunk/drbd/drbd_actlog.c
   trunk/drbd/drbd_compat_wrappers.h
   trunk/drbd/drbd_int.h
   trunk/drbd/drbd_main.c
   trunk/drbd/drbd_req.c
   trunk/drbd/drbd_worker.c
   trunk/user/drbdadm_main.c
Log:
svnp run. Investigated 1721 to 1745

r1723 by phil on 2005-01-17 11:19:50 +0100 (Mon, 17 Jan 2005) 
  Changed paths:
     M /branches/drbd-0.7/user/drbdadm_main.c
  
  I realized that on RHAS3 systems (and probabely all other RedHat
  based and related distributions) drbdadm's user dialog
  was not displayed in the boot process.
  RedHat's rc script redirects all output of init scripts to
  the Logfiles exclusively!! 
  If drbdadm detects this (by using isatty(stdin)) it prints
  a warning and does the user dialog on /dev/console
  

r1732 by phil on 2005-01-25 10:56:00 +0100 (Tue, 25 Jan 2005) 
  Changed paths:
     M /branches/drbd-0.7/drbd/drbd_actlog.c
     M /branches/drbd-0.7/drbd/drbd_compat_wrappers.h
     M /branches/drbd-0.7/drbd/drbd_int.h
  
  LMB's patch to make DRBD work with SuSE's kernel and upcomming
  Linux-2.6.11
  

r1733 by phil on 2005-01-25 11:22:40 +0100 (Tue, 25 Jan 2005) 
  Changed paths:
     M /branches/drbd-0.7/drbd/drbd_compat_wrappers.h
  
  Last part of LMB's patch...
  

r1737 by phil on 2005-01-27 09:56:42 +0100 (Thu, 27 Jan 2005) 
  Changed paths:
     M /branches/drbd-0.7/drbd/drbd_compat_wrappers.h
  
  LMB thinks that this is a good idea ?!?
  

r1738 by phil on 2005-01-27 14:46:55 +0100 (Thu, 27 Jan 2005) 
  Changed paths:
     M /branches/drbd-0.7/drbd/drbd_compat_wrappers.h
     M /branches/drbd-0.7/drbd/drbd_int.h
     M /branches/drbd-0.7/drbd/drbd_main.c
     M /branches/drbd-0.7/drbd/drbd_req.c
     M /branches/drbd-0.7/drbd/drbd_worker.c
     M /branches/drbd-0.7/drbd/linux/drbd_config.h
  
  New way of using bio_clone() ... needs more testing
  

r1743 by phil on 2005-01-31 12:19:19 +0100 (Mon, 31 Jan 2005) 
  Changed paths:
     M /branches/drbd-0.7/ChangeLog
     M /branches/drbd-0.7/drbd/drbd_actlog.c
     M /branches/drbd-0.7/drbd/drbd_compat_wrappers.h
     M /branches/drbd-0.7/drbd.spec.in
  
  No longer leak of BIOs.
  



Property changes on: trunk
___________________________________________________________________
Name: propagate:at
   - 1721
   + 1745

Modified: trunk/drbd/drbd_actlog.c
===================================================================
--- trunk/drbd/drbd_actlog.c	2005-01-31 12:20:27 UTC (rev 1744)
+++ trunk/drbd/drbd_actlog.c	2005-01-31 17:14:14 UTC (rev 1745)
@@ -37,35 +37,27 @@
 STATIC int _drbd_md_sync_page_io(drbd_dev *mdev, struct page *page, 
 				 sector_t sector, int rw, int size)
 {
-	struct bio bio;
-	struct bio_vec vec;
+	struct bio *bio = bio_alloc(GFP_KERNEL, 1);
 	struct completion event;
 	int ok;
 
-	bio_init(&bio);
-	bio.bi_io_vec = &vec;
-	vec.bv_page = page;
-	vec.bv_offset = 0;
-	vec.bv_len =
-	bio.bi_size = size;
-	bio.bi_vcnt = 1;
-	bio.bi_idx = 0;
-	bio.bi_bdev = mdev->md_bdev;
-	bio.bi_sector = sector;
+	bio->bi_bdev = mdev->md_bdev;
+	bio->bi_sector = sector;
+	bio_add_page(bio, page, size, 0);
 	init_completion(&event);
-	bio.bi_private = &event;
-	bio.bi_end_io = drbd_md_io_complete;
+	bio->bi_private = &event;
+	bio->bi_end_io = drbd_md_io_complete;
 
 #ifdef BIO_RW_SYNC
-	submit_bio(rw | (1 << BIO_RW_SYNC), &bio);
+	submit_bio(rw | (1 << BIO_RW_SYNC), bio);
 #else
-	submit_bio(rw, &bio);
+	submit_bio(rw, bio);
 	drbd_blk_run_queue(bdev_get_queue(mdev->md_bdev));
 #endif
 	wait_for_completion(&event);
 
-	ok = test_bit(BIO_UPTODATE, &bio.bi_flags);
-
+	ok = test_bit(BIO_UPTODATE, &bio->bi_flags);
+	bio_put(bio);
 	return ok;
 }
 

Modified: trunk/drbd/drbd_compat_wrappers.h
===================================================================
--- trunk/drbd/drbd_compat_wrappers.h	2005-01-31 12:20:27 UTC (rev 1744)
+++ trunk/drbd/drbd_compat_wrappers.h	2005-01-31 17:14:14 UTC (rev 1745)
@@ -69,7 +69,7 @@
 
 static inline drbd_dev* drbd_req_get_mdev(struct drbd_request *req)
 {
-	return (drbd_dev*) req->private_bio.bi_private;
+	return (drbd_dev*) req->mdev;
 }
 
 static inline sector_t drbd_req_get_sector(struct drbd_request *req)
@@ -79,11 +79,16 @@
 
 static inline unsigned short drbd_req_get_size(struct drbd_request *req)
 {
-	drbd_dev* mdev = req->private_bio.bi_private;
+	drbd_dev* mdev = req->mdev;
 	D_ASSERT(req->master_bio->bi_size);
 	return req->master_bio->bi_size;
 }
 
+static inline drbd_bio_t* drbd_req_private_bio(struct drbd_request *req)
+{
+	return req->private_bio;
+}
+
 static inline sector_t drbd_ee_get_sector(struct Tl_epoch_entry *ee)
 {
 	return ee->ee_sector;
@@ -111,11 +116,9 @@
  */
 static inline char *drbd_bio_kmap(struct bio *bio)
 {
-	struct bio_vec *bvec;
+	struct bio_vec *bvec = bio_iovec(bio);
 	unsigned long addr;
 
-	bvec = bio_iovec_idx(bio, bio->bi_idx);
-
 	addr = (unsigned long) kmap(bvec->bv_page);
 
 	if (addr & ~PAGE_MASK)
@@ -126,16 +129,15 @@
 
 static inline void drbd_bio_kunmap(struct bio *bio)
 {
-	struct bio_vec *bvec;
+	struct bio_vec *bvec = bio_iovec(bio);
 
-	bvec = bio_iovec_idx(bio, bio->bi_idx);
 	kunmap(bvec->bv_page);
 }
 
 #else
 static inline char *drbd_bio_kmap(struct bio *bio)
 {
-	struct bio_vec *bvec = bio_iovec_idx(bio, bio->bi_idx);
+	struct bio_vec *bvec = bio_iovec(bio);
 	return page_address(bvec->bv_page) + bvec->bv_offset;
 }
 static inline void drbd_bio_kunmap(struct bio *bio)
@@ -148,16 +150,16 @@
 {
 	struct bio * const bio = &e->private_bio;
 	struct bio_vec * const vec = &e->ee_bvec;
+
 	memset(e, 0, sizeof(*e));
+	bio_init(bio);
 
-	// bio_init(&bio); memset did it for us.
 	bio->bi_io_vec = vec;
-	vec->bv_page   = page;
-	vec->bv_len    =
-	bio->bi_size   = PAGE_SIZE;
-	bio->bi_max_vecs = 1;
 	bio->bi_destructor = NULL;
-	atomic_set(&bio->bi_cnt, 1);
+	vec->bv_page = page;
+	bio->bi_size = vec->bv_len = PAGE_SIZE;
+	bio->bi_max_vecs = bio->bi_vcnt = 1;
+	vec->bv_offset = 0;
 
 	e->block_id = ID_VACANT;
 }
@@ -177,20 +179,24 @@
 		    sector_t sector, int size)
 {
 	struct bio * const bio = &e->private_bio;
-
+	struct bio_vec * const vec = &e->ee_bvec;
+	struct page * const page = vec->bv_page;
 	D_ASSERT(mdev->backing_bdev);
 
-	bio->bi_flags  = 1 << BIO_UPTODATE;
-	bio->bi_io_vec->bv_len =
-	bio->bi_size    = size;
-	bio->bi_bdev    = mdev->backing_bdev;
-	bio->bi_sector  = sector;
+	/* Clear plate. */
+	bio_init(bio);
+
+	bio->bi_io_vec = vec;
+	bio->bi_destructor = NULL;
+	vec->bv_page = page;
+	vec->bv_offset = 0;
+	bio->bi_max_vecs = bio->bi_vcnt = 1;
+
+	bio->bi_bdev = mdev->backing_bdev;
 	bio->bi_private = mdev;
-	bio->bi_next    = 0;
-	bio->bi_idx     = 0; // for blk_recount_segments
-	bio->bi_vcnt    = 1; // for blk_recount_segments
-	e->ee_sector = sector;
-	e->ee_size = size;
+
+	e->ee_sector = bio->bi_sector = sector;
+	e->ee_size = bio->bi_size = bio->bi_io_vec->bv_len = size;
 }
 
 static inline void
@@ -212,38 +218,36 @@
 static inline void
 drbd_req_prepare_write(drbd_dev *mdev, struct drbd_request *req)
 {
-	struct bio * const bio     = &req->private_bio;
-	struct bio * const bio_src =  req->master_bio;
+	struct bio *bio;
 
-	bio_init(bio); // bio->bi_flags   = 0;
-	__bio_clone(bio,bio_src);
+	bio = req->private_bio = bio_clone(req->master_bio, GFP_NOIO );
 	bio->bi_bdev    = mdev->backing_bdev;
-	bio->bi_private = mdev;
+	bio->bi_private = req;
 	bio->bi_end_io  = drbd_dio_end;
 	bio->bi_next    = 0;
 
 	req->rq_status = RQ_DRBD_NOTHING;
+	req->mdev      = mdev;
 }
 
 static inline void
 drbd_req_prepare_read(drbd_dev *mdev, struct drbd_request *req)
 {
-	struct bio * const bio     = &req->private_bio;
-	struct bio * const bio_src =  req->master_bio;
+	struct bio *bio;
 
-	bio_init(bio); // bio->bi_flags   = 0;
-	__bio_clone(bio,bio_src);
+	bio = req->private_bio = bio_clone(req->master_bio, GFP_NOIO );
 	bio->bi_bdev    = mdev->backing_bdev;
-	bio->bi_private = mdev;
+	bio->bi_private = req;
 	bio->bi_end_io  = drbd_read_bi_end_io;	// <- only difference
 	bio->bi_next    = 0;
 
 	req->rq_status = RQ_DRBD_NOTHING;
+	req->mdev      = mdev;
 }
 
 static inline struct page* drbd_bio_get_page(struct bio *bio)
 {
-	struct bio_vec *bvec = bio_iovec_idx(bio, bio->bi_idx);
+	struct bio_vec *bvec = bio_iovec(bio);
 	return bvec->bv_page;
 }
 
@@ -310,7 +314,7 @@
 
 static inline int _drbd_send_bio(drbd_dev *mdev, struct bio *bio)
 {
-	struct bio_vec *bvec = bio_iovec_idx(bio, bio->bi_idx);
+	struct bio_vec *bvec = bio_iovec(bio);
 	struct page *page = bvec->bv_page;
 	size_t size = bvec->bv_len;
 	int offset = bvec->bv_offset;

Modified: trunk/drbd/drbd_int.h
===================================================================
--- trunk/drbd/drbd_int.h	2005-01-31 12:20:27 UTC (rev 1744)
+++ trunk/drbd/drbd_int.h	2005-01-31 17:14:14 UTC (rev 1745)
@@ -564,8 +564,9 @@
 	int rq_status;
 	struct drbd_barrier *barrier; // The next barrier.
 	struct bio *master_bio;       // master bio pointer
-	struct bio private_bio;       // private bio struct
+	struct bio *private_bio;
 	struct hlist_node colision;
+	drbd_dev *mdev;
 };
 
 struct drbd_barrier {

Modified: trunk/drbd/drbd_main.c
===================================================================
--- trunk/drbd/drbd_main.c	2005-01-31 12:20:27 UTC (rev 1744)
+++ trunk/drbd/drbd_main.c	2005-01-31 17:14:14 UTC (rev 1745)
@@ -1303,9 +1303,9 @@
 		ok = sizeof(p) == drbd_send(mdev,mdev->data.socket,&p,sizeof(p),MSG_MORE);
 		if(ok) {
 			if(mdev->conf.wire_protocol == DRBD_PROT_A) {
-				ok = _drbd_send_bio(mdev,&req->private_bio);
+				ok = _drbd_send_bio(mdev,drbd_req_private_bio(req));
 			} else {
-				ok = _drbd_send_zc_bio(mdev,&req->private_bio);
+				ok = _drbd_send_zc_bio(mdev,drbd_req_private_bio(req));
 			}
 		}
 		if(!ok) tl_cancel(mdev,req);

Modified: trunk/drbd/drbd_req.c
===================================================================
--- trunk/drbd/drbd_req.c	2005-01-31 12:20:27 UTC (rev 1744)
+++ trunk/drbd/drbd_req.c	2005-01-31 17:14:14 UTC (rev 1745)
@@ -341,7 +341,7 @@
 		else            mdev->read_cnt += size>>9;
 
 		// in 2.4.X, READA are submitted as READ.
-		drbd_generic_make_request(rw,&req->private_bio);
+		drbd_generic_make_request(rw,drbd_req_private_bio(req));
 	}
 
 	// up_read(mdev->device_lock);

Modified: trunk/drbd/drbd_worker.c
===================================================================
--- trunk/drbd/drbd_worker.c	2005-01-31 12:20:27 UTC (rev 1744)
+++ trunk/drbd/drbd_worker.c	2005-01-31 17:14:14 UTC (rev 1745)
@@ -135,25 +135,21 @@
  */
 int drbd_dio_end(struct bio *bio, unsigned int bytes_done, int error)
 {
-	struct Drbd_Conf* mdev=bio->bi_private;
-	drbd_request_t *req;
+	drbd_request_t *req=bio->bi_private;
+	struct Drbd_Conf* mdev=req->mdev;
 	sector_t rsector;
 
 	// see above
 	ERR_IF (bio->bi_size)
 		return 1;
 
-	PARANOIA_BUG_ON(!IS_VALID_MDEV(mdev));
-
-	req = container_of(bio,struct drbd_request,private_bio);
-	PARANOIA_BUG_ON(!VALID_POINTER(req));
-
 	drbd_chk_io_error(mdev,error);
 	rsector = drbd_req_get_sector(req);
         // the bi_sector of the bio gets modified somewhere in drbd_end_req()!
 	drbd_end_req(req, RQ_DRBD_LOCAL, (error == 0), rsector);
 	drbd_al_complete_io(mdev,rsector);
 	dec_local(mdev);
+	bio_put(bio);
 	return 0;
 }
 
@@ -161,18 +157,13 @@
  */
 int drbd_read_bi_end_io(struct bio *bio, unsigned int bytes_done, int error)
 {
-	struct Drbd_Conf* mdev = bio->bi_private;
-	drbd_request_t *req;
+	drbd_request_t *req=bio->bi_private;
+	struct Drbd_Conf* mdev=req->mdev;
 
 	// see above
 	ERR_IF (bio->bi_size)
 		return 1;
 
-	PARANOIA_BUG_ON(!IS_VALID_MDEV(mdev));
-
-	req = container_of(bio,struct drbd_request,private_bio);
-	PARANOIA_BUG_ON(!VALID_POINTER(req));
-
 	/* READAs may fail.
 	 * upper layers need to be able to handle that themselves */
 	if (bio_rw(bio) == READA) goto pass_on;
@@ -194,6 +185,7 @@
 		mempool_free(req,drbd_request_mempool);
 	}
 
+	bio_put(bio);
 	dec_local(mdev);
 	return 0;
 }

Modified: trunk/user/drbdadm_main.c
===================================================================
--- trunk/user/drbdadm_main.c	2005-01-31 12:20:27 UTC (rev 1744)
+++ trunk/user/drbdadm_main.c	2005-01-31 17:14:14 UTC (rev 1745)
@@ -37,6 +37,7 @@
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <sys/poll.h>
+#include <fcntl.h>
 #include <unistd.h>
 #include <errno.h>
 #include <getopt.h>
@@ -867,9 +868,26 @@
   struct d_option* opt;
   int rr,wtime,argc,i=0;
   time_t start;
+  int saved_stdin,saved_stdout,fd;
 
   struct sigaction so,sa;
 
+  saved_stdin = -1;
+  if( isatty(fileno(stdin)) == 0 || isatty(fileno(stdout)) == 0 ) {
+    fprintf(stderr,"WARN: stdin/stdout is not a TTY; using /dev/console");
+    fprintf(stdout,"WARN: stdin/stdout is not a TTY; using /dev/console");
+    saved_stdin  = dup(fileno(stdin));
+    if( saved_stdin == -1) perror("dup(stdin)");
+    saved_stdout = dup(fileno(stdout));
+    if( saved_stdin == -1) perror("dup(stdout)");
+    fd = open( "/dev/console", O_RDONLY);
+    if(fd == -1) perror("open('/dev/console, O_RDONLY)");
+    dup2(fd, fileno(stdin) );
+    fd = open( "/dev/console", O_WRONLY);
+    if(fd == -1) perror("open('/dev/console, O_WRONLY)");
+    dup2(fd, fileno(stdout) );
+  }
+
   sa.sa_handler=chld_sig_hand;
   sigemptyset(&sa.sa_mask);
   sa.sa_flags=SA_NOCLDSTOP;
@@ -930,6 +948,11 @@
     printf("\n");
   }
 
+  if( saved_stdin != -1 ) {
+    dup2(saved_stdin,  fileno(stdin ) );
+    dup2(saved_stdout, fileno(stdout) );
+  }
+
   return 0;
 }
 



More information about the drbd-cvs mailing list