Skip to content

Commit

Permalink
block: Add .bdrv_truncate() error messages
Browse files Browse the repository at this point in the history
Add missing error messages for the block driver implementations of
.bdrv_truncate(); drop the generic one from block.c's bdrv_truncate().

Since one of these changes touches a mis-indented block in
block/file-posix.c, this patch fixes that coding style issue along the
way.

Signed-off-by: Max Reitz <mreitz@redhat.com>
Message-id: 20170328205129.15138-5-mreitz@redhat.com
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
  • Loading branch information
XanClic committed Apr 28, 2017
1 parent 4bff28b commit f59adb3
Show file tree
Hide file tree
Showing 9 changed files with 34 additions and 10 deletions.
2 changes: 0 additions & 2 deletions block.c
Expand Up @@ -3334,8 +3334,6 @@ int bdrv_truncate(BdrvChild *child, int64_t offset, Error **errp)
bdrv_dirty_bitmap_truncate(bs);
bdrv_parent_cb_resize(bs);
++bs->write_gen;
} else if (errp && !*errp) {
error_setg_errno(errp, -ret, "Failed to resize image");
}
return ret;
}
Expand Down
17 changes: 12 additions & 5 deletions block/file-posix.c
Expand Up @@ -1411,20 +1411,27 @@ static int raw_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
{
BDRVRawState *s = bs->opaque;
struct stat st;
int ret;

if (fstat(s->fd, &st)) {
return -errno;
ret = -errno;
error_setg_errno(errp, -ret, "Failed to fstat() the file");
return ret;
}

if (S_ISREG(st.st_mode)) {
if (ftruncate(s->fd, offset) < 0) {
return -errno;
ret = -errno;
error_setg_errno(errp, -ret, "Failed to resize the file");
return ret;
}
} else if (S_ISCHR(st.st_mode) || S_ISBLK(st.st_mode)) {
if (offset > raw_getlength(bs)) {
return -EINVAL;
}
if (offset > raw_getlength(bs)) {
error_setg(errp, "Cannot grow device files");
return -EINVAL;
}
} else {
error_setg(errp, "Resizing this file is not supported");
return -ENOTSUP;
}

Expand Down
4 changes: 3 additions & 1 deletion block/gluster.c
Expand Up @@ -1100,7 +1100,9 @@ static int qemu_gluster_truncate(BlockDriverState *bs, int64_t offset,

ret = glfs_ftruncate(s->fd, offset);
if (ret < 0) {
return -errno;
ret = -errno;
error_setg_errno(errp, -ret, "Failed to truncate file");
return ret;
}

return 0;
Expand Down
2 changes: 2 additions & 0 deletions block/iscsi.c
Expand Up @@ -2065,6 +2065,7 @@ static int iscsi_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
Error *local_err = NULL;

if (iscsilun->type != TYPE_DISK) {
error_setg(errp, "Cannot resize non-disk iSCSI devices");
return -ENOTSUP;
}

Expand All @@ -2075,6 +2076,7 @@ static int iscsi_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
}

if (offset > iscsi_getlength(bs)) {
error_setg(errp, "Cannot grow iSCSI devices");
return -EINVAL;
}

Expand Down
10 changes: 9 additions & 1 deletion block/nfs.c
Expand Up @@ -767,7 +767,15 @@ static int64_t nfs_get_allocated_file_size(BlockDriverState *bs)
static int nfs_file_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
{
NFSClient *client = bs->opaque;
return nfs_ftruncate(client->context, client->fh, offset);
int ret;

ret = nfs_ftruncate(client->context, client->fh, offset);
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed to truncate file");
return ret;
}

return 0;
}

/* Note that this will not re-establish a connection with the NFS server
Expand Down
2 changes: 2 additions & 0 deletions block/qcow2.c
Expand Up @@ -2551,6 +2551,7 @@ static int qcow2_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
new_l1_size = size_to_l1(s, offset);
ret = qcow2_grow_l1_table(bs, new_l1_size, true);
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed to grow the L1 table");
return ret;
}

Expand All @@ -2559,6 +2560,7 @@ static int qcow2_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
ret = bdrv_pwrite_sync(bs->file, offsetof(QCowHeader, size),
&offset, sizeof(uint64_t));
if (ret < 0) {
error_setg_errno(errp, -ret, "Failed to update the image size");
return ret;
}

Expand Down
4 changes: 3 additions & 1 deletion block/qed.c
Expand Up @@ -1526,11 +1526,12 @@ static int bdrv_qed_truncate(BlockDriverState *bs, int64_t offset, Error **errp)

if (!qed_is_image_size_valid(offset, s->header.cluster_size,
s->header.table_size)) {
error_setg(errp, "Invalid image size specified");
return -EINVAL;
}

/* Shrinking is currently not supported */
if ((uint64_t)offset < s->header.image_size) {
error_setg(errp, "Shrinking images is currently not supported");
return -ENOTSUP;
}

Expand All @@ -1539,6 +1540,7 @@ static int bdrv_qed_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
ret = qed_write_header_sync(s);
if (ret < 0) {
s->header.image_size = old_image_size;
error_setg_errno(errp, -ret, "Failed to update the image size");
}
return ret;
}
Expand Down
2 changes: 2 additions & 0 deletions block/raw-format.c
Expand Up @@ -332,10 +332,12 @@ static int raw_truncate(BlockDriverState *bs, int64_t offset, Error **errp)
BDRVRawState *s = bs->opaque;

if (s->has_size) {
error_setg(errp, "Cannot resize fixed-size raw disks");
return -ENOTSUP;
}

if (INT64_MAX - offset < s->offset) {
error_setg(errp, "Disk size too large for the chosen offset");
return -EINVAL;
}

Expand Down
1 change: 1 addition & 0 deletions block/rbd.c
Expand Up @@ -923,6 +923,7 @@ static int qemu_rbd_truncate(BlockDriverState *bs, int64_t offset, Error **errp)

r = rbd_resize(s->image, offset);
if (r < 0) {
error_setg_errno(errp, -r, "Failed to resize file");
return r;
}

Expand Down

0 comments on commit f59adb3

Please sign in to comment.