[DRBD-cvs] drbd by phil; Lars' 02-bio.diff (minus one chunk in dr...
drbd-user@lists.linbit.com
drbd-user@lists.linbit.com
Wed, 21 Jan 2004 20:07:39 +0100 (CET)
DRBD CVS committal
Author : phil
Module : drbd
Dir : drbd/drbd
Modified Files:
Tag: rel-0_7-branch
drbd_compat_types.h drbd_compat_wrappers.h drbd_fs.c
drbd_int.h drbd_main.c drbd_receiver.c
Log Message:
Lars' 02-bio.diff (minus one chunk in drbd_ioctl())
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_compat_types.h,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -3 -r1.1.2.1 -r1.1.2.2
--- drbd_compat_types.h 21 Jan 2004 15:40:09 -0000 1.1.2.1
+++ drbd_compat_types.h 21 Jan 2004 19:07:38 -0000 1.1.2.2
@@ -52,6 +52,8 @@
#else // LINUX 2.6
# warning "FIXME"
+#define SIGHAND_HACK
+
typedef struct bio drbd_bio_t;
#define NOT_IN_26(x...)
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_compat_wrappers.h,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -3 -r1.1.2.1 -r1.1.2.2
--- drbd_compat_wrappers.h 21 Jan 2004 15:40:09 -0000 1.1.2.1
+++ drbd_compat_wrappers.h 21 Jan 2004 19:07:38 -0000 1.1.2.2
@@ -63,6 +63,17 @@
}
}
+static inline void drbd_set_blocksize(drbd_dev *mdev, int blksize)
+{
+ set_blocksize(MKDEV(MAJOR_NR, (int)(mdev-drbd_conf)), blksize);
+ set_blocksize(mdev->lo_device, blksize);
+}
+
+static inline int drbd_sync_me(drbd_dev *mdev)
+{
+ return fsync_dev(MKDEV(MAJOR_NR, (int)(mdev-drbd_conf)));
+}
+
static inline void drbd_bio_IO_error(struct buffer_head *bh)
{
buffer_IO_error(bh);
@@ -238,7 +249,7 @@
D_ASSERT(buffer_launder(bh));
D_ASSERT(buffer_locked(bh));
D_ASSERT(buffer_mapped(bh));
- D_ASSERT(buffer_dirty(bh));
+ // D_ASSERT(buffer_dirty(bh)); // It is not true ?!?
// FIXME should not be necessary
bh->b_state = (1 << BH_Dirty) | ( 1 << BH_Mapped) | (1 << BH_Lock);
@@ -294,6 +305,9 @@
extern void FIXME_DONT_USE(void); // unresolved symbol ;)
+/* see get_sb_bdev and bd_claim */
+extern char* drbd_sec_holder;
+
// bi_end_io handlers
// int (bio_end_io_t) (struct bio *, unsigned int, int);
extern int drbd_generic_end_io (struct bio *bio, unsigned int ignored, int error);
@@ -330,6 +344,15 @@
static inline sector_t drbd_md_ss(drbd_dev *mdev)
{
return 0;
+}
+
+static inline void drbd_set_blocksize(drbd_dev *mdev, int blksize)
+{
+}
+
+static inline int drbd_sync_me(drbd_dev *mdev)
+{
+ return 0; // fsync_bdev(mdev->this_device);
}
static inline void drbd_bio_IO_error(struct bio *bio)
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.48
retrieving revision 1.28.2.49
diff -u -3 -r1.28.2.48 -r1.28.2.49
--- drbd_fs.c 21 Jan 2004 15:40:09 -0000 1.28.2.48
+++ drbd_fs.c 21 Jan 2004 19:07:38 -0000 1.28.2.49
@@ -179,7 +179,7 @@
}
#warning "FIXME sync ll-dev, check size"
#warning "FIXME meta-device"
- mdev->backing_device = bdev;
+ mdev->backing_bdev = bdev;
#else
for(i=0;i<minor_count;i++) {
if( i != minor &&
@@ -280,9 +280,7 @@
drbd_al_to_on_disk_bm(mdev);
}
-#warning "FIXME introduce drbd_set_blocksize"
- set_blocksize(MKDEV(MAJOR_NR, minor), INITIAL_BLOCK_SIZE);
- set_blocksize(mdev->lo_device, INITIAL_BLOCK_SIZE);
+ drbd_set_blocksize(mdev,INITIAL_BLOCK_SIZE);
set_cstate(mdev,StandAlone);
@@ -360,7 +358,7 @@
used already. E.g. some FS mounted on it.
*/
- fsync_dev(MKDEV(MAJOR_NR, minor));
+ drbd_sync_me(mdev);
drbd_thread_stop(&mdev->worker);
drbd_thread_stop(&mdev->asender);
drbd_thread_stop(&mdev->receiver);
@@ -409,8 +407,14 @@
int drbd_set_state(drbd_dev *mdev,Drbd_State newstate)
{
+
+#warning "FIXME actually must hold device_mutex!"
+
int minor = mdev-drbd_conf;
- if(newstate == mdev->state) return 0; /* nothing to do */
+ if ( (newstate & 0x3) == mdev->state ) return 0; /* nothing to do */
+
+ // exactly one of sec or pri. not both.
+ if ( !((newstate ^ (newstate >> 1)) & 1) ) return -EINVAL;
if(mdev->cstate == Unconfigured)
return -ENXIO;
@@ -418,10 +422,23 @@
if ( (newstate & Primary) && (mdev->o_state == Primary) )
return -EACCES;
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
if(newstate == Secondary &&
(test_bit(WRITER_PRESENT,&mdev->flags) ||
drbd_is_mounted(minor) == MountedRW))
return -EBUSY;
+#else
+ if ( newstate & Secondary ) {
+ /* If I got here, I am Primary. I claim me for myself. If that
+ * does not succeed, someone other has claimed me, so I cannot
+ * become Secondary. */
+#warning "FIXME"
+ /* if something fails beyond this point, we actually need to
+ * bd_release again */
+ if (bd_claim(mdev->this_bdev,drbd_sec_holder))
+ return -EBUSY;
+ }
+#endif
if( (newstate & Primary) &&
!(mdev->gen_cnt[Flags] & MDF_Consistent) &&
@@ -429,7 +446,7 @@
!(newstate & DontBlameDrbd) )
return -EIO;
- fsync_dev(MKDEV(MAJOR_NR, minor));
+ drbd_sync_me(mdev);
/* Wait until nothing is on the fly :) */
if ( wait_event_interruptible( mdev->state_wait,
@@ -439,7 +456,8 @@
mdev->state = (Drbd_State) newstate & 0x03;
if(newstate & Primary) {
- set_device_ro(MKDEV(MAJOR_NR, minor), FALSE );
+ NOT_IN_26( set_device_ro(MKDEV(MAJOR_NR, minor), FALSE ); )
+ ONLY_IN_26( set_disk_ro(mdev->vdisk, FALSE ); )
if(newstate & Human) {
drbd_md_inc(mdev,HumanCnt);
} else if(newstate & TimeoutExpired ) {
@@ -450,7 +468,8 @@
ConnectedCnt : ArbitraryCnt);
}
} else {
- set_device_ro(MKDEV(MAJOR_NR, minor), TRUE );
+ NOT_IN_26( set_device_ro(MKDEV(MAJOR_NR, minor), TRUE ); )
+ ONLY_IN_26( set_disk_ro(mdev->vdisk, TRUE ); )
}
if(newstate & Secondary && mdev->rs_total) {
@@ -524,8 +543,11 @@
return 0;
}
-
+ONLY_IN_26(
+/* see get_sb_bdev and bd_claim */
+char *drbd_sec_holder = "Secondary DRBD cannot be bd_claimed ;)";
+)
int drbd_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
@@ -534,16 +556,28 @@
long time;
struct Drbd_Conf *mdev;
struct ioctl_wait* wp;
+ ONLY_IN_26(
+ struct block_device *bdev = inode->i_bdev;
+ struct gendisk *disk = bdev->bd_disk;
+ )
minor = MINOR(inode->i_rdev);
- if(minor >= minor_count) return -ENODEV;
- mdev = &drbd_conf[minor];
+ if (minor >= minor_count) return -ENODEV;
+ mdev = drbd_conf + minor;
+
+ D_ASSERT(MAJOR(inode->i_rdev) == MAJOR_NR);
if( (err=down_interruptible(&mdev->device_mutex)) ) return err;
/*
- * please no 'return', use 'err = -ERRNO; break;'
+ * please no 'return', use 'err = -ERRNO; goto out;'
* we hold the device_mutex
*/
+
+ ONLY_IN_26(
+ D_ASSERT(bdev == mdev->this_bdev);
+ D_ASSERT(disk == mdev->vdisk);
+ );
+
switch (cmd) {
case BLKGETSIZE:
err = put_user(drbd_get_my_capacity(mdev), (long *)arg);
@@ -555,14 +589,16 @@
break;
#endif
- case BLKROSET:
+ case BLKROSET: // THINK do we want to intercept this one ?
case BLKROGET:
case BLKFLSBUF:
case BLKSSZGET:
case BLKBSZGET:
- case BLKBSZSET:
+ case BLKBSZSET: // THINK do we want to intercept this one ?
case BLKPG:
- err=blk_ioctl(inode->i_rdev, cmd, arg);
+ NOT_IN_26( err=blk_ioctl(inode->i_rdev, cmd, arg); )
+#warning "FIXME verify this does not create an infine recursion!"
+ ONLY_IN_26( err=blkdev_ioctl(inode, file, cmd, arg); )
break;
case DRBD_IOCTL_GET_VERSION:
err = put_user(API_VERSION, (int *) arg);
@@ -726,7 +762,7 @@
default:
err = -EINVAL;
}
-//out:
+ out:
up(&mdev->device_mutex);
out_unlocked:
return err;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.101
retrieving revision 1.58.2.102
diff -u -3 -r1.58.2.101 -r1.58.2.102
--- drbd_int.h 21 Jan 2004 15:40:09 -0000 1.58.2.101
+++ drbd_int.h 21 Jan 2004 19:07:38 -0000 1.58.2.102
@@ -629,6 +629,7 @@
kdev_t md_device; // device for meta-data.
#else
struct block_device *backing_bdev;
+ struct block_device *this_bdev;
struct block_device *md_bdev;
struct gendisk *vdisk;
request_queue_t *rq_queue;
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.103
retrieving revision 1.73.2.104
diff -u -3 -r1.73.2.103 -r1.73.2.104
--- drbd_main.c 21 Jan 2004 15:40:09 -0000 1.73.2.103
+++ drbd_main.c 21 Jan 2004 19:07:38 -0000 1.73.2.104
@@ -89,6 +89,7 @@
#endif
#define DEVICE_REQUEST drbd_do_request
+#warning "FIXME review the MODULE_* macros below"
MODULE_AUTHOR("Philipp Reisner <philipp.reisner@gmx.at>");
MODULE_DESCRIPTION("drbd - Distributed Replicated Block Device v" REL_VERSION);
MODULE_LICENSE("GPL");
@@ -105,7 +106,7 @@
volatile int drbd_did_panic = 0;
/* in 2.6.x, our device mapping and config info contains our virtual gendisks
- * as member struct gendisk vdisk;
+ * as member "struct gendisk *vdisk;"
*/
NOT_IN_26(
STATIC int *drbd_blocksizes;
@@ -913,7 +914,7 @@
drbd_conf[minor].open_cnt++;
- MOD_INC_USE_COUNT;
+ NOT_IN_26(MOD_INC_USE_COUNT;)
return 0;
}
@@ -936,7 +937,7 @@
clear_bit(WRITER_PRESENT, &drbd_conf[minor].flags);
}
- MOD_DEC_USE_COUNT;
+ NOT_IN_26(MOD_DEC_USE_COUNT;)
return 0;
}
@@ -1226,11 +1227,18 @@
goto Enomem;
#else
for (i = 0; i < minor_count; i++) {
- drbd_conf[i].vdisk = alloc_disk(1);
- if (!drbd_conf[i].vdisk) goto Enomem;
+ drbd_dev *mdev = drbd_conf + i;
+ struct gendisk **disk = &mdev->vdisk;
+ request_queue_t **q = &mdev->rq_queue;
+
+ *q = blk_alloc_queue(GFP_KERNEL);
+ if (!*q) goto Enomem;
+
+ *disk = alloc_disk(1);
+ if (!*disk) goto Enomem;
+
+ set_disk_ro( *disk, TRUE );
}
- /* thanks to alloc_disk, we now have minor_count gendisks with
- * capacity == 0, waiting to be configured. */
#endif
if ((err = drbd_create_mempools()))
@@ -1239,21 +1247,11 @@
for (i = 0; i < minor_count; i++) {
drbd_dev *mdev = &drbd_conf[i];
struct page *page = alloc_page(GFP_KERNEL);
-#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
- struct gendisk **disk = &mdev->vdisk;
- request_queue_t **q = &mdev->rq_queue;
-
- *disk = alloc_disk(1);
- if (!*disk) goto Enomem;
- *q = blk_alloc_queue(GFP_KERNEL);
- if (!*q) goto Enomem;
-
- set_disk_ro( mdev->this_bdev, TRUE );
-#else
+ NOT_IN_26(
drbd_blocksizes[i] = INITIAL_BLOCK_SIZE;
set_device_ro( MKDEV(MAJOR_NR, i), TRUE );
-#endif
+ )
if(!page) goto Enomem;
drbd_init_bio(&mdev->md_io_bio,512);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.90
retrieving revision 1.97.2.91
diff -u -3 -r1.97.2.90 -r1.97.2.91
--- drbd_receiver.c 21 Jan 2004 15:40:09 -0000 1.97.2.90
+++ drbd_receiver.c 21 Jan 2004 19:07:38 -0000 1.97.2.91
@@ -1361,7 +1361,7 @@
dec_ap_pending(mdev,HERE);
case Resync:
dec_rs_pending(mdev,HERE);
- case Discard:
+ case Discard:;
}
INVALIDATE_MAGIC(pr);