2 * JFFS2 -- Journalling Flash File System, Version 2.
4 * Copyright © 2001-2007 Red Hat, Inc.
6 * Created by David Woodhouse <dwmw2@infradead.org>
8 * For licensing information, see the file 'LICENCE' in this directory.
12 #include <linux/kernel.h>
14 #include <linux/crc32.h>
15 #include <linux/slab.h>
16 #include <linux/pagemap.h>
17 #include <linux/mtd/mtd.h>
22 int jffs2_do_new_inode(struct jffs2_sb_info
*c
, struct jffs2_inode_info
*f
, uint32_t mode
, struct jffs2_raw_inode
*ri
)
24 struct jffs2_inode_cache
*ic
;
26 ic
= jffs2_alloc_inode_cache();
31 memset(ic
, 0, sizeof(*ic
));
34 f
->inocache
->nlink
= 1;
35 f
->inocache
->nodes
= (struct jffs2_raw_node_ref
*)f
->inocache
;
36 f
->inocache
->state
= INO_STATE_PRESENT
;
38 jffs2_add_ino_cache(c
, f
->inocache
);
39 D1(printk(KERN_DEBUG
"jffs2_do_new_inode(): Assigned ino# %d\n", f
->inocache
->ino
));
40 ri
->ino
= cpu_to_je32(f
->inocache
->ino
);
42 ri
->magic
= cpu_to_je16(JFFS2_MAGIC_BITMASK
);
43 ri
->nodetype
= cpu_to_je16(JFFS2_NODETYPE_INODE
);
44 ri
->totlen
= cpu_to_je32(PAD(sizeof(*ri
)));
45 ri
->hdr_crc
= cpu_to_je32(crc32(0, ri
, sizeof(struct jffs2_unknown_node
)-4));
46 ri
->mode
= cpu_to_jemode(mode
);
48 f
->highest_version
= 1;
49 ri
->version
= cpu_to_je32(f
->highest_version
);
54 /* jffs2_write_dnode - given a raw_inode, allocate a full_dnode for it,
55 write it to the flash, link it into the existing inode/fragment list */
57 struct jffs2_full_dnode
*jffs2_write_dnode(struct jffs2_sb_info
*c
, struct jffs2_inode_info
*f
,
58 struct jffs2_raw_inode
*ri
, const unsigned char *data
,
59 uint32_t datalen
, int alloc_mode
)
62 struct jffs2_full_dnode
*fn
;
68 unsigned long cnt
= 2;
70 D1(if(je32_to_cpu(ri
->hdr_crc
) != crc32(0, ri
, sizeof(struct jffs2_unknown_node
)-4)) {
71 printk(KERN_CRIT
"Eep. CRC not correct in jffs2_write_dnode()\n");
75 vecs
[0].iov_base
= ri
;
76 vecs
[0].iov_len
= sizeof(*ri
);
77 vecs
[1].iov_base
= (unsigned char *)data
;
78 vecs
[1].iov_len
= datalen
;
80 if (je32_to_cpu(ri
->totlen
) != sizeof(*ri
) + datalen
) {
81 printk(KERN_WARNING
"jffs2_write_dnode: ri->totlen (0x%08x) != sizeof(*ri) (0x%08zx) + datalen (0x%08x)\n", je32_to_cpu(ri
->totlen
), sizeof(*ri
), datalen
);
84 fn
= jffs2_alloc_full_dnode();
86 return ERR_PTR(-ENOMEM
);
88 /* check number of valid vecs */
89 if (!datalen
|| !data
)
92 flash_ofs
= write_ofs(c
);
94 jffs2_dbg_prewrite_paranoia_check(c
, flash_ofs
, vecs
[0].iov_len
+ vecs
[1].iov_len
);
96 if ((alloc_mode
!=ALLOC_GC
) && (je32_to_cpu(ri
->version
) < f
->highest_version
)) {
98 D1(printk(KERN_DEBUG
"jffs2_write_dnode : dnode_version %d, "
99 "highest version %d -> updating dnode\n",
100 je32_to_cpu(ri
->version
), f
->highest_version
));
101 ri
->version
= cpu_to_je32(++f
->highest_version
);
102 ri
->node_crc
= cpu_to_je32(crc32(0, ri
, sizeof(*ri
)-8));
105 ret
= jffs2_flash_writev(c
, vecs
, cnt
, flash_ofs
, &retlen
,
106 (alloc_mode
==ALLOC_GC
)?0:f
->inocache
->ino
);
108 if (ret
|| (retlen
!= sizeof(*ri
) + datalen
)) {
109 printk(KERN_NOTICE
"Write of %zd bytes at 0x%08x failed. returned %d, retlen %zd\n",
110 sizeof(*ri
)+datalen
, flash_ofs
, ret
, retlen
);
112 /* Mark the space as dirtied */
114 /* Don't change raw->size to match retlen. We may have
115 written the node header already, and only the data will
116 seem corrupted, in which case the scan would skip over
117 any node we write before the original intended end of
119 jffs2_add_physical_node_ref(c
, flash_ofs
| REF_OBSOLETE
, PAD(sizeof(*ri
)+datalen
), NULL
);
121 printk(KERN_NOTICE
"Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", flash_ofs
);
123 if (!retried
&& alloc_mode
!= ALLOC_NORETRY
) {
124 /* Try to reallocate space and retry */
126 struct jffs2_eraseblock
*jeb
= &c
->blocks
[flash_ofs
/ c
->sector_size
];
130 D1(printk(KERN_DEBUG
"Retrying failed write.\n"));
132 jffs2_dbg_acct_sanity_check(c
,jeb
);
133 jffs2_dbg_acct_paranoia_check(c
, jeb
);
135 if (alloc_mode
== ALLOC_GC
) {
136 ret
= jffs2_reserve_space_gc(c
, sizeof(*ri
) + datalen
, &dummy
,
137 JFFS2_SUMMARY_INODE_SIZE
);
141 jffs2_complete_reservation(c
);
143 ret
= jffs2_reserve_space(c
, sizeof(*ri
) + datalen
, &dummy
,
144 alloc_mode
, JFFS2_SUMMARY_INODE_SIZE
);
149 flash_ofs
= write_ofs(c
);
150 D1(printk(KERN_DEBUG
"Allocated space at 0x%08x to retry failed write.\n", flash_ofs
));
152 jffs2_dbg_acct_sanity_check(c
,jeb
);
153 jffs2_dbg_acct_paranoia_check(c
, jeb
);
157 D1(printk(KERN_DEBUG
"Failed to allocate space to retry failed write: %d!\n", ret
));
159 /* Release the full_dnode which is now useless, and return */
160 jffs2_free_full_dnode(fn
);
161 return ERR_PTR(ret
?ret
:-EIO
);
163 /* Mark the space used */
164 /* If node covers at least a whole page, or if it starts at the
165 beginning of a page and runs to the end of the file, or if
166 it's a hole node, mark it REF_PRISTINE, else REF_NORMAL.
168 if ((je32_to_cpu(ri
->dsize
) >= PAGE_CACHE_SIZE
) ||
169 ( ((je32_to_cpu(ri
->offset
)&(PAGE_CACHE_SIZE
-1))==0) &&
170 (je32_to_cpu(ri
->dsize
)+je32_to_cpu(ri
->offset
) == je32_to_cpu(ri
->isize
)))) {
171 flash_ofs
|= REF_PRISTINE
;
173 flash_ofs
|= REF_NORMAL
;
175 fn
->raw
= jffs2_add_physical_node_ref(c
, flash_ofs
, PAD(sizeof(*ri
)+datalen
), f
->inocache
);
176 fn
->ofs
= je32_to_cpu(ri
->offset
);
177 fn
->size
= je32_to_cpu(ri
->dsize
);
180 D1(printk(KERN_DEBUG
"jffs2_write_dnode wrote node at 0x%08x(%d) with dsize 0x%x, csize 0x%x, node_crc 0x%08x, data_crc 0x%08x, totlen 0x%08x\n",
181 flash_ofs
& ~3, flash_ofs
& 3, je32_to_cpu(ri
->dsize
),
182 je32_to_cpu(ri
->csize
), je32_to_cpu(ri
->node_crc
),
183 je32_to_cpu(ri
->data_crc
), je32_to_cpu(ri
->totlen
)));
186 jffs2_dbg_acct_sanity_check(c
,NULL
);
192 struct jffs2_full_dirent
*jffs2_write_dirent(struct jffs2_sb_info
*c
, struct jffs2_inode_info
*f
,
193 struct jffs2_raw_dirent
*rd
, const unsigned char *name
,
194 uint32_t namelen
, int alloc_mode
)
196 struct jffs2_full_dirent
*fd
;
203 D1(printk(KERN_DEBUG
"jffs2_write_dirent(ino #%u, name at *0x%p \"%s\"->ino #%u, name_crc 0x%08x)\n",
204 je32_to_cpu(rd
->pino
), name
, name
, je32_to_cpu(rd
->ino
),
205 je32_to_cpu(rd
->name_crc
)));
207 D1(if(je32_to_cpu(rd
->hdr_crc
) != crc32(0, rd
, sizeof(struct jffs2_unknown_node
)-4)) {
208 printk(KERN_CRIT
"Eep. CRC not correct in jffs2_write_dirent()\n");
212 vecs
[0].iov_base
= rd
;
213 vecs
[0].iov_len
= sizeof(*rd
);
214 vecs
[1].iov_base
= (unsigned char *)name
;
215 vecs
[1].iov_len
= namelen
;
217 fd
= jffs2_alloc_full_dirent(namelen
+1);
219 return ERR_PTR(-ENOMEM
);
221 fd
->version
= je32_to_cpu(rd
->version
);
222 fd
->ino
= je32_to_cpu(rd
->ino
);
223 fd
->nhash
= full_name_hash(name
, strlen(name
));
225 memcpy(fd
->name
, name
, namelen
);
229 flash_ofs
= write_ofs(c
);
231 jffs2_dbg_prewrite_paranoia_check(c
, flash_ofs
, vecs
[0].iov_len
+ vecs
[1].iov_len
);
233 if ((alloc_mode
!=ALLOC_GC
) && (je32_to_cpu(rd
->version
) < f
->highest_version
)) {
235 D1(printk(KERN_DEBUG
"jffs2_write_dirent : dirent_version %d, "
236 "highest version %d -> updating dirent\n",
237 je32_to_cpu(rd
->version
), f
->highest_version
));
238 rd
->version
= cpu_to_je32(++f
->highest_version
);
239 fd
->version
= je32_to_cpu(rd
->version
);
240 rd
->node_crc
= cpu_to_je32(crc32(0, rd
, sizeof(*rd
)-8));
243 ret
= jffs2_flash_writev(c
, vecs
, 2, flash_ofs
, &retlen
,
244 (alloc_mode
==ALLOC_GC
)?0:je32_to_cpu(rd
->pino
));
245 if (ret
|| (retlen
!= sizeof(*rd
) + namelen
)) {
246 printk(KERN_NOTICE
"Write of %zd bytes at 0x%08x failed. returned %d, retlen %zd\n",
247 sizeof(*rd
)+namelen
, flash_ofs
, ret
, retlen
);
248 /* Mark the space as dirtied */
250 jffs2_add_physical_node_ref(c
, flash_ofs
| REF_OBSOLETE
, PAD(sizeof(*rd
)+namelen
), NULL
);
252 printk(KERN_NOTICE
"Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", flash_ofs
);
255 /* Try to reallocate space and retry */
257 struct jffs2_eraseblock
*jeb
= &c
->blocks
[flash_ofs
/ c
->sector_size
];
261 D1(printk(KERN_DEBUG
"Retrying failed write.\n"));
263 jffs2_dbg_acct_sanity_check(c
,jeb
);
264 jffs2_dbg_acct_paranoia_check(c
, jeb
);
266 if (alloc_mode
== ALLOC_GC
) {
267 ret
= jffs2_reserve_space_gc(c
, sizeof(*rd
) + namelen
, &dummy
,
268 JFFS2_SUMMARY_DIRENT_SIZE(namelen
));
272 jffs2_complete_reservation(c
);
274 ret
= jffs2_reserve_space(c
, sizeof(*rd
) + namelen
, &dummy
,
275 alloc_mode
, JFFS2_SUMMARY_DIRENT_SIZE(namelen
));
280 flash_ofs
= write_ofs(c
);
281 D1(printk(KERN_DEBUG
"Allocated space at 0x%08x to retry failed write.\n", flash_ofs
));
282 jffs2_dbg_acct_sanity_check(c
,jeb
);
283 jffs2_dbg_acct_paranoia_check(c
, jeb
);
286 D1(printk(KERN_DEBUG
"Failed to allocate space to retry failed write: %d!\n", ret
));
288 /* Release the full_dnode which is now useless, and return */
289 jffs2_free_full_dirent(fd
);
290 return ERR_PTR(ret
?ret
:-EIO
);
292 /* Mark the space used */
293 fd
->raw
= jffs2_add_physical_node_ref(c
, flash_ofs
| REF_PRISTINE
, PAD(sizeof(*rd
)+namelen
), f
->inocache
);
296 jffs2_dbg_acct_sanity_check(c
,NULL
);
302 /* The OS-specific code fills in the metadata in the jffs2_raw_inode for us, so that
303 we don't have to go digging in struct inode or its equivalent. It should set:
304 mode, uid, gid, (starting)isize, atime, ctime, mtime */
305 int jffs2_write_inode_range(struct jffs2_sb_info
*c
, struct jffs2_inode_info
*f
,
306 struct jffs2_raw_inode
*ri
, unsigned char *buf
,
307 uint32_t offset
, uint32_t writelen
, uint32_t *retlen
)
310 uint32_t writtenlen
= 0;
312 D1(printk(KERN_DEBUG
"jffs2_write_inode_range(): Ino #%u, ofs 0x%x, len 0x%x\n",
313 f
->inocache
->ino
, offset
, writelen
));
316 struct jffs2_full_dnode
*fn
;
317 unsigned char *comprbuf
= NULL
;
318 uint16_t comprtype
= JFFS2_COMPR_NONE
;
320 uint32_t datalen
, cdatalen
;
324 D2(printk(KERN_DEBUG
"jffs2_commit_write() loop: 0x%x to write to 0x%x\n", writelen
, offset
));
326 ret
= jffs2_reserve_space(c
, sizeof(*ri
) + JFFS2_MIN_DATA_LEN
,
327 &alloclen
, ALLOC_NORMAL
, JFFS2_SUMMARY_INODE_SIZE
);
329 D1(printk(KERN_DEBUG
"jffs2_reserve_space returned %d\n", ret
));
333 datalen
= min_t(uint32_t, writelen
, PAGE_CACHE_SIZE
- (offset
& (PAGE_CACHE_SIZE
-1)));
334 cdatalen
= min_t(uint32_t, alloclen
- sizeof(*ri
), datalen
);
336 comprtype
= jffs2_compress(c
, f
, buf
, &comprbuf
, &datalen
, &cdatalen
);
338 ri
->magic
= cpu_to_je16(JFFS2_MAGIC_BITMASK
);
339 ri
->nodetype
= cpu_to_je16(JFFS2_NODETYPE_INODE
);
340 ri
->totlen
= cpu_to_je32(sizeof(*ri
) + cdatalen
);
341 ri
->hdr_crc
= cpu_to_je32(crc32(0, ri
, sizeof(struct jffs2_unknown_node
)-4));
343 ri
->ino
= cpu_to_je32(f
->inocache
->ino
);
344 ri
->version
= cpu_to_je32(++f
->highest_version
);
345 ri
->isize
= cpu_to_je32(max(je32_to_cpu(ri
->isize
), offset
+ datalen
));
346 ri
->offset
= cpu_to_je32(offset
);
347 ri
->csize
= cpu_to_je32(cdatalen
);
348 ri
->dsize
= cpu_to_je32(datalen
);
349 ri
->compr
= comprtype
& 0xff;
350 ri
->usercompr
= (comprtype
>> 8 ) & 0xff;
351 ri
->node_crc
= cpu_to_je32(crc32(0, ri
, sizeof(*ri
)-8));
352 ri
->data_crc
= cpu_to_je32(crc32(0, comprbuf
, cdatalen
));
354 fn
= jffs2_write_dnode(c
, f
, ri
, comprbuf
, cdatalen
, ALLOC_NORETRY
);
356 jffs2_free_comprbuf(comprbuf
, buf
);
361 jffs2_complete_reservation(c
);
363 /* Write error to be retried */
365 D1(printk(KERN_DEBUG
"Retrying node write in jffs2_write_inode_range()\n"));
370 ret
= jffs2_add_full_dnode_to_inode(c
, f
, fn
);
372 jffs2_mark_node_obsolete(c
, f
->metadata
->raw
);
373 jffs2_free_full_dnode(f
->metadata
);
378 D1(printk(KERN_DEBUG
"Eep. add_full_dnode_to_inode() failed in commit_write, returned %d\n", ret
));
379 jffs2_mark_node_obsolete(c
, fn
->raw
);
380 jffs2_free_full_dnode(fn
);
383 jffs2_complete_reservation(c
);
387 jffs2_complete_reservation(c
);
389 printk(KERN_WARNING
"Eep. We didn't actually write any data in jffs2_write_inode_range()\n");
393 D1(printk(KERN_DEBUG
"increasing writtenlen by %d\n", datalen
));
394 writtenlen
+= datalen
;
399 *retlen
= writtenlen
;
403 int jffs2_do_create(struct jffs2_sb_info
*c
, struct jffs2_inode_info
*dir_f
, struct jffs2_inode_info
*f
, struct jffs2_raw_inode
*ri
, const char *name
, int namelen
)
405 struct jffs2_raw_dirent
*rd
;
406 struct jffs2_full_dnode
*fn
;
407 struct jffs2_full_dirent
*fd
;
411 /* Try to reserve enough space for both node and dirent.
412 * Just the node will do for now, though
414 ret
= jffs2_reserve_space(c
, sizeof(*ri
), &alloclen
, ALLOC_NORMAL
,
415 JFFS2_SUMMARY_INODE_SIZE
);
416 D1(printk(KERN_DEBUG
"jffs2_do_create(): reserved 0x%x bytes\n", alloclen
));
422 ri
->data_crc
= cpu_to_je32(0);
423 ri
->node_crc
= cpu_to_je32(crc32(0, ri
, sizeof(*ri
)-8));
425 fn
= jffs2_write_dnode(c
, f
, ri
, NULL
, 0, ALLOC_NORMAL
);
427 D1(printk(KERN_DEBUG
"jffs2_do_create created file with mode 0x%x\n",
428 jemode_to_cpu(ri
->mode
)));
431 D1(printk(KERN_DEBUG
"jffs2_write_dnode() failed\n"));
432 /* Eeek. Wave bye bye */
434 jffs2_complete_reservation(c
);
437 /* No data here. Only a metadata node, which will be
438 obsoleted by the first data write
443 jffs2_complete_reservation(c
);
444 ret
= jffs2_reserve_space(c
, sizeof(*rd
)+namelen
, &alloclen
,
445 ALLOC_NORMAL
, JFFS2_SUMMARY_DIRENT_SIZE(namelen
));
449 D1(printk(KERN_DEBUG
"jffs2_reserve_space() for dirent failed\n"));
453 rd
= jffs2_alloc_raw_dirent();
455 /* Argh. Now we treat it like a normal delete */
456 jffs2_complete_reservation(c
);
462 rd
->magic
= cpu_to_je16(JFFS2_MAGIC_BITMASK
);
463 rd
->nodetype
= cpu_to_je16(JFFS2_NODETYPE_DIRENT
);
464 rd
->totlen
= cpu_to_je32(sizeof(*rd
) + namelen
);
465 rd
->hdr_crc
= cpu_to_je32(crc32(0, rd
, sizeof(struct jffs2_unknown_node
)-4));
467 rd
->pino
= cpu_to_je32(dir_f
->inocache
->ino
);
468 rd
->version
= cpu_to_je32(++dir_f
->highest_version
);
470 rd
->mctime
= ri
->ctime
;
473 rd
->node_crc
= cpu_to_je32(crc32(0, rd
, sizeof(*rd
)-8));
474 rd
->name_crc
= cpu_to_je32(crc32(0, name
, namelen
));
476 fd
= jffs2_write_dirent(c
, dir_f
, rd
, name
, namelen
, ALLOC_NORMAL
);
478 jffs2_free_raw_dirent(rd
);
481 /* dirent failed to write. Delete the inode normally
482 as if it were the final unlink() */
483 jffs2_complete_reservation(c
);
488 /* Link the fd into the inode's list, obsoleting an old
490 jffs2_add_fd_to_list(c
, fd
, &dir_f
->dents
);
492 jffs2_complete_reservation(c
);
499 int jffs2_do_unlink(struct jffs2_sb_info
*c
, struct jffs2_inode_info
*dir_f
,
500 const char *name
, int namelen
, struct jffs2_inode_info
*dead_f
,
503 struct jffs2_raw_dirent
*rd
;
504 struct jffs2_full_dirent
*fd
;
508 if (!jffs2_can_mark_obsolete(c
)) {
509 /* We can't mark stuff obsolete on the medium. We need to write a deletion dirent */
511 rd
= jffs2_alloc_raw_dirent();
515 ret
= jffs2_reserve_space(c
, sizeof(*rd
)+namelen
, &alloclen
,
516 ALLOC_DELETION
, JFFS2_SUMMARY_DIRENT_SIZE(namelen
));
518 jffs2_free_raw_dirent(rd
);
524 /* Build a deletion node */
525 rd
->magic
= cpu_to_je16(JFFS2_MAGIC_BITMASK
);
526 rd
->nodetype
= cpu_to_je16(JFFS2_NODETYPE_DIRENT
);
527 rd
->totlen
= cpu_to_je32(sizeof(*rd
) + namelen
);
528 rd
->hdr_crc
= cpu_to_je32(crc32(0, rd
, sizeof(struct jffs2_unknown_node
)-4));
530 rd
->pino
= cpu_to_je32(dir_f
->inocache
->ino
);
531 rd
->version
= cpu_to_je32(++dir_f
->highest_version
);
532 rd
->ino
= cpu_to_je32(0);
533 rd
->mctime
= cpu_to_je32(time
);
535 rd
->type
= DT_UNKNOWN
;
536 rd
->node_crc
= cpu_to_je32(crc32(0, rd
, sizeof(*rd
)-8));
537 rd
->name_crc
= cpu_to_je32(crc32(0, name
, namelen
));
539 fd
= jffs2_write_dirent(c
, dir_f
, rd
, name
, namelen
, ALLOC_DELETION
);
541 jffs2_free_raw_dirent(rd
);
544 jffs2_complete_reservation(c
);
549 /* File it. This will mark the old one obsolete. */
550 jffs2_add_fd_to_list(c
, fd
, &dir_f
->dents
);
553 struct jffs2_full_dirent
**prev
= &dir_f
->dents
;
554 uint32_t nhash
= full_name_hash(name
, namelen
);
558 while ((*prev
) && (*prev
)->nhash
<= nhash
) {
559 if ((*prev
)->nhash
== nhash
&&
560 !memcmp((*prev
)->name
, name
, namelen
) &&
561 !(*prev
)->name
[namelen
]) {
562 struct jffs2_full_dirent
*this = *prev
;
564 D1(printk(KERN_DEBUG
"Marking old dirent node (ino #%u) @%08x obsolete\n",
565 this->ino
, ref_offset(this->raw
)));
568 jffs2_mark_node_obsolete(c
, (this->raw
));
569 jffs2_free_full_dirent(this);
572 prev
= &((*prev
)->next
);
577 /* dead_f is NULL if this was a rename not a real unlink */
578 /* Also catch the !f->inocache case, where there was a dirent
579 pointing to an inode which didn't exist. */
580 if (dead_f
&& dead_f
->inocache
) {
584 if (S_ISDIR(OFNI_EDONI_2SFFJ(dead_f
)->i_mode
)) {
585 while (dead_f
->dents
) {
586 /* There can be only deleted ones */
589 dead_f
->dents
= fd
->next
;
592 printk(KERN_WARNING
"Deleting inode #%u with active dentry \"%s\"->ino #%u\n",
593 dead_f
->inocache
->ino
, fd
->name
, fd
->ino
);
595 D1(printk(KERN_DEBUG
"Removing deletion dirent for \"%s\" from dir ino #%u\n",
596 fd
->name
, dead_f
->inocache
->ino
));
598 jffs2_mark_node_obsolete(c
, fd
->raw
);
599 jffs2_free_full_dirent(fd
);
603 dead_f
->inocache
->nlink
--;
604 /* NB: Caller must set inode nlink if appropriate */
608 jffs2_complete_reservation(c
);
614 int jffs2_do_link (struct jffs2_sb_info
*c
, struct jffs2_inode_info
*dir_f
, uint32_t ino
, uint8_t type
, const char *name
, int namelen
, uint32_t time
)
616 struct jffs2_raw_dirent
*rd
;
617 struct jffs2_full_dirent
*fd
;
621 rd
= jffs2_alloc_raw_dirent();
625 ret
= jffs2_reserve_space(c
, sizeof(*rd
)+namelen
, &alloclen
,
626 ALLOC_NORMAL
, JFFS2_SUMMARY_DIRENT_SIZE(namelen
));
628 jffs2_free_raw_dirent(rd
);
634 /* Build a deletion node */
635 rd
->magic
= cpu_to_je16(JFFS2_MAGIC_BITMASK
);
636 rd
->nodetype
= cpu_to_je16(JFFS2_NODETYPE_DIRENT
);
637 rd
->totlen
= cpu_to_je32(sizeof(*rd
) + namelen
);
638 rd
->hdr_crc
= cpu_to_je32(crc32(0, rd
, sizeof(struct jffs2_unknown_node
)-4));
640 rd
->pino
= cpu_to_je32(dir_f
->inocache
->ino
);
641 rd
->version
= cpu_to_je32(++dir_f
->highest_version
);
642 rd
->ino
= cpu_to_je32(ino
);
643 rd
->mctime
= cpu_to_je32(time
);
648 rd
->node_crc
= cpu_to_je32(crc32(0, rd
, sizeof(*rd
)-8));
649 rd
->name_crc
= cpu_to_je32(crc32(0, name
, namelen
));
651 fd
= jffs2_write_dirent(c
, dir_f
, rd
, name
, namelen
, ALLOC_NORMAL
);
653 jffs2_free_raw_dirent(rd
);
656 jffs2_complete_reservation(c
);
661 /* File it. This will mark the old one obsolete. */
662 jffs2_add_fd_to_list(c
, fd
, &dir_f
->dents
);
664 jffs2_complete_reservation(c
);