xref: /openbmc/linux/fs/jffs2/write.c (revision a491486a)
1 /*
2  * JFFS2 -- Journalling Flash File System, Version 2.
3  *
4  * Copyright (C) 2001-2003 Red Hat, Inc.
5  *
6  * Created by David Woodhouse <dwmw2@infradead.org>
7  *
8  * For licensing information, see the file 'LICENCE' in this directory.
9  *
10  * $Id: write.c,v 1.97 2005/11/07 11:14:42 gleixner Exp $
11  *
12  */
13 
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"
22 
23 
24 int jffs2_do_new_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, uint32_t mode, struct jffs2_raw_inode *ri)
25 {
26 	struct jffs2_inode_cache *ic;
27 
28 	ic = jffs2_alloc_inode_cache();
29 	if (!ic) {
30 		return -ENOMEM;
31 	}
32 
33 	memset(ic, 0, sizeof(*ic));
34 
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;
39 
40 	jffs2_add_ino_cache(c, f->inocache);
41 	D1(printk(KERN_DEBUG "jffs2_do_new_inode(): Assigned ino# %d\n", f->inocache->ino));
42 	ri->ino = cpu_to_je32(f->inocache->ino);
43 
44 	ri->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
45 	ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
46 	ri->totlen = cpu_to_je32(PAD(sizeof(*ri)));
47 	ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
48 	ri->mode = cpu_to_jemode(mode);
49 
50 	f->highest_version = 1;
51 	ri->version = cpu_to_je32(f->highest_version);
52 
53 	return 0;
54 }
55 
56 /* jffs2_write_dnode - given a raw_inode, allocate a full_dnode for it,
57    write it to the flash, link it into the existing inode/fragment list */
58 
59 struct jffs2_full_dnode *jffs2_write_dnode(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
60 					   struct jffs2_raw_inode *ri, const unsigned char *data,
61 					   uint32_t datalen, int alloc_mode)
62 
63 {
64 	struct jffs2_full_dnode *fn;
65 	size_t retlen;
66 	uint32_t flash_ofs;
67 	struct kvec vecs[2];
68 	int ret;
69 	int retried = 0;
70 	unsigned long cnt = 2;
71 
72 	D1(if(je32_to_cpu(ri->hdr_crc) != crc32(0, ri, sizeof(struct jffs2_unknown_node)-4)) {
73 		printk(KERN_CRIT "Eep. CRC not correct in jffs2_write_dnode()\n");
74 		BUG();
75 	}
76 	   );
77 	vecs[0].iov_base = ri;
78 	vecs[0].iov_len = sizeof(*ri);
79 	vecs[1].iov_base = (unsigned char *)data;
80 	vecs[1].iov_len = datalen;
81 
82 	if (je32_to_cpu(ri->totlen) != sizeof(*ri) + datalen) {
83 		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 	}
85 
86 	fn = jffs2_alloc_full_dnode();
87 	if (!fn)
88 		return ERR_PTR(-ENOMEM);
89 
90 	/* check number of valid vecs */
91 	if (!datalen || !data)
92 		cnt = 1;
93  retry:
94 	flash_ofs = write_ofs(c);
95 
96 	jffs2_dbg_prewrite_paranoia_check(c, flash_ofs, vecs[0].iov_len + vecs[1].iov_len);
97 
98 	if ((alloc_mode!=ALLOC_GC) && (je32_to_cpu(ri->version) < f->highest_version)) {
99 		BUG_ON(!retried);
100 		D1(printk(KERN_DEBUG "jffs2_write_dnode : dnode_version %d, "
101 				"highest version %d -> updating dnode\n",
102 				je32_to_cpu(ri->version), f->highest_version));
103 		ri->version = cpu_to_je32(++f->highest_version);
104 		ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
105 	}
106 
107 	ret = jffs2_flash_writev(c, vecs, cnt, flash_ofs, &retlen,
108 				 (alloc_mode==ALLOC_GC)?0:f->inocache->ino);
109 
110 	if (ret || (retlen != sizeof(*ri) + datalen)) {
111 		printk(KERN_NOTICE "Write of %zd bytes at 0x%08x failed. returned %d, retlen %zd\n",
112 		       sizeof(*ri)+datalen, flash_ofs, ret, retlen);
113 
114 		/* Mark the space as dirtied */
115 		if (retlen) {
116 			/* Don't change raw->size to match retlen. We may have
117 			   written the node header already, and only the data will
118 			   seem corrupted, in which case the scan would skip over
119 			   any node we write before the original intended end of
120 			   this node */
121 			jffs2_add_physical_node_ref(c, flash_ofs | REF_OBSOLETE, PAD(sizeof(*ri)+datalen), NULL);
122 		} else {
123 			printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", flash_ofs);
124 		}
125 		if (!retried && alloc_mode != ALLOC_NORETRY) {
126 			/* Try to reallocate space and retry */
127 			uint32_t dummy;
128 			struct jffs2_eraseblock *jeb = &c->blocks[flash_ofs / c->sector_size];
129 
130 			retried = 1;
131 
132 			D1(printk(KERN_DEBUG "Retrying failed write.\n"));
133 
134 			jffs2_dbg_acct_sanity_check(c,jeb);
135 			jffs2_dbg_acct_paranoia_check(c, jeb);
136 
137 			if (alloc_mode == ALLOC_GC) {
138 				ret = jffs2_reserve_space_gc(c, sizeof(*ri) + datalen, &dummy,
139 							     JFFS2_SUMMARY_INODE_SIZE);
140 			} else {
141 				/* Locking pain */
142 				up(&f->sem);
143 				jffs2_complete_reservation(c);
144 
145 				ret = jffs2_reserve_space(c, sizeof(*ri) + datalen, &dummy,
146 							  alloc_mode, JFFS2_SUMMARY_INODE_SIZE);
147 				down(&f->sem);
148 			}
149 
150 			if (!ret) {
151 				flash_ofs = write_ofs(c);
152 				D1(printk(KERN_DEBUG "Allocated space at 0x%08x to retry failed write.\n", flash_ofs));
153 
154 				jffs2_dbg_acct_sanity_check(c,jeb);
155 				jffs2_dbg_acct_paranoia_check(c, jeb);
156 
157 				goto retry;
158 			}
159 			D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret));
160 		}
161 		/* Release the full_dnode which is now useless, and return */
162 		jffs2_free_full_dnode(fn);
163 		return ERR_PTR(ret?ret:-EIO);
164 	}
165 	/* Mark the space used */
166 	/* If node covers at least a whole page, or if it starts at the
167 	   beginning of a page and runs to the end of the file, or if
168 	   it's a hole node, mark it REF_PRISTINE, else REF_NORMAL.
169 	*/
170 	if ((je32_to_cpu(ri->dsize) >= PAGE_CACHE_SIZE) ||
171 	    ( ((je32_to_cpu(ri->offset)&(PAGE_CACHE_SIZE-1))==0) &&
172 	      (je32_to_cpu(ri->dsize)+je32_to_cpu(ri->offset) ==  je32_to_cpu(ri->isize)))) {
173 		flash_ofs |= REF_PRISTINE;
174 	} else {
175 		flash_ofs |= REF_NORMAL;
176 	}
177 	fn->raw = jffs2_add_physical_node_ref(c, flash_ofs, PAD(sizeof(*ri)+datalen), f->inocache);
178 	fn->ofs = je32_to_cpu(ri->offset);
179 	fn->size = je32_to_cpu(ri->dsize);
180 	fn->frags = 0;
181 
182 	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",
183 		  flash_ofs & ~3, flash_ofs & 3, je32_to_cpu(ri->dsize),
184 		  je32_to_cpu(ri->csize), je32_to_cpu(ri->node_crc),
185 		  je32_to_cpu(ri->data_crc), je32_to_cpu(ri->totlen)));
186 
187 	if (retried) {
188 		jffs2_dbg_acct_sanity_check(c,NULL);
189 	}
190 
191 	return fn;
192 }
193 
194 struct jffs2_full_dirent *jffs2_write_dirent(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
195 					     struct jffs2_raw_dirent *rd, const unsigned char *name,
196 					     uint32_t namelen, int alloc_mode)
197 {
198 	struct jffs2_full_dirent *fd;
199 	size_t retlen;
200 	struct kvec vecs[2];
201 	uint32_t flash_ofs;
202 	int retried = 0;
203 	int ret;
204 
205 	D1(printk(KERN_DEBUG "jffs2_write_dirent(ino #%u, name at *0x%p \"%s\"->ino #%u, name_crc 0x%08x)\n",
206 		  je32_to_cpu(rd->pino), name, name, je32_to_cpu(rd->ino),
207 		  je32_to_cpu(rd->name_crc)));
208 
209 	D1(if(je32_to_cpu(rd->hdr_crc) != crc32(0, rd, sizeof(struct jffs2_unknown_node)-4)) {
210 		printk(KERN_CRIT "Eep. CRC not correct in jffs2_write_dirent()\n");
211 		BUG();
212 	   });
213 
214 	vecs[0].iov_base = rd;
215 	vecs[0].iov_len = sizeof(*rd);
216 	vecs[1].iov_base = (unsigned char *)name;
217 	vecs[1].iov_len = namelen;
218 
219 	fd = jffs2_alloc_full_dirent(namelen+1);
220 	if (!fd)
221 		return ERR_PTR(-ENOMEM);
222 
223 	fd->version = je32_to_cpu(rd->version);
224 	fd->ino = je32_to_cpu(rd->ino);
225 	fd->nhash = full_name_hash(name, strlen(name));
226 	fd->type = rd->type;
227 	memcpy(fd->name, name, namelen);
228 	fd->name[namelen]=0;
229 
230  retry:
231 	flash_ofs = write_ofs(c);
232 
233 	jffs2_dbg_prewrite_paranoia_check(c, flash_ofs, vecs[0].iov_len + vecs[1].iov_len);
234 
235 	if ((alloc_mode!=ALLOC_GC) && (je32_to_cpu(rd->version) < f->highest_version)) {
236 		BUG_ON(!retried);
237 		D1(printk(KERN_DEBUG "jffs2_write_dirent : dirent_version %d, "
238 				     "highest version %d -> updating dirent\n",
239 				     je32_to_cpu(rd->version), f->highest_version));
240 		rd->version = cpu_to_je32(++f->highest_version);
241 		fd->version = je32_to_cpu(rd->version);
242 		rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
243 	}
244 
245 	ret = jffs2_flash_writev(c, vecs, 2, flash_ofs, &retlen,
246 				 (alloc_mode==ALLOC_GC)?0:je32_to_cpu(rd->pino));
247 	if (ret || (retlen != sizeof(*rd) + namelen)) {
248 		printk(KERN_NOTICE "Write of %zd bytes at 0x%08x failed. returned %d, retlen %zd\n",
249 			       sizeof(*rd)+namelen, flash_ofs, ret, retlen);
250 		/* Mark the space as dirtied */
251 		if (retlen) {
252 			jffs2_add_physical_node_ref(c, flash_ofs | REF_OBSOLETE, PAD(sizeof(*rd)+namelen), NULL);
253 		} else {
254 			printk(KERN_NOTICE "Not marking the space at 0x%08x as dirty because the flash driver returned retlen zero\n", flash_ofs);
255 		}
256 		if (!retried) {
257 			/* Try to reallocate space and retry */
258 			uint32_t dummy;
259 			struct jffs2_eraseblock *jeb = &c->blocks[flash_ofs / c->sector_size];
260 
261 			retried = 1;
262 
263 			D1(printk(KERN_DEBUG "Retrying failed write.\n"));
264 
265 			jffs2_dbg_acct_sanity_check(c,jeb);
266 			jffs2_dbg_acct_paranoia_check(c, jeb);
267 
268 			if (alloc_mode == ALLOC_GC) {
269 				ret = jffs2_reserve_space_gc(c, sizeof(*rd) + namelen, &dummy,
270 							     JFFS2_SUMMARY_DIRENT_SIZE(namelen));
271 			} else {
272 				/* Locking pain */
273 				up(&f->sem);
274 				jffs2_complete_reservation(c);
275 
276 				ret = jffs2_reserve_space(c, sizeof(*rd) + namelen, &dummy,
277 							  alloc_mode, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
278 				down(&f->sem);
279 			}
280 
281 			if (!ret) {
282 				flash_ofs = write_ofs(c);
283 				D1(printk(KERN_DEBUG "Allocated space at 0x%08x to retry failed write.\n", flash_ofs));
284 				jffs2_dbg_acct_sanity_check(c,jeb);
285 				jffs2_dbg_acct_paranoia_check(c, jeb);
286 				goto retry;
287 			}
288 			D1(printk(KERN_DEBUG "Failed to allocate space to retry failed write: %d!\n", ret));
289 		}
290 		/* Release the full_dnode which is now useless, and return */
291 		jffs2_free_full_dirent(fd);
292 		return ERR_PTR(ret?ret:-EIO);
293 	}
294 	/* Mark the space used */
295 	fd->raw = jffs2_add_physical_node_ref(c, flash_ofs | REF_PRISTINE, PAD(sizeof(*rd)+namelen), f->inocache);
296 
297 	if (retried) {
298 		jffs2_dbg_acct_sanity_check(c,NULL);
299 	}
300 
301 	return fd;
302 }
303 
304 /* The OS-specific code fills in the metadata in the jffs2_raw_inode for us, so that
305    we don't have to go digging in struct inode or its equivalent. It should set:
306    mode, uid, gid, (starting)isize, atime, ctime, mtime */
307 int jffs2_write_inode_range(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
308 			    struct jffs2_raw_inode *ri, unsigned char *buf,
309 			    uint32_t offset, uint32_t writelen, uint32_t *retlen)
310 {
311 	int ret = 0;
312 	uint32_t writtenlen = 0;
313 
314        	D1(printk(KERN_DEBUG "jffs2_write_inode_range(): Ino #%u, ofs 0x%x, len 0x%x\n",
315 		  f->inocache->ino, offset, writelen));
316 
317 	while(writelen) {
318 		struct jffs2_full_dnode *fn;
319 		unsigned char *comprbuf = NULL;
320 		uint16_t comprtype = JFFS2_COMPR_NONE;
321 		uint32_t alloclen;
322 		uint32_t datalen, cdatalen;
323 		int retried = 0;
324 
325 	retry:
326 		D2(printk(KERN_DEBUG "jffs2_commit_write() loop: 0x%x to write to 0x%x\n", writelen, offset));
327 
328 		ret = jffs2_reserve_space(c, sizeof(*ri) + JFFS2_MIN_DATA_LEN,
329 					&alloclen, ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
330 		if (ret) {
331 			D1(printk(KERN_DEBUG "jffs2_reserve_space returned %d\n", ret));
332 			break;
333 		}
334 		down(&f->sem);
335 		datalen = min_t(uint32_t, writelen, PAGE_CACHE_SIZE - (offset & (PAGE_CACHE_SIZE-1)));
336 		cdatalen = min_t(uint32_t, alloclen - sizeof(*ri), datalen);
337 
338 		comprtype = jffs2_compress(c, f, buf, &comprbuf, &datalen, &cdatalen);
339 
340 		ri->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
341 		ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
342 		ri->totlen = cpu_to_je32(sizeof(*ri) + cdatalen);
343 		ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
344 
345 		ri->ino = cpu_to_je32(f->inocache->ino);
346 		ri->version = cpu_to_je32(++f->highest_version);
347 		ri->isize = cpu_to_je32(max(je32_to_cpu(ri->isize), offset + datalen));
348 		ri->offset = cpu_to_je32(offset);
349 		ri->csize = cpu_to_je32(cdatalen);
350 		ri->dsize = cpu_to_je32(datalen);
351 		ri->compr = comprtype & 0xff;
352 		ri->usercompr = (comprtype >> 8 ) & 0xff;
353 		ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
354 		ri->data_crc = cpu_to_je32(crc32(0, comprbuf, cdatalen));
355 
356 		fn = jffs2_write_dnode(c, f, ri, comprbuf, cdatalen, ALLOC_NORETRY);
357 
358 		jffs2_free_comprbuf(comprbuf, buf);
359 
360 		if (IS_ERR(fn)) {
361 			ret = PTR_ERR(fn);
362 			up(&f->sem);
363 			jffs2_complete_reservation(c);
364 			if (!retried) {
365 				/* Write error to be retried */
366 				retried = 1;
367 				D1(printk(KERN_DEBUG "Retrying node write in jffs2_write_inode_range()\n"));
368 				goto retry;
369 			}
370 			break;
371 		}
372 		ret = jffs2_add_full_dnode_to_inode(c, f, fn);
373 		if (f->metadata) {
374 			jffs2_mark_node_obsolete(c, f->metadata->raw);
375 			jffs2_free_full_dnode(f->metadata);
376 			f->metadata = NULL;
377 		}
378 		if (ret) {
379 			/* Eep */
380 			D1(printk(KERN_DEBUG "Eep. add_full_dnode_to_inode() failed in commit_write, returned %d\n", ret));
381 			jffs2_mark_node_obsolete(c, fn->raw);
382 			jffs2_free_full_dnode(fn);
383 
384 			up(&f->sem);
385 			jffs2_complete_reservation(c);
386 			break;
387 		}
388 		up(&f->sem);
389 		jffs2_complete_reservation(c);
390 		if (!datalen) {
391 			printk(KERN_WARNING "Eep. We didn't actually write any data in jffs2_write_inode_range()\n");
392 			ret = -EIO;
393 			break;
394 		}
395 		D1(printk(KERN_DEBUG "increasing writtenlen by %d\n", datalen));
396 		writtenlen += datalen;
397 		offset += datalen;
398 		writelen -= datalen;
399 		buf += datalen;
400 	}
401 	*retlen = writtenlen;
402 	return ret;
403 }
404 
405 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)
406 {
407 	struct jffs2_raw_dirent *rd;
408 	struct jffs2_full_dnode *fn;
409 	struct jffs2_full_dirent *fd;
410 	uint32_t alloclen;
411 	int ret;
412 
413 	/* Try to reserve enough space for both node and dirent.
414 	 * Just the node will do for now, though
415 	 */
416 	ret = jffs2_reserve_space(c, sizeof(*ri), &alloclen, ALLOC_NORMAL,
417 				JFFS2_SUMMARY_INODE_SIZE);
418 	D1(printk(KERN_DEBUG "jffs2_do_create(): reserved 0x%x bytes\n", alloclen));
419 	if (ret) {
420 		up(&f->sem);
421 		return ret;
422 	}
423 
424 	ri->data_crc = cpu_to_je32(0);
425 	ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
426 
427 	fn = jffs2_write_dnode(c, f, ri, NULL, 0, ALLOC_NORMAL);
428 
429 	D1(printk(KERN_DEBUG "jffs2_do_create created file with mode 0x%x\n",
430 		  jemode_to_cpu(ri->mode)));
431 
432 	if (IS_ERR(fn)) {
433 		D1(printk(KERN_DEBUG "jffs2_write_dnode() failed\n"));
434 		/* Eeek. Wave bye bye */
435 		up(&f->sem);
436 		jffs2_complete_reservation(c);
437 		return PTR_ERR(fn);
438 	}
439 	/* No data here. Only a metadata node, which will be
440 	   obsoleted by the first data write
441 	*/
442 	f->metadata = fn;
443 
444 	up(&f->sem);
445 	jffs2_complete_reservation(c);
446 	ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
447 				ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
448 
449 	if (ret) {
450 		/* Eep. */
451 		D1(printk(KERN_DEBUG "jffs2_reserve_space() for dirent failed\n"));
452 		return ret;
453 	}
454 
455 	rd = jffs2_alloc_raw_dirent();
456 	if (!rd) {
457 		/* Argh. Now we treat it like a normal delete */
458 		jffs2_complete_reservation(c);
459 		return -ENOMEM;
460 	}
461 
462 	down(&dir_f->sem);
463 
464 	rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
465 	rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
466 	rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
467 	rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
468 
469 	rd->pino = cpu_to_je32(dir_f->inocache->ino);
470 	rd->version = cpu_to_je32(++dir_f->highest_version);
471 	rd->ino = ri->ino;
472 	rd->mctime = ri->ctime;
473 	rd->nsize = namelen;
474 	rd->type = DT_REG;
475 	rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
476 	rd->name_crc = cpu_to_je32(crc32(0, name, namelen));
477 
478 	fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, ALLOC_NORMAL);
479 
480 	jffs2_free_raw_dirent(rd);
481 
482 	if (IS_ERR(fd)) {
483 		/* dirent failed to write. Delete the inode normally
484 		   as if it were the final unlink() */
485 		jffs2_complete_reservation(c);
486 		up(&dir_f->sem);
487 		return PTR_ERR(fd);
488 	}
489 
490 	/* Link the fd into the inode's list, obsoleting an old
491 	   one if necessary. */
492 	jffs2_add_fd_to_list(c, fd, &dir_f->dents);
493 
494 	jffs2_complete_reservation(c);
495 	up(&dir_f->sem);
496 
497 	return 0;
498 }
499 
500 
501 int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f,
502 		    const char *name, int namelen, struct jffs2_inode_info *dead_f,
503 		    uint32_t time)
504 {
505 	struct jffs2_raw_dirent *rd;
506 	struct jffs2_full_dirent *fd;
507 	uint32_t alloclen;
508 	int ret;
509 
510 	if (!jffs2_can_mark_obsolete(c)) {
511 		/* We can't mark stuff obsolete on the medium. We need to write a deletion dirent */
512 
513 		rd = jffs2_alloc_raw_dirent();
514 		if (!rd)
515 			return -ENOMEM;
516 
517 		ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
518 					ALLOC_DELETION, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
519 		if (ret) {
520 			jffs2_free_raw_dirent(rd);
521 			return ret;
522 		}
523 
524 		down(&dir_f->sem);
525 
526 		/* Build a deletion node */
527 		rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
528 		rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
529 		rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
530 		rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
531 
532 		rd->pino = cpu_to_je32(dir_f->inocache->ino);
533 		rd->version = cpu_to_je32(++dir_f->highest_version);
534 		rd->ino = cpu_to_je32(0);
535 		rd->mctime = cpu_to_je32(time);
536 		rd->nsize = namelen;
537 		rd->type = DT_UNKNOWN;
538 		rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
539 		rd->name_crc = cpu_to_je32(crc32(0, name, namelen));
540 
541 		fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, ALLOC_DELETION);
542 
543 		jffs2_free_raw_dirent(rd);
544 
545 		if (IS_ERR(fd)) {
546 			jffs2_complete_reservation(c);
547 			up(&dir_f->sem);
548 			return PTR_ERR(fd);
549 		}
550 
551 		/* File it. This will mark the old one obsolete. */
552 		jffs2_add_fd_to_list(c, fd, &dir_f->dents);
553 		up(&dir_f->sem);
554 	} else {
555 		struct jffs2_full_dirent **prev = &dir_f->dents;
556 		uint32_t nhash = full_name_hash(name, namelen);
557 
558 		down(&dir_f->sem);
559 
560 		while ((*prev) && (*prev)->nhash <= nhash) {
561 			if ((*prev)->nhash == nhash &&
562 			    !memcmp((*prev)->name, name, namelen) &&
563 			    !(*prev)->name[namelen]) {
564 				struct jffs2_full_dirent *this = *prev;
565 
566 				D1(printk(KERN_DEBUG "Marking old dirent node (ino #%u) @%08x obsolete\n",
567 					  this->ino, ref_offset(this->raw)));
568 
569 				*prev = this->next;
570 				jffs2_mark_node_obsolete(c, (this->raw));
571 				jffs2_free_full_dirent(this);
572 				break;
573 			}
574 			prev = &((*prev)->next);
575 		}
576 		up(&dir_f->sem);
577 	}
578 
579 	/* dead_f is NULL if this was a rename not a real unlink */
580 	/* Also catch the !f->inocache case, where there was a dirent
581 	   pointing to an inode which didn't exist. */
582 	if (dead_f && dead_f->inocache) {
583 
584 		down(&dead_f->sem);
585 
586 		if (S_ISDIR(OFNI_EDONI_2SFFJ(dead_f)->i_mode)) {
587 			while (dead_f->dents) {
588 				/* There can be only deleted ones */
589 				fd = dead_f->dents;
590 
591 				dead_f->dents = fd->next;
592 
593 				if (fd->ino) {
594 					printk(KERN_WARNING "Deleting inode #%u with active dentry \"%s\"->ino #%u\n",
595 					       dead_f->inocache->ino, fd->name, fd->ino);
596 				} else {
597 					D1(printk(KERN_DEBUG "Removing deletion dirent for \"%s\" from dir ino #%u\n",
598 						fd->name, dead_f->inocache->ino));
599 				}
600 				jffs2_mark_node_obsolete(c, fd->raw);
601 				jffs2_free_full_dirent(fd);
602 			}
603 		}
604 
605 		dead_f->inocache->nlink--;
606 		/* NB: Caller must set inode nlink if appropriate */
607 		up(&dead_f->sem);
608 	}
609 
610 	jffs2_complete_reservation(c);
611 
612 	return 0;
613 }
614 
615 
616 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)
617 {
618 	struct jffs2_raw_dirent *rd;
619 	struct jffs2_full_dirent *fd;
620 	uint32_t alloclen;
621 	int ret;
622 
623 	rd = jffs2_alloc_raw_dirent();
624 	if (!rd)
625 		return -ENOMEM;
626 
627 	ret = jffs2_reserve_space(c, sizeof(*rd)+namelen, &alloclen,
628 				ALLOC_NORMAL, JFFS2_SUMMARY_DIRENT_SIZE(namelen));
629 	if (ret) {
630 		jffs2_free_raw_dirent(rd);
631 		return ret;
632 	}
633 
634 	down(&dir_f->sem);
635 
636 	/* Build a deletion node */
637 	rd->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
638 	rd->nodetype = cpu_to_je16(JFFS2_NODETYPE_DIRENT);
639 	rd->totlen = cpu_to_je32(sizeof(*rd) + namelen);
640 	rd->hdr_crc = cpu_to_je32(crc32(0, rd, sizeof(struct jffs2_unknown_node)-4));
641 
642 	rd->pino = cpu_to_je32(dir_f->inocache->ino);
643 	rd->version = cpu_to_je32(++dir_f->highest_version);
644 	rd->ino = cpu_to_je32(ino);
645 	rd->mctime = cpu_to_je32(time);
646 	rd->nsize = namelen;
647 
648 	rd->type = type;
649 
650 	rd->node_crc = cpu_to_je32(crc32(0, rd, sizeof(*rd)-8));
651 	rd->name_crc = cpu_to_je32(crc32(0, name, namelen));
652 
653 	fd = jffs2_write_dirent(c, dir_f, rd, name, namelen, ALLOC_NORMAL);
654 
655 	jffs2_free_raw_dirent(rd);
656 
657 	if (IS_ERR(fd)) {
658 		jffs2_complete_reservation(c);
659 		up(&dir_f->sem);
660 		return PTR_ERR(fd);
661 	}
662 
663 	/* File it. This will mark the old one obsolete. */
664 	jffs2_add_fd_to_list(c, fd, &dir_f->dents);
665 
666 	jffs2_complete_reservation(c);
667 	up(&dir_f->sem);
668 
669 	return 0;
670 }
671