From e89e1d3be6007d317f78fc28d00a92059eeedbdd Mon Sep 17 00:00:00 2001 From: Alexander Viro Date: Thu, 4 Sep 2003 20:54:53 -0700 Subject: [PATCH] [PATCH] large dev_t - second series (12/15) 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 | 16 ++++++++-------- fs/ufs/namei.c | 4 ++++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/fs/ufs/inode.c b/fs/ufs/inode.c index f8c113bd3677b..647c7bef96800 100644 --- a/fs/ufs/inode.c +++ b/fs/ufs/inode.c @@ -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]; } diff --git a/fs/ufs/namei.c b/fs/ufs/namei.c index e59b6a81e558b..224d2c08d771d 100644 --- a/fs/ufs/namei.c +++ b/fs/ufs/namei.c @@ -29,6 +29,7 @@ #include #include #include +#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); -- 2.53.0