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