inode.c (47e4937a4a7ca4184fd282791dfee76c6799966a) inode.c (8d8a09b093d7073465c824f74caf315c073d3875)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2017-2018 HUAWEI, Inc.
4 * http://www.huawei.com/
5 * Created by Gao Xiang <gaoxiang25@huawei.com>
6 */
7#include "xattr.h"
8

--- 4 unchanged lines hidden (view full) ---

13{
14 struct erofs_vnode *vi = EROFS_V(inode);
15 struct erofs_inode_v1 *v1 = data;
16 const unsigned int advise = le16_to_cpu(v1->i_advise);
17 erofs_blk_t nblks = 0;
18
19 vi->datamode = __inode_data_mapping(advise);
20
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Copyright (C) 2017-2018 HUAWEI, Inc.
4 * http://www.huawei.com/
5 * Created by Gao Xiang <gaoxiang25@huawei.com>
6 */
7#include "xattr.h"
8

--- 4 unchanged lines hidden (view full) ---

13{
14 struct erofs_vnode *vi = EROFS_V(inode);
15 struct erofs_inode_v1 *v1 = data;
16 const unsigned int advise = le16_to_cpu(v1->i_advise);
17 erofs_blk_t nblks = 0;
18
19 vi->datamode = __inode_data_mapping(advise);
20
21 if (unlikely(vi->datamode >= EROFS_INODE_LAYOUT_MAX)) {
21 if (vi->datamode >= EROFS_INODE_LAYOUT_MAX) {
22 errln("unsupported data mapping %u of nid %llu",
23 vi->datamode, vi->nid);
24 DBG_BUGON(1);
25 return -EOPNOTSUPP;
26 }
27
28 if (__inode_version(advise) == EROFS_INODE_LAYOUT_V2) {
29 struct erofs_inode_v2 *v2 = data;

--- 98 unchanged lines hidden (view full) ---

128 /* should be inode inline C */
129 if (!is_inode_flat_inline(inode))
130 return 0;
131
132 /* fast symlink (following ext4) */
133 if (S_ISLNK(inode->i_mode) && inode->i_size < PAGE_SIZE) {
134 char *lnk = erofs_kmalloc(sbi, inode->i_size + 1, GFP_KERNEL);
135
22 errln("unsupported data mapping %u of nid %llu",
23 vi->datamode, vi->nid);
24 DBG_BUGON(1);
25 return -EOPNOTSUPP;
26 }
27
28 if (__inode_version(advise) == EROFS_INODE_LAYOUT_V2) {
29 struct erofs_inode_v2 *v2 = data;

--- 98 unchanged lines hidden (view full) ---

128 /* should be inode inline C */
129 if (!is_inode_flat_inline(inode))
130 return 0;
131
132 /* fast symlink (following ext4) */
133 if (S_ISLNK(inode->i_mode) && inode->i_size < PAGE_SIZE) {
134 char *lnk = erofs_kmalloc(sbi, inode->i_size + 1, GFP_KERNEL);
135
136 if (unlikely(!lnk))
136 if (!lnk)
137 return -ENOMEM;
138
139 m_pofs += vi->inode_isize + vi->xattr_isize;
140
141 /* inline symlink data shouldn't across page boundary as well */
137 return -ENOMEM;
138
139 m_pofs += vi->inode_isize + vi->xattr_isize;
140
141 /* inline symlink data shouldn't across page boundary as well */
142 if (unlikely(m_pofs + inode->i_size > PAGE_SIZE)) {
142 if (m_pofs + inode->i_size > PAGE_SIZE) {
143 kfree(lnk);
144 errln("inline data cross block boundary @ nid %llu",
145 vi->nid);
146 DBG_BUGON(1);
147 return -EFSCORRUPTED;
148 }
149
150 /* get in-page inline data */

--- 112 unchanged lines hidden (view full) ---

263}
264
265struct inode *erofs_iget(struct super_block *sb,
266 erofs_nid_t nid,
267 bool isdir)
268{
269 struct inode *inode = erofs_iget_locked(sb, nid);
270
143 kfree(lnk);
144 errln("inline data cross block boundary @ nid %llu",
145 vi->nid);
146 DBG_BUGON(1);
147 return -EFSCORRUPTED;
148 }
149
150 /* get in-page inline data */

--- 112 unchanged lines hidden (view full) ---

263}
264
265struct inode *erofs_iget(struct super_block *sb,
266 erofs_nid_t nid,
267 bool isdir)
268{
269 struct inode *inode = erofs_iget_locked(sb, nid);
270
271 if (unlikely(!inode))
271 if (!inode)
272 return ERR_PTR(-ENOMEM);
273
274 if (inode->i_state & I_NEW) {
275 int err;
276 struct erofs_vnode *vi = EROFS_V(inode);
277
278 vi->nid = nid;
279
280 err = fill_inode(inode, isdir);
272 return ERR_PTR(-ENOMEM);
273
274 if (inode->i_state & I_NEW) {
275 int err;
276 struct erofs_vnode *vi = EROFS_V(inode);
277
278 vi->nid = nid;
279
280 err = fill_inode(inode, isdir);
281 if (likely(!err))
281 if (!err)
282 unlock_new_inode(inode);
283 else {
284 iget_failed(inode);
285 inode = ERR_PTR(err);
286 }
287 }
288 return inode;
289}

--- 43 unchanged lines hidden ---
282 unlock_new_inode(inode);
283 else {
284 iget_failed(inode);
285 inode = ERR_PTR(err);
286 }
287 }
288 return inode;
289}

--- 43 unchanged lines hidden ---