Lines Matching refs:inode
58 static struct erofs_inode *erofs_igrab(struct erofs_inode *inode) in erofs_igrab() argument
60 ++inode->i_count; in erofs_igrab()
61 return inode; in erofs_igrab()
69 struct erofs_inode *inode; in erofs_iget() local
71 list_for_each_entry(inode, head, i_hash) in erofs_iget()
72 if (inode->i_ino[1] == ino && inode->dev == dev) in erofs_iget()
73 return erofs_igrab(inode); in erofs_iget()
81 struct erofs_inode *inode; in erofs_iget_by_nid() local
83 list_for_each_entry(inode, head, i_hash) in erofs_iget_by_nid()
84 if (inode->nid == nid) in erofs_iget_by_nid()
85 return erofs_igrab(inode); in erofs_iget_by_nid()
89 unsigned int erofs_iput(struct erofs_inode *inode) in erofs_iput() argument
93 if (inode->i_count > 1) in erofs_iput()
94 return --inode->i_count; in erofs_iput()
96 list_for_each_entry_safe(d, t, &inode->i_subdirs, d_child) in erofs_iput()
99 list_del(&inode->i_hash); in erofs_iput()
100 free(inode); in erofs_iput()
120 static int __allocate_inode_bh_data(struct erofs_inode *inode, in __allocate_inode_bh_data() argument
128 inode->u.i_blkaddr = NULL_ADDR; in __allocate_inode_bh_data()
138 inode->bh_data = bh; in __allocate_inode_bh_data()
145 inode->u.i_blkaddr = bh->block->blkaddr; in __allocate_inode_bh_data()
168 d->inode = erofs_igrab(dir); in erofs_prepare_dir_file()
175 d->inode = erofs_igrab(dir->i_parent); in erofs_prepare_dir_file()
310 static int erofs_write_file_from_buffer(struct erofs_inode *inode, char *buf) in erofs_write_file_from_buffer() argument
312 const unsigned int nblocks = erofs_blknr(inode->i_size); in erofs_write_file_from_buffer()
315 inode->datalayout = EROFS_INODE_FLAT_INLINE; in erofs_write_file_from_buffer()
317 ret = __allocate_inode_bh_data(inode, nblocks); in erofs_write_file_from_buffer()
322 blk_write(buf, inode->u.i_blkaddr, nblocks); in erofs_write_file_from_buffer()
323 inode->idata_size = inode->i_size % EROFS_BLKSIZ; in erofs_write_file_from_buffer()
324 if (inode->idata_size) { in erofs_write_file_from_buffer()
325 inode->idata = malloc(inode->idata_size); in erofs_write_file_from_buffer()
326 if (!inode->idata) in erofs_write_file_from_buffer()
328 memcpy(inode->idata, buf + blknr_to_addr(nblocks), in erofs_write_file_from_buffer()
329 inode->idata_size); in erofs_write_file_from_buffer()
335 static bool erofs_file_is_compressible(struct erofs_inode *inode) in erofs_file_is_compressible() argument
338 return z_erofs_apply_compress_hints(inode); in erofs_file_is_compressible()
342 static int write_uncompressed_file_from_fd(struct erofs_inode *inode, int fd) in write_uncompressed_file_from_fd() argument
347 inode->datalayout = EROFS_INODE_FLAT_INLINE; in write_uncompressed_file_from_fd()
348 nblocks = inode->i_size / EROFS_BLKSIZ; in write_uncompressed_file_from_fd()
350 ret = __allocate_inode_bh_data(inode, nblocks); in write_uncompressed_file_from_fd()
364 ret = blk_write(buf, inode->u.i_blkaddr + i, 1); in write_uncompressed_file_from_fd()
370 inode->idata_size = inode->i_size % EROFS_BLKSIZ; in write_uncompressed_file_from_fd()
371 if (inode->idata_size) { in write_uncompressed_file_from_fd()
372 inode->idata = malloc(inode->idata_size); in write_uncompressed_file_from_fd()
373 if (!inode->idata) in write_uncompressed_file_from_fd()
376 ret = read(fd, inode->idata, inode->idata_size); in write_uncompressed_file_from_fd()
377 if (ret < inode->idata_size) { in write_uncompressed_file_from_fd()
378 free(inode->idata); in write_uncompressed_file_from_fd()
379 inode->idata = NULL; in write_uncompressed_file_from_fd()
383 erofs_droid_blocklist_write(inode, inode->u.i_blkaddr, nblocks); in write_uncompressed_file_from_fd()
387 int erofs_write_file(struct erofs_inode *inode) in erofs_write_file() argument
391 if (!inode->i_size) { in erofs_write_file()
392 inode->datalayout = EROFS_INODE_FLAT_PLAIN; in erofs_write_file()
397 inode->u.chunkbits = cfg.c_chunkbits; in erofs_write_file()
399 inode->u.chunkformat = 0; in erofs_write_file()
401 inode->u.chunkformat = EROFS_CHUNK_FORMAT_INDEXES; in erofs_write_file()
402 return erofs_blob_write_chunked_file(inode); in erofs_write_file()
405 if (cfg.c_compr_alg_master && erofs_file_is_compressible(inode)) { in erofs_write_file()
406 ret = erofs_write_compressed_file(inode); in erofs_write_file()
413 fd = open(inode->i_srcpath, O_RDONLY | O_BINARY); in erofs_write_file()
417 ret = write_uncompressed_file_from_fd(inode, fd); in erofs_write_file()
424 struct erofs_inode *const inode = bh->fsprivate; in erofs_bh_flush_write_inode() local
425 const u16 icount = EROFS_INODE_XATTR_ICOUNT(inode->xattr_isize); in erofs_bh_flush_write_inode()
433 switch (inode->inode_isize) { in erofs_bh_flush_write_inode()
435 u.dic.i_format = cpu_to_le16(0 | (inode->datalayout << 1)); in erofs_bh_flush_write_inode()
437 u.dic.i_mode = cpu_to_le16(inode->i_mode); in erofs_bh_flush_write_inode()
438 u.dic.i_nlink = cpu_to_le16(inode->i_nlink); in erofs_bh_flush_write_inode()
439 u.dic.i_size = cpu_to_le32((u32)inode->i_size); in erofs_bh_flush_write_inode()
441 u.dic.i_ino = cpu_to_le32(inode->i_ino[0]); in erofs_bh_flush_write_inode()
443 u.dic.i_uid = cpu_to_le16((u16)inode->i_uid); in erofs_bh_flush_write_inode()
444 u.dic.i_gid = cpu_to_le16((u16)inode->i_gid); in erofs_bh_flush_write_inode()
446 switch (inode->i_mode & S_IFMT) { in erofs_bh_flush_write_inode()
451 u.dic.i_u.rdev = cpu_to_le32(inode->u.i_rdev); in erofs_bh_flush_write_inode()
455 if (is_inode_layout_compression(inode)) in erofs_bh_flush_write_inode()
457 cpu_to_le32(inode->u.i_blocks); in erofs_bh_flush_write_inode()
458 else if (inode->datalayout == in erofs_bh_flush_write_inode()
461 cpu_to_le16(inode->u.chunkformat); in erofs_bh_flush_write_inode()
464 cpu_to_le32(inode->u.i_blkaddr); in erofs_bh_flush_write_inode()
469 u.die.i_format = cpu_to_le16(1 | (inode->datalayout << 1)); in erofs_bh_flush_write_inode()
471 u.die.i_mode = cpu_to_le16(inode->i_mode); in erofs_bh_flush_write_inode()
472 u.die.i_nlink = cpu_to_le32(inode->i_nlink); in erofs_bh_flush_write_inode()
473 u.die.i_size = cpu_to_le64(inode->i_size); in erofs_bh_flush_write_inode()
475 u.die.i_ino = cpu_to_le32(inode->i_ino[0]); in erofs_bh_flush_write_inode()
477 u.die.i_uid = cpu_to_le32(inode->i_uid); in erofs_bh_flush_write_inode()
478 u.die.i_gid = cpu_to_le32(inode->i_gid); in erofs_bh_flush_write_inode()
480 u.die.i_mtime = cpu_to_le64(inode->i_mtime); in erofs_bh_flush_write_inode()
481 u.die.i_mtime_nsec = cpu_to_le32(inode->i_mtime_nsec); in erofs_bh_flush_write_inode()
483 switch (inode->i_mode & S_IFMT) { in erofs_bh_flush_write_inode()
488 u.die.i_u.rdev = cpu_to_le32(inode->u.i_rdev); in erofs_bh_flush_write_inode()
492 if (is_inode_layout_compression(inode)) in erofs_bh_flush_write_inode()
494 cpu_to_le32(inode->u.i_blocks); in erofs_bh_flush_write_inode()
495 else if (inode->datalayout == in erofs_bh_flush_write_inode()
498 cpu_to_le16(inode->u.chunkformat); in erofs_bh_flush_write_inode()
501 cpu_to_le32(inode->u.i_blkaddr); in erofs_bh_flush_write_inode()
507 (unsigned long long)inode->nid); in erofs_bh_flush_write_inode()
511 ret = dev_write(&u, off, inode->inode_isize); in erofs_bh_flush_write_inode()
514 off += inode->inode_isize; in erofs_bh_flush_write_inode()
516 if (inode->xattr_isize) { in erofs_bh_flush_write_inode()
517 char *xattrs = erofs_export_xattr_ibody(&inode->i_xattrs, in erofs_bh_flush_write_inode()
518 inode->xattr_isize); in erofs_bh_flush_write_inode()
522 ret = dev_write(xattrs, off, inode->xattr_isize); in erofs_bh_flush_write_inode()
527 off += inode->xattr_isize; in erofs_bh_flush_write_inode()
530 if (inode->extent_isize) { in erofs_bh_flush_write_inode()
531 if (inode->datalayout == EROFS_INODE_CHUNK_BASED) { in erofs_bh_flush_write_inode()
532 ret = erofs_blob_write_chunk_indexes(inode, off); in erofs_bh_flush_write_inode()
538 ret = dev_write(inode->compressmeta, off, in erofs_bh_flush_write_inode()
539 inode->extent_isize); in erofs_bh_flush_write_inode()
542 free(inode->compressmeta); in erofs_bh_flush_write_inode()
546 inode->bh = NULL; in erofs_bh_flush_write_inode()
547 erofs_iput(inode); in erofs_bh_flush_write_inode()
555 static int erofs_prepare_tail_block(struct erofs_inode *inode) in erofs_prepare_tail_block() argument
560 if (!inode->idata_size) in erofs_prepare_tail_block()
563 bh = inode->bh_data; in erofs_prepare_tail_block()
573 inode->u.i_blkaddr = bh->block->blkaddr; in erofs_prepare_tail_block()
575 inode->bh_data = bh; in erofs_prepare_tail_block()
584 static int erofs_prepare_inode_buffer(struct erofs_inode *inode) in erofs_prepare_inode_buffer() argument
589 DBG_BUGON(inode->bh || inode->bh_inline); in erofs_prepare_inode_buffer()
591 inodesize = inode->inode_isize + inode->xattr_isize; in erofs_prepare_inode_buffer()
592 if (inode->extent_isize) in erofs_prepare_inode_buffer()
594 inode->extent_isize; in erofs_prepare_inode_buffer()
596 if (is_inode_layout_compression(inode)) in erofs_prepare_inode_buffer()
598 if (inode->datalayout == EROFS_INODE_CHUNK_BASED) in erofs_prepare_inode_buffer()
601 if (cfg.c_noinline_data && S_ISREG(inode->i_mode)) { in erofs_prepare_inode_buffer()
602 inode->datalayout = EROFS_INODE_FLAT_PLAIN; in erofs_prepare_inode_buffer()
610 if (!inode->idata_size) in erofs_prepare_inode_buffer()
611 inode->datalayout = EROFS_INODE_FLAT_PLAIN; in erofs_prepare_inode_buffer()
613 bh = erofs_balloc(INODE, inodesize, 0, inode->idata_size); in erofs_prepare_inode_buffer()
617 inode->datalayout = EROFS_INODE_FLAT_PLAIN; in erofs_prepare_inode_buffer()
620 ret = erofs_prepare_tail_block(inode); in erofs_prepare_inode_buffer()
626 DBG_BUGON(inode->bh_inline); in erofs_prepare_inode_buffer()
629 } else if (inode->idata_size) { in erofs_prepare_inode_buffer()
630 inode->datalayout = EROFS_INODE_FLAT_INLINE; in erofs_prepare_inode_buffer()
633 ibh = erofs_battach(bh, META, inode->idata_size); in erofs_prepare_inode_buffer()
638 inode->bh_inline = ibh; in erofs_prepare_inode_buffer()
641 bh->fsprivate = erofs_igrab(inode); in erofs_prepare_inode_buffer()
643 inode->bh = bh; in erofs_prepare_inode_buffer()
649 struct erofs_inode *const inode = bh->fsprivate; in erofs_bh_flush_write_inline() local
653 ret = dev_write(inode->idata, off, inode->idata_size); in erofs_bh_flush_write_inline()
657 inode->idata_size = 0; in erofs_bh_flush_write_inline()
658 free(inode->idata); in erofs_bh_flush_write_inline()
659 inode->idata = NULL; in erofs_bh_flush_write_inline()
661 erofs_iput(inode); in erofs_bh_flush_write_inline()
669 static int erofs_write_tail_end(struct erofs_inode *inode) in erofs_write_tail_end() argument
673 bh = inode->bh_data; in erofs_write_tail_end()
675 if (!inode->idata_size) in erofs_write_tail_end()
679 if (inode->bh_inline) { in erofs_write_tail_end()
680 ibh = inode->bh_inline; in erofs_write_tail_end()
682 ibh->fsprivate = erofs_igrab(inode); in erofs_write_tail_end()
685 erofs_droid_blocklist_write_tail_end(inode, NULL_ADDR); in erofs_write_tail_end()
692 ret = dev_write(inode->idata, pos, inode->idata_size); in erofs_write_tail_end()
695 if (inode->idata_size < EROFS_BLKSIZ) { in erofs_write_tail_end()
696 ret = dev_fillzero(pos + inode->idata_size, in erofs_write_tail_end()
697 EROFS_BLKSIZ - inode->idata_size, in erofs_write_tail_end()
702 inode->idata_size = 0; in erofs_write_tail_end()
703 free(inode->idata); in erofs_write_tail_end()
704 inode->idata = NULL; in erofs_write_tail_end()
706 erofs_droid_blocklist_write_tail_end(inode, erofs_blknr(pos)); in erofs_write_tail_end()
716 inode->bh_data = NULL; in erofs_write_tail_end()
721 static bool erofs_should_use_inode_extended(struct erofs_inode *inode) in erofs_should_use_inode_extended() argument
725 if (inode->i_size > UINT_MAX) in erofs_should_use_inode_extended()
727 if (inode->i_uid > USHRT_MAX) in erofs_should_use_inode_extended()
729 if (inode->i_gid > USHRT_MAX) in erofs_should_use_inode_extended()
731 if (inode->i_nlink > USHRT_MAX) in erofs_should_use_inode_extended()
733 if ((inode->i_mtime != sbi.build_time || in erofs_should_use_inode_extended()
734 inode->i_mtime_nsec != sbi.build_time_nsec) && in erofs_should_use_inode_extended()
749 int erofs_droid_inode_fsconfig(struct erofs_inode *inode, in erofs_droid_inode_fsconfig() argument
759 inode->capabilities = 0; in erofs_droid_inode_fsconfig()
777 &uid, &gid, &mode, &inode->capabilities); in erofs_droid_inode_fsconfig()
781 &uid, &gid, &mode, &inode->capabilities); in erofs_droid_inode_fsconfig()
784 fspath, mode, uid, gid, inode->capabilities); in erofs_droid_inode_fsconfig()
794 static int erofs_droid_inode_fsconfig(struct erofs_inode *inode, in erofs_droid_inode_fsconfig() argument
802 static int erofs_fill_inode(struct erofs_inode *inode, in erofs_fill_inode() argument
806 int err = erofs_droid_inode_fsconfig(inode, st, path); in erofs_fill_inode()
810 inode->i_mode = st->st_mode; in erofs_fill_inode()
811 inode->i_uid = cfg.c_uid == -1 ? st->st_uid : cfg.c_uid; in erofs_fill_inode()
812 inode->i_gid = cfg.c_gid == -1 ? st->st_gid : cfg.c_gid; in erofs_fill_inode()
813 inode->i_mtime = st->st_mtime; in erofs_fill_inode()
814 inode->i_mtime_nsec = ST_MTIM_NSEC(st); in erofs_fill_inode()
818 if (inode->i_mtime < sbi.build_time) in erofs_fill_inode()
821 inode->i_mtime = sbi.build_time; in erofs_fill_inode()
822 inode->i_mtime_nsec = sbi.build_time_nsec; in erofs_fill_inode()
826 inode->i_nlink = 1; /* fix up later if needed */ in erofs_fill_inode()
828 switch (inode->i_mode & S_IFMT) { in erofs_fill_inode()
833 inode->u.i_rdev = erofs_new_encode_dev(st->st_rdev); in erofs_fill_inode()
835 inode->i_size = 0; in erofs_fill_inode()
839 inode->i_size = st->st_size; in erofs_fill_inode()
845 strncpy(inode->i_srcpath, path, sizeof(inode->i_srcpath) - 1); in erofs_fill_inode()
846 inode->i_srcpath[sizeof(inode->i_srcpath) - 1] = '\0'; in erofs_fill_inode()
848 inode->dev = st->st_dev; in erofs_fill_inode()
849 inode->i_ino[1] = st->st_ino; in erofs_fill_inode()
851 if (erofs_should_use_inode_extended(inode)) { in erofs_fill_inode()
854 inode->i_srcpath); in erofs_fill_inode()
857 inode->inode_isize = sizeof(struct erofs_inode_extended); in erofs_fill_inode()
859 inode->inode_isize = sizeof(struct erofs_inode_compact); in erofs_fill_inode()
862 list_add(&inode->i_hash, in erofs_fill_inode()
870 struct erofs_inode *inode; in erofs_new_inode() local
872 inode = calloc(1, sizeof(struct erofs_inode)); in erofs_new_inode()
873 if (!inode) in erofs_new_inode()
876 inode->i_ino[0] = sbi.inos++; /* inode serial number */ in erofs_new_inode()
877 inode->i_count = 1; in erofs_new_inode()
879 init_list_head(&inode->i_subdirs); in erofs_new_inode()
880 init_list_head(&inode->i_xattrs); in erofs_new_inode()
881 return inode; in erofs_new_inode()
888 struct erofs_inode *inode; in erofs_iget_from_path() local
905 inode = erofs_iget(st.st_dev, st.st_ino); in erofs_iget_from_path()
906 if (inode) in erofs_iget_from_path()
907 return inode; in erofs_iget_from_path()
911 inode = erofs_new_inode(); in erofs_iget_from_path()
912 if (IS_ERR(inode)) in erofs_iget_from_path()
913 return inode; in erofs_iget_from_path()
915 ret = erofs_fill_inode(inode, &st, path); in erofs_iget_from_path()
917 free(inode); in erofs_iget_from_path()
921 return inode; in erofs_iget_from_path()
941 erofs_nid_t erofs_lookupnid(struct erofs_inode *inode) in erofs_lookupnid() argument
943 struct erofs_buffer_head *const bh = inode->bh; in erofs_lookupnid()
947 return inode->nid; in erofs_lookupnid()
954 return inode->nid = (off - meta_offset) >> EROFS_ISLOTBITS; in erofs_lookupnid()
959 struct erofs_inode *const inode = d->inode; in erofs_d_invalidate() local
961 d->nid = erofs_lookupnid(inode); in erofs_d_invalidate()
962 erofs_iput(inode); in erofs_d_invalidate()
1075 d->inode = erofs_mkfs_build_tree_from_path(dir, buf); in erofs_mkfs_build_tree()
1076 if (IS_ERR(d->inode)) { in erofs_mkfs_build_tree()
1077 ret = PTR_ERR(d->inode); in erofs_mkfs_build_tree()
1079 d->inode = NULL; in erofs_mkfs_build_tree()
1084 ftype = erofs_mode_to_ftype(d->inode->i_mode); in erofs_mkfs_build_tree()
1106 struct erofs_inode *const inode = erofs_iget_from_path(path, true); in erofs_mkfs_build_tree_from_path() local
1108 if (IS_ERR(inode)) in erofs_mkfs_build_tree_from_path()
1109 return inode; in erofs_mkfs_build_tree_from_path()
1112 if (inode->i_parent) { in erofs_mkfs_build_tree_from_path()
1113 ++inode->i_nlink; in erofs_mkfs_build_tree_from_path()
1114 return inode; in erofs_mkfs_build_tree_from_path()
1119 inode->i_parent = parent; in erofs_mkfs_build_tree_from_path()
1121 inode->i_parent = inode; /* rootdir mark */ in erofs_mkfs_build_tree_from_path()
1123 return erofs_mkfs_build_tree(inode); in erofs_mkfs_build_tree_from_path()