|
@@ -275,7 +275,8 @@ int f2fs_get_block(struct dnode_of_data *dn, pgoff_t index)
|
|
return f2fs_reserve_block(dn, index);
|
|
return f2fs_reserve_block(dn, index);
|
|
}
|
|
}
|
|
|
|
|
|
-struct page *get_read_data_page(struct inode *inode, pgoff_t index, int rw)
|
|
|
|
|
|
+struct page *get_read_data_page(struct inode *inode, pgoff_t index,
|
|
|
|
+ int rw, bool for_write)
|
|
{
|
|
{
|
|
struct address_space *mapping = inode->i_mapping;
|
|
struct address_space *mapping = inode->i_mapping;
|
|
struct dnode_of_data dn;
|
|
struct dnode_of_data dn;
|
|
@@ -292,7 +293,7 @@ struct page *get_read_data_page(struct inode *inode, pgoff_t index, int rw)
|
|
if (f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode))
|
|
if (f2fs_encrypted_inode(inode) && S_ISREG(inode->i_mode))
|
|
return read_mapping_page(mapping, index, NULL);
|
|
return read_mapping_page(mapping, index, NULL);
|
|
|
|
|
|
- page = grab_cache_page(mapping, index);
|
|
|
|
|
|
+ page = f2fs_grab_cache_page(mapping, index, for_write);
|
|
if (!page)
|
|
if (!page)
|
|
return ERR_PTR(-ENOMEM);
|
|
return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
@@ -352,7 +353,7 @@ struct page *find_data_page(struct inode *inode, pgoff_t index)
|
|
return page;
|
|
return page;
|
|
f2fs_put_page(page, 0);
|
|
f2fs_put_page(page, 0);
|
|
|
|
|
|
- page = get_read_data_page(inode, index, READ_SYNC);
|
|
|
|
|
|
+ page = get_read_data_page(inode, index, READ_SYNC, false);
|
|
if (IS_ERR(page))
|
|
if (IS_ERR(page))
|
|
return page;
|
|
return page;
|
|
|
|
|
|
@@ -372,12 +373,13 @@ struct page *find_data_page(struct inode *inode, pgoff_t index)
|
|
* Because, the callers, functions in dir.c and GC, should be able to know
|
|
* Because, the callers, functions in dir.c and GC, should be able to know
|
|
* whether this page exists or not.
|
|
* whether this page exists or not.
|
|
*/
|
|
*/
|
|
-struct page *get_lock_data_page(struct inode *inode, pgoff_t index)
|
|
|
|
|
|
+struct page *get_lock_data_page(struct inode *inode, pgoff_t index,
|
|
|
|
+ bool for_write)
|
|
{
|
|
{
|
|
struct address_space *mapping = inode->i_mapping;
|
|
struct address_space *mapping = inode->i_mapping;
|
|
struct page *page;
|
|
struct page *page;
|
|
repeat:
|
|
repeat:
|
|
- page = get_read_data_page(inode, index, READ_SYNC);
|
|
|
|
|
|
+ page = get_read_data_page(inode, index, READ_SYNC, for_write);
|
|
if (IS_ERR(page))
|
|
if (IS_ERR(page))
|
|
return page;
|
|
return page;
|
|
|
|
|
|
@@ -411,7 +413,7 @@ struct page *get_new_data_page(struct inode *inode,
|
|
struct dnode_of_data dn;
|
|
struct dnode_of_data dn;
|
|
int err;
|
|
int err;
|
|
repeat:
|
|
repeat:
|
|
- page = grab_cache_page(mapping, index);
|
|
|
|
|
|
+ page = f2fs_grab_cache_page(mapping, index, true);
|
|
if (!page) {
|
|
if (!page) {
|
|
/*
|
|
/*
|
|
* before exiting, we should make sure ipage will be released
|
|
* before exiting, we should make sure ipage will be released
|
|
@@ -439,7 +441,7 @@ repeat:
|
|
} else {
|
|
} else {
|
|
f2fs_put_page(page, 1);
|
|
f2fs_put_page(page, 1);
|
|
|
|
|
|
- page = get_read_data_page(inode, index, READ_SYNC);
|
|
|
|
|
|
+ page = get_read_data_page(inode, index, READ_SYNC, true);
|
|
if (IS_ERR(page))
|
|
if (IS_ERR(page))
|
|
goto repeat;
|
|
goto repeat;
|
|
|
|
|