[Drbd-dev] DRBD-8 - next crash in bio_split()
Lars Ellenberg
Lars.Ellenberg at linbit.com
Wed Sep 13 22:01:05 CEST 2006
/ 2006-09-13 14:15:19 -0400
\ Graham, Simon:
> Yesterday's checkins have allowed me to get past the booting stage and
> I've made some good progress - however, I've started to notice system
> crashes when I failover use of one of the drbd devices from one node to
> the other - always inside bio_split() at an assert that there is a
> single bio_vec in the array (bio->bi_vcnt==1).
>
> I see that there has been some discussion of this previously
> (http://lists.linbit.com/pipermail/drbd-dev/2005-March/000272.html) so
> we are all aware that bio_split can only handle a bio with a single
> bio_vec -- part of the mega-reorg of request processing was this change:
>
> #if 1
> /* to make some things easier, force allignment of requests
> within the
> * granularity of our hash tables */
> s_enr = bio->bi_sector >> HT_SHIFT;
> e_enr = (bio->bi_sector+(bio->bi_size>>9)-1) >> HT_SHIFT;
> #else
> /* when not using two primaries (and not being as paranoid as
> lge),
> * actually there is no need to be as strict.
> * only force allignment within AL_EXTENT boundaries */
> s_enr = bio->bi_sector >> (AL_EXTENT_SIZE_B-9);
> e_enr = (bio->bi_sector+(bio->bi_size>>9)-1) >>
> (AL_EXTENT_SIZE_B-9);
> #endif
>
> Since HT_SHIFT is 9 and AL_EXTENT_SIZE_B-9 is 13, this means we are far
> more likely to decide to split now and maybe it is happening where the
> bi_io_vec array has more than one entry...
would that do the trick?
both sections should probably be run-time conditional on
"two_primaries", but they have to be consistent, at least...
Index: drbd_req.c
===================================================================
--- drbd_req.c (revision 2415)
+++ drbd_req.c (working copy)
@@ -1068,7 +1068,11 @@
unsigned int bio_size = bio->bi_size;
int max;
+#if 1
+ max = DRBD_MAX_SEGMENT_SIZE - ((bio_offset & (DRBD_MAX_SEGMENT_SIZE-1)) + bio_size);
+#else
max = AL_EXTENT_SIZE - ((bio_offset & (AL_EXTENT_SIZE-1)) + bio_size);
+#endif
if (max < 0) max = 0;
if (max <= bvec->bv_len && bio_size == 0)
return bvec->bv_len;
--
: Lars Ellenberg Tel +43-1-8178292-55 :
: LINBIT Information Technologies GmbH Fax +43-1-8178292-82 :
: Schoenbrunner Str. 244, A-1120 Vienna/Europe http://www.linbit.com :
More information about the drbd-dev
mailing list