Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

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