diff options
Diffstat (limited to 'drivers/block/drbd/drbd_receiver.c')
-rw-r--r-- | drivers/block/drbd/drbd_receiver.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index c3504ddd59c1..3a36bc814e77 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c | |||
@@ -1262,6 +1262,7 @@ static int receive_Barrier(struct drbd_conf *mdev, struct p_header *h) | |||
1262 | static struct drbd_epoch_entry * | 1262 | static struct drbd_epoch_entry * |
1263 | read_in_block(struct drbd_conf *mdev, u64 id, sector_t sector, int data_size) __must_hold(local) | 1263 | read_in_block(struct drbd_conf *mdev, u64 id, sector_t sector, int data_size) __must_hold(local) |
1264 | { | 1264 | { |
1265 | const sector_t capacity = drbd_get_capacity(mdev->this_bdev); | ||
1265 | struct drbd_epoch_entry *e; | 1266 | struct drbd_epoch_entry *e; |
1266 | struct bio_vec *bvec; | 1267 | struct bio_vec *bvec; |
1267 | struct page *page; | 1268 | struct page *page; |
@@ -1287,6 +1288,15 @@ read_in_block(struct drbd_conf *mdev, u64 id, sector_t sector, int data_size) __ | |||
1287 | ERR_IF(data_size & 0x1ff) return NULL; | 1288 | ERR_IF(data_size & 0x1ff) return NULL; |
1288 | ERR_IF(data_size > DRBD_MAX_SEGMENT_SIZE) return NULL; | 1289 | ERR_IF(data_size > DRBD_MAX_SEGMENT_SIZE) return NULL; |
1289 | 1290 | ||
1291 | /* even though we trust out peer, | ||
1292 | * we sometimes have to double check. */ | ||
1293 | if (sector + (data_size>>9) > capacity) { | ||
1294 | dev_err(DEV, "capacity: %llus < sector: %llus + size: %u\n", | ||
1295 | (unsigned long long)capacity, | ||
1296 | (unsigned long long)sector, data_size); | ||
1297 | return NULL; | ||
1298 | } | ||
1299 | |||
1290 | /* GFP_NOIO, because we must not cause arbitrary write-out: in a DRBD | 1300 | /* GFP_NOIO, because we must not cause arbitrary write-out: in a DRBD |
1291 | * "criss-cross" setup, that might cause write-out on some other DRBD, | 1301 | * "criss-cross" setup, that might cause write-out on some other DRBD, |
1292 | * which in turn might block on the other node at this very place. */ | 1302 | * which in turn might block on the other node at this very place. */ |