2 * JFFS2 -- Journalling Flash File System, Version 2.
4 * Copyright (C) 2001-2003 Red Hat, Inc.
6 * Created by David Woodhouse <dwmw2@infradead.org>
8 * For licensing information, see the file 'LICENCE' in this directory.
10 * $Id: write.c,v 1.97 2005/11/07 11:14:42 gleixner Exp $
14 #include <linux/kernel.h>
16 #include <linux/crc32.h>
17 #include <linux/slab.h>
18 #include <linux/pagemap.h>
19 #include <linux/mtd/mtd.h>
24 int jffs2_do_new_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, uint32_t mode, struct jffs2_raw_inode *ri)
26 struct jffs2_inode_cache *ic;
28 ic = jffs2_alloc_inode_cache();
33 memset(ic, 0, sizeof(*ic));
36 f->inocache->nlink = 1;
37 f->inocache->nodes = (struct jffs2_raw_node_ref *)f->inocache;
38 f->inocache->state = INO_STATE_PRESENT;
41 jffs2_add_ino_cache(c, f->inocache);
42 D1(printk(KERN_DEBUG "jffs2_do_new_inode(): Assigned ino# %d\n", f->inocache->ino));
43 ri->ino = cpu_to_je32(f->inocache->ino);
45 ri->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
46 ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
47 ri->totlen = cpu_to_je32(PAD(sizeof(*ri)));
48 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
49 ri->mode = cpu_to_jemode(mode);
51 f->highest_version = 1;
52 ri->version = cpu_to_je32(f->highest_version);
57 /* jffs2_write_dnode - given a raw_inode, allocate a full_dnode for it,
58 write it to the flash, link it into the existing inode/fragment list */
60 struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_raw_inode *ri, const unsigned char *data, uint32_t datalen, uint32_t flash_ofs, int alloc_mode)
63 struct jffs2_raw_node_ref *raw;
64 struct jffs2_full_dnode *fn;
69 unsigned long cnt = 2;
71 D1(if(je32_to_cpu(ri->hdr_crc) != crc32(0, ri, sizeof(struct jffs2_unknown_node)-4)) {
72 printk(KERN_CRIT "Eep. CRC not correct in jffs2_write_dnode()\n");
76 vecs[0].iov_base = ri;
77 vecs[0].iov_len = sizeof(*ri);
78 vecs[1].iov_base = (unsigned char *)data;
79 vecs[1].iov_len = datalen;
81 jffs2_dbg_prewrite_paranoia_check(c, flash_ofs, vecs[0].iov_len + vecs[1].iov_len);
83 if (je32_to_cpu(ri->totlen) != sizeof(*ri) + datalen) {
84 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);
86 raw = jffs2_alloc_raw_node_ref();
88 return ERR_PTR(-ENOMEM);
90 fn = jffs2_alloc_full_dnode();
92 jffs2_free_raw_node_ref(raw);
93 return ERR_PTR(-ENOMEM);
96 fn->ofs = je32_to_cpu(ri->offset);
97 fn->size = je32_to_cpu(ri->dsize);
100 /* check number of valid vecs */
101 if (!datalen || !data)
106 raw->flash_offset = flash_ofs;
107 raw->__totlen = PAD(sizeof(*ri)+datalen);
108 raw->next_phys = NULL;
110 if ((alloc_mode!=ALLOC_GC) && (je32_to_cpu(ri->version) < f->highest_version)) {
112 D1(printk(KERN_DEBUG "jffs2_write_dnode : dnode_version %d, "
113 "highest version %d -> updating dnode\n",
114 je32_to_cpu(ri->version), f->highest_version));
115 ri->version = cpu_to_je32(++f->highest_version);
116 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
119 ret = jffs2_flash_writev(c, vecs, cnt, flash_ofs, &retlen,
120 (alloc_mode==ALLOC_GC)?0:f->inocache->ino);
122 if (ret || (retlen != sizeof(*ri) + datalen)) {
123 printk(KERN_NOTICE "Write of %zd bytes at 0x%08x failed. returned %d, retlen %zd\n",
124 sizeof(*ri)+datalen, flash_ofs, ret, retlen);
126 /* Mark the space as dirtied */
128 /* Doesn't belong to any inode */
129 raw->next_in_ino = NULL;
131 /* Don't change raw->size to match retlen. We may have
132 written the node header already, and only the data will
133 seem corrupted, in which case the scan would skip over
134 any node we write before the original intended end of
136 raw->flash_offset |= REF_OBSOLETE;
137 jffs2_add_physical_node_ref(c, raw);
138 jffs2_mark_node_obsolete(c, raw);
140 printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", raw->flash_offset);
141 jffs2_free_raw_node_ref(raw);
143 if (!retried && alloc_mode != ALLOC_NORETRY && (raw = jffs2_alloc_raw_node_ref())) {
144 /* Try to reallocate space and retry */
146 struct jffs2_eraseblock *jeb = &c->blocks[flash_ofs / c->sector_size];
150 D1(printk(KERN_DEBUG "Retrying failed write.\n"));
152 jffs2_dbg_acct_sanity_check(c,jeb);
153 jffs2_dbg_acct_paranoia_check(c, jeb);
155 if (alloc_mode == ALLOC_GC) {
156 ret = jffs2_reserve_space_gc(c, sizeof(*ri) + datalen, &flash_ofs,
157 &dummy, JFFS2_SUMMARY_INODE_SIZE);
161 jffs2_complete_reservation(c);
163 ret = jffs2_reserve_space(c, sizeof(*ri) + datalen, &flash_ofs,
164 &dummy, alloc_mode, JFFS2_SUMMARY_INODE_SIZE);
169 D1(printk(KERN_DEBUG "Allocated space at 0x%08x to retry failed write.\n", flash_ofs));
171 jffs2_dbg_acct_sanity_check(c,jeb);
172 jffs2_dbg_acct_paranoia_check(c, jeb);
176 D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret));
177 jffs2_free_raw_node_ref(raw);
179 /* Release the full_dnode which is now useless, and return */
180 jffs2_free_full_dnode(fn);
181 return ERR_PTR(ret?ret:-EIO);
183 /* Mark the space used */
184 /* If node covers at least a whole page, or if it starts at the
185 beginning of a page and runs to the end of the file, or if
186 it's a hole node, mark it REF_PRISTINE, else REF_NORMAL.
188 if ((je32_to_cpu(ri->dsize) >= PAGE_CACHE_SIZE) ||
189 ( ((je32_to_cpu(ri->offset)&(PAGE_CACHE_SIZE-1))==0) &&
190 (je32_to_cpu(ri->dsize)+je32_to_cpu(ri->offset) == je32_to_cpu(ri->isize)))) {
191 raw->flash_offset |= REF_PRISTINE;
193 raw->flash_offset |= REF_NORMAL;
195 jffs2_add_physical_node_ref(c, raw);
197 /* Link into per-inode list */
198 spin_lock(&c->erase_completion_lock);
199 raw->next_in_ino = f->inocache->nodes;
200 f->inocache->nodes = raw;
201 spin_unlock(&c->erase_completion_lock);
203 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",
204 flash_ofs, ref_flags(raw), je32_to_cpu(ri->dsize),
205 je32_to_cpu(ri->csize), je32_to_cpu(ri->node_crc),
206 je32_to_cpu(ri->data_crc), je32_to_cpu(ri->totlen)));
209 jffs2_dbg_acct_sanity_check(c,NULL);
215 struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_raw_dirent *rd, const unsigned char *name, uint32_t namelen, uint32_t flash_ofs, int alloc_mode)
217 struct jffs2_raw_node_ref *raw;
218 struct jffs2_full_dirent *fd;
224 D1(printk(KERN_DEBUG "jffs2_write_dirent(ino #%u, name at *0x%p \"%s\"->ino #%u, name_crc 0x%08x)\n",
225 je32_to_cpu(rd->pino), name, name, je32_to_cpu(rd->ino),
226 je32_to_cpu(rd->name_crc)));
228 D1(if(je32_to_cpu(rd->hdr_crc) != crc32(0, rd, sizeof(struct jffs2_unknown_node)-4)) {
229 printk(KERN_CRIT "Eep. CRC not correct in jffs2_write_dirent()\n");
234 vecs[0].iov_base = rd;
235 vecs[0].iov_len = sizeof(*rd);
236 vecs[1].iov_base = (unsigned char *)name;
237 vecs[1].iov_len = namelen;
239 jffs2_dbg_prewrite_paranoia_check(c, flash_ofs, vecs[0].iov_len + vecs[1].iov_len);
241 raw = jffs2_alloc_raw_node_ref();
244 return ERR_PTR(-ENOMEM);
246 fd = jffs2_alloc_full_dirent(namelen+1);
248 jffs2_free_raw_node_ref(raw);
249 return ERR_PTR(-ENOMEM);
252 fd->version = je32_to_cpu(rd->version);
253 fd->ino = je32_to_cpu(rd->ino);
254 fd->nhash = full_name_hash(name, strlen(name));
256 memcpy(fd->name, name, namelen);
262 raw->flash_offset = flash_ofs;
263 raw->__totlen = PAD(sizeof(*rd)+namelen);
264 raw->next_phys = NULL;
266 if ((alloc_mode!=ALLOC_GC) && (je32_to_cpu(rd->version) < f->highest_version)) {
268 D1(printk(KERN_DEBUG "jffs2_write_dirent : dirent_version %d, "
269 "highest version %d -> updating dirent\n",
270 je32_to_cpu(rd->version), f->highest_version));
271 rd->version = cpu_to_je32(++f->highest_version);
272 fd->version = je32_to_cpu(rd->version);
273 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
276 ret = jffs2_flash_writev(c, vecs, 2, flash_ofs, &retlen,
277 (alloc_mode==ALLOC_GC)?0:je32_to_cpu(rd->pino));
278 if (ret || (retlen != sizeof(*rd) + namelen)) {
279 printk(KERN_NOTICE "Write of %zd bytes at 0x%08x failed. returned %d, retlen %zd\n",
280 sizeof(*rd)+namelen, flash_ofs, ret, retlen);
281 /* Mark the space as dirtied */
283 raw->next_in_ino = NULL;
284 raw->flash_offset |= REF_OBSOLETE;
285 jffs2_add_physical_node_ref(c, raw);
286 jffs2_mark_node_obsolete(c, raw);
288 printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", raw->flash_offset);
289 jffs2_free_raw_node_ref(raw);
291 if (!retried && (raw = jffs2_alloc_raw_node_ref())) {
292 /* Try to reallocate space and retry */
294 struct jffs2_eraseblock *jeb = &c->blocks[flash_ofs / c->sector_size];
298 D1(printk(KERN_DEBUG "Retrying failed write.\n"));
300 jffs2_dbg_acct_sanity_check(c,jeb);
301 jffs2_dbg_acct_paranoia_check(c, jeb);
303 if (alloc_mode == ALLOC_GC) {
304 ret = jffs2_reserve_space_gc(c, sizeof(*rd) + namelen, &flash_ofs,
305 &dummy, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
309 jffs2_complete_reservation(c);
311 ret = jffs2_reserve_space(c, sizeof(*rd) + namelen, &flash_ofs,
312 &dummy, alloc_mode, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
317 D1(printk(KERN_DEBUG "Allocated space at 0x%08x to retry failed write.\n", flash_ofs));
318 jffs2_dbg_acct_sanity_check(c,jeb);
319 jffs2_dbg_acct_paranoia_check(c, jeb);
322 D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret));
323 jffs2_free_raw_node_ref(raw);
325 /* Release the full_dnode which is now useless, and return */
326 jffs2_free_full_dirent(fd);
327 return ERR_PTR(ret?ret:-EIO);
329 /* Mark the space used */
330 raw->flash_offset |= REF_PRISTINE;
331 jffs2_add_physical_node_ref(c, raw);
333 spin_lock(&c->erase_completion_lock);
334 raw->next_in_ino = f->inocache->nodes;
335 f->inocache->nodes = raw;
336 spin_unlock(&c->erase_completion_lock);
339 jffs2_dbg_acct_sanity_check(c,NULL);
345 /* The OS-specific code fills in the metadata in the jffs2_raw_inode for us, so that
346 we don't have to go digging in struct inode or its equivalent. It should set:
347 mode, uid, gid, (starting)isize, atime, ctime, mtime */
348 int jffs2_write_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
349 struct jffs2_raw_inode *ri, unsigned char *buf,
350 uint32_t offset, uint32_t writelen, uint32_t *retlen)
353 uint32_t writtenlen = 0;
355 D1(printk(KERN_DEBUG "jffs2_write_inode_range(): Ino #%u, ofs 0x%x, len 0x%x\n",
356 f->inocache->ino, offset, writelen));
359 struct jffs2_full_dnode *fn;
360 unsigned char *comprbuf = NULL;
361 uint16_t comprtype = JFFS2_COMPR_NONE;
362 uint32_t phys_ofs, alloclen;
363 uint32_t datalen, cdatalen;
367 D2(printk(KERN_DEBUG "jffs2_commit_write() loop: 0x%x to write to 0x%x\n", writelen, offset));
369 ret = jffs2_reserve_space(c, sizeof(*ri) + JFFS2_MIN_DATA_LEN, &phys_ofs,
370 &alloclen, ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
372 D1(printk(KERN_DEBUG "jffs2_reserve_space returned %d\n", ret));
376 datalen = min_t(uint32_t, writelen, PAGE_CACHE_SIZE - (offset & (PAGE_CACHE_SIZE-1)));
377 cdatalen = min_t(uint32_t, alloclen - sizeof(*ri), datalen);
379 comprtype = jffs2_compress(c, f, buf, &comprbuf, &datalen, &cdatalen);
381 ri->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
382 ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
383 ri->totlen = cpu_to_je32(sizeof(*ri) + cdatalen);
384 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
386 ri->ino = cpu_to_je32(f->inocache->ino);
387 ri->version = cpu_to_je32(++f->highest_version);
388 ri->isize = cpu_to_je32(max(je32_to_cpu(ri->isize), offset + datalen));
389 ri->offset = cpu_to_je32(offset);
390 ri->csize = cpu_to_je32(cdatalen);
391 ri->dsize = cpu_to_je32(datalen);
392 ri->compr = comprtype & 0xff;
393 ri->usercompr = (comprtype >> 8 ) & 0xff;
394 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
395 ri->data_crc = cpu_to_je32(crc32(0, comprbuf, cdatalen));
397 fn = jffs2_write_dnode(c, f, ri, comprbuf, cdatalen, phys_ofs, ALLOC_NORETRY);
399 jffs2_free_comprbuf(comprbuf, buf);
404 jffs2_complete_reservation(c);
406 /* Write error to be retried */
408 D1(printk(KERN_DEBUG "Retrying node write in jffs2_write_inode_range()\n"));
413 ret = jffs2_add_full_dnode_to_inode(c, f, fn);
415 jffs2_mark_node_obsolete(c, f->metadata->raw);
416 jffs2_free_full_dnode(f->metadata);
421 D1(printk(KERN_DEBUG "Eep. add_full_dnode_to_inode() failed in commit_write, returned %d\n", ret));
422 jffs2_mark_node_obsolete(c, fn->raw);
423 jffs2_free_full_dnode(fn);
426 jffs2_complete_reservation(c);
430 jffs2_complete_reservation(c);
432 printk(KERN_WARNING "Eep. We didn't actually write any data in jffs2_write_inode_range()\n");
436 D1(printk(KERN_DEBUG "increasing writtenlen by %d\n", datalen));
437 writtenlen += datalen;
442 *retlen = writtenlen;
446 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)
448 struct jffs2_raw_dirent *rd;
449 struct jffs2_full_dnode *fn;
450 struct jffs2_full_dirent *fd;
451 uint32_t alloclen, phys_ofs;
454 /* Try to reserve enough space for both node and dirent.
455 * Just the node will do for now, though
457 ret = jffs2_reserve_space(c, sizeof(*ri), &phys_ofs, &alloclen, ALLOC_NORMAL,
458 JFFS2_SUMMARY_INODE_SIZE);
459 D1(printk(KERN_DEBUG "jffs2_do_create(): reserved 0x%x bytes\n", alloclen));
465 ri->data_crc = cpu_to_je32(0);
466 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
468 fn = jffs2_write_dnode(c, f, ri, NULL, 0, phys_ofs, ALLOC_NORMAL);
470 D1(printk(KERN_DEBUG "jffs2_do_create created file with mode 0x%x\n",
471 jemode_to_cpu(ri->mode)));
474 D1(printk(KERN_DEBUG "jffs2_write_dnode() failed\n"));
475 /* Eeek. Wave bye bye */
477 jffs2_complete_reservation(c);
480 /* No data here. Only a metadata node, which will be
481 obsoleted by the first data write
486 jffs2_complete_reservation(c);
487 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen,
488 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
492 D1(printk(KERN_DEBUG "jffs2_reserve_space() for dirent failed\n"));
496 rd = jffs2_alloc_raw_dirent();
498 /* Argh. Now we treat it like a normal delete */
499 jffs2_complete_reservation(c);
505 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
506 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
507 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
508 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
510 rd->pino = cpu_to_je32(dir_f->inocache->ino);
511 rd->version = cpu_to_je32(++dir_f->highest_version);
513 rd->mctime = ri->ctime;
516 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
517 rd->name_crc = cpu_to_je32(crc32(0, name, namelen));
519 fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, phys_ofs, ALLOC_NORMAL);
521 jffs2_free_raw_dirent(rd);
524 /* dirent failed to write. Delete the inode normally
525 as if it were the final unlink() */
526 jffs2_complete_reservation(c);
531 /* Link the fd into the inode's list, obsoleting an old
533 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
535 jffs2_complete_reservation(c);
542 int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f,
543 const char *name, int namelen, struct jffs2_inode_info *dead_f,
546 struct jffs2_raw_dirent *rd;
547 struct jffs2_full_dirent *fd;
548 uint32_t alloclen, phys_ofs;
551 if (1 /* alternative branch needs testing */ ||
552 !jffs2_can_mark_obsolete(c)) {
553 /* We can't mark stuff obsolete on the medium. We need to write a deletion dirent */
555 rd = jffs2_alloc_raw_dirent();
559 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen,
560 ALLOC_DELETION, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
562 jffs2_free_raw_dirent(rd);
568 /* Build a deletion node */
569 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
570 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
571 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
572 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
574 rd->pino = cpu_to_je32(dir_f->inocache->ino);
575 rd->version = cpu_to_je32(++dir_f->highest_version);
576 rd->ino = cpu_to_je32(0);
577 rd->mctime = cpu_to_je32(time);
579 rd->type = DT_UNKNOWN;
580 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
581 rd->name_crc = cpu_to_je32(crc32(0, name, namelen));
583 fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, phys_ofs, ALLOC_DELETION);
585 jffs2_free_raw_dirent(rd);
588 jffs2_complete_reservation(c);
593 /* File it. This will mark the old one obsolete. */
594 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
597 struct jffs2_full_dirent **prev = &dir_f->dents;
598 uint32_t nhash = full_name_hash(name, namelen);
602 while ((*prev) && (*prev)->nhash <= nhash) {
603 if ((*prev)->nhash == nhash &&
604 !memcmp((*prev)->name, name, namelen) &&
605 !(*prev)->name[namelen]) {
606 struct jffs2_full_dirent *this = *prev;
608 D1(printk(KERN_DEBUG "Marking old dirent node (ino #%u) @%08x obsolete\n",
609 this->ino, ref_offset(this->raw)));
612 jffs2_mark_node_obsolete(c, (this->raw));
613 jffs2_free_full_dirent(this);
616 prev = &((*prev)->next);
621 /* dead_f is NULL if this was a rename not a real unlink */
622 /* Also catch the !f->inocache case, where there was a dirent
623 pointing to an inode which didn't exist. */
624 if (dead_f && dead_f->inocache) {
628 if (S_ISDIR(OFNI_EDONI_2SFFJ(dead_f)->i_mode)) {
629 while (dead_f->dents) {
630 /* There can be only deleted ones */
633 dead_f->dents = fd->next;
636 printk(KERN_WARNING "Deleting inode #%u with active dentry \"%s\"->ino #%u\n",
637 dead_f->inocache->ino, fd->name, fd->ino);
639 D1(printk(KERN_DEBUG "Removing deletion dirent for \"%s\" from dir ino #%u\n",
640 fd->name, dead_f->inocache->ino));
642 jffs2_mark_node_obsolete(c, fd->raw);
643 jffs2_free_full_dirent(fd);
647 dead_f->inocache->nlink--;
648 /* NB: Caller must set inode nlink if appropriate */
652 jffs2_complete_reservation(c);
658 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)
660 struct jffs2_raw_dirent *rd;
661 struct jffs2_full_dirent *fd;
662 uint32_t alloclen, phys_ofs;
665 rd = jffs2_alloc_raw_dirent();
669 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen,
670 ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
672 jffs2_free_raw_dirent(rd);
678 /* Build a deletion node */
679 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
680 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
681 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
682 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
684 rd->pino = cpu_to_je32(dir_f->inocache->ino);
685 rd->version = cpu_to_je32(++dir_f->highest_version);
686 rd->ino = cpu_to_je32(ino);
687 rd->mctime = cpu_to_je32(time);
692 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
693 rd->name_crc = cpu_to_je32(crc32(0, name, namelen));
695 fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, phys_ofs, ALLOC_NORMAL);
697 jffs2_free_raw_dirent(rd);
700 jffs2_complete_reservation(c);
705 /* File it. This will mark the old one obsolete. */
706 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
708 jffs2_complete_reservation(c);