[ENBD] ENBD on 2.4.x
Peter T. Breuer
ptb@it.uc3m.es
Thu, 15 Mar 2001 13:22:10 +0100 (MET)
"Peter T. Breuer wrote:"
> Hmmm ... you mean don't try making things safer!
>
> > // PTB control merge attempts so we don't overflow our buffers
> > ll_merge_requests_fn =
> > (BLK_DEFAULT_QUEUE(MAJOR_NR))->merge_requests_fn;
> > ll_front_merge_fn =
> > (BLK_DEFAULT_QUEUE(MAJOR_NR))->front_merge_fn;
> > ll_back_merge_fn = (BLK_DEFAULT_QUEUE(MAJOR_NR))->back_merge_fn;
> > (BLK_DEFAULT_QUEUE(MAJOR_NR))->merge_requests_fn =
> > &nbd_merge_requests_fn;
> > (BLK_DEFAULT_QUEUE(MAJOR_NR))->front_merge_fn =
> > &nbd_front_merge_fn;
> > (BLK_DEFAULT_QUEUE(MAJOR_NR))->back_merge_fn =
> > &nbd_back_merge_fn;
>
> You can check, but you'll see that those functions do nothing if
> merge-requests=0 is set. But clearly, if things are in flux there, I
> need to do nothing until I know better. So I agree with this change.
But as a word of protest, you can see that the function I substituted
does nothing except return 0 if merge_requests=0 is set (which is the
default), otherwise call the original, which I saved in ll_blah_blah.
The extra check here is to make sure the request is not getting
too big for our internal buffer.
static int
nbd_front_merge_fn(request_queue_t *q, struct request *req,
struct buffer_head *bh, int max_segments)
{
if (!merge_requests)
return 0;
if (req->nr_sectors + (bh->b_size >> 9) > buf_sectors)
return 0;
return ll_front_merge_fn(q,req,bh,1);
}
static int
nbd_back_merge_fn(request_queue_t *q, struct request *req,
struct buffer_head *bh, int max_segments)
{
if (!merge_requests)
return 0;
if (req->nr_sectors + (bh->b_size >> 9) > buf_sectors)
return 0;
return ll_back_merge_fn(q,req,bh,1);
}
So either "return 0" is now incorrect, or what? Why not try it with
"merge_requests=1" as a module option to see if the kernel's routine
is now the better choice always. The requests should never get too
big for our buffer anyway.
Peter