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