aboutsummaryrefslogtreecommitdiffstats
path: root/fs/jffs2/dir.c
diff options
context:
space:
mode:
authorDavid Woodhouse <dwmw2@infradead.org>2006-05-18 19:28:49 -0400
committerDavid Woodhouse <dwmw2@infradead.org>2006-05-18 19:28:49 -0400
commitaef9ab47841af45888d950baa6448072cc70bdd5 (patch)
tree79545ddc225f64bc38fa04525ac4125c86202cb8 /fs/jffs2/dir.c
parentf6a673b3f4f93c1c50e1b18f29254b0531b722a8 (diff)
[JFFS2] Support new device nodes
Device node major/minor numbers are just stored in the payload of a single data node. Just extend that to 4 bytes and use new_encode_dev() for it. We only use the 4-byte format if we _need_ to, if !old_valid_dev(foo). This preserves backwards compatibility with older code as much as possible. If we do make devices with major or minor numbers above 255, and then mount the file system with the old code, it'll just read the first two bytes and get the numbers wrong. If it comes to garbage-collect it, it'll then write back those wrong numbers. But that's about the best we can expect. Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Diffstat (limited to 'fs/jffs2/dir.c')
-rw-r--r--fs/jffs2/dir.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c
index 1c8e8c0f6cea..a6c11cef1b73 100644
--- a/fs/jffs2/dir.c
+++ b/fs/jffs2/dir.c
@@ -591,12 +591,12 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de
591 struct jffs2_full_dnode *fn; 591 struct jffs2_full_dnode *fn;
592 struct jffs2_full_dirent *fd; 592 struct jffs2_full_dirent *fd;
593 int namelen; 593 int namelen;
594 jint16_t dev; 594 union jffs2_device_node dev;
595 int devlen = 0; 595 int devlen = 0;
596 uint32_t alloclen, phys_ofs; 596 uint32_t alloclen, phys_ofs;
597 int ret; 597 int ret;
598 598
599 if (!old_valid_dev(rdev)) 599 if (!new_valid_dev(rdev))
600 return -EINVAL; 600 return -EINVAL;
601 601
602 ri = jffs2_alloc_raw_inode(); 602 ri = jffs2_alloc_raw_inode();
@@ -605,17 +605,15 @@ static int jffs2_mknod (struct inode *dir_i, struct dentry *dentry, int mode, de
605 605
606 c = JFFS2_SB_INFO(dir_i->i_sb); 606 c = JFFS2_SB_INFO(dir_i->i_sb);
607 607
608 if (S_ISBLK(mode) || S_ISCHR(mode)) { 608 if (S_ISBLK(mode) || S_ISCHR(mode))
609 dev = cpu_to_je16(old_encode_dev(rdev)); 609 devlen = jffs2_encode_dev(&dev, rdev);
610 devlen = sizeof(dev);
611 }
612 610
613 /* Try to reserve enough space for both node and dirent. 611 /* Try to reserve enough space for both node and dirent.
614 * Just the node will do for now, though 612 * Just the node will do for now, though
615 */ 613 */
616 namelen = dentry->d_name.len; 614 namelen = dentry->d_name.len;
617 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &phys_ofs, &alloclen, 615 ret = jffs2_reserve_space(c, sizeof(*ri) + devlen, &phys_ofs, &alloclen,
618 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE); 616 ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
619 617
620 if (ret) { 618 if (ret) {
621 jffs2_free_raw_inode(ri); 619 jffs2_free_raw_inode(ri);