]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - fs/affs/super.c
[PATCH] Remove SUID when splicing into an inode
[linux-2.6-omap-h63xx.git] / fs / affs / super.c
index 4d7e5b19e5cd20b99d76de5e53743dd9836704de..5ea72c3a16c3b52d4654d9a65223a09b6c87cbb4 100644 (file)
 #include <linux/init.h>
 #include <linux/statfs.h>
 #include <linux/parser.h>
+#include <linux/magic.h>
 #include "affs.h"
 
 extern struct timezone sys_tz;
 
-static int affs_statfs(struct super_block *sb, struct kstatfs *buf);
+static int affs_statfs(struct dentry *dentry, struct kstatfs *buf);
 static int affs_remount (struct super_block *sb, int *flags, char *data);
 
 static void
@@ -108,8 +109,7 @@ static int init_inodecache(void)
 
 static void destroy_inodecache(void)
 {
-       if (kmem_cache_destroy(affs_inode_cachep))
-               printk(KERN_INFO "affs_inode_cache: not all structures were freed\n");
+       kmem_cache_destroy(affs_inode_cachep);
 }
 
 static struct super_operations affs_sops = {
@@ -271,6 +271,7 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent)
        int                      reserved;
        unsigned long            mount_flags;
        int                      tmp_flags;     /* fix remount prototype... */
+       u8                       sig[4];
 
        pr_debug("AFFS: read_super(%s)\n",data ? (const char *)data : "no options");
 
@@ -278,11 +279,10 @@ static int affs_fill_super(struct super_block *sb, void *data, int silent)
        sb->s_op                = &affs_sops;
        sb->s_flags |= MS_NODIRATIME;
 
-       sbi = kmalloc(sizeof(struct affs_sb_info), GFP_KERNEL);
+       sbi = kzalloc(sizeof(struct affs_sb_info), GFP_KERNEL);
        if (!sbi)
                return -ENOMEM;
        sb->s_fs_info = sbi;
-       memset(sbi, 0, sizeof(*sbi));
        init_MUTEX(&sbi->s_bmlock);
 
        if (!parse_options(data,&uid,&gid,&i,&reserved,&root_block,
@@ -370,8 +370,9 @@ got_root:
                printk(KERN_ERR "AFFS: Cannot read boot block\n");
                goto out_error;
        }
-       chksum = be32_to_cpu(*(__be32 *)boot_bh->b_data);
+       memcpy(sig, boot_bh->b_data, 4);
        brelse(boot_bh);
+       chksum = be32_to_cpu(*(__be32 *)sig);
 
        /* Dircache filesystems are compatible with non-dircache ones
         * when reading. As long as they aren't supported, writing is
@@ -420,11 +421,11 @@ got_root:
        }
 
        if (mount_flags & SF_VERBOSE) {
-               chksum = cpu_to_be32(chksum);
-               printk(KERN_NOTICE "AFFS: Mounting volume \"%*s\": Type=%.3s\\%c, Blocksize=%d\n",
-                       AFFS_ROOT_TAIL(sb, root_bh)->disk_name[0],
+               u8 len = AFFS_ROOT_TAIL(sb, root_bh)->disk_name[0];
+               printk(KERN_NOTICE "AFFS: Mounting volume \"%.*s\": Type=%.3s\\%c, Blocksize=%d\n",
+                       len > 31 ? 31 : len,
                        AFFS_ROOT_TAIL(sb, root_bh)->disk_name + 1,
-                       (char *)&chksum,((char *)&chksum)[3] + '0',blocksize);
+                       sig, sig[3] + '0', blocksize);
        }
 
        sb->s_flags |= MS_NODEV | MS_NOSUID;
@@ -508,8 +509,9 @@ affs_remount(struct super_block *sb, int *flags, char *data)
 }
 
 static int
-affs_statfs(struct super_block *sb, struct kstatfs *buf)
+affs_statfs(struct dentry *dentry, struct kstatfs *buf)
 {
+       struct super_block *sb = dentry->d_sb;
        int              free;
 
        pr_debug("AFFS: statfs() partsize=%d, reserved=%d\n",AFFS_SB(sb)->s_partition_size,
@@ -524,10 +526,11 @@ affs_statfs(struct super_block *sb, struct kstatfs *buf)
        return 0;
 }
 
-static struct super_block *affs_get_sb(struct file_system_type *fs_type,
-       int flags, const char *dev_name, void *data)
+static int affs_get_sb(struct file_system_type *fs_type,
+       int flags, const char *dev_name, void *data, struct vfsmount *mnt)
 {
-       return get_sb_bdev(fs_type, flags, dev_name, data, affs_fill_super);
+       return get_sb_bdev(fs_type, flags, dev_name, data, affs_fill_super,
+                          mnt);
 }
 
 static struct file_system_type affs_fs_type = {