2 * JFFS -- Journalling Flash File System, Linux implementation.
4 * Copyright (C) 1999, 2000 Axis Communications AB.
6 * Created by Finn Hakansson <finn@axis.com>.
8 * This is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * $Id: inode-v23.c,v 1.70 2001/10/02 09:16:02 dwmw2 Exp $
15 * Ported to Linux 2.3.x and MTD:
16 * Copyright (C) 2000 Alexander Larsson (alex@cendio.se), Cendio Systems AB
18 * Copyright 2000, 2001 Red Hat, Inc.
21 /* inode.c -- Contains the code that is called from the VFS. */
24 * uid and gid are just 16 bit.
25 * jffs_file_write reads from user-space pointers without xx_from_user
26 * maybe other stuff do to.
29 #include <linux/time.h>
31 #include <linux/module.h>
32 #include <linux/init.h>
33 #include <linux/types.h>
34 #include <linux/errno.h>
35 #include <linux/slab.h>
36 #include <linux/jffs.h>
38 #include <linux/smp_lock.h>
39 #include <linux/ioctl.h>
40 #include <linux/stat.h>
41 #include <linux/blkdev.h>
42 #include <linux/quotaops.h>
43 #include <linux/highmem.h>
44 #include <linux/vfs.h>
45 #include <asm/semaphore.h>
46 #include <asm/byteorder.h>
47 #include <asm/uaccess.h>
51 #ifdef CONFIG_JFFS_PROC_FS
52 #include "jffs_proc.h"
55 static int jffs_remove(struct inode
*dir
, struct dentry
*dentry
, int type
);
57 static struct super_operations jffs_ops
;
58 static struct file_operations jffs_file_operations
;
59 static struct inode_operations jffs_file_inode_operations
;
60 static struct file_operations jffs_dir_operations
;
61 static struct inode_operations jffs_dir_inode_operations
;
62 static struct address_space_operations jffs_address_operations
;
64 kmem_cache_t
*node_cache
= NULL
;
65 kmem_cache_t
*fm_cache
= NULL
;
67 /* Called by the VFS at mount time to initialize the whole file system. */
68 static int jffs_fill_super(struct super_block
*sb
, void *data
, int silent
)
70 struct inode
*root_inode
;
71 struct jffs_control
*c
;
73 sb
->s_flags
|= MS_NODIRATIME
;
75 D1(printk(KERN_NOTICE
"JFFS: Trying to mount device %s.\n",
78 if (MAJOR(sb
->s_dev
) != MTD_BLOCK_MAJOR
) {
79 printk(KERN_WARNING
"JFFS: Trying to mount a "
84 sb
->s_blocksize
= PAGE_CACHE_SIZE
;
85 sb
->s_blocksize_bits
= PAGE_CACHE_SHIFT
;
86 sb
->s_fs_info
= (void *) 0;
87 sb
->s_maxbytes
= 0xFFFFFFFF;
89 /* Build the file system. */
90 if (jffs_build_fs(sb
) < 0) {
95 * set up enough so that we can read an inode
97 sb
->s_magic
= JFFS_MAGIC_SB_BITMASK
;
100 root_inode
= iget(sb
, JFFS_MIN_INO
);
104 /* Get the root directory of this file system. */
105 if (!(sb
->s_root
= d_alloc_root(root_inode
))) {
109 c
= (struct jffs_control
*) sb
->s_fs_info
;
111 #ifdef CONFIG_JFFS_PROC_FS
112 /* Set up the jffs proc file system. */
113 if (jffs_register_jffs_proc_dir(MINOR(sb
->s_dev
), c
) < 0) {
114 printk(KERN_WARNING
"JFFS: Failed to initialize the JFFS "
115 "proc file system for device %s.\n",
120 /* Set the Garbage Collection thresholds */
122 /* GC if free space goes below 5% of the total size */
123 c
->gc_minfree_threshold
= c
->fmc
->flash_size
/ 20;
125 if (c
->gc_minfree_threshold
< c
->fmc
->sector_size
)
126 c
->gc_minfree_threshold
= c
->fmc
->sector_size
;
128 /* GC if dirty space exceeds 33% of the total size. */
129 c
->gc_maxdirty_threshold
= c
->fmc
->flash_size
/ 3;
131 if (c
->gc_maxdirty_threshold
< c
->fmc
->sector_size
)
132 c
->gc_maxdirty_threshold
= c
->fmc
->sector_size
;
135 c
->thread_pid
= kernel_thread (jffs_garbage_collect_thread
,
138 D1(printk(KERN_NOTICE
"JFFS: GC thread pid=%d.\n", (int) c
->thread_pid
));
140 D1(printk(KERN_NOTICE
"JFFS: Successfully mounted device %s.\n",
147 jffs_cleanup_control((struct jffs_control
*)sb
->s_fs_info
);
149 printk(KERN_WARNING
"JFFS: Failed to mount device %s.\n",
155 /* This function is called when the file system is umounted. */
157 jffs_put_super(struct super_block
*sb
)
159 struct jffs_control
*c
= (struct jffs_control
*) sb
->s_fs_info
;
161 D2(printk("jffs_put_super()\n"));
163 #ifdef CONFIG_JFFS_PROC_FS
164 jffs_unregister_jffs_proc_dir(c
);
168 D1(printk (KERN_NOTICE
"jffs_put_super(): Telling gc thread to die.\n"));
169 send_sig(SIGKILL
, c
->gc_task
, 1);
171 wait_for_completion(&c
->gc_thread_comp
);
173 D1(printk (KERN_NOTICE
"jffs_put_super(): Successfully waited on thread.\n"));
175 jffs_cleanup_control((struct jffs_control
*)sb
->s_fs_info
);
176 D1(printk(KERN_NOTICE
"JFFS: Successfully unmounted device %s.\n",
181 /* This function is called when user commands like chmod, chgrp and
182 chown are executed. System calls like trunc() results in a call
185 jffs_setattr(struct dentry
*dentry
, struct iattr
*iattr
)
187 struct inode
*inode
= dentry
->d_inode
;
188 struct jffs_raw_inode raw_inode
;
189 struct jffs_control
*c
;
190 struct jffs_fmcontrol
*fmc
;
192 struct jffs_node
*new_node
;
199 if ((res
= inode_change_ok(inode
, iattr
)))
202 c
= (struct jffs_control
*)inode
->i_sb
->s_fs_info
;
205 D3(printk (KERN_NOTICE
"notify_change(): down biglock\n"));
208 f
= jffs_find_file(c
, inode
->i_ino
);
211 printk("jffs_setattr(): Invalid inode number: %lu\n",
213 D3(printk (KERN_NOTICE
"notify_change(): up biglock\n"));
219 D1(printk("***jffs_setattr(): file: \"%s\", ino: %u\n",
222 update_all
= iattr
->ia_valid
& ATTR_FORCE
;
224 if ( (update_all
|| iattr
->ia_valid
& ATTR_SIZE
)
225 && (iattr
->ia_size
+ 128 < f
->size
) ) {
226 /* We're shrinking the file by more than 128 bytes.
227 We'll be able to GC and recover this space, so
228 allow it to go into the reserved space. */
232 if (!(new_node
= jffs_alloc_node())) {
233 D(printk("jffs_setattr(): Allocation failed!\n"));
234 D3(printk (KERN_NOTICE
"notify_change(): up biglock\n"));
240 new_node
->data_offset
= 0;
241 new_node
->removed_size
= 0;
242 raw_inode
.magic
= JFFS_MAGIC_BITMASK
;
243 raw_inode
.ino
= f
->ino
;
244 raw_inode
.pino
= f
->pino
;
245 raw_inode
.mode
= f
->mode
;
246 raw_inode
.uid
= f
->uid
;
247 raw_inode
.gid
= f
->gid
;
248 raw_inode
.atime
= f
->atime
;
249 raw_inode
.mtime
= f
->mtime
;
250 raw_inode
.ctime
= f
->ctime
;
252 raw_inode
.offset
= 0;
255 raw_inode
.nsize
= f
->nsize
;
256 raw_inode
.nlink
= f
->nlink
;
258 raw_inode
.rename
= 0;
259 raw_inode
.deleted
= 0;
261 if (update_all
|| iattr
->ia_valid
& ATTR_MODE
) {
262 raw_inode
.mode
= iattr
->ia_mode
;
263 inode
->i_mode
= iattr
->ia_mode
;
265 if (update_all
|| iattr
->ia_valid
& ATTR_UID
) {
266 raw_inode
.uid
= iattr
->ia_uid
;
267 inode
->i_uid
= iattr
->ia_uid
;
269 if (update_all
|| iattr
->ia_valid
& ATTR_GID
) {
270 raw_inode
.gid
= iattr
->ia_gid
;
271 inode
->i_gid
= iattr
->ia_gid
;
273 if (update_all
|| iattr
->ia_valid
& ATTR_SIZE
) {
275 D1(printk("jffs_notify_change(): Changing size "
276 "to %lu bytes!\n", (long)iattr
->ia_size
));
277 raw_inode
.offset
= iattr
->ia_size
;
279 /* Calculate how many bytes need to be removed from
281 if (f
->size
< iattr
->ia_size
) {
285 len
= f
->size
- iattr
->ia_size
;
288 raw_inode
.rsize
= len
;
290 /* The updated node will be a removal node, with
291 base at the new size and size of the nbr of bytes
293 new_node
->data_offset
= iattr
->ia_size
;
294 new_node
->removed_size
= len
;
295 inode
->i_size
= iattr
->ia_size
;
296 inode
->i_blocks
= (inode
->i_size
+ 511) >> 9;
299 invalidate_inode_pages(inode
->i_mapping
);
301 inode
->i_ctime
= CURRENT_TIME_SEC
;
302 inode
->i_mtime
= inode
->i_ctime
;
304 if (update_all
|| iattr
->ia_valid
& ATTR_ATIME
) {
305 raw_inode
.atime
= iattr
->ia_atime
.tv_sec
;
306 inode
->i_atime
= iattr
->ia_atime
;
308 if (update_all
|| iattr
->ia_valid
& ATTR_MTIME
) {
309 raw_inode
.mtime
= iattr
->ia_mtime
.tv_sec
;
310 inode
->i_mtime
= iattr
->ia_mtime
;
312 if (update_all
|| iattr
->ia_valid
& ATTR_CTIME
) {
313 raw_inode
.ctime
= iattr
->ia_ctime
.tv_sec
;
314 inode
->i_ctime
= iattr
->ia_ctime
;
317 /* Write this node to the flash. */
318 if ((res
= jffs_write_node(c
, new_node
, &raw_inode
, f
->name
, NULL
, recoverable
, f
)) < 0) {
319 D(printk("jffs_notify_change(): The write failed!\n"));
320 jffs_free_node(new_node
);
321 D3(printk (KERN_NOTICE
"n_c(): up biglock\n"));
322 up(&c
->fmc
->biglock
);
326 jffs_insert_node(c
, f
, &raw_inode
, NULL
, new_node
);
328 mark_inode_dirty(inode
);
329 D3(printk (KERN_NOTICE
"n_c(): up biglock\n"));
330 up(&c
->fmc
->biglock
);
334 } /* jffs_notify_change() */
337 static struct inode
*
338 jffs_new_inode(const struct inode
* dir
, struct jffs_raw_inode
*raw_inode
,
341 struct super_block
* sb
;
342 struct inode
* inode
;
343 struct jffs_control
*c
;
347 inode
= new_inode(sb
);
353 c
= (struct jffs_control
*)sb
->s_fs_info
;
355 inode
->i_ino
= raw_inode
->ino
;
356 inode
->i_mode
= raw_inode
->mode
;
357 inode
->i_nlink
= raw_inode
->nlink
;
358 inode
->i_uid
= raw_inode
->uid
;
359 inode
->i_gid
= raw_inode
->gid
;
360 inode
->i_size
= raw_inode
->dsize
;
361 inode
->i_atime
.tv_sec
= raw_inode
->atime
;
362 inode
->i_mtime
.tv_sec
= raw_inode
->mtime
;
363 inode
->i_ctime
.tv_sec
= raw_inode
->ctime
;
364 inode
->i_ctime
.tv_nsec
= 0;
365 inode
->i_mtime
.tv_nsec
= 0;
366 inode
->i_atime
.tv_nsec
= 0;
367 inode
->i_blksize
= PAGE_SIZE
;
368 inode
->i_blocks
= (inode
->i_size
+ 511) >> 9;
370 f
= jffs_find_file(c
, raw_inode
->ino
);
372 inode
->u
.generic_ip
= (void *)f
;
373 insert_inode_hash(inode
);
378 /* Get statistics of the file system. */
380 jffs_statfs(struct super_block
*sb
, struct kstatfs
*buf
)
382 struct jffs_control
*c
= (struct jffs_control
*) sb
->s_fs_info
;
383 struct jffs_fmcontrol
*fmc
;
389 D2(printk("jffs_statfs()\n"));
391 buf
->f_type
= JFFS_MAGIC_SB_BITMASK
;
392 buf
->f_bsize
= PAGE_CACHE_SIZE
;
393 buf
->f_blocks
= (fmc
->flash_size
/ PAGE_CACHE_SIZE
)
394 - (fmc
->min_free_size
/ PAGE_CACHE_SIZE
);
395 buf
->f_bfree
= (jffs_free_size1(fmc
) + jffs_free_size2(fmc
) +
396 fmc
->dirty_size
- fmc
->min_free_size
)
398 buf
->f_bavail
= buf
->f_bfree
;
400 /* Find out how many files there are in the filesystem. */
401 buf
->f_files
= jffs_foreach_file(c
, jffs_file_count
);
402 buf
->f_ffree
= buf
->f_bfree
;
403 /* buf->f_fsid = 0; */
404 buf
->f_namelen
= JFFS_MAX_NAME_LEN
;
414 jffs_rename(struct inode
*old_dir
, struct dentry
*old_dentry
,
415 struct inode
*new_dir
, struct dentry
*new_dentry
)
417 struct jffs_raw_inode raw_inode
;
418 struct jffs_control
*c
;
419 struct jffs_file
*old_dir_f
;
420 struct jffs_file
*new_dir_f
;
421 struct jffs_file
*del_f
;
423 struct jffs_node
*node
;
426 __u32 rename_data
= 0;
428 D2(printk("***jffs_rename()\n"));
430 D(printk("jffs_rename(): old_dir: 0x%p, old name: 0x%p, "
431 "new_dir: 0x%p, new name: 0x%p\n",
432 old_dir
, old_dentry
->d_name
.name
,
433 new_dir
, new_dentry
->d_name
.name
));
436 c
= (struct jffs_control
*)old_dir
->i_sb
->s_fs_info
;
438 printk(KERN_ERR
"jffs_rename(): The old_dir inode "
439 "didn't have a reference to a jffs_file struct\n");
445 if (!(old_dir_f
= (struct jffs_file
*)old_dir
->u
.generic_ip
)) {
446 D(printk("jffs_rename(): Old dir invalid.\n"));
447 goto jffs_rename_end
;
450 /* Try to find the file to move. */
452 if (!(f
= jffs_find_child(old_dir_f
, old_dentry
->d_name
.name
,
453 old_dentry
->d_name
.len
))) {
454 goto jffs_rename_end
;
457 /* Find the new directory. */
459 if (!(new_dir_f
= (struct jffs_file
*)new_dir
->u
.generic_ip
)) {
460 D(printk("jffs_rename(): New dir invalid.\n"));
461 goto jffs_rename_end
;
463 D3(printk (KERN_NOTICE
"rename(): down biglock\n"));
464 down(&c
->fmc
->biglock
);
465 /* Create a node and initialize as much as needed. */
467 if (!(node
= jffs_alloc_node())) {
468 D(printk("jffs_rename(): Allocation failed: node == 0\n"));
469 goto jffs_rename_end
;
471 node
->data_offset
= 0;
472 node
->removed_size
= 0;
474 /* Initialize the raw inode. */
475 raw_inode
.magic
= JFFS_MAGIC_BITMASK
;
476 raw_inode
.ino
= f
->ino
;
477 raw_inode
.pino
= new_dir_f
->ino
;
478 /* raw_inode.version = f->highest_version + 1; */
479 raw_inode
.mode
= f
->mode
;
480 raw_inode
.uid
= current
->fsuid
;
481 raw_inode
.gid
= current
->fsgid
;
483 raw_inode
.uid
= f
->uid
;
484 raw_inode
.gid
= f
->gid
;
486 raw_inode
.atime
= get_seconds();
487 raw_inode
.mtime
= raw_inode
.atime
;
488 raw_inode
.ctime
= f
->ctime
;
489 raw_inode
.offset
= 0;
492 raw_inode
.nsize
= new_dentry
->d_name
.len
;
493 raw_inode
.nlink
= f
->nlink
;
495 raw_inode
.rename
= 0;
496 raw_inode
.deleted
= 0;
498 /* See if there already exists a file with the same name as
500 if ((del_f
= jffs_find_child(new_dir_f
, new_dentry
->d_name
.name
,
501 new_dentry
->d_name
.len
))) {
502 raw_inode
.rename
= 1;
503 raw_inode
.dsize
= sizeof(__u32
);
504 rename_data
= del_f
->ino
;
507 /* Write the new node to the flash memory. */
508 if ((result
= jffs_write_node(c
, node
, &raw_inode
,
509 new_dentry
->d_name
.name
,
510 (unsigned char*)&rename_data
, 0, f
)) < 0) {
511 D(printk("jffs_rename(): Failed to write node to flash.\n"));
512 jffs_free_node(node
);
513 goto jffs_rename_end
;
517 if (raw_inode
.rename
) {
518 /* The file with the same name must be deleted. */
519 //FIXME deadlock down(&c->fmc->gclock);
520 if ((result
= jffs_remove(new_dir
, new_dentry
,
522 /* This is really bad. */
523 printk(KERN_ERR
"JFFS: An error occurred in "
526 // up(&c->fmc->gclock);
529 if (old_dir_f
!= new_dir_f
) {
530 /* Remove the file from its old position in the
532 jffs_unlink_file_from_tree(f
);
535 /* Insert the new node into the file system. */
536 if ((result
= jffs_insert_node(c
, f
, &raw_inode
,
537 new_dentry
->d_name
.name
, node
)) < 0) {
538 D(printk(KERN_ERR
"jffs_rename(): jffs_insert_node() "
542 if (old_dir_f
!= new_dir_f
) {
543 /* Insert the file to its new position in the
545 jffs_insert_file_into_tree(f
);
548 /* This is a kind of update of the inode we're about to make
549 here. This is what they do in ext2fs. Kind of. */
550 if ((inode
= iget(new_dir
->i_sb
, f
->ino
))) {
551 inode
->i_ctime
= CURRENT_TIME_SEC
;
552 mark_inode_dirty(inode
);
557 D3(printk (KERN_NOTICE
"rename(): up biglock\n"));
558 up(&c
->fmc
->biglock
);
561 } /* jffs_rename() */
564 /* Read the contents of a directory. Used by programs like `ls'
567 jffs_readdir(struct file
*filp
, void *dirent
, filldir_t filldir
)
570 struct dentry
*dentry
= filp
->f_dentry
;
571 struct inode
*inode
= dentry
->d_inode
;
572 struct jffs_control
*c
= (struct jffs_control
*)inode
->i_sb
->s_fs_info
;
576 D3(printk (KERN_NOTICE
"readdir(): down biglock\n"));
577 down(&c
->fmc
->biglock
);
579 D2(printk("jffs_readdir(): inode: 0x%p, filp: 0x%p\n", inode
, filp
));
580 if (filp
->f_pos
== 0) {
581 D3(printk("jffs_readdir(): \".\" %lu\n", inode
->i_ino
));
582 if (filldir(dirent
, ".", 1, filp
->f_pos
, inode
->i_ino
, DT_DIR
) < 0) {
583 D3(printk (KERN_NOTICE
"readdir(): up biglock\n"));
584 up(&c
->fmc
->biglock
);
590 if (filp
->f_pos
== 1) {
591 if (inode
->i_ino
== JFFS_MIN_INO
) {
592 ddino
= JFFS_MIN_INO
;
595 ddino
= ((struct jffs_file
*)
596 inode
->u
.generic_ip
)->pino
;
598 D3(printk("jffs_readdir(): \"..\" %u\n", ddino
));
599 if (filldir(dirent
, "..", 2, filp
->f_pos
, ddino
, DT_DIR
) < 0) {
600 D3(printk (KERN_NOTICE
"readdir(): up biglock\n"));
601 up(&c
->fmc
->biglock
);
607 f
= ((struct jffs_file
*)inode
->u
.generic_ip
)->children
;
610 while(f
&& (f
->deleted
|| j
++ < filp
->f_pos
)) {
615 D3(printk("jffs_readdir(): \"%s\" ino: %u\n",
616 (f
->name
? f
->name
: ""), f
->ino
));
617 if (filldir(dirent
, f
->name
, f
->nsize
,
618 filp
->f_pos
, f
->ino
, DT_UNKNOWN
) < 0) {
619 D3(printk (KERN_NOTICE
"readdir(): up biglock\n"));
620 up(&c
->fmc
->biglock
);
627 } while(f
&& f
->deleted
);
629 D3(printk (KERN_NOTICE
"readdir(): up biglock\n"));
630 up(&c
->fmc
->biglock
);
633 } /* jffs_readdir() */
636 /* Find a file in a directory. If the file exists, return its
637 corresponding dentry. */
638 static struct dentry
*
639 jffs_lookup(struct inode
*dir
, struct dentry
*dentry
, struct nameidata
*nd
)
643 struct jffs_control
*c
= (struct jffs_control
*)dir
->i_sb
->s_fs_info
;
647 struct inode
*inode
= NULL
;
649 len
= dentry
->d_name
.len
;
650 name
= dentry
->d_name
.name
;
655 char *s
= (char *)kmalloc(len
+ 1, GFP_KERNEL
);
656 memcpy(s
, name
, len
);
658 printk("jffs_lookup(): dir: 0x%p, name: \"%s\"\n", dir
, s
);
662 D3(printk (KERN_NOTICE
"lookup(): down biglock\n"));
663 down(&c
->fmc
->biglock
);
666 if (len
> JFFS_MAX_NAME_LEN
) {
667 goto jffs_lookup_end
;
671 if (!(d
= (struct jffs_file
*)dir
->u
.generic_ip
)) {
672 D(printk("jffs_lookup(): No such inode! (%lu)\n",
674 goto jffs_lookup_end
;
677 /* Get the corresponding inode to the file. */
679 /* iget calls jffs_read_inode, so we need to drop the biglock
680 before calling iget. Unfortunately, the GC has a tendency
681 to sneak in here, because iget sometimes calls schedule ().
684 if ((len
== 1) && (name
[0] == '.')) {
685 D3(printk (KERN_NOTICE
"lookup(): up biglock\n"));
686 up(&c
->fmc
->biglock
);
687 if (!(inode
= iget(dir
->i_sb
, d
->ino
))) {
688 D(printk("jffs_lookup(): . iget() ==> NULL\n"));
689 goto jffs_lookup_end_no_biglock
;
691 D3(printk (KERN_NOTICE
"lookup(): down biglock\n"));
692 down(&c
->fmc
->biglock
);
693 } else if ((len
== 2) && (name
[0] == '.') && (name
[1] == '.')) {
694 D3(printk (KERN_NOTICE
"lookup(): up biglock\n"));
695 up(&c
->fmc
->biglock
);
696 if (!(inode
= iget(dir
->i_sb
, d
->pino
))) {
697 D(printk("jffs_lookup(): .. iget() ==> NULL\n"));
698 goto jffs_lookup_end_no_biglock
;
700 D3(printk (KERN_NOTICE
"lookup(): down biglock\n"));
701 down(&c
->fmc
->biglock
);
702 } else if ((f
= jffs_find_child(d
, name
, len
))) {
703 D3(printk (KERN_NOTICE
"lookup(): up biglock\n"));
704 up(&c
->fmc
->biglock
);
705 if (!(inode
= iget(dir
->i_sb
, f
->ino
))) {
706 D(printk("jffs_lookup(): iget() ==> NULL\n"));
707 goto jffs_lookup_end_no_biglock
;
709 D3(printk (KERN_NOTICE
"lookup(): down biglock\n"));
710 down(&c
->fmc
->biglock
);
712 D3(printk("jffs_lookup(): Couldn't find the file. "
713 "f = 0x%p, name = \"%s\", d = 0x%p, d->ino = %u\n",
714 f
, name
, d
, d
->ino
));
718 d_add(dentry
, inode
);
719 D3(printk (KERN_NOTICE
"lookup(): up biglock\n"));
720 up(&c
->fmc
->biglock
);
725 D3(printk (KERN_NOTICE
"lookup(): up biglock\n"));
726 up(&c
->fmc
->biglock
);
728 jffs_lookup_end_no_biglock
:
731 } /* jffs_lookup() */
734 /* Try to read a page of data from a file. */
736 jffs_do_readpage_nolock(struct file
*file
, struct page
*page
)
739 unsigned long read_len
;
741 struct inode
*inode
= (struct inode
*)page
->mapping
->host
;
742 struct jffs_file
*f
= (struct jffs_file
*)inode
->u
.generic_ip
;
743 struct jffs_control
*c
= (struct jffs_control
*)inode
->i_sb
->s_fs_info
;
747 D2(printk("***jffs_readpage(): file = \"%s\", page->index = %lu\n",
748 (f
->name
? f
->name
: ""), (long)page
->index
));
751 /* Don't SetPageLocked(page), should be locked already */
752 ClearPageUptodate(page
);
753 ClearPageError(page
);
755 D3(printk (KERN_NOTICE
"readpage(): down biglock\n"));
756 down(&c
->fmc
->biglock
);
760 offset
= page
->index
<< PAGE_CACHE_SHIFT
;
763 buf
= page_address(page
);
764 if (offset
< inode
->i_size
) {
765 read_len
= min_t(long, inode
->i_size
- offset
, PAGE_SIZE
);
766 r
= jffs_read_data(f
, buf
, offset
, read_len
);
770 printk("***jffs_readpage(): Read error! "
771 "Wanted to read %lu bytes but only "
772 "read %d bytes.\n", read_len
, r
);
778 /* This handles the case of partial or no read in above */
779 if(read_len
< PAGE_SIZE
)
780 memset(buf
+ read_len
, 0, PAGE_SIZE
- read_len
);
781 flush_dcache_page(page
);
784 D3(printk (KERN_NOTICE
"readpage(): up biglock\n"));
785 up(&c
->fmc
->biglock
);
790 SetPageUptodate(page
);
793 page_cache_release(page
);
795 D3(printk("jffs_readpage(): Leaving...\n"));
798 } /* jffs_do_readpage_nolock() */
800 static int jffs_readpage(struct file
*file
, struct page
*page
)
802 int ret
= jffs_do_readpage_nolock(file
, page
);
807 /* Create a new directory. */
809 jffs_mkdir(struct inode
*dir
, struct dentry
*dentry
, int mode
)
811 struct jffs_raw_inode raw_inode
;
812 struct jffs_control
*c
;
813 struct jffs_node
*node
;
814 struct jffs_file
*dir_f
;
821 int len
= dentry
->d_name
.len
;
822 char *_name
= (char *) kmalloc(len
+ 1, GFP_KERNEL
);
823 memcpy(_name
, dentry
->d_name
.name
, len
);
825 printk("***jffs_mkdir(): dir = 0x%p, name = \"%s\", "
826 "len = %d, mode = 0x%08x\n", dir
, _name
, len
, mode
);
831 dir_f
= (struct jffs_file
*)dir
->u
.generic_ip
;
834 printk(KERN_ERR
"jffs_mkdir(): No reference to a "
835 "jffs_file struct in inode.\n");
841 D3(printk (KERN_NOTICE
"mkdir(): down biglock\n"));
842 down(&c
->fmc
->biglock
);
844 dir_mode
= S_IFDIR
| (mode
& (S_IRWXUGO
|S_ISVTX
)
845 & ~current
->fs
->umask
);
846 if (dir
->i_mode
& S_ISGID
) {
850 /* Create a node and initialize it as much as needed. */
851 if (!(node
= jffs_alloc_node())) {
852 D(printk("jffs_mkdir(): Allocation failed: node == 0\n"));
856 node
->data_offset
= 0;
857 node
->removed_size
= 0;
859 /* Initialize the raw inode. */
860 raw_inode
.magic
= JFFS_MAGIC_BITMASK
;
861 raw_inode
.ino
= c
->next_ino
++;
862 raw_inode
.pino
= dir_f
->ino
;
863 raw_inode
.version
= 1;
864 raw_inode
.mode
= dir_mode
;
865 raw_inode
.uid
= current
->fsuid
;
866 raw_inode
.gid
= (dir
->i_mode
& S_ISGID
) ? dir
->i_gid
: current
->fsgid
;
867 /* raw_inode.gid = current->fsgid; */
868 raw_inode
.atime
= get_seconds();
869 raw_inode
.mtime
= raw_inode
.atime
;
870 raw_inode
.ctime
= raw_inode
.atime
;
871 raw_inode
.offset
= 0;
874 raw_inode
.nsize
= dentry
->d_name
.len
;
877 raw_inode
.rename
= 0;
878 raw_inode
.deleted
= 0;
880 /* Write the new node to the flash. */
881 if ((result
= jffs_write_node(c
, node
, &raw_inode
,
882 dentry
->d_name
.name
, NULL
, 0, NULL
)) < 0) {
883 D(printk("jffs_mkdir(): jffs_write_node() failed.\n"));
884 jffs_free_node(node
);
888 /* Insert the new node into the file system. */
889 if ((result
= jffs_insert_node(c
, NULL
, &raw_inode
, dentry
->d_name
.name
,
894 inode
= jffs_new_inode(dir
, &raw_inode
, &err
);
900 inode
->i_op
= &jffs_dir_inode_operations
;
901 inode
->i_fop
= &jffs_dir_operations
;
903 mark_inode_dirty(dir
);
904 d_instantiate(dentry
, inode
);
908 D3(printk (KERN_NOTICE
"mkdir(): up biglock\n"));
909 up(&c
->fmc
->biglock
);
915 /* Remove a directory. */
917 jffs_rmdir(struct inode
*dir
, struct dentry
*dentry
)
919 struct jffs_control
*c
= (struct jffs_control
*)dir
->i_sb
->s_fs_info
;
921 D3(printk("***jffs_rmdir()\n"));
922 D3(printk (KERN_NOTICE
"rmdir(): down biglock\n"));
924 down(&c
->fmc
->biglock
);
925 ret
= jffs_remove(dir
, dentry
, S_IFDIR
);
926 D3(printk (KERN_NOTICE
"rmdir(): up biglock\n"));
927 up(&c
->fmc
->biglock
);
933 /* Remove any kind of file except for directories. */
935 jffs_unlink(struct inode
*dir
, struct dentry
*dentry
)
937 struct jffs_control
*c
= (struct jffs_control
*)dir
->i_sb
->s_fs_info
;
941 D3(printk("***jffs_unlink()\n"));
942 D3(printk (KERN_NOTICE
"unlink(): down biglock\n"));
943 down(&c
->fmc
->biglock
);
944 ret
= jffs_remove(dir
, dentry
, 0);
945 D3(printk (KERN_NOTICE
"unlink(): up biglock\n"));
946 up(&c
->fmc
->biglock
);
952 /* Remove a JFFS entry, i.e. plain files, directories, etc. Here we
953 shouldn't test for free space on the device. */
955 jffs_remove(struct inode
*dir
, struct dentry
*dentry
, int type
)
957 struct jffs_raw_inode raw_inode
;
958 struct jffs_control
*c
;
959 struct jffs_file
*dir_f
; /* The file-to-remove's parent. */
960 struct jffs_file
*del_f
; /* The file to remove. */
961 struct jffs_node
*del_node
;
962 struct inode
*inode
= NULL
;
966 int len
= dentry
->d_name
.len
;
967 const char *name
= dentry
->d_name
.name
;
968 char *_name
= (char *) kmalloc(len
+ 1, GFP_KERNEL
);
969 memcpy(_name
, name
, len
);
971 printk("***jffs_remove(): file = \"%s\", ino = %ld\n", _name
, dentry
->d_inode
->i_ino
);
975 dir_f
= (struct jffs_file
*) dir
->u
.generic_ip
;
979 if (!(del_f
= jffs_find_child(dir_f
, dentry
->d_name
.name
,
980 dentry
->d_name
.len
))) {
981 D(printk("jffs_remove(): jffs_find_child() failed.\n"));
982 goto jffs_remove_end
;
986 struct jffs_file
*child
= del_f
->children
;
988 if( !child
->deleted
) {
990 goto jffs_remove_end
;
992 child
= child
->sibling_next
;
995 else if (S_ISDIR(del_f
->mode
)) {
996 D(printk("jffs_remove(): node is a directory "
997 "but it shouldn't be.\n"));
999 goto jffs_remove_end
;
1002 inode
= dentry
->d_inode
;
1005 if (del_f
->ino
!= inode
->i_ino
)
1006 goto jffs_remove_end
;
1008 if (!inode
->i_nlink
) {
1009 printk("Deleting nonexistent file inode: %lu, nlink: %d\n",
1010 inode
->i_ino
, inode
->i_nlink
);
1014 /* Create a node for the deletion. */
1016 if (!(del_node
= jffs_alloc_node())) {
1017 D(printk("jffs_remove(): Allocation failed!\n"));
1018 goto jffs_remove_end
;
1020 del_node
->data_offset
= 0;
1021 del_node
->removed_size
= 0;
1023 /* Initialize the raw inode. */
1024 raw_inode
.magic
= JFFS_MAGIC_BITMASK
;
1025 raw_inode
.ino
= del_f
->ino
;
1026 raw_inode
.pino
= del_f
->pino
;
1027 /* raw_inode.version = del_f->highest_version + 1; */
1028 raw_inode
.mode
= del_f
->mode
;
1029 raw_inode
.uid
= current
->fsuid
;
1030 raw_inode
.gid
= current
->fsgid
;
1031 raw_inode
.atime
= get_seconds();
1032 raw_inode
.mtime
= del_f
->mtime
;
1033 raw_inode
.ctime
= raw_inode
.atime
;
1034 raw_inode
.offset
= 0;
1035 raw_inode
.dsize
= 0;
1036 raw_inode
.rsize
= 0;
1037 raw_inode
.nsize
= 0;
1038 raw_inode
.nlink
= del_f
->nlink
;
1039 raw_inode
.spare
= 0;
1040 raw_inode
.rename
= 0;
1041 raw_inode
.deleted
= 1;
1043 /* Write the new node to the flash memory. */
1044 if (jffs_write_node(c
, del_node
, &raw_inode
, NULL
, NULL
, 1, del_f
) < 0) {
1045 jffs_free_node(del_node
);
1047 goto jffs_remove_end
;
1050 /* Update the file. This operation will make the file disappear
1051 from the in-memory file system structures. */
1052 jffs_insert_node(c
, del_f
, &raw_inode
, NULL
, del_node
);
1054 dir
->i_ctime
= dir
->i_mtime
= CURRENT_TIME_SEC
;
1055 mark_inode_dirty(dir
);
1057 inode
->i_ctime
= dir
->i_ctime
;
1058 mark_inode_dirty(inode
);
1060 d_delete(dentry
); /* This also frees the inode */
1065 } /* jffs_remove() */
1069 jffs_mknod(struct inode
*dir
, struct dentry
*dentry
, int mode
, dev_t rdev
)
1071 struct jffs_raw_inode raw_inode
;
1072 struct jffs_file
*dir_f
;
1073 struct jffs_node
*node
= NULL
;
1074 struct jffs_control
*c
;
1075 struct inode
*inode
;
1077 u16 data
= old_encode_dev(rdev
);
1080 D1(printk("***jffs_mknod()\n"));
1082 if (!old_valid_dev(rdev
))
1085 dir_f
= (struct jffs_file
*)dir
->u
.generic_ip
;
1088 D3(printk (KERN_NOTICE
"mknod(): down biglock\n"));
1089 down(&c
->fmc
->biglock
);
1091 /* Create and initialize a new node. */
1092 if (!(node
= jffs_alloc_node())) {
1093 D(printk("jffs_mknod(): Allocation failed!\n"));
1095 goto jffs_mknod_err
;
1097 node
->data_offset
= 0;
1098 node
->removed_size
= 0;
1100 /* Initialize the raw inode. */
1101 raw_inode
.magic
= JFFS_MAGIC_BITMASK
;
1102 raw_inode
.ino
= c
->next_ino
++;
1103 raw_inode
.pino
= dir_f
->ino
;
1104 raw_inode
.version
= 1;
1105 raw_inode
.mode
= mode
;
1106 raw_inode
.uid
= current
->fsuid
;
1107 raw_inode
.gid
= (dir
->i_mode
& S_ISGID
) ? dir
->i_gid
: current
->fsgid
;
1108 /* raw_inode.gid = current->fsgid; */
1109 raw_inode
.atime
= get_seconds();
1110 raw_inode
.mtime
= raw_inode
.atime
;
1111 raw_inode
.ctime
= raw_inode
.atime
;
1112 raw_inode
.offset
= 0;
1113 raw_inode
.dsize
= 2;
1114 raw_inode
.rsize
= 0;
1115 raw_inode
.nsize
= dentry
->d_name
.len
;
1116 raw_inode
.nlink
= 1;
1117 raw_inode
.spare
= 0;
1118 raw_inode
.rename
= 0;
1119 raw_inode
.deleted
= 0;
1121 /* Write the new node to the flash. */
1122 if ((err
= jffs_write_node(c
, node
, &raw_inode
, dentry
->d_name
.name
,
1123 (unsigned char *)&data
, 0, NULL
)) < 0) {
1124 D(printk("jffs_mknod(): jffs_write_node() failed.\n"));
1126 goto jffs_mknod_err
;
1129 /* Insert the new node into the file system. */
1130 if ((err
= jffs_insert_node(c
, NULL
, &raw_inode
, dentry
->d_name
.name
,
1133 goto jffs_mknod_end
;
1136 inode
= jffs_new_inode(dir
, &raw_inode
, &err
);
1137 if (inode
== NULL
) {
1139 goto jffs_mknod_end
;
1142 init_special_inode(inode
, mode
, rdev
);
1144 d_instantiate(dentry
, inode
);
1146 goto jffs_mknod_end
;
1150 jffs_free_node(node
);
1154 D3(printk (KERN_NOTICE
"mknod(): up biglock\n"));
1155 up(&c
->fmc
->biglock
);
1158 } /* jffs_mknod() */
1162 jffs_symlink(struct inode
*dir
, struct dentry
*dentry
, const char *symname
)
1164 struct jffs_raw_inode raw_inode
;
1165 struct jffs_control
*c
;
1166 struct jffs_file
*dir_f
;
1167 struct jffs_node
*node
;
1168 struct inode
*inode
;
1170 int symname_len
= strlen(symname
);
1175 int len
= dentry
->d_name
.len
;
1176 char *_name
= (char *)kmalloc(len
+ 1, GFP_KERNEL
);
1177 char *_symname
= (char *)kmalloc(symname_len
+ 1, GFP_KERNEL
);
1178 memcpy(_name
, dentry
->d_name
.name
, len
);
1180 memcpy(_symname
, symname
, symname_len
);
1181 _symname
[symname_len
] = '\0';
1182 printk("***jffs_symlink(): dir = 0x%p, "
1183 "dentry->dname.name = \"%s\", "
1184 "symname = \"%s\"\n", dir
, _name
, _symname
);
1189 dir_f
= (struct jffs_file
*)dir
->u
.generic_ip
;
1190 ASSERT(if (!dir_f
) {
1191 printk(KERN_ERR
"jffs_symlink(): No reference to a "
1192 "jffs_file struct in inode.\n");
1199 /* Create a node and initialize it as much as needed. */
1200 if (!(node
= jffs_alloc_node())) {
1201 D(printk("jffs_symlink(): Allocation failed: node = NULL\n"));
1205 D3(printk (KERN_NOTICE
"symlink(): down biglock\n"));
1206 down(&c
->fmc
->biglock
);
1208 node
->data_offset
= 0;
1209 node
->removed_size
= 0;
1211 /* Initialize the raw inode. */
1212 raw_inode
.magic
= JFFS_MAGIC_BITMASK
;
1213 raw_inode
.ino
= c
->next_ino
++;
1214 raw_inode
.pino
= dir_f
->ino
;
1215 raw_inode
.version
= 1;
1216 raw_inode
.mode
= S_IFLNK
| S_IRWXUGO
;
1217 raw_inode
.uid
= current
->fsuid
;
1218 raw_inode
.gid
= (dir
->i_mode
& S_ISGID
) ? dir
->i_gid
: current
->fsgid
;
1219 raw_inode
.atime
= get_seconds();
1220 raw_inode
.mtime
= raw_inode
.atime
;
1221 raw_inode
.ctime
= raw_inode
.atime
;
1222 raw_inode
.offset
= 0;
1223 raw_inode
.dsize
= symname_len
;
1224 raw_inode
.rsize
= 0;
1225 raw_inode
.nsize
= dentry
->d_name
.len
;
1226 raw_inode
.nlink
= 1;
1227 raw_inode
.spare
= 0;
1228 raw_inode
.rename
= 0;
1229 raw_inode
.deleted
= 0;
1231 /* Write the new node to the flash. */
1232 if ((err
= jffs_write_node(c
, node
, &raw_inode
, dentry
->d_name
.name
,
1233 (const unsigned char *)symname
, 0, NULL
)) < 0) {
1234 D(printk("jffs_symlink(): jffs_write_node() failed.\n"));
1235 jffs_free_node(node
);
1236 goto jffs_symlink_end
;
1239 /* Insert the new node into the file system. */
1240 if ((err
= jffs_insert_node(c
, NULL
, &raw_inode
, dentry
->d_name
.name
,
1242 goto jffs_symlink_end
;
1245 inode
= jffs_new_inode(dir
, &raw_inode
, &err
);
1246 if (inode
== NULL
) {
1247 goto jffs_symlink_end
;
1250 inode
->i_op
= &page_symlink_inode_operations
;
1251 inode
->i_mapping
->a_ops
= &jffs_address_operations
;
1253 d_instantiate(dentry
, inode
);
1255 D3(printk (KERN_NOTICE
"symlink(): up biglock\n"));
1256 up(&c
->fmc
->biglock
);
1259 } /* jffs_symlink() */
1262 /* Create an inode inside a JFFS directory (dir) and return it.
1264 * By the time this is called, we already have created
1265 * the directory cache entry for the new file, but it
1266 * is so far negative - it has no inode.
1268 * If the create succeeds, we fill in the inode information
1269 * with d_instantiate().
1272 jffs_create(struct inode
*dir
, struct dentry
*dentry
, int mode
,
1273 struct nameidata
*nd
)
1275 struct jffs_raw_inode raw_inode
;
1276 struct jffs_control
*c
;
1277 struct jffs_node
*node
;
1278 struct jffs_file
*dir_f
; /* JFFS representation of the directory. */
1279 struct inode
*inode
;
1284 int len
= dentry
->d_name
.len
;
1285 char *s
= (char *)kmalloc(len
+ 1, GFP_KERNEL
);
1286 memcpy(s
, dentry
->d_name
.name
, len
);
1288 printk("jffs_create(): dir: 0x%p, name: \"%s\"\n", dir
, s
);
1292 dir_f
= (struct jffs_file
*)dir
->u
.generic_ip
;
1293 ASSERT(if (!dir_f
) {
1294 printk(KERN_ERR
"jffs_create(): No reference to a "
1295 "jffs_file struct in inode.\n");
1302 /* Create a node and initialize as much as needed. */
1303 if (!(node
= jffs_alloc_node())) {
1304 D(printk("jffs_create(): Allocation failed: node == 0\n"));
1308 D3(printk (KERN_NOTICE
"create(): down biglock\n"));
1309 down(&c
->fmc
->biglock
);
1311 node
->data_offset
= 0;
1312 node
->removed_size
= 0;
1314 /* Initialize the raw inode. */
1315 raw_inode
.magic
= JFFS_MAGIC_BITMASK
;
1316 raw_inode
.ino
= c
->next_ino
++;
1317 raw_inode
.pino
= dir_f
->ino
;
1318 raw_inode
.version
= 1;
1319 raw_inode
.mode
= mode
;
1320 raw_inode
.uid
= current
->fsuid
;
1321 raw_inode
.gid
= (dir
->i_mode
& S_ISGID
) ? dir
->i_gid
: current
->fsgid
;
1322 raw_inode
.atime
= get_seconds();
1323 raw_inode
.mtime
= raw_inode
.atime
;
1324 raw_inode
.ctime
= raw_inode
.atime
;
1325 raw_inode
.offset
= 0;
1326 raw_inode
.dsize
= 0;
1327 raw_inode
.rsize
= 0;
1328 raw_inode
.nsize
= dentry
->d_name
.len
;
1329 raw_inode
.nlink
= 1;
1330 raw_inode
.spare
= 0;
1331 raw_inode
.rename
= 0;
1332 raw_inode
.deleted
= 0;
1334 /* Write the new node to the flash. */
1335 if ((err
= jffs_write_node(c
, node
, &raw_inode
,
1336 dentry
->d_name
.name
, NULL
, 0, NULL
)) < 0) {
1337 D(printk("jffs_create(): jffs_write_node() failed.\n"));
1338 jffs_free_node(node
);
1339 goto jffs_create_end
;
1342 /* Insert the new node into the file system. */
1343 if ((err
= jffs_insert_node(c
, NULL
, &raw_inode
, dentry
->d_name
.name
,
1345 goto jffs_create_end
;
1348 /* Initialize an inode. */
1349 inode
= jffs_new_inode(dir
, &raw_inode
, &err
);
1350 if (inode
== NULL
) {
1351 goto jffs_create_end
;
1354 inode
->i_op
= &jffs_file_inode_operations
;
1355 inode
->i_fop
= &jffs_file_operations
;
1356 inode
->i_mapping
->a_ops
= &jffs_address_operations
;
1357 inode
->i_mapping
->nrpages
= 0;
1359 d_instantiate(dentry
, inode
);
1361 D3(printk (KERN_NOTICE
"create(): up biglock\n"));
1362 up(&c
->fmc
->biglock
);
1365 } /* jffs_create() */
1368 /* Write, append or rewrite data to an existing file. */
1370 jffs_file_write(struct file
*filp
, const char *buf
, size_t count
,
1373 struct jffs_raw_inode raw_inode
;
1374 struct jffs_control
*c
;
1375 struct jffs_file
*f
;
1376 struct jffs_node
*node
;
1377 struct dentry
*dentry
= filp
->f_dentry
;
1378 struct inode
*inode
= dentry
->d_inode
;
1379 int recoverable
= 0;
1381 __u32 thiscount
= count
;
1385 inode
= filp
->f_dentry
->d_inode
;
1387 D2(printk("***jffs_file_write(): inode: 0x%p (ino: %lu), "
1388 "filp: 0x%p, buf: 0x%p, count: %d\n",
1389 inode
, inode
->i_ino
, filp
, buf
, count
));
1392 if (inode
->i_sb
->s_flags
& MS_RDONLY
) {
1393 D(printk("jffs_file_write(): MS_RDONLY\n"));
1400 if (!S_ISREG(inode
->i_mode
)) {
1401 D(printk("jffs_file_write(): inode->i_mode == 0x%08x\n",
1406 if (!(f
= (struct jffs_file
*)inode
->u
.generic_ip
)) {
1407 D(printk("jffs_file_write(): inode->u.generic_ip = 0x%p\n",
1408 inode
->u
.generic_ip
));
1415 * This will never trigger with sane page sizes. leave it in
1416 * anyway, since I'm thinking about how to merge larger writes
1417 * (the current idea is to poke a thread that does the actual
1418 * I/O and starts by doing a down(&inode->i_sem). then we
1419 * would need to get the page cache pages and have a list of
1420 * I/O requests and do write-merging here.
1423 thiscount
= min(c
->fmc
->max_chunk_size
- sizeof(struct jffs_raw_inode
), count
);
1425 D3(printk (KERN_NOTICE
"file_write(): down biglock\n"));
1426 down(&c
->fmc
->biglock
);
1428 /* Urgh. POSIX says we can do short writes if we feel like it.
1429 * In practice, we can't. Nothing will cope. So we loop until
1432 * <_Anarchy_> posix and reality are not interconnected on this issue
1435 /* Things are going to be written so we could allocate and
1436 initialize the necessary data structures now. */
1437 if (!(node
= jffs_alloc_node())) {
1438 D(printk("jffs_file_write(): node == 0\n"));
1443 node
->data_offset
= pos
;
1444 node
->removed_size
= 0;
1446 /* Initialize the raw inode. */
1447 raw_inode
.magic
= JFFS_MAGIC_BITMASK
;
1448 raw_inode
.ino
= f
->ino
;
1449 raw_inode
.pino
= f
->pino
;
1451 raw_inode
.mode
= f
->mode
;
1453 raw_inode
.uid
= f
->uid
;
1454 raw_inode
.gid
= f
->gid
;
1455 raw_inode
.atime
= get_seconds();
1456 raw_inode
.mtime
= raw_inode
.atime
;
1457 raw_inode
.ctime
= f
->ctime
;
1458 raw_inode
.offset
= pos
;
1459 raw_inode
.dsize
= thiscount
;
1460 raw_inode
.rsize
= 0;
1461 raw_inode
.nsize
= f
->nsize
;
1462 raw_inode
.nlink
= f
->nlink
;
1463 raw_inode
.spare
= 0;
1464 raw_inode
.rename
= 0;
1465 raw_inode
.deleted
= 0;
1467 if (pos
< f
->size
) {
1468 node
->removed_size
= raw_inode
.rsize
= min(thiscount
, (__u32
)(f
->size
- pos
));
1470 /* If this node is going entirely over the top of old data,
1471 we can allow it to go into the reserved space, because
1472 we know that GC can reclaim the space later.
1474 if (pos
+ thiscount
< f
->size
) {
1475 /* If all the data we're overwriting are _real_,
1476 not just holes, then:
1482 /* Write the new node to the flash. */
1483 /* NOTE: We would be quite happy if jffs_write_node() wrote a
1484 smaller node than we were expecting. There's no need for it
1485 to waste the space at the end of the flash just because it's
1486 a little smaller than what we asked for. But that's a whole
1487 new can of worms which I'm not going to open this week.
1490 if ((err
= jffs_write_node(c
, node
, &raw_inode
, f
->name
,
1491 (const unsigned char *)buf
,
1492 recoverable
, f
)) < 0) {
1493 D(printk("jffs_file_write(): jffs_write_node() failed.\n"));
1494 jffs_free_node(node
);
1503 /* Insert the new node into the file system. */
1504 if ((err
= jffs_insert_node(c
, f
, &raw_inode
, NULL
, node
)) < 0) {
1508 D3(printk("jffs_file_write(): new f_pos %ld.\n", (long)pos
));
1510 thiscount
= min(c
->fmc
->max_chunk_size
- sizeof(struct jffs_raw_inode
), count
);
1513 D3(printk (KERN_NOTICE
"file_write(): up biglock\n"));
1514 up(&c
->fmc
->biglock
);
1516 /* Fix things in the real inode. */
1517 if (pos
> inode
->i_size
) {
1518 inode
->i_size
= pos
;
1519 inode
->i_blocks
= (inode
->i_size
+ 511) >> 9;
1521 inode
->i_ctime
= inode
->i_mtime
= CURRENT_TIME_SEC
;
1522 mark_inode_dirty(inode
);
1523 invalidate_inode_pages(inode
->i_mapping
);
1527 } /* jffs_file_write() */
1530 jffs_prepare_write(struct file
*filp
, struct page
*page
,
1531 unsigned from
, unsigned to
)
1533 /* FIXME: we should detect some error conditions here */
1535 /* Bugger that. We should make sure the page is uptodate */
1536 if (!PageUptodate(page
) && (from
|| to
< PAGE_CACHE_SIZE
))
1537 return jffs_do_readpage_nolock(filp
, page
);
1540 } /* jffs_prepare_write() */
1543 jffs_commit_write(struct file
*filp
, struct page
*page
,
1544 unsigned from
, unsigned to
)
1546 void *addr
= page_address(page
) + from
;
1547 /* XXX: PAGE_CACHE_SHIFT or PAGE_SHIFT */
1548 loff_t pos
= (page
->index
<<PAGE_CACHE_SHIFT
) + from
;
1550 return jffs_file_write(filp
, addr
, to
-from
, &pos
);
1551 } /* jffs_commit_write() */
1553 /* This is our ioctl() routine. */
1555 jffs_ioctl(struct inode
*inode
, struct file
*filp
, unsigned int cmd
,
1558 struct jffs_control
*c
;
1561 D2(printk("***jffs_ioctl(): cmd = 0x%08x, arg = 0x%08lx\n",
1564 if (!(c
= (struct jffs_control
*)inode
->i_sb
->s_fs_info
)) {
1565 printk(KERN_ERR
"JFFS: Bad inode in ioctl() call. "
1566 "(cmd = 0x%08x)\n", cmd
);
1569 D3(printk (KERN_NOTICE
"ioctl(): down biglock\n"));
1570 down(&c
->fmc
->biglock
);
1573 case JFFS_PRINT_HASH
:
1574 jffs_print_hash_table(c
);
1576 case JFFS_PRINT_TREE
:
1577 jffs_print_tree(c
->root
, 0);
1579 case JFFS_GET_STATUS
:
1581 struct jffs_flash_status fst
;
1582 struct jffs_fmcontrol
*fmc
= c
->fmc
;
1583 printk("Flash status -- ");
1584 if (!access_ok(VERIFY_WRITE
,
1585 (struct jffs_flash_status __user
*)arg
,
1586 sizeof(struct jffs_flash_status
))) {
1587 D(printk("jffs_ioctl(): Bad arg in "
1588 "JFFS_GET_STATUS ioctl!\n"));
1592 fst
.size
= fmc
->flash_size
;
1593 fst
.used
= fmc
->used_size
;
1594 fst
.dirty
= fmc
->dirty_size
;
1595 fst
.begin
= fmc
->head
->offset
;
1596 fst
.end
= fmc
->tail
->offset
+ fmc
->tail
->size
;
1597 printk("size: %d, used: %d, dirty: %d, "
1598 "begin: %d, end: %d\n",
1599 fst
.size
, fst
.used
, fst
.dirty
,
1600 fst
.begin
, fst
.end
);
1601 if (copy_to_user((struct jffs_flash_status __user
*)arg
,
1603 sizeof(struct jffs_flash_status
))) {
1611 D3(printk (KERN_NOTICE
"ioctl(): up biglock\n"));
1612 up(&c
->fmc
->biglock
);
1614 } /* jffs_ioctl() */
1617 static struct address_space_operations jffs_address_operations
= {
1618 .readpage
= jffs_readpage
,
1619 .prepare_write
= jffs_prepare_write
,
1620 .commit_write
= jffs_commit_write
,
1623 static int jffs_fsync(struct file
*f
, struct dentry
*d
, int datasync
)
1625 /* We currently have O_SYNC operations at all times.
1632 extern int generic_file_open(struct inode
*, struct file
*) __attribute__((weak
));
1633 extern loff_t
generic_file_llseek(struct file
*, loff_t
, int) __attribute__((weak
));
1635 static struct file_operations jffs_file_operations
=
1637 .open
= generic_file_open
,
1638 .llseek
= generic_file_llseek
,
1639 .read
= generic_file_read
,
1640 .write
= generic_file_write
,
1641 .ioctl
= jffs_ioctl
,
1642 .mmap
= generic_file_readonly_mmap
,
1643 .fsync
= jffs_fsync
,
1644 .sendfile
= generic_file_sendfile
,
1648 static struct inode_operations jffs_file_inode_operations
=
1650 .lookup
= jffs_lookup
, /* lookup */
1651 .setattr
= jffs_setattr
,
1655 static struct file_operations jffs_dir_operations
=
1657 .readdir
= jffs_readdir
,
1661 static struct inode_operations jffs_dir_inode_operations
=
1663 .create
= jffs_create
,
1664 .lookup
= jffs_lookup
,
1665 .unlink
= jffs_unlink
,
1666 .symlink
= jffs_symlink
,
1667 .mkdir
= jffs_mkdir
,
1668 .rmdir
= jffs_rmdir
,
1669 .mknod
= jffs_mknod
,
1670 .rename
= jffs_rename
,
1671 .setattr
= jffs_setattr
,
1675 /* Initialize an inode for the VFS. */
1677 jffs_read_inode(struct inode
*inode
)
1679 struct jffs_file
*f
;
1680 struct jffs_control
*c
;
1682 D3(printk("jffs_read_inode(): inode->i_ino == %lu\n", inode
->i_ino
));
1685 D(printk("jffs_read_inode(): !inode->i_sb ==> "
1686 "No super block!\n"));
1689 c
= (struct jffs_control
*)inode
->i_sb
->s_fs_info
;
1690 D3(printk (KERN_NOTICE
"read_inode(): down biglock\n"));
1691 down(&c
->fmc
->biglock
);
1692 if (!(f
= jffs_find_file(c
, inode
->i_ino
))) {
1693 D(printk("jffs_read_inode(): No such inode (%lu).\n",
1695 D3(printk (KERN_NOTICE
"read_inode(): up biglock\n"));
1696 up(&c
->fmc
->biglock
);
1699 inode
->u
.generic_ip
= (void *)f
;
1700 inode
->i_mode
= f
->mode
;
1701 inode
->i_nlink
= f
->nlink
;
1702 inode
->i_uid
= f
->uid
;
1703 inode
->i_gid
= f
->gid
;
1704 inode
->i_size
= f
->size
;
1705 inode
->i_atime
.tv_sec
= f
->atime
;
1706 inode
->i_mtime
.tv_sec
= f
->mtime
;
1707 inode
->i_ctime
.tv_sec
= f
->ctime
;
1708 inode
->i_atime
.tv_nsec
=
1709 inode
->i_mtime
.tv_nsec
=
1710 inode
->i_ctime
.tv_nsec
= 0;
1712 inode
->i_blksize
= PAGE_SIZE
;
1713 inode
->i_blocks
= (inode
->i_size
+ 511) >> 9;
1714 if (S_ISREG(inode
->i_mode
)) {
1715 inode
->i_op
= &jffs_file_inode_operations
;
1716 inode
->i_fop
= &jffs_file_operations
;
1717 inode
->i_mapping
->a_ops
= &jffs_address_operations
;
1719 else if (S_ISDIR(inode
->i_mode
)) {
1720 inode
->i_op
= &jffs_dir_inode_operations
;
1721 inode
->i_fop
= &jffs_dir_operations
;
1723 else if (S_ISLNK(inode
->i_mode
)) {
1724 inode
->i_op
= &page_symlink_inode_operations
;
1725 inode
->i_mapping
->a_ops
= &jffs_address_operations
;
1728 /* If the node is a device of some sort, then the number of
1729 the device should be read from the flash memory and then
1730 added to the inode's i_rdev member. */
1732 jffs_read_data(f
, (char *)&val
, 0, 2);
1733 init_special_inode(inode
, inode
->i_mode
,
1734 old_decode_dev(val
));
1737 D3(printk (KERN_NOTICE
"read_inode(): up biglock\n"));
1738 up(&c
->fmc
->biglock
);
1743 jffs_delete_inode(struct inode
*inode
)
1745 struct jffs_file
*f
;
1746 struct jffs_control
*c
;
1747 D3(printk("jffs_delete_inode(): inode->i_ino == %lu\n",
1752 inode
->i_blocks
= 0;
1753 inode
->u
.generic_ip
= NULL
;
1755 if (inode
->i_nlink
== 0) {
1756 c
= (struct jffs_control
*) inode
->i_sb
->s_fs_info
;
1757 f
= (struct jffs_file
*) jffs_find_file (c
, inode
->i_ino
);
1758 jffs_possibly_delete_file(f
);
1766 jffs_write_super(struct super_block
*sb
)
1768 struct jffs_control
*c
= (struct jffs_control
*)sb
->s_fs_info
;
1770 jffs_garbage_collect_trigger(c
);
1774 static int jffs_remount(struct super_block
*sb
, int *flags
, char *data
)
1776 *flags
|= MS_NODIRATIME
;
1780 static struct super_operations jffs_ops
=
1782 .read_inode
= jffs_read_inode
,
1783 .delete_inode
= jffs_delete_inode
,
1784 .put_super
= jffs_put_super
,
1785 .write_super
= jffs_write_super
,
1786 .statfs
= jffs_statfs
,
1787 .remount_fs
= jffs_remount
,
1790 static struct super_block
*jffs_get_sb(struct file_system_type
*fs_type
,
1791 int flags
, const char *dev_name
, void *data
)
1793 return get_sb_bdev(fs_type
, flags
, dev_name
, data
, jffs_fill_super
);
1796 static struct file_system_type jffs_fs_type
= {
1797 .owner
= THIS_MODULE
,
1799 .get_sb
= jffs_get_sb
,
1800 .kill_sb
= kill_block_super
,
1801 .fs_flags
= FS_REQUIRES_DEV
,
1807 printk(KERN_INFO
"JFFS version " JFFS_VERSION_STRING
1808 ", (C) 1999, 2000 Axis Communications AB\n");
1810 #ifdef CONFIG_JFFS_PROC_FS
1811 jffs_proc_root
= proc_mkdir("jffs", proc_root_fs
);
1812 if (!jffs_proc_root
) {
1813 printk(KERN_WARNING
"cannot create /proc/jffs entry\n");
1816 fm_cache
= kmem_cache_create("jffs_fm", sizeof(struct jffs_fm
),
1817 0, SLAB_HWCACHE_ALIGN
|SLAB_RECLAIM_ACCOUNT
,
1823 node_cache
= kmem_cache_create("jffs_node",sizeof(struct jffs_node
),
1824 0, SLAB_HWCACHE_ALIGN
|SLAB_RECLAIM_ACCOUNT
,
1827 kmem_cache_destroy(fm_cache
);
1831 return register_filesystem(&jffs_fs_type
);
1837 unregister_filesystem(&jffs_fs_type
);
1838 kmem_cache_destroy(fm_cache
);
1839 kmem_cache_destroy(node_cache
);
1842 module_init(init_jffs_fs
)
1843 module_exit(exit_jffs_fs
)
1845 MODULE_DESCRIPTION("The Journalling Flash File System");
1846 MODULE_AUTHOR("Axis Communications AB.");
1847 MODULE_LICENSE("GPL");