]> git.hungrycats.org Git - linux/commitdiff
[PATCH] large dev_t - second series (11/15)
authorAlexander Viro <viro@www.linux.org.uk>
Fri, 5 Sep 2003 03:54:44 +0000 (20:54 -0700)
committerLinus Torvalds <torvalds@home.osdl.org>
Fri, 5 Sep 2003 03:54:44 +0000 (20:54 -0700)
Fix for JFS handling of device nodes; it has 32bit on-disk device
numbers, shoves them into 16bit (->i_rdev) when inode is read and writes
them back truncated when inode is written to disk.  For now (and 2.4 will
have to do the same permanently) we store the original value in private
part of inode and use it instead of ->i_rdev in ->write_inode(); mknod()
sets it at the same time as ->i_rdev.  It will become unnecessary when
dev_t becomes wider than 16 bits, but for now we need it.

fs/jfs/jfs_imap.c
fs/jfs/jfs_incore.h
fs/jfs/jfs_mount.c
fs/jfs/namei.c

index 7ee8f04862cc3ccebb0ec87d07dd73c1c2aef6c4..cb40b149bd1260b99de0a008b8a76c596335af48 100644 (file)
@@ -3041,9 +3041,10 @@ static int copy_from_dinode(struct dinode * dip, struct inode *ip)
        jfs_ip->next_index = le32_to_cpu(dip->di_next_index);
        jfs_ip->otime = le32_to_cpu(dip->di_otime.tv_sec);
        jfs_ip->acltype = le32_to_cpu(dip->di_acltype);
+       jfs_ip->dev = le32_to_cpu(dip->di_rdev);
 
        if (S_ISCHR(ip->i_mode) || S_ISBLK(ip->i_mode))
-               ip->i_rdev = le32_to_cpu(dip->di_rdev);
+               ip->i_rdev = old_decode_dev(jfs_ip->dev);
 
        if (S_ISDIR(ip->i_mode)) {
                memcpy(&jfs_ip->i_dirtable, &dip->di_dirtable, 384);
@@ -3100,9 +3101,7 @@ static void copy_to_dinode(struct dinode * dip, struct inode *ip)
        dip->di_otime.tv_sec = cpu_to_le32(jfs_ip->otime);
        dip->di_otime.tv_nsec = 0;
        dip->di_acltype = cpu_to_le32(jfs_ip->acltype);
-
-       if (S_ISCHR(ip->i_mode) || S_ISBLK(ip->i_mode))
-               dip->di_rdev = cpu_to_le32(ip->i_rdev);
+       dip->di_rdev = cpu_to_le32(jfs_ip->dev);
 }
 
 #ifdef _JFS_DEBUG_IMAP
index 2164d5cdfc1004c815ed1acfdd07649c27a252ec..15a99b0753871b87c7623a9effc7fffccb3506af 100644 (file)
@@ -93,6 +93,7 @@ struct jfs_inode_info {
                        unchar _inline_ea[128]; /* 128: inline extended attr */
                } link;
        } u;
+       u32 dev;        /* will die when we get wide dev_t */
        struct inode    vfs_inode;
 };
 #define i_xtroot u.file._xtroot
@@ -143,7 +144,7 @@ struct jfs_sb_info {
        short           nbperpage;      /* blocks per page              */
        short           l2nbperpage;    /* log2 blocks per page */
        short           l2niperblk;     /* log2 inodes per page */
-       u32             logdev;         /* external log device  */
+       dev_t           logdev;         /* external log device  */
        uint            aggregate;      /* volume identifier in log record */
        pxd_t           logpxd;         /* pxd describing log   */
        pxd_t           fsckpxd;        /* pxd describing fsck wkspc */
index b97311299412a58f1626d2adbefa53d4b6e06e87..4180b7c87d8d87209c72ad20577fbdea7a875a6f 100644 (file)
@@ -395,7 +395,7 @@ static int chkSuper(struct super_block *sb)
        if (sbi->mntflag & JFS_INLINELOG)
                sbi->logpxd = j_sb->s_logpxd;
        else {
-               sbi->logdev = le32_to_cpu(j_sb->s_logdev);
+               sbi->logdev = old_decode_dev(le32_to_cpu(j_sb->s_logdev));
                memcpy(sbi->uuid, j_sb->s_uuid, sizeof(sbi->uuid));
                memcpy(sbi->loguuid, j_sb->s_loguuid, sizeof(sbi->uuid));
        }
index ee62b39ee46c1045fcf222061ae4b87cda5d2027..71f3ccf53b771f5e06805b37fd14ee8436cc46ea 100644 (file)
@@ -1302,6 +1302,7 @@ int jfs_rename(struct inode *old_dir, struct dentry *old_dentry,
  */
 int jfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
 {
+       struct jfs_inode_info *jfs_ip;
        struct btstack btstack;
        struct component_name dname;
        ino_t ino;
@@ -1324,6 +1325,7 @@ int jfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
                rc = -ENOSPC;
                goto out1;
        }
+       jfs_ip = JFS_IP(ip);
 
        tid = txBegin(dir->i_sb, 0);
 
@@ -1342,6 +1344,7 @@ int jfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t rdev)
                goto out3;
 
        ip->i_op = &jfs_file_inode_operations;
+       jfs_ip->dev = old_encode_dev(rdev);
        init_special_inode(ip, ip->i_mode, rdev);
 
        insert_inode_hash(ip);