Branch data Line data Source code
1 : : /*
2 : : * JFFS2 -- Journalling Flash File System, Version 2.
3 : : *
4 : : * Copyright © 2001-2007 Red Hat, Inc.
5 : : * Copyright © 2004-2010 David Woodhouse <dwmw2@infradead.org>
6 : : *
7 : : * Created by David Woodhouse <dwmw2@infradead.org>
8 : : *
9 : : * For licensing information, see the file 'LICENCE' in this directory.
10 : : *
11 : : */
12 : :
13 : : #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
14 : :
15 : : #include <linux/kernel.h>
16 : : #include <linux/fs.h>
17 : : #include <linux/time.h>
18 : : #include <linux/pagemap.h>
19 : : #include <linux/highmem.h>
20 : : #include <linux/crc32.h>
21 : : #include <linux/jffs2.h>
22 : : #include "nodelist.h"
23 : :
24 : : static int jffs2_write_end(struct file *filp, struct address_space *mapping,
25 : : loff_t pos, unsigned len, unsigned copied,
26 : : struct page *pg, void *fsdata);
27 : : static int jffs2_write_begin(struct file *filp, struct address_space *mapping,
28 : : loff_t pos, unsigned len, unsigned flags,
29 : : struct page **pagep, void **fsdata);
30 : : static int jffs2_readpage (struct file *filp, struct page *pg);
31 : :
32 : 0 : int jffs2_fsync(struct file *filp, loff_t start, loff_t end, int datasync)
33 : : {
34 : 0 : struct inode *inode = filp->f_mapping->host;
35 : 0 : struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
36 : : int ret;
37 : :
38 : 0 : ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
39 [ # # ]: 0 : if (ret)
40 : : return ret;
41 : :
42 : 0 : mutex_lock(&inode->i_mutex);
43 : : /* Trigger GC to flush any pending writes for this inode */
44 : 0 : jffs2_flush_wbuf_gc(c, inode->i_ino);
45 : 0 : mutex_unlock(&inode->i_mutex);
46 : :
47 : 0 : return 0;
48 : : }
49 : :
50 : : const struct file_operations jffs2_file_operations =
51 : : {
52 : : .llseek = generic_file_llseek,
53 : : .open = generic_file_open,
54 : : .read = do_sync_read,
55 : : .aio_read = generic_file_aio_read,
56 : : .write = do_sync_write,
57 : : .aio_write = generic_file_aio_write,
58 : : .unlocked_ioctl=jffs2_ioctl,
59 : : .mmap = generic_file_readonly_mmap,
60 : : .fsync = jffs2_fsync,
61 : : .splice_read = generic_file_splice_read,
62 : : };
63 : :
64 : : /* jffs2_file_inode_operations */
65 : :
66 : : const struct inode_operations jffs2_file_inode_operations =
67 : : {
68 : : .get_acl = jffs2_get_acl,
69 : : .set_acl = jffs2_set_acl,
70 : : .setattr = jffs2_setattr,
71 : : .setxattr = jffs2_setxattr,
72 : : .getxattr = jffs2_getxattr,
73 : : .listxattr = jffs2_listxattr,
74 : : .removexattr = jffs2_removexattr
75 : : };
76 : :
77 : : const struct address_space_operations jffs2_file_address_operations =
78 : : {
79 : : .readpage = jffs2_readpage,
80 : : .write_begin = jffs2_write_begin,
81 : : .write_end = jffs2_write_end,
82 : : };
83 : :
84 : 0 : static int jffs2_do_readpage_nolock (struct inode *inode, struct page *pg)
85 : : {
86 : 0 : struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
87 : 0 : struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
88 : : unsigned char *pg_buf;
89 : : int ret;
90 : :
91 : : jffs2_dbg(2, "%s(): ino #%lu, page at offset 0x%lx\n",
92 : : __func__, inode->i_ino, pg->index << PAGE_CACHE_SHIFT);
93 : :
94 [ # # ]: 0 : BUG_ON(!PageLocked(pg));
95 : :
96 : 0 : pg_buf = kmap(pg);
97 : : /* FIXME: Can kmap fail? */
98 : :
99 : 0 : ret = jffs2_read_inode_range(c, f, pg_buf, pg->index << PAGE_CACHE_SHIFT, PAGE_CACHE_SIZE);
100 : :
101 [ # # ]: 0 : if (ret) {
102 : : ClearPageUptodate(pg);
103 : : SetPageError(pg);
104 : : } else {
105 : : SetPageUptodate(pg);
106 : : ClearPageError(pg);
107 : : }
108 : :
109 : 0 : flush_dcache_page(pg);
110 : 0 : kunmap(pg);
111 : :
112 : : jffs2_dbg(2, "readpage finished\n");
113 : 0 : return ret;
114 : : }
115 : :
116 : 0 : int jffs2_do_readpage_unlock(struct inode *inode, struct page *pg)
117 : : {
118 : 0 : int ret = jffs2_do_readpage_nolock(inode, pg);
119 : 0 : unlock_page(pg);
120 : 0 : return ret;
121 : : }
122 : :
123 : :
124 : 0 : static int jffs2_readpage (struct file *filp, struct page *pg)
125 : : {
126 : 0 : struct jffs2_inode_info *f = JFFS2_INODE_INFO(pg->mapping->host);
127 : : int ret;
128 : :
129 : 0 : mutex_lock(&f->sem);
130 : 0 : ret = jffs2_do_readpage_unlock(pg->mapping->host, pg);
131 : 0 : mutex_unlock(&f->sem);
132 : 0 : return ret;
133 : : }
134 : :
135 : 0 : static int jffs2_write_begin(struct file *filp, struct address_space *mapping,
136 : : loff_t pos, unsigned len, unsigned flags,
137 : : struct page **pagep, void **fsdata)
138 : : {
139 : : struct page *pg;
140 : 0 : struct inode *inode = mapping->host;
141 : 0 : struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
142 : 0 : struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
143 : : struct jffs2_raw_inode ri;
144 : 0 : uint32_t alloc_len = 0;
145 : 0 : pgoff_t index = pos >> PAGE_CACHE_SHIFT;
146 : 0 : uint32_t pageofs = index << PAGE_CACHE_SHIFT;
147 : : int ret = 0;
148 : :
149 : : jffs2_dbg(1, "%s()\n", __func__);
150 : :
151 [ # # ]: 0 : if (pageofs > inode->i_size) {
152 : 0 : ret = jffs2_reserve_space(c, sizeof(ri), &alloc_len,
153 : : ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
154 [ # # ]: 0 : if (ret)
155 : : return ret;
156 : : }
157 : :
158 : 0 : mutex_lock(&f->sem);
159 : 0 : pg = grab_cache_page_write_begin(mapping, index, flags);
160 [ # # ]: 0 : if (!pg) {
161 [ # # ]: 0 : if (alloc_len)
162 : 0 : jffs2_complete_reservation(c);
163 : 0 : mutex_unlock(&f->sem);
164 : 0 : return -ENOMEM;
165 : : }
166 : 0 : *pagep = pg;
167 : :
168 [ # # ]: 0 : if (alloc_len) {
169 : : /* Make new hole frag from old EOF to new page */
170 : : struct jffs2_full_dnode *fn;
171 : :
172 : : jffs2_dbg(1, "Writing new hole frag 0x%x-0x%x between current EOF and new page\n",
173 : : (unsigned int)inode->i_size, pageofs);
174 : :
175 : 0 : memset(&ri, 0, sizeof(ri));
176 : :
177 : 0 : ri.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
178 : 0 : ri.nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
179 : 0 : ri.totlen = cpu_to_je32(sizeof(ri));
180 : 0 : ri.hdr_crc = cpu_to_je32(crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4));
181 : :
182 : 0 : ri.ino = cpu_to_je32(f->inocache->ino);
183 : 0 : ri.version = cpu_to_je32(++f->highest_version);
184 : 0 : ri.mode = cpu_to_jemode(inode->i_mode);
185 : 0 : ri.uid = cpu_to_je16(i_uid_read(inode));
186 : 0 : ri.gid = cpu_to_je16(i_gid_read(inode));
187 : 0 : ri.isize = cpu_to_je32(max((uint32_t)inode->i_size, pageofs));
188 : 0 : ri.atime = ri.ctime = ri.mtime = cpu_to_je32(get_seconds());
189 : 0 : ri.offset = cpu_to_je32(inode->i_size);
190 : 0 : ri.dsize = cpu_to_je32(pageofs - inode->i_size);
191 : 0 : ri.csize = cpu_to_je32(0);
192 : 0 : ri.compr = JFFS2_COMPR_ZERO;
193 : 0 : ri.node_crc = cpu_to_je32(crc32(0, &ri, sizeof(ri)-8));
194 : 0 : ri.data_crc = cpu_to_je32(0);
195 : :
196 : 0 : fn = jffs2_write_dnode(c, f, &ri, NULL, 0, ALLOC_NORMAL);
197 : :
198 [ # # ]: 0 : if (IS_ERR(fn)) {
199 : : ret = PTR_ERR(fn);
200 : 0 : jffs2_complete_reservation(c);
201 : 0 : goto out_page;
202 : : }
203 : 0 : ret = jffs2_add_full_dnode_to_inode(c, f, fn);
204 [ # # ]: 0 : if (f->metadata) {
205 : 0 : jffs2_mark_node_obsolete(c, f->metadata->raw);
206 : 0 : jffs2_free_full_dnode(f->metadata);
207 : 0 : f->metadata = NULL;
208 : : }
209 [ # # ]: 0 : if (ret) {
210 : : jffs2_dbg(1, "Eep. add_full_dnode_to_inode() failed in write_begin, returned %d\n",
211 : : ret);
212 : 0 : jffs2_mark_node_obsolete(c, fn->raw);
213 : 0 : jffs2_free_full_dnode(fn);
214 : 0 : jffs2_complete_reservation(c);
215 : 0 : goto out_page;
216 : : }
217 : 0 : jffs2_complete_reservation(c);
218 : 0 : inode->i_size = pageofs;
219 : : }
220 : :
221 : : /*
222 : : * Read in the page if it wasn't already present. Cannot optimize away
223 : : * the whole page write case until jffs2_write_end can handle the
224 : : * case of a short-copy.
225 : : */
226 [ # # ]: 0 : if (!PageUptodate(pg)) {
227 : 0 : ret = jffs2_do_readpage_nolock(inode, pg);
228 [ # # ]: 0 : if (ret)
229 : : goto out_page;
230 : : }
231 : 0 : mutex_unlock(&f->sem);
232 : : jffs2_dbg(1, "end write_begin(). pg->flags %lx\n", pg->flags);
233 : 0 : return ret;
234 : :
235 : : out_page:
236 : 0 : unlock_page(pg);
237 : 0 : page_cache_release(pg);
238 : 0 : mutex_unlock(&f->sem);
239 : 0 : return ret;
240 : : }
241 : :
242 : 0 : static int jffs2_write_end(struct file *filp, struct address_space *mapping,
243 : : loff_t pos, unsigned len, unsigned copied,
244 : : struct page *pg, void *fsdata)
245 : : {
246 : : /* Actually commit the write from the page cache page we're looking at.
247 : : * For now, we write the full page out each time. It sucks, but it's simple
248 : : */
249 : 0 : struct inode *inode = mapping->host;
250 : 0 : struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
251 : 0 : struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
252 : : struct jffs2_raw_inode *ri;
253 : 0 : unsigned start = pos & (PAGE_CACHE_SIZE - 1);
254 : 0 : unsigned end = start + copied;
255 : 0 : unsigned aligned_start = start & ~3;
256 : : int ret = 0;
257 : 0 : uint32_t writtenlen = 0;
258 : :
259 : : jffs2_dbg(1, "%s(): ino #%lu, page at 0x%lx, range %d-%d, flags %lx\n",
260 : : __func__, inode->i_ino, pg->index << PAGE_CACHE_SHIFT,
261 : : start, end, pg->flags);
262 : :
263 : : /* We need to avoid deadlock with page_cache_read() in
264 : : jffs2_garbage_collect_pass(). So the page must be
265 : : up to date to prevent page_cache_read() from trying
266 : : to re-lock it. */
267 [ # # ]: 0 : BUG_ON(!PageUptodate(pg));
268 : :
269 [ # # ]: 0 : if (end == PAGE_CACHE_SIZE) {
270 : : /* When writing out the end of a page, write out the
271 : : _whole_ page. This helps to reduce the number of
272 : : nodes in files which have many short writes, like
273 : : syslog files. */
274 : : aligned_start = 0;
275 : : }
276 : :
277 : 0 : ri = jffs2_alloc_raw_inode();
278 : :
279 [ # # ]: 0 : if (!ri) {
280 : : jffs2_dbg(1, "%s(): Allocation of raw inode failed\n",
281 : : __func__);
282 : 0 : unlock_page(pg);
283 : 0 : page_cache_release(pg);
284 : 0 : return -ENOMEM;
285 : : }
286 : :
287 : : /* Set the fields that the generic jffs2_write_inode_range() code can't find */
288 : 0 : ri->ino = cpu_to_je32(inode->i_ino);
289 : 0 : ri->mode = cpu_to_jemode(inode->i_mode);
290 : 0 : ri->uid = cpu_to_je16(i_uid_read(inode));
291 : 0 : ri->gid = cpu_to_je16(i_gid_read(inode));
292 : 0 : ri->isize = cpu_to_je32((uint32_t)inode->i_size);
293 : 0 : ri->atime = ri->ctime = ri->mtime = cpu_to_je32(get_seconds());
294 : :
295 : : /* In 2.4, it was already kmapped by generic_file_write(). Doesn't
296 : : hurt to do it again. The alternative is ifdefs, which are ugly. */
297 : 0 : kmap(pg);
298 : :
299 : 0 : ret = jffs2_write_inode_range(c, f, ri, page_address(pg) + aligned_start,
300 : 0 : (pg->index << PAGE_CACHE_SHIFT) + aligned_start,
301 : : end - aligned_start, &writtenlen);
302 : :
303 : 0 : kunmap(pg);
304 : :
305 [ # # ]: 0 : if (ret) {
306 : : /* There was an error writing. */
307 : : SetPageError(pg);
308 : : }
309 : :
310 : : /* Adjust writtenlen for the padding we did, so we don't confuse our caller */
311 : 0 : writtenlen -= min(writtenlen, (start - aligned_start));
312 : :
313 [ # # ]: 0 : if (writtenlen) {
314 [ # # ]: 0 : if (inode->i_size < pos + writtenlen) {
315 : 0 : inode->i_size = pos + writtenlen;
316 : 0 : inode->i_blocks = (inode->i_size + 511) >> 9;
317 : :
318 : 0 : inode->i_ctime = inode->i_mtime = ITIME(je32_to_cpu(ri->ctime));
319 : : }
320 : : }
321 : :
322 : 0 : jffs2_free_raw_inode(ri);
323 : :
324 [ # # ]: 0 : if (start+writtenlen < end) {
325 : : /* generic_file_write has written more to the page cache than we've
326 : : actually written to the medium. Mark the page !Uptodate so that
327 : : it gets reread */
328 : : jffs2_dbg(1, "%s(): Not all bytes written. Marking page !uptodate\n",
329 : : __func__);
330 : : SetPageError(pg);
331 : : ClearPageUptodate(pg);
332 : : }
333 : :
334 : : jffs2_dbg(1, "%s() returning %d\n",
335 : : __func__, writtenlen > 0 ? writtenlen : ret);
336 : 0 : unlock_page(pg);
337 : 0 : page_cache_release(pg);
338 [ # # ]: 0 : return writtenlen > 0 ? writtenlen : ret;
339 : : }
|