]> git.hungrycats.org Git - linux/commitdiff
[PATCH] large dev_t - second series (12/15)
authorAlexander Viro <viro@www.linux.org.uk>
Fri, 5 Sep 2003 03:54:53 +0000 (20:54 -0700)
committerLinus Torvalds <torvalds@home.osdl.org>
Fri, 5 Sep 2003 03:54:53 +0000 (20:54 -0700)
Similar fix for UFS; touching device node (and they have 32bit
dev_t) ends up killing upper 16 bits, which makes for very unhappy
*BSD, since that turns /dev/ad0s1 into alias of /dev/ad0.  Again, for
now we store on-disk value in private part of inode and use it instead
of ->i_rdev in ->write_inode().

fs/ufs/inode.c
fs/ufs/namei.c

index f8c113bd3677b26e521a73bb87f3394299e4676e..647c7bef96800b25a5e11bddaed1fe2bb6b91ec6 100644 (file)
@@ -475,6 +475,7 @@ void ufs_read_inode (struct inode * inode)
        struct ufs_sb_private_info * uspi;
        struct ufs_inode * ufs_inode;   
        struct buffer_head * bh;
+       mode_t mode;
        unsigned i;
        unsigned flags;
        
@@ -500,7 +501,7 @@ void ufs_read_inode (struct inode * inode)
        /*
         * Copy data to the in-core inode.
         */
-       inode->i_mode = fs16_to_cpu(sb, ufs_inode->ui_mode);
+       inode->i_mode = mode = fs16_to_cpu(sb, ufs_inode->ui_mode);
        inode->i_nlink = fs16_to_cpu(sb, ufs_inode->ui_nlink);
        if (inode->i_nlink == 0)
                ufs_error (sb, "ufs_read_inode", "inode %lu has zero nlink\n", inode->i_ino);
@@ -527,9 +528,7 @@ void ufs_read_inode (struct inode * inode)
        ufsi->i_oeftflag = fs32_to_cpu(sb, ufs_inode->ui_u3.ui_sun.ui_oeftflag);
        ufsi->i_lastfrag = (inode->i_size + uspi->s_fsize - 1) >> uspi->s_fshift;
        
-       if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
-               ;
-       else if (inode->i_blocks) {
+       if (S_ISCHR(mode) || S_ISBLK(mode) || inode->i_blocks) {
                for (i = 0; i < (UFS_NDADDR + UFS_NINDIR); i++)
                        ufsi->i_u1.i_data[i] = ufs_inode->ui_u2.ui_addr.ui_db[i];
        }
@@ -555,7 +554,7 @@ void ufs_read_inode (struct inode * inode)
                }
        } else
                init_special_inode(inode, inode->i_mode,
-                       fs32_to_cpu(sb, ufs_inode->ui_u2.ui_addr.ui_db[0]));
+                       old_decode_dev(fs32_to_cpu(sb, ufsi->i_u1.i_data[0])));
 
        brelse (bh);
 
@@ -618,9 +617,10 @@ static int ufs_update_inode(struct inode * inode, int do_sync)
                ufs_inode->ui_u3.ui_sun.ui_oeftflag = cpu_to_fs32(sb, ufsi->i_oeftflag);
        }
 
-       if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode))
-               ufs_inode->ui_u2.ui_addr.ui_db[0] = cpu_to_fs32(sb, inode->i_rdev);
-       else if (inode->i_blocks) {
+       if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode)) {
+               /* ufs_inode->ui_u2.ui_addr.ui_db[0] = cpu_to_fs32(sb, inode->i_rdev); */
+               ufs_inode->ui_u2.ui_addr.ui_db[0] = ufsi->i_u1.i_data[0];
+       } else if (inode->i_blocks) {
                for (i = 0; i < (UFS_NDADDR + UFS_NINDIR); i++)
                        ufs_inode->ui_u2.ui_addr.ui_db[i] = ufsi->i_u1.i_data[i];
        }
index e59b6a81e558badb653f9e4e5e1b53bc0901e2a6..224d2c08d771d522e2a13798cf8ca7dc51dbef0d 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/ufs_fs.h>
 #include <linux/smp_lock.h>
 #include <linux/buffer_head.h>
+#include "swab.h"      /* will go away - see comment in mknod() */
 
 #undef UFS_NAMEI_DEBUG
 
@@ -118,6 +119,9 @@ static int ufs_mknod (struct inode * dir, struct dentry *dentry, int mode, dev_t
        int err = PTR_ERR(inode);
        if (!IS_ERR(inode)) {
                init_special_inode(inode, mode, rdev);
+               /* NOTE: that'll go when we get wide dev_t */
+               UFS_I(inode)->i_u1.i_data[0] = cpu_to_fs32(inode->i_sb,
+                                                       old_encode_dev(rdev));
                mark_inode_dirty(inode);
                lock_kernel();
                err = ufs_add_nondir(dentry, inode);