Merge with Linux 2.5.74.
[linux-2.6/linux-mips.git] / fs / jffs2 / fs.c
blob4c43d597d0aabbbc1dfa7bdc78cb58f056da3df7
1 /*
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>
17 #include <linux/fs.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>
23 #include "nodelist.h"
25 int jffs2_statfs(struct super_block *sb, struct kstatfs *buf)
27 struct jffs2_sb_info *c = JFFS2_SB_INFO(sb);
28 unsigned long avail;
30 buf->f_type = JFFS2_SUPER_MAGIC;
31 buf->f_bsize = 1 << PAGE_SHIFT;
32 buf->f_blocks = c->flash_size >> PAGE_SHIFT;
33 buf->f_files = 0;
34 buf->f_ffree = 0;
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;
42 else
43 avail = 0;
45 buf->f_bavail = buf->f_bfree = avail >> PAGE_SHIFT;
47 D1(jffs2_dump_block_lists(c));
49 spin_unlock(&c->erase_completion_lock);
51 return 0;
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;
73 int ret;
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);
84 if (ret) {
85 make_bad_inode(inode);
86 up(&f->sem);
87 return;
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) {
103 jint16_t rdev;
105 case S_IFLNK:
106 inode->i_op = &jffs2_symlink_inode_operations;
107 break;
109 case S_IFDIR:
111 struct jffs2_full_dirent *fd;
113 for (fd=f->dents; fd; fd = fd->next) {
114 if (fd->type == DT_DIR && fd->ino)
115 inode->i_nlink++;
117 /* and '..' */
118 inode->i_nlink++;
119 /* Root dir gets i_nlink 3 for some reason */
120 if (inode->i_ino == 1)
121 inode->i_nlink++;
123 inode->i_op = &jffs2_dir_inode_operations;
124 inode->i_fop = &jffs2_dir_operations;
125 break;
127 case S_IFREG:
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;
132 break;
134 case S_IFBLK:
135 case S_IFCHR:
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) {
139 /* Eep */
140 printk(KERN_NOTICE "Read device numbers for inode %lu failed\n", (unsigned long)inode->i_ino);
141 up(&f->sem);
142 jffs2_do_clear_inode(c, f);
143 make_bad_inode(inode);
144 return;
147 case S_IFSOCK:
148 case S_IFIFO:
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)));
151 break;
153 default:
154 printk(KERN_WARNING "jffs2_read_inode(): Bogus imode %o for ino %lu\n", inode->i_mode, (unsigned long)inode->i_ino);
157 up(&f->sem);
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))
168 return -EROFS;
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);
181 return 0;
184 void jffs2_write_super (struct super_block *sb)
186 struct jffs2_sb_info *c = JFFS2_SB_INFO(sb);
187 sb->s_dirt = 0;
189 if (sb->s_flags & MS_RDONLY)
190 return;
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)
202 struct inode *inode;
203 struct super_block *sb = dir_i->i_sb;
204 struct jffs2_sb_info *c;
205 struct jffs2_inode_info *f;
206 int ret;
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);
214 if (!inode)
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);
226 if (S_ISDIR(mode))
227 mode |= S_ISGID;
228 } else {
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);
233 if (ret) {
234 make_bad_inode(inode);
235 iput(inode);
236 return ERR_PTR(ret);
238 inode->i_nlink = 1;
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;
247 inode->i_blocks = 0;
248 inode->i_size = 0;
250 insert_inode_hash(inode);
252 return 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;
260 int ret;
261 size_t blocks;
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))
273 blocks >>= 1;
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);
282 return -EINVAL;
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);
298 if (!c->wbuf)
299 return -ENOMEM;
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) {
312 ret = -ENOMEM;
313 goto out_wbuf;
315 memset(c->inocache_list, 0, INOCACHE_HASHSIZE * sizeof(struct jffs2_inode_cache *));
317 if ((ret = jffs2_do_mount_fs(c)))
318 goto out_inohash;
320 ret = -EINVAL;
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"));
326 goto out_nodes;
329 D1(printk(KERN_DEBUG "jffs2_do_fill_super(): d_alloc_root()\n"));
330 sb->s_root = d_alloc_root(root_i);
331 if (!sb->s_root)
332 goto out_root_i;
334 #if LINUX_VERSION_CODE >= 0x20403
335 sb->s_maxbytes = 0xFFFFFFFF;
336 #endif
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);
342 return 0;
344 out_root_i:
345 iput(root_i);
346 out_nodes:
347 jffs2_free_ino_caches(c);
348 jffs2_free_raw_node_refs(c);
349 kfree(c->blocks);
350 out_inohash:
351 kfree(c->inocache_list);
352 out_wbuf:
353 if (c->wbuf)
354 kfree(c->wbuf);
355 return ret;