[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