[DRBD-cvs] drbd by phil; Implemented the IO-HINTS (unfortunately ...
drbd-user@lists.linbit.com
drbd-user@lists.linbit.com
Sun, 25 Jan 2004 20:03:55 +0100 (CET)
DRBD CVS committal
Author : phil
Module : drbd
Dir : drbd/drbd
Modified Files:
Tag: rel-0_7-branch
drbd_compat_wrappers.h drbd_fs.c drbd_int.h drbd_main.c
drbd_receiver.c drbd_req-2.4.c
Log Message:
Implemented the IO-HINTS (unfortunately parially still called WRITE-HINTS
in some places) for Linux-2.6.
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/Attic/drbd_compat_wrappers.h,v
retrieving revision 1.1.2.6
retrieving revision 1.1.2.7
diff -u -3 -r1.1.2.6 -r1.1.2.7
--- drbd_compat_wrappers.h 25 Jan 2004 10:18:19 -0000 1.1.2.6
+++ drbd_compat_wrappers.h 25 Jan 2004 19:03:50 -0000 1.1.2.7
@@ -281,6 +281,11 @@
wait_on_buffer(bh);
}
+static inline void drbd_kick_lo(drbd_dev *mdev)
+{
+ run_task_queue(&tq_disk);
+}
+
static inline int _drbd_send_zc_bio(drbd_dev *mdev, struct buffer_head *bh)
{
struct page *page = bh->b_page;
@@ -463,6 +468,11 @@
static inline void drbd_generic_make_request_wait(int rw, struct bio *bio)
{
+}
+
+static inline void drbd_kick_lo(drbd_dev *mdev)
+{
+ blk_run_queue(bdev_get_queue(mdev->backing_bdev));
}
static inline int _drbd_send_zc_bio(drbd_dev *mdev, struct bio *bio)
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_fs.c,v
retrieving revision 1.28.2.51
retrieving revision 1.28.2.52
diff -u -3 -r1.28.2.51 -r1.28.2.52
--- drbd_fs.c 25 Jan 2004 00:38:09 -0000 1.28.2.51
+++ drbd_fs.c 25 Jan 2004 19:03:50 -0000 1.28.2.52
@@ -142,8 +142,8 @@
struct file *filp = 0;
struct file *filp2 = 0;
struct inode *inode;
- NOT_IN_26(kdev_t ll_dev);
- ONLY_IN_26(struct block_device *bdev);
+ NOT_IN_26(kdev_t ll_dev;)
+ ONLY_IN_26(struct block_device *bdev;)
/*
if (!capable(CAP_SYS_ADMIN)) //MAYBE: Move this to the drbd_ioctl()
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_int.h,v
retrieving revision 1.58.2.104
retrieving revision 1.58.2.105
diff -u -3 -r1.58.2.104 -r1.58.2.105
--- drbd_int.h 24 Jan 2004 18:28:26 -0000 1.58.2.104
+++ drbd_int.h 25 Jan 2004 19:03:50 -0000 1.58.2.105
@@ -920,39 +920,6 @@
})
#endif
-// the same, without timeout,
-// but with run_task_queue(&tq_disk) just before the schedule()
-// THINK whether we want to be interruptible or not
-#define __wait_disk_event_interruptible(wq, condition) \
-do { \
- wait_queue_t __wait; \
- init_waitqueue_entry(&__wait, current); \
- \
- add_wait_queue(&wq, &__wait); \
- for (;;) { \
- set_current_state(TASK_INTERRUPTIBLE); \
- if (condition) \
- break; \
- if (!signal_pending(current)) { \
- run_task_queue(&tq_disk); \
- schedule(); \
- continue; \
- } \
- ret = -ERESTARTSYS; \
- break; \
- } \
- current->state = TASK_RUNNING; \
- remove_wait_queue(&wq, &__wait); \
-} while (0)
-
-#define wait_disk_event_interruptible(wq, condition) \
-do { \
- if (condition) \
- break; \
- __wait_disk_event_interruptible(wq, condition); \
-} while (0)
-
-
/*
* inline helper functions
*************************/
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_main.c,v
retrieving revision 1.73.2.107
retrieving revision 1.73.2.108
diff -u -3 -r1.73.2.107 -r1.73.2.108
--- drbd_main.c 25 Jan 2004 10:18:19 -0000 1.73.2.107
+++ drbd_main.c 25 Jan 2004 19:03:50 -0000 1.73.2.108
@@ -942,6 +942,7 @@
return 0;
}
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
STATIC void drbd_send_write_hint(void *data)
{
struct Drbd_Conf* mdev = (drbd_dev*)data;
@@ -963,8 +964,6 @@
by one of our threads?
*/
-
-#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
for (i = 0; i < minor_count; i++) {
if(current == drbd_conf[i].receiver.task) {
queue_task(&mdev->write_hint_tq, &tq_disk);
@@ -980,11 +979,33 @@
clear_bit(WRITE_HINT_QUEUED, &mdev->flags);
} else queue_task(&mdev->write_hint_tq, &tq_disk);
}
+}
#else
-# warning "FIXME"
-#endif
+STATIC void drbd_send_write_hint(void *data)
+{
+ request_queue_t *q = data;
+ drbd_dev *mdev = q->queuedata;
+ Drbd_Header h;
+
+ /* In order to avoid deadlocks the receiver should only
+ use blk_run_queue(). It must not use blk_run_queues() to
+ avoid deadlocks.
+ */
+
+ if (drbd_send_cmd_dontwait(mdev,mdev->data.socket,WriteHint,&h,sizeof(h))==1){
+ spin_lock_irq(q->queue_lock);
+ blk_remove_plug(q);
+ spin_unlock_irq(q->queue_lock);
+ } else {
+ if(mdev->cstate < Connected) {
+ spin_lock_irq(q->queue_lock);
+ blk_remove_plug(q);
+ spin_unlock_irq(q->queue_lock);
+ }
+ }
}
+#endif
void drbd_init_set_defaults(drbd_dev *mdev)
{
@@ -1263,6 +1284,9 @@
// THINK do we need this?
mdev->this_bdev = bdget(MKDEV(MAJOR_NR,i));
+
+ blk_queue_make_request(q,drbd_make_request);
+ q->unplug_fn = drbd_send_write_hint;
}
#endif
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_receiver.c,v
retrieving revision 1.97.2.94
retrieving revision 1.97.2.95
diff -u -3 -r1.97.2.94 -r1.97.2.95
--- drbd_receiver.c 25 Jan 2004 10:18:19 -0000 1.97.2.94
+++ drbd_receiver.c 25 Jan 2004 19:03:50 -0000 1.97.2.95
@@ -254,7 +254,7 @@
if(drbd_alloc_ee(mdev,GFP_TRY)) av = 1;
}
}
- NOT_IN_26 ( if(!av) run_task_queue(&tq_disk); )
+ if(!av) drbd_kick_lo(mdev);
return av;
}
@@ -267,7 +267,7 @@
if(mdev->ee_vacant == EE_MININUM / 2) {
spin_unlock_irq(&mdev->ee_lock);
- NOT_IN_26( run_task_queue(&tq_disk); )
+ drbd_kick_lo(mdev);
spin_lock_irq(&mdev->ee_lock);
}
@@ -384,7 +384,7 @@
spin_lock_irq(&mdev->ee_lock);
rv = list_empty(head);
spin_unlock_irq(&mdev->ee_lock);
- NOT_IN_26( if(!rv) run_task_queue(&tq_disk);)
+ if(!rv) drbd_kick_lo(mdev);
return rv;
}
@@ -755,10 +755,8 @@
// DBG("got Barrier\n");
-NOT_IN_26(
if (mdev->conf.wire_protocol != DRBD_PROT_C)
- run_task_queue(&tq_disk);
-)
+ drbd_kick_lo(mdev);
drbd_wait_ee(mdev,&mdev->active_ee);
@@ -813,11 +811,9 @@
* This code is only with protocol C relevant.
*/
#define NUMBER 24
-NOT_IN_26(
if(atomic_read(&mdev->unacked_cnt) >= NUMBER ) {
- run_task_queue(&tq_disk);
+ drbd_kick_lo(mdev);
}
-)
#undef NUMBER
mdev->writ_cnt+=data_size>>9;
@@ -1427,8 +1423,8 @@
STATIC int receive_WriteHint(drbd_dev *mdev, Drbd_Header *h)
{
- NOT_IN_26(run_task_queue(&tq_disk);)
- return TRUE; // cannot fail, only deadlock :)
+ drbd_kick_lo(mdev);
+ return TRUE; // cannot fail.
}
typedef int (*drbd_cmd_handler_f)(drbd_dev*,Drbd_Header*);
===================================================================
RCS file: /var/lib/cvs/drbd/drbd/drbd/drbd_req-2.4.c,v
retrieving revision 1.33.2.44
retrieving revision 1.33.2.45
diff -u -3 -r1.33.2.44 -r1.33.2.45
--- drbd_req-2.4.c 25 Jan 2004 10:18:19 -0000 1.33.2.44
+++ drbd_req-2.4.c 25 Jan 2004 19:03:50 -0000 1.33.2.45
@@ -182,11 +182,20 @@
return 0;
}
-NOT_IN_26(
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
if(!test_and_set_bit(WRITE_HINT_QUEUED,&mdev->flags)) {
queue_task(&mdev->write_hint_tq, &tq_disk); // IO HINT
}
-)
+#else
+ spin_lock_irq(q->queue_lock);
+ if(!blk_queue_plugged(q)) {
+ blk_plug_device(q);
+ del_timer(&q->unplug_timer);
+ // unplugging should not happen automatically...
+ }
+ spin_unlock_irq(q->queue_lock);
+#endif
+
// Fail READA ??
if( rw == WRITE ) {