
Originally from: Herbert Poetzl <herbert@13thfloor.at>

For now, file_readonly() replaces calls to IS_RDONLY().  It
will soon also check the vfsmount flags for the read-only
attribute.

This patch looks a little bit funny because it has many
hunks that do this:

-               if (IS_RDONLY(inode))
+               if (file_readonly(filp))

This is because we will later need an (inode,vfsmount) pair
for the vfsmount flag check.  A 'struct file' provides both
of those.  Instead of this, we could do the following:

-               if (IS_RDONLY(inode))
+               if (inode_is_readonly(inode, filp->f_vfsmnt))

But, file_readonly() alone looks nicer.

Signed-off-by: Dave Hansen <haveblue@us.ibm.com>
---

 lxc-dave/fs/ext2/ioctl.c               |    4 ++--
 lxc-dave/fs/ext3/ioctl.c               |   10 +++++-----
 lxc-dave/fs/fat/file.c                 |    2 +-
 lxc-dave/fs/file.c                     |    6 ++++++
 lxc-dave/fs/hfsplus/ioctl.c            |    2 +-
 lxc-dave/fs/inode.c                    |    2 +-
 lxc-dave/fs/jfs/ioctl.c                |    2 +-
 lxc-dave/fs/reiser4/plugin/file/file.c |    3 ++-
 lxc-dave/fs/reiserfs/ioctl.c           |    4 ++--
 lxc-dave/include/linux/fs.h            |    2 ++
 10 files changed, 23 insertions(+), 14 deletions(-)

diff -puN fs/ext2/ioctl.c~D1-file_readonly-helper fs/ext2/ioctl.c
--- lxc/fs/ext2/ioctl.c~D1-file_readonly-helper	2006-05-31 12:48:50.000000000 -0700
+++ lxc-dave/fs/ext2/ioctl.c	2006-05-31 12:48:50.000000000 -0700
@@ -30,7 +30,7 @@ int ext2_ioctl (struct inode * inode, st
 	case EXT2_IOC_SETFLAGS: {
 		unsigned int oldflags;
 
-		if (IS_RDONLY(inode))
+		if (file_readonly(filp))
 			return -EROFS;
 
 		if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
@@ -69,7 +69,7 @@ int ext2_ioctl (struct inode * inode, st
 	case EXT2_IOC_SETVERSION:
 		if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
 			return -EPERM;
-		if (IS_RDONLY(inode))
+		if (file_readonly(filp))
 			return -EROFS;
 		if (get_user(inode->i_generation, (int __user *) arg))
 			return -EFAULT;	
diff -puN fs/ext3/ioctl.c~D1-file_readonly-helper fs/ext3/ioctl.c
--- lxc/fs/ext3/ioctl.c~D1-file_readonly-helper	2006-05-31 12:48:50.000000000 -0700
+++ lxc-dave/fs/ext3/ioctl.c	2006-05-31 12:48:50.000000000 -0700
@@ -36,7 +36,7 @@ int ext3_ioctl (struct inode * inode, st
 		unsigned int oldflags;
 		unsigned int jflag;
 
-		if (IS_RDONLY(inode))
+		if (file_readonly(filp))
 			return -EROFS;
 
 		if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
@@ -122,7 +122,7 @@ flags_err:
 
 		if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
 			return -EPERM;
-		if (IS_RDONLY(inode))
+		if (file_readonly(filp))
 			return -EROFS;
 		if (get_user(generation, (int __user *) arg))
 			return -EFAULT;
@@ -176,7 +176,7 @@ flags_err:
 		if (!test_opt(inode->i_sb, RESERVATION) ||!S_ISREG(inode->i_mode))
 			return -ENOTTY;
 
-		if (IS_RDONLY(inode))
+		if (file_readonly(filp))
 			return -EROFS;
 
 		if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
@@ -211,7 +211,7 @@ flags_err:
 		if (!capable(CAP_SYS_RESOURCE))
 			return -EPERM;
 
-		if (IS_RDONLY(inode))
+		if (file_readonly(filp))
 			return -EROFS;
 
 		if (get_user(n_blocks_count, (__u32 __user *)arg))
@@ -232,7 +232,7 @@ flags_err:
 		if (!capable(CAP_SYS_RESOURCE))
 			return -EPERM;
 
-		if (IS_RDONLY(inode))
+		if (file_readonly(filp))
 			return -EROFS;
 
 		if (copy_from_user(&input, (struct ext3_new_group_input __user *)arg,
diff -puN fs/fat/file.c~D1-file_readonly-helper fs/fat/file.c
--- lxc/fs/fat/file.c~D1-file_readonly-helper	2006-05-31 12:48:50.000000000 -0700
+++ lxc-dave/fs/fat/file.c	2006-05-31 12:48:50.000000000 -0700
@@ -44,7 +44,7 @@ int fat_generic_ioctl(struct inode *inod
 
 		mutex_lock(&inode->i_mutex);
 
-		if (IS_RDONLY(inode)) {
+		if (file_readonly(filp)) {
 			err = -EROFS;
 			goto up;
 		}
diff -puN fs/file.c~D1-file_readonly-helper fs/file.c
--- lxc/fs/file.c~D1-file_readonly-helper	2006-05-31 12:48:50.000000000 -0700
+++ lxc-dave/fs/file.c	2006-05-31 12:48:50.000000000 -0700
@@ -376,3 +376,9 @@ void __init files_defer_init(void)
 	for_each_possible_cpu(i)
 		fdtable_defer_list_init(i);
 }
+
+int file_readonly(struct file *file)
+{
+	return IS_RDONLY(file->f_dentry->d_inode);
+}
+
diff -puN fs/hfsplus/ioctl.c~D1-file_readonly-helper fs/hfsplus/ioctl.c
--- lxc/fs/hfsplus/ioctl.c~D1-file_readonly-helper	2006-05-31 12:48:50.000000000 -0700
+++ lxc-dave/fs/hfsplus/ioctl.c	2006-05-31 12:48:50.000000000 -0700
@@ -35,7 +35,7 @@ int hfsplus_ioctl(struct inode *inode, s
 			flags |= EXT2_FLAG_NODUMP; /* EXT2_NODUMP_FL */
 		return put_user(flags, (int __user *)arg);
 	case HFSPLUS_IOC_EXT2_SETFLAGS: {
-		if (IS_RDONLY(inode))
+		if (file_readonly(filp))
 			return -EROFS;
 
 		if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
diff -puN fs/inode.c~D1-file_readonly-helper fs/inode.c
--- lxc/fs/inode.c~D1-file_readonly-helper	2006-05-31 12:48:50.000000000 -0700
+++ lxc-dave/fs/inode.c	2006-05-31 12:48:50.000000000 -0700
@@ -1230,7 +1230,7 @@ void file_update_time(struct file *file)
 
 	if (IS_NOCMTIME(inode))
 		return;
-	if (IS_RDONLY(inode))
+	if (file_readonly(file))
 		return;
 
 	now = current_fs_time(inode->i_sb);
diff -puN fs/jfs/ioctl.c~D1-file_readonly-helper fs/jfs/ioctl.c
--- lxc/fs/jfs/ioctl.c~D1-file_readonly-helper	2006-05-31 12:48:50.000000000 -0700
+++ lxc-dave/fs/jfs/ioctl.c	2006-05-31 12:48:50.000000000 -0700
@@ -65,7 +65,7 @@ int jfs_ioctl(struct inode * inode, stru
 	case JFS_IOC_SETFLAGS: {
 		unsigned int oldflags;
 
-		if (IS_RDONLY(inode))
+		if (file_readonly(filp))
 			return -EROFS;
 
 		if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
diff -puN fs/reiser4/plugin/file/file.c~D1-file_readonly-helper fs/reiser4/plugin/file/file.c
--- lxc/fs/reiser4/plugin/file/file.c~D1-file_readonly-helper	2006-05-31 12:48:50.000000000 -0700
+++ lxc-dave/fs/reiser4/plugin/file/file.c	2006-05-31 12:48:50.000000000 -0700
@@ -2304,7 +2304,8 @@ int mmap_unix_file(struct file *file, st
 	down(&uf_info->write);
 	get_exclusive_access(uf_info);
 
-	if (!IS_RDONLY(inode) && (vma->vm_flags & (VM_MAYWRITE | VM_SHARED))) {
+	if (!file_readonly(file) &&
+	    (vma->vm_flags & (VM_MAYWRITE | VM_SHARED))) {
 		/*
 		 * we need file built of extent items. If it is still built of
 		 * tail items we have to convert it. Find what items the file
diff -puN fs/reiserfs/ioctl.c~D1-file_readonly-helper fs/reiserfs/ioctl.c
--- lxc/fs/reiserfs/ioctl.c~D1-file_readonly-helper	2006-05-31 12:48:50.000000000 -0700
+++ lxc-dave/fs/reiserfs/ioctl.c	2006-05-31 12:48:50.000000000 -0700
@@ -47,7 +47,7 @@ int reiserfs_ioctl(struct inode *inode, 
 			if (!reiserfs_attrs(inode->i_sb))
 				return -ENOTTY;
 
-			if (IS_RDONLY(inode))
+			if (file_readonly(filp))
 				return -EROFS;
 
 			if ((current->fsuid != inode->i_uid)
@@ -82,7 +82,7 @@ int reiserfs_ioctl(struct inode *inode, 
 	case REISERFS_IOC_SETVERSION:
 		if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
 			return -EPERM;
-		if (IS_RDONLY(inode))
+		if (file_readonly(filp))
 			return -EROFS;
 		if (get_user(inode->i_generation, (int __user *)arg))
 			return -EFAULT;
diff -puN include/linux/fs.h~D1-file_readonly-helper include/linux/fs.h
--- lxc/include/linux/fs.h~D1-file_readonly-helper	2006-05-31 12:48:50.000000000 -0700
+++ lxc-dave/include/linux/fs.h	2006-05-31 12:48:50.000000000 -0700
@@ -669,6 +669,8 @@ extern spinlock_t files_lock;
 #define get_file(x)	atomic_inc(&(x)->f_count)
 #define file_count(x)	atomic_read(&(x)->f_count)
 
+int file_readonly(struct file *file);
+
 #define	MAX_NON_LFS	((1UL<<31) - 1)
 
 /* Page cache limit. The filesystems should put that into their s_maxbytes 
_
