diff options
-rw-r--r-- | fs/f2fs/data.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 91ff93b0b0f4..05fb5c6077b8 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c | |||
@@ -233,18 +233,23 @@ struct page *get_lock_data_page(struct inode *inode, pgoff_t index) | |||
233 | struct page *page; | 233 | struct page *page; |
234 | int err; | 234 | int err; |
235 | 235 | ||
236 | repeat: | ||
237 | page = grab_cache_page(mapping, index); | ||
238 | if (!page) | ||
239 | return ERR_PTR(-ENOMEM); | ||
240 | |||
236 | set_new_dnode(&dn, inode, NULL, NULL, 0); | 241 | set_new_dnode(&dn, inode, NULL, NULL, 0); |
237 | err = get_dnode_of_data(&dn, index, LOOKUP_NODE); | 242 | err = get_dnode_of_data(&dn, index, LOOKUP_NODE); |
238 | if (err) | 243 | if (err) { |
244 | f2fs_put_page(page, 1); | ||
239 | return ERR_PTR(err); | 245 | return ERR_PTR(err); |
246 | } | ||
240 | f2fs_put_dnode(&dn); | 247 | f2fs_put_dnode(&dn); |
241 | 248 | ||
242 | if (dn.data_blkaddr == NULL_ADDR) | 249 | if (dn.data_blkaddr == NULL_ADDR) { |
250 | f2fs_put_page(page, 1); | ||
243 | return ERR_PTR(-ENOENT); | 251 | return ERR_PTR(-ENOENT); |
244 | repeat: | 252 | } |
245 | page = grab_cache_page(mapping, index); | ||
246 | if (!page) | ||
247 | return ERR_PTR(-ENOMEM); | ||
248 | 253 | ||
249 | if (PageUptodate(page)) | 254 | if (PageUptodate(page)) |
250 | return page; | 255 | return page; |