[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--