2 * JFFS2 -- Journalling Flash File System, Version 2.
4 * Copyright (C) 2001, 2002 Red Hat, Inc.
6 * Created by David Woodhouse <dwmw2@cambridge.redhat.com>
8 * For licensing information, see the file 'LICENCE' in this directory.
10 * $Id: fs.c,v 1.24 2003/04/29 09:52:58 dwmw2 Exp $
14 #include <linux/config.h>
15 #include <linux/kernel.h>
16 #include <linux/sched.h>
18 #include <linux/list.h>
19 #include <linux/mtd/mtd.h>
20 #include <linux/pagemap.h>
21 #include <linux/slab.h>
22 #include <linux/vfs.h>
25 int jffs2_statfs(struct super_block
*sb
, struct kstatfs
*buf
)
27 struct jffs2_sb_info
*c
= JFFS2_SB_INFO(sb
);
30 buf
->f_type
= JFFS2_SUPER_MAGIC
;
31 buf
->f_bsize
= 1 << PAGE_SHIFT
;
32 buf
->f_blocks
= c
->flash_size
>> PAGE_SHIFT
;
35 buf
->f_namelen
= JFFS2_MAX_NAME_LEN
;
37 spin_lock(&c
->erase_completion_lock
);
39 avail
= c
->dirty_size
+ c
->free_size
;
40 if (avail
> c
->sector_size
* JFFS2_RESERVED_BLOCKS_WRITE
)
41 avail
-= c
->sector_size
* JFFS2_RESERVED_BLOCKS_WRITE
;
45 buf
->f_bavail
= buf
->f_bfree
= avail
>> PAGE_SHIFT
;
47 D1(jffs2_dump_block_lists(c
));
49 spin_unlock(&c
->erase_completion_lock
);
55 void jffs2_clear_inode (struct inode
*inode
)
57 /* We can forget about this inode for now - drop all
58 * the nodelists associated with it, etc.
60 struct jffs2_sb_info
*c
= JFFS2_SB_INFO(inode
->i_sb
);
61 struct jffs2_inode_info
*f
= JFFS2_INODE_INFO(inode
);
63 D1(printk(KERN_DEBUG
"jffs2_clear_inode(): ino #%lu mode %o\n", inode
->i_ino
, inode
->i_mode
));
65 jffs2_do_clear_inode(c
, f
);
68 void jffs2_read_inode (struct inode
*inode
)
70 struct jffs2_inode_info
*f
;
71 struct jffs2_sb_info
*c
;
72 struct jffs2_raw_inode latest_node
;
75 D1(printk(KERN_DEBUG
"jffs2_read_inode(): inode->i_ino == %lu\n", inode
->i_ino
));
77 f
= JFFS2_INODE_INFO(inode
);
78 c
= JFFS2_SB_INFO(inode
->i_sb
);
80 jffs2_init_inode_info(f
);
82 ret
= jffs2_do_read_inode(c
, f
, inode
->i_ino
, &latest_node
);
85 make_bad_inode(inode
);
89 inode
->i_mode
= jemode_to_cpu(latest_node
.mode
);
90 inode
->i_uid
= je16_to_cpu(latest_node
.uid
);
91 inode
->i_gid
= je16_to_cpu(latest_node
.gid
);
92 inode
->i_size
= je32_to_cpu(latest_node
.isize
);
93 inode
->i_atime
= ITIME(je32_to_cpu(latest_node
.atime
));
94 inode
->i_mtime
= ITIME(je32_to_cpu(latest_node
.mtime
));
95 inode
->i_ctime
= ITIME(je32_to_cpu(latest_node
.ctime
));
97 inode
->i_nlink
= f
->inocache
->nlink
;
99 inode
->i_blksize
= PAGE_SIZE
;
100 inode
->i_blocks
= (inode
->i_size
+ 511) >> 9;
102 switch (inode
->i_mode
& S_IFMT
) {
106 inode
->i_op
= &jffs2_symlink_inode_operations
;
111 struct jffs2_full_dirent
*fd
;
113 for (fd
=f
->dents
; fd
; fd
= fd
->next
) {
114 if (fd
->type
== DT_DIR
&& fd
->ino
)
119 /* Root dir gets i_nlink 3 for some reason */
120 if (inode
->i_ino
== 1)
123 inode
->i_op
= &jffs2_dir_inode_operations
;
124 inode
->i_fop
= &jffs2_dir_operations
;
128 inode
->i_op
= &jffs2_file_inode_operations
;
129 inode
->i_fop
= &jffs2_file_operations
;
130 inode
->i_mapping
->a_ops
= &jffs2_file_address_operations
;
131 inode
->i_mapping
->nrpages
= 0;
136 /* Read the device numbers from the media */
137 D1(printk(KERN_DEBUG
"Reading device numbers from flash\n"));
138 if (jffs2_read_dnode(c
, f
->metadata
, (char *)&rdev
, 0, sizeof(rdev
)) < 0) {
140 printk(KERN_NOTICE
"Read device numbers for inode %lu failed\n", (unsigned long)inode
->i_ino
);
142 jffs2_do_clear_inode(c
, f
);
143 make_bad_inode(inode
);
149 inode
->i_op
= &jffs2_file_inode_operations
;
150 init_special_inode(inode
, inode
->i_mode
, kdev_t_to_nr(mk_kdev(je16_to_cpu(rdev
)>>8, je16_to_cpu(rdev
)&0xff)));
154 printk(KERN_WARNING
"jffs2_read_inode(): Bogus imode %o for ino %lu\n", inode
->i_mode
, (unsigned long)inode
->i_ino
);
159 D1(printk(KERN_DEBUG
"jffs2_read_inode() returning\n"));
163 int jffs2_remount_fs (struct super_block
*sb
, int *flags
, char *data
)
165 struct jffs2_sb_info
*c
= JFFS2_SB_INFO(sb
);
167 if (c
->flags
& JFFS2_SB_FLAG_RO
&& !(sb
->s_flags
& MS_RDONLY
))
170 /* We stop if it was running, then restart if it needs to.
171 This also catches the case where it was stopped and this
172 is just a remount to restart it */
173 if (!(sb
->s_flags
& MS_RDONLY
))
174 jffs2_stop_garbage_collect_thread(c
);
176 if (!(*flags
& MS_RDONLY
))
177 jffs2_start_garbage_collect_thread(c
);
179 sb
->s_flags
= (sb
->s_flags
& ~MS_RDONLY
)|(*flags
& MS_RDONLY
);
184 void jffs2_write_super (struct super_block
*sb
)
186 struct jffs2_sb_info
*c
= JFFS2_SB_INFO(sb
);
189 if (sb
->s_flags
& MS_RDONLY
)
192 D1(printk(KERN_DEBUG
"jffs2_write_super()\n"));
193 jffs2_garbage_collect_trigger(c
);
194 jffs2_erase_pending_blocks(c
);
198 /* jffs2_new_inode: allocate a new inode and inocache, add it to the hash,
199 fill in the raw_inode while you're at it. */
200 struct inode
*jffs2_new_inode (struct inode
*dir_i
, int mode
, struct jffs2_raw_inode
*ri
)
203 struct super_block
*sb
= dir_i
->i_sb
;
204 struct jffs2_sb_info
*c
;
205 struct jffs2_inode_info
*f
;
208 D1(printk(KERN_DEBUG
"jffs2_new_inode(): dir_i %ld, mode 0x%x\n", dir_i
->i_ino
, mode
));
210 c
= JFFS2_SB_INFO(sb
);
212 inode
= new_inode(sb
);
215 return ERR_PTR(-ENOMEM
);
217 f
= JFFS2_INODE_INFO(inode
);
218 jffs2_init_inode_info(f
);
220 memset(ri
, 0, sizeof(*ri
));
221 /* Set OS-specific defaults for new inodes */
222 ri
->uid
= cpu_to_je16(current
->fsuid
);
224 if (dir_i
->i_mode
& S_ISGID
) {
225 ri
->gid
= cpu_to_je16(dir_i
->i_gid
);
229 ri
->gid
= cpu_to_je16(current
->fsgid
);
231 ri
->mode
= cpu_to_jemode(mode
);
232 ret
= jffs2_do_new_inode (c
, f
, mode
, ri
);
234 make_bad_inode(inode
);
239 inode
->i_ino
= je32_to_cpu(ri
->ino
);
240 inode
->i_mode
= jemode_to_cpu(ri
->mode
);
241 inode
->i_gid
= je16_to_cpu(ri
->gid
);
242 inode
->i_uid
= je16_to_cpu(ri
->uid
);
243 inode
->i_atime
= inode
->i_ctime
= inode
->i_mtime
= CURRENT_TIME
;
244 ri
->atime
= ri
->mtime
= ri
->ctime
= cpu_to_je32(I_SEC(inode
->i_mtime
));
246 inode
->i_blksize
= PAGE_SIZE
;
250 insert_inode_hash(inode
);
256 int jffs2_do_fill_super(struct super_block
*sb
, void *data
, int silent
)
258 struct jffs2_sb_info
*c
;
259 struct inode
*root_i
;
263 c
= JFFS2_SB_INFO(sb
);
265 c
->flash_size
= c
->mtd
->size
;
268 * Check, if we have to concatenate physical blocks to larger virtual blocks
269 * to reduce the memorysize for c->blocks. (kmalloc allows max. 128K allocation)
271 blocks
= c
->flash_size
/ c
->mtd
->erasesize
;
272 while ((blocks
* sizeof (struct jffs2_eraseblock
)) > (128 * 1024))
275 c
->sector_size
= c
->flash_size
/ blocks
;
276 if (c
->sector_size
!= c
->mtd
->erasesize
)
277 printk(KERN_INFO
"jffs2: Erase block size too small (%dKiB). Using virtual blocks size (%dKiB) instead\n",
278 c
->mtd
->erasesize
/ 1024, c
->sector_size
/ 1024);
280 if (c
->flash_size
< 5*c
->sector_size
) {
281 printk(KERN_ERR
"jffs2: Too few erase blocks (%d)\n", c
->flash_size
/ c
->sector_size
);
285 c
->cleanmarker_size
= sizeof(struct jffs2_unknown_node
);
286 /* Joern -- stick alignment for weird 8-byte-page flash here */
288 if (jffs2_cleanmarker_oob(c
)) {
289 /* Cleanmarker is out-of-band, so inline size zero */
290 c
->cleanmarker_size
= 0;
293 if (c
->mtd
->type
== MTD_NANDFLASH
) {
294 /* Initialise write buffer */
295 c
->wbuf_pagesize
= c
->mtd
->oobblock
;
296 c
->wbuf_ofs
= 0xFFFFFFFF;
297 c
->wbuf
= kmalloc(c
->wbuf_pagesize
, GFP_KERNEL
);
301 /* Initialise process for timed wbuf flush */
302 INIT_WORK(&c
->wbuf_task
,(void*) jffs2_wbuf_process
, (void *)c
);
304 /* Initialise timer for timed wbuf flush */
305 init_timer(&c
->wbuf_timer
);
306 c
->wbuf_timer
.function
= jffs2_wbuf_timeout
;
307 c
->wbuf_timer
.data
= (unsigned long) c
;
310 c
->inocache_list
= kmalloc(INOCACHE_HASHSIZE
* sizeof(struct jffs2_inode_cache
*), GFP_KERNEL
);
311 if (!c
->inocache_list
) {
315 memset(c
->inocache_list
, 0, INOCACHE_HASHSIZE
* sizeof(struct jffs2_inode_cache
*));
317 if ((ret
= jffs2_do_mount_fs(c
)))
322 D1(printk(KERN_DEBUG
"jffs2_do_fill_super(): Getting root inode\n"));
323 root_i
= iget(sb
, 1);
324 if (is_bad_inode(root_i
)) {
325 D1(printk(KERN_WARNING
"get root inode failed\n"));
329 D1(printk(KERN_DEBUG
"jffs2_do_fill_super(): d_alloc_root()\n"));
330 sb
->s_root
= d_alloc_root(root_i
);
334 #if LINUX_VERSION_CODE >= 0x20403
335 sb
->s_maxbytes
= 0xFFFFFFFF;
337 sb
->s_blocksize
= PAGE_CACHE_SIZE
;
338 sb
->s_blocksize_bits
= PAGE_CACHE_SHIFT
;
339 sb
->s_magic
= JFFS2_SUPER_MAGIC
;
340 if (!(sb
->s_flags
& MS_RDONLY
))
341 jffs2_start_garbage_collect_thread(c
);
347 jffs2_free_ino_caches(c
);
348 jffs2_free_raw_node_refs(c
);
351 kfree(c
->inocache_list
);