From: Dave Hansen This is on top of the ext2-reservations.patch in -mm. The original r/o bind mount set didn't address the new ext2 ioctl: EXT2_IOC_SETRSVSZ, because it doesn't exist in mainline. This fixes that up for -mm. Signed-off-by: Dave Hansen Signed-off-by: Andrew Morton --- fs/ext2/ioctl.c | 24 +++++++++++++++--------- 1 files changed, 15 insertions(+), 9 deletions(-) diff -puN fs/ext2/ioctl.c~ext2-reservations-fix-for-r-o-bind-mounts-take-writer-count-v2 fs/ext2/ioctl.c --- a/fs/ext2/ioctl.c~ext2-reservations-fix-for-r-o-bind-mounts-take-writer-count-v2 +++ a/fs/ext2/ioctl.c @@ -111,14 +111,18 @@ setflags_out: if (!test_opt(inode->i_sb, RESERVATION) ||!S_ISREG(inode->i_mode)) return -ENOTTY; - if (IS_RDONLY(inode)) - return -EROFS; - - if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) - return -EACCES; - - if (get_user(rsv_window_size, (int __user *)arg)) - return -EFAULT; + ret = mnt_want_write(filp->f_vfsmnt); + if (ret) + return ret; + + if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER)) { + ret = -EACCES; + goto setrsvsz_out; + } + if (get_user(rsv_window_size, (int __user *)arg)) { + ret = -EFAULT; + goto setrsvsz_out; + } if (rsv_window_size > EXT2_MAX_RESERVE_BLOCKS) rsv_window_size = EXT2_MAX_RESERVE_BLOCKS; @@ -140,7 +144,9 @@ setflags_out: rsv->rsv_goal_size = rsv_window_size; } mutex_unlock(&ei->truncate_mutex); - return 0; + setrsvsz_out: + mnt_drop_write(filp->f_vfsmnt); + return ret; } default: return -ENOTTY; _