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