crypto.c (e6af90f3fb7b87f18f46f6588fbf3e781d6f4ef6) crypto.c (061ca8a368165fae300748c17971824a089f521f)
1/*
2 * QEMU block full disk encryption
3 *
4 * Copyright (c) 2015-2016 Red Hat, Inc.
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either

--- 343 unchanged lines hidden (view full) ---

352
353 ret = 0;
354 cleanup:
355 qcrypto_block_free(crypto);
356 blk_unref(blk);
357 return ret;
358}
359
1/*
2 * QEMU block full disk encryption
3 *
4 * Copyright (c) 2015-2016 Red Hat, Inc.
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either

--- 343 unchanged lines hidden (view full) ---

352
353 ret = 0;
354 cleanup:
355 qcrypto_block_free(crypto);
356 blk_unref(blk);
357 return ret;
358}
359
360static int block_crypto_truncate(BlockDriverState *bs, int64_t offset,
361 PreallocMode prealloc, Error **errp)
360static int coroutine_fn
361block_crypto_co_truncate(BlockDriverState *bs, int64_t offset,
362 PreallocMode prealloc, Error **errp)
362{
363 BlockCrypto *crypto = bs->opaque;
364 uint64_t payload_offset =
365 qcrypto_block_get_payload_offset(crypto->block);
366
367 if (payload_offset > INT64_MAX - offset) {
368 error_setg(errp, "The requested file size is too large");
369 return -EFBIG;
370 }
371
372 offset += payload_offset;
373
363{
364 BlockCrypto *crypto = bs->opaque;
365 uint64_t payload_offset =
366 qcrypto_block_get_payload_offset(crypto->block);
367
368 if (payload_offset > INT64_MAX - offset) {
369 error_setg(errp, "The requested file size is too large");
370 return -EFBIG;
371 }
372
373 offset += payload_offset;
374
374 return bdrv_truncate(bs->file, offset, prealloc, errp);
375 return bdrv_co_truncate(bs->file, offset, prealloc, errp);
375}
376
377static void block_crypto_close(BlockDriverState *bs)
378{
379 BlockCrypto *crypto = bs->opaque;
380 qcrypto_block_free(crypto->block);
381}
382

--- 312 unchanged lines hidden (view full) ---

695 .format_name = "luks",
696 .instance_size = sizeof(BlockCrypto),
697 .bdrv_probe = block_crypto_probe_luks,
698 .bdrv_open = block_crypto_open_luks,
699 .bdrv_close = block_crypto_close,
700 .bdrv_child_perm = bdrv_format_default_perms,
701 .bdrv_co_create = block_crypto_co_create_luks,
702 .bdrv_co_create_opts = block_crypto_co_create_opts_luks,
376}
377
378static void block_crypto_close(BlockDriverState *bs)
379{
380 BlockCrypto *crypto = bs->opaque;
381 qcrypto_block_free(crypto->block);
382}
383

--- 312 unchanged lines hidden (view full) ---

696 .format_name = "luks",
697 .instance_size = sizeof(BlockCrypto),
698 .bdrv_probe = block_crypto_probe_luks,
699 .bdrv_open = block_crypto_open_luks,
700 .bdrv_close = block_crypto_close,
701 .bdrv_child_perm = bdrv_format_default_perms,
702 .bdrv_co_create = block_crypto_co_create_luks,
703 .bdrv_co_create_opts = block_crypto_co_create_opts_luks,
703 .bdrv_truncate = block_crypto_truncate,
704 .bdrv_co_truncate = block_crypto_co_truncate,
704 .create_opts = &block_crypto_create_opts_luks,
705
706 .bdrv_reopen_prepare = block_crypto_reopen_prepare,
707 .bdrv_refresh_limits = block_crypto_refresh_limits,
708 .bdrv_co_preadv = block_crypto_co_preadv,
709 .bdrv_co_pwritev = block_crypto_co_pwritev,
710 .bdrv_getlength = block_crypto_getlength,
711 .bdrv_get_info = block_crypto_get_info_luks,
712 .bdrv_get_specific_info = block_crypto_get_specific_info_luks,
713};
714
715static void block_crypto_init(void)
716{
717 bdrv_register(&bdrv_crypto_luks);
718}
719
720block_init(block_crypto_init);
705 .create_opts = &block_crypto_create_opts_luks,
706
707 .bdrv_reopen_prepare = block_crypto_reopen_prepare,
708 .bdrv_refresh_limits = block_crypto_refresh_limits,
709 .bdrv_co_preadv = block_crypto_co_preadv,
710 .bdrv_co_pwritev = block_crypto_co_pwritev,
711 .bdrv_getlength = block_crypto_getlength,
712 .bdrv_get_info = block_crypto_get_info_luks,
713 .bdrv_get_specific_info = block_crypto_get_specific_info_luks,
714};
715
716static void block_crypto_init(void)
717{
718 bdrv_register(&bdrv_crypto_luks);
719}
720
721block_init(block_crypto_init);