1 /*
2 * JFFS2 -- Journalling Flash File System, Version 2.
3 *
4 * Copyright (C) 2001 Red Hat, Inc.
5 *
6 * Created by David Woodhouse <dwmw2@cambridge.redhat.com>
7 *
8 * The original JFFS, from which the design for JFFS2 was derived,
9 * was designed and implemented by Axis Communications AB.
10 *
11 * The contents of this file are subject to the Red Hat eCos Public
12 * License Version 1.1 (the "Licence"); you may not use this file
13 * except in compliance with the Licence. You may obtain a copy of
14 * the Licence at http://www.redhat.com/
15 *
16 * Software distributed under the Licence is distributed on an "AS IS"
17 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.
18 * See the Licence for the specific language governing rights and
19 * limitations under the Licence.
20 *
21 * The Original Code is JFFS2 - Journalling Flash File System, version 2
22 *
23 * Alternatively, the contents of this file may be used under the
24 * terms of the GNU General Public License version 2 (the "GPL"), in
25 * which case the provisions of the GPL are applicable instead of the
26 * above. If you wish to allow the use of your version of this file
27 * only under the terms of the GPL and not to allow others to use your
28 * version of this file under the RHEPL, indicate your decision by
29 * deleting the provisions above and replace them with the notice and
30 * other provisions required by the GPL. If you do not delete the
31 * provisions above, a recipient may use your version of this file
32 * under either the RHEPL or the GPL.
33 *
34 * $Id: file.c,v 1.58.2.7 2003/11/02 13:51:17 dwmw2 Exp $
35 *
36 */
37
38 #include <linux/kernel.h>
39 #include <linux/mtd/compatmac.h> /* for min() */
40 #include <linux/slab.h>
41 #include <linux/fs.h>
42 #include <linux/pagemap.h>
43 #include <linux/jffs2.h>
44 #include "nodelist.h"
45 #include <linux/crc32.h>
46
47 extern int generic_file_open(struct inode *, struct file *) __attribute__((weak));
48 extern loff_t generic_file_llseek(struct file *file, loff_t offset, int origin) __attribute__((weak));
49
50
jffs2_null_fsync(struct file * filp,struct dentry * dentry,int datasync)51 int jffs2_null_fsync(struct file *filp, struct dentry *dentry, int datasync)
52 {
53 /* Move along. Nothing to see here */
54 return 0;
55 }
56
57 struct file_operations jffs2_file_operations =
58 {
59 llseek: generic_file_llseek,
60 open: generic_file_open,
61 read: generic_file_read,
62 write: generic_file_write,
63 ioctl: jffs2_ioctl,
64 mmap: generic_file_mmap,
65 fsync: jffs2_null_fsync
66 };
67
68 /* jffs2_file_inode_operations */
69
70 struct inode_operations jffs2_file_inode_operations =
71 {
72 setattr: jffs2_setattr
73 };
74
75 struct address_space_operations jffs2_file_address_operations =
76 {
77 readpage: jffs2_readpage,
78 prepare_write: jffs2_prepare_write,
79 commit_write: jffs2_commit_write
80 };
81
jffs2_setattr(struct dentry * dentry,struct iattr * iattr)82 int jffs2_setattr (struct dentry *dentry, struct iattr *iattr)
83 {
84 struct jffs2_full_dnode *old_metadata, *new_metadata;
85 struct inode *inode = dentry->d_inode;
86 struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
87 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
88 struct jffs2_raw_inode *ri;
89 unsigned short dev;
90 unsigned char *mdata = NULL;
91 int mdatalen = 0;
92 unsigned int ivalid;
93 __u32 phys_ofs, alloclen;
94 int ret;
95 D1(printk(KERN_DEBUG "jffs2_setattr(): ino #%lu\n", inode->i_ino));
96 ret = inode_change_ok(inode, iattr);
97 if (ret)
98 return ret;
99
100 /* Special cases - we don't want more than one data node
101 for these types on the medium at any time. So setattr
102 must read the original data associated with the node
103 (i.e. the device numbers or the target name) and write
104 it out again with the appropriate data attached */
105 if (S_ISBLK(inode->i_mode) || S_ISCHR(inode->i_mode)) {
106 /* For these, we don't actually need to read the old node */
107 dev = (MAJOR(to_kdev_t(dentry->d_inode->i_rdev)) << 8) |
108 MINOR(to_kdev_t(dentry->d_inode->i_rdev));
109 mdata = (char *)&dev;
110 mdatalen = sizeof(dev);
111 D1(printk(KERN_DEBUG "jffs2_setattr(): Writing %d bytes of kdev_t\n", mdatalen));
112 } else if (S_ISLNK(inode->i_mode)) {
113 mdatalen = f->metadata->size;
114 mdata = kmalloc(f->metadata->size, GFP_USER);
115 if (!mdata)
116 return -ENOMEM;
117 ret = jffs2_read_dnode(c, f->metadata, mdata, 0, mdatalen);
118 if (ret) {
119 kfree(mdata);
120 return ret;
121 }
122 D1(printk(KERN_DEBUG "jffs2_setattr(): Writing %d bytes of symlink target\n", mdatalen));
123 }
124
125 ri = jffs2_alloc_raw_inode();
126 if (!ri) {
127 if (S_ISLNK(inode->i_mode))
128 kfree(mdata);
129 return -ENOMEM;
130 }
131
132 ret = jffs2_reserve_space(c, sizeof(*ri) + mdatalen, &phys_ofs, &alloclen, ALLOC_NORMAL);
133 if (ret) {
134 jffs2_free_raw_inode(ri);
135 if (S_ISLNK(inode->i_mode))
136 kfree(mdata);
137 return ret;
138 }
139 down(&f->sem);
140 ivalid = iattr->ia_valid;
141
142 ri->magic = JFFS2_MAGIC_BITMASK;
143 ri->nodetype = JFFS2_NODETYPE_INODE;
144 ri->totlen = sizeof(*ri) + mdatalen;
145 ri->hdr_crc = crc32(0, ri, sizeof(struct jffs2_unknown_node)-4);
146
147 ri->ino = inode->i_ino;
148 ri->version = ++f->highest_version;
149
150 ri->mode = (ivalid & ATTR_MODE)?iattr->ia_mode:inode->i_mode;
151 ri->uid = (ivalid & ATTR_UID)?iattr->ia_uid:inode->i_uid;
152 ri->gid = (ivalid & ATTR_GID)?iattr->ia_gid:inode->i_gid;
153
154 if (ivalid & ATTR_MODE && ri->mode & S_ISGID &&
155 !in_group_p(ri->gid) && !capable(CAP_FSETID))
156 ri->mode &= ~S_ISGID;
157
158 ri->isize = (ivalid & ATTR_SIZE)?iattr->ia_size:inode->i_size;
159 ri->atime = (ivalid & ATTR_ATIME)?iattr->ia_atime:inode->i_atime;
160 ri->mtime = (ivalid & ATTR_MTIME)?iattr->ia_mtime:inode->i_mtime;
161 ri->ctime = (ivalid & ATTR_CTIME)?iattr->ia_ctime:inode->i_ctime;
162
163 ri->offset = 0;
164 ri->csize = ri->dsize = mdatalen;
165 ri->compr = JFFS2_COMPR_NONE;
166 if (inode->i_size < ri->isize) {
167 /* It's an extension. Make it a hole node */
168 ri->compr = JFFS2_COMPR_ZERO;
169 ri->dsize = ri->isize - inode->i_size;
170 ri->offset = inode->i_size;
171 }
172 ri->node_crc = crc32(0, ri, sizeof(*ri)-8);
173 if (mdatalen)
174 ri->data_crc = crc32(0, mdata, mdatalen);
175 else
176 ri->data_crc = 0;
177
178 new_metadata = jffs2_write_dnode(inode, ri, mdata, mdatalen, phys_ofs, NULL);
179 if (S_ISLNK(inode->i_mode))
180 kfree(mdata);
181
182 jffs2_complete_reservation(c);
183
184 if (IS_ERR(new_metadata)) {
185 jffs2_free_raw_inode(ri);
186 up(&f->sem);
187 return PTR_ERR(new_metadata);
188 }
189 /* It worked. Update the inode */
190 inode->i_atime = ri->atime;
191 inode->i_ctime = ri->ctime;
192 inode->i_mtime = ri->mtime;
193 inode->i_mode = ri->mode;
194 inode->i_uid = ri->uid;
195 inode->i_gid = ri->gid;
196
197
198 old_metadata = f->metadata;
199
200 if (inode->i_size > ri->isize) {
201 vmtruncate(inode, ri->isize);
202 jffs2_truncate_fraglist (c, &f->fraglist, ri->isize);
203 }
204
205 if (inode->i_size < ri->isize) {
206 jffs2_add_full_dnode_to_inode(c, f, new_metadata);
207 inode->i_size = ri->isize;
208 f->metadata = NULL;
209 } else {
210 f->metadata = new_metadata;
211 }
212 if (old_metadata) {
213 jffs2_mark_node_obsolete(c, old_metadata->raw);
214 jffs2_free_full_dnode(old_metadata);
215 }
216 jffs2_free_raw_inode(ri);
217 up(&f->sem);
218 return 0;
219 }
220
jffs2_do_readpage_nolock(struct inode * inode,struct page * pg)221 int jffs2_do_readpage_nolock (struct inode *inode, struct page *pg)
222 {
223 struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
224 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
225 struct jffs2_node_frag *frag = f->fraglist;
226 __u32 offset = pg->index << PAGE_CACHE_SHIFT;
227 __u32 end = offset + PAGE_CACHE_SIZE;
228 unsigned char *pg_buf;
229 int ret;
230
231 D1(printk(KERN_DEBUG "jffs2_do_readpage_nolock(): ino #%lu, page at offset 0x%x\n", inode->i_ino, offset));
232
233 if (!PageLocked(pg))
234 PAGE_BUG(pg);
235
236 while(frag && frag->ofs + frag->size <= offset) {
237 // D1(printk(KERN_DEBUG "skipping frag %d-%d; before the region we care about\n", frag->ofs, frag->ofs + frag->size));
238 frag = frag->next;
239 }
240
241 pg_buf = kmap(pg);
242
243 /* XXX FIXME: Where a single physical node actually shows up in two
244 frags, we read it twice. Don't do that. */
245 /* Now we're pointing at the first frag which overlaps our page */
246 while(offset < end) {
247 D2(printk(KERN_DEBUG "jffs2_readpage: offset %d, end %d\n", offset, end));
248 if (!frag || frag->ofs > offset) {
249 __u32 holesize = end - offset;
250 if (frag) {
251 D1(printk(KERN_NOTICE "Eep. Hole in ino %ld fraglist. frag->ofs = 0x%08x, offset = 0x%08x\n", inode->i_ino, frag->ofs, offset));
252 holesize = min(holesize, frag->ofs - offset);
253 D1(jffs2_print_frag_list(f));
254 }
255 D1(printk(KERN_DEBUG "Filling non-frag hole from %d-%d\n", offset, offset+holesize));
256 memset(pg_buf, 0, holesize);
257 pg_buf += holesize;
258 offset += holesize;
259 continue;
260 } else if (frag->ofs < offset && (offset & (PAGE_CACHE_SIZE-1)) != 0) {
261 D1(printk(KERN_NOTICE "Eep. Overlap in ino #%ld fraglist. frag->ofs = 0x%08x, offset = 0x%08x\n",
262 inode->i_ino, frag->ofs, offset));
263 D1(jffs2_print_frag_list(f));
264 memset(pg_buf, 0, end - offset);
265 ClearPageUptodate(pg);
266 SetPageError(pg);
267 kunmap(pg);
268 return -EIO;
269 } else if (!frag->node) {
270 __u32 holeend = min(end, frag->ofs + frag->size);
271 D1(printk(KERN_DEBUG "Filling frag hole from %d-%d (frag 0x%x 0x%x)\n", offset, holeend, frag->ofs, frag->ofs + frag->size));
272 memset(pg_buf, 0, holeend - offset);
273 pg_buf += holeend - offset;
274 offset = holeend;
275 frag = frag->next;
276 continue;
277 } else {
278 __u32 readlen;
279 __u32 fragofs; /* offset within the frag to start reading */
280
281 fragofs = offset - frag->ofs;
282 readlen = min(frag->size - fragofs, end - offset);
283 D1(printk(KERN_DEBUG "Reading %d-%d from node at 0x%x\n", frag->ofs+fragofs,
284 fragofs+frag->ofs+readlen, frag->node->raw->flash_offset & ~3));
285 ret = jffs2_read_dnode(c, frag->node, pg_buf, fragofs + frag->ofs - frag->node->ofs, readlen);
286 D2(printk(KERN_DEBUG "node read done\n"));
287 if (ret) {
288 D1(printk(KERN_DEBUG"jffs2_readpage error %d\n",ret));
289 memset(pg_buf, 0, readlen);
290 ClearPageUptodate(pg);
291 SetPageError(pg);
292 kunmap(pg);
293 return ret;
294 }
295
296 pg_buf += readlen;
297 offset += readlen;
298 frag = frag->next;
299 D2(printk(KERN_DEBUG "node read was OK. Looping\n"));
300 }
301 }
302 D2(printk(KERN_DEBUG "readpage finishing\n"));
303 SetPageUptodate(pg);
304 ClearPageError(pg);
305
306 flush_dcache_page(pg);
307
308 kunmap(pg);
309 D1(printk(KERN_DEBUG "readpage finished\n"));
310 return 0;
311 }
312
jffs2_do_readpage_unlock(struct inode * inode,struct page * pg)313 int jffs2_do_readpage_unlock(struct inode *inode, struct page *pg)
314 {
315 int ret = jffs2_do_readpage_nolock(inode, pg);
316 UnlockPage(pg);
317 return ret;
318 }
319
320
jffs2_readpage(struct file * filp,struct page * pg)321 int jffs2_readpage (struct file *filp, struct page *pg)
322 {
323 struct jffs2_inode_info *f = JFFS2_INODE_INFO(pg->mapping->host);
324 int ret;
325
326 down(&f->sem);
327 ret = jffs2_do_readpage_unlock(pg->mapping->host, pg);
328 up(&f->sem);
329 return ret;
330 }
331
jffs2_prepare_write(struct file * filp,struct page * pg,unsigned start,unsigned end)332 int jffs2_prepare_write (struct file *filp, struct page *pg, unsigned start, unsigned end)
333 {
334 struct inode *inode = pg->mapping->host;
335 struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
336 __u32 pageofs = pg->index << PAGE_CACHE_SHIFT;
337 int ret = 0;
338
339 D1(printk(KERN_DEBUG "jffs2_prepare_write() nrpages %ld\n", inode->i_mapping->nrpages));
340
341 if (pageofs > inode->i_size) {
342 /* Make new hole frag from old EOF to new page */
343 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
344 struct jffs2_raw_inode ri;
345 struct jffs2_full_dnode *fn;
346 __u32 phys_ofs, alloc_len;
347
348 D1(printk(KERN_DEBUG "Writing new hole frag 0x%x-0x%x between current EOF and new page\n",
349 (unsigned int)inode->i_size, pageofs));
350
351 ret = jffs2_reserve_space(c, sizeof(ri), &phys_ofs, &alloc_len, ALLOC_NORMAL);
352 if (ret)
353 return ret;
354
355 down(&f->sem);
356 memset(&ri, 0, sizeof(ri));
357
358 ri.magic = JFFS2_MAGIC_BITMASK;
359 ri.nodetype = JFFS2_NODETYPE_INODE;
360 ri.totlen = sizeof(ri);
361 ri.hdr_crc = crc32(0, &ri, sizeof(struct jffs2_unknown_node)-4);
362
363 ri.ino = f->inocache->ino;
364 ri.version = ++f->highest_version;
365 ri.mode = inode->i_mode;
366 ri.uid = inode->i_uid;
367 ri.gid = inode->i_gid;
368 ri.isize = max((__u32)inode->i_size, pageofs);
369 ri.atime = ri.ctime = ri.mtime = CURRENT_TIME;
370 ri.offset = inode->i_size;
371 ri.dsize = pageofs - inode->i_size;
372 ri.csize = 0;
373 ri.compr = JFFS2_COMPR_ZERO;
374 ri.node_crc = crc32(0, &ri, sizeof(ri)-8);
375 ri.data_crc = 0;
376
377 fn = jffs2_write_dnode(inode, &ri, NULL, 0, phys_ofs, NULL);
378 jffs2_complete_reservation(c);
379 if (IS_ERR(fn)) {
380 ret = PTR_ERR(fn);
381 up(&f->sem);
382 return ret;
383 }
384 ret = jffs2_add_full_dnode_to_inode(c, f, fn);
385 if (f->metadata) {
386 jffs2_mark_node_obsolete(c, f->metadata->raw);
387 jffs2_free_full_dnode(f->metadata);
388 f->metadata = NULL;
389 }
390 if (ret) {
391 D1(printk(KERN_DEBUG "Eep. add_full_dnode_to_inode() failed in prepare_write, returned %d\n", ret));
392 jffs2_mark_node_obsolete(c, fn->raw);
393 jffs2_free_full_dnode(fn);
394 up(&f->sem);
395 return ret;
396 }
397 inode->i_size = pageofs;
398 up(&f->sem);
399 }
400
401
402 /* Read in the page if it wasn't already present, unless it's a whole page */
403 if (!Page_Uptodate(pg) && (start || end < PAGE_CACHE_SIZE)) {
404 down(&f->sem);
405 ret = jffs2_do_readpage_nolock(inode, pg);
406 up(&f->sem);
407 }
408 D1(printk(KERN_DEBUG "end prepare_write(). pg->flags %lx\n", pg->flags));
409 return ret;
410 }
411
jffs2_commit_write(struct file * filp,struct page * pg,unsigned start,unsigned end)412 int jffs2_commit_write (struct file *filp, struct page *pg, unsigned start, unsigned end)
413 {
414 /* Actually commit the write from the page cache page we're looking at.
415 * For now, we write the full page out each time. It sucks, but it's simple
416 */
417 struct inode *inode = pg->mapping->host;
418 struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
419 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
420 __u32 newsize = max_t(__u32, filp->f_dentry->d_inode->i_size, (pg->index << PAGE_CACHE_SHIFT) + end);
421 __u32 file_ofs = (pg->index << PAGE_CACHE_SHIFT);
422 __u32 writelen = min((__u32)PAGE_CACHE_SIZE, newsize - file_ofs);
423 struct jffs2_raw_inode *ri;
424 int ret = 0;
425 ssize_t writtenlen = 0;
426
427 D1(printk(KERN_DEBUG "jffs2_commit_write(): ino #%lu, page at 0x%lx, range %d-%d, flags %lx\n", inode->i_ino, pg->index << PAGE_CACHE_SHIFT, start, end, pg->flags));
428
429 if (!start && end == PAGE_CACHE_SIZE) {
430 /* We need to avoid deadlock with page_cache_read() in
431 jffs2_garbage_collect_pass(). So we have to mark the
432 page up to date, to prevent page_cache_read() from
433 trying to re-lock it. */
434 SetPageUptodate(pg);
435 }
436
437 ri = jffs2_alloc_raw_inode();
438 if (!ri)
439 return -ENOMEM;
440
441 while(writelen) {
442 struct jffs2_full_dnode *fn;
443 unsigned char *comprbuf = NULL;
444 unsigned char comprtype = JFFS2_COMPR_NONE;
445 __u32 phys_ofs, alloclen;
446 __u32 datalen, cdatalen;
447
448 D2(printk(KERN_DEBUG "jffs2_commit_write() loop: 0x%x to write to 0x%x\n", writelen, file_ofs));
449
450 ret = jffs2_reserve_space(c, sizeof(*ri) + JFFS2_MIN_DATA_LEN, &phys_ofs, &alloclen, ALLOC_NORMAL);
451 if (ret) {
452 SetPageError(pg);
453 D1(printk(KERN_DEBUG "jffs2_reserve_space returned %d\n", ret));
454 break;
455 }
456 down(&f->sem);
457 datalen = writelen;
458 cdatalen = min(alloclen - sizeof(*ri), writelen);
459
460 comprbuf = kmalloc(cdatalen, GFP_KERNEL);
461 if (comprbuf) {
462 comprtype = jffs2_compress(page_address(pg)+ (file_ofs & (PAGE_CACHE_SIZE-1)), comprbuf, &datalen, &cdatalen);
463 }
464 if (comprtype == JFFS2_COMPR_NONE) {
465 /* Either compression failed, or the allocation of comprbuf failed */
466 if (comprbuf)
467 kfree(comprbuf);
468 comprbuf = page_address(pg) + (file_ofs & (PAGE_CACHE_SIZE -1));
469 datalen = cdatalen;
470 }
471 /* Now comprbuf points to the data to be written, be it compressed or not.
472 comprtype holds the compression type, and comprtype == JFFS2_COMPR_NONE means
473 that the comprbuf doesn't need to be kfree()d.
474 */
475
476 ri->magic = JFFS2_MAGIC_BITMASK;
477 ri->nodetype = JFFS2_NODETYPE_INODE;
478 ri->totlen = sizeof(*ri) + cdatalen;
479 ri->hdr_crc = crc32(0, ri, sizeof(struct jffs2_unknown_node)-4);
480
481 ri->ino = inode->i_ino;
482 ri->version = ++f->highest_version;
483 ri->mode = inode->i_mode;
484 ri->uid = inode->i_uid;
485 ri->gid = inode->i_gid;
486 ri->isize = max((__u32)inode->i_size, file_ofs + datalen);
487 ri->atime = ri->ctime = ri->mtime = CURRENT_TIME;
488 ri->offset = file_ofs;
489 ri->csize = cdatalen;
490 ri->dsize = datalen;
491 ri->compr = comprtype;
492 ri->node_crc = crc32(0, ri, sizeof(*ri)-8);
493 ri->data_crc = crc32(0, comprbuf, cdatalen);
494
495 fn = jffs2_write_dnode(inode, ri, comprbuf, cdatalen, phys_ofs, NULL);
496
497 jffs2_complete_reservation(c);
498
499 if (comprtype != JFFS2_COMPR_NONE)
500 kfree(comprbuf);
501
502 if (IS_ERR(fn)) {
503 ret = PTR_ERR(fn);
504 up(&f->sem);
505 SetPageError(pg);
506 break;
507 }
508 ret = jffs2_add_full_dnode_to_inode(c, f, fn);
509 if (f->metadata) {
510 jffs2_mark_node_obsolete(c, f->metadata->raw);
511 jffs2_free_full_dnode(f->metadata);
512 f->metadata = NULL;
513 }
514 up(&f->sem);
515 if (ret) {
516 /* Eep */
517 D1(printk(KERN_DEBUG "Eep. add_full_dnode_to_inode() failed in commit_write, returned %d\n", ret));
518 jffs2_mark_node_obsolete(c, fn->raw);
519 jffs2_free_full_dnode(fn);
520 SetPageError(pg);
521 break;
522 }
523 inode->i_size = ri->isize;
524 inode->i_blocks = (inode->i_size + 511) >> 9;
525 inode->i_ctime = inode->i_mtime = ri->ctime;
526 if (!datalen) {
527 printk(KERN_WARNING "Eep. We didn't actually write any bloody data\n");
528 ret = -EIO;
529 SetPageError(pg);
530 break;
531 }
532 D1(printk(KERN_DEBUG "increasing writtenlen by %d\n", datalen));
533 writtenlen += datalen;
534 file_ofs += datalen;
535 writelen -= datalen;
536 }
537
538 jffs2_free_raw_inode(ri);
539
540 if (writtenlen < end) {
541 /* generic_file_write has written more to the page cache than we've
542 actually written to the medium. Mark the page !Uptodate so that
543 it gets reread */
544 D1(printk(KERN_DEBUG "jffs2_commit_write(): Not all bytes written. Marking page !uptodate\n"));
545 SetPageError(pg);
546 ClearPageUptodate(pg);
547 }
548 if (writtenlen <= start) {
549 /* We didn't even get to the start of the affected part */
550 ret = ret?ret:-ENOSPC;
551 D1(printk(KERN_DEBUG "jffs2_commit_write(): Only %x bytes written to page. start (%x) not reached, returning %d\n", writtenlen, start, ret));
552 }
553 writtenlen = min(end-start, writtenlen-start);
554
555 D1(printk(KERN_DEBUG "jffs2_commit_write() returning %d. nrpages is %ld\n",writtenlen?writtenlen:ret, inode->i_mapping->nrpages));
556 return writtenlen?writtenlen:ret;
557 }
558