resize2fs: treat EINVAL to mean the new resize ioctl does not exist

Linux's compat_sys_ioctl() function, which is run when executing a
ioctl using a 32-bit binary on a 64-bit kernel, returns EINVAL when an
inode does not exist.  Sigh.  See /usr/src/linux/fs/compat_ioctl.c.
This is probably a kernel bug, but work around it for now.

Addresses-Debian-Bug: #644989

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
bitmap-optimize
Theodore Ts'o 2011-11-20 16:13:06 -05:00
parent 13dcce8bb4
commit 3f6fbf95c0
1 changed files with 10 additions and 1 deletions

View File

@ -76,8 +76,17 @@ errcode_t online_resize_fs(ext2_filsys fs, const char *mtpt,
* If kernel does not support EXT4_IOC_RESIZE_FS, use the
* old online resize. Note that the old approach does not
* handle >32 bit file systems
*
* Sigh, if we are running a 32-bit binary on a 64-bit
* kernel (which happens all the time on the MIPS
* architecture in Debian, but can happen on other CPU
* architectures as well) we will get EINVAL returned
* when an ioctl doesn't exist, at least up to Linux
* 3.1. See compat_sys_ioctl() in fs/compat_ioctl.c
* in the kernel sources. This is probably a kernel
* bug, but work around it here.
*/
if (errno != ENOTTY) {
if ((errno != ENOTTY) && (errno != EINVAL)) {
if (errno == EPERM)
com_err(program_name, 0,
_("Permission denied to resize filesystem"));