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.92 2005/04/13 13:22:35 dwmw2 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 #if CONFIG_JFFS2_FS_DEBUG > 0
58 static void writecheck(struct jffs2_sb_info *c, uint32_t ofs)
60 unsigned char buf[16];
64 ret = jffs2_flash_read(c, ofs, 16, &retlen, buf);
65 if (ret || (retlen != 16)) {
66 D1(printk(KERN_DEBUG "read failed or short in writecheck(). ret %d, retlen %zd\n", ret, retlen));
70 for (i=0; i<16; i++) {
75 printk(KERN_WARNING "ARGH. About to write node to 0x%08x on flash, but there are data already there:\n", ofs);
76 printk(KERN_WARNING "0x%08x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x\n",
78 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7],
79 buf[8], buf[9], buf[10], buf[11], buf[12], buf[13], buf[14], buf[15]);
85 /* jffs2_write_dnode - given a raw_inode, allocate a full_dnode for it,
86 write it to the flash, link it into the existing inode/fragment list */
88 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)
91 struct jffs2_raw_node_ref *raw;
92 struct jffs2_full_dnode *fn;
97 unsigned long cnt = 2;
99 D1(if(je32_to_cpu(ri->hdr_crc) != crc32(0, ri, sizeof(struct jffs2_unknown_node)-4)) {
100 printk(KERN_CRIT "Eep. CRC not correct in jffs2_write_dnode()\n");
104 vecs[0].iov_base = ri;
105 vecs[0].iov_len = sizeof(*ri);
106 vecs[1].iov_base = (unsigned char *)data;
107 vecs[1].iov_len = datalen;
109 D1(writecheck(c, flash_ofs));
111 if (je32_to_cpu(ri->totlen) != sizeof(*ri) + datalen) {
112 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);
114 raw = jffs2_alloc_raw_node_ref();
116 return ERR_PTR(-ENOMEM);
118 fn = jffs2_alloc_full_dnode();
120 jffs2_free_raw_node_ref(raw);
121 return ERR_PTR(-ENOMEM);
124 fn->ofs = je32_to_cpu(ri->offset);
125 fn->size = je32_to_cpu(ri->dsize);
128 /* check number of valid vecs */
129 if (!datalen || !data)
134 raw->flash_offset = flash_ofs;
135 raw->__totlen = PAD(sizeof(*ri)+datalen);
136 raw->next_phys = NULL;
138 if ((alloc_mode!=ALLOC_GC) && (je32_to_cpu(ri->version) < f->highest_version)) {
140 D1(printk(KERN_DEBUG "jffs2_write_dnode : dnode_version %d, "
141 "highest version %d -> updating dnode\n",
142 je32_to_cpu(ri->version), f->highest_version));
143 ri->version = cpu_to_je32(++f->highest_version);
144 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
147 ret = jffs2_flash_writev(c, vecs, cnt, flash_ofs, &retlen,
148 (alloc_mode==ALLOC_GC)?0:f->inocache->ino);
150 if (ret || (retlen != sizeof(*ri) + datalen)) {
151 printk(KERN_NOTICE "Write of %zd bytes at 0x%08x failed. returned %d, retlen %zd\n",
152 sizeof(*ri)+datalen, flash_ofs, ret, retlen);
154 /* Mark the space as dirtied */
156 /* Doesn't belong to any inode */
157 raw->next_in_ino = NULL;
159 /* Don't change raw->size to match retlen. We may have
160 written the node header already, and only the data will
161 seem corrupted, in which case the scan would skip over
162 any node we write before the original intended end of
164 raw->flash_offset |= REF_OBSOLETE;
165 jffs2_add_physical_node_ref(c, raw);
166 jffs2_mark_node_obsolete(c, raw);
168 printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", raw->flash_offset);
169 jffs2_free_raw_node_ref(raw);
171 if (!retried && alloc_mode != ALLOC_NORETRY && (raw = jffs2_alloc_raw_node_ref())) {
172 /* Try to reallocate space and retry */
174 struct jffs2_eraseblock *jeb = &c->blocks[flash_ofs / c->sector_size];
178 D1(printk(KERN_DEBUG "Retrying failed write.\n"));
180 ACCT_SANITY_CHECK(c,jeb);
181 D1(ACCT_PARANOIA_CHECK(jeb));
183 if (alloc_mode == ALLOC_GC) {
184 ret = jffs2_reserve_space_gc(c, sizeof(*ri) + datalen, &flash_ofs, &dummy);
188 jffs2_complete_reservation(c);
190 ret = jffs2_reserve_space(c, sizeof(*ri) + datalen, &flash_ofs, &dummy, alloc_mode);
195 D1(printk(KERN_DEBUG "Allocated space at 0x%08x to retry failed write.\n", flash_ofs));
197 ACCT_SANITY_CHECK(c,jeb);
198 D1(ACCT_PARANOIA_CHECK(jeb));
202 D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret));
203 jffs2_free_raw_node_ref(raw);
205 /* Release the full_dnode which is now useless, and return */
206 jffs2_free_full_dnode(fn);
207 return ERR_PTR(ret?ret:-EIO);
209 /* Mark the space used */
210 /* If node covers at least a whole page, or if it starts at the
211 beginning of a page and runs to the end of the file, or if
212 it's a hole node, mark it REF_PRISTINE, else REF_NORMAL.
214 if ((je32_to_cpu(ri->dsize) >= PAGE_CACHE_SIZE) ||
215 ( ((je32_to_cpu(ri->offset)&(PAGE_CACHE_SIZE-1))==0) &&
216 (je32_to_cpu(ri->dsize)+je32_to_cpu(ri->offset) == je32_to_cpu(ri->isize)))) {
217 raw->flash_offset |= REF_PRISTINE;
219 raw->flash_offset |= REF_NORMAL;
221 jffs2_add_physical_node_ref(c, raw);
223 /* Link into per-inode list */
224 spin_lock(&c->erase_completion_lock);
225 raw->next_in_ino = f->inocache->nodes;
226 f->inocache->nodes = raw;
227 spin_unlock(&c->erase_completion_lock);
229 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",
230 flash_ofs, ref_flags(raw), je32_to_cpu(ri->dsize),
231 je32_to_cpu(ri->csize), je32_to_cpu(ri->node_crc),
232 je32_to_cpu(ri->data_crc), je32_to_cpu(ri->totlen)));
235 ACCT_SANITY_CHECK(c,NULL);
241 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)
243 struct jffs2_raw_node_ref *raw;
244 struct jffs2_full_dirent *fd;
250 D1(printk(KERN_DEBUG "jffs2_write_dirent(ino #%u, name at *0x%p \"%s\"->ino #%u, name_crc 0x%08x)\n",
251 je32_to_cpu(rd->pino), name, name, je32_to_cpu(rd->ino),
252 je32_to_cpu(rd->name_crc)));
253 D1(writecheck(c, flash_ofs));
255 D1(if(je32_to_cpu(rd->hdr_crc) != crc32(0, rd, sizeof(struct jffs2_unknown_node)-4)) {
256 printk(KERN_CRIT "Eep. CRC not correct in jffs2_write_dirent()\n");
261 vecs[0].iov_base = rd;
262 vecs[0].iov_len = sizeof(*rd);
263 vecs[1].iov_base = (unsigned char *)name;
264 vecs[1].iov_len = namelen;
266 raw = jffs2_alloc_raw_node_ref();
269 return ERR_PTR(-ENOMEM);
271 fd = jffs2_alloc_full_dirent(namelen+1);
273 jffs2_free_raw_node_ref(raw);
274 return ERR_PTR(-ENOMEM);
277 fd->version = je32_to_cpu(rd->version);
278 fd->ino = je32_to_cpu(rd->ino);
279 fd->nhash = full_name_hash(name, strlen(name));
281 memcpy(fd->name, name, namelen);
287 raw->flash_offset = flash_ofs;
288 raw->__totlen = PAD(sizeof(*rd)+namelen);
289 raw->next_phys = NULL;
291 if ((alloc_mode!=ALLOC_GC) && (je32_to_cpu(rd->version) < f->highest_version)) {
293 D1(printk(KERN_DEBUG "jffs2_write_dirent : dirent_version %d, "
294 "highest version %d -> updating dirent\n",
295 je32_to_cpu(rd->version), f->highest_version));
296 rd->version = cpu_to_je32(++f->highest_version);
297 fd->version = je32_to_cpu(rd->version);
298 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
301 ret = jffs2_flash_writev(c, vecs, 2, flash_ofs, &retlen,
302 (alloc_mode==ALLOC_GC)?0:je32_to_cpu(rd->pino));
303 if (ret || (retlen != sizeof(*rd) + namelen)) {
304 printk(KERN_NOTICE "Write of %zd bytes at 0x%08x failed. returned %d, retlen %zd\n",
305 sizeof(*rd)+namelen, flash_ofs, ret, retlen);
306 /* Mark the space as dirtied */
308 raw->next_in_ino = NULL;
309 raw->flash_offset |= REF_OBSOLETE;
310 jffs2_add_physical_node_ref(c, raw);
311 jffs2_mark_node_obsolete(c, raw);
313 printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", raw->flash_offset);
314 jffs2_free_raw_node_ref(raw);
316 if (!retried && (raw = jffs2_alloc_raw_node_ref())) {
317 /* Try to reallocate space and retry */
319 struct jffs2_eraseblock *jeb = &c->blocks[flash_ofs / c->sector_size];
323 D1(printk(KERN_DEBUG "Retrying failed write.\n"));
325 ACCT_SANITY_CHECK(c,jeb);
326 D1(ACCT_PARANOIA_CHECK(jeb));
328 if (alloc_mode == ALLOC_GC) {
329 ret = jffs2_reserve_space_gc(c, sizeof(*rd) + namelen, &flash_ofs, &dummy);
333 jffs2_complete_reservation(c);
335 ret = jffs2_reserve_space(c, sizeof(*rd) + namelen, &flash_ofs, &dummy, alloc_mode);
340 D1(printk(KERN_DEBUG "Allocated space at 0x%08x to retry failed write.\n", flash_ofs));
341 ACCT_SANITY_CHECK(c,jeb);
342 D1(ACCT_PARANOIA_CHECK(jeb));
345 D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret));
346 jffs2_free_raw_node_ref(raw);
348 /* Release the full_dnode which is now useless, and return */
349 jffs2_free_full_dirent(fd);
350 return ERR_PTR(ret?ret:-EIO);
352 /* Mark the space used */
353 raw->flash_offset |= REF_PRISTINE;
354 jffs2_add_physical_node_ref(c, raw);
356 spin_lock(&c->erase_completion_lock);
357 raw->next_in_ino = f->inocache->nodes;
358 f->inocache->nodes = raw;
359 spin_unlock(&c->erase_completion_lock);
362 ACCT_SANITY_CHECK(c,NULL);
368 /* The OS-specific code fills in the metadata in the jffs2_raw_inode for us, so that
369 we don't have to go digging in struct inode or its equivalent. It should set:
370 mode, uid, gid, (starting)isize, atime, ctime, mtime */
371 int jffs2_write_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
372 struct jffs2_raw_inode *ri, unsigned char *buf,
373 uint32_t offset, uint32_t writelen, uint32_t *retlen)
376 uint32_t writtenlen = 0;
378 D1(printk(KERN_DEBUG "jffs2_write_inode_range(): Ino #%u, ofs 0x%x, len 0x%x\n",
379 f->inocache->ino, offset, writelen));
382 struct jffs2_full_dnode *fn;
383 unsigned char *comprbuf = NULL;
384 uint16_t comprtype = JFFS2_COMPR_NONE;
385 uint32_t phys_ofs, alloclen;
386 uint32_t datalen, cdatalen;
390 D2(printk(KERN_DEBUG "jffs2_commit_write() loop: 0x%x to write to 0x%x\n", writelen, offset));
392 ret = jffs2_reserve_space(c, sizeof(*ri) + JFFS2_MIN_DATA_LEN, &phys_ofs, &alloclen, ALLOC_NORMAL);
394 D1(printk(KERN_DEBUG "jffs2_reserve_space returned %d\n", ret));
398 datalen = min_t(uint32_t, writelen, PAGE_CACHE_SIZE - (offset & (PAGE_CACHE_SIZE-1)));
399 cdatalen = min_t(uint32_t, alloclen - sizeof(*ri), datalen);
401 comprtype = jffs2_compress(c, f, buf, &comprbuf, &datalen, &cdatalen);
403 ri->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
404 ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
405 ri->totlen = cpu_to_je32(sizeof(*ri) + cdatalen);
406 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
408 ri->ino = cpu_to_je32(f->inocache->ino);
409 ri->version = cpu_to_je32(++f->highest_version);
410 ri->isize = cpu_to_je32(max(je32_to_cpu(ri->isize), offset + datalen));
411 ri->offset = cpu_to_je32(offset);
412 ri->csize = cpu_to_je32(cdatalen);
413 ri->dsize = cpu_to_je32(datalen);
414 ri->compr = comprtype & 0xff;
415 ri->usercompr = (comprtype >> 8 ) & 0xff;
416 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
417 ri->data_crc = cpu_to_je32(crc32(0, comprbuf, cdatalen));
419 fn = jffs2_write_dnode(c, f, ri, comprbuf, cdatalen, phys_ofs, ALLOC_NORETRY);
421 jffs2_free_comprbuf(comprbuf, buf);
426 jffs2_complete_reservation(c);
428 /* Write error to be retried */
430 D1(printk(KERN_DEBUG "Retrying node write in jffs2_write_inode_range()\n"));
435 ret = jffs2_add_full_dnode_to_inode(c, f, fn);
437 jffs2_mark_node_obsolete(c, f->metadata->raw);
438 jffs2_free_full_dnode(f->metadata);
443 D1(printk(KERN_DEBUG "Eep. add_full_dnode_to_inode() failed in commit_write, returned %d\n", ret));
444 jffs2_mark_node_obsolete(c, fn->raw);
445 jffs2_free_full_dnode(fn);
448 jffs2_complete_reservation(c);
452 jffs2_complete_reservation(c);
454 printk(KERN_WARNING "Eep. We didn't actually write any data in jffs2_write_inode_range()\n");
458 D1(printk(KERN_DEBUG "increasing writtenlen by %d\n", datalen));
459 writtenlen += datalen;
464 *retlen = writtenlen;
468 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)
470 struct jffs2_raw_dirent *rd;
471 struct jffs2_full_dnode *fn;
472 struct jffs2_full_dirent *fd;
473 uint32_t alloclen, phys_ofs;
476 /* Try to reserve enough space for both node and dirent.
477 * Just the node will do for now, though
479 ret = jffs2_reserve_space(c, sizeof(*ri), &phys_ofs, &alloclen, ALLOC_NORMAL);
480 D1(printk(KERN_DEBUG "jffs2_do_create(): reserved 0x%x bytes\n", alloclen));
486 ri->data_crc = cpu_to_je32(0);
487 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
489 fn = jffs2_write_dnode(c, f, ri, NULL, 0, phys_ofs, ALLOC_NORMAL);
491 D1(printk(KERN_DEBUG "jffs2_do_create created file with mode 0x%x\n",
492 jemode_to_cpu(ri->mode)));
495 D1(printk(KERN_DEBUG "jffs2_write_dnode() failed\n"));
496 /* Eeek. Wave bye bye */
498 jffs2_complete_reservation(c);
501 /* No data here. Only a metadata node, which will be
502 obsoleted by the first data write
507 jffs2_complete_reservation(c);
508 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, ALLOC_NORMAL);
512 D1(printk(KERN_DEBUG "jffs2_reserve_space() for dirent failed\n"));
516 rd = jffs2_alloc_raw_dirent();
518 /* Argh. Now we treat it like a normal delete */
519 jffs2_complete_reservation(c);
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);
533 rd->mctime = ri->ctime;
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, phys_ofs, ALLOC_NORMAL);
541 jffs2_free_raw_dirent(rd);
544 /* dirent failed to write. Delete the inode normally
545 as if it were the final unlink() */
546 jffs2_complete_reservation(c);
551 /* Link the fd into the inode's list, obsoleting an old
553 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
555 jffs2_complete_reservation(c);
562 int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f,
563 const char *name, int namelen, struct jffs2_inode_info *dead_f)
565 struct jffs2_raw_dirent *rd;
566 struct jffs2_full_dirent *fd;
567 uint32_t alloclen, phys_ofs;
570 if (1 /* alternative branch needs testing */ ||
571 !jffs2_can_mark_obsolete(c)) {
572 /* We can't mark stuff obsolete on the medium. We need to write a deletion dirent */
574 rd = jffs2_alloc_raw_dirent();
578 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, ALLOC_DELETION);
580 jffs2_free_raw_dirent(rd);
586 /* Build a deletion node */
587 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
588 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
589 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
590 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
592 rd->pino = cpu_to_je32(dir_f->inocache->ino);
593 rd->version = cpu_to_je32(++dir_f->highest_version);
594 rd->ino = cpu_to_je32(0);
595 rd->mctime = cpu_to_je32(get_seconds());
597 rd->type = DT_UNKNOWN;
598 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
599 rd->name_crc = cpu_to_je32(crc32(0, name, namelen));
601 fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, phys_ofs, ALLOC_DELETION);
603 jffs2_free_raw_dirent(rd);
606 jffs2_complete_reservation(c);
611 /* File it. This will mark the old one obsolete. */
612 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
615 struct jffs2_full_dirent **prev = &dir_f->dents;
616 uint32_t nhash = full_name_hash(name, namelen);
620 while ((*prev) && (*prev)->nhash <= nhash) {
621 if ((*prev)->nhash == nhash &&
622 !memcmp((*prev)->name, name, namelen) &&
623 !(*prev)->name[namelen]) {
624 struct jffs2_full_dirent *this = *prev;
626 D1(printk(KERN_DEBUG "Marking old dirent node (ino #%u) @%08x obsolete\n",
627 this->ino, ref_offset(this->raw)));
630 jffs2_mark_node_obsolete(c, (this->raw));
631 jffs2_free_full_dirent(this);
634 prev = &((*prev)->next);
639 /* dead_f is NULL if this was a rename not a real unlink */
640 /* Also catch the !f->inocache case, where there was a dirent
641 pointing to an inode which didn't exist. */
642 if (dead_f && dead_f->inocache) {
646 if (S_ISDIR(OFNI_EDONI_2SFFJ(dead_f)->i_mode)) {
647 while (dead_f->dents) {
648 /* There can be only deleted ones */
651 dead_f->dents = fd->next;
654 printk(KERN_WARNING "Deleting inode #%u with active dentry \"%s\"->ino #%u\n",
655 dead_f->inocache->ino, fd->name, fd->ino);
657 D1(printk(KERN_DEBUG "Removing deletion dirent for \"%s\" from dir ino #%u\n",
658 fd->name, dead_f->inocache->ino));
660 jffs2_mark_node_obsolete(c, fd->raw);
661 jffs2_free_full_dirent(fd);
665 dead_f->inocache->nlink--;
666 /* NB: Caller must set inode nlink if appropriate */
670 jffs2_complete_reservation(c);
676 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)
678 struct jffs2_raw_dirent *rd;
679 struct jffs2_full_dirent *fd;
680 uint32_t alloclen, phys_ofs;
683 rd = jffs2_alloc_raw_dirent();
687 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, ALLOC_NORMAL);
689 jffs2_free_raw_dirent(rd);
695 /* Build a deletion node */
696 rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
697 rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
698 rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
699 rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
701 rd->pino = cpu_to_je32(dir_f->inocache->ino);
702 rd->version = cpu_to_je32(++dir_f->highest_version);
703 rd->ino = cpu_to_je32(ino);
704 rd->mctime = cpu_to_je32(get_seconds());
709 rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
710 rd->name_crc = cpu_to_je32(crc32(0, name, namelen));
712 fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, phys_ofs, ALLOC_NORMAL);
714 jffs2_free_raw_dirent(rd);
717 jffs2_complete_reservation(c);
722 /* File it. This will mark the old one obsolete. */
723 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
725 jffs2_complete_reservation(c);