[ENBD] 2.5.46 update

Tad Kollar enbd@lists.community.tummy.com
Fri, 08 Nov 2002 11:28:27 -0500


This is a multi-part message in MIME format.
--------------070305050501080702020806
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit

Hi Peter,

I'm pretty sure you're right that md (not enbd) was causing my problems under 
2.5.44. Unfortunately, that means I have to try to keep up to the latest 
kernel to get updates. So, I ported the 2.5.44 version of enbd to 2.5.46 as 
best I could... the module loads, the client talks to the server, the main 
loop starts, sizes are correct, but at the partition check the machine hangs - 
no oops, nothing. Instead of the usual:

nda: unknown partition table

I get:

nda:

And nothing else. I've attached my patch, if you wouldn't mind looking at it. 
I tried to mimic changes in other drivers going from 2.5.44 to 2.5.45, where 
blk_dev[] goes away.

Thanks,
Tad

--------------070305050501080702020806
Content-Type: text/plain;
 name="enbd-2.5.46.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="enbd-2.5.46.diff"

--- /usr/src/enbd/linux/drivers/block/enbd.c	2002-11-03 20:08:08.000000000 -0500
+++ linux/drivers/block/enbd.c	2002-11-08 09:23:15.000000000 -0500
@@ -367,7 +367,7 @@
   MODULE_PARM (md5_off_threshold, "i");
 #endif
 
-  static struct request_queue * nbd_queue;
+static struct request_queue nbd_queue;
 
 #define NO_BUFFERED_WRITES 1
 
@@ -398,7 +398,7 @@
         if (req->flags & REQ_SPECIAL) // PTB contains no data
                 return 0;
 
-	minor = minor (req->rq_dev);
+	minor = req->rq_disk->first_minor;
 	nbd = minor >> NBD_SHIFT;
 	lo = &nbd_dev[nbd];
 
@@ -1843,13 +1843,14 @@
 
 	int count = 0;
 	unsigned long flags;
-        request_queue_t *q = nbd_queue;
+        request_queue_t *q = &nbd_queue;
 
 	spin_lock_irqsave (q->queue_lock, flags);
 
 	while (! blk_queue_empty(q) && count++ < 1000) {
 		struct request *req;
-		req = CURRENT;
+		req = elv_next_request(q);
+
 		if (!req) {	// PTB impossible
 			spin_unlock_irqrestore (q->queue_lock, flags);
 			NBD_ALERT
@@ -2067,7 +2068,7 @@
 {
 
 	struct buffer_head *bh;
-	int dev = minor (req->rq_dev);
+	int dev = req->rq_dev->first_minor;
 	int nbd = dev >> NBD_SHIFT;
 	int err = 0;
 
@@ -2111,7 +2112,7 @@
 	}
 
         // PTB which device really doesn't matter. We do the checking.
-        set_device_ro (mk_kdev (major, lo->nbd << NBD_SHIFT), ro);
+        set_disk_ro (lo->disk, ro);
 }
 
 /*
@@ -2129,9 +2130,9 @@
 
 		struct nbd_device *lo;
 
-		req = CURRENT;
+		req = elv_next_request(q);
 
-		dev = minor (req->rq_dev);
+		dev = req->rq_disk->first_minor;
 		nbd = dev >> NBD_SHIFT;
 
 		if (nbd >= MAX_NBD || nbd < 0) {
@@ -2167,7 +2168,7 @@
 		if (req->sector < 0) {
 			NBD_FAIL ("underrange request");
 		}
- 		if (major(req->rq_dev) != major) {
+ 		if (req->rq_disk->major != major) {
  			NBD_FAIL ("request for wrong major");
  		}
 		req->errors = 0;
@@ -2180,7 +2181,7 @@
                         NBD_INFO("special req %#x  type %ld for dev %d:%d %ld sectors %Lu-%Lu\n",
                                 (unsigned)req,
                                 rq_data_dir(req),
-                                major(req->rq_dev), dev,
+                                req->rq_disk->major, dev,
                                 req->nr_sectors,
                                 (unsigned long long)req->sector,
                                 (unsigned long long)req->sector
@@ -2959,7 +2960,7 @@
 	timeout = lo->req_timeo * HZ;
 	start_time = jiffies;
 
-        while (!(req = blk_get_request(nbd_queue,WRITE,0))) {
+        while (!(req = blk_get_request(&nbd_queue,WRITE,0))) {
 		if (jiffies >= start_time + timeout) {
 			// PTB it takes too long
 			NBD_ALERT
@@ -3000,7 +3001,7 @@
 
 	// PTB point the request buffer vaguely in the direction of where
 	// the data is, but it doesn't matter.
-	req->rq_dev = mk_kdev (major, minor);
+	req->rq_disk = lo->disk;
 
 	// PTB we queue the request for treatment and wait till treated
         init_completion(&x);
@@ -3681,7 +3682,7 @@
 		disk->first_minor  = first_minor;
 		disk->fops         = &nbd_blkops;
 		disk->private_data = lo;
-		disk->queue        = nbd_queue;
+		disk->queue        = &nbd_queue;
 		sprintf (disk->disk_name, "nd%s", lo->devnam);
                 // have to set minors (or capacity) to 1 (0) to avoid check disk
                 set_capacity (disk, 0);
@@ -4798,7 +4799,7 @@
 nbd_merge_requests_fn (request_queue_t * q, struct request *req,
 		       struct request *req2)
 {
-	int dev = minor (req->rq_dev);
+	int dev = req->rq_disk->first_minor;
 	int nbd = dev >> NBD_SHIFT;
 	struct nbd_device *lo = &nbd_dev[nbd];
 
@@ -4820,7 +4821,7 @@
 static int
 nbd_front_merge_fn (request_queue_t * q, struct request *req, struct bio * bio)
 {
-	int dev = minor (req->rq_dev);
+	int dev = req->rq_disk->first_minor;
 	int nbd = dev >> NBD_SHIFT;
 	struct nbd_device *lo = &nbd_dev[nbd];
 
@@ -4842,7 +4843,7 @@
 nbd_back_merge_fn (request_queue_t * q, struct request *req,
 		   struct bio * bio)
 {
-	int dev = minor (req->rq_dev);
+	int dev = req->rq_disk->first_minor;
 	int nbd = dev >> NBD_SHIFT;
 	struct nbd_device *lo = &nbd_dev[nbd];
 
@@ -4910,8 +4911,6 @@
 	NBD_INFO ("Enhanced Network Block Device " NBD_VERSION " by "
 		  "ptb@it.uc3m.es\n");
 
-        nbd_queue = BLK_DEFAULT_QUEUE(major);
-
         for (i = 0; i < MAX_NBD; i++) {
 	        struct nbd_device *lo = &nbd_dev[i];
                 struct gendisk *disk = alloc_disk(NBD_MAXCONN);
@@ -4931,9 +4930,9 @@
 
 
 // PTB - set up kernel queue struct with default methods
-	blk_init_queue (nbd_queue, do_nbd_request, &nbd_lock);
+	blk_init_queue (&nbd_queue, do_nbd_request, &nbd_lock);
 
-        nbd_queue->max_sectors = buf_sectors;	/* max per request */
+        nbd_queue.max_sectors = buf_sectors;	/* max per request */
 
 // PTB - I think that put:
 //     - q->plug_device_fn    = generic_plug_device    (static ll_rw_blk)
@@ -4946,15 +4945,15 @@
 // PTB - we have to do some more init magic in 2.4.*. This says that we
 //     - take all stuff off the kernel queue before processing it, so in
 //     - particular it's OK for kernel to do merges with the queue head.
-	blk_queue_headactive (nbd_queue, 0);
+	blk_queue_headactive (&nbd_queue, 0);
 
 // LA - moved the next #if higher;
 //    - kernel 2.2.* doesn't know about plug_device_fn
 
 	// PTB control merge attempts so we don't overflow our buffer
-	ll_merge_requests_fn = nbd_queue->merge_requests_fn;
-	ll_front_merge_fn    = nbd_queue->front_merge_fn;
-	ll_back_merge_fn     = nbd_queue->back_merge_fn;
+	ll_merge_requests_fn = nbd_queue.merge_requests_fn;
+	ll_front_merge_fn    = nbd_queue.front_merge_fn;
+	ll_back_merge_fn     = nbd_queue.back_merge_fn;
 
 // JSA - Add this line because under >=2.4.1, merge optimizations are in flux
 // PTB - however it's not this which does damage, I believe. Data: plugging
@@ -4967,9 +4966,9 @@
 // PTB - The functions below just impose our own stricter size limit before
 //     - calling the defaults if all seems OK sizewise.
 
-	nbd_queue->merge_requests_fn = &nbd_merge_requests_fn;
-	nbd_queue->front_merge_fn    = &nbd_front_merge_fn;
-	nbd_queue->back_merge_fn     = &nbd_back_merge_fn;
+	nbd_queue.merge_requests_fn = &nbd_merge_requests_fn;
+	nbd_queue.front_merge_fn    = &nbd_front_merge_fn;
+	nbd_queue.back_merge_fn     = &nbd_back_merge_fn;
 
         for (i = 0; i < MAX_NBD; i++) {
 	        struct nbd_device *lo = &nbd_dev[i];
@@ -5124,7 +5123,7 @@
 		del_timer (&lo->run_queue);
 	}
 
-	blk_cleanup_queue (nbd_queue);
+	blk_cleanup_queue (&nbd_queue);
 
 	if (unregister_blkdev (major, "nbd") != 0) {
 		NBD_ALERT ("cleanup_module failed\n");
--- /usr/src/enbd/linux/include/linux/enbd.h	2002-11-03 20:08:08.000000000 -0500
+++ linux/include/linux/enbd.h	2002-11-08 09:27:22.000000000 -0500
@@ -372,7 +372,7 @@
   static void end_request(struct request *req, int uptodate) {  
 
      struct bio *bio;
-     int dev = minor (req->rq_dev);
+     int dev = req->rq_disk->first_minor;
      int nbd = dev >> NBD_SHIFT;
      struct nbd_device *lo = &nbd_dev[nbd];
      static int rq_type(struct request *);
@@ -460,5 +460,3 @@
   #endif /* MAJOR_NR */
 
 #endif /* LINUX_ENBD_H */
-
-

--------------070305050501080702020806--