- update bind mount patch to patch-2.6.11-rc5-bme0.06.1.diff
authorMark Huang <mlhuang@cs.princeton.edu>
Sat, 20 Aug 2005 18:35:38 +0000 (18:35 +0000)
committerMark Huang <mlhuang@cs.princeton.edu>
Sat, 20 Aug 2005 18:35:38 +0000 (18:35 +0000)
fs/ext3/ioctl.c
fs/nfs/dir.c
fs/nfsd/vfs.c
fs/xattr.c

index 97fd206..8766534 100644 (file)
@@ -170,7 +170,8 @@ flags_err:
                if (!test_opt(inode->i_sb, RESERVATION) ||!S_ISREG(inode->i_mode))
                        return -ENOTTY;
 
-               if (IS_RDONLY(inode))
+               if (IS_RDONLY(inode) ||
+                       (filp && MNT_IS_RDONLY(filp->f_vfsmnt)))
                        return -EROFS;
 
                if ((current->fsuid != inode->i_uid) && !capable(CAP_FOWNER))
@@ -205,7 +206,8 @@ flags_err:
                if (!capable(CAP_SYS_RESOURCE))
                        return -EPERM;
 
-               if (IS_RDONLY(inode))
+               if (IS_RDONLY(inode) ||
+                       (filp && MNT_IS_RDONLY(filp->f_vfsmnt)))
                        return -EROFS;
 
                if (get_user(n_blocks_count, (__u32 __user *)arg))
@@ -226,7 +228,8 @@ flags_err:
                if (!capable(CAP_SYS_RESOURCE))
                        return -EPERM;
 
-               if (IS_RDONLY(inode))
+               if (IS_RDONLY(inode) ||
+                       (filp && MNT_IS_RDONLY(filp->f_vfsmnt)))
                        return -EROFS;
 
                if (copy_from_user(&input, (struct ext3_new_group_input __user *)arg,
@@ -251,7 +254,8 @@ flags_err:
                /* fixme: if stealth, return -ENOTTY */
                if (!capable(CAP_CONTEXT))
                        return -EPERM;
-               if (IS_RDONLY(inode))
+               if (IS_RDONLY(inode) ||
+                       (filp && MNT_IS_RDONLY(filp->f_vfsmnt)))
                        return -EROFS;
                if (!(inode->i_sb->s_flags & MS_TAGXID))
                        return -ENOSYS;
index 29df851..8c827fe 100644 (file)
@@ -806,7 +806,7 @@ static int is_atomic_open(struct inode *dir, struct nameidata *nd)
        if (nd->flags & LOOKUP_DIRECTORY)
                return 0;
        /* Are we trying to write to a read only partition? */
-       if ((IS_RDONLY(dir) || (nd && MNT_IS_RDONLY(nd->mnt))) &&
+       if ((IS_RDONLY(dir) || MNT_IS_RDONLY(nd->mnt)) &&
                (nd->intent.open.flags & (O_CREAT|O_TRUNC|FMODE_WRITE)))
                return 0;
        return 1;
index 26a87de..b59419c 100644 (file)
@@ -1165,13 +1165,13 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
                err = vfs_create(dirp, dchild, iap->ia_mode, NULL);
                break;
        case S_IFDIR:
-               err = vfs_mkdir(dirp, dchild, iap->ia_mode);
+               err = vfs_mkdir(dirp, dchild, iap->ia_mode, NULL);
                break;
        case S_IFCHR:
        case S_IFBLK:
        case S_IFIFO:
        case S_IFSOCK:
-               err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev);
+               err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev, NULL);
                break;
        default:
                printk("nfsd: bad file type %o in nfsd_create\n", type);
@@ -1447,11 +1447,13 @@ nfsd_symlink(struct svc_rqst *rqstp, struct svc_fh *fhp,
                else {
                        strncpy(path_alloced, path, plen);
                        path_alloced[plen] = 0;
-                       err = vfs_symlink(dentry->d_inode, dnew, path_alloced, mode);
+                       err = vfs_symlink(dentry->d_inode, dnew,
+                               path_alloced, mode, NULL);
                        kfree(path_alloced);
                }
        } else
-               err = vfs_symlink(dentry->d_inode, dnew, path, mode);
+               err = vfs_symlink(dentry->d_inode, dnew,
+                       path, mode, NULL);
 
        if (!err) {
                if (EX_ISSYNC(fhp->fh_export))
@@ -1509,7 +1511,7 @@ nfsd_link(struct svc_rqst *rqstp, struct svc_fh *ffhp,
        dold = tfhp->fh_dentry;
        dest = dold->d_inode;
 
-       err = vfs_link(dold, dirp, dnew);
+       err = vfs_link(dold, dirp, dnew, NULL);
        if (!err) {
                if (EX_ISSYNC(ffhp->fh_export)) {
                        nfsd_sync_dir(ddir);
@@ -1670,9 +1672,9 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,
                        err = nfserr_perm;
                } else
 #endif
-               err = vfs_unlink(dirp, rdentry);
+               err = vfs_unlink(dirp, rdentry, NULL);
        } else { /* It's RMDIR */
-               err = vfs_rmdir(dirp, rdentry);
+               err = vfs_rmdir(dirp, rdentry, NULL);
        }
 
        dput(rdentry);
@@ -1785,7 +1787,7 @@ nfsd_permission(struct svc_export *exp, struct dentry *dentry, int acc)
        if (!(acc & MAY_LOCAL_ACCESS))
                if (acc & (MAY_WRITE | MAY_SATTR | MAY_TRUNC)) {
                        if (EX_RDONLY(exp) || IS_RDONLY(inode)
-                               || (exp && MNT_IS_RDONLY(exp->ex_mnt)))
+                               || MNT_IS_RDONLY(exp->ex_mnt))
                                return nfserr_rofs;
                        if (/* (acc & MAY_WRITE) && */ IS_IMMUTABLE(inode))
                                return nfserr_perm;
index 93dee70..f07cae6 100644 (file)
@@ -23,7 +23,7 @@
  */
 static long
 setxattr(struct dentry *d, char __user *name, void __user *value,
-        size_t size, int flags)
+        size_t size, int flags, struct vfsmount *mnt)
 {
        int error;
        void *kvalue = NULL;
@@ -56,6 +56,9 @@ setxattr(struct dentry *d, char __user *name, void __user *value,
                error = security_inode_setxattr(d, kname, kvalue, size, flags);
                if (error)
                        goto out;
+               error = -EROFS;
+               if (MNT_IS_RDONLY(mnt))
+                       goto out;
                error = d->d_inode->i_op->setxattr(d, kname, kvalue, size, flags);
                if (!error)
                        security_inode_post_setxattr(d, kname, kvalue, size, flags);
@@ -77,7 +80,7 @@ sys_setxattr(char __user *path, char __user *name, void __user *value,
        error = user_path_walk(path, &nd);
        if (error)
                return error;
-       error = setxattr(nd.dentry, name, value, size, flags);
+       error = setxattr(nd.dentry, name, value, size, flags, nd.mnt);
        path_release(&nd);
        return error;
 }
@@ -92,7 +95,7 @@ sys_lsetxattr(char __user *path, char __user *name, void __user *value,
        error = user_path_walk_link(path, &nd);
        if (error)
                return error;
-       error = setxattr(nd.dentry, name, value, size, flags);
+       error = setxattr(nd.dentry, name, value, size, flags, nd.mnt);
        path_release(&nd);
        return error;
 }
@@ -107,7 +110,7 @@ sys_fsetxattr(int fd, char __user *name, void __user *value,
        f = fget(fd);
        if (!f)
                return error;
-       error = setxattr(f->f_dentry, name, value, size, flags);
+       error = setxattr(f->f_dentry, name, value, size, flags, f->f_vfsmnt);
        fput(f);
        return error;
 }
@@ -285,7 +288,7 @@ sys_flistxattr(int fd, char __user *list, size_t size)
  * Extended attribute REMOVE operations
  */
 static long
-removexattr(struct dentry *d, char __user *name)
+removexattr(struct dentry *d, char __user *name, struct vfsmount *mnt)
 {
        int error;
        char kname[XATTR_NAME_MAX + 1];
@@ -301,6 +304,9 @@ removexattr(struct dentry *d, char __user *name)
                error = security_inode_removexattr(d, kname);
                if (error)
                        goto out;
+               error = -EROFS;
+               if (MNT_IS_RDONLY(mnt))
+                       goto out;
                down(&d->d_inode->i_sem);
                error = d->d_inode->i_op->removexattr(d, kname);
                up(&d->d_inode->i_sem);
@@ -318,7 +324,7 @@ sys_removexattr(char __user *path, char __user *name)
        error = user_path_walk(path, &nd);
        if (error)
                return error;
-       error = removexattr(nd.dentry, name);
+       error = removexattr(nd.dentry, name, nd.mnt);
        path_release(&nd);
        return error;
 }
@@ -332,7 +338,7 @@ sys_lremovexattr(char __user *path, char __user *name)
        error = user_path_walk_link(path, &nd);
        if (error)
                return error;
-       error = removexattr(nd.dentry, name);
+       error = removexattr(nd.dentry, name, nd.mnt);
        path_release(&nd);
        return error;
 }
@@ -346,7 +352,7 @@ sys_fremovexattr(int fd, char __user *name)
        f = fget(fd);
        if (!f)
                return error;
-       error = removexattr(f->f_dentry, name);
+       error = removexattr(f->f_dentry, name, f->f_vfsmnt);
        fput(f);
        return error;
 }