diff options
-rw-r--r-- | tests/fs-tests/integrity/integck.c | 44 |
1 files changed, 31 insertions, 13 deletions
diff --git a/tests/fs-tests/integrity/integck.c b/tests/fs-tests/integrity/integck.c index 4f39ce3..06e33b5 100644 --- a/tests/fs-tests/integrity/integck.c +++ b/tests/fs-tests/integrity/integck.c @@ -880,17 +880,27 @@ static void get_offset_and_size(struct file_info *file, static void file_truncate_info(struct file_info *file, size_t new_length); +/* + * Truncate a file to length 'new_length'. If there is no enough space to + * peform the operation, this function returns 1. Returns 0 on success and -1 + * on failure. + */ static int file_ftruncate(struct file_info *file, int fd, off_t new_length) { if (ftruncate(fd, new_length) != 0) { - CHECK(errno = ENOSPC); - file->no_space_error = 1; - /* Delete errored files */ - if (!fsinfo.nospc_size_ok) - file_delete(file); - return 0; + if (errno == ENOSPC) { + file->no_space_error = 1; + /* Delete errored files */ + if (!fsinfo.nospc_size_ok) + file_delete(file); + return 1; + } else + pcv("cannot truncate file %s to %llu", + file->name, (unsigned long long)new_length); + return -1; } - return 1; + + return 0; } static void file_mmap_write(struct file_info *file) @@ -994,7 +1004,8 @@ static void file_write(struct file_info *file, int fd) if (truncate) { size_t new_length = offset + actual; - if (file_ftruncate(file, fd, new_length)) + + if (!file_ftruncate(file, fd, new_length)) file_truncate_info(file, new_length); } } @@ -1044,14 +1055,21 @@ static void file_truncate_info(struct file_info *file, size_t new_length) file->length = new_length; } -static void file_truncate(struct file_info *file, int fd) +/* + * Truncate an open file randomly. + */ +static int file_truncate(struct file_info *file, int fd) { - size_t new_length; + int ret; + size_t new_length = random_no(file->length); - new_length = random_no(file->length); - if (file_ftruncate(file, fd, new_length)) + ret = file_ftruncate(file, fd, new_length); + if (ret == -1) + return -1; + if (!ret) file_truncate_info(file, new_length); + return 0; } static void file_truncate_file(struct file_info *file) @@ -1902,7 +1920,7 @@ static int operate_on_open_file(struct fd_info *fdi) unsigned int r = random_no(1000); if (shrink && r < 5) - file_truncate(fdi->file, fdi->fd); + return file_truncate(fdi->file, fdi->fd); else if (r < 21) file_close(fdi); else if (shrink && r < 121 && !fdi->file->deleted) |