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