]> git.hungrycats.org Git - linux/commitdiff
[PATCH] large dev_t - second series (9/15)
authorAlexander Viro <viro@www.linux.org.uk>
Fri, 5 Sep 2003 03:54:27 +0000 (20:54 -0700)
committerLinus Torvalds <torvalds@home.osdl.org>
Fri, 5 Sep 2003 03:54:27 +0000 (20:54 -0700)
beginning of fs side work:
* new helpers - old_valid_dev(), old_encode_dev() and old_decode_dev()
* old_valid_dev() checks if dev_t value is OK for old filesystems
(i.e. both major and minor are below 256).
* old_valid_dev() calls are added in ->mknod() instances that care
about dev_t values (disk-backed and network ones).
* old_encode_dev() and old_decode_dev() convert dev_t -> u16
and u16 -> dev_t resp; currently these are no-ops, places that use current
formar (minor in bits 0--7, major in bits 8--15) will switch to these before
we widen dev_t.

20 files changed:
fs/cifs/dir.c
fs/coda/dir.c
fs/ext2/namei.c
fs/ext3/namei.c
fs/hpfs/namei.c
fs/intermezzo/dir.c
fs/jffs/inode-v23.c
fs/jffs2/dir.c
fs/jfs/namei.c
fs/libfs.c
fs/minix/namei.c
fs/ncpfs/dir.c
fs/nfs/dir.c
fs/reiserfs/namei.c
fs/smbfs/dir.c
fs/sysv/namei.c
fs/udf/namei.c
fs/ufs/namei.c
fs/xfs/linux/xfs_iops.c
include/linux/fs.h

index 8873ca0447c9aa2294854fb021b1b013572bd82f..b1245a53db8034425bbea36939225d6083dd25b3 100644 (file)
@@ -265,6 +265,9 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode, dev_t dev
        char *full_path = NULL;
        struct inode * newinode = NULL;
 
+       if (!old_valid_dev(device_number))
+               return -EINVAL;
+
        xid = GetXid();
 
        cifs_sb = CIFS_SB(inode->i_sb);
index 2917ab9f4976be3ad9f95865fe4ab487ec83feec..4c75d774e0dd5a8d3199c0fd4d299c62a3ae90d6 100644 (file)
@@ -242,6 +242,9 @@ static int coda_mknod(struct inode *dir, struct dentry *de, int mode, dev_t rdev
        if ( coda_hasmknod == 0 )
                return -EIO;
 
+       if (!old_valid_dev(rdev))
+               return -EINVAL;
+
        lock_kernel();
        coda_vfs_stat.create++;
 
index 72d5690b24508767a2814c9c225f64d9310027c1..8079e2ee468468065c067b8b56a8142a7629b10b 100644 (file)
@@ -139,8 +139,14 @@ static int ext2_create (struct inode * dir, struct dentry * dentry, int mode, st
 
 static int ext2_mknod (struct inode * dir, struct dentry *dentry, int mode, dev_t rdev)
 {
-       struct inode * inode = ext2_new_inode (dir, mode);
-       int err = PTR_ERR(inode);
+       struct inode * inode;
+       int err;
+
+       if (!old_valid_dev(rdev))
+               return -EINVAL;
+
+       inode = ext2_new_inode (dir, mode);
+       err = PTR_ERR(inode);
        if (!IS_ERR(inode)) {
                init_special_inode(inode, inode->i_mode, rdev);
 #ifdef CONFIG_EXT2_FS_XATTR
index 78daed5cee0ff7c97c3a9c5d5f5d1fc4c7c27a2a..769392cf8ea93749ad39a6eb7e3e42dc63d4cb9b 100644 (file)
@@ -1659,6 +1659,9 @@ static int ext3_mknod (struct inode * dir, struct dentry *dentry,
        struct inode *inode;
        int err;
 
+       if (!old_valid_dev(rdev))
+               return -EINVAL;
+
        handle = ext3_journal_start(dir, EXT3_DATA_TRANS_BLOCKS +
                                        EXT3_INDEX_EXTRA_TRANS_BLOCKS + 3);
        if (IS_ERR(handle))
index 18f8b1c00e9394499445624f62da56b0c436c36f..030d3de7d01f305a05ae4dab2d43a4fff5750566 100644 (file)
@@ -194,6 +194,8 @@ int hpfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
        int err;
        if ((err = hpfs_chk_name((char *)name, &len))) return err==-ENOENT ? -EINVAL : err;
        if (hpfs_sb(dir->i_sb)->sb_eas < 2) return -EPERM;
+       if (!old_valid_dev(rdev))
+               return -EINVAL;
        lock_kernel();
        if (!(fnode = hpfs_alloc_fnode(dir->i_sb, hpfs_i(dir)->i_dno, &fno, &bh))) goto bail;
        memset(&dee, 0, sizeof dee);
index 4794ee0a382238f88575c9c46046372908557fa5..b07d6ae8bb74ffceecb1970ca6e35d51a4b367da 100644 (file)
@@ -726,6 +726,9 @@ static int presto_mknod(struct inode * dir, struct dentry * dentry, int mode, de
         struct dentry *parent = dentry->d_parent;
         struct lento_vfs_context info;
 
+       if (!old_valid_dev(rdev))
+               return -EINVAL;
+
         ENTRY;
         error = presto_check_set_fsdata(dentry);
         if ( error ) {
index 480a5ba41972bbd23b5cbe20517d3186939eee9c..cad1a1f36e15b58efcf8b0fab6b6aa56a7b348ce 100644 (file)
@@ -1086,6 +1086,8 @@ jffs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
 
        D1(printk("***jffs_mknod()\n"));
 
+       if (!old_valid_dev(rdev))
+               return -EINVAL;
        lock_kernel();
        dir_f = (struct jffs_file *)dir->u.generic_ip;
        c = dir_f->c;
index 9a2df58cb486a280fcaade1d44b11bd80cc0c685..068084e7893e99ca8995a4403a8d7cf016efca5d 100644 (file)
@@ -594,6 +594,9 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, mk
        uint32_t writtenlen;
        int ret;
 
+       if (!old_valid_dev(rdev))
+               return -EINVAL;
+
        ri = jffs2_alloc_raw_inode();
        if (!ri)
                return -ENOMEM;
index 5062dc50b02d3a55c1ab68f0ff71298dc4792c01..ee62b39ee46c1045fcf222061ae4b87cda5d2027 100644 (file)
@@ -1311,6 +1311,9 @@ int jfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
        tid_t tid;
        struct tblock *tblk;
 
+       if (!old_valid_dev(rdev))
+               return -EINVAL;
+
        jfs_info("jfs_mknod: %s", dentry->d_name.name);
 
        if ((rc = get_UCSname(&dname, dentry, JFS_SBI(dir->i_sb)->nls_tab)))
index befcf41b0e30cab774959c27554debffc1b774bf..fbf1d0e6e3e45346528c71ad9f95a28ec48ed9fe 100644 (file)
@@ -3,6 +3,7 @@
  *     Library for filesystems writers.
  */
 
+#include <linux/module.h>
 #include <linux/pagemap.h>
 #include <linux/mount.h>
 #include <linux/vfs.h>
@@ -428,3 +429,22 @@ void simple_release_fs(struct vfsmount **mount, int *count)
        spin_unlock(&pin_fs_lock);
        mntput(mnt);
 }
+
+/* acceptable for old filesystems */
+int old_valid_dev(dev_t dev)
+{
+       return MAJOR(dev) < 256 && MINOR(dev) < 256;
+}
+EXPORT_SYMBOL(old_valid_dev);
+
+u16 old_encode_dev(dev_t dev)
+{
+       return (MAJOR(dev) << 8) | MINOR(dev);
+}
+EXPORT_SYMBOL(old_encode_dev);
+
+dev_t old_decode_dev(u16 val)
+{
+       return MKDEV((val >> 8) & 255, val & 255);
+}
+EXPORT_SYMBOL(old_decode_dev);
index 2b9e6c64d25a32aac5aee9e0274f48676473a60f..9f2682641f7f68d653529fad1468eec846e8d391 100644 (file)
@@ -78,7 +78,12 @@ static struct dentry *minix_lookup(struct inode * dir, struct dentry *dentry, st
 static int minix_mknod(struct inode * dir, struct dentry *dentry, int mode, dev_t rdev)
 {
        int error;
-       struct inode * inode = minix_new_inode(dir, &error);
+       struct inode *inode;
+
+       if (!old_valid_dev(rdev))
+               return -EINVAL;
+
+       inode = minix_new_inode(dir, &error);
 
        if (inode) {
                inode->i_mode = mode;
index f10460e559a57c450ce4155959fc09aedd7ecdc4..ce75e852e7578c56bc1b7cdbbb5cfd094e94f217 100644 (file)
@@ -1170,6 +1170,8 @@ out:
 static int ncp_mknod(struct inode * dir, struct dentry *dentry,
                     int mode, dev_t rdev)
 {
+       if (!old_valid_dev(rdev))
+               return -EINVAL;
        if (ncp_is_nfs_extras(NCP_SERVER(dir), NCP_FINFO(dir)->volNumber)) {
                DPRINTK(KERN_DEBUG "ncp_mknod: mode = 0%o\n", mode);
                return ncp_create_new(dir, dentry, mode, rdev, 0);
index e7ba8d084182ab1aa7cc947f7be651a8a09f7ab9..f9f494a60e4ba18667343f3c6af46a68cc18f0e5 100644 (file)
@@ -859,6 +859,9 @@ nfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
        dfprintk(VFS, "NFS: mknod(%s/%ld, %s\n", dir->i_sb->s_id,
                dir->i_ino, dentry->d_name.name);
 
+       if (!old_valid_dev(rdev))
+               return -EINVAL;
+
        attr.ia_mode = mode;
        attr.ia_valid = ATTR_MODE;
 
index 85dddb7a83b34b16e637843c7947ebfbd8c1ac0b..8c1485504ffeb86d957f3092f5bc22093f5099dc 100644 (file)
@@ -613,6 +613,9 @@ static int reiserfs_mknod (struct inode * dir, struct dentry *dentry, int mode,
     struct reiserfs_transaction_handle th ;
     int jbegin_count = JOURNAL_PER_BALANCE_CNT * 3; 
 
+    if (!old_valid_dev(rdev))
+       return -EINVAL;
+
     if (!(inode = new_inode(dir->i_sb))) {
        return -ENOMEM ;
     }
index f0b62740ae8927bfc5d896f98aba01a9ffbd95b3..aa5974edc2036930986f162302f5fcefbdcfa57e 100644 (file)
@@ -661,6 +661,9 @@ smb_make_node(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
        attr.ia_uid = current->euid;
        attr.ia_gid = current->egid;
 
+       if (!old_valid_dev(dev))
+               return -EINVAL;
+
        smb_invalid_dir_cache(dir);
        error = smb_proc_setattr_unix(dentry, &attr, MAJOR(dev), MINOR(dev));
        if (!error) {
index cbf08f04d07cc7b0fccebcb9036daa27f69ceea9..c24d0be87e74e40daecb0ecd780b1663f238839d 100644 (file)
@@ -85,8 +85,14 @@ static struct dentry *sysv_lookup(struct inode * dir, struct dentry * dentry, st
 
 static int sysv_mknod(struct inode * dir, struct dentry * dentry, int mode, dev_t rdev)
 {
-       struct inode * inode = sysv_new_inode(dir, mode);
-       int err = PTR_ERR(inode);
+       struct inode * inode;
+       int err;
+
+       if (!old_valid_dev(rdev))
+               return -EINVAL;
+
+       inode = sysv_new_inode(dir, mode);
+       err = PTR_ERR(inode);
 
        if (!IS_ERR(inode)) {
                sysv_set_inode(inode, rdev);
index d2ac88dae4470716859acad946beac462726e28d..a7350413f9b8fdd8b3bf4503cd34c2f981697f46 100644 (file)
@@ -677,6 +677,9 @@ static int udf_mknod(struct inode * dir, struct dentry * dentry, int mode, dev_t
        int err;
        struct fileIdentDesc cfi, *fi;
 
+       if (!old_valid_dev(rdev))
+               return -EINVAL;
+
        lock_kernel();
        err = -EIO;
        inode = udf_new_inode(dir, mode, &err);
index 82f391298c48ce64fd19d58c5588f61ec347f717..e59b6a81e558badb653f9e4e5e1b53bc0901e2a6 100644 (file)
@@ -111,7 +111,10 @@ static int ufs_create (struct inode * dir, struct dentry * dentry, int mode,
 
 static int ufs_mknod (struct inode * dir, struct dentry *dentry, int mode, dev_t rdev)
 {
-       struct inode * inode = ufs_new_inode(dir, mode);
+       struct inode * inode;
+       if (!old_valid_dev(rdev))
+               return -EINVAL;
+       inode = ufs_new_inode(dir, mode);
        int err = PTR_ERR(inode);
        if (!IS_ERR(inode)) {
                init_special_inode(inode, mode, rdev);
index 5f316085b1b9b61ace24a5703556b0b7afa7c493..cb9bcdda6d015919c29f65cba174331a109e4022 100644 (file)
@@ -113,6 +113,9 @@ linvfs_mknod(
        xattr_exists_t  test_default_acl = _ACL_DEFAULT_EXISTS;
        int             error;
 
+       if (!old_valid_dev(rdev))
+               return -EINVAL;
+
        if (test_default_acl && test_default_acl(dvp)) {
                if (!_ACL_ALLOC(default_acl))
                        return -ENOMEM;
index fe2bfd29580284878f88fd235544aa36b82e5401..d10db09f616424956de4ff79c8f98559db694512 100644 (file)
@@ -1389,6 +1389,9 @@ struct tree_descr { char *name; struct file_operations *ops; int mode; };
 extern int simple_fill_super(struct super_block *, int, struct tree_descr *);
 extern int simple_pin_fs(char *name, struct vfsmount **mount, int *count);
 extern void simple_release_fs(struct vfsmount **mount, int *count);
+extern int old_valid_dev(dev_t);
+extern u16 old_encode_dev(dev_t);
+extern dev_t old_decode_dev(u16);
 
 extern int inode_change_ok(struct inode *, struct iattr *);
 extern int inode_setattr(struct inode *, struct iattr *);