iscsi.c (92397116a6789ed4455c6dacea0f378cae096d8d) iscsi.c (d34682cd4a06efe9ee3fc8cb7e8a0ea445299989)
1/*
2 * QEMU Block driver for iSCSI images
3 *
4 * Copyright (c) 2010-2011 Ronnie Sahlberg <ronniesahlberg@gmail.com>
5 * Copyright (c) 2012-2013 Peter Lieven <pl@kamp.de>
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal

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

1260 error_report("iSCSI: failed to unmarshall inquiry datain blob");
1261 ret = -EINVAL;
1262 goto out;
1263 }
1264 memcpy(&iscsilun->bl, inq_bl,
1265 sizeof(struct scsi_inquiry_block_limits));
1266 scsi_free_scsi_task(task);
1267 task = NULL;
1/*
2 * QEMU Block driver for iSCSI images
3 *
4 * Copyright (c) 2010-2011 Ronnie Sahlberg <ronniesahlberg@gmail.com>
5 * Copyright (c) 2012-2013 Peter Lieven <pl@kamp.de>
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal

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

1260 error_report("iSCSI: failed to unmarshall inquiry datain blob");
1261 ret = -EINVAL;
1262 goto out;
1263 }
1264 memcpy(&iscsilun->bl, inq_bl,
1265 sizeof(struct scsi_inquiry_block_limits));
1266 scsi_free_scsi_task(task);
1267 task = NULL;
1268
1269 if (iscsilun->bl.max_unmap < 0xffffffff) {
1270 bs->bl.max_discard = sector_lun2qemu(iscsilun->bl.max_unmap,
1271 iscsilun);
1272 }
1273 bs->bl.discard_alignment = sector_lun2qemu(iscsilun->bl.opt_unmap_gran,
1274 iscsilun);
1275
1276 if (iscsilun->bl.max_ws_len < 0xffffffff) {
1277 bs->bl.max_write_zeroes = sector_lun2qemu(iscsilun->bl.max_ws_len,
1278 iscsilun);
1279 }
1280 bs->bl.write_zeroes_alignment = sector_lun2qemu(iscsilun->bl.opt_unmap_gran,
1281 iscsilun);
1282
1283 bs->bl.opt_transfer_length = sector_lun2qemu(iscsilun->bl.opt_xfer_len,
1284 iscsilun);
1285 }
1286
1287#if defined(LIBISCSI_FEATURE_NOP_COUNTER)
1288 /* Set up a timer for sending out iSCSI NOPs */
1289 iscsilun->nop_timer = timer_new_ms(QEMU_CLOCK_REALTIME, iscsi_nop_timed_event, iscsilun);
1290 timer_mod(iscsilun->nop_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + NOP_INTERVAL);
1291#endif
1292

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

1321 timer_free(iscsilun->nop_timer);
1322 }
1323 qemu_aio_set_fd_handler(iscsi_get_fd(iscsi), NULL, NULL, NULL);
1324 iscsi_destroy_context(iscsi);
1325 g_free(iscsilun->zeroblock);
1326 memset(iscsilun, 0, sizeof(IscsiLun));
1327}
1328
1268 }
1269
1270#if defined(LIBISCSI_FEATURE_NOP_COUNTER)
1271 /* Set up a timer for sending out iSCSI NOPs */
1272 iscsilun->nop_timer = timer_new_ms(QEMU_CLOCK_REALTIME, iscsi_nop_timed_event, iscsilun);
1273 timer_mod(iscsilun->nop_timer, qemu_clock_get_ms(QEMU_CLOCK_REALTIME) + NOP_INTERVAL);
1274#endif
1275

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

1304 timer_free(iscsilun->nop_timer);
1305 }
1306 qemu_aio_set_fd_handler(iscsi_get_fd(iscsi), NULL, NULL, NULL);
1307 iscsi_destroy_context(iscsi);
1308 g_free(iscsilun->zeroblock);
1309 memset(iscsilun, 0, sizeof(IscsiLun));
1310}
1311
1312static int iscsi_refresh_limits(BlockDriverState *bs)
1313{
1314 IscsiLun *iscsilun = bs->opaque;
1315
1316 /* We don't actually refresh here, but just return data queried in
1317 * iscsi_open(): iscsi targets don't change their limits. */
1318 if (iscsilun->lbp.lbpu || iscsilun->lbp.lbpws) {
1319 if (iscsilun->bl.max_unmap < 0xffffffff) {
1320 bs->bl.max_discard = sector_lun2qemu(iscsilun->bl.max_unmap,
1321 iscsilun);
1322 }
1323 bs->bl.discard_alignment = sector_lun2qemu(iscsilun->bl.opt_unmap_gran,
1324 iscsilun);
1325
1326 if (iscsilun->bl.max_ws_len < 0xffffffff) {
1327 bs->bl.max_write_zeroes = sector_lun2qemu(iscsilun->bl.max_ws_len,
1328 iscsilun);
1329 }
1330 bs->bl.write_zeroes_alignment = sector_lun2qemu(iscsilun->bl.opt_unmap_gran,
1331 iscsilun);
1332
1333 bs->bl.opt_transfer_length = sector_lun2qemu(iscsilun->bl.opt_xfer_len,
1334 iscsilun);
1335 }
1336
1337 return 0;
1338}
1339
1329static int iscsi_truncate(BlockDriverState *bs, int64_t offset)
1330{
1331 IscsiLun *iscsilun = bs->opaque;
1332 int ret = 0;
1333
1334 if (iscsilun->type != TYPE_DISK) {
1335 return -ENOTSUP;
1336 }

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

1433 .bdrv_file_open = iscsi_open,
1434 .bdrv_close = iscsi_close,
1435 .bdrv_create = iscsi_create,
1436 .create_options = iscsi_create_options,
1437
1438 .bdrv_getlength = iscsi_getlength,
1439 .bdrv_get_info = iscsi_get_info,
1440 .bdrv_truncate = iscsi_truncate,
1340static int iscsi_truncate(BlockDriverState *bs, int64_t offset)
1341{
1342 IscsiLun *iscsilun = bs->opaque;
1343 int ret = 0;
1344
1345 if (iscsilun->type != TYPE_DISK) {
1346 return -ENOTSUP;
1347 }

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

1444 .bdrv_file_open = iscsi_open,
1445 .bdrv_close = iscsi_close,
1446 .bdrv_create = iscsi_create,
1447 .create_options = iscsi_create_options,
1448
1449 .bdrv_getlength = iscsi_getlength,
1450 .bdrv_get_info = iscsi_get_info,
1451 .bdrv_truncate = iscsi_truncate,
1452 .bdrv_refresh_limits = iscsi_refresh_limits,
1441
1442#if defined(LIBISCSI_FEATURE_IOVECTOR)
1443 .bdrv_co_get_block_status = iscsi_co_get_block_status,
1444#endif
1445 .bdrv_co_discard = iscsi_co_discard,
1446#if defined(SCSI_SENSE_ASCQ_CAPACITY_DATA_HAS_CHANGED)
1447 .bdrv_co_write_zeroes = iscsi_co_write_zeroes,
1448#endif

--- 43 unchanged lines hidden ---
1453
1454#if defined(LIBISCSI_FEATURE_IOVECTOR)
1455 .bdrv_co_get_block_status = iscsi_co_get_block_status,
1456#endif
1457 .bdrv_co_discard = iscsi_co_discard,
1458#if defined(SCSI_SENSE_ASCQ_CAPACITY_DATA_HAS_CHANGED)
1459 .bdrv_co_write_zeroes = iscsi_co_write_zeroes,
1460#endif

--- 43 unchanged lines hidden ---