|
@@ -33,7 +33,7 @@ static int jffs2_do_setattr (struct inode *inode, struct iattr *iattr)
|
|
|
struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
|
|
|
struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
|
|
|
struct jffs2_raw_inode *ri;
|
|
|
- unsigned short dev;
|
|
|
+ union jffs2_device_node dev;
|
|
|
unsigned char *mdata = NULL;
|
|
|
int mdatalen = 0;
|
|
|
unsigned int ivalid;
|
|
@@ -51,9 +51,8 @@ static int jffs2_do_setattr (struct inode *inode, struct iattr *iattr)
|
|
|
it out again with the appropriate data attached */
|
|
|
if (S_ISBLK(inode->i_mode) || S_ISCHR(inode->i_mode)) {
|
|
|
/* For these, we don't actually need to read the old node */
|
|
|
- dev = old_encode_dev(inode->i_rdev);
|
|
|
+ mdatalen = jffs2_encode_dev(&dev, inode->i_rdev);
|
|
|
mdata = (char *)&dev;
|
|
|
- mdatalen = sizeof(dev);
|
|
|
D1(printk(KERN_DEBUG "jffs2_setattr(): Writing %d bytes of kdev_t\n", mdatalen));
|
|
|
} else if (S_ISLNK(inode->i_mode)) {
|
|
|
down(&f->sem);
|
|
@@ -232,6 +231,8 @@ void jffs2_read_inode (struct inode *inode)
|
|
|
struct jffs2_inode_info *f;
|
|
|
struct jffs2_sb_info *c;
|
|
|
struct jffs2_raw_inode latest_node;
|
|
|
+ union jffs2_device_node jdev;
|
|
|
+ dev_t rdev = 0;
|
|
|
int ret;
|
|
|
|
|
|
D1(printk(KERN_DEBUG "jffs2_read_inode(): inode->i_ino == %lu\n", inode->i_ino));
|
|
@@ -263,7 +264,6 @@ void jffs2_read_inode (struct inode *inode)
|
|
|
inode->i_blocks = (inode->i_size + 511) >> 9;
|
|
|
|
|
|
switch (inode->i_mode & S_IFMT) {
|
|
|
- jint16_t rdev;
|
|
|
|
|
|
case S_IFLNK:
|
|
|
inode->i_op = &jffs2_symlink_inode_operations;
|
|
@@ -297,8 +297,16 @@ void jffs2_read_inode (struct inode *inode)
|
|
|
case S_IFBLK:
|
|
|
case S_IFCHR:
|
|
|
/* Read the device numbers from the media */
|
|
|
+ if (f->metadata->size != sizeof(jdev.old) &&
|
|
|
+ f->metadata->size != sizeof(jdev.new)) {
|
|
|
+ printk(KERN_NOTICE "Device node has strange size %d\n", f->metadata->size);
|
|
|
+ up(&f->sem);
|
|
|
+ jffs2_do_clear_inode(c, f);
|
|
|
+ make_bad_inode(inode);
|
|
|
+ return;
|
|
|
+ }
|
|
|
D1(printk(KERN_DEBUG "Reading device numbers from flash\n"));
|
|
|
- if (jffs2_read_dnode(c, f, f->metadata, (char *)&rdev, 0, sizeof(rdev)) < 0) {
|
|
|
+ if (jffs2_read_dnode(c, f, f->metadata, (char *)&jdev, 0, f->metadata->size) < 0) {
|
|
|
/* Eep */
|
|
|
printk(KERN_NOTICE "Read device numbers for inode %lu failed\n", (unsigned long)inode->i_ino);
|
|
|
up(&f->sem);
|
|
@@ -306,12 +314,15 @@ void jffs2_read_inode (struct inode *inode)
|
|
|
make_bad_inode(inode);
|
|
|
return;
|
|
|
}
|
|
|
+ if (f->metadata->size == sizeof(jdev.old))
|
|
|
+ rdev = old_decode_dev(je16_to_cpu(jdev.old));
|
|
|
+ else
|
|
|
+ rdev = new_decode_dev(je32_to_cpu(jdev.new));
|
|
|
|
|
|
case S_IFSOCK:
|
|
|
case S_IFIFO:
|
|
|
inode->i_op = &jffs2_file_inode_operations;
|
|
|
- init_special_inode(inode, inode->i_mode,
|
|
|
- old_decode_dev((je16_to_cpu(rdev))));
|
|
|
+ init_special_inode(inode, inode->i_mode, rdev);
|
|
|
break;
|
|
|
|
|
|
default:
|