Received: from eggs.gnu.org ([2001:4830:134:3::10]:54312) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UsC0h-0004cp-B3 for qemu-devel@nongnu.org; Thu, 27 Jun 2013 09:13:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UsC0e-00046q-Lk for qemu-devel@nongnu.org; Thu, 27 Jun 2013 09:13:15 -0400 Received: from mx.ipv6.kamp.de ([2a02:248:0:51::16]:55429 helo=mx01.kamp.de) by eggs.gnu.org with smtp (Exim 4.71) (envelope-from ) id 1UsC0e-00046g-Ct for qemu-devel@nongnu.org; Thu, 27 Jun 2013 09:13:12 -0400 From: Peter Lieven Date: Thu, 27 Jun 2013 15:11:35 +0200 Message-Id: <1372338695-411-12-git-send-email-pl@kamp.de> In-Reply-To: <1372338695-411-1-git-send-email-pl@kamp.de> References: <1372338695-411-1-git-send-email-pl@kamp.de> Subject: [Qemu-devel] [PATCHv2 11/11] iscsi: assert that sectors are aligned to LUN blocksize List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kwolf@redhat.com, pbonzini@redhat.com, Peter Lieven , ronniesahlberg@gmail.com, stefanha@redhat.com if the blocksize of an iSCSI LUN is bigger than the BDRV_SECTOR_SIZE it is possible that sector_num or nb_sectors are not correctly alligned. to avoid corruption we fail requests which are misaligned. Signed-off-by: Peter Lieven --- block/iscsi.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/block/iscsi.c b/block/iscsi.c index 0567b46..bff2e1f 100644 --- a/block/iscsi.c +++ b/block/iscsi.c @@ -298,6 +298,13 @@ static int64_t sector_lun2qemu(int64_t sector, IscsiLun *iscsilun) return sector * iscsilun->block_size / BDRV_SECTOR_SIZE; } +static int64_t is_request_lun_aligned(int64_t sector_num, int nb_sectors, + IscsiLun *iscsilun) +{ + return ((sector_num * BDRV_SECTOR_SIZE) % iscsilun->block_size || + (nb_sectors * BDRV_SECTOR_SIZE) % iscsilun->block_size) ? 0 : 1; +} + static int iscsi_aio_writev_acb(IscsiAIOCB *acb) { @@ -382,6 +389,10 @@ iscsi_aio_writev(BlockDriverState *bs, int64_t sector_num, IscsiLun *iscsilun = bs->opaque; IscsiAIOCB *acb; + if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) { + return NULL; + } + acb = qemu_aio_get(&iscsi_aiocb_info, bs, cb, opaque); trace_iscsi_aio_writev(iscsilun->iscsi, sector_num, nb_sectors, opaque, acb); @@ -524,6 +535,10 @@ iscsi_aio_readv(BlockDriverState *bs, int64_t sector_num, IscsiLun *iscsilun = bs->opaque; IscsiAIOCB *acb; + if (!is_request_lun_aligned(sector_num, 0, iscsilun)) { + return NULL; + } + acb = qemu_aio_get(&iscsi_aiocb_info, bs, cb, opaque); trace_iscsi_aio_readv(iscsilun->iscsi, sector_num, nb_sectors, opaque, acb); @@ -687,6 +702,10 @@ iscsi_aio_discard(BlockDriverState *bs, IscsiLun *iscsilun = bs->opaque; IscsiAIOCB *acb; + if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) { + return NULL; + } + acb = qemu_aio_get(&iscsi_aiocb_info, bs, cb, opaque); acb->iscsilun = iscsilun; @@ -878,6 +897,10 @@ static int coroutine_fn iscsi_co_is_allocated(BlockDriverState *bs, struct IscsiTask iTask; int ret; + if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) { + goto fail; + } + /* LUN does not support logical block provisioning */ if (iscsilun->lbpme == 0) { *pnum = nb_sectors; @@ -949,6 +972,10 @@ coroutine_fn iscsi_co_write_zeroes(BlockDriverState *bs, int64_t sector_num, struct IscsiTask iTask; struct unmap_list list[1]; + if (!is_request_lun_aligned(sector_num, nb_sectors, iscsilun)) { + return -EIO; + } + if (!iscsilun->lbprz || !iscsilun->lbpu || !(bs->open_flags & BDRV_O_UNMAP) || sector_qemu2lun(nb_sectors, iscsilun) > iscsilun->max_unmap) { /* fall back to writev */ -- 1.7.9.5