annotate packages/fs/jffs2/current/src/fs-ecos.c @ 3292:7f8e529b4d82 default tip

Fix FREESCALE_EDMA_NBYTES_MLOFFYES_MLOFF() so it works with negative offsets.
author vae
date Wed, 29 Apr 2015 23:31:48 +0000
parents 74dbf4c3f2e1
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1 /*
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
2 * JFFS2 -- Journalling Flash File System, Version 2.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
3 *
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2475
diff changeset
4 * Copyright (C) 2001-2003 Free Software Foundation, Inc.
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
5 *
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
6 * Created by Dominic Ostrowski <dominic.ostrowski@3glab.com>
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
7 * Contributors: David Woodhouse, Nick Garnett, Richard Panton.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
8 *
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
9 * For licensing information, see the file 'LICENCE' in this directory.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
10 *
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
11 * $Id: fs-ecos.c,v 1.44 2005/07/24 15:29:57 dedekind Exp $
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
12 *
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
13 */
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
14
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
15 #include <linux/kernel.h>
1871
31350a76c03d * src/os-ecos.h: Added gc tread support
asl
parents: 1856
diff changeset
16 #include "nodelist.h"
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
17 #include <linux/pagemap.h>
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
18 #include <linux/crc32.h>
1757
c4a8f3019f9c * cdl/jffs2.cdl: Fixed outdated definitions for compression options.
asl
parents: 1713
diff changeset
19 #include "compr.h"
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
20 #include <errno.h>
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
21 #include <string.h>
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
22 #include <cyg/io/config_keys.h>
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
23
2199
9619b62d5be9 * src/fs-ecos.c: Generalise the check for broken ARM compilers
asl
parents: 2042
diff changeset
24 #if (__GNUC__ == 3) && (__GNUC_MINOR__ == 2) && \
9619b62d5be9 * src/fs-ecos.c: Generalise the check for broken ARM compilers
asl
parents: 2042
diff changeset
25 (defined (__arm__) || defined (_mips))
1269
46534b4d0054 * src/fs-ecos.c: Added test to detect known broken ARM compiler
asl
parents: 1241
diff changeset
26 #error This compiler is known to be broken. Please see:
2199
9619b62d5be9 * src/fs-ecos.c: Generalise the check for broken ARM compilers
asl
parents: 2042
diff changeset
27 #error "http://ecos.sourceware.org/ml/ecos-patches/2003-08/msg00006.html"
1269
46534b4d0054 * src/fs-ecos.c: Added test to detect known broken ARM compiler
asl
parents: 1241
diff changeset
28 #endif
46534b4d0054 * src/fs-ecos.c: Added test to detect known broken ARM compiler
asl
parents: 1241
diff changeset
29
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
30 //==========================================================================
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
31 // Forward definitions
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
32
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
33 // Filesystem operations
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
34 static int jffs2_mount(cyg_fstab_entry * fste, cyg_mtab_entry * mte);
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
35 static int jffs2_umount(cyg_mtab_entry * mte);
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
36 static int jffs2_open(cyg_mtab_entry * mte, cyg_dir dir, const char *name,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
37 int mode, cyg_file * fte);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
38 #ifdef CYGOPT_FS_JFFS2_WRITE
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
39 static int jffs2_ops_unlink(cyg_mtab_entry * mte, cyg_dir dir,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
40 const char *name);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
41 static int jffs2_ops_mkdir(cyg_mtab_entry * mte, cyg_dir dir, const char *name);
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
42 static int jffs2_ops_rmdir(cyg_mtab_entry * mte, cyg_dir dir, const char *name);
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
43 static int jffs2_ops_rename(cyg_mtab_entry * mte, cyg_dir dir1,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
44 const char *name1, cyg_dir dir2, const char *name2);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
45 static int jffs2_ops_link(cyg_mtab_entry * mte, cyg_dir dir1, const char *name1,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
46 cyg_dir dir2, const char *name2, int type);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
47 #endif
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
48 static int jffs2_opendir(cyg_mtab_entry * mte, cyg_dir dir, const char *name,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
49 cyg_file * fte);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
50 static int jffs2_chdir(cyg_mtab_entry * mte, cyg_dir dir, const char *name,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
51 cyg_dir * dir_out);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
52 static int jffs2_stat(cyg_mtab_entry * mte, cyg_dir dir, const char *name,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
53 struct stat *buf);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
54 static int jffs2_getinfo(cyg_mtab_entry * mte, cyg_dir dir, const char *name,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
55 int key, void *buf, int len);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
56 static int jffs2_setinfo(cyg_mtab_entry * mte, cyg_dir dir, const char *name,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
57 int key, void *buf, int len);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
58
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
59 // File operations
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
60 static int jffs2_fo_read(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio);
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
61 #ifdef CYGOPT_FS_JFFS2_WRITE
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
62 static int jffs2_fo_write(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio);
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
63 #endif
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
64 static int jffs2_fo_lseek(struct CYG_FILE_TAG *fp, off_t * pos, int whence);
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
65 static int jffs2_fo_ioctl(struct CYG_FILE_TAG *fp, CYG_ADDRWORD com,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
66 CYG_ADDRWORD data);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
67 static int jffs2_fo_fsync(struct CYG_FILE_TAG *fp, int mode);
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
68 static int jffs2_fo_close(struct CYG_FILE_TAG *fp);
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
69 static int jffs2_fo_fstat(struct CYG_FILE_TAG *fp, struct stat *buf);
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
70 static int jffs2_fo_getinfo(struct CYG_FILE_TAG *fp, int key, void *buf,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
71 int len);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
72 static int jffs2_fo_setinfo(struct CYG_FILE_TAG *fp, int key, void *buf,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
73 int len);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
74
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
75 // Directory operations
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
76 static int jffs2_fo_dirread(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio);
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
77 static int jffs2_fo_dirlseek(struct CYG_FILE_TAG *fp, off_t * pos, int whence);
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
78
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
79
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
80 static int jffs2_read_inode (struct _inode *inode);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
81 static void jffs2_clear_inode (struct _inode *inode);
1897
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
82 static int jffs2_truncate_file (struct _inode *inode);
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
83
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
84 //==========================================================================
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
85 // Filesystem table entries
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
86
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
87 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
88 // Fstab entry.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
89 // This defines the entry in the filesystem table.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
90 // For simplicity we use _FILESYSTEM synchronization for all accesses since
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
91 // we should never block in any filesystem operations.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
92
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
93 #ifdef CYGOPT_FS_JFFS2_WRITE
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
94 FSTAB_ENTRY(jffs2_fste, "jffs2", 0,
1856
15dd41bdd560 * src/fs-ecos.c: Use filesystem locking not file locking otherwise
asl
parents: 1834
diff changeset
95 CYG_SYNCMODE_FILE_FILESYSTEM | CYG_SYNCMODE_IO_FILESYSTEM,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
96 jffs2_mount,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
97 jffs2_umount,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
98 jffs2_open,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
99 jffs2_ops_unlink,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
100 jffs2_ops_mkdir,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
101 jffs2_ops_rmdir,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
102 jffs2_ops_rename,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
103 jffs2_ops_link,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
104 jffs2_opendir,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
105 jffs2_chdir, jffs2_stat, jffs2_getinfo, jffs2_setinfo);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
106 #else
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
107 FSTAB_ENTRY(jffs2_fste, "jffs2", 0,
1856
15dd41bdd560 * src/fs-ecos.c: Use filesystem locking not file locking otherwise
asl
parents: 1834
diff changeset
108 CYG_SYNCMODE_FILE_FILESYSTEM | CYG_SYNCMODE_IO_FILESYSTEM,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
109 jffs2_mount,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
110 jffs2_umount,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
111 jffs2_open,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
112 (cyg_fsop_unlink *)cyg_fileio_erofs,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
113 (cyg_fsop_mkdir *)cyg_fileio_erofs,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
114 (cyg_fsop_rmdir *)cyg_fileio_erofs,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
115 (cyg_fsop_rename *)cyg_fileio_erofs,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
116 (cyg_fsop_link *)cyg_fileio_erofs,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
117 jffs2_opendir,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
118 jffs2_chdir, jffs2_stat, jffs2_getinfo, jffs2_setinfo);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
119 #endif
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
120
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
121 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
122 // File operations.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
123 // This set of file operations are used for normal open files.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
124
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
125 static cyg_fileops jffs2_fileops = {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
126 jffs2_fo_read,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
127 #ifdef CYGOPT_FS_JFFS2_WRITE
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
128 jffs2_fo_write,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
129 #else
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
130 (cyg_fileop_write *) cyg_fileio_erofs,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
131 #endif
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
132 jffs2_fo_lseek,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
133 jffs2_fo_ioctl,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
134 cyg_fileio_seltrue,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
135 jffs2_fo_fsync,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
136 jffs2_fo_close,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
137 jffs2_fo_fstat,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
138 jffs2_fo_getinfo,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
139 jffs2_fo_setinfo
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
140 };
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
141
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
142 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
143 // Directory file operations.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
144 // This set of operations are used for open directories. Most entries
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
145 // point to error-returning stub functions. Only the read, lseek and
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
146 // close entries are functional.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
147
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
148 static cyg_fileops jffs2_dirops = {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
149 jffs2_fo_dirread,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
150 (cyg_fileop_write *) cyg_fileio_enosys,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
151 jffs2_fo_dirlseek,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
152 (cyg_fileop_ioctl *) cyg_fileio_enosys,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
153 cyg_fileio_seltrue,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
154 (cyg_fileop_fsync *) cyg_fileio_enosys,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
155 jffs2_fo_close,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
156 (cyg_fileop_fstat *) cyg_fileio_enosys,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
157 (cyg_fileop_getinfo *) cyg_fileio_enosys,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
158 (cyg_fileop_setinfo *) cyg_fileio_enosys
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
159 };
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
160
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
161 //==========================================================================
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
162 // STATIC VARIABLES !!!
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
163
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
164 static unsigned char gc_buffer[PAGE_CACHE_SIZE]; //avoids malloc when user may be under memory pressure
1373
00a9f2cb1081 * cdl/jffs2.cdl:
asl
parents: 1372
diff changeset
165 static unsigned char n_fs_mounted = 0; // a counter to track the number of jffs2 instances mounted
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
166
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
167 //==========================================================================
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
168 // Directory operations
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
169
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
170 struct jffs2_dirsearch {
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
171 struct _inode *dir; // directory to search
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
172 const unsigned char *path; // path to follow
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
173 struct _inode *node; // Node found
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
174 const unsigned char *name; // last name fragment used
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
175 int namelen; // name fragment length
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
176 cyg_bool last; // last name in path?
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
177 };
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
178
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
179 typedef struct jffs2_dirsearch jffs2_dirsearch;
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
180
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
181 //==========================================================================
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
182 // Ref count and nlink management
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
183
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
184
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
185 // FIXME: This seems like real cruft. Wouldn't it be better just to do the
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
186 // right thing?
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
187 static void icache_evict(struct _inode *root_i, struct _inode *i)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
188 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
189 struct _inode *this = root_i, *next;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
190
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
191 restart:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
192 D2(printf("icache_evict\n"));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
193 // If this is an absolute search path from the root,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
194 // remove all cached inodes with i_count of zero (these are only
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
195 // held where needed for dotdot filepaths)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
196 while (this) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
197 next = this->i_cache_next;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
198 if (this != i && this->i_count == 0) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
199 struct _inode *parent = this->i_parent;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
200 if (this->i_cache_next)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
201 this->i_cache_next->i_cache_prev = this->i_cache_prev;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
202 if (this->i_cache_prev)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
203 this->i_cache_prev->i_cache_next = this->i_cache_next;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
204 jffs2_clear_inode(this);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
205 memset(this, 0x5a, sizeof(*this));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
206 free(this);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
207 if (parent && parent != this) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
208 parent->i_count--;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
209 this = root_i;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
210 goto restart;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
211 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
212 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
213 this = next;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
214 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
215 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
216
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
217 //==========================================================================
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
218 // Directory search
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
219
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
220 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
221 // init_dirsearch()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
222 // Initialize a dirsearch object to start a search
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
223
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
224 static void init_dirsearch(jffs2_dirsearch * ds,
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
225 struct _inode *dir, const unsigned char *name)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
226 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
227 D2(printf("init_dirsearch name = %s\n", name));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
228 D2(printf("init_dirsearch dir = %x\n", dir));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
229
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
230 dir->i_count++;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
231 ds->dir = dir;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
232 ds->path = name;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
233 ds->node = dir;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
234 ds->name = name;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
235 ds->namelen = 0;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
236 ds->last = false;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
237 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
238
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
239 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
240 // find_entry()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
241 // Search a single directory for the next name in a path and update the
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
242 // dirsearch object appropriately.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
243
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
244 static int find_entry(jffs2_dirsearch * ds)
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
245 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
246 struct _inode *dir = ds->dir;
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
247 const unsigned char *name = ds->path;
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
248 const unsigned char *n = name;
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
249 char namelen = 0;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
250 struct _inode *d;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
251
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
252 D2(printf("find_entry\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
253
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
254 // check that we really have a directory
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
255 if (!S_ISDIR(dir->i_mode))
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
256 return ENOTDIR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
257
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
258 // Isolate the next element of the path name.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
259 while (*n != '\0' && *n != '/')
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
260 n++, namelen++;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
261
1533
89eafd905d8d * src/fs-ecos.c :
asl
parents: 1500
diff changeset
262 // Check if this is the last path element.
89eafd905d8d * src/fs-ecos.c :
asl
parents: 1500
diff changeset
263 while( *n == '/') n++;
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
264 if (*n == '\0')
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
265 ds->last = true;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
266
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
267 // update name in dirsearch object
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
268 ds->name = name;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
269 ds->namelen = namelen;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
270
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
271 if (name[0] == '.')
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
272 switch (namelen) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
273 default:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
274 break;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
275 case 2:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
276 // Dot followed by not Dot, treat as any other name
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
277 if (name[1] != '.')
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
278 break;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
279 // Dot Dot
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
280 // Move back up the search path
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
281 D2(printf("find_entry found ..\n"));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
282 ds->dir = ds->node;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
283 ds->node = ds->dir->i_parent;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
284 ds->node->i_count++;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
285 return ENOERR;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
286 case 1:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
287 // Dot is consumed
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
288 D2(printf("find_entry found .\n"));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
289 ds->node = ds->dir;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
290 ds->dir->i_count++;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
291 return ENOERR;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
292 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
293
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
294 // Here we have the name and its length set up.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
295 // Search the directory for a matching entry
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
296
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
297 D2(printf("find_entry for name = %s\n", ds->path));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
298 d = jffs2_lookup(dir, name, namelen);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
299 D2(printf("find_entry got dir = %x\n", d));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
300
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
301 if (d == NULL)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
302 return ENOENT;
1812
119d236b530c * src/fs-ecos.c (find_entry): jffs2_lookup may return error codes.
asl
parents: 1757
diff changeset
303 if (IS_ERR(d))
119d236b530c * src/fs-ecos.c (find_entry): jffs2_lookup may return error codes.
asl
parents: 1757
diff changeset
304 return -PTR_ERR(d);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
305
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
306 // If it's a new directory inode, increase refcount on its parent
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
307 if (S_ISDIR(d->i_mode) && !d->i_parent) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
308 d->i_parent = dir;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
309 dir->i_count++;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
310 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
311
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
312 // pass back the node we have found
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
313 ds->node = d;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
314 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
315
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
316 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
317
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
318 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
319 // jffs2_find()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
320 // Main interface to directory search code. This is used in all file
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
321 // level operations to locate the object named by the pathname.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
322
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
323 // Returns with use count incremented on both the sought object and
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
324 // the directory it was found in
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
325 static int jffs2_find(jffs2_dirsearch * d)
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
326 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
327 int err;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
328
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
329 D2(printf("jffs2_find for path =%s\n", d->path));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
330
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
331 // Short circuit empty paths
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
332 if (*(d->path) == '\0') {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
333 d->node->i_count++;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
334 return ENOERR;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
335 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
336
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
337 // iterate down directory tree until we find the object
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
338 // we want.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
339 for (;;) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
340 err = find_entry(d);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
341
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
342 if (err != ENOERR)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
343 return err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
344
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
345 if (d->last)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
346 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
347
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
348 /* We're done with it, although it we found a subdir that
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
349 will have caused the refcount to have been increased */
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
350 jffs2_iput(d->dir);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
351
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
352 // Update dirsearch object to search next directory.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
353 d->dir = d->node;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
354 d->path += d->namelen;
1533
89eafd905d8d * src/fs-ecos.c :
asl
parents: 1500
diff changeset
355 while (*(d->path) == '/')
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
356 d->path++; // skip dirname separators
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
357 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
358 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
359
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
360 //==========================================================================
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
361 // Pathconf support
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
362 // This function provides support for pathconf() and fpathconf().
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
363
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
364 static int jffs2_pathconf(struct _inode *node, struct cyg_pathconf_info *info)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
365 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
366 int err = ENOERR;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
367 D2(printf("jffs2_pathconf\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
368
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
369 switch (info->name) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
370 case _PC_LINK_MAX:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
371 info->value = LINK_MAX;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
372 break;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
373
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
374 case _PC_MAX_CANON:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
375 info->value = -1; // not supported
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
376 err = EINVAL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
377 break;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
378
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
379 case _PC_MAX_INPUT:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
380 info->value = -1; // not supported
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
381 err = EINVAL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
382 break;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
383
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
384 case _PC_NAME_MAX:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
385 info->value = NAME_MAX;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
386 break;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
387
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
388 case _PC_PATH_MAX:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
389 info->value = PATH_MAX;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
390 break;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
391
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
392 case _PC_PIPE_BUF:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
393 info->value = -1; // not supported
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
394 err = EINVAL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
395 break;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
396
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
397 case _PC_ASYNC_IO:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
398 info->value = -1; // not supported
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
399 err = EINVAL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
400 break;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
401
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
402 case _PC_CHOWN_RESTRICTED:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
403 info->value = -1; // not supported
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
404 err = EINVAL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
405 break;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
406
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
407 case _PC_NO_TRUNC:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
408 info->value = 0;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
409 break;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
410
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
411 case _PC_PRIO_IO:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
412 info->value = 0;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
413 break;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
414
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
415 case _PC_SYNC_IO:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
416 info->value = 0;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
417 break;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
418
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
419 case _PC_VDISABLE:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
420 info->value = -1; // not supported
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
421 err = EINVAL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
422 break;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
423
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
424 default:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
425 err = EINVAL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
426 break;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
427 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
428
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
429 return err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
430 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
431
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
432 //==========================================================================
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
433 // Filesystem operations
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
434
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
435 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
436 // jffs2_mount()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
437 // Process a mount request. This mainly creates a root for the
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
438 // filesystem.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
439 static int jffs2_read_super(struct super_block *sb)
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
440 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
441 struct jffs2_sb_info *c;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
442 Cyg_ErrNo err;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
443 cyg_uint32 len;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
444 cyg_io_flash_getconfig_devsize_t ds;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
445 cyg_io_flash_getconfig_blocksize_t bs;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
446
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
447 D1(printk(KERN_DEBUG "jffs2: read_super\n"));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
448
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
449 c = JFFS2_SB_INFO(sb);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
450
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
451 len = sizeof (ds);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
452 err = cyg_io_get_config(sb->s_dev,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
453 CYG_IO_GET_CONFIG_FLASH_DEVSIZE, &ds, &len);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
454 if (err != ENOERR) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
455 D1(printf
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
456 ("jffs2: cyg_io_get_config failed to get dev size: %d\n",
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
457 err));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
458 return err;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
459 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
460 len = sizeof (bs);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
461 bs.offset = 0;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
462 err = cyg_io_get_config(sb->s_dev,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
463 CYG_IO_GET_CONFIG_FLASH_BLOCKSIZE, &bs, &len);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
464 if (err != ENOERR) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
465 D1(printf
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
466 ("jffs2: cyg_io_get_config failed to get block size: %d\n",
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
467 err));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
468 return err;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
469 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
470
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
471 c->sector_size = bs.block_size;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
472 c->flash_size = ds.dev_size;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
473 c->cleanmarker_size = sizeof(struct jffs2_unknown_node);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
474
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
475 err = jffs2_do_mount_fs(c);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
476 if (err)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
477 return -err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
478
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
479 D1(printk(KERN_DEBUG "jffs2_read_super(): Getting root inode\n"));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
480 sb->s_root = jffs2_iget(sb, 1);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
481 if (IS_ERR(sb->s_root)) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
482 D1(printk(KERN_WARNING "get root inode failed\n"));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
483 err = PTR_ERR(sb->s_root);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
484 sb->s_root = NULL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
485 goto out_nodes;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
486 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
487
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
488 return 0;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
489
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
490 out_nodes:
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
491 jffs2_free_ino_caches(c);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
492 jffs2_free_raw_node_refs(c);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
493 free(c->blocks);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
494
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
495 return err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
496 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
497
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
498 static int jffs2_mount(cyg_fstab_entry * fste, cyg_mtab_entry * mte)
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
499 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
500 extern cyg_mtab_entry cyg_mtab[], cyg_mtab_end;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
501 struct super_block *jffs2_sb = NULL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
502 struct jffs2_sb_info *c;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
503 cyg_mtab_entry *m;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
504 cyg_io_handle_t t;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
505 Cyg_ErrNo err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
506
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
507 D2(printf("jffs2_mount\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
508
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
509 err = cyg_io_lookup(mte->devname, &t);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
510 if (err != ENOERR)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
511 return -err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
512
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
513 // Iterate through the mount table to see if we're mounted
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
514 // FIXME: this should be done better - perhaps if the superblock
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
515 // can be stored as an inode in the icache.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
516 for (m = &cyg_mtab[0]; m != &cyg_mtab_end; m++) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
517 // stop if there are more than the configured maximum
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
518 if (m - &cyg_mtab[0] >= CYGNUM_FILEIO_MTAB_MAX) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
519 m = &cyg_mtab_end;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
520 break;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
521 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
522 if (m->valid && strcmp(m->fsname, "jffs2") == 0 &&
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
523 strcmp(m->devname, mte->devname) == 0) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
524 jffs2_sb = (struct super_block *) m->data;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
525 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
526 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
527
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
528 if (jffs2_sb == NULL) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
529 jffs2_sb = malloc(sizeof (struct super_block));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
530
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
531 if (jffs2_sb == NULL)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
532 return ENOMEM;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
533
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
534 c = JFFS2_SB_INFO(jffs2_sb);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
535 memset(jffs2_sb, 0, sizeof (struct super_block));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
536 jffs2_sb->s_dev = t;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
537
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
538 c->inocache_list = malloc(sizeof(struct jffs2_inode_cache *) * INOCACHE_HASHSIZE);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
539 if (!c->inocache_list) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
540 free(jffs2_sb);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
541 return ENOMEM;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
542 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
543 memset(c->inocache_list, 0, sizeof(struct jffs2_inode_cache *) * INOCACHE_HASHSIZE);
1757
c4a8f3019f9c * cdl/jffs2.cdl: Fixed outdated definitions for compression options.
asl
parents: 1713
diff changeset
544 if (n_fs_mounted++ == 0) {
1373
00a9f2cb1081 * cdl/jffs2.cdl:
asl
parents: 1372
diff changeset
545 jffs2_create_slab_caches(); // No error check, cannot fail
1757
c4a8f3019f9c * cdl/jffs2.cdl: Fixed outdated definitions for compression options.
asl
parents: 1713
diff changeset
546 jffs2_compressors_init();
c4a8f3019f9c * cdl/jffs2.cdl: Fixed outdated definitions for compression options.
asl
parents: 1713
diff changeset
547 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
548
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
549 err = jffs2_read_super(jffs2_sb);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
550
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
551 if (err) {
1757
c4a8f3019f9c * cdl/jffs2.cdl: Fixed outdated definitions for compression options.
asl
parents: 1713
diff changeset
552 if (--n_fs_mounted == 0) {
1373
00a9f2cb1081 * cdl/jffs2.cdl:
asl
parents: 1372
diff changeset
553 jffs2_destroy_slab_caches();
1757
c4a8f3019f9c * cdl/jffs2.cdl: Fixed outdated definitions for compression options.
asl
parents: 1713
diff changeset
554 jffs2_compressors_exit();
c4a8f3019f9c * cdl/jffs2.cdl: Fixed outdated definitions for compression options.
asl
parents: 1713
diff changeset
555 }
1373
00a9f2cb1081 * cdl/jffs2.cdl:
asl
parents: 1372
diff changeset
556
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
557 free(jffs2_sb);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
558 free(c->inocache_list);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
559 return err;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
560 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
561
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
562 jffs2_sb->s_root->i_parent = jffs2_sb->s_root; // points to itself, no dotdot paths above mountpoint
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
563 jffs2_sb->s_root->i_cache_prev = NULL; // root inode, so always null
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
564 jffs2_sb->s_root->i_cache_next = NULL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
565 jffs2_sb->s_root->i_count = 1; // Ensures the root inode is always in ram until umount
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
566
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
567 D2(printf("jffs2_mount erasing pending blocks\n"));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
568 #ifdef CYGOPT_FS_JFFS2_WRITE
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
569 if (!jffs2_is_readonly(c))
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
570 jffs2_erase_pending_blocks(c,0);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
571 #endif
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
572 #ifdef CYGOPT_FS_JFFS2_GCTHREAD
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
573 jffs2_start_garbage_collect_thread(c);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
574 #endif
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
575 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
576 mte->data = (CYG_ADDRWORD) jffs2_sb;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
577
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
578 jffs2_sb->s_mount_count++;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
579 mte->root = (cyg_dir) jffs2_sb->s_root;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
580 D2(printf("jffs2_mounted superblock at %x\n", mte->root));
1373
00a9f2cb1081 * cdl/jffs2.cdl:
asl
parents: 1372
diff changeset
581
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
582 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
583 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
584
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
585 extern cyg_dir cyg_cdir_dir;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
586 extern cyg_mtab_entry *cyg_cdir_mtab_entry;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
587
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
588 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
589 // jffs2_umount()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
590 // Unmount the filesystem.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
591
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
592 static int jffs2_umount(cyg_mtab_entry * mte)
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
593 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
594 struct _inode *root = (struct _inode *) mte->root;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
595 struct super_block *jffs2_sb = root->i_sb;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
596 struct jffs2_sb_info *c = JFFS2_SB_INFO(jffs2_sb);
1547
008dfd864e5e * src/fs-ecos.c:
asl
parents: 1536
diff changeset
597 struct jffs2_full_dirent *fd, *next;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
598
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
599 D2(printf("jffs2_umount\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
600
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
601 // Only really umount if this is the only mount
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
602 if (jffs2_sb->s_mount_count == 1) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
603 icache_evict(root, NULL);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
604 if (root->i_cache_next != NULL) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
605 struct _inode *inode = root;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
606 printf("Refuse to unmount.\n");
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
607 while (inode) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
608 printf("Ino #%u has use count %d\n",
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
609 inode->i_ino, inode->i_count);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
610 inode = inode->i_cache_next;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
611 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
612 // root icount was set to 1 on mount
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
613 return EBUSY;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
614 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
615 if (root->i_count == 2 &&
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
616 cyg_cdir_mtab_entry == mte &&
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
617 cyg_cdir_dir == (cyg_dir)root &&
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
618 !strcmp(mte->name, "/")) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
619 /* If we were mounted on root, there's no
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
620 way for the cwd to change out and free
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
621 the file system for unmounting. So we hack
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
622 it -- if cwd is '/' we unset it. Perhaps
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
623 we should allow chdir(NULL) to unset
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
624 cyg_cdir_dir? */
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
625 cyg_cdir_dir = CYG_DIR_NULL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
626 jffs2_iput(root);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
627 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
628 /* Argh. The fileio code sets this; never clears it */
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
629 if (cyg_cdir_mtab_entry == mte)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
630 cyg_cdir_mtab_entry = NULL;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
631
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
632 if (root->i_count != 1) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
633 printf("Ino #1 has use count %d\n",
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
634 root->i_count);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
635 return EBUSY;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
636 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
637 #ifdef CYGOPT_FS_JFFS2_GCTHREAD
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
638 jffs2_stop_garbage_collect_thread(c);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
639 #endif
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
640 jffs2_iput(root); // Time to free the root inode
1547
008dfd864e5e * src/fs-ecos.c:
asl
parents: 1536
diff changeset
641
008dfd864e5e * src/fs-ecos.c:
asl
parents: 1536
diff changeset
642 // free directory entries
008dfd864e5e * src/fs-ecos.c:
asl
parents: 1536
diff changeset
643 for (fd = root->jffs2_i.dents; fd; fd = next) {
008dfd864e5e * src/fs-ecos.c:
asl
parents: 1536
diff changeset
644 next=fd->next;
1816
658319b65ae3 * src/fs-ecos.c (jffs2_open): Call iput on dir node if
asl
parents: 1812
diff changeset
645 jffs2_free_full_dirent(fd);
1547
008dfd864e5e * src/fs-ecos.c:
asl
parents: 1536
diff changeset
646 }
008dfd864e5e * src/fs-ecos.c:
asl
parents: 1536
diff changeset
647
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
648 free(root);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
649 //Clear root inode
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
650 //root_i = NULL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
651
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
652 // Clean up the super block and root inode
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
653 jffs2_free_ino_caches(c);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
654 jffs2_free_raw_node_refs(c);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
655 free(c->blocks);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
656 free(c->inocache_list);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
657 free(jffs2_sb);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
658 // Clear superblock & root pointer
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
659 mte->root = CYG_DIR_NULL;
1271
8eb2d0d3c498 * src/fs-ecos.c: Another umount() fix.
asl
parents: 1269
diff changeset
660 mte->data = 0;
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
661 mte->fs->data = 0; // fstab entry, visible to all mounts. No current mount
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
662 // That's all folks.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
663 D2(printf("jffs2_umount No current mounts\n"));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
664 } else {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
665 jffs2_sb->s_mount_count--;
1271
8eb2d0d3c498 * src/fs-ecos.c: Another umount() fix.
asl
parents: 1269
diff changeset
666 }
1757
c4a8f3019f9c * cdl/jffs2.cdl: Fixed outdated definitions for compression options.
asl
parents: 1713
diff changeset
667 if (--n_fs_mounted == 0) {
1373
00a9f2cb1081 * cdl/jffs2.cdl:
asl
parents: 1372
diff changeset
668 jffs2_destroy_slab_caches();
1757
c4a8f3019f9c * cdl/jffs2.cdl: Fixed outdated definitions for compression options.
asl
parents: 1713
diff changeset
669 jffs2_compressors_exit();
c4a8f3019f9c * cdl/jffs2.cdl: Fixed outdated definitions for compression options.
asl
parents: 1713
diff changeset
670 }
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
671 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
672 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
673
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
674 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
675 // jffs2_open()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
676 // Open a file for reading or writing.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
677
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
678 static int jffs2_open(cyg_mtab_entry * mte, cyg_dir dir, const char *name,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
679 int mode, cyg_file * file)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
680 {
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
681
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
682 jffs2_dirsearch ds;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
683 struct _inode *node = NULL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
684 int err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
685
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
686 D2(printf("jffs2_open\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
687
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
688 /* If no chdir has been called and we were the first file system
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
689 mounted, we get called with dir == NULL. Deal with it */
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
690 if (!dir)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
691 dir = mte->root;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
692
1549
472128e44522 * src/fs-ecos.c:
asl
parents: 1547
diff changeset
693 #ifndef CYGOPT_FS_JFFS2_WRITE
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
694 if (mode & (O_CREAT|O_TRUNC|O_WRONLY))
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
695 return EROFS;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
696 #endif
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
697 init_dirsearch(&ds, (struct _inode *) dir,
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
698 (const unsigned char *) name);
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
699
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
700 err = jffs2_find(&ds);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
701
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
702 if (err == ENOENT) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
703 #ifdef CYGOPT_FS_JFFS2_WRITE
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
704 if (ds.last && (mode & O_CREAT)) {
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
705
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
706 // No node there, if the O_CREAT bit is set then we must
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
707 // create a new one. The dir and name fields of the dirsearch
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
708 // object will have been updated so we know where to put it.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
709
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
710 err = jffs2_create(ds.dir, ds.name, S_IRUGO|S_IXUGO|S_IWUSR|S_IFREG, &node);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
711
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
712 if (err != 0) {
1816
658319b65ae3 * src/fs-ecos.c (jffs2_open): Call iput on dir node if
asl
parents: 1812
diff changeset
713 //Possible orphaned inode on the flash - but will be gc'd
658319b65ae3 * src/fs-ecos.c (jffs2_open): Call iput on dir node if
asl
parents: 1812
diff changeset
714 jffs2_iput(ds.dir);
1890
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
715 return -err;
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
716 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
717
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
718 err = ENOERR;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
719 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
720 #endif
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
721 } else if (err == ENOERR) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
722 // The node exists. If the O_CREAT and O_EXCL bits are set, we
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
723 // must fail the open.
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
724
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
725 if ((mode & (O_CREAT | O_EXCL)) == (O_CREAT | O_EXCL)) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
726 jffs2_iput(ds.node);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
727 err = EEXIST;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
728 } else
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
729 node = ds.node;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
730 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
731
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
732 // Finished with the directory now
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
733 jffs2_iput(ds.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
734
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
735 if (err != ENOERR)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
736 return err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
737
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
738 // Check that we actually have a file here
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
739 if (S_ISDIR(node->i_mode)) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
740 jffs2_iput(node);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
741 return EISDIR;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
742 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
743
1897
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
744 // If the O_TRUNC bit is set we must clean out the file data.
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
745 if (mode & O_TRUNC) {
1897
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
746 #ifdef CYGOPT_FS_JFFS2_WRITE
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
747 err = jffs2_truncate_file(node);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
748 if (err) {
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
749 jffs2_iput(node);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
750 return err;
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
751 }
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
752 #else
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
753 jffs2_iput(node);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
754 return EROFS;
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
755 #endif
1897
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
756 }
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
757
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
758 // Initialise the file object
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
759 file->f_flag |= mode & CYG_FILE_MODE_MASK;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
760 file->f_type = CYG_FILE_TYPE_FILE;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
761 file->f_ops = &jffs2_fileops;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
762 file->f_offset = (mode & O_APPEND) ? node->i_size : 0;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
763 file->f_data = (CYG_ADDRWORD) node;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
764 file->f_xops = 0;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
765
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
766 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
767 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
768
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
769 #ifdef CYGOPT_FS_JFFS2_WRITE
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
770 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
771 // jffs2_ops_unlink()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
772 // Remove a file link from its directory.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
773
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
774 static int jffs2_ops_unlink(cyg_mtab_entry * mte, cyg_dir dir, const char *name)
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
775 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
776 jffs2_dirsearch ds;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
777 int err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
778
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
779 D2(printf("jffs2_ops_unlink\n"));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
780
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
781 init_dirsearch(&ds, (struct _inode *) dir,
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
782 (const unsigned char *)name);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
783
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
784 err = jffs2_find(&ds);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
785
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
786 if (err != ENOERR) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
787 jffs2_iput(ds.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
788 return err;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
789 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
790
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
791 // Cannot unlink directories, use rmdir() instead
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
792 if (S_ISDIR(ds.node->i_mode)) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
793 jffs2_iput(ds.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
794 jffs2_iput(ds.node);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
795 return EPERM;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
796 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
797
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
798 // Delete it from its directory
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
799
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
800 err = jffs2_unlink(ds.dir, ds.node, ds.name);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
801 jffs2_iput(ds.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
802 jffs2_iput(ds.node);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
803
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
804 return -err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
805 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
806
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
807 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
808 // jffs2_ops_mkdir()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
809 // Create a new directory.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
810
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
811 static int jffs2_ops_mkdir(cyg_mtab_entry * mte, cyg_dir dir, const char *name)
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
812 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
813 jffs2_dirsearch ds;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
814 int err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
815
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
816 D2(printf("jffs2_ops_mkdir\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
817
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
818 init_dirsearch(&ds, (struct _inode *) dir,
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
819 (const unsigned char *)name);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
820
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
821 err = jffs2_find(&ds);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
822
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
823 if (err == ENOENT) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
824 if (ds.last) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
825 // The entry does not exist, and it is the last element in
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
826 // the pathname, so we can create it here.
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
827
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
828 err = -jffs2_mkdir(ds.dir, ds.name, S_IRUGO|S_IXUGO|S_IWUSR);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
829 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
830 // If this was not the last element, then an intermediate
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
831 // directory does not exist.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
832 } else {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
833 // If there we no error, something already exists with that
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
834 // name, so we cannot create another one.
1890
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
835 if (err == ENOERR) {
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
836 jffs2_iput(ds.node);
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
837 err = EEXIST;
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
838 }
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
839 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
840 jffs2_iput(ds.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
841 return err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
842 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
843
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
844 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
845 // jffs2_ops_rmdir()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
846 // Remove a directory.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
847
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
848 static int jffs2_ops_rmdir(cyg_mtab_entry * mte, cyg_dir dir, const char *name)
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
849 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
850 jffs2_dirsearch ds;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
851 int err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
852
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
853 D2(printf("jffs2_ops_rmdir\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
854
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
855 init_dirsearch(&ds, (struct _inode *) dir,
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
856 (const unsigned char *)name);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
857
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
858 err = jffs2_find(&ds);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
859
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
860 if (err != ENOERR) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
861 jffs2_iput(ds.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
862 return err;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
863 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
864
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
865 // Check that this is actually a directory.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
866 if (!S_ISDIR(ds.node->i_mode)) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
867 jffs2_iput(ds.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
868 jffs2_iput(ds.node);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
869 return EPERM;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
870 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
871
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
872 err = jffs2_rmdir(ds.dir, ds.node, ds.name);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
873
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
874 jffs2_iput(ds.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
875 jffs2_iput(ds.node);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
876 return -err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
877 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
878
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
879 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
880 // jffs2_ops_rename()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
881 // Rename a file/dir.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
882
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
883 static int jffs2_ops_rename(cyg_mtab_entry * mte, cyg_dir dir1,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
884 const char *name1, cyg_dir dir2, const char *name2)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
885 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
886 jffs2_dirsearch ds1, ds2;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
887 int err;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
888
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
889 D2(printf("jffs2_ops_rename\n"));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
890
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
891 init_dirsearch(&ds1, (struct _inode *) dir1,
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
892 (const unsigned char *)name1);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
893
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
894 err = jffs2_find(&ds1);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
895
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
896 if (err != ENOERR) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
897 jffs2_iput(ds1.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
898 return err;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
899 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
900
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
901 init_dirsearch(&ds2, (struct _inode *) dir2,
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
902 (const unsigned char *)name2);
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
903
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
904 err = jffs2_find(&ds2);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
905
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
906 // Allow through renames to non-existent objects.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
907 if (ds2.last && err == ENOENT) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
908 ds2.node = NULL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
909 err = ENOERR;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
910 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
911
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
912 if (err != ENOERR) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
913 jffs2_iput(ds1.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
914 jffs2_iput(ds1.node);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
915 jffs2_iput(ds2.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
916 return err;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
917 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
918
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
919 // Null rename, just return
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
920 if (ds1.node == ds2.node) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
921 err = ENOERR;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
922 goto out;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
923 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
924
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
925 // First deal with any entry that is at the destination
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
926 if (ds2.node) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
927 // Check that we are renaming like-for-like
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
928
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
929 if (!S_ISDIR(ds1.node->i_mode) && S_ISDIR(ds2.node->i_mode)) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
930 err = EISDIR;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
931 goto out;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
932 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
933
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
934 if (S_ISDIR(ds1.node->i_mode) && !S_ISDIR(ds2.node->i_mode)) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
935 err = ENOTDIR;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
936 goto out;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
937 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
938
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
939 // Now delete the destination directory entry
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
940 /* Er, what happened to atomicity of rename()? */
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
941 err = -jffs2_unlink(ds2.dir, ds2.node, ds2.name);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
942
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
943 if (err != 0)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
944 goto out;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
945
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
946 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
947 // Now we know that there is no clashing node at the destination,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
948 // make a new direntry at the destination and delete the old entry
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
949 // at the source.
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
950
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
951 err = -jffs2_rename(ds1.dir, ds1.node, ds1.name, ds2.dir, ds2.name);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
952
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
953 // Update directory times
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
954 if (!err)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
955 ds1.dir->i_ctime =
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
956 ds1.dir->i_mtime =
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
957 ds2.dir->i_ctime = ds2.dir->i_mtime = cyg_timestamp();
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
958 out:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
959 jffs2_iput(ds1.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
960 if (S_ISDIR(ds1.node->i_mode)) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
961 /* Renamed a directory to elsewhere... so fix up its
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
962 i_parent pointer and the i_counts of its old and
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
963 new parents. */
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
964 jffs2_iput(ds1.node->i_parent);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
965 ds1.node->i_parent = ds2.dir;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
966 /* We effectively increase its use count by not... */
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
967 } else {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
968 jffs2_iput(ds2.dir); /* ... doing this */
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
969 }
1890
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
970 jffs2_iput(ds1.node);
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
971 if (ds2.node)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
972 jffs2_iput(ds2.node);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
973
1890
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
974 return err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
975 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
976
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
977 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
978 // jffs2_ops_link()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
979 // Make a new directory entry for a file.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
980
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
981 static int jffs2_ops_link(cyg_mtab_entry * mte, cyg_dir dir1, const char *name1,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
982 cyg_dir dir2, const char *name2, int type)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
983 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
984 jffs2_dirsearch ds1, ds2;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
985 int err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
986
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
987 D2(printf("jffs2_ops_link\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
988
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
989 // Only do hard links for now in this filesystem
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
990 if (type != CYG_FSLINK_HARD)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
991 return EINVAL;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
992
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
993 init_dirsearch(&ds1, (struct _inode *) dir1,
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
994 (const unsigned char *) name1);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
995
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
996 err = jffs2_find(&ds1);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
997
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
998 if (err != ENOERR) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
999 jffs2_iput(ds1.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1000 return err;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1001 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1002
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
1003 init_dirsearch(&ds2, (struct _inode *) dir2,
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
1004 (const unsigned char *) name2);
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1005
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1006 err = jffs2_find(&ds2);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1007
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1008 // Don't allow links to existing objects
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1009 if (err == ENOERR) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1010 jffs2_iput(ds1.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1011 jffs2_iput(ds1.node);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1012 jffs2_iput(ds2.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1013 jffs2_iput(ds2.node);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1014 return EEXIST;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1015 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1016
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1017 // Allow through links to non-existing terminal objects
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1018 if (ds2.last && err == ENOENT) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1019 ds2.node = NULL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1020 err = ENOERR;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1021 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1022
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1023 if (err != ENOERR) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1024 jffs2_iput(ds1.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1025 jffs2_iput(ds1.node);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1026 jffs2_iput(ds2.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1027 return err;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1028 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1029
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1030 // Now we know that there is no existing node at the destination,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1031 // make a new direntry at the destination.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1032
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1033 err = jffs2_link(ds1.node, ds2.dir, ds2.name);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1034
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1035 if (err == 0)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1036 ds1.node->i_ctime =
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1037 ds2.dir->i_ctime = ds2.dir->i_mtime = cyg_timestamp();
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1038
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1039 jffs2_iput(ds1.dir);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1040 jffs2_iput(ds1.node);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1041 jffs2_iput(ds2.dir);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1042
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1043 return -err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1044 }
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1045 #endif /* CYGOPT_FS_JFFS2_WRITE */
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1046 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1047 // jffs2_opendir()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1048 // Open a directory for reading.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1049
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1050 static int jffs2_opendir(cyg_mtab_entry * mte, cyg_dir dir, const char *name,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1051 cyg_file * file)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1052 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1053 jffs2_dirsearch ds;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1054 int err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1055
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1056 D2(printf("jffs2_opendir\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1057
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
1058 init_dirsearch(&ds, (struct _inode *) dir,
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
1059 (const unsigned char *) name);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1060
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1061 err = jffs2_find(&ds);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1062
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1063 jffs2_iput(ds.dir);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1064
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1065 if (err != ENOERR)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1066 return err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1067
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1068 // check it is really a directory.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1069 if (!S_ISDIR(ds.node->i_mode)) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1070 jffs2_iput(ds.node);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1071 return ENOTDIR;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1072 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1073
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1074 // Initialize the file object, setting the f_ops field to a
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1075 // special set of file ops.
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1076
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1077 file->f_type = CYG_FILE_TYPE_FILE;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1078 file->f_ops = &jffs2_dirops;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1079 file->f_offset = 0;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1080 file->f_data = (CYG_ADDRWORD) ds.node;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1081 file->f_xops = 0;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1082
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1083 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1084
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1085 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1086
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1087 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1088 // jffs2_chdir()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1089 // Change directory support.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1090
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1091 static int jffs2_chdir(cyg_mtab_entry * mte, cyg_dir dir, const char *name,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1092 cyg_dir * dir_out)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1093 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1094 D2(printf("jffs2_chdir\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1095
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1096 if (dir_out != NULL) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1097 // This is a request to get a new directory pointer in
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1098 // *dir_out.
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1099
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1100 jffs2_dirsearch ds;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1101 int err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1102
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
1103 init_dirsearch(&ds, (struct _inode *) dir,
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
1104 (const unsigned char *) name);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1105
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1106 err = jffs2_find(&ds);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1107 jffs2_iput(ds.dir);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1108
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1109 if (err != ENOERR)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1110 return err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1111
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1112 // check it is a directory
1890
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1113 if (!S_ISDIR(ds.node->i_mode)) {
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1114 jffs2_iput(ds.node);
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1115 return ENOTDIR;
1890
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1116 }
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1117
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1118 // Pass it out
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1119 *dir_out = (cyg_dir) ds.node;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1120 } else {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1121 // If no output dir is required, this means that the mte and
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1122 // dir arguments are the current cdir setting and we should
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1123 // forget this fact.
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1124
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1125 struct _inode *node = (struct _inode *) dir;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1126
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1127 // Just decrement directory reference count.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1128 jffs2_iput(node);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1129 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1130
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1131 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1132 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1133
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1134 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1135 // jffs2_stat()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1136 // Get struct stat info for named object.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1137
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1138 static int jffs2_stat(cyg_mtab_entry * mte, cyg_dir dir, const char *name,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1139 struct stat *buf)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1140 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1141 jffs2_dirsearch ds;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1142 int err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1143
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1144 D2(printf("jffs2_stat\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1145
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
1146 init_dirsearch(&ds, (struct _inode *) dir,
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
1147 (const unsigned char *) name);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1148
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1149 err = jffs2_find(&ds);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1150 jffs2_iput(ds.dir);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1151
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1152 if (err != ENOERR)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1153 return err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1154
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1155 // Fill in the status
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1156 buf->st_mode = ds.node->i_mode;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1157 buf->st_ino = ds.node->i_ino;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1158 buf->st_dev = 0;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1159 buf->st_nlink = ds.node->i_nlink;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1160 buf->st_uid = ds.node->i_uid;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1161 buf->st_gid = ds.node->i_gid;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1162 buf->st_size = ds.node->i_size;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1163 buf->st_atime = ds.node->i_atime;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1164 buf->st_mtime = ds.node->i_mtime;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1165 buf->st_ctime = ds.node->i_ctime;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1166
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1167 jffs2_iput(ds.node);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1168
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1169 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1170 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1171
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1172 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1173 // jffs2_getinfo()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1174 // Getinfo. Currently only support pathconf().
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1175
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1176 static int jffs2_getinfo(cyg_mtab_entry * mte, cyg_dir dir, const char *name,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1177 int key, void *buf, int len)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1178 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1179 jffs2_dirsearch ds;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1180 int err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1181
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1182 D2(printf("jffs2_getinfo\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1183
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
1184 init_dirsearch(&ds, (struct _inode *) dir,
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
1185 (const unsigned char *) name);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1186
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1187 err = jffs2_find(&ds);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1188 jffs2_iput(ds.dir);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1189
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1190 if (err != ENOERR)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1191 return err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1192
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1193 switch (key) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1194 case FS_INFO_CONF:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1195 err = jffs2_pathconf(ds.node, (struct cyg_pathconf_info *) buf);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1196 break;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1197
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1198 default:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1199 err = EINVAL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1200 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1201
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1202 jffs2_iput(ds.node);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1203 return err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1204 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1205
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1206 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1207 // jffs2_setinfo()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1208 // Setinfo. Nothing to support here at present.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1209
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1210 static int jffs2_setinfo(cyg_mtab_entry * mte, cyg_dir dir, const char *name,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1211 int key, void *buf, int len)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1212 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1213 // No setinfo keys supported at present
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1214
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1215 D2(printf("jffs2_setinfo\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1216
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1217 return EINVAL;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1218 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1219
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1220 //==========================================================================
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1221 // File operations
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1222
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1223 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1224 // jffs2_fo_read()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1225 // Read data from the file.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1226
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1227 static int jffs2_fo_read(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio)
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1228 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1229 struct _inode *inode = (struct _inode *) fp->f_data;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1230 struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1231 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1232 int i;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1233 ssize_t resid = uio->uio_resid;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1234 off_t pos = fp->f_offset;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1235
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1236 down(&f->sem);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1237
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1238 // Loop over the io vectors until there are none left
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1239 for (i = 0; i < uio->uio_iovcnt && pos < inode->i_size; i++) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1240 int ret;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1241 cyg_iovec *iov = &uio->uio_iov[i];
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1242 off_t len = min(iov->iov_len, inode->i_size - pos);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1243
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1244 D2(printf("jffs2_fo_read inode size %d\n", inode->i_size));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1245
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1246 ret =
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1247 jffs2_read_inode_range(c, f,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1248 (unsigned char *) iov->iov_base, pos,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1249 len);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1250 if (ret) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1251 D1(printf
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1252 ("jffs2_fo_read(): read_inode_range failed %d\n",
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1253 ret));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1254 uio->uio_resid = resid;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1255 up(&f->sem);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1256 return -ret;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1257 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1258 resid -= len;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1259 pos += len;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1260 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1261
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1262 // We successfully read some data, update the node's access time
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1263 // and update the file offset and transfer residue.
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1264
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1265 inode->i_atime = cyg_timestamp();
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1266
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1267 uio->uio_resid = resid;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1268 fp->f_offset = pos;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1269
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1270 up(&f->sem);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1271
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1272 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1273 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1274
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1275
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1276 #ifdef CYGOPT_FS_JFFS2_WRITE
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1277 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1278 // jffs2_fo_write()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1279 // Write data to file.
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1280 static int jffs2_extend_file (struct _inode *inode, struct jffs2_raw_inode *ri,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1281 unsigned long offset)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1282 {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1283 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1284 struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1285 struct jffs2_full_dnode *fn;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1286 uint32_t phys_ofs, alloc_len;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1287 int ret = 0;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1288
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1289 /* Make new hole frag from old EOF to new page */
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1290 D1(printk(KERN_DEBUG "Writing new hole frag 0x%x-0x%x between current EOF and new page\n",
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1291 (unsigned int)inode->i_size, offset));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1292
1567
9a3dbd0dc33d * src/fs-ecos.c (jffs2_extend_file): Fix creation of hole inode's
asl
parents: 1563
diff changeset
1293 ret = jffs2_reserve_space(c, sizeof(*ri), &phys_ofs, &alloc_len, ALLOC_NORMAL);
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1294 if (ret)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1295 return ret;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1296
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1297 down(&f->sem);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1298
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1299 ri->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1300 ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
1567
9a3dbd0dc33d * src/fs-ecos.c (jffs2_extend_file): Fix creation of hole inode's
asl
parents: 1563
diff changeset
1301 ri->totlen = cpu_to_je32(sizeof(*ri));
9a3dbd0dc33d * src/fs-ecos.c (jffs2_extend_file): Fix creation of hole inode's
asl
parents: 1563
diff changeset
1302 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1303
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1304 ri->version = cpu_to_je32(++f->highest_version);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1305 ri->isize = cpu_to_je32(max((uint32_t)inode->i_size, offset));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1306
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1307 ri->offset = cpu_to_je32(inode->i_size);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1308 ri->dsize = cpu_to_je32(offset - inode->i_size);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1309 ri->csize = cpu_to_je32(0);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1310 ri->compr = JFFS2_COMPR_ZERO;
1567
9a3dbd0dc33d * src/fs-ecos.c (jffs2_extend_file): Fix creation of hole inode's
asl
parents: 1563
diff changeset
1311 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1312 ri->data_crc = cpu_to_je32(0);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1313
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1314 fn = jffs2_write_dnode(c, f, ri, NULL, 0, phys_ofs, ALLOC_NORMAL);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1315 jffs2_complete_reservation(c);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1316 if (IS_ERR(fn)) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1317 ret = PTR_ERR(fn);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1318 up(&f->sem);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1319 return ret;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1320 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1321 ret = jffs2_add_full_dnode_to_inode(c, f, fn);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1322 if (f->metadata) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1323 jffs2_mark_node_obsolete(c, f->metadata->raw);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1324 jffs2_free_full_dnode(f->metadata);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1325 f->metadata = NULL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1326 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1327 if (ret) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1328 D1(printk(KERN_DEBUG "Eep. add_full_dnode_to_inode() failed in prepare_write, returned %d\n", ret));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1329 jffs2_mark_node_obsolete(c, fn->raw);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1330 jffs2_free_full_dnode(fn);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1331 up(&f->sem);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1332 return ret;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1333 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1334 inode->i_size = offset;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1335 up(&f->sem);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1336 return 0;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1337 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1338
1897
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1339 // jffs2_fo_open()
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1340 // Truncate a file
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1341 static int jffs2_truncate_file (struct _inode *inode)
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1342 {
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1343 struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1344 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1345 struct jffs2_full_dnode *new_metadata, * old_metadata;
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1346 struct jffs2_raw_inode *ri;
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1347 uint32_t phys_ofs, alloclen;
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1348 int err;
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1349
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1350 ri = jffs2_alloc_raw_inode();
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1351 if (!ri) {
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1352 return ENOMEM;
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1353 }
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1354 err = jffs2_reserve_space(c, sizeof(*ri), &phys_ofs, &alloclen, ALLOC_NORMAL);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1355
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1356 if (err) {
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1357 jffs2_free_raw_inode(ri);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1358 return err;
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1359 }
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1360 down(&f->sem);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1361 ri->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1362 ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1363 ri->totlen = cpu_to_je32(sizeof(*ri));
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1364 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1365
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1366 ri->ino = cpu_to_je32(inode->i_ino);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1367 ri->version = cpu_to_je32(++f->highest_version);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1368
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1369 ri->uid = cpu_to_je16(inode->i_uid);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1370 ri->gid = cpu_to_je16(inode->i_gid);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1371 ri->mode = cpu_to_jemode(inode->i_mode);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1372 ri->isize = cpu_to_je32(0);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1373 ri->atime = cpu_to_je32(inode->i_atime);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1374 ri->mtime = cpu_to_je32(cyg_timestamp());
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1375 ri->offset = cpu_to_je32(0);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1376 ri->csize = ri->dsize = cpu_to_je32(0);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1377 ri->compr = JFFS2_COMPR_NONE;
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1378 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1379 ri->data_crc = cpu_to_je32(0);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1380 new_metadata = jffs2_write_dnode(c, f, ri, NULL, 0,
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1381 phys_ofs, ALLOC_NORMAL);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1382 if (IS_ERR(new_metadata)) {
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1383 jffs2_complete_reservation(c);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1384 jffs2_free_raw_inode(ri);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1385 up(&f->sem);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1386 return PTR_ERR(new_metadata);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1387 }
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1388
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1389 /* It worked. Update the inode */
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1390 inode->i_mtime = cyg_timestamp();
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1391 inode->i_size = 0;
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1392 old_metadata = f->metadata;
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
1393 jffs2_truncate_fragtree (c, &f->fragtree, 0);
1897
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1394 f->metadata = new_metadata;
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1395 if (old_metadata) {
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1396 jffs2_mark_node_obsolete(c, old_metadata->raw);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1397 jffs2_free_full_dnode(old_metadata);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1398 }
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1399 jffs2_free_raw_inode(ri);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1400
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1401 up(&f->sem);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1402 jffs2_complete_reservation(c);
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1403
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1404 return 0;
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1405 }
45b8b118a6a8 * src/fs-ecos.c (jffs2_truncate_file): Correctly truncate a file
asl
parents: 1890
diff changeset
1406
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1407 static int jffs2_fo_write(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio)
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1408 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1409 struct _inode *inode = (struct _inode *) fp->f_data;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1410 off_t pos = fp->f_offset;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1411 ssize_t resid = uio->uio_resid;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1412 struct jffs2_raw_inode ri;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1413 struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1414 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1415 int i;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1416
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1417 // If the APPEND mode bit was supplied, force all writes to
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1418 // the end of the file.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1419 if (fp->f_flag & CYG_FAPPEND)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1420 pos = fp->f_offset = inode->i_size;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1421
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1422 if (pos < 0)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1423 return EINVAL;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1424
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1425 memset(&ri, 0, sizeof(ri));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1426
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1427 ri.ino = cpu_to_je32(f->inocache->ino);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1428 ri.mode = cpu_to_jemode(inode->i_mode);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1429 ri.uid = cpu_to_je16(inode->i_uid);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1430 ri.gid = cpu_to_je16(inode->i_gid);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1431 ri.atime = ri.ctime = ri.mtime = cpu_to_je32(cyg_timestamp());
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1432
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1433 if (pos > inode->i_size) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1434 int err;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1435 ri.version = cpu_to_je32(++f->highest_version);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1436 err = jffs2_extend_file(inode, &ri, pos);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1437 if (err)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1438 return -err;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1439 }
1562
8bafb5f8a697 Merge changes from MTD - fix file truncate issue
gthomas
parents: 1550
diff changeset
1440 ri.isize = cpu_to_je32(inode->i_size);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1441
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1442 // Now loop over the iovecs until they are all done, or
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1443 // we get an error.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1444 for (i = 0; i < uio->uio_iovcnt; i++) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1445 cyg_iovec *iov = &uio->uio_iov[i];
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
1446 unsigned char *buf = iov->iov_base;
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1447 off_t len = iov->iov_len;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1448
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1449 uint32_t writtenlen;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1450 int err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1451
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1452 D2(printf("jffs2_fo_write page_start_pos %d\n", pos));
1890
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1453 D2(printf("jffs2_fo_write transfer size %d\n", len));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1454
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1455 err = jffs2_write_inode_range(c, f, &ri, buf,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1456 pos, len, &writtenlen);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1457 if (err)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1458 return -err;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1459
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1460 if (writtenlen != len)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1461 return ENOSPC;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1462
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1463 pos += len;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1464 resid -= len;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1465 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1466
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1467 // We wrote some data successfully, update the modified and access
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1468 // times of the inode, increase its size appropriately, and update
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1469 // the file offset and transfer residue.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1470 inode->i_mtime = inode->i_ctime = je32_to_cpu(ri.mtime);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1471 if (pos > inode->i_size)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1472 inode->i_size = pos;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1473
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1474 uio->uio_resid = resid;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1475 fp->f_offset = pos;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1476
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1477 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1478 }
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1479 #endif /* CYGOPT_FS_JFFS2_WRITE */
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1480
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1481 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1482 // jffs2_fo_lseek()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1483 // Seek to a new file position.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1484
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1485 static int jffs2_fo_lseek(struct CYG_FILE_TAG *fp, off_t * apos, int whence)
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1486 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1487 struct _inode *node = (struct _inode *) fp->f_data;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1488 off_t pos = *apos;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1489
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1490 D2(printf("jffs2_fo_lseek\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1491
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1492 switch (whence) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1493 case SEEK_SET:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1494 // Pos is already where we want to be.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1495 break;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1496
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1497 case SEEK_CUR:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1498 // Add pos to current offset.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1499 pos += fp->f_offset;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1500 break;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1501
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1502 case SEEK_END:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1503 // Add pos to file size.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1504 pos += node->i_size;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1505 break;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1506
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1507 default:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1508 return EINVAL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1509 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1510
1713
0492a413d138 * Merge from public MTD.
asl
parents: 1601
diff changeset
1511 if (pos < 0 )
1601
d708ea3b49d2 Merge from MTD (minor safety check)
gthomas
parents: 1567
diff changeset
1512 return EINVAL;
d708ea3b49d2 Merge from MTD (minor safety check)
gthomas
parents: 1567
diff changeset
1513
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1514 // All OK, set fp offset and return new position.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1515 *apos = fp->f_offset = pos;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1516
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1517 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1518 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1519
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1520 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1521 // jffs2_fo_ioctl()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1522 // Handle ioctls. Currently none are defined.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1523
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1524 static int jffs2_fo_ioctl(struct CYG_FILE_TAG *fp, CYG_ADDRWORD com,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1525 CYG_ADDRWORD data)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1526 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1527 // No Ioctls currenly defined.
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1528
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1529 D2(printf("jffs2_fo_ioctl\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1530
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1531 return EINVAL;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1532 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1533
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1534 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1535 // jffs2_fo_fsync().
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1536 // Force the file out to data storage.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1537
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1538 static int jffs2_fo_fsync(struct CYG_FILE_TAG *fp, int mode)
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1539 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1540 // Data is always permanently where it belongs, nothing to do
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1541 // here.
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1542
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1543 D2(printf("jffs2_fo_fsync\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1544
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1545 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1546 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1547
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1548 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1549 // jffs2_fo_close()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1550 // Close a file. We just decrement the refcnt and let it go away if
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1551 // that is all that is keeping it here.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1552
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1553 static int jffs2_fo_close(struct CYG_FILE_TAG *fp)
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1554 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1555 struct _inode *node = (struct _inode *) fp->f_data;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1556
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1557 D2(printf("jffs2_fo_close\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1558
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1559 jffs2_iput(node);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1560
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1561 fp->f_data = 0; // zero data pointer
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1562
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1563 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1564 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1565
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1566 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1567 //jffs2_fo_fstat()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1568 // Get file status.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1569
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1570 static int jffs2_fo_fstat(struct CYG_FILE_TAG *fp, struct stat *buf)
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1571 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1572 struct _inode *node = (struct _inode *) fp->f_data;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1573
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1574 D2(printf("jffs2_fo_fstat\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1575
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1576 // Fill in the status
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1577 buf->st_mode = node->i_mode;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1578 buf->st_ino = node->i_ino;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1579 buf->st_dev = 0;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1580 buf->st_nlink = node->i_nlink;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1581 buf->st_uid = node->i_uid;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1582 buf->st_gid = node->i_gid;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1583 buf->st_size = node->i_size;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1584 buf->st_atime = node->i_atime;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1585 buf->st_mtime = node->i_mtime;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1586 buf->st_ctime = node->i_ctime;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1587
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1588 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1589 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1590
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1591 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1592 // jffs2_fo_getinfo()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1593 // Get info. Currently only supports fpathconf().
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1594
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1595 static int jffs2_fo_getinfo(struct CYG_FILE_TAG *fp, int key, void *buf,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1596 int len)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1597 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1598 struct _inode *node = (struct _inode *) fp->f_data;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1599 int err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1600
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1601 D2(printf("jffs2_fo_getinfo\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1602
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1603 switch (key) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1604 case FS_INFO_CONF:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1605 err = jffs2_pathconf(node, (struct cyg_pathconf_info *) buf);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1606 break;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1607
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1608 default:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1609 err = EINVAL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1610 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1611 return err;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1612
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1613 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1614 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1615
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1616 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1617 // jffs2_fo_setinfo()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1618 // Set info. Nothing supported here.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1619
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1620 static int jffs2_fo_setinfo(struct CYG_FILE_TAG *fp, int key, void *buf,
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1621 int len)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1622 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1623 // No setinfo key supported at present
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1624
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1625 D2(printf("jffs2_fo_setinfo\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1626
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1627 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1628 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1629
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1630 //==========================================================================
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1631 // Directory operations
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1632
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1633 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1634 // jffs2_fo_dirread()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1635 // Read a single directory entry from a file.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1636
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
1637 static __inline void filldir(char *nbuf, int nlen, const unsigned char *name, int namlen)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1638 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1639 int len = nlen < namlen ? nlen : namlen;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1640 memcpy(nbuf, name, len);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1641 nbuf[len] = '\0';
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1642 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1643
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1644 static int jffs2_fo_dirread(struct CYG_FILE_TAG *fp, struct CYG_UIO_TAG *uio)
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1645 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1646 struct _inode *d_inode = (struct _inode *) fp->f_data;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1647 struct dirent *ent = (struct dirent *) uio->uio_iov[0].iov_base;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1648 char *nbuf = ent->d_name;
2475
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1649 #ifdef CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1650 struct _inode *c_ino;
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1651 #endif
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1652 int nlen = sizeof (ent->d_name) - 1;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1653 off_t len = uio->uio_iov[0].iov_len;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1654 struct jffs2_inode_info *f;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1655 struct jffs2_sb_info *c;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1656 struct _inode *inode = d_inode;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1657 struct jffs2_full_dirent *fd;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1658 unsigned long offset, curofs;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1659 int found = 1;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1660
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1661 if (len < sizeof (struct dirent))
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1662 return EINVAL;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1663
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1664 D1(printk
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1665 (KERN_DEBUG "jffs2_readdir() for dir_i #%lu\n", d_inode->i_ino));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1666
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1667 f = JFFS2_INODE_INFO(inode);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1668 c = JFFS2_SB_INFO(inode->i_sb);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1669
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1670 offset = fp->f_offset;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1671
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1672 if (offset == 0) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1673 D1(printk
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1674 (KERN_DEBUG "Dirent 0: \".\", ino #%lu\n", inode->i_ino));
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
1675 filldir(nbuf, nlen, (const unsigned char *) ".", 1);
2475
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1676 #ifdef CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1677 // Flags here are the same as jffs2_mkdir. Make sure
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1678 // d_type is the same as st_mode of calling stat.
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1679 ent->d_type =
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1680 jemode_to_cpu(cpu_to_jemode(S_IRUGO|S_IXUGO|S_IWUSR|S_IFDIR));
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1681 #endif
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1682 goto out;
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1683 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1684 if (offset == 1) {
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
1685 filldir(nbuf, nlen, (const unsigned char *) "..", 2);
2475
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1686 #ifdef CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1687 // Flags here are the same as jffs2_mkdir. Make sure
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1688 // d_type is the same as st_mode of calling stat.
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1689 ent->d_type =
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1690 jemode_to_cpu(cpu_to_jemode(S_IRUGO|S_IXUGO|S_IWUSR|S_IFDIR));
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1691 #endif
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1692 goto out;
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1693 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1694
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1695 curofs = 1;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1696 down(&f->sem);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1697 for (fd = f->dents; fd; fd = fd->next) {
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1698
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1699 curofs++;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1700 /* First loop: curofs = 2; offset = 2 */
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1701 if (curofs < offset) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1702 D2(printk
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1703 (KERN_DEBUG
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1704 "Skipping dirent: \"%s\", ino #%u, type %d, because curofs %ld < offset %ld\n",
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1705 fd->name, fd->ino, fd->type, curofs, offset));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1706 continue;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1707 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1708 if (!fd->ino) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1709 D2(printk
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1710 (KERN_DEBUG "Skipping deletion dirent \"%s\"\n",
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1711 fd->name));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1712 offset++;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1713 continue;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1714 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1715 D2(printk
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1716 (KERN_DEBUG "Dirent %ld: \"%s\", ino #%u, type %d\n", offset,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1717 fd->name, fd->ino, fd->type));
2042
5bcbb50b501e * Merge to public MTD
asl
parents: 1897
diff changeset
1718 filldir(nbuf, nlen, fd->name, strlen((char *)fd->name));
2475
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1719 #ifdef CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1720 c_ino = jffs2_iget(inode->i_sb, fd->ino);
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1721 if(IS_ERR(c_ino)) {
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1722 D1(printk(KERN_WARNING "get entry inode failed\n"));
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1723 // fileio already set it to zero, so not needed here
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1724 // ent->d_type = 0;
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1725 }
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1726 else {
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1727 ent->d_type = c_ino->i_mode;
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1728 jffs2_iput(c_ino);
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1729 }
e302e779e69b * cdl/jffs2.cdl: Use CYGPKG_FS_JFFS2_RET_DIRENT_DTYPE to control
asl
parents: 2199
diff changeset
1730 #endif
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1731 goto out_sem;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1732 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1733 /* Reached the end of the directory */
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1734 found = 0;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1735 out_sem:
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1736 up(&f->sem);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1737 out:
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1738 fp->f_offset = ++offset;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1739 if (found) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1740 uio->uio_resid -= sizeof (struct dirent);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1741 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1742 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1743 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1744
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1745 // -------------------------------------------------------------------------
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1746 // jffs2_fo_dirlseek()
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1747 // Seek directory to start.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1748
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1749 static int jffs2_fo_dirlseek(struct CYG_FILE_TAG *fp, off_t * pos, int whence)
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1750 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1751 // Only allow SEEK_SET to zero
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1752
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1753 D2(printf("jffs2_fo_dirlseek\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1754
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1755 if (whence != SEEK_SET || *pos != 0)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1756 return EINVAL;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1757
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1758 *pos = fp->f_offset = 0;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1759
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1760 return ENOERR;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1761 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1762
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1763 //==========================================================================
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1764 //
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1765 // Called by JFFS2
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1766 // ===============
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1767 //
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1768 //
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1769 //==========================================================================
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1770
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1771 unsigned char *jffs2_gc_fetch_page(struct jffs2_sb_info *c,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1772 struct jffs2_inode_info *f,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1773 unsigned long offset,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1774 unsigned long *priv)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1775 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1776 /* FIXME: This works only with one file system mounted at a time */
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1777 int ret;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1778
1834
121da35df27b * Merge from public MTD.
asl
parents: 1816
diff changeset
1779 ret = jffs2_read_inode_range(c, f, gc_buffer,
121da35df27b * Merge from public MTD.
asl
parents: 1816
diff changeset
1780 offset & ~(PAGE_CACHE_SIZE-1), PAGE_CACHE_SIZE);
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1781 if (ret)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1782 return ERR_PTR(ret);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1783
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1784 return gc_buffer;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1785 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1786
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1787 void jffs2_gc_release_page(struct jffs2_sb_info *c,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1788 unsigned char *ptr,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1789 unsigned long *priv)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1790 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1791 /* Do nothing */
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1792 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1793
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1794 static struct _inode *new_inode(struct super_block *sb)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1795 {
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1796
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1797 // Only called in write.c jffs2_new_inode
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1798 // Always adds itself to inode cache
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1799
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1800 struct _inode *inode;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1801 struct _inode *cached_inode;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1802
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1803 inode = malloc(sizeof (struct _inode));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1804 if (inode == NULL)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1805 return 0;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1806
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1807 D2(printf
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1808 ("malloc new_inode %x ####################################\n",
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1809 inode));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1810
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1811 memset(inode, 0, sizeof (struct _inode));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1812 inode->i_sb = sb;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1813 inode->i_ino = 1;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1814 inode->i_count = 1;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1815 inode->i_nlink = 1; // Let JFFS2 manage the link count
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1816 inode->i_size = 0;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1817
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1818 inode->i_cache_next = NULL; // Newest inode, about to be cached
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1819
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1820 // Add to the icache
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1821 for (cached_inode = sb->s_root; cached_inode != NULL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1822 cached_inode = cached_inode->i_cache_next) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1823 if (cached_inode->i_cache_next == NULL) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1824 cached_inode->i_cache_next = inode; // Current last in cache points to newcomer
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1825 inode->i_cache_prev = cached_inode; // Newcomer points back to last
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1826 break;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1827 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1828 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1829 return inode;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1830 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1831
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1832 static struct _inode *ilookup(struct super_block *sb, cyg_uint32 ino)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1833 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1834 struct _inode *inode = NULL;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1835
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1836 D2(printf("ilookup\n"));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1837 // Check for this inode in the cache
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1838 for (inode = sb->s_root; inode != NULL; inode = inode->i_cache_next) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1839 if (inode->i_ino == ino) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1840 inode->i_count++;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1841 break;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1842 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1843 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1844 return inode;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1845 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1846
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1847 struct _inode *jffs2_iget(struct super_block *sb, cyg_uint32 ino)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1848 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1849 // Called in super.c jffs2_read_super, dir.c jffs2_lookup,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1850 // and gc.c jffs2_garbage_collect_pass
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1851
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1852 // Must first check for cached inode
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1853 // If this fails let new_inode create one
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1854
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1855 struct _inode *inode;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1856 int err;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1857
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1858 D2(printf("jffs2_iget\n"));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1859
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1860 inode = ilookup(sb, ino);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1861 if (inode)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1862 return inode;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1863
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1864 // Not cached, so malloc it
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1865 inode = new_inode(sb);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1866 if (inode == NULL)
1890
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1867 return ERR_PTR(-ENOMEM);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1868
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1869 inode->i_ino = ino;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1870
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1871 err = jffs2_read_inode(inode);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1872 if (err) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1873 printf("jffs2_read_inode() failed\n");
1890
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1874 inode->i_nlink = 0; // free _this_ bad inode right now
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1875 jffs2_iput(inode);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1876 inode = NULL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1877 return ERR_PTR(err);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1878 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1879 return inode;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1880 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1881
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1882 // -------------------------------------------------------------------------
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1883 // Decrement the reference count on an inode. If this makes the ref count
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1884 // zero, then this inode can be freed.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1885
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1886 void jffs2_iput(struct _inode *i)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1887 {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1888 // Called in jffs2_find
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1889 // (and jffs2_open and jffs2_ops_mkdir?)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1890 // super.c jffs2_read_super,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1891 // and gc.c jffs2_garbage_collect_pass
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1892 recurse:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1893 if (!i) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1894 printf("jffs2_iput() called with NULL inode\n");
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1895 // and let it fault...
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1896 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1897
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1898 i->i_count--;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1899
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1900 if (i->i_count < 0)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1901 BUG();
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1902
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1903 if (i->i_count)
1871
31350a76c03d * src/os-ecos.h: Added gc tread support
asl
parents: 1856
diff changeset
1904 return;
31350a76c03d * src/os-ecos.h: Added gc tread support
asl
parents: 1856
diff changeset
1905
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1906 if (!i->i_nlink) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1907 struct _inode *parent;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1908
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1909 // Remove from the icache linked list and free immediately
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1910 if (i->i_cache_prev)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1911 i->i_cache_prev->i_cache_next = i->i_cache_next;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1912 if (i->i_cache_next)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1913 i->i_cache_next->i_cache_prev = i->i_cache_prev;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1914
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1915 parent = i->i_parent;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1916 jffs2_clear_inode(i);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1917 memset(i, 0x5a, sizeof(*i));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1918 free(i);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1919
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1920 if (parent && parent != i) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1921 i = parent;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1922 goto recurse;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1923 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1924
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1925 } else {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1926 // Evict some _other_ inode with i_count zero, leaving
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1927 // this latest one in the cache for a while
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1928 icache_evict(i->i_sb->s_root, i);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1929 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1930 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1931
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1932
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1933 // -------------------------------------------------------------------------
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1934 // EOF jffs2.c
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1935
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1936
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1937 static inline void jffs2_init_inode_info(struct jffs2_inode_info *f)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1938 {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1939 memset(f, 0, sizeof(*f));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1940 init_MUTEX_LOCKED(&f->sem);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1941 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1942
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1943 static void jffs2_clear_inode (struct _inode *inode)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1944 {
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1945 /* We can forget about this inode for now - drop all
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1946 * the nodelists associated with it, etc.
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1947 */
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1948 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1949 struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1950
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1951 D1(printk(KERN_DEBUG "jffs2_clear_inode(): ino #%lu mode %o\n", inode->i_ino, inode->i_mode));
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1952
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1953 jffs2_do_clear_inode(c, f);
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1954 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1955
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1956
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1957 /* jffs2_new_inode: allocate a new inode and inocache, add it to the hash,
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1958 fill in the raw_inode while you're at it. */
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1959 struct _inode *jffs2_new_inode (struct _inode *dir_i, int mode, struct jffs2_raw_inode *ri)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1960 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1961 struct _inode *inode;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1962 struct super_block *sb = dir_i->i_sb;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1963 struct jffs2_sb_info *c;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1964 struct jffs2_inode_info *f;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1965 int ret;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1966
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1967 D1(printk(KERN_DEBUG "jffs2_new_inode(): dir_i %ld, mode 0x%x\n", dir_i->i_ino, mode));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1968
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1969 c = JFFS2_SB_INFO(sb);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1970
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1971 inode = new_inode(sb);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1972
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1973 if (!inode)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1974 return ERR_PTR(-ENOMEM);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1975
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1976 f = JFFS2_INODE_INFO(inode);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1977 jffs2_init_inode_info(f);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
1978
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1979 memset(ri, 0, sizeof(*ri));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1980 /* Set OS-specific defaults for new inodes */
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1981 ri->uid = ri->gid = cpu_to_je16(0);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1982 ri->mode = cpu_to_jemode(mode);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1983 ret = jffs2_do_new_inode (c, f, mode, ri);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1984 if (ret) {
1890
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1985 // forceful evict: f->sem is locked already, and the
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1986 // inode is bad.
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1987 if (inode->i_cache_prev)
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1988 inode->i_cache_prev->i_cache_next = inode->i_cache_next;
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1989 if (inode->i_cache_next)
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1990 inode->i_cache_next->i_cache_prev = inode->i_cache_prev;
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1991 up(&(f->sem));
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1992 jffs2_clear_inode(inode);
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1993 memset(inode, 0x6a, sizeof(*inode));
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1994 free(inode);
8ebde8529dc7 * src/fs-ecos.c
asl
parents: 1881
diff changeset
1995 return ERR_PTR(ret);
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1996 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1997 inode->i_nlink = 1;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1998 inode->i_ino = je32_to_cpu(ri->ino);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
1999 inode->i_mode = jemode_to_cpu(ri->mode);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2000 inode->i_gid = je16_to_cpu(ri->gid);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2001 inode->i_uid = je16_to_cpu(ri->uid);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2002 inode->i_atime = inode->i_ctime = inode->i_mtime = cyg_timestamp();
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2003 ri->atime = ri->mtime = ri->ctime = cpu_to_je32(inode->i_mtime);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
2004
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2005 inode->i_size = 0;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2006
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2007 return inode;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2008 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2009
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2010
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2011 static int jffs2_read_inode (struct _inode *inode)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2012 {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2013 struct jffs2_inode_info *f;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2014 struct jffs2_sb_info *c;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2015 struct jffs2_raw_inode latest_node;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2016 int ret;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2017
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2018 D1(printk(KERN_DEBUG "jffs2_read_inode(): inode->i_ino == %lu\n", inode->i_ino));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2019
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2020 f = JFFS2_INODE_INFO(inode);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2021 c = JFFS2_SB_INFO(inode->i_sb);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
2022
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2023 jffs2_init_inode_info(f);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2024
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2025 ret = jffs2_do_read_inode(c, f, inode->i_ino, &latest_node);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
2026
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2027 if (ret) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2028 up(&f->sem);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2029 return ret;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2030 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2031 inode->i_mode = jemode_to_cpu(latest_node.mode);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2032 inode->i_uid = je16_to_cpu(latest_node.uid);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2033 inode->i_gid = je16_to_cpu(latest_node.gid);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2034 inode->i_size = je32_to_cpu(latest_node.isize);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2035 inode->i_atime = je32_to_cpu(latest_node.atime);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2036 inode->i_mtime = je32_to_cpu(latest_node.mtime);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2037 inode->i_ctime = je32_to_cpu(latest_node.ctime);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
2038
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2039 inode->i_nlink = f->inocache->nlink;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2040 up(&f->sem);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2041
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2042 D1(printk(KERN_DEBUG "jffs2_read_inode() returning\n"));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2043 return 0;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
2044 }
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
2045
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
2046
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2047 void jffs2_gc_release_inode(struct jffs2_sb_info *c,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2048 struct jffs2_inode_info *f)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2049 {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2050 jffs2_iput(OFNI_EDONI_2SFFJ(f));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2051 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2052
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2053 struct jffs2_inode_info *jffs2_gc_fetch_inode(struct jffs2_sb_info *c,
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2054 int inum, int nlink)
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
2055 {
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2056 struct _inode *inode;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2057 struct jffs2_inode_cache *ic;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2058 if (!nlink) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2059 /* The inode has zero nlink but its nodes weren't yet marked
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2060 obsolete. This has to be because we're still waiting for
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2061 the final (close() and) jffs2_iput() to happen.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2062
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2063 There's a possibility that the final jffs2_iput() could have
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2064 happened while we were contemplating. In order to ensure
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2065 that we don't cause a new read_inode() (which would fail)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2066 for the inode in question, we use ilookup() in this case
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2067 instead of jffs2_iget().
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2068
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2069 The nlink can't _become_ zero at this point because we're
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2070 holding the alloc_sem, and jffs2_do_unlink() would also
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2071 need that while decrementing nlink on any inode.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2072 */
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2073 inode = ilookup(OFNI_BS_2SFFJ(c), inum);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2074 if (!inode) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2075 D1(printk(KERN_DEBUG "ilookup() failed for ino #%u; inode is probably deleted.\n",
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2076 inum));
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
2077
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2078 spin_lock(&c->inocache_lock);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2079 ic = jffs2_get_ino_cache(c, inum);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2080 if (!ic) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2081 D1(printk(KERN_DEBUG "Inode cache for ino #%u is gone.\n", inum));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2082 spin_unlock(&c->inocache_lock);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2083 return NULL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2084 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2085 if (ic->state != INO_STATE_CHECKEDABSENT) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2086 /* Wait for progress. Don't just loop */
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2087 D1(printk(KERN_DEBUG "Waiting for ino #%u in state %d\n",
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2088 ic->ino, ic->state));
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2089 sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2090 } else {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2091 spin_unlock(&c->inocache_lock);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2092 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
2093
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2094 return NULL;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2095 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2096 } else {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2097 /* Inode has links to it still; they're not going away because
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2098 jffs2_do_unlink() would need the alloc_sem and we have it.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2099 Just jffs2_iget() it, and if read_inode() is necessary that's OK.
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2100 */
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2101 inode = jffs2_iget(OFNI_BS_2SFFJ(c), inum);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2102 if (IS_ERR(inode))
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2103 return (void *)inode;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2104 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
2105
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2106 return JFFS2_INODE_INFO(inode);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2107 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2108
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2109
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
2110
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2111 uint32_t jffs2_from_os_mode(uint32_t osmode)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2112 {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2113 uint32_t jmode = ((osmode & S_IRUSR)?00400:0) |
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2114 ((osmode & S_IWUSR)?00200:0) |
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2115 ((osmode & S_IXUSR)?00100:0) |
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2116 ((osmode & S_IRGRP)?00040:0) |
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2117 ((osmode & S_IWGRP)?00020:0) |
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2118 ((osmode & S_IXGRP)?00010:0) |
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2119 ((osmode & S_IROTH)?00004:0) |
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2120 ((osmode & S_IWOTH)?00002:0) |
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2121 ((osmode & S_IXOTH)?00001:0);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2122
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2123 switch (osmode & S_IFMT) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2124 case S_IFSOCK:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2125 return jmode | 0140000;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2126 case S_IFLNK:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2127 return jmode | 0120000;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2128 case S_IFREG:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2129 return jmode | 0100000;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2130 case S_IFBLK:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2131 return jmode | 0060000;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2132 case S_IFDIR:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2133 return jmode | 0040000;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2134 case S_IFCHR:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2135 return jmode | 0020000;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2136 case S_IFIFO:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2137 return jmode | 0010000;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2138 case S_ISUID:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2139 return jmode | 0004000;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2140 case S_ISGID:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2141 return jmode | 0002000;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2142 #ifdef S_ISVTX
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2143 case S_ISVTX:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2144 return jmode | 0001000;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2145 #endif
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2146 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2147 printf("os_to_jffs2_mode() cannot convert 0x%x\n", osmode);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2148 BUG();
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2149 return 0;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2150 }
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
2151
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2152 uint32_t jffs2_to_os_mode (uint32_t jmode)
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2153 {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2154 uint32_t osmode = ((jmode & 00400)?S_IRUSR:0) |
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2155 ((jmode & 00200)?S_IWUSR:0) |
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2156 ((jmode & 00100)?S_IXUSR:0) |
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2157 ((jmode & 00040)?S_IRGRP:0) |
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2158 ((jmode & 00020)?S_IWGRP:0) |
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2159 ((jmode & 00010)?S_IXGRP:0) |
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2160 ((jmode & 00004)?S_IROTH:0) |
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2161 ((jmode & 00002)?S_IWOTH:0) |
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2162 ((jmode & 00001)?S_IXOTH:0);
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
2163
1443
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2164 switch(jmode & 00170000) {
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2165 case 0140000:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2166 return osmode | S_IFSOCK;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2167 case 0120000:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2168 return osmode | S_IFLNK;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2169 case 0100000:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2170 return osmode | S_IFREG;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2171 case 0060000:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2172 return osmode | S_IFBLK;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2173 case 0040000:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2174 return osmode | S_IFDIR;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2175 case 0020000:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2176 return osmode | S_IFCHR;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2177 case 0010000:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2178 return osmode | S_IFIFO;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2179 case 0004000:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2180 return osmode | S_ISUID;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2181 case 0002000:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2182 return osmode | S_ISGID;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2183 #ifdef S_ISVTX
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2184 case 0001000:
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2185 return osmode | S_ISVTX;
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2186 #endif
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2187 }
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2188 printf("jffs2_to_os_mode() cannot convert 0x%x\n", osmode);
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2189 BUG();
cd7d2afbc7dd Import latest JFFS2 code from David Woodhouse
gthomas
parents: 1403
diff changeset
2190 return 0;
570
a7947d436e85 Update to latest public JFFS2 sources
gthomas
parents:
diff changeset
2191 }