xref: /openbmc/linux/fs/jffs2/fs.c (revision 545e4006)
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/capability.h>
13 #include <linux/kernel.h>
14 #include <linux/sched.h>
15 #include <linux/fs.h>
16 #include <linux/list.h>
17 #include <linux/mtd/mtd.h>
18 #include <linux/pagemap.h>
19 #include <linux/slab.h>
20 #include <linux/vmalloc.h>
21 #include <linux/vfs.h>
22 #include <linux/crc32.h>
23 #include "nodelist.h"
24 
25 static int jffs2_flash_setup(struct jffs2_sb_info *c);
26 
27 int jffs2_do_setattr (struct inode *inode, struct iattr *iattr)
28 {
29 	struct jffs2_full_dnode *old_metadata, *new_metadata;
30 	struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
31 	struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
32 	struct jffs2_raw_inode *ri;
33 	union jffs2_device_node dev;
34 	unsigned char *mdata = NULL;
35 	int mdatalen = 0;
36 	unsigned int ivalid;
37 	uint32_t alloclen;
38 	int ret;
39 	int alloc_type = ALLOC_NORMAL;
40 
41 	D1(printk(KERN_DEBUG "jffs2_setattr(): ino #%lu\n", inode->i_ino));
42 
43 	/* Special cases - we don't want more than one data node
44 	   for these types on the medium at any time. So setattr
45 	   must read the original data associated with the node
46 	   (i.e. the device numbers or the target name) and write
47 	   it out again with the appropriate data attached */
48 	if (S_ISBLK(inode->i_mode) || S_ISCHR(inode->i_mode)) {
49 		/* For these, we don't actually need to read the old node */
50 		mdatalen = jffs2_encode_dev(&dev, inode->i_rdev);
51 		mdata = (char *)&dev;
52 		D1(printk(KERN_DEBUG "jffs2_setattr(): Writing %d bytes of kdev_t\n", mdatalen));
53 	} else if (S_ISLNK(inode->i_mode)) {
54 		mutex_lock(&f->sem);
55 		mdatalen = f->metadata->size;
56 		mdata = kmalloc(f->metadata->size, GFP_USER);
57 		if (!mdata) {
58 			mutex_unlock(&f->sem);
59 			return -ENOMEM;
60 		}
61 		ret = jffs2_read_dnode(c, f, f->metadata, mdata, 0, mdatalen);
62 		if (ret) {
63 			mutex_unlock(&f->sem);
64 			kfree(mdata);
65 			return ret;
66 		}
67 		mutex_unlock(&f->sem);
68 		D1(printk(KERN_DEBUG "jffs2_setattr(): Writing %d bytes of symlink target\n", mdatalen));
69 	}
70 
71 	ri = jffs2_alloc_raw_inode();
72 	if (!ri) {
73 		if (S_ISLNK(inode->i_mode))
74 			kfree(mdata);
75 		return -ENOMEM;
76 	}
77 
78 	ret = jffs2_reserve_space(c, sizeof(*ri) + mdatalen, &alloclen,
79 				  ALLOC_NORMAL, JFFS2_SUMMARY_INODE_SIZE);
80 	if (ret) {
81 		jffs2_free_raw_inode(ri);
82 		if (S_ISLNK(inode->i_mode & S_IFMT))
83 			 kfree(mdata);
84 		return ret;
85 	}
86 	mutex_lock(&f->sem);
87 	ivalid = iattr->ia_valid;
88 
89 	ri->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK);
90 	ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE);
91 	ri->totlen = cpu_to_je32(sizeof(*ri) + mdatalen);
92 	ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4));
93 
94 	ri->ino = cpu_to_je32(inode->i_ino);
95 	ri->version = cpu_to_je32(++f->highest_version);
96 
97 	ri->uid = cpu_to_je16((ivalid & ATTR_UID)?iattr->ia_uid:inode->i_uid);
98 	ri->gid = cpu_to_je16((ivalid & ATTR_GID)?iattr->ia_gid:inode->i_gid);
99 
100 	if (ivalid & ATTR_MODE)
101 		ri->mode = cpu_to_jemode(iattr->ia_mode);
102 	else
103 		ri->mode = cpu_to_jemode(inode->i_mode);
104 
105 
106 	ri->isize = cpu_to_je32((ivalid & ATTR_SIZE)?iattr->ia_size:inode->i_size);
107 	ri->atime = cpu_to_je32(I_SEC((ivalid & ATTR_ATIME)?iattr->ia_atime:inode->i_atime));
108 	ri->mtime = cpu_to_je32(I_SEC((ivalid & ATTR_MTIME)?iattr->ia_mtime:inode->i_mtime));
109 	ri->ctime = cpu_to_je32(I_SEC((ivalid & ATTR_CTIME)?iattr->ia_ctime:inode->i_ctime));
110 
111 	ri->offset = cpu_to_je32(0);
112 	ri->csize = ri->dsize = cpu_to_je32(mdatalen);
113 	ri->compr = JFFS2_COMPR_NONE;
114 	if (ivalid & ATTR_SIZE && inode->i_size < iattr->ia_size) {
115 		/* It's an extension. Make it a hole node */
116 		ri->compr = JFFS2_COMPR_ZERO;
117 		ri->dsize = cpu_to_je32(iattr->ia_size - inode->i_size);
118 		ri->offset = cpu_to_je32(inode->i_size);
119 	} else if (ivalid & ATTR_SIZE && !iattr->ia_size) {
120 		/* For truncate-to-zero, treat it as deletion because
121 		   it'll always be obsoleting all previous nodes */
122 		alloc_type = ALLOC_DELETION;
123 	}
124 	ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8));
125 	if (mdatalen)
126 		ri->data_crc = cpu_to_je32(crc32(0, mdata, mdatalen));
127 	else
128 		ri->data_crc = cpu_to_je32(0);
129 
130 	new_metadata = jffs2_write_dnode(c, f, ri, mdata, mdatalen, alloc_type);
131 	if (S_ISLNK(inode->i_mode))
132 		kfree(mdata);
133 
134 	if (IS_ERR(new_metadata)) {
135 		jffs2_complete_reservation(c);
136 		jffs2_free_raw_inode(ri);
137 		mutex_unlock(&f->sem);
138 		return PTR_ERR(new_metadata);
139 	}
140 	/* It worked. Update the inode */
141 	inode->i_atime = ITIME(je32_to_cpu(ri->atime));
142 	inode->i_ctime = ITIME(je32_to_cpu(ri->ctime));
143 	inode->i_mtime = ITIME(je32_to_cpu(ri->mtime));
144 	inode->i_mode = jemode_to_cpu(ri->mode);
145 	inode->i_uid = je16_to_cpu(ri->uid);
146 	inode->i_gid = je16_to_cpu(ri->gid);
147 
148 
149 	old_metadata = f->metadata;
150 
151 	if (ivalid & ATTR_SIZE && inode->i_size > iattr->ia_size)
152 		jffs2_truncate_fragtree (c, &f->fragtree, iattr->ia_size);
153 
154 	if (ivalid & ATTR_SIZE && inode->i_size < iattr->ia_size) {
155 		jffs2_add_full_dnode_to_inode(c, f, new_metadata);
156 		inode->i_size = iattr->ia_size;
157 		inode->i_blocks = (inode->i_size + 511) >> 9;
158 		f->metadata = NULL;
159 	} else {
160 		f->metadata = new_metadata;
161 	}
162 	if (old_metadata) {
163 		jffs2_mark_node_obsolete(c, old_metadata->raw);
164 		jffs2_free_full_dnode(old_metadata);
165 	}
166 	jffs2_free_raw_inode(ri);
167 
168 	mutex_unlock(&f->sem);
169 	jffs2_complete_reservation(c);
170 
171 	/* We have to do the vmtruncate() without f->sem held, since
172 	   some pages may be locked and waiting for it in readpage().
173 	   We are protected from a simultaneous write() extending i_size
174 	   back past iattr->ia_size, because do_truncate() holds the
175 	   generic inode semaphore. */
176 	if (ivalid & ATTR_SIZE && inode->i_size > iattr->ia_size) {
177 		vmtruncate(inode, iattr->ia_size);
178 		inode->i_blocks = (inode->i_size + 511) >> 9;
179 	}
180 
181 	return 0;
182 }
183 
184 int jffs2_setattr(struct dentry *dentry, struct iattr *iattr)
185 {
186 	int rc;
187 
188 	rc = inode_change_ok(dentry->d_inode, iattr);
189 	if (rc)
190 		return rc;
191 
192 	rc = jffs2_do_setattr(dentry->d_inode, iattr);
193 	if (!rc && (iattr->ia_valid & ATTR_MODE))
194 		rc = jffs2_acl_chmod(dentry->d_inode);
195 
196 	return rc;
197 }
198 
199 int jffs2_statfs(struct dentry *dentry, struct kstatfs *buf)
200 {
201 	struct jffs2_sb_info *c = JFFS2_SB_INFO(dentry->d_sb);
202 	unsigned long avail;
203 
204 	buf->f_type = JFFS2_SUPER_MAGIC;
205 	buf->f_bsize = 1 << PAGE_SHIFT;
206 	buf->f_blocks = c->flash_size >> PAGE_SHIFT;
207 	buf->f_files = 0;
208 	buf->f_ffree = 0;
209 	buf->f_namelen = JFFS2_MAX_NAME_LEN;
210 
211 	spin_lock(&c->erase_completion_lock);
212 	avail = c->dirty_size + c->free_size;
213 	if (avail > c->sector_size * c->resv_blocks_write)
214 		avail -= c->sector_size * c->resv_blocks_write;
215 	else
216 		avail = 0;
217 	spin_unlock(&c->erase_completion_lock);
218 
219 	buf->f_bavail = buf->f_bfree = avail >> PAGE_SHIFT;
220 
221 	return 0;
222 }
223 
224 
225 void jffs2_clear_inode (struct inode *inode)
226 {
227 	/* We can forget about this inode for now - drop all
228 	 *  the nodelists associated with it, etc.
229 	 */
230 	struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb);
231 	struct jffs2_inode_info *f = JFFS2_INODE_INFO(inode);
232 
233 	D1(printk(KERN_DEBUG "jffs2_clear_inode(): ino #%lu mode %o\n", inode->i_ino, inode->i_mode));
234 	jffs2_do_clear_inode(c, f);
235 }
236 
237 struct inode *jffs2_iget(struct super_block *sb, unsigned long ino)
238 {
239 	struct jffs2_inode_info *f;
240 	struct jffs2_sb_info *c;
241 	struct jffs2_raw_inode latest_node;
242 	union jffs2_device_node jdev;
243 	struct inode *inode;
244 	dev_t rdev = 0;
245 	int ret;
246 
247 	D1(printk(KERN_DEBUG "jffs2_iget(): ino == %lu\n", ino));
248 
249 	inode = iget_locked(sb, ino);
250 	if (!inode)
251 		return ERR_PTR(-ENOMEM);
252 	if (!(inode->i_state & I_NEW))
253 		return inode;
254 
255 	f = JFFS2_INODE_INFO(inode);
256 	c = JFFS2_SB_INFO(inode->i_sb);
257 
258 	jffs2_init_inode_info(f);
259 	mutex_lock(&f->sem);
260 
261 	ret = jffs2_do_read_inode(c, f, inode->i_ino, &latest_node);
262 
263 	if (ret) {
264 		mutex_unlock(&f->sem);
265 		iget_failed(inode);
266 		return ERR_PTR(ret);
267 	}
268 	inode->i_mode = jemode_to_cpu(latest_node.mode);
269 	inode->i_uid = je16_to_cpu(latest_node.uid);
270 	inode->i_gid = je16_to_cpu(latest_node.gid);
271 	inode->i_size = je32_to_cpu(latest_node.isize);
272 	inode->i_atime = ITIME(je32_to_cpu(latest_node.atime));
273 	inode->i_mtime = ITIME(je32_to_cpu(latest_node.mtime));
274 	inode->i_ctime = ITIME(je32_to_cpu(latest_node.ctime));
275 
276 	inode->i_nlink = f->inocache->pino_nlink;
277 
278 	inode->i_blocks = (inode->i_size + 511) >> 9;
279 
280 	switch (inode->i_mode & S_IFMT) {
281 
282 	case S_IFLNK:
283 		inode->i_op = &jffs2_symlink_inode_operations;
284 		break;
285 
286 	case S_IFDIR:
287 	{
288 		struct jffs2_full_dirent *fd;
289 		inode->i_nlink = 2; /* parent and '.' */
290 
291 		for (fd=f->dents; fd; fd = fd->next) {
292 			if (fd->type == DT_DIR && fd->ino)
293 				inc_nlink(inode);
294 		}
295 		/* Root dir gets i_nlink 3 for some reason */
296 		if (inode->i_ino == 1)
297 			inc_nlink(inode);
298 
299 		inode->i_op = &jffs2_dir_inode_operations;
300 		inode->i_fop = &jffs2_dir_operations;
301 		break;
302 	}
303 	case S_IFREG:
304 		inode->i_op = &jffs2_file_inode_operations;
305 		inode->i_fop = &jffs2_file_operations;
306 		inode->i_mapping->a_ops = &jffs2_file_address_operations;
307 		inode->i_mapping->nrpages = 0;
308 		break;
309 
310 	case S_IFBLK:
311 	case S_IFCHR:
312 		/* Read the device numbers from the media */
313 		if (f->metadata->size != sizeof(jdev.old) &&
314 		    f->metadata->size != sizeof(jdev.new)) {
315 			printk(KERN_NOTICE "Device node has strange size %d\n", f->metadata->size);
316 			goto error_io;
317 		}
318 		D1(printk(KERN_DEBUG "Reading device numbers from flash\n"));
319 		ret = jffs2_read_dnode(c, f, f->metadata, (char *)&jdev, 0, f->metadata->size);
320 		if (ret < 0) {
321 			/* Eep */
322 			printk(KERN_NOTICE "Read device numbers for inode %lu failed\n", (unsigned long)inode->i_ino);
323 			goto error;
324 		}
325 		if (f->metadata->size == sizeof(jdev.old))
326 			rdev = old_decode_dev(je16_to_cpu(jdev.old));
327 		else
328 			rdev = new_decode_dev(je32_to_cpu(jdev.new));
329 
330 	case S_IFSOCK:
331 	case S_IFIFO:
332 		inode->i_op = &jffs2_file_inode_operations;
333 		init_special_inode(inode, inode->i_mode, rdev);
334 		break;
335 
336 	default:
337 		printk(KERN_WARNING "jffs2_read_inode(): Bogus imode %o for ino %lu\n", inode->i_mode, (unsigned long)inode->i_ino);
338 	}
339 
340 	mutex_unlock(&f->sem);
341 
342 	D1(printk(KERN_DEBUG "jffs2_read_inode() returning\n"));
343 	unlock_new_inode(inode);
344 	return inode;
345 
346 error_io:
347 	ret = -EIO;
348 error:
349 	mutex_unlock(&f->sem);
350 	jffs2_do_clear_inode(c, f);
351 	iget_failed(inode);
352 	return ERR_PTR(ret);
353 }
354 
355 void jffs2_dirty_inode(struct inode *inode)
356 {
357 	struct iattr iattr;
358 
359 	if (!(inode->i_state & I_DIRTY_DATASYNC)) {
360 		D2(printk(KERN_DEBUG "jffs2_dirty_inode() not calling setattr() for ino #%lu\n", inode->i_ino));
361 		return;
362 	}
363 
364 	D1(printk(KERN_DEBUG "jffs2_dirty_inode() calling setattr() for ino #%lu\n", inode->i_ino));
365 
366 	iattr.ia_valid = ATTR_MODE|ATTR_UID|ATTR_GID|ATTR_ATIME|ATTR_MTIME|ATTR_CTIME;
367 	iattr.ia_mode = inode->i_mode;
368 	iattr.ia_uid = inode->i_uid;
369 	iattr.ia_gid = inode->i_gid;
370 	iattr.ia_atime = inode->i_atime;
371 	iattr.ia_mtime = inode->i_mtime;
372 	iattr.ia_ctime = inode->i_ctime;
373 
374 	jffs2_do_setattr(inode, &iattr);
375 }
376 
377 int jffs2_remount_fs (struct super_block *sb, int *flags, char *data)
378 {
379 	struct jffs2_sb_info *c = JFFS2_SB_INFO(sb);
380 
381 	if (c->flags & JFFS2_SB_FLAG_RO && !(sb->s_flags & MS_RDONLY))
382 		return -EROFS;
383 
384 	/* We stop if it was running, then restart if it needs to.
385 	   This also catches the case where it was stopped and this
386 	   is just a remount to restart it.
387 	   Flush the writebuffer, if neccecary, else we loose it */
388 	if (!(sb->s_flags & MS_RDONLY)) {
389 		jffs2_stop_garbage_collect_thread(c);
390 		mutex_lock(&c->alloc_sem);
391 		jffs2_flush_wbuf_pad(c);
392 		mutex_unlock(&c->alloc_sem);
393 	}
394 
395 	if (!(*flags & MS_RDONLY))
396 		jffs2_start_garbage_collect_thread(c);
397 
398 	*flags |= MS_NOATIME;
399 
400 	return 0;
401 }
402 
403 void jffs2_write_super (struct super_block *sb)
404 {
405 	struct jffs2_sb_info *c = JFFS2_SB_INFO(sb);
406 	sb->s_dirt = 0;
407 
408 	if (sb->s_flags & MS_RDONLY)
409 		return;
410 
411 	D1(printk(KERN_DEBUG "jffs2_write_super()\n"));
412 	jffs2_garbage_collect_trigger(c);
413 	jffs2_erase_pending_blocks(c, 0);
414 	jffs2_flush_wbuf_gc(c, 0);
415 }
416 
417 
418 /* jffs2_new_inode: allocate a new inode and inocache, add it to the hash,
419    fill in the raw_inode while you're at it. */
420 struct inode *jffs2_new_inode (struct inode *dir_i, int mode, struct jffs2_raw_inode *ri)
421 {
422 	struct inode *inode;
423 	struct super_block *sb = dir_i->i_sb;
424 	struct jffs2_sb_info *c;
425 	struct jffs2_inode_info *f;
426 	int ret;
427 
428 	D1(printk(KERN_DEBUG "jffs2_new_inode(): dir_i %ld, mode 0x%x\n", dir_i->i_ino, mode));
429 
430 	c = JFFS2_SB_INFO(sb);
431 
432 	inode = new_inode(sb);
433 
434 	if (!inode)
435 		return ERR_PTR(-ENOMEM);
436 
437 	f = JFFS2_INODE_INFO(inode);
438 	jffs2_init_inode_info(f);
439 	mutex_lock(&f->sem);
440 
441 	memset(ri, 0, sizeof(*ri));
442 	/* Set OS-specific defaults for new inodes */
443 	ri->uid = cpu_to_je16(current->fsuid);
444 
445 	if (dir_i->i_mode & S_ISGID) {
446 		ri->gid = cpu_to_je16(dir_i->i_gid);
447 		if (S_ISDIR(mode))
448 			mode |= S_ISGID;
449 	} else {
450 		ri->gid = cpu_to_je16(current->fsgid);
451 	}
452 
453 	/* POSIX ACLs have to be processed now, at least partly.
454 	   The umask is only applied if there's no default ACL */
455 	ret = jffs2_init_acl_pre(dir_i, inode, &mode);
456 	if (ret) {
457 	    make_bad_inode(inode);
458 	    iput(inode);
459 	    return ERR_PTR(ret);
460 	}
461 	ret = jffs2_do_new_inode (c, f, mode, ri);
462 	if (ret) {
463 		make_bad_inode(inode);
464 		iput(inode);
465 		return ERR_PTR(ret);
466 	}
467 	inode->i_nlink = 1;
468 	inode->i_ino = je32_to_cpu(ri->ino);
469 	inode->i_mode = jemode_to_cpu(ri->mode);
470 	inode->i_gid = je16_to_cpu(ri->gid);
471 	inode->i_uid = je16_to_cpu(ri->uid);
472 	inode->i_atime = inode->i_ctime = inode->i_mtime = CURRENT_TIME_SEC;
473 	ri->atime = ri->mtime = ri->ctime = cpu_to_je32(I_SEC(inode->i_mtime));
474 
475 	inode->i_blocks = 0;
476 	inode->i_size = 0;
477 
478 	insert_inode_hash(inode);
479 
480 	return inode;
481 }
482 
483 
484 int jffs2_do_fill_super(struct super_block *sb, void *data, int silent)
485 {
486 	struct jffs2_sb_info *c;
487 	struct inode *root_i;
488 	int ret;
489 	size_t blocks;
490 
491 	c = JFFS2_SB_INFO(sb);
492 
493 #ifndef CONFIG_JFFS2_FS_WRITEBUFFER
494 	if (c->mtd->type == MTD_NANDFLASH) {
495 		printk(KERN_ERR "jffs2: Cannot operate on NAND flash unless jffs2 NAND support is compiled in.\n");
496 		return -EINVAL;
497 	}
498 	if (c->mtd->type == MTD_DATAFLASH) {
499 		printk(KERN_ERR "jffs2: Cannot operate on DataFlash unless jffs2 DataFlash support is compiled in.\n");
500 		return -EINVAL;
501 	}
502 #endif
503 
504 	c->flash_size = c->mtd->size;
505 	c->sector_size = c->mtd->erasesize;
506 	blocks = c->flash_size / c->sector_size;
507 
508 	/*
509 	 * Size alignment check
510 	 */
511 	if ((c->sector_size * blocks) != c->flash_size) {
512 		c->flash_size = c->sector_size * blocks;
513 		printk(KERN_INFO "jffs2: Flash size not aligned to erasesize, reducing to %dKiB\n",
514 			c->flash_size / 1024);
515 	}
516 
517 	if (c->flash_size < 5*c->sector_size) {
518 		printk(KERN_ERR "jffs2: Too few erase blocks (%d)\n", c->flash_size / c->sector_size);
519 		return -EINVAL;
520 	}
521 
522 	c->cleanmarker_size = sizeof(struct jffs2_unknown_node);
523 
524 	/* NAND (or other bizarre) flash... do setup accordingly */
525 	ret = jffs2_flash_setup(c);
526 	if (ret)
527 		return ret;
528 
529 	c->inocache_list = kcalloc(INOCACHE_HASHSIZE, sizeof(struct jffs2_inode_cache *), GFP_KERNEL);
530 	if (!c->inocache_list) {
531 		ret = -ENOMEM;
532 		goto out_wbuf;
533 	}
534 
535 	jffs2_init_xattr_subsystem(c);
536 
537 	if ((ret = jffs2_do_mount_fs(c)))
538 		goto out_inohash;
539 
540 	D1(printk(KERN_DEBUG "jffs2_do_fill_super(): Getting root inode\n"));
541 	root_i = jffs2_iget(sb, 1);
542 	if (IS_ERR(root_i)) {
543 		D1(printk(KERN_WARNING "get root inode failed\n"));
544 		ret = PTR_ERR(root_i);
545 		goto out_root;
546 	}
547 
548 	ret = -ENOMEM;
549 
550 	D1(printk(KERN_DEBUG "jffs2_do_fill_super(): d_alloc_root()\n"));
551 	sb->s_root = d_alloc_root(root_i);
552 	if (!sb->s_root)
553 		goto out_root_i;
554 
555 	sb->s_maxbytes = 0xFFFFFFFF;
556 	sb->s_blocksize = PAGE_CACHE_SIZE;
557 	sb->s_blocksize_bits = PAGE_CACHE_SHIFT;
558 	sb->s_magic = JFFS2_SUPER_MAGIC;
559 	if (!(sb->s_flags & MS_RDONLY))
560 		jffs2_start_garbage_collect_thread(c);
561 	return 0;
562 
563  out_root_i:
564 	iput(root_i);
565 out_root:
566 	jffs2_free_ino_caches(c);
567 	jffs2_free_raw_node_refs(c);
568 	if (jffs2_blocks_use_vmalloc(c))
569 		vfree(c->blocks);
570 	else
571 		kfree(c->blocks);
572  out_inohash:
573 	jffs2_clear_xattr_subsystem(c);
574 	kfree(c->inocache_list);
575  out_wbuf:
576 	jffs2_flash_cleanup(c);
577 
578 	return ret;
579 }
580 
581 void jffs2_gc_release_inode(struct jffs2_sb_info *c,
582 				   struct jffs2_inode_info *f)
583 {
584 	iput(OFNI_EDONI_2SFFJ(f));
585 }
586 
587 struct jffs2_inode_info *jffs2_gc_fetch_inode(struct jffs2_sb_info *c,
588 					      int inum, int unlinked)
589 {
590 	struct inode *inode;
591 	struct jffs2_inode_cache *ic;
592 
593 	if (unlinked) {
594 		/* The inode has zero nlink but its nodes weren't yet marked
595 		   obsolete. This has to be because we're still waiting for
596 		   the final (close() and) iput() to happen.
597 
598 		   There's a possibility that the final iput() could have
599 		   happened while we were contemplating. In order to ensure
600 		   that we don't cause a new read_inode() (which would fail)
601 		   for the inode in question, we use ilookup() in this case
602 		   instead of iget().
603 
604 		   The nlink can't _become_ zero at this point because we're
605 		   holding the alloc_sem, and jffs2_do_unlink() would also
606 		   need that while decrementing nlink on any inode.
607 		*/
608 		inode = ilookup(OFNI_BS_2SFFJ(c), inum);
609 		if (!inode) {
610 			D1(printk(KERN_DEBUG "ilookup() failed for ino #%u; inode is probably deleted.\n",
611 				  inum));
612 
613 			spin_lock(&c->inocache_lock);
614 			ic = jffs2_get_ino_cache(c, inum);
615 			if (!ic) {
616 				D1(printk(KERN_DEBUG "Inode cache for ino #%u is gone.\n", inum));
617 				spin_unlock(&c->inocache_lock);
618 				return NULL;
619 			}
620 			if (ic->state != INO_STATE_CHECKEDABSENT) {
621 				/* Wait for progress. Don't just loop */
622 				D1(printk(KERN_DEBUG "Waiting for ino #%u in state %d\n",
623 					  ic->ino, ic->state));
624 				sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock);
625 			} else {
626 				spin_unlock(&c->inocache_lock);
627 			}
628 
629 			return NULL;
630 		}
631 	} else {
632 		/* Inode has links to it still; they're not going away because
633 		   jffs2_do_unlink() would need the alloc_sem and we have it.
634 		   Just iget() it, and if read_inode() is necessary that's OK.
635 		*/
636 		inode = jffs2_iget(OFNI_BS_2SFFJ(c), inum);
637 		if (IS_ERR(inode))
638 			return ERR_CAST(inode);
639 	}
640 	if (is_bad_inode(inode)) {
641 		printk(KERN_NOTICE "Eep. read_inode() failed for ino #%u. unlinked %d\n",
642 		       inum, unlinked);
643 		/* NB. This will happen again. We need to do something appropriate here. */
644 		iput(inode);
645 		return ERR_PTR(-EIO);
646 	}
647 
648 	return JFFS2_INODE_INFO(inode);
649 }
650 
651 unsigned char *jffs2_gc_fetch_page(struct jffs2_sb_info *c,
652 				   struct jffs2_inode_info *f,
653 				   unsigned long offset,
654 				   unsigned long *priv)
655 {
656 	struct inode *inode = OFNI_EDONI_2SFFJ(f);
657 	struct page *pg;
658 
659 	pg = read_cache_page_async(inode->i_mapping, offset >> PAGE_CACHE_SHIFT,
660 			     (void *)jffs2_do_readpage_unlock, inode);
661 	if (IS_ERR(pg))
662 		return (void *)pg;
663 
664 	*priv = (unsigned long)pg;
665 	return kmap(pg);
666 }
667 
668 void jffs2_gc_release_page(struct jffs2_sb_info *c,
669 			   unsigned char *ptr,
670 			   unsigned long *priv)
671 {
672 	struct page *pg = (void *)*priv;
673 
674 	kunmap(pg);
675 	page_cache_release(pg);
676 }
677 
678 static int jffs2_flash_setup(struct jffs2_sb_info *c) {
679 	int ret = 0;
680 
681 	if (jffs2_cleanmarker_oob(c)) {
682 		/* NAND flash... do setup accordingly */
683 		ret = jffs2_nand_flash_setup(c);
684 		if (ret)
685 			return ret;
686 	}
687 
688 	/* and Dataflash */
689 	if (jffs2_dataflash(c)) {
690 		ret = jffs2_dataflash_setup(c);
691 		if (ret)
692 			return ret;
693 	}
694 
695 	/* and Intel "Sibley" flash */
696 	if (jffs2_nor_wbuf_flash(c)) {
697 		ret = jffs2_nor_wbuf_flash_setup(c);
698 		if (ret)
699 			return ret;
700 	}
701 
702 	/* and an UBI volume */
703 	if (jffs2_ubivol(c)) {
704 		ret = jffs2_ubivol_setup(c);
705 		if (ret)
706 			return ret;
707 	}
708 
709 	return ret;
710 }
711 
712 void jffs2_flash_cleanup(struct jffs2_sb_info *c) {
713 
714 	if (jffs2_cleanmarker_oob(c)) {
715 		jffs2_nand_flash_cleanup(c);
716 	}
717 
718 	/* and DataFlash */
719 	if (jffs2_dataflash(c)) {
720 		jffs2_dataflash_cleanup(c);
721 	}
722 
723 	/* and Intel "Sibley" flash */
724 	if (jffs2_nor_wbuf_flash(c)) {
725 		jffs2_nor_wbuf_flash_cleanup(c);
726 	}
727 
728 	/* and an UBI volume */
729 	if (jffs2_ubivol(c)) {
730 		jffs2_ubivol_cleanup(c);
731 	}
732 }
733