data.c (29583dfcd2dd72c766422bd05c16f06c6b1fb356) | data.c (41e8f85a75fc60e1543e4903428a1b481b672a17) |
---|---|
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * fs/f2fs/data.c 4 * 5 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 6 * http://www.samsung.com/ 7 */ 8#include <linux/fs.h> --- 1192 unchanged lines hidden (view full) --- 1201 dn->data_blkaddr = ei.blk + index - ei.fofs; 1202 return 0; 1203 } 1204 1205 return f2fs_reserve_block(dn, index); 1206} 1207 1208struct page *f2fs_get_read_data_page(struct inode *inode, pgoff_t index, | 1// SPDX-License-Identifier: GPL-2.0 2/* 3 * fs/f2fs/data.c 4 * 5 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 6 * http://www.samsung.com/ 7 */ 8#include <linux/fs.h> --- 1192 unchanged lines hidden (view full) --- 1201 dn->data_blkaddr = ei.blk + index - ei.fofs; 1202 return 0; 1203 } 1204 1205 return f2fs_reserve_block(dn, index); 1206} 1207 1208struct page *f2fs_get_read_data_page(struct inode *inode, pgoff_t index, |
1209 blk_opf_t op_flags, bool for_write) | 1209 blk_opf_t op_flags, bool for_write, 1210 pgoff_t *next_pgofs) |
1210{ 1211 struct address_space *mapping = inode->i_mapping; 1212 struct dnode_of_data dn; 1213 struct page *page; 1214 struct extent_info ei = {0, }; 1215 int err; 1216 1217 page = f2fs_grab_cache_page(mapping, index, for_write); --- 9 unchanged lines hidden (view full) --- 1227 ERROR_INVALID_BLKADDR); 1228 goto put_err; 1229 } 1230 goto got_it; 1231 } 1232 1233 set_new_dnode(&dn, inode, NULL, NULL, 0); 1234 err = f2fs_get_dnode_of_data(&dn, index, LOOKUP_NODE); | 1211{ 1212 struct address_space *mapping = inode->i_mapping; 1213 struct dnode_of_data dn; 1214 struct page *page; 1215 struct extent_info ei = {0, }; 1216 int err; 1217 1218 page = f2fs_grab_cache_page(mapping, index, for_write); --- 9 unchanged lines hidden (view full) --- 1228 ERROR_INVALID_BLKADDR); 1229 goto put_err; 1230 } 1231 goto got_it; 1232 } 1233 1234 set_new_dnode(&dn, inode, NULL, NULL, 0); 1235 err = f2fs_get_dnode_of_data(&dn, index, LOOKUP_NODE); |
1235 if (err) | 1236 if (err) { 1237 if (err == -ENOENT && next_pgofs) 1238 *next_pgofs = f2fs_get_next_page_offset(&dn, index); |
1236 goto put_err; | 1239 goto put_err; |
1240 } |
|
1237 f2fs_put_dnode(&dn); 1238 1239 if (unlikely(dn.data_blkaddr == NULL_ADDR)) { 1240 err = -ENOENT; | 1241 f2fs_put_dnode(&dn); 1242 1243 if (unlikely(dn.data_blkaddr == NULL_ADDR)) { 1244 err = -ENOENT; |
1245 if (next_pgofs) 1246 *next_pgofs = index + 1; |
|
1241 goto put_err; 1242 } 1243 if (dn.data_blkaddr != NEW_ADDR && 1244 !f2fs_is_valid_blkaddr(F2FS_I_SB(inode), 1245 dn.data_blkaddr, 1246 DATA_GENERIC_ENHANCE)) { 1247 err = -EFSCORRUPTED; 1248 f2fs_handle_error(F2FS_I_SB(inode), --- 27 unchanged lines hidden (view full) --- 1276 goto put_err; 1277 return page; 1278 1279put_err: 1280 f2fs_put_page(page, 1); 1281 return ERR_PTR(err); 1282} 1283 | 1247 goto put_err; 1248 } 1249 if (dn.data_blkaddr != NEW_ADDR && 1250 !f2fs_is_valid_blkaddr(F2FS_I_SB(inode), 1251 dn.data_blkaddr, 1252 DATA_GENERIC_ENHANCE)) { 1253 err = -EFSCORRUPTED; 1254 f2fs_handle_error(F2FS_I_SB(inode), --- 27 unchanged lines hidden (view full) --- 1282 goto put_err; 1283 return page; 1284 1285put_err: 1286 f2fs_put_page(page, 1); 1287 return ERR_PTR(err); 1288} 1289 |
1284struct page *f2fs_find_data_page(struct inode *inode, pgoff_t index) | 1290struct page *f2fs_find_data_page(struct inode *inode, pgoff_t index, 1291 pgoff_t *next_pgofs) |
1285{ 1286 struct address_space *mapping = inode->i_mapping; 1287 struct page *page; 1288 1289 page = find_get_page(mapping, index); 1290 if (page && PageUptodate(page)) 1291 return page; 1292 f2fs_put_page(page, 0); 1293 | 1292{ 1293 struct address_space *mapping = inode->i_mapping; 1294 struct page *page; 1295 1296 page = find_get_page(mapping, index); 1297 if (page && PageUptodate(page)) 1298 return page; 1299 f2fs_put_page(page, 0); 1300 |
1294 page = f2fs_get_read_data_page(inode, index, 0, false); | 1301 page = f2fs_get_read_data_page(inode, index, 0, false, next_pgofs); |
1295 if (IS_ERR(page)) 1296 return page; 1297 1298 if (PageUptodate(page)) 1299 return page; 1300 1301 wait_on_page_locked(page); 1302 if (unlikely(!PageUptodate(page))) { --- 9 unchanged lines hidden (view full) --- 1312 * whether this page exists or not. 1313 */ 1314struct page *f2fs_get_lock_data_page(struct inode *inode, pgoff_t index, 1315 bool for_write) 1316{ 1317 struct address_space *mapping = inode->i_mapping; 1318 struct page *page; 1319repeat: | 1302 if (IS_ERR(page)) 1303 return page; 1304 1305 if (PageUptodate(page)) 1306 return page; 1307 1308 wait_on_page_locked(page); 1309 if (unlikely(!PageUptodate(page))) { --- 9 unchanged lines hidden (view full) --- 1319 * whether this page exists or not. 1320 */ 1321struct page *f2fs_get_lock_data_page(struct inode *inode, pgoff_t index, 1322 bool for_write) 1323{ 1324 struct address_space *mapping = inode->i_mapping; 1325 struct page *page; 1326repeat: |
1320 page = f2fs_get_read_data_page(inode, index, 0, for_write); | 1327 page = f2fs_get_read_data_page(inode, index, 0, for_write, NULL); |
1321 if (IS_ERR(page)) 1322 return page; 1323 1324 /* wait for read completion */ 1325 lock_page(page); 1326 if (unlikely(page->mapping != mapping)) { 1327 f2fs_put_page(page, 1); 1328 goto repeat; --- 2125 unchanged lines hidden (view full) --- 3454 3455 /* Look for the block in COW inode first */ 3456 err = __find_data_block(cow_inode, index, blk_addr); 3457 if (err) 3458 return err; 3459 else if (*blk_addr != NULL_ADDR) 3460 return 0; 3461 | 1328 if (IS_ERR(page)) 1329 return page; 1330 1331 /* wait for read completion */ 1332 lock_page(page); 1333 if (unlikely(page->mapping != mapping)) { 1334 f2fs_put_page(page, 1); 1335 goto repeat; --- 2125 unchanged lines hidden (view full) --- 3461 3462 /* Look for the block in COW inode first */ 3463 err = __find_data_block(cow_inode, index, blk_addr); 3464 if (err) 3465 return err; 3466 else if (*blk_addr != NULL_ADDR) 3467 return 0; 3468 |
3469 if (is_inode_flag_set(inode, FI_ATOMIC_REPLACE)) 3470 goto reserve_block; 3471 |
|
3462 /* Look for the block in the original inode */ 3463 err = __find_data_block(inode, index, &ori_blk_addr); 3464 if (err) 3465 return err; 3466 3467reserve_block: 3468 /* Finally, we should reserve a new block in COW inode for the update */ 3469 err = __reserve_data_block(cow_inode, index, blk_addr, node_changed); --- 699 unchanged lines hidden --- | 3472 /* Look for the block in the original inode */ 3473 err = __find_data_block(inode, index, &ori_blk_addr); 3474 if (err) 3475 return err; 3476 3477reserve_block: 3478 /* Finally, we should reserve a new block in COW inode for the update */ 3479 err = __reserve_data_block(cow_inode, index, blk_addr, node_changed); --- 699 unchanged lines hidden --- |