summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Viro <viro@www.linux.org.uk>2003-09-04 20:54:44 -0700
committerLinus Torvalds <torvalds@home.osdl.org>2003-09-04 20:54:44 -0700
commitec55b83db70e2dd10feae0b0cff2fc29dfdbdeb7 (patch)
tree7256486c1a20af157b3f605ab2d3fb4eb0344f19
parentd84b5b0b136c253e8d29e41be6ce363384f82927 (diff)
[PATCH] large dev_t - second series (11/15)
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.
-rw-r--r--fs/jfs/jfs_imap.c7
-rw-r--r--fs/jfs/jfs_incore.h3
-rw-r--r--fs/jfs/jfs_mount.c2
-rw-r--r--fs/jfs/namei.c3
4 files changed, 9 insertions, 6 deletions
diff --git a/fs/jfs/jfs_imap.c b/fs/jfs/jfs_imap.c
index 7ee8f04862cc..cb40b149bd12 100644
--- a/fs/jfs/jfs_imap.c
+++ b/fs/jfs/jfs_imap.c
@@ -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
diff --git a/fs/jfs/jfs_incore.h b/fs/jfs/jfs_incore.h
index 2164d5cdfc10..15a99b075387 100644
--- a/fs/jfs/jfs_incore.h
+++ b/fs/jfs/jfs_incore.h
@@ -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 */
diff --git a/fs/jfs/jfs_mount.c b/fs/jfs/jfs_mount.c
index b97311299412..4180b7c87d8d 100644
--- a/fs/jfs/jfs_mount.c
+++ b/fs/jfs/jfs_mount.c
@@ -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));
}
diff --git a/fs/jfs/namei.c b/fs/jfs/namei.c
index ee62b39ee46c..71f3ccf53b77 100644
--- a/fs/jfs/namei.c
+++ b/fs/jfs/namei.c
@@ -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);