From: Pekka Enberg <[EMAIL PROTECTED]>

Return EBADF for all revoked file operations except for read(2) which
returns zero for special files as the BSDs do and close(2) which is 
always zero.

Cc: Alan Cox <[EMAIL PROTECTED]>
Signed-off-by: Pekka Enberg <[EMAIL PROTECTED]>
---
 fs/revoked_inode.c |  367 +++++------------------------------------------------
 1 file changed, 38 insertions(+), 329 deletions(-)

Index: uml-2.6/fs/revoked_inode.c
===================================================================
--- uml-2.6.orig/fs/revoked_inode.c     2007-03-09 13:26:30.000000000 +0200
+++ uml-2.6/fs/revoked_inode.c  2007-03-09 13:47:54.000000000 +0200
@@ -29,6 +29,12 @@
        return -EBADF;
 }
 
+static ssize_t revoked_special_file_read(struct file *filp, char __user * buf,
+                                        size_t size, loff_t * ppos)
+{
+       return 0;
+}
+
 static ssize_t revoked_file_write(struct file *filp, const char __user * buf,
                                  size_t siz, loff_t * ppos)
 {
@@ -200,6 +206,35 @@
        .splice_read = revoked_file_splice_read,
 };
 
+static const struct file_operations revoked_special_file_ops = {
+       .llseek = revoked_file_llseek,
+       .read = revoked_special_file_read,
+       .write = revoked_file_write,
+       .aio_read = revoked_file_aio_read,
+       .aio_write = revoked_file_aio_write,
+       .readdir = revoked_file_readdir,
+       .poll = revoked_file_poll,
+       .ioctl = revoked_file_ioctl,
+       .unlocked_ioctl = revoked_file_unlocked_ioctl,
+       .compat_ioctl = revoked_file_compat_ioctl,
+       .mmap = revoked_file_mmap,
+       .open = revoked_file_open,
+       .flush = revoked_file_flush,
+       .release = revoked_file_release,
+       .fsync = revoked_file_fsync,
+       .aio_fsync = revoked_file_aio_fsync,
+       .fasync = revoked_file_fasync,
+       .lock = revoked_file_lock,
+       .sendfile = revoked_file_sendfile,
+       .sendpage = revoked_file_sendpage,
+       .get_unmapped_area = revoked_file_get_unmapped_area,
+       .check_flags = revoked_file_check_flags,
+       .dir_notify = revoked_file_dir_notify,
+       .flock = revoked_file_flock,
+       .splice_write = revoked_file_splice_write,
+       .splice_read = revoked_file_splice_read,
+};
+
 static int revoked_inode_create(struct inode *dir, struct dentry *dentry,
                                int mode, struct nameidata *nd)
 {
@@ -326,330 +361,6 @@
        /* truncate_range returns void */
 };
 
-static loff_t revoked_special_file_llseek(struct file *file, loff_t offset,
-                                         int origin)
-{
-       return -ENXIO;
-}
-
-static ssize_t revoked_special_file_read(struct file *filp, char __user * buf,
-                                        size_t size, loff_t * ppos)
-{
-       return -ENXIO;
-}
-
-static ssize_t revoked_special_file_write(struct file *filp,
-                                         const char __user * buf, size_t siz,
-                                         loff_t * ppos)
-{
-       return -ENXIO;
-}
-
-static ssize_t revoked_special_file_aio_read(struct kiocb *iocb,
-                                            const struct iovec *iov,
-                                            unsigned long nr_segs, loff_t pos)
-{
-       return -ENXIO;
-}
-
-static ssize_t revoked_special_file_aio_write(struct kiocb *iocb,
-                                             const struct iovec *iov,
-                                             unsigned long nr_segs, loff_t pos)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_file_readdir(struct file *filp, void *dirent,
-                                       filldir_t filldir)
-{
-       return -ENXIO;
-}
-
-static unsigned int revoked_special_file_poll(struct file *filp,
-                                             poll_table * wait)
-{
-       return POLLERR;
-}
-
-static int revoked_special_file_ioctl(struct inode *inode, struct file *filp,
-                                     unsigned int cmd, unsigned long arg)
-{
-       return -ENXIO;
-}
-
-static long revoked_special_file_unlocked_ioctl(struct file *file, unsigned 
cmd,
-                                               unsigned long arg)
-{
-       return -ENXIO;
-}
-
-static long revoked_special_file_compat_ioctl(struct file *file,
-                                             unsigned int cmd,
-                                             unsigned long arg)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_file_mmap(struct file *file,
-                                    struct vm_area_struct *vma)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_file_open(struct inode *inode, struct file *filp)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_file_flush(struct file *file, fl_owner_t id)
-{
-       return 0;
-}
-
-static int revoked_special_file_release(struct inode *inode, struct file *filp)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_file_fsync(struct file *file, struct dentry *dentry,
-                                     int datasync)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_file_aio_fsync(struct kiocb *iocb, int datasync)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_file_fasync(int fd, struct file *filp, int on)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_file_lock(struct file *file, int cmd,
-                                    struct file_lock *fl)
-{
-       return -ENXIO;
-}
-
-static ssize_t revoked_special_file_sendfile(struct file *in_file,
-                                            loff_t * ppos, size_t count,
-                                            read_actor_t actor, void *target)
-{
-       return -ENXIO;
-}
-
-static ssize_t revoked_special_file_sendpage(struct file *file,
-                                            struct page *page, int off,
-                                            size_t len, loff_t * pos, int more)
-{
-       return -ENXIO;
-}
-
-static unsigned long revoked_special_file_get_unmapped_area(struct file *file,
-                                                           unsigned long addr,
-                                                           unsigned long len,
-                                                           unsigned long pgoff,
-                                                           unsigned long flags)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_file_check_flags(int flags)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_file_dir_notify(struct file *file, unsigned long 
arg)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_file_flock(struct file *filp, int cmd,
-                                     struct file_lock *fl)
-{
-       return -ENXIO;
-}
-
-static ssize_t revoked_special_file_splice_write(struct pipe_inode_info *pipe,
-                                                struct file *out,
-                                                loff_t * ppos, size_t len,
-                                                unsigned int flags)
-{
-       return -ENXIO;
-}
-
-static ssize_t revoked_special_file_splice_read(struct file *in, loff_t * ppos,
-                                               struct pipe_inode_info *pipe,
-                                               size_t len, unsigned int flags)
-{
-       return -ENXIO;
-}
-
-static const struct file_operations revoked_special_file_ops = {
-       .llseek = revoked_special_file_llseek,
-       .read = revoked_special_file_read,
-       .write = revoked_special_file_write,
-       .aio_read = revoked_special_file_aio_read,
-       .aio_write = revoked_special_file_aio_write,
-       .readdir = revoked_special_file_readdir,
-       .poll = revoked_special_file_poll,
-       .ioctl = revoked_special_file_ioctl,
-       .unlocked_ioctl = revoked_special_file_unlocked_ioctl,
-       .compat_ioctl = revoked_special_file_compat_ioctl,
-       .mmap = revoked_special_file_mmap,
-       .open = revoked_special_file_open,
-       .flush = revoked_special_file_flush,
-       .release = revoked_special_file_release,
-       .fsync = revoked_special_file_fsync,
-       .aio_fsync = revoked_special_file_aio_fsync,
-       .fasync = revoked_special_file_fasync,
-       .lock = revoked_special_file_lock,
-       .sendfile = revoked_special_file_sendfile,
-       .sendpage = revoked_special_file_sendpage,
-       .get_unmapped_area = revoked_special_file_get_unmapped_area,
-       .check_flags = revoked_special_file_check_flags,
-       .dir_notify = revoked_special_file_dir_notify,
-       .flock = revoked_special_file_flock,
-       .splice_write = revoked_special_file_splice_write,
-       .splice_read = revoked_special_file_splice_read,
-};
-
-static int revoked_special_inode_create(struct inode *dir,
-                                       struct dentry *dentry, int mode,
-                                       struct nameidata *nd)
-{
-       return -ENXIO;
-}
-
-static struct dentry *revoked_special_inode_lookup(struct inode *dir,
-                                                  struct dentry *dentry,
-                                                  struct nameidata *nd)
-{
-       return ERR_PTR(-ENXIO);
-}
-
-static int revoked_special_inode_link(struct dentry *old_dentry,
-                                     struct inode *dir, struct dentry *dentry)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_inode_unlink(struct inode *dir,
-                                       struct dentry *dentry)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_inode_symlink(struct inode *dir,
-                                        struct dentry *dentry,
-                                        const char *symname)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_inode_mkdir(struct inode *dir, struct dentry 
*dentry,
-                                      int mode)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_inode_rmdir(struct inode *dir, struct dentry 
*dentry)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_inode_mknod(struct inode *dir, struct dentry 
*dentry,
-                                      int mode, dev_t rdev)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_inode_rename(struct inode *old_dir,
-                                       struct dentry *old_dentry,
-                                       struct inode *new_dir,
-                                       struct dentry *new_dentry)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_inode_readlink(struct dentry *dentry,
-                                         char __user * buffer, int buflen)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_inode_permission(struct inode *inode, int mask,
-                                           struct nameidata *nd)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_inode_getattr(struct vfsmount *mnt,
-                                        struct dentry *dentry,
-                                        struct kstat *stat)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_inode_setattr(struct dentry *direntry,
-                                        struct iattr *attrs)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_inode_setxattr(struct dentry *dentry,
-                                         const char *name, const void *value,
-                                         size_t size, int flags)
-{
-       return -ENXIO;
-}
-
-static ssize_t revoked_special_inode_getxattr(struct dentry *dentry,
-                                             const char *name, void *buffer,
-                                             size_t size)
-{
-       return -ENXIO;
-}
-
-static ssize_t revoked_special_inode_listxattr(struct dentry *dentry,
-                                              char *buffer, size_t buffer_size)
-{
-       return -ENXIO;
-}
-
-static int revoked_special_inode_removexattr(struct dentry *dentry,
-                                            const char *name)
-{
-       return -ENXIO;
-}
-
-static struct inode_operations revoked_special_inode_ops = {
-       .create = revoked_special_inode_create,
-       .lookup = revoked_special_inode_lookup,
-       .link = revoked_special_inode_link,
-       .unlink = revoked_special_inode_unlink,
-       .symlink = revoked_special_inode_symlink,
-       .mkdir = revoked_special_inode_mkdir,
-       .rmdir = revoked_special_inode_rmdir,
-       .mknod = revoked_special_inode_mknod,
-       .rename = revoked_special_inode_rename,
-       .readlink = revoked_special_inode_readlink,
-       /* follow_link must be no-op, otherwise unmounting this inode
-          won't work */
-       /* put_link returns void */
-       /* truncate returns void */
-       .permission = revoked_special_inode_permission,
-       .getattr = revoked_special_inode_getattr,
-       .setattr = revoked_special_inode_setattr,
-       .setxattr = revoked_special_inode_setxattr,
-       .getxattr = revoked_special_inode_getxattr,
-       .listxattr = revoked_special_inode_listxattr,
-       .removexattr = revoked_special_inode_removexattr,
-       /* truncate_range returns void */
-};
-
 void make_revoked_inode(struct inode *inode, int mode)
 {
        remove_inode_hash(inode);
@@ -657,12 +368,10 @@
        inode->i_mode = mode;
        inode->i_atime = inode->i_mtime = inode->i_ctime =
            current_fs_time(inode->i_sb);
+       inode->i_op = &revoked_inode_ops;
 
-       if (special_file(mode)) {
-               inode->i_op = &revoked_special_inode_ops;
+       if (special_file(mode))
                inode->i_fop = &revoked_special_file_ops;
-       } else {
-               inode->i_op = &revoked_inode_ops;
+       else
                inode->i_fop = &revoked_file_ops;
-       }
 }
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to