[PARISC] Update bitops from parisc tree
[linux-2.6.22.y-op.git] / fs / jffs2 / write.c
blob69100615d9aef17535f808ed6e5e805b404f6eb2
1 /*
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>
15 #include <linux/fs.h>
16 #include <linux/crc32.h>
17 #include <linux/slab.h>
18 #include <linux/pagemap.h>
19 #include <linux/mtd/mtd.h>
20 #include "nodelist.h"
21 #include "compr.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();
29 if (!ic) {
30 return -ENOMEM;
33 memset(ic, 0, sizeof(*ic));
35 f->inocache = 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);
54 return 0;
57 #if CONFIG_JFFS2_FS_DEBUG > 0
58 static void writecheck(struct jffs2_sb_info *c, uint32_t ofs)
60 unsigned char buf[16];
61 size_t retlen;
62 int ret, i;
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));
67 return;
69 ret = 0;
70 for (i=0; i<16; i++) {
71 if (buf[i] != 0xff)
72 ret = 1;
74 if (ret) {
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",
77 ofs,
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]);
82 #endif
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;
93 size_t retlen;
94 struct kvec vecs[2];
95 int ret;
96 int retried = 0;
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");
101 BUG();
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();
115 if (!raw)
116 return ERR_PTR(-ENOMEM);
118 fn = jffs2_alloc_full_dnode();
119 if (!fn) {
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);
126 fn->frags = 0;
128 /* check number of valid vecs */
129 if (!datalen || !data)
130 cnt = 1;
131 retry:
132 fn->raw = raw;
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)) {
139 BUG_ON(!retried);
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 */
155 if (retlen) {
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
163 this node */
164 raw->flash_offset |= REF_OBSOLETE;
165 jffs2_add_physical_node_ref(c, raw);
166 jffs2_mark_node_obsolete(c, raw);
167 } else {
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 */
173 uint32_t dummy;
174 struct jffs2_eraseblock *jeb = &c->blocks[flash_ofs / c->sector_size];
176 retried = 1;
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);
185 } else {
186 /* Locking pain */
187 up(&f->sem);
188 jffs2_complete_reservation(c);
190 ret = jffs2_reserve_space(c, sizeof(*ri) + datalen, &flash_ofs, &dummy, alloc_mode);
191 down(&f->sem);
194 if (!ret) {
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));
200 goto retry;
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;
218 } else {
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)));
234 if (retried) {
235 ACCT_SANITY_CHECK(c,NULL);
238 return fn;
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;
245 size_t retlen;
246 struct kvec vecs[2];
247 int retried = 0;
248 int ret;
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");
257 BUG();
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();
268 if (!raw)
269 return ERR_PTR(-ENOMEM);
271 fd = jffs2_alloc_full_dirent(namelen+1);
272 if (!fd) {
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));
280 fd->type = rd->type;
281 memcpy(fd->name, name, namelen);
282 fd->name[namelen]=0;
284 retry:
285 fd->raw = raw;
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)) {
292 BUG_ON(!retried);
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 */
307 if (retlen) {
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);
312 } else {
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 */
318 uint32_t dummy;
319 struct jffs2_eraseblock *jeb = &c->blocks[flash_ofs / c->sector_size];
321 retried = 1;
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);
330 } else {
331 /* Locking pain */
332 up(&f->sem);
333 jffs2_complete_reservation(c);
335 ret = jffs2_reserve_space(c, sizeof(*rd) + namelen, &flash_ofs, &dummy, alloc_mode);
336 down(&f->sem);
339 if (!ret) {
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));
343 goto retry;
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);
361 if (retried) {
362 ACCT_SANITY_CHECK(c,NULL);
365 return fd;
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)
375 int ret = 0;
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));
381 while(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;
387 int retried = 0;
389 retry:
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);
393 if (ret) {
394 D1(printk(KERN_DEBUG "jffs2_reserve_space returned %d\n", ret));
395 break;
397 down(&f->sem);
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);
423 if (IS_ERR(fn)) {
424 ret = PTR_ERR(fn);
425 up(&f->sem);
426 jffs2_complete_reservation(c);
427 if (!retried) {
428 /* Write error to be retried */
429 retried = 1;
430 D1(printk(KERN_DEBUG "Retrying node write in jffs2_write_inode_range()\n"));
431 goto retry;
433 break;
435 ret = jffs2_add_full_dnode_to_inode(c, f, fn);
436 if (f->metadata) {
437 jffs2_mark_node_obsolete(c, f->metadata->raw);
438 jffs2_free_full_dnode(f->metadata);
439 f->metadata = NULL;
441 if (ret) {
442 /* Eep */
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);
447 up(&f->sem);
448 jffs2_complete_reservation(c);
449 break;
451 up(&f->sem);
452 jffs2_complete_reservation(c);
453 if (!datalen) {
454 printk(KERN_WARNING "Eep. We didn't actually write any data in jffs2_write_inode_range()\n");
455 ret = -EIO;
456 break;
458 D1(printk(KERN_DEBUG "increasing writtenlen by %d\n", datalen));
459 writtenlen += datalen;
460 offset += datalen;
461 writelen -= datalen;
462 buf += datalen;
464 *retlen = writtenlen;
465 return ret;
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;
474 int ret;
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));
481 if (ret) {
482 up(&f->sem);
483 return ret;
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)));
494 if (IS_ERR(fn)) {
495 D1(printk(KERN_DEBUG "jffs2_write_dnode() failed\n"));
496 /* Eeek. Wave bye bye */
497 up(&f->sem);
498 jffs2_complete_reservation(c);
499 return PTR_ERR(fn);
501 /* No data here. Only a metadata node, which will be
502 obsoleted by the first data write
504 f->metadata = fn;
506 up(&f->sem);
507 jffs2_complete_reservation(c);
508 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, ALLOC_NORMAL);
510 if (ret) {
511 /* Eep. */
512 D1(printk(KERN_DEBUG "jffs2_reserve_space() for dirent failed\n"));
513 return ret;
516 rd = jffs2_alloc_raw_dirent();
517 if (!rd) {
518 /* Argh. Now we treat it like a normal delete */
519 jffs2_complete_reservation(c);
520 return -ENOMEM;
523 down(&dir_f->sem);
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 = ri->ino;
533 rd->mctime = ri->ctime;
534 rd->nsize = namelen;
535 rd->type = DT_REG;
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);
543 if (IS_ERR(fd)) {
544 /* dirent failed to write. Delete the inode normally
545 as if it were the final unlink() */
546 jffs2_complete_reservation(c);
547 up(&dir_f->sem);
548 return PTR_ERR(fd);
551 /* Link the fd into the inode's list, obsoleting an old
552 one if necessary. */
553 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
555 jffs2_complete_reservation(c);
556 up(&dir_f->sem);
558 return 0;
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;
568 int ret;
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();
575 if (!rd)
576 return -ENOMEM;
578 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, ALLOC_DELETION);
579 if (ret) {
580 jffs2_free_raw_dirent(rd);
581 return ret;
584 down(&dir_f->sem);
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());
596 rd->nsize = namelen;
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);
605 if (IS_ERR(fd)) {
606 jffs2_complete_reservation(c);
607 up(&dir_f->sem);
608 return PTR_ERR(fd);
611 /* File it. This will mark the old one obsolete. */
612 jffs2_add_fd_to_list(c, fd, &dir_f->dents);
613 up(&dir_f->sem);
614 } else {
615 struct jffs2_full_dirent **prev = &dir_f->dents;
616 uint32_t nhash = full_name_hash(name, namelen);
618 down(&dir_f->sem);
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)));
629 *prev = this->next;
630 jffs2_mark_node_obsolete(c, (this->raw));
631 jffs2_free_full_dirent(this);
632 break;
634 prev = &((*prev)->next);
636 up(&dir_f->sem);
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) {
644 down(&dead_f->sem);
646 if (S_ISDIR(OFNI_EDONI_2SFFJ(dead_f)->i_mode)) {
647 while (dead_f->dents) {
648 /* There can be only deleted ones */
649 fd = dead_f->dents;
651 dead_f->dents = fd->next;
653 if (fd->ino) {
654 printk(KERN_WARNING "Deleting inode #%u with active dentry \"%s\"->ino #%u\n",
655 dead_f->inocache->ino, fd->name, fd->ino);
656 } else {
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 */
667 up(&dead_f->sem);
670 jffs2_complete_reservation(c);
672 return 0;
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;
681 int ret;
683 rd = jffs2_alloc_raw_dirent();
684 if (!rd)
685 return -ENOMEM;
687 ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &phys_ofs, &alloclen, ALLOC_NORMAL);
688 if (ret) {
689 jffs2_free_raw_dirent(rd);
690 return ret;
693 down(&dir_f->sem);
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());
705 rd->nsize = namelen;
707 rd->type = type;
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);
716 if (IS_ERR(fd)) {
717 jffs2_complete_reservation(c);
718 up(&dir_f->sem);
719 return PTR_ERR(fd);
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);
726 up(&dir_f->sem);
728 return 0;