Lines Matching +full:on +full:- +full:die
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2017-2018 HUAWEI, Inc.
19 struct super_block *sb = inode->i_sb; in erofs_read_inode()
22 const erofs_off_t inode_loc = iloc(sbi, vi->nid); in erofs_read_inode()
27 struct erofs_inode_extended *die, *copied = NULL; in erofs_read_inode() local
35 __func__, vi->nid, *ofs, blkaddr); in erofs_read_inode()
40 vi->nid, PTR_ERR(page)); in erofs_read_inode()
45 ifmt = le16_to_cpu(dic->i_format); in erofs_read_inode()
47 vi->datalayout = erofs_inode_datalayout(ifmt); in erofs_read_inode()
48 if (vi->datalayout >= EROFS_INODE_DATALAYOUT_MAX) { in erofs_read_inode()
49 erofs_err(inode->i_sb, "unsupported datalayout %u of nid %llu", in erofs_read_inode()
50 vi->datalayout, vi->nid); in erofs_read_inode()
51 err = -EOPNOTSUPP; in erofs_read_inode()
57 vi->inode_isize = sizeof(struct erofs_inode_extended); in erofs_read_inode()
59 if (*ofs + vi->inode_isize <= PAGE_SIZE) { in erofs_read_inode()
60 *ofs += vi->inode_isize; in erofs_read_inode()
61 die = (struct erofs_inode_extended *)dic; in erofs_read_inode()
63 const unsigned int gotten = PAGE_SIZE - *ofs; in erofs_read_inode()
65 copied = kmalloc(vi->inode_isize, GFP_NOFS); in erofs_read_inode()
67 err = -ENOMEM; in erofs_read_inode()
77 vi->nid, PTR_ERR(page)); in erofs_read_inode()
81 *ofs = vi->inode_isize - gotten; in erofs_read_inode()
83 die = copied; in erofs_read_inode()
85 vi->xattr_isize = erofs_xattr_ibody_size(die->i_xattr_icount); in erofs_read_inode()
87 inode->i_mode = le16_to_cpu(die->i_mode); in erofs_read_inode()
88 switch (inode->i_mode & S_IFMT) { in erofs_read_inode()
92 vi->raw_blkaddr = le32_to_cpu(die->i_u.raw_blkaddr); in erofs_read_inode()
96 inode->i_rdev = in erofs_read_inode()
97 new_decode_dev(le32_to_cpu(die->i_u.rdev)); in erofs_read_inode()
101 inode->i_rdev = 0; in erofs_read_inode()
106 i_uid_write(inode, le32_to_cpu(die->i_uid)); in erofs_read_inode()
107 i_gid_write(inode, le32_to_cpu(die->i_gid)); in erofs_read_inode()
108 set_nlink(inode, le32_to_cpu(die->i_nlink)); in erofs_read_inode()
111 inode->i_ctime.tv_sec = le64_to_cpu(die->i_ctime); in erofs_read_inode()
112 inode->i_ctime.tv_nsec = le32_to_cpu(die->i_ctime_nsec); in erofs_read_inode()
114 inode->i_size = le64_to_cpu(die->i_size); in erofs_read_inode()
117 if (erofs_inode_is_data_compressed(vi->datalayout)) in erofs_read_inode()
118 nblks = le32_to_cpu(die->i_u.compressed_blocks); in erofs_read_inode()
123 vi->inode_isize = sizeof(struct erofs_inode_compact); in erofs_read_inode()
124 *ofs += vi->inode_isize; in erofs_read_inode()
125 vi->xattr_isize = erofs_xattr_ibody_size(dic->i_xattr_icount); in erofs_read_inode()
127 inode->i_mode = le16_to_cpu(dic->i_mode); in erofs_read_inode()
128 switch (inode->i_mode & S_IFMT) { in erofs_read_inode()
132 vi->raw_blkaddr = le32_to_cpu(dic->i_u.raw_blkaddr); in erofs_read_inode()
136 inode->i_rdev = in erofs_read_inode()
137 new_decode_dev(le32_to_cpu(dic->i_u.rdev)); in erofs_read_inode()
141 inode->i_rdev = 0; in erofs_read_inode()
146 i_uid_write(inode, le16_to_cpu(dic->i_uid)); in erofs_read_inode()
147 i_gid_write(inode, le16_to_cpu(dic->i_gid)); in erofs_read_inode()
148 set_nlink(inode, le16_to_cpu(dic->i_nlink)); in erofs_read_inode()
151 inode->i_ctime.tv_sec = sbi->build_time; in erofs_read_inode()
152 inode->i_ctime.tv_nsec = sbi->build_time_nsec; in erofs_read_inode()
154 inode->i_size = le32_to_cpu(dic->i_size); in erofs_read_inode()
155 if (erofs_inode_is_data_compressed(vi->datalayout)) in erofs_read_inode()
156 nblks = le32_to_cpu(dic->i_u.compressed_blocks); in erofs_read_inode()
159 erofs_err(inode->i_sb, in erofs_read_inode()
160 "unsupported on-disk inode version %u of nid %llu", in erofs_read_inode()
161 erofs_inode_version(ifmt), vi->nid); in erofs_read_inode()
162 err = -EOPNOTSUPP; in erofs_read_inode()
166 inode->i_mtime.tv_sec = inode->i_ctime.tv_sec; in erofs_read_inode()
167 inode->i_atime.tv_sec = inode->i_ctime.tv_sec; in erofs_read_inode()
168 inode->i_mtime.tv_nsec = inode->i_ctime.tv_nsec; in erofs_read_inode()
169 inode->i_atime.tv_nsec = inode->i_ctime.tv_nsec; in erofs_read_inode()
173 inode->i_blocks = roundup(inode->i_size, EROFS_BLKSIZ) >> 9; in erofs_read_inode()
175 inode->i_blocks = nblks << LOG_SECTORS_PER_BLOCK; in erofs_read_inode()
179 erofs_err(inode->i_sb, "bogus i_mode (%o) @ nid %llu", in erofs_read_inode()
180 inode->i_mode, vi->nid); in erofs_read_inode()
181 err = -EFSCORRUPTED; in erofs_read_inode()
197 if (vi->datalayout != EROFS_INODE_FLAT_INLINE || in erofs_fill_symlink()
198 inode->i_size >= PAGE_SIZE) { in erofs_fill_symlink()
199 inode->i_op = &erofs_symlink_iops; in erofs_fill_symlink()
203 lnk = kmalloc(inode->i_size + 1, GFP_KERNEL); in erofs_fill_symlink()
205 return -ENOMEM; in erofs_fill_symlink()
207 m_pofs += vi->xattr_isize; in erofs_fill_symlink()
209 if (m_pofs + inode->i_size > PAGE_SIZE) { in erofs_fill_symlink()
211 erofs_err(inode->i_sb, in erofs_fill_symlink()
213 vi->nid); in erofs_fill_symlink()
215 return -EFSCORRUPTED; in erofs_fill_symlink()
218 memcpy(lnk, data + m_pofs, inode->i_size); in erofs_fill_symlink()
219 lnk[inode->i_size] = '\0'; in erofs_fill_symlink()
221 inode->i_link = lnk; in erofs_fill_symlink()
222 inode->i_op = &erofs_fast_symlink_iops; in erofs_fill_symlink()
241 switch (inode->i_mode & S_IFMT) { in erofs_fill_inode()
243 inode->i_op = &erofs_generic_iops; in erofs_fill_inode()
244 inode->i_fop = &generic_ro_fops; in erofs_fill_inode()
247 inode->i_op = &erofs_dir_iops; in erofs_fill_inode()
248 inode->i_fop = &erofs_dir_fops; in erofs_fill_inode()
260 inode->i_op = &erofs_generic_iops; in erofs_fill_inode()
261 init_special_inode(inode, inode->i_mode, inode->i_rdev); in erofs_fill_inode()
264 err = -EFSCORRUPTED; in erofs_fill_inode()
268 if (erofs_inode_is_data_compressed(vi->datalayout)) { in erofs_fill_inode()
272 inode->i_mapping->a_ops = &erofs_raw_access_aops; in erofs_fill_inode()
282 * we should do more for 32-bit platform to find the right inode.
288 return EROFS_I(inode)->nid == nid; in erofs_ilookup_test_actor()
295 inode->i_ino = erofs_inode_hash(nid); in erofs_iget_set_actor()
315 return ERR_PTR(-ENOMEM); in erofs_iget()
317 if (inode->i_state & I_NEW) { in erofs_iget()
321 vi->nid = nid; in erofs_iget()
337 struct inode *const inode = d_inode(path->dentry); in erofs_getattr()
339 if (erofs_inode_is_data_compressed(EROFS_I(inode)->datalayout)) in erofs_getattr()
340 stat->attributes |= STATX_ATTR_COMPRESSED; in erofs_getattr()
342 stat->attributes |= STATX_ATTR_IMMUTABLE; in erofs_getattr()
343 stat->attributes_mask |= (STATX_ATTR_COMPRESSED | in erofs_getattr()