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