libziparchive: fix fallocate failures

The objective of fallocate call seems to be to
make sure that we have enough enough space left
in the disk to house the uncompressed file.
But, fallocate is only supported in the following
file systems:
btrfs, ext4, ocfs2, and xfs

Return error only when fallocate fails due to
lack of space. The immediate ftruncate call is
going to take of the majority of other errors.

Bug: http://b/21558406
Bug: 21561449
Change-Id: I7083f3c7e5d745bd6e8a190ac9020297d638d9d4
(cherry picked from commit a68d0d1fe4)
This commit is contained in:
Badhri Jagan Sridharan 2015-06-02 14:47:57 -07:00 committed by Elliott Hughes
parent 67ab5d9505
commit 71aebefe49
1 changed files with 6 additions and 1 deletions

View File

@ -1008,8 +1008,13 @@ class FileWriter : public Writer {
// entry. Note that the call to ftruncate below will change the file size but
// will not allocate space on disk and this call to fallocate will not
// change the file size.
// Note: fallocate is only supported by the following filesystems -
// btrfs, ext4, ocfs2, and xfs. Therefore fallocate might fail with
// EOPNOTSUPP error when issued in other filesystems.
// Hence, check for the return error code before concluding that the
// disk does not have enough space.
result = TEMP_FAILURE_RETRY(fallocate(fd, 0, current_offset, declared_length));
if (result == -1) {
if (result == -1 && errno == ENOSPC) {
ALOGW("Zip: unable to allocate space for file to %" PRId64 ": %s",
static_cast<int64_t>(declared_length + current_offset), strerror(errno));
return std::unique_ptr<FileWriter>(nullptr);