diff options
author | Artem Bityutskiy <dedekind@infradead.org> | 2006-10-04 12:15:21 -0400 |
---|---|---|
committer | Frank Haverkamp <haver@vnet.ibm.com> | 2007-04-27 07:24:08 -0400 |
commit | 0029da3bf430eea498eee8cef5933f9214534b8a (patch) | |
tree | 8fd93094f370e5bde1640df97764ac56d3f118ba /fs | |
parent | 801c135ce73d5df1caf3eca35b66a10824ae0707 (diff) |
JFFS2: add UBI support
This patch make JFFS2 able to work with UBI volumes via the emulated MTD
devices which are directly mapped to these volumes.
Signed-off-by: Artem Bityutskiy <dedekind@infradead.org>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/jffs2/fs.c | 12 | ||||
-rw-r--r-- | fs/jffs2/os-linux.h | 6 | ||||
-rw-r--r-- | fs/jffs2/wbuf.c | 24 |
3 files changed, 42 insertions, 0 deletions
diff --git a/fs/jffs2/fs.c b/fs/jffs2/fs.c index abb90c0c09cc..8a649f602767 100644 --- a/fs/jffs2/fs.c +++ b/fs/jffs2/fs.c | |||
@@ -672,6 +672,13 @@ static int jffs2_flash_setup(struct jffs2_sb_info *c) { | |||
672 | return ret; | 672 | return ret; |
673 | } | 673 | } |
674 | 674 | ||
675 | /* and an UBI volume */ | ||
676 | if (jffs2_ubivol(c)) { | ||
677 | ret = jffs2_ubivol_setup(c); | ||
678 | if (ret) | ||
679 | return ret; | ||
680 | } | ||
681 | |||
675 | return ret; | 682 | return ret; |
676 | } | 683 | } |
677 | 684 | ||
@@ -690,4 +697,9 @@ void jffs2_flash_cleanup(struct jffs2_sb_info *c) { | |||
690 | if (jffs2_nor_wbuf_flash(c)) { | 697 | if (jffs2_nor_wbuf_flash(c)) { |
691 | jffs2_nor_wbuf_flash_cleanup(c); | 698 | jffs2_nor_wbuf_flash_cleanup(c); |
692 | } | 699 | } |
700 | |||
701 | /* and an UBI volume */ | ||
702 | if (jffs2_ubivol(c)) { | ||
703 | jffs2_ubivol_cleanup(c); | ||
704 | } | ||
693 | } | 705 | } |
diff --git a/fs/jffs2/os-linux.h b/fs/jffs2/os-linux.h index e07a0edcdb4f..8d92e45168ca 100644 --- a/fs/jffs2/os-linux.h +++ b/fs/jffs2/os-linux.h | |||
@@ -98,6 +98,9 @@ static inline void jffs2_init_inode_info(struct jffs2_inode_info *f) | |||
98 | #define jffs2_nor_wbuf_flash(c) (0) | 98 | #define jffs2_nor_wbuf_flash(c) (0) |
99 | #define jffs2_nor_wbuf_flash_setup(c) (0) | 99 | #define jffs2_nor_wbuf_flash_setup(c) (0) |
100 | #define jffs2_nor_wbuf_flash_cleanup(c) do {} while (0) | 100 | #define jffs2_nor_wbuf_flash_cleanup(c) do {} while (0) |
101 | #define jffs2_ubivol(c) (0) | ||
102 | #define jffs2_ubivol_setup(c) (0) | ||
103 | #define jffs2_ubivol_cleanup(c) do {} while (0) | ||
101 | 104 | ||
102 | #else /* NAND and/or ECC'd NOR support present */ | 105 | #else /* NAND and/or ECC'd NOR support present */ |
103 | 106 | ||
@@ -133,6 +136,9 @@ void jffs2_nand_flash_cleanup(struct jffs2_sb_info *c); | |||
133 | #define jffs2_dataflash(c) (c->mtd->type == MTD_DATAFLASH) | 136 | #define jffs2_dataflash(c) (c->mtd->type == MTD_DATAFLASH) |
134 | int jffs2_dataflash_setup(struct jffs2_sb_info *c); | 137 | int jffs2_dataflash_setup(struct jffs2_sb_info *c); |
135 | void jffs2_dataflash_cleanup(struct jffs2_sb_info *c); | 138 | void jffs2_dataflash_cleanup(struct jffs2_sb_info *c); |
139 | #define jffs2_ubivol(c) (c->mtd->type == MTD_UBIVOLUME) | ||
140 | int jffs2_ubivol_setup(struct jffs2_sb_info *c); | ||
141 | void jffs2_ubivol_cleanup(struct jffs2_sb_info *c); | ||
136 | 142 | ||
137 | #define jffs2_nor_wbuf_flash(c) (c->mtd->type == MTD_NORFLASH && ! (c->mtd->flags & MTD_BIT_WRITEABLE)) | 143 | #define jffs2_nor_wbuf_flash(c) (c->mtd->type == MTD_NORFLASH && ! (c->mtd->flags & MTD_BIT_WRITEABLE)) |
138 | int jffs2_nor_wbuf_flash_setup(struct jffs2_sb_info *c); | 144 | int jffs2_nor_wbuf_flash_setup(struct jffs2_sb_info *c); |
diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c index 4fac6dd53954..ab86031b3c07 100644 --- a/fs/jffs2/wbuf.c +++ b/fs/jffs2/wbuf.c | |||
@@ -1208,3 +1208,27 @@ int jffs2_nor_wbuf_flash_setup(struct jffs2_sb_info *c) { | |||
1208 | void jffs2_nor_wbuf_flash_cleanup(struct jffs2_sb_info *c) { | 1208 | void jffs2_nor_wbuf_flash_cleanup(struct jffs2_sb_info *c) { |
1209 | kfree(c->wbuf); | 1209 | kfree(c->wbuf); |
1210 | } | 1210 | } |
1211 | |||
1212 | int jffs2_ubivol_setup(struct jffs2_sb_info *c) { | ||
1213 | c->cleanmarker_size = 0; | ||
1214 | |||
1215 | if (c->mtd->writesize == 1) | ||
1216 | /* We do not need write-buffer */ | ||
1217 | return 0; | ||
1218 | |||
1219 | init_rwsem(&c->wbuf_sem); | ||
1220 | |||
1221 | c->wbuf_pagesize = c->mtd->writesize; | ||
1222 | c->wbuf_ofs = 0xFFFFFFFF; | ||
1223 | c->wbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL); | ||
1224 | if (!c->wbuf) | ||
1225 | return -ENOMEM; | ||
1226 | |||
1227 | printk(KERN_INFO "JFFS2 write-buffering enabled buffer (%d) erasesize (%d)\n", c->wbuf_pagesize, c->sector_size); | ||
1228 | |||
1229 | return 0; | ||
1230 | } | ||
1231 | |||
1232 | void jffs2_ubivol_cleanup(struct jffs2_sb_info *c) { | ||
1233 | kfree(c->wbuf); | ||
1234 | } | ||