Lines Matching +full:0 +full:- +full:latest

2  * JFFS2 -- Journalling Flash File System, Version 2.
4 * Copyright (C) 2001-2003 Free Software Foundation, Inc.
11 * $Id: fs-ecos.c,v 1.44 2005/07/24 15:29:57 dedekind Exp $
25 //--------------------------------------------
39 //--------------------------------------------
97 // -------------------------------------------------------------------------
104 FSTAB_ENTRY(jffs2_fste, "jffs2", 0,
117 FSTAB_ENTRY(jffs2_fste, "jffs2", 0,
131 // -------------------------------------------------------------------------
152 // -------------------------------------------------------------------------
155 // point to error-returning stub functions. Only the read, lseek and
175 static unsigned char n_fs_mounted = 0; // a counter to track the number of jffs2 instances mounted
207 next = this->i_cache_next; in icache_evict()
208 if (this != i && this->i_count == 0) { in icache_evict()
209 struct _inode *parent = this->i_parent; in icache_evict()
210 if (this->i_cache_next) in icache_evict()
211 this->i_cache_next->i_cache_prev = this->i_cache_prev; in icache_evict()
212 if (this->i_cache_prev) in icache_evict()
213 this->i_cache_prev->i_cache_next = this->i_cache_next; in icache_evict()
215 memset(this, 0x5a, sizeof(*this)); in icache_evict()
218 parent->i_count--; in icache_evict()
230 // -------------------------------------------------------------------------
240 dir->i_count++; in init_dirsearch()
241 ds->dir = dir; in init_dirsearch()
242 ds->path = name; in init_dirsearch()
243 ds->node = dir; in init_dirsearch()
244 ds->name = name; in init_dirsearch()
245 ds->namelen = 0; in init_dirsearch()
246 ds->last = false; in init_dirsearch()
249 // -------------------------------------------------------------------------
256 struct _inode *dir = ds->dir; in find_entry()
257 const unsigned char *name = ds->path; in find_entry()
259 char namelen = 0; in find_entry()
265 if (!S_ISDIR(dir->i_mode)) in find_entry()
269 while (*n != '\0' && *n != '/') in find_entry()
274 if (*n == '\0') in find_entry()
275 ds->last = true; in find_entry()
278 ds->name = name; in find_entry()
279 ds->namelen = namelen; in find_entry()
281 if (name[0] == '.') in find_entry()
292 ds->dir = ds->node; in find_entry()
293 ds->node = ds->dir->i_parent; in find_entry()
294 ds->node->i_count++; in find_entry()
299 ds->node = ds->dir; in find_entry()
300 ds->dir->i_count++; in find_entry()
307 D2(printf("find_entry for name = %s\n", ds->path)); in find_entry()
314 return -PTR_ERR(d); in find_entry()
317 if (S_ISDIR(d->i_mode) && !d->i_parent) { in find_entry()
318 d->i_parent = dir; in find_entry()
319 dir->i_count++; in find_entry()
323 ds->node = d; in find_entry()
328 // -------------------------------------------------------------------------
339 D2(printf("jffs2_find for path =%s\n", d->path)); in jffs2_find()
342 if (*(d->path) == '\0') { in jffs2_find()
343 d->node->i_count++; in jffs2_find()
355 if (d->last) in jffs2_find()
360 jffs2_iput(d->dir); in jffs2_find()
363 d->dir = d->node; in jffs2_find()
364 d->path += d->namelen; in jffs2_find()
365 while (*(d->path) == '/') in jffs2_find()
366 d->path++; // skip dirname separators in jffs2_find()
379 switch (info->name) { in jffs2_pathconf()
381 info->value = LINK_MAX; in jffs2_pathconf()
385 info->value = -1; // not supported in jffs2_pathconf()
390 info->value = -1; // not supported in jffs2_pathconf()
395 info->value = JFFS2_NAME_MAX; in jffs2_pathconf()
399 info->value = JFFS2_PATH_MAX; in jffs2_pathconf()
403 info->value = -1; // not supported in jffs2_pathconf()
408 info->value = -1; // not supported in jffs2_pathconf()
413 info->value = -1; // not supported in jffs2_pathconf()
418 info->value = 0; in jffs2_pathconf()
422 info->value = 0; in jffs2_pathconf()
426 info->value = 0; in jffs2_pathconf()
430 info->value = -1; // not supported in jffs2_pathconf()
444 // -------------------------------------------------------------------------
455 device = RT_MTD_NOR_DEVICE(sb->s_dev); in jffs2_read_super()
458 init_MUTEX(&c->alloc_sem); in jffs2_read_super()
459 init_MUTEX(&c->erase_free_sem); in jffs2_read_super()
462 c->sector_size = device->block_size; in jffs2_read_super()
463 c->flash_size = (device->block_end - device->block_start) * device->block_size; in jffs2_read_super()
464 c->cleanmarker_size = sizeof(struct jffs2_unknown_node); in jffs2_read_super()
467 if (err) return -err; in jffs2_read_super()
470 sb->s_root = jffs2_iget(sb, 1); in jffs2_read_super()
471 if (IS_ERR(sb->s_root)) { in jffs2_read_super()
473 err = PTR_ERR(sb->s_root); in jffs2_read_super()
474 sb->s_root = NULL; in jffs2_read_super()
477 return 0; in jffs2_read_super()
482 rt_free(c->blocks); in jffs2_read_super()
499 // err = cyg_io_lookup(mte->devname, &t); in jffs2_mount()
501 // return -err; in jffs2_mount()
504 // // FIXME: this should be done better - perhaps if the superblock in jffs2_mount()
506 // for (m = &cyg_mtab[0]; m != &cyg_mtab_end; m++) { in jffs2_mount()
508 // if (m - &cyg_mtab[0] >= CYGNUM_FILEIO_MTAB_MAX) { in jffs2_mount()
512 // if (m->valid && strcmp(m->fsname, "jffs2") == 0 && in jffs2_mount()
513 // strcmp(m->devname, mte->devname) == 0) { in jffs2_mount()
514 // jffs2_sb = (struct super_block *) m->data; in jffs2_mount()
518 t = (cyg_io_handle_t)mte->data; //get from dfs_jffs2; in jffs2_mount()
526 memset(jffs2_sb, 0, sizeof (struct super_block)); in jffs2_mount()
527 jffs2_sb->s_dev = t; in jffs2_mount()
529 c->inocache_list = rt_malloc(sizeof(struct jffs2_inode_cache *) * INOCACHE_HASHSIZE); in jffs2_mount()
530 if (!c->inocache_list) { in jffs2_mount()
534 memset(c->inocache_list, 0, sizeof(struct jffs2_inode_cache *) * INOCACHE_HASHSIZE); in jffs2_mount()
535 if (n_fs_mounted++ == 0) { in jffs2_mount()
543 if (--n_fs_mounted == 0) { in jffs2_mount()
549 rt_free(c->inocache_list); in jffs2_mount()
553 …jffs2_sb->s_root->i_parent = jffs2_sb->s_root; // points to itself, no dotdot paths above mountpoi… in jffs2_mount()
554 jffs2_sb->s_root->i_cache_prev = NULL; // root inode, so always null in jffs2_mount()
555 jffs2_sb->s_root->i_cache_next = NULL; in jffs2_mount()
556 jffs2_sb->s_root->i_count = 1; // Ensures the root inode is always in ram until umount in jffs2_mount()
561 jffs2_erase_pending_blocks(c,0); in jffs2_mount()
567 mte->data = (CYG_ADDRWORD) jffs2_sb; in jffs2_mount()
569 jffs2_sb->s_mount_count++; in jffs2_mount()
570 mte->root = (cyg_dir) jffs2_sb->s_root; in jffs2_mount()
571 D2(printf("jffs2_mounted superblock at %x\n", mte->root)); in jffs2_mount()
579 // -------------------------------------------------------------------------
585 struct _inode *root = (struct _inode *) mte->root; in jffs2_umount()
586 struct super_block *jffs2_sb = root->i_sb; in jffs2_umount()
593 if (jffs2_sb->s_mount_count == 1) { in jffs2_umount()
595 if (root->i_cache_next != NULL) { in jffs2_umount()
600 inode->i_ino, inode->i_count); in jffs2_umount()
601 inode = inode->i_cache_next; in jffs2_umount()
606 if (root->i_count == 2 && in jffs2_umount()
609 !strcmp(mte->name, "/")) { in jffs2_umount()
613 it -- if cwd is '/' we unset it. Perhaps in jffs2_umount()
623 if (root->i_count != 1) { in jffs2_umount()
625 root->i_count); in jffs2_umount()
634 for (fd = root->jffs2_i.dents; fd; fd = next) { in jffs2_umount()
635 next=fd->next; in jffs2_umount()
646 rt_free(c->blocks); in jffs2_umount()
647 rt_free(c->inocache_list); in jffs2_umount()
650 mte->root = CYG_DIR_NULL; in jffs2_umount()
651 mte->data = 0; in jffs2_umount()
652 mte->fs->data = 0; // fstab entry, visible to all mounts. No current mount in jffs2_umount()
656 jffs2_sb->s_mount_count--; in jffs2_umount()
658 if (--n_fs_mounted == 0) { in jffs2_umount()
665 // -------------------------------------------------------------------------
682 dir = mte->root; in jffs2_open()
703 if (err != 0) { in jffs2_open()
704 //Possible orphaned inode on the flash - but will be gc'd in jffs2_open()
706 return -err; in jffs2_open()
730 if (S_ISDIR(node->i_mode)) { in jffs2_open()
750 file->f_flag = mode & CYG_FILE_MODE_MASK; in jffs2_open()
751 file->f_type = CYG_FILE_TYPE_FILE; in jffs2_open()
752 file->f_ops = &jffs2_fileops; in jffs2_open()
753 file->f_offset = (mode & O_APPEND) ? node->i_size : 0; in jffs2_open()
754 file->f_data = (CYG_ADDRWORD) node; in jffs2_open()
755 file->f_xops = 0; in jffs2_open()
761 // -------------------------------------------------------------------------
783 if (S_ISDIR(ds.node->i_mode)) { in jffs2_ops_unlink()
795 return -err; in jffs2_ops_unlink()
798 // -------------------------------------------------------------------------
819 err = -jffs2_mkdir(ds.dir, ds.name, S_IRUGO|S_IXUGO|S_IWUSR); in jffs2_ops_mkdir()
835 // -------------------------------------------------------------------------
857 if (!S_ISDIR(ds.node->i_mode)) { in jffs2_ops_rmdir()
867 return -err; in jffs2_ops_rmdir()
870 // -------------------------------------------------------------------------
897 // Allow through renames to non-existent objects. in jffs2_ops_rename()
918 // Check that we are renaming like-for-like in jffs2_ops_rename()
920 if (!S_ISDIR(ds1.node->i_mode) && S_ISDIR(ds2.node->i_mode)) { in jffs2_ops_rename()
925 if (S_ISDIR(ds1.node->i_mode) && !S_ISDIR(ds2.node->i_mode)) { in jffs2_ops_rename()
932 err = -jffs2_unlink(ds2.dir, ds2.node, ds2.name); in jffs2_ops_rename()
934 if (err != 0) in jffs2_ops_rename()
942 err = -jffs2_rename(ds1.dir, ds1.node, ds1.name, ds2.dir, ds2.name); in jffs2_ops_rename()
946 ds1.dir->i_ctime = in jffs2_ops_rename()
947 ds1.dir->i_mtime = in jffs2_ops_rename()
948 ds2.dir->i_ctime = ds2.dir->i_mtime = jffs2_get_timestamp(); in jffs2_ops_rename()
951 if (S_ISDIR(ds1.node->i_mode)) { in jffs2_ops_rename()
955 jffs2_iput(ds1.node->i_parent); in jffs2_ops_rename()
956 ds1.node->i_parent = ds2.dir; in jffs2_ops_rename()
968 // -------------------------------------------------------------------------
1008 // Allow through links to non-existing terminal objects in jffs2_ops_link()
1026 if (err == 0) in jffs2_ops_link()
1027 ds1.node->i_ctime = in jffs2_ops_link()
1028 ds2.dir->i_ctime = ds2.dir->i_mtime = jffs2_get_timestamp(); in jffs2_ops_link()
1034 return -err; in jffs2_ops_link()
1037 // -------------------------------------------------------------------------
1060 if (!S_ISDIR(ds.node->i_mode)) { in jffs2_opendir()
1068 file->f_flag = 0; in jffs2_opendir()
1069 file->f_type = CYG_FILE_TYPE_FILE; in jffs2_opendir()
1070 file->f_ops = &jffs2_dirops; in jffs2_opendir()
1071 file->f_offset = 0; in jffs2_opendir()
1072 file->f_data = (CYG_ADDRWORD) ds.node; in jffs2_opendir()
1073 file->f_xops = 0; in jffs2_opendir()
1079 // -------------------------------------------------------------------------
1105 if (!S_ISDIR(ds.node->i_mode)) { in jffs2_chdir()
1126 // -------------------------------------------------------------------------
1148 buf->st_mode = ds.node->i_mode; in jffs2_stat()
1149 buf->st_ino = ds.node->i_ino; in jffs2_stat()
1150 buf->st_dev = 0; in jffs2_stat()
1151 buf->st_nlink = ds.node->i_nlink; in jffs2_stat()
1152 buf->st_uid = ds.node->i_uid; in jffs2_stat()
1153 buf->st_gid = ds.node->i_gid; in jffs2_stat()
1154 buf->st_size = ds.node->i_size; in jffs2_stat()
1155 buf->st_atime = ds.node->i_atime; in jffs2_stat()
1156 buf->st_mtime = ds.node->i_mtime; in jffs2_stat()
1157 buf->st_ctime = ds.node->i_ctime; in jffs2_stat()
1164 // -------------------------------------------------------------------------
1198 // -------------------------------------------------------------------------
1215 // -------------------------------------------------------------------------
1221 struct _inode *inode = (struct _inode *) fp->f_data; in jffs2_fo_read()
1223 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); in jffs2_fo_read()
1225 ssize_t resid = uio->uio_resid; in jffs2_fo_read()
1226 off_t pos = fp->f_offset; in jffs2_fo_read()
1228 down(&f->sem); in jffs2_fo_read()
1231 for (i = 0; i < uio->uio_iovcnt && pos < inode->i_size; i++) { in jffs2_fo_read()
1233 cyg_iovec *iov = &uio->uio_iov[i]; in jffs2_fo_read()
1234 off_t len = min(iov->iov_len, inode->i_size - pos); in jffs2_fo_read()
1236 D2(printf("jffs2_fo_read inode size %d\n", inode->i_size)); in jffs2_fo_read()
1240 (unsigned char *) iov->iov_base, pos, in jffs2_fo_read()
1246 uio->uio_resid = resid; in jffs2_fo_read()
1247 up(&f->sem); in jffs2_fo_read()
1248 return -ret; in jffs2_fo_read()
1250 resid -= len; in jffs2_fo_read()
1257 inode->i_atime = jffs2_get_timestamp(); in jffs2_fo_read()
1259 uio->uio_resid = resid; in jffs2_fo_read()
1260 fp->f_offset = pos; in jffs2_fo_read()
1262 up(&f->sem); in jffs2_fo_read()
1269 // -------------------------------------------------------------------------
1275 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); in jffs2_extend_file()
1279 int ret = 0; in jffs2_extend_file()
1282 D1(printk(KERN_DEBUG "Writing new hole frag 0x%x-0x%x between current EOF and new page\n", in jffs2_extend_file()
1283 (unsigned int)inode->i_size, offset)); in jffs2_extend_file()
1289 down(&f->sem); in jffs2_extend_file()
1291 ri->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); in jffs2_extend_file()
1292 ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE); in jffs2_extend_file()
1293 ri->totlen = cpu_to_je32(sizeof(*ri)); in jffs2_extend_file()
1294 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4)); in jffs2_extend_file()
1296 ri->version = cpu_to_je32(++f->highest_version); in jffs2_extend_file()
1297 ri->isize = cpu_to_je32(max((uint32_t)inode->i_size, offset)); in jffs2_extend_file()
1299 ri->offset = cpu_to_je32(inode->i_size); in jffs2_extend_file()
1300 ri->dsize = cpu_to_je32(offset - inode->i_size); in jffs2_extend_file()
1301 ri->csize = cpu_to_je32(0); in jffs2_extend_file()
1302 ri->compr = JFFS2_COMPR_ZERO; in jffs2_extend_file()
1303 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8)); in jffs2_extend_file()
1304 ri->data_crc = cpu_to_je32(0); in jffs2_extend_file()
1306 fn = jffs2_write_dnode(c, f, ri, NULL, 0, phys_ofs, ALLOC_NORMAL); in jffs2_extend_file()
1310 up(&f->sem); in jffs2_extend_file()
1314 if (f->metadata) { in jffs2_extend_file()
1315 jffs2_mark_node_obsolete(c, f->metadata->raw); in jffs2_extend_file()
1316 jffs2_free_full_dnode(f->metadata); in jffs2_extend_file()
1317 f->metadata = NULL; in jffs2_extend_file()
1321 jffs2_mark_node_obsolete(c, fn->raw); in jffs2_extend_file()
1323 up(&f->sem); in jffs2_extend_file()
1326 inode->i_size = offset; in jffs2_extend_file()
1327 up(&f->sem); in jffs2_extend_file()
1328 return 0; in jffs2_extend_file()
1336 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); in jffs2_truncate_file()
1352 down(&f->sem); in jffs2_truncate_file()
1353 ri->magic = cpu_to_je16(JFFS2_MAGIC_BITMASK); in jffs2_truncate_file()
1354 ri->nodetype = cpu_to_je16(JFFS2_NODETYPE_INODE); in jffs2_truncate_file()
1355 ri->totlen = cpu_to_je32(sizeof(*ri)); in jffs2_truncate_file()
1356 ri->hdr_crc = cpu_to_je32(crc32(0, ri, sizeof(struct jffs2_unknown_node)-4)); in jffs2_truncate_file()
1358 ri->ino = cpu_to_je32(inode->i_ino); in jffs2_truncate_file()
1359 ri->version = cpu_to_je32(++f->highest_version); in jffs2_truncate_file()
1361 ri->uid = cpu_to_je16(inode->i_uid); in jffs2_truncate_file()
1362 ri->gid = cpu_to_je16(inode->i_gid); in jffs2_truncate_file()
1363 ri->mode = cpu_to_jemode(inode->i_mode); in jffs2_truncate_file()
1364 ri->isize = cpu_to_je32(0); in jffs2_truncate_file()
1365 ri->atime = cpu_to_je32(inode->i_atime); in jffs2_truncate_file()
1366 ri->mtime = cpu_to_je32(jffs2_get_timestamp()); in jffs2_truncate_file()
1367 ri->offset = cpu_to_je32(0); in jffs2_truncate_file()
1368 ri->csize = ri->dsize = cpu_to_je32(0); in jffs2_truncate_file()
1369 ri->compr = JFFS2_COMPR_NONE; in jffs2_truncate_file()
1370 ri->node_crc = cpu_to_je32(crc32(0, ri, sizeof(*ri)-8)); in jffs2_truncate_file()
1371 ri->data_crc = cpu_to_je32(0); in jffs2_truncate_file()
1372 new_metadata = jffs2_write_dnode(c, f, ri, NULL, 0, in jffs2_truncate_file()
1377 up(&f->sem); in jffs2_truncate_file()
1382 inode->i_mtime = jffs2_get_timestamp(); in jffs2_truncate_file()
1383 inode->i_size = 0; in jffs2_truncate_file()
1384 old_metadata = f->metadata; in jffs2_truncate_file()
1385 jffs2_truncate_fragtree (c, &f->fragtree, 0); in jffs2_truncate_file()
1386 f->metadata = new_metadata; in jffs2_truncate_file()
1388 jffs2_mark_node_obsolete(c, old_metadata->raw); in jffs2_truncate_file()
1393 up(&f->sem); in jffs2_truncate_file()
1396 return 0; in jffs2_truncate_file()
1401 struct _inode *inode = (struct _inode *) fp->f_data; in jffs2_fo_write()
1402 off_t pos = fp->f_offset; in jffs2_fo_write()
1403 ssize_t resid = uio->uio_resid; in jffs2_fo_write()
1406 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); in jffs2_fo_write()
1411 if (fp->f_flag & CYG_FAPPEND) in jffs2_fo_write()
1412 pos = fp->f_offset = inode->i_size; in jffs2_fo_write()
1414 if (pos < 0) in jffs2_fo_write()
1417 memset(&ri, 0, sizeof(ri)); in jffs2_fo_write()
1419 ri.ino = cpu_to_je32(f->inocache->ino); in jffs2_fo_write()
1420 ri.mode = cpu_to_jemode(inode->i_mode); in jffs2_fo_write()
1421 ri.uid = cpu_to_je16(inode->i_uid); in jffs2_fo_write()
1422 ri.gid = cpu_to_je16(inode->i_gid); in jffs2_fo_write()
1425 if (pos > inode->i_size) { in jffs2_fo_write()
1427 ri.version = cpu_to_je32(++f->highest_version); in jffs2_fo_write()
1430 return -err; in jffs2_fo_write()
1432 ri.isize = cpu_to_je32(inode->i_size); in jffs2_fo_write()
1436 for (i = 0; i < uio->uio_iovcnt; i++) { in jffs2_fo_write()
1437 cyg_iovec *iov = &uio->uio_iov[i]; in jffs2_fo_write()
1438 unsigned char *buf = iov->iov_base; in jffs2_fo_write()
1439 off_t len = iov->iov_len; in jffs2_fo_write()
1450 return -err; in jffs2_fo_write()
1456 resid -= len; in jffs2_fo_write()
1462 inode->i_mtime = inode->i_ctime = je32_to_cpu(ri.mtime); in jffs2_fo_write()
1463 if (pos > inode->i_size) in jffs2_fo_write()
1464 inode->i_size = pos; in jffs2_fo_write()
1466 uio->uio_resid = resid; in jffs2_fo_write()
1467 fp->f_offset = pos; in jffs2_fo_write()
1473 // -------------------------------------------------------------------------
1479 struct _inode *node = (struct _inode *) fp->f_data; in jffs2_fo_lseek()
1491 pos += fp->f_offset; in jffs2_fo_lseek()
1496 pos += node->i_size; in jffs2_fo_lseek()
1503 if (pos < 0 ) in jffs2_fo_lseek()
1507 *apos = fp->f_offset = pos; in jffs2_fo_lseek()
1512 // -------------------------------------------------------------------------
1526 // -------------------------------------------------------------------------
1540 // -------------------------------------------------------------------------
1547 struct _inode *node = (struct _inode *) fp->f_data; in jffs2_fo_close()
1553 fp->f_data = 0; // zero data pointer in jffs2_fo_close()
1558 // -------------------------------------------------------------------------
1564 struct _inode *node = (struct _inode *) fp->f_data; in jffs2_fo_fstat()
1569 buf->st_mode = node->i_mode; in jffs2_fo_fstat()
1570 buf->st_ino = node->i_ino; in jffs2_fo_fstat()
1571 buf->st_dev = 0; in jffs2_fo_fstat()
1572 buf->st_nlink = node->i_nlink; in jffs2_fo_fstat()
1573 buf->st_uid = node->i_uid; in jffs2_fo_fstat()
1574 buf->st_gid = node->i_gid; in jffs2_fo_fstat()
1575 buf->st_size = node->i_size; in jffs2_fo_fstat()
1576 buf->st_atime = node->i_atime; in jffs2_fo_fstat()
1577 buf->st_mtime = node->i_mtime; in jffs2_fo_fstat()
1578 buf->st_ctime = node->i_ctime; in jffs2_fo_fstat()
1583 // -------------------------------------------------------------------------
1590 struct _inode *node = (struct _inode *) fp->f_data; in jffs2_fo_getinfo()
1606 // -------------------------------------------------------------------------
1623 // -------------------------------------------------------------------------
1631 nbuf[len] = '\0'; in filldir()
1636 struct _inode *d_inode = (struct _inode *) fp->f_data; in jffs2_fo_dirread()
1637 struct dirent *ent = (struct dirent *) uio->uio_iov[0].iov_base; in jffs2_fo_dirread()
1638 char *nbuf = ent->d_name; in jffs2_fo_dirread()
1642 int nlen = sizeof (ent->d_name) - 1; in jffs2_fo_dirread()
1643 off_t len = uio->uio_iov[0].iov_len; in jffs2_fo_dirread()
1654 (KERN_DEBUG "jffs2_readdir() for dir_i #%lu\n", d_inode->i_ino)); in jffs2_fo_dirread()
1658 offset = fp->f_offset; in jffs2_fo_dirread()
1660 if (offset == 0) { in jffs2_fo_dirread()
1662 (KERN_DEBUG "Dirent 0: \".\", ino #%lu\n", inode->i_ino)); in jffs2_fo_dirread()
1667 ent->d_type = in jffs2_fo_dirread()
1677 ent->d_type = in jffs2_fo_dirread()
1684 down(&f->sem); in jffs2_fo_dirread()
1685 for (fd = f->dents; fd; fd = fd->next) { in jffs2_fo_dirread()
1693 fd->name, fd->ino, fd->type, curofs, offset)); in jffs2_fo_dirread()
1696 if (!fd->ino) { in jffs2_fo_dirread()
1699 fd->name)); in jffs2_fo_dirread()
1705 fd->name, fd->ino, fd->type)); in jffs2_fo_dirread()
1706 filldir(nbuf, nlen, fd->name, strlen((char *)fd->name)); in jffs2_fo_dirread()
1708 c_ino = jffs2_iget(inode->i_sb, fd->ino); in jffs2_fo_dirread()
1712 // ent->d_type = 0; in jffs2_fo_dirread()
1715 ent->d_type = c_ino->i_mode; in jffs2_fo_dirread()
1722 found = 0; in jffs2_fo_dirread()
1724 up(&f->sem); in jffs2_fo_dirread()
1726 fp->f_offset = ++offset; in jffs2_fo_dirread()
1728 uio->uio_resid -= sizeof (struct dirent); in jffs2_fo_dirread()
1733 // -------------------------------------------------------------------------
1743 if (whence != SEEK_SET || *pos != 0) in jffs2_fo_dirlseek()
1746 *pos = fp->f_offset = 0; in jffs2_fo_dirlseek()
1768 offset & ~(PAGE_CACHE_SIZE-1), PAGE_CACHE_SIZE); in jffs2_gc_fetch_page()
1789 return 0; in new_inode()
1794 memset(inode, 0, sizeof (struct _inode)); in new_inode()
1795 inode->i_sb = sb; in new_inode()
1796 inode->i_ino = 1; in new_inode()
1797 inode->i_count = 1; in new_inode()
1798 inode->i_nlink = 1; // Let JFFS2 manage the link count in new_inode()
1799 inode->i_size = 0; in new_inode()
1801 inode->i_cache_next = NULL; // Newest inode, about to be cached in new_inode()
1804 for (cached_inode = sb->s_root; cached_inode != NULL; in new_inode()
1805 cached_inode = cached_inode->i_cache_next) { in new_inode()
1806 if (cached_inode->i_cache_next == NULL) { in new_inode()
1807 cached_inode->i_cache_next = inode; // Current last in cache points to newcomer in new_inode()
1808 inode->i_cache_prev = cached_inode; // Newcomer points back to last in new_inode()
1821 for (inode = sb->s_root; inode != NULL; inode = inode->i_cache_next) { in ilookup()
1822 if (inode->i_ino == ino) { in ilookup()
1823 inode->i_count++; in ilookup()
1850 return ERR_PTR(-ENOMEM); in jffs2_iget()
1852 inode->i_ino = ino; in jffs2_iget()
1857 inode->i_nlink = 0; // free _this_ bad inode right now in jffs2_iget()
1865 // -------------------------------------------------------------------------
1881 i->i_count--; in jffs2_iput()
1883 if (i->i_count < 0) in jffs2_iput()
1886 if (i->i_count) in jffs2_iput()
1889 if (!i->i_nlink) { in jffs2_iput()
1893 if (i->i_cache_prev) in jffs2_iput()
1894 i->i_cache_prev->i_cache_next = i->i_cache_next; in jffs2_iput()
1895 if (i->i_cache_next) in jffs2_iput()
1896 i->i_cache_next->i_cache_prev = i->i_cache_prev; in jffs2_iput()
1898 parent = i->i_parent; in jffs2_iput()
1900 memset(i, 0x5a, sizeof(*i)); in jffs2_iput()
1910 // this latest one in the cache for a while in jffs2_iput()
1911 icache_evict(i->i_sb->s_root, i); in jffs2_iput()
1916 // -------------------------------------------------------------------------
1922 memset(f, 0, sizeof(*f)); in jffs2_init_inode_info()
1923 init_MUTEX_LOCKED(&f->sem); in jffs2_init_inode_info()
1928 /* We can forget about this inode for now - drop all in jffs2_clear_inode()
1931 struct jffs2_sb_info *c = JFFS2_SB_INFO(inode->i_sb); in jffs2_clear_inode()
1934 … D1(printk(KERN_DEBUG "jffs2_clear_inode(): ino #%lu mode %o\n", inode->i_ino, inode->i_mode)); in jffs2_clear_inode()
1945 struct super_block *sb = dir_i->i_sb; in jffs2_new_inode()
1950 D1(printk(KERN_DEBUG "jffs2_new_inode(): dir_i %ld, mode 0x%x\n", dir_i->i_ino, mode)); in jffs2_new_inode()
1957 return ERR_PTR(-ENOMEM); in jffs2_new_inode()
1962 memset(ri, 0, sizeof(*ri)); in jffs2_new_inode()
1963 /* Set OS-specific defaults for new inodes */ in jffs2_new_inode()
1964 ri->uid = ri->gid = cpu_to_je16(0); in jffs2_new_inode()
1965 ri->mode = cpu_to_jemode(mode); in jffs2_new_inode()
1968 // forceful evict: f->sem is locked already, and the in jffs2_new_inode()
1970 if (inode->i_cache_prev) in jffs2_new_inode()
1971 inode->i_cache_prev->i_cache_next = inode->i_cache_next; in jffs2_new_inode()
1972 if (inode->i_cache_next) in jffs2_new_inode()
1973 inode->i_cache_next->i_cache_prev = inode->i_cache_prev; in jffs2_new_inode()
1974 up(&(f->sem)); in jffs2_new_inode()
1976 memset(inode, 0x6a, sizeof(*inode)); in jffs2_new_inode()
1980 inode->i_nlink = 1; in jffs2_new_inode()
1981 inode->i_ino = je32_to_cpu(ri->ino); in jffs2_new_inode()
1982 inode->i_mode = jemode_to_cpu(ri->mode); in jffs2_new_inode()
1983 inode->i_gid = je16_to_cpu(ri->gid); in jffs2_new_inode()
1984 inode->i_uid = je16_to_cpu(ri->uid); in jffs2_new_inode()
1985 inode->i_atime = inode->i_ctime = inode->i_mtime = jffs2_get_timestamp(); in jffs2_new_inode()
1986 ri->atime = ri->mtime = ri->ctime = cpu_to_je32(inode->i_mtime); in jffs2_new_inode()
1988 inode->i_size = 0; in jffs2_new_inode()
2001 D1(printk(KERN_DEBUG "jffs2_read_inode(): inode->i_ino == %lu\n", inode->i_ino)); in jffs2_read_inode()
2004 c = JFFS2_SB_INFO(inode->i_sb); in jffs2_read_inode()
2008 ret = jffs2_do_read_inode(c, f, inode->i_ino, &latest_node); in jffs2_read_inode()
2011 up(&f->sem); in jffs2_read_inode()
2014 inode->i_mode = jemode_to_cpu(latest_node.mode); in jffs2_read_inode()
2015 inode->i_uid = je16_to_cpu(latest_node.uid); in jffs2_read_inode()
2016 inode->i_gid = je16_to_cpu(latest_node.gid); in jffs2_read_inode()
2017 inode->i_size = je32_to_cpu(latest_node.isize); in jffs2_read_inode()
2018 inode->i_atime = je32_to_cpu(latest_node.atime); in jffs2_read_inode()
2019 inode->i_mtime = je32_to_cpu(latest_node.mtime); in jffs2_read_inode()
2020 inode->i_ctime = je32_to_cpu(latest_node.ctime); in jffs2_read_inode()
2022 inode->i_nlink = f->inocache->nlink; in jffs2_read_inode()
2023 up(&f->sem); in jffs2_read_inode()
2026 return 0; in jffs2_read_inode()
2061 spin_lock(&c->inocache_lock); in jffs2_gc_fetch_inode()
2065 spin_unlock(&c->inocache_lock); in jffs2_gc_fetch_inode()
2068 if (ic->state != INO_STATE_CHECKEDABSENT) { in jffs2_gc_fetch_inode()
2071 ic->ino, ic->state)); in jffs2_gc_fetch_inode()
2072 sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock); in jffs2_gc_fetch_inode()
2074 spin_unlock(&c->inocache_lock); in jffs2_gc_fetch_inode()
2096 uint32_t jmode = ((osmode & S_IRUSR)?00400:0) | in jffs2_from_os_mode()
2097 ((osmode & S_IWUSR)?00200:0) | in jffs2_from_os_mode()
2098 ((osmode & S_IXUSR)?00100:0) | in jffs2_from_os_mode()
2099 ((osmode & S_IRGRP)?00040:0) | in jffs2_from_os_mode()
2100 ((osmode & S_IWGRP)?00020:0) | in jffs2_from_os_mode()
2101 ((osmode & S_IXGRP)?00010:0) | in jffs2_from_os_mode()
2102 ((osmode & S_IROTH)?00004:0) | in jffs2_from_os_mode()
2103 ((osmode & S_IWOTH)?00002:0) | in jffs2_from_os_mode()
2104 ((osmode & S_IXOTH)?00001:0); in jffs2_from_os_mode()
2130 printf("os_to_jffs2_mode() cannot convert 0x%x\n", osmode); in jffs2_from_os_mode()
2132 return 0; in jffs2_from_os_mode()
2137 uint32_t osmode = ((jmode & 00400)?S_IRUSR:0) | in jffs2_to_os_mode()
2138 ((jmode & 00200)?S_IWUSR:0) | in jffs2_to_os_mode()
2139 ((jmode & 00100)?S_IXUSR:0) | in jffs2_to_os_mode()
2140 ((jmode & 00040)?S_IRGRP:0) | in jffs2_to_os_mode()
2141 ((jmode & 00020)?S_IWGRP:0) | in jffs2_to_os_mode()
2142 ((jmode & 00010)?S_IXGRP:0) | in jffs2_to_os_mode()
2143 ((jmode & 00004)?S_IROTH:0) | in jffs2_to_os_mode()
2144 ((jmode & 00002)?S_IWOTH:0) | in jffs2_to_os_mode()
2145 ((jmode & 00001)?S_IXOTH:0); in jffs2_to_os_mode()
2171 printf("jffs2_to_os_mode() cannot convert 0x%x\n", osmode); in jffs2_to_os_mode()
2173 return 0; in jffs2_to_os_mode()