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 --- |