Whamcloud - gitweb
resize2fs: treat EINVAL to mean the new resize ioctl does not exist
authorTheodore Ts'o <tytso@mit.edu>
Sun, 20 Nov 2011 21:13:06 +0000 (16:13 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Sun, 20 Nov 2011 21:16:41 +0000 (16:16 -0500)
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>
resize/online.c

index 1a77839..966ea1e 100644 (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"));