segment.c (5b0e95398e2bcc18e871758221cc712be4a0a39a) | segment.c (2ef79ecb5e906d87475d3e0c49b22425499a89f3) |
---|---|
1/* 2 * fs/f2fs/segment.c 3 * 4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 5 * http://www.samsung.com/ 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as --- 259 unchanged lines hidden (view full) --- 268 269 list_del(&cur->list); 270 kmem_cache_free(inmem_entry_slab, cur); 271 dec_page_count(F2FS_I_SB(inode), F2FS_INMEM_PAGES); 272 } 273 return err; 274} 275 | 1/* 2 * fs/f2fs/segment.c 3 * 4 * Copyright (c) 2012 Samsung Electronics Co., Ltd. 5 * http://www.samsung.com/ 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as --- 259 unchanged lines hidden (view full) --- 268 269 list_del(&cur->list); 270 kmem_cache_free(inmem_entry_slab, cur); 271 dec_page_count(F2FS_I_SB(inode), F2FS_INMEM_PAGES); 272 } 273 return err; 274} 275 |
276void drop_inmem_pages_all(struct f2fs_sb_info *sbi) | 276void drop_inmem_pages_all(struct f2fs_sb_info *sbi, bool gc_failure) |
277{ 278 struct list_head *head = &sbi->inode_list[ATOMIC_FILE]; 279 struct inode *inode; 280 struct f2fs_inode_info *fi; 281next: 282 spin_lock(&sbi->inode_lock[ATOMIC_FILE]); 283 if (list_empty(head)) { 284 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]); 285 return; 286 } 287 fi = list_first_entry(head, struct f2fs_inode_info, inmem_ilist); 288 inode = igrab(&fi->vfs_inode); 289 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]); 290 291 if (inode) { | 277{ 278 struct list_head *head = &sbi->inode_list[ATOMIC_FILE]; 279 struct inode *inode; 280 struct f2fs_inode_info *fi; 281next: 282 spin_lock(&sbi->inode_lock[ATOMIC_FILE]); 283 if (list_empty(head)) { 284 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]); 285 return; 286 } 287 fi = list_first_entry(head, struct f2fs_inode_info, inmem_ilist); 288 inode = igrab(&fi->vfs_inode); 289 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]); 290 291 if (inode) { |
292 if (gc_failure) { 293 if (fi->i_gc_failures[GC_FAILURE_ATOMIC]) 294 goto drop; 295 goto skip; 296 } 297drop: 298 set_inode_flag(inode, FI_ATOMIC_REVOKE_REQUEST); |
|
292 drop_inmem_pages(inode); 293 iput(inode); 294 } | 299 drop_inmem_pages(inode); 300 iput(inode); 301 } |
302skip: |
|
295 congestion_wait(BLK_RW_ASYNC, HZ/50); 296 cond_resched(); 297 goto next; 298} 299 300void drop_inmem_pages(struct inode *inode) 301{ 302 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); 303 struct f2fs_inode_info *fi = F2FS_I(inode); 304 305 mutex_lock(&fi->inmem_lock); 306 __revoke_inmem_pages(inode, &fi->inmem_pages, true, false); 307 spin_lock(&sbi->inode_lock[ATOMIC_FILE]); 308 if (!list_empty(&fi->inmem_ilist)) 309 list_del_init(&fi->inmem_ilist); 310 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]); 311 mutex_unlock(&fi->inmem_lock); 312 313 clear_inode_flag(inode, FI_ATOMIC_FILE); | 303 congestion_wait(BLK_RW_ASYNC, HZ/50); 304 cond_resched(); 305 goto next; 306} 307 308void drop_inmem_pages(struct inode *inode) 309{ 310 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); 311 struct f2fs_inode_info *fi = F2FS_I(inode); 312 313 mutex_lock(&fi->inmem_lock); 314 __revoke_inmem_pages(inode, &fi->inmem_pages, true, false); 315 spin_lock(&sbi->inode_lock[ATOMIC_FILE]); 316 if (!list_empty(&fi->inmem_ilist)) 317 list_del_init(&fi->inmem_ilist); 318 spin_unlock(&sbi->inode_lock[ATOMIC_FILE]); 319 mutex_unlock(&fi->inmem_lock); 320 321 clear_inode_flag(inode, FI_ATOMIC_FILE); |
322 fi->i_gc_failures[GC_FAILURE_ATOMIC] = 0; |
|
314 stat_dec_atomic_write(inode); 315} 316 317void drop_inmem_page(struct inode *inode, struct page *page) 318{ 319 struct f2fs_inode_info *fi = F2FS_I(inode); 320 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); 321 struct list_head *head = &fi->inmem_pages; --- 3762 unchanged lines hidden --- | 323 stat_dec_atomic_write(inode); 324} 325 326void drop_inmem_page(struct inode *inode, struct page *page) 327{ 328 struct f2fs_inode_info *fi = F2FS_I(inode); 329 struct f2fs_sb_info *sbi = F2FS_I_SB(inode); 330 struct list_head *head = &fi->inmem_pages; --- 3762 unchanged lines hidden --- |