• Home
  • Raw
  • Download

Lines Matching refs:inode

53 static struct erofs_inode *erofs_igrab(struct erofs_inode *inode)  in erofs_igrab()  argument
55 ++inode->i_count; in erofs_igrab()
56 return inode; in erofs_igrab()
64 struct erofs_inode *inode; in erofs_iget() local
66 list_for_each_entry(inode, head, i_hash) in erofs_iget()
67 if (inode->i_ino[1] == ino && inode->dev == dev) in erofs_iget()
68 return erofs_igrab(inode); in erofs_iget()
76 struct erofs_inode *inode; in erofs_iget_by_nid() local
78 list_for_each_entry(inode, head, i_hash) in erofs_iget_by_nid()
79 if (inode->nid == nid) in erofs_iget_by_nid()
80 return erofs_igrab(inode); in erofs_iget_by_nid()
84 unsigned int erofs_iput(struct erofs_inode *inode) in erofs_iput() argument
88 if (inode->i_count > 1) in erofs_iput()
89 return --inode->i_count; in erofs_iput()
91 list_for_each_entry_safe(d, t, &inode->i_subdirs, d_child) in erofs_iput()
94 list_del(&inode->i_hash); in erofs_iput()
95 free(inode); in erofs_iput()
130 static int __allocate_inode_bh_data(struct erofs_inode *inode, in __allocate_inode_bh_data() argument
138 inode->u.i_blkaddr = NULL_ADDR; in __allocate_inode_bh_data()
148 inode->bh_data = bh; in __allocate_inode_bh_data()
155 inode->u.i_blkaddr = bh->block->blkaddr; in __allocate_inode_bh_data()
167 d->inode = erofs_igrab(dir); in erofs_prepare_dir_file()
172 d->inode = erofs_igrab(dir->i_parent); in erofs_prepare_dir_file()
291 int erofs_write_file_from_buffer(struct erofs_inode *inode, char *buf) in erofs_write_file_from_buffer() argument
293 const unsigned int nblocks = erofs_blknr(inode->i_size); in erofs_write_file_from_buffer()
296 inode->datalayout = EROFS_INODE_FLAT_INLINE; in erofs_write_file_from_buffer()
298 ret = __allocate_inode_bh_data(inode, nblocks); in erofs_write_file_from_buffer()
303 blk_write(buf, inode->u.i_blkaddr, nblocks); in erofs_write_file_from_buffer()
304 inode->idata_size = inode->i_size % EROFS_BLKSIZ; in erofs_write_file_from_buffer()
305 if (inode->idata_size) { in erofs_write_file_from_buffer()
306 inode->idata = malloc(inode->idata_size); in erofs_write_file_from_buffer()
307 if (!inode->idata) in erofs_write_file_from_buffer()
309 memcpy(inode->idata, buf + blknr_to_addr(nblocks), in erofs_write_file_from_buffer()
310 inode->idata_size); in erofs_write_file_from_buffer()
316 static bool erofs_file_is_compressible(struct erofs_inode *inode) in erofs_file_is_compressible() argument
321 static int write_uncompressed_file_from_fd(struct erofs_inode *inode, int fd) in write_uncompressed_file_from_fd() argument
326 inode->datalayout = EROFS_INODE_FLAT_INLINE; in write_uncompressed_file_from_fd()
327 nblocks = inode->i_size / EROFS_BLKSIZ; in write_uncompressed_file_from_fd()
329 ret = __allocate_inode_bh_data(inode, nblocks); in write_uncompressed_file_from_fd()
343 ret = blk_write(buf, inode->u.i_blkaddr + i, 1); in write_uncompressed_file_from_fd()
349 inode->idata_size = inode->i_size % EROFS_BLKSIZ; in write_uncompressed_file_from_fd()
350 if (inode->idata_size) { in write_uncompressed_file_from_fd()
351 inode->idata = malloc(inode->idata_size); in write_uncompressed_file_from_fd()
352 if (!inode->idata) in write_uncompressed_file_from_fd()
355 ret = read(fd, inode->idata, inode->idata_size); in write_uncompressed_file_from_fd()
356 if (ret < inode->idata_size) { in write_uncompressed_file_from_fd()
357 free(inode->idata); in write_uncompressed_file_from_fd()
358 inode->idata = NULL; in write_uncompressed_file_from_fd()
365 int erofs_write_file(struct erofs_inode *inode) in erofs_write_file() argument
369 if (!inode->i_size) { in erofs_write_file()
370 inode->datalayout = EROFS_INODE_FLAT_PLAIN; in erofs_write_file()
374 if (cfg.c_compr_alg_master && erofs_file_is_compressible(inode)) { in erofs_write_file()
375 ret = erofs_write_compressed_file(inode); in erofs_write_file()
382 fd = open(inode->i_srcpath, O_RDONLY | O_BINARY); in erofs_write_file()
386 ret = write_uncompressed_file_from_fd(inode, fd); in erofs_write_file()
393 struct erofs_inode *const inode = bh->fsprivate; in erofs_bh_flush_write_inode() local
394 const u16 icount = EROFS_INODE_XATTR_ICOUNT(inode->xattr_isize); in erofs_bh_flush_write_inode()
402 switch (inode->inode_isize) { in erofs_bh_flush_write_inode()
404 u.dic.i_format = cpu_to_le16(0 | (inode->datalayout << 1)); in erofs_bh_flush_write_inode()
406 u.dic.i_mode = cpu_to_le16(inode->i_mode); in erofs_bh_flush_write_inode()
407 u.dic.i_nlink = cpu_to_le16(inode->i_nlink); in erofs_bh_flush_write_inode()
408 u.dic.i_size = cpu_to_le32((u32)inode->i_size); in erofs_bh_flush_write_inode()
410 u.dic.i_ino = cpu_to_le32(inode->i_ino[0]); in erofs_bh_flush_write_inode()
412 u.dic.i_uid = cpu_to_le16((u16)inode->i_uid); in erofs_bh_flush_write_inode()
413 u.dic.i_gid = cpu_to_le16((u16)inode->i_gid); in erofs_bh_flush_write_inode()
415 switch ((inode->i_mode) >> S_SHIFT) { in erofs_bh_flush_write_inode()
420 u.dic.i_u.rdev = cpu_to_le32(inode->u.i_rdev); in erofs_bh_flush_write_inode()
424 if (is_inode_layout_compression(inode)) in erofs_bh_flush_write_inode()
426 cpu_to_le32(inode->u.i_blocks); in erofs_bh_flush_write_inode()
429 cpu_to_le32(inode->u.i_blkaddr); in erofs_bh_flush_write_inode()
434 u.die.i_format = cpu_to_le16(1 | (inode->datalayout << 1)); in erofs_bh_flush_write_inode()
436 u.die.i_mode = cpu_to_le16(inode->i_mode); in erofs_bh_flush_write_inode()
437 u.die.i_nlink = cpu_to_le32(inode->i_nlink); in erofs_bh_flush_write_inode()
438 u.die.i_size = cpu_to_le64(inode->i_size); in erofs_bh_flush_write_inode()
440 u.die.i_ino = cpu_to_le32(inode->i_ino[0]); in erofs_bh_flush_write_inode()
442 u.die.i_uid = cpu_to_le16(inode->i_uid); in erofs_bh_flush_write_inode()
443 u.die.i_gid = cpu_to_le16(inode->i_gid); in erofs_bh_flush_write_inode()
445 u.die.i_ctime = cpu_to_le64(inode->i_ctime); in erofs_bh_flush_write_inode()
446 u.die.i_ctime_nsec = cpu_to_le32(inode->i_ctime_nsec); in erofs_bh_flush_write_inode()
448 switch ((inode->i_mode) >> S_SHIFT) { in erofs_bh_flush_write_inode()
453 u.die.i_u.rdev = cpu_to_le32(inode->u.i_rdev); in erofs_bh_flush_write_inode()
457 if (is_inode_layout_compression(inode)) in erofs_bh_flush_write_inode()
459 cpu_to_le32(inode->u.i_blocks); in erofs_bh_flush_write_inode()
462 cpu_to_le32(inode->u.i_blkaddr); in erofs_bh_flush_write_inode()
468 (unsigned long long)inode->nid); in erofs_bh_flush_write_inode()
472 ret = dev_write(&u, off, inode->inode_isize); in erofs_bh_flush_write_inode()
475 off += inode->inode_isize; in erofs_bh_flush_write_inode()
477 if (inode->xattr_isize) { in erofs_bh_flush_write_inode()
478 char *xattrs = erofs_export_xattr_ibody(&inode->i_xattrs, in erofs_bh_flush_write_inode()
479 inode->xattr_isize); in erofs_bh_flush_write_inode()
483 ret = dev_write(xattrs, off, inode->xattr_isize); in erofs_bh_flush_write_inode()
488 off += inode->xattr_isize; in erofs_bh_flush_write_inode()
491 if (inode->extent_isize) { in erofs_bh_flush_write_inode()
494 ret = dev_write(inode->compressmeta, off, inode->extent_isize); in erofs_bh_flush_write_inode()
497 free(inode->compressmeta); in erofs_bh_flush_write_inode()
500 inode->bh = NULL; in erofs_bh_flush_write_inode()
501 erofs_iput(inode); in erofs_bh_flush_write_inode()
509 int erofs_prepare_tail_block(struct erofs_inode *inode) in erofs_prepare_tail_block() argument
514 if (!inode->idata_size) in erofs_prepare_tail_block()
517 bh = inode->bh_data; in erofs_prepare_tail_block()
527 inode->u.i_blkaddr = bh->block->blkaddr; in erofs_prepare_tail_block()
529 inode->bh_data = bh; in erofs_prepare_tail_block()
538 int erofs_prepare_inode_buffer(struct erofs_inode *inode) in erofs_prepare_inode_buffer() argument
543 DBG_BUGON(inode->bh || inode->bh_inline); in erofs_prepare_inode_buffer()
545 inodesize = inode->inode_isize + inode->xattr_isize; in erofs_prepare_inode_buffer()
546 if (inode->extent_isize) in erofs_prepare_inode_buffer()
548 inode->extent_isize; in erofs_prepare_inode_buffer()
550 if (is_inode_layout_compression(inode)) in erofs_prepare_inode_buffer()
557 if (!inode->idata_size) in erofs_prepare_inode_buffer()
558 inode->datalayout = EROFS_INODE_FLAT_PLAIN; in erofs_prepare_inode_buffer()
560 bh = erofs_balloc(INODE, inodesize, 0, inode->idata_size); in erofs_prepare_inode_buffer()
564 inode->datalayout = EROFS_INODE_FLAT_PLAIN; in erofs_prepare_inode_buffer()
567 ret = erofs_prepare_tail_block(inode); in erofs_prepare_inode_buffer()
573 DBG_BUGON(inode->bh_inline); in erofs_prepare_inode_buffer()
576 } else if (inode->idata_size) { in erofs_prepare_inode_buffer()
577 inode->datalayout = EROFS_INODE_FLAT_INLINE; in erofs_prepare_inode_buffer()
580 ibh = erofs_battach(bh, META, inode->idata_size); in erofs_prepare_inode_buffer()
585 inode->bh_inline = ibh; in erofs_prepare_inode_buffer()
588 bh->fsprivate = erofs_igrab(inode); in erofs_prepare_inode_buffer()
590 inode->bh = bh; in erofs_prepare_inode_buffer()
596 struct erofs_inode *const inode = bh->fsprivate; in erofs_bh_flush_write_inline() local
600 ret = dev_write(inode->idata, off, inode->idata_size); in erofs_bh_flush_write_inline()
604 inode->idata_size = 0; in erofs_bh_flush_write_inline()
605 free(inode->idata); in erofs_bh_flush_write_inline()
606 inode->idata = NULL; in erofs_bh_flush_write_inline()
608 erofs_iput(inode); in erofs_bh_flush_write_inline()
616 int erofs_write_tail_end(struct erofs_inode *inode) in erofs_write_tail_end() argument
620 bh = inode->bh_data; in erofs_write_tail_end()
622 if (!inode->idata_size) in erofs_write_tail_end()
626 if (inode->bh_inline) { in erofs_write_tail_end()
627 ibh = inode->bh_inline; in erofs_write_tail_end()
629 ibh->fsprivate = erofs_igrab(inode); in erofs_write_tail_end()
637 ret = dev_write(inode->idata, pos, inode->idata_size); in erofs_write_tail_end()
640 if (inode->idata_size < EROFS_BLKSIZ) { in erofs_write_tail_end()
641 ret = dev_fillzero(pos + inode->idata_size, in erofs_write_tail_end()
642 EROFS_BLKSIZ - inode->idata_size, in erofs_write_tail_end()
647 inode->idata_size = 0; in erofs_write_tail_end()
648 free(inode->idata); in erofs_write_tail_end()
649 inode->idata = NULL; in erofs_write_tail_end()
663 inode->bh_data = NULL; in erofs_write_tail_end()
668 static bool erofs_should_use_inode_extended(struct erofs_inode *inode) in erofs_should_use_inode_extended() argument
672 if (inode->i_size > UINT_MAX) in erofs_should_use_inode_extended()
674 if (inode->i_uid > USHRT_MAX) in erofs_should_use_inode_extended()
676 if (inode->i_gid > USHRT_MAX) in erofs_should_use_inode_extended()
678 if (inode->i_nlink > USHRT_MAX) in erofs_should_use_inode_extended()
692 int erofs_droid_inode_fsconfig(struct erofs_inode *inode, in erofs_droid_inode_fsconfig() argument
702 inode->capabilities = 0; in erofs_droid_inode_fsconfig()
720 &uid, &gid, &mode, &inode->capabilities); in erofs_droid_inode_fsconfig()
724 &uid, &gid, &mode, &inode->capabilities); in erofs_droid_inode_fsconfig()
728 fspath, mode, uid, gid, inode->capabilities); in erofs_droid_inode_fsconfig()
738 static int erofs_droid_inode_fsconfig(struct erofs_inode *inode, in erofs_droid_inode_fsconfig() argument
746 int erofs_fill_inode(struct erofs_inode *inode, in erofs_fill_inode() argument
750 int err = erofs_droid_inode_fsconfig(inode, st, path); in erofs_fill_inode()
754 inode->i_mode = st->st_mode; in erofs_fill_inode()
755 inode->i_uid = st->st_uid; in erofs_fill_inode()
756 inode->i_gid = st->st_gid; in erofs_fill_inode()
757 inode->i_ctime = st->st_ctime; in erofs_fill_inode()
758 inode->i_ctime_nsec = st->st_ctim.tv_nsec; in erofs_fill_inode()
765 inode->i_ctime = sbi.build_time; in erofs_fill_inode()
766 inode->i_ctime_nsec = sbi.build_time_nsec; in erofs_fill_inode()
770 inode->i_nlink = 1; /* fix up later if needed */ in erofs_fill_inode()
772 switch (inode->i_mode & S_IFMT) { in erofs_fill_inode()
777 inode->u.i_rdev = erofs_new_encode_dev(st->st_rdev); in erofs_fill_inode()
779 inode->i_size = 0; in erofs_fill_inode()
783 inode->i_size = st->st_size; in erofs_fill_inode()
789 strncpy(inode->i_srcpath, path, sizeof(inode->i_srcpath) - 1); in erofs_fill_inode()
790 inode->i_srcpath[sizeof(inode->i_srcpath) - 1] = '\0'; in erofs_fill_inode()
792 inode->dev = st->st_dev; in erofs_fill_inode()
793 inode->i_ino[1] = st->st_ino; in erofs_fill_inode()
795 if (erofs_should_use_inode_extended(inode)) { in erofs_fill_inode()
798 inode->i_srcpath); in erofs_fill_inode()
801 inode->inode_isize = sizeof(struct erofs_inode_extended); in erofs_fill_inode()
803 inode->inode_isize = sizeof(struct erofs_inode_compact); in erofs_fill_inode()
806 list_add(&inode->i_hash, in erofs_fill_inode()
815 struct erofs_inode *inode; in erofs_new_inode() local
817 inode = malloc(sizeof(struct erofs_inode)); in erofs_new_inode()
818 if (!inode) in erofs_new_inode()
821 inode->i_parent = NULL; /* also used to indicate a new inode */ in erofs_new_inode()
823 inode->i_ino[0] = counter++; /* inode serial number */ in erofs_new_inode()
824 inode->i_count = 1; in erofs_new_inode()
826 init_list_head(&inode->i_subdirs); in erofs_new_inode()
827 init_list_head(&inode->i_xattrs); in erofs_new_inode()
829 inode->idata_size = 0; in erofs_new_inode()
830 inode->xattr_isize = 0; in erofs_new_inode()
831 inode->extent_isize = 0; in erofs_new_inode()
833 inode->bh = inode->bh_inline = inode->bh_data = NULL; in erofs_new_inode()
834 inode->idata = NULL; in erofs_new_inode()
835 return inode; in erofs_new_inode()
842 struct erofs_inode *inode; in erofs_iget_from_path() local
859 inode = erofs_iget(st.st_dev, st.st_ino); in erofs_iget_from_path()
860 if (inode) in erofs_iget_from_path()
861 return inode; in erofs_iget_from_path()
865 inode = erofs_new_inode(); in erofs_iget_from_path()
866 if (IS_ERR(inode)) in erofs_iget_from_path()
867 return inode; in erofs_iget_from_path()
869 ret = erofs_fill_inode(inode, &st, path); in erofs_iget_from_path()
873 return inode; in erofs_iget_from_path()
893 erofs_nid_t erofs_lookupnid(struct erofs_inode *inode) in erofs_lookupnid() argument
895 struct erofs_buffer_head *const bh = inode->bh; in erofs_lookupnid()
899 return inode->nid; in erofs_lookupnid()
906 return inode->nid = (off - meta_offset) >> EROFS_ISLOTBITS; in erofs_lookupnid()
911 struct erofs_inode *const inode = d->inode; in erofs_d_invalidate() local
913 d->nid = erofs_lookupnid(inode); in erofs_d_invalidate()
914 erofs_iput(inode); in erofs_d_invalidate()
1024 d->inode = erofs_mkfs_build_tree_from_path(dir, buf); in erofs_mkfs_build_tree()
1025 if (IS_ERR(d->inode)) { in erofs_mkfs_build_tree()
1026 ret = PTR_ERR(d->inode); in erofs_mkfs_build_tree()
1028 d->inode = NULL; in erofs_mkfs_build_tree()
1033 ftype = erofs_mode_to_ftype(d->inode->i_mode); in erofs_mkfs_build_tree()
1055 struct erofs_inode *const inode = erofs_iget_from_path(path, true); in erofs_mkfs_build_tree_from_path() local
1057 if (IS_ERR(inode)) in erofs_mkfs_build_tree_from_path()
1058 return inode; in erofs_mkfs_build_tree_from_path()
1061 if (inode->i_parent) { in erofs_mkfs_build_tree_from_path()
1062 ++inode->i_nlink; in erofs_mkfs_build_tree_from_path()
1063 return inode; in erofs_mkfs_build_tree_from_path()
1068 inode->i_parent = parent; in erofs_mkfs_build_tree_from_path()
1070 inode->i_parent = inode; /* rootdir mark */ in erofs_mkfs_build_tree_from_path()
1072 return erofs_mkfs_build_tree(inode); in erofs_mkfs_build_tree_from_path()