From: Michihiro NAKAJIMA Date: Thu, 4 Feb 2010 05:00:21 +0000 (-0500) Subject: Fix test failure on linux version of which is older than 2.6.28. X-Git-Tag: v3.0.0a~1287 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d742ba1b76a1251f15c01a77805afaa758a91ca9;p=thirdparty%2Flibarchive.git Fix test failure on linux version of which is older than 2.6.28. SVN-Revision: 1866 --- diff --git a/libarchive/archive_read_disk_entry_from_file.c b/libarchive/archive_read_disk_entry_from_file.c index c48be83be..1fd57be55 100644 --- a/libarchive/archive_read_disk_entry_from_file.c +++ b/libarchive/archive_read_disk_entry_from_file.c @@ -602,6 +602,7 @@ setup_sparse(struct archive_read_disk *a, int64_t size; int count, do_fiemap; int initial_fd = fd; + int exit_sts = ARCHIVE_OK; if (fd < 0) { const char *path; @@ -630,10 +631,15 @@ setup_sparse(struct archive_read_disk *a, r = ioctl(fd, FS_IOC_FIEMAP, fm); if (r < 0) { - archive_set_error(&a->archive, errno, "FIEMAP failed"); - if (initial_fd != fd) - close(fd); - return (ARCHIVE_FAILED); + /* When errno is EINVAL, it is better we should + * return ARCHIVE_OK because an earlier version + *(<2.6.28) cannot perfom FS_IOC_FIEMAP */ + if (errno != EINVAL) { + archive_set_error(&a->archive, errno, + "FIEMAP failed"); + exit_sts = ARCHIVE_FAILED; + } + goto exit_setup_sparse; } if (fm->fm_mapped_extents == 0) break; @@ -658,6 +664,7 @@ setup_sparse(struct archive_read_disk *a, } else break; } +exit_setup_sparse: if (initial_fd != fd) close(fd); return (ARCHIVE_OK);