[DRBD-cvs] drbd by lars; set_disk for linux 2.6 should work now
drbd-user@lists.linbit.com
drbd-user@lists.linbit.com
Tue, 27 Jan 2004 12:36:37 +0100 (CET)
DRBD CVS committal
Author : lars
Module : drbd
Dir : drbd/drbd
Modified Files:
Tag: rel-0_7-branch
drbd_actlog.c drbd_compat_wrappers.h drbd_fs.c drbd_receiver.c
Log Message:
set_disk for linux 2.6 should work now
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_actlog.c,v
retrieving revision 1.1.2.63
retrieving revision 1.1.2.64
diff -u -3 -r1.1.2.63 -r1.1.2.64
--- drbd_actlog.c 27 Jan 2004 09:22:13 -0000 1.1.2.63
+++ drbd_actlog.c 27 Jan 2004 11:36:32 -0000 1.1.2.64
@@ -107,7 +107,7 @@
};
STATIC void drbd_al_write_transaction(struct Drbd_Conf *,struct lc_element *);
-STATIC void drbd_update_on_disk_bm(struct Drbd_Conf *,unsigned int ,int);
+STATIC void drbd_update_on_disk_bm(struct Drbd_Conf *,unsigned int);
#define SM (BM_EXTENT_SIZE / AL_EXTENT_SIZE)
@@ -156,7 +156,7 @@
al_ext->lc_number = enr;
if(mdev->cstate < Connected && evicted != LC_FREE ) {
- drbd_update_on_disk_bm(mdev,evicted,1);
+ drbd_update_on_disk_bm(mdev,evicted);
}
drbd_al_write_transaction(mdev,al_ext);
mdev->al_writ_cnt++;
@@ -386,7 +386,7 @@
for(i=0;i<mdev->act_log->nr_elements;i++) {
enr = lc_entry(mdev->act_log,i)->lc_number;
if(enr == LC_FREE) continue;
- drbd_update_on_disk_bm(mdev,enr,1);
+ drbd_update_on_disk_bm(mdev,enr);
}
lc_unlock(mdev->act_log);
@@ -429,7 +429,7 @@
exts = div_ceil(mdev->mbds_id->size,BM_EXTENT_SIZE);
for(i=0;i<exts;i++) {
- drbd_update_on_disk_bm(mdev,i,1);
+ drbd_update_on_disk_bm(mdev,i);
}
}
@@ -487,8 +487,7 @@
*
* @enr: The extent number of the bits we should write to disk.
*/
-STATIC void drbd_update_on_disk_bm(struct Drbd_Conf *mdev,unsigned int enr,
- int sync)
+STATIC void drbd_update_on_disk_bm(struct Drbd_Conf *mdev,unsigned int enr)
{
unsigned long * buffer, * bm;
int want,buf_i,bm_words,bm_i;
@@ -524,7 +523,7 @@
{
struct update_odbm_work *udw = (struct update_odbm_work*)w;
- drbd_update_on_disk_bm(mdev,udw->enr,1);
+ drbd_update_on_disk_bm(mdev,udw->enr);
kfree(udw);
@@ -534,7 +533,7 @@
mdev->resync_work.cb = w_resync_finished;
drbd_queue_work(mdev,&mdev->data.work,&mdev->resync_work);
}
-
+
return 1;
}
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_compat_wrappers.h,v
retrieving revision 1.1.2.12
retrieving revision 1.1.2.13
diff -u -3 -r1.1.2.12 -r1.1.2.13
--- drbd_compat_wrappers.h 27 Jan 2004 09:22:13 -0000 1.1.2.12
+++ drbd_compat_wrappers.h 27 Jan 2004 11:36:32 -0000 1.1.2.13
@@ -242,15 +242,6 @@
}
#endif
-static inline void
-drbd_bio_add_page(struct buffer_head *bh, struct page *page, unsigned int len,
- unsigned int offset)
-{
- set_bh_page (bh,page,offset);
- bh->b_size = len;
- bh->b_this_page = bh;
-}
-
static inline struct page* drbd_bio_get_page(struct buffer_head *bh)
{
return bh->b_page;
@@ -375,6 +366,11 @@
return pr->d.master_bio->bi_sector;
}
+/* this is valid, since the only place where it is used is in recv_both_read,
+ * on the untouched master_bio of the Pending_read.
+ * DO NOT use it for anything but an untouched bio,
+ * bi_size is mutable, see bio_endio()
+ */
static inline short drbd_bio_get_size(struct bio *bio)
{
return bio->bi_size;
@@ -383,7 +379,7 @@
#ifdef CONFIG_HIGHMEM
/*
* I don't know why there is no bvec_kmap, only bvec_kmap_irq ...
- * If for some reason it is intentional, ans MUST be irq save,
+ * If for some reason it is intentional, and MUST be irq save,
* I introduce a very bad bug right here and now.
*
* Most likely it is only due to performance:
@@ -514,13 +510,6 @@
{
}
#endif
-
-static inline void
-drbd_bio_add_page(struct bio *bio, struct page *page, unsigned int len,
- unsigned int offset)
-{
- bio_add_page(bio,page,len,offset);
-}
static inline struct page* drbd_bio_get_page(struct bio *bio)
{
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.54
retrieving revision 1.28.2.55
diff -u -3 -r1.28.2.54 -r1.28.2.55
--- drbd_fs.c 27 Jan 2004 09:22:13 -0000 1.28.2.54
+++ drbd_fs.c 27 Jan 2004 11:36:32 -0000 1.28.2.55
@@ -153,10 +153,13 @@
minor=(int)(mdev-drbd_conf);
/* if you want to reconfigure, please tear down first */
-ONLY_IN_26(
- if (mdev->backing_bdev)
+ if (mdev->lo_file)
return -EBUSY;
-)
+
+ /* FIXME if this was "adding" a lo dev to a previously "diskless" node,
+ * there still could be requests comming in right now. brrks.
+ */
+ D_ASSERT(mdev->state == Secondary);
if (mdev->open_cnt > 1)
return -EBUSY;
@@ -164,6 +167,8 @@
if (copy_from_user(&new_conf, &arg->config,sizeof(struct disk_config)))
return -EFAULT;
+ /* TODO plausibility check for the provided values... */
+
filp = fget(new_conf.lower_device);
if (!filp) {
retcode=LDFDInvalid;
@@ -183,9 +188,29 @@
retcode=LDMounted;
goto fail_ioctl;
}
-#warning "FIXME check size"
-#warning "FIXME meta-device"
- mdev->backing_bdev = bdev;
+
+#warning "XXX size check does not care about meta data on the same device??"
+ if ((drbd_get_lo_capacity(mdev)>>1) < new_conf.disk_size) {
+ retcode = LDDeviceTooSmall;
+ goto release_bdev_fail_ioctl;
+ }
+
+ filp2 = fget(new_conf.meta_device);
+ if (!filp2) {
+ retcode=LDFDInvalid;
+ goto release_bdev_fail_ioctl;
+ }
+
+ inode = filp2->f_dentry->d_inode;
+
+ if (!S_ISBLK(inode->i_mode)) {
+ retcode=LDNoBlockDev;
+ goto release_bdev_fail_ioctl;
+ }
+ if (bd_claim(inode->i_bdev, &mdev)) {
+ retcode=LDOpenFailed;
+ goto release_bdev_fail_ioctl;
+ }
#else
for(i=0;i<minor_count;i++) {
if( i != minor &&
@@ -213,46 +238,44 @@
if ((drbd_get_lo_capacity(mdev)>>1) < new_conf.disk_size) {
retcode = LDDeviceTooSmall;
- blkdev_put(filp->f_dentry->d_inode->i_bdev,BDEV_FILE);
- goto fail_ioctl;
+ goto release_bdev_fail_ioctl;
}
filp2 = fget(new_conf.meta_device);
if (!filp2) {
retcode=LDFDInvalid;
- blkdev_put(filp->f_dentry->d_inode->i_bdev,BDEV_FILE);
- goto fail_ioctl;
+ goto release_bdev_fail_ioctl;
}
inode = filp2->f_dentry->d_inode;
if (!S_ISBLK(inode->i_mode)) {
retcode=LDNoBlockDev;
- blkdev_put(filp->f_dentry->d_inode->i_bdev,BDEV_FILE);
- goto fail_ioctl;
+ goto release_bdev_fail_ioctl;
}
if ((err = blkdev_open(inode, filp2))) {
ERR("blkdev_open( %d:%d ,) returned %d\n",
MAJOR(inode->i_rdev), MINOR(inode->i_rdev), err);
retcode=LDOpenFailed;
- blkdev_put(filp->f_dentry->d_inode->i_bdev,BDEV_FILE);
- goto fail_ioctl;
+ goto release_bdev_fail_ioctl;
}
-
- fsync_dev(MKDEV(MAJOR_NR, minor));
#endif
+ drbd_sync_me(mdev); // XXX does this make sense?
+
drbd_thread_stop(&mdev->worker);
drbd_thread_stop(&mdev->asender);
drbd_thread_stop(&mdev->receiver);
drbd_free_resources(mdev);
NOT_IN_26( mdev->md_device = inode->i_rdev; )
+ ONLY_IN_26(mdev->md_bdev = inode->i_bdev; )
mdev->md_file = filp2;
mdev->md_index = new_conf.meta_index;
- NOT_IN_26( mdev->lo_device = ll_dev; )
+ NOT_IN_26( mdev->lo_device = ll_dev; )
+ ONLY_IN_26(mdev->backing_bdev = bdev; )
mdev->lo_file = filp;
mdev->lo_usize = new_conf.disk_size;
mdev->do_panic = new_conf.do_panic;
@@ -292,6 +315,9 @@
return 0;
+ release_bdev_fail_ioctl:
+ NOT_IN_26(blkdev_put(filp->f_dentry->d_inode->i_bdev,BDEV_FILE);)
+ ONLY_IN_26(bd_release(bdev);)
fail_ioctl:
if (filp) fput(filp);
if (filp2) fput(filp2);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.97
retrieving revision 1.97.2.98
diff -u -3 -r1.97.2.97 -r1.97.2.98
--- drbd_receiver.c 27 Jan 2004 09:16:50 -0000 1.97.2.97
+++ drbd_receiver.c 27 Jan 2004 11:36:32 -0000 1.97.2.98
@@ -297,6 +297,7 @@
if((mdev->ee_vacant * 2 > mdev->ee_in_use ) &&
( mdev->ee_vacant + mdev->ee_in_use > EE_MININUM) ) {
+ // FIXME cleanup: never returns NULL anymore
page=drbd_free_ee(mdev,&mdev->free_ee);
if( page ) __free_page(page);
}