drbd: fix NULL pointer dereference on 4k hard sect size
we still don't support 4k 'physical' sectors 'natively', but use a read-modify-write workaround. And we even tried to use the extra page before we allocated it :( Signed-off-by: Philipp Reisner <philipp.reisner@linbit.com> Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
This commit is contained in:
Родитель
cf14c2e987
Коммит
4aa83b7bf1
|
@ -941,6 +941,25 @@ static int drbd_nl_disk_conf(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nlp
|
|||
|
||||
drbd_md_set_sector_offsets(mdev, nbc);
|
||||
|
||||
/* allocate a second IO page if logical_block_size != 512 */
|
||||
logical_block_size = bdev_logical_block_size(nbc->md_bdev);
|
||||
if (logical_block_size == 0)
|
||||
logical_block_size = MD_SECTOR_SIZE;
|
||||
|
||||
if (logical_block_size != MD_SECTOR_SIZE) {
|
||||
if (!mdev->md_io_tmpp) {
|
||||
struct page *page = alloc_page(GFP_NOIO);
|
||||
if (!page)
|
||||
goto force_diskless_dec;
|
||||
|
||||
dev_warn(DEV, "Meta data's bdev logical_block_size = %d != %d\n",
|
||||
logical_block_size, MD_SECTOR_SIZE);
|
||||
dev_warn(DEV, "Workaround engaged (has performance impact).\n");
|
||||
|
||||
mdev->md_io_tmpp = page;
|
||||
}
|
||||
}
|
||||
|
||||
if (!mdev->bitmap) {
|
||||
if (drbd_bm_init(mdev)) {
|
||||
retcode = ERR_NOMEM;
|
||||
|
@ -980,25 +999,6 @@ static int drbd_nl_disk_conf(struct drbd_conf *mdev, struct drbd_nl_cfg_req *nlp
|
|||
goto force_diskless_dec;
|
||||
}
|
||||
|
||||
/* allocate a second IO page if logical_block_size != 512 */
|
||||
logical_block_size = bdev_logical_block_size(nbc->md_bdev);
|
||||
if (logical_block_size == 0)
|
||||
logical_block_size = MD_SECTOR_SIZE;
|
||||
|
||||
if (logical_block_size != MD_SECTOR_SIZE) {
|
||||
if (!mdev->md_io_tmpp) {
|
||||
struct page *page = alloc_page(GFP_NOIO);
|
||||
if (!page)
|
||||
goto force_diskless_dec;
|
||||
|
||||
dev_warn(DEV, "Meta data's bdev logical_block_size = %d != %d\n",
|
||||
logical_block_size, MD_SECTOR_SIZE);
|
||||
dev_warn(DEV, "Workaround engaged (has performance impact).\n");
|
||||
|
||||
mdev->md_io_tmpp = page;
|
||||
}
|
||||
}
|
||||
|
||||
/* Reset the "barriers don't work" bits here, then force meta data to
|
||||
* be written, to ensure we determine if barriers are supported. */
|
||||
if (nbc->dc.no_md_flush)
|
||||
|
|
Загрузка…
Ссылка в новой задаче