diff options
author | David Woodhouse <dwmw2@infradead.org> | 2006-05-18 19:28:49 -0400 |
---|---|---|
committer | David Woodhouse <dwmw2@infradead.org> | 2006-05-18 19:28:49 -0400 |
commit | aef9ab47841af45888d950baa6448072cc70bdd5 (patch) | |
tree | 79545ddc225f64bc38fa04525ac4125c86202cb8 /fs/jffs2/dir.c | |
parent | f6a673b3f4f93c1c50e1b18f29254b0531b722a8 (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.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/fs/jffs2/dir.c b/fs/jffs2/dir.c index 1c8e8c0f6ce..a6c11cef1b7 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); |