segment.c (c45d6002ff7a322022560e9b19ad867b01fec77f) segment.c (677017d196ba2a4cfff13626b951cc9a206b8c7c)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * fs/f2fs/segment.c
4 *
5 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6 * http://www.samsung.com/
7 */
8#include <linux/fs.h>

--- 274 unchanged lines hidden (view full) ---

283 return err;
284}
285
286void f2fs_drop_inmem_pages_all(struct f2fs_sb_info *sbi, bool gc_failure)
287{
288 struct list_head *head = &sbi->inode_list[ATOMIC_FILE];
289 struct inode *inode;
290 struct f2fs_inode_info *fi;
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * fs/f2fs/segment.c
4 *
5 * Copyright (c) 2012 Samsung Electronics Co., Ltd.
6 * http://www.samsung.com/
7 */
8#include <linux/fs.h>

--- 274 unchanged lines hidden (view full) ---

283 return err;
284}
285
286void f2fs_drop_inmem_pages_all(struct f2fs_sb_info *sbi, bool gc_failure)
287{
288 struct list_head *head = &sbi->inode_list[ATOMIC_FILE];
289 struct inode *inode;
290 struct f2fs_inode_info *fi;
291 unsigned int count = sbi->atomic_files;
292 unsigned int looped = 0;
291next:
292 spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
293 if (list_empty(head)) {
294 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
295 return;
296 }
297 fi = list_first_entry(head, struct f2fs_inode_info, inmem_ilist);
298 inode = igrab(&fi->vfs_inode);
293next:
294 spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
295 if (list_empty(head)) {
296 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
297 return;
298 }
299 fi = list_first_entry(head, struct f2fs_inode_info, inmem_ilist);
300 inode = igrab(&fi->vfs_inode);
301 if (inode)
302 list_move_tail(&fi->inmem_ilist, head);
299 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
300
301 if (inode) {
302 if (gc_failure) {
303 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
304
305 if (inode) {
306 if (gc_failure) {
303 if (fi->i_gc_failures[GC_FAILURE_ATOMIC])
304 goto drop;
305 goto skip;
307 if (!fi->i_gc_failures[GC_FAILURE_ATOMIC])
308 goto skip;
306 }
309 }
307drop:
308 set_inode_flag(inode, FI_ATOMIC_REVOKE_REQUEST);
309 f2fs_drop_inmem_pages(inode);
310 set_inode_flag(inode, FI_ATOMIC_REVOKE_REQUEST);
311 f2fs_drop_inmem_pages(inode);
312skip:
310 iput(inode);
311 }
313 iput(inode);
314 }
312skip:
313 congestion_wait(BLK_RW_ASYNC, HZ/50);
314 cond_resched();
315 congestion_wait(BLK_RW_ASYNC, HZ/50);
316 cond_resched();
317 if (gc_failure) {
318 if (++looped >= count)
319 return;
320 }
315 goto next;
316}
317
318void f2fs_drop_inmem_pages(struct inode *inode)
319{
320 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
321 struct f2fs_inode_info *fi = F2FS_I(inode);
322
323 while (!list_empty(&fi->inmem_pages)) {
324 mutex_lock(&fi->inmem_lock);
325 __revoke_inmem_pages(inode, &fi->inmem_pages,
326 true, false, true);
327 mutex_unlock(&fi->inmem_lock);
328 }
329
321 goto next;
322}
323
324void f2fs_drop_inmem_pages(struct inode *inode)
325{
326 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
327 struct f2fs_inode_info *fi = F2FS_I(inode);
328
329 while (!list_empty(&fi->inmem_pages)) {
330 mutex_lock(&fi->inmem_lock);
331 __revoke_inmem_pages(inode, &fi->inmem_pages,
332 true, false, true);
333 mutex_unlock(&fi->inmem_lock);
334 }
335
330 clear_inode_flag(inode, FI_ATOMIC_FILE);
331 fi->i_gc_failures[GC_FAILURE_ATOMIC] = 0;
332 stat_dec_atomic_write(inode);
333
334 spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
335 if (!list_empty(&fi->inmem_ilist))
336 list_del_init(&fi->inmem_ilist);
336 fi->i_gc_failures[GC_FAILURE_ATOMIC] = 0;
337 stat_dec_atomic_write(inode);
338
339 spin_lock(&sbi->inode_lock[ATOMIC_FILE]);
340 if (!list_empty(&fi->inmem_ilist))
341 list_del_init(&fi->inmem_ilist);
342 if (f2fs_is_atomic_file(inode)) {
343 clear_inode_flag(inode, FI_ATOMIC_FILE);
344 sbi->atomic_files--;
345 }
337 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
338}
339
340void f2fs_drop_inmem_page(struct inode *inode, struct page *page)
341{
342 struct f2fs_inode_info *fi = F2FS_I(inode);
343 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
344 struct list_head *head = &fi->inmem_pages;

--- 4259 unchanged lines hidden ---
346 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]);
347}
348
349void f2fs_drop_inmem_page(struct inode *inode, struct page *page)
350{
351 struct f2fs_inode_info *fi = F2FS_I(inode);
352 struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
353 struct list_head *head = &fi->inmem_pages;

--- 4259 unchanged lines hidden ---