fs/coredump.c: log if a core dump is aborted due to changed file permissions
[linux-2.6-microblaze.git] / fs / f2fs / segment.c
index 51dc79f..15cc89e 100644 (file)
@@ -186,10 +186,7 @@ void f2fs_register_inmem_page(struct inode *inode, struct page *page)
 {
        struct inmem_pages *new;
 
-       if (PagePrivate(page))
-               set_page_private(page, (unsigned long)ATOMIC_WRITTEN_PAGE);
-       else
-               f2fs_set_page_private(page, ATOMIC_WRITTEN_PAGE);
+       set_page_private_atomic(page);
 
        new = f2fs_kmem_cache_alloc(inmem_entry_slab, GFP_NOFS);
 
@@ -272,9 +269,10 @@ next:
                /* we don't need to invalidate this in the sccessful status */
                if (drop || recover) {
                        ClearPageUptodate(page);
-                       clear_cold_data(page);
+                       clear_page_private_gcing(page);
                }
-               f2fs_clear_page_private(page);
+               detach_page_private(page);
+               set_page_private(page, 0);
                f2fs_put_page(page, 1);
 
                list_del(&cur->list);
@@ -357,7 +355,7 @@ void f2fs_drop_inmem_page(struct inode *inode, struct page *page)
        struct list_head *head = &fi->inmem_pages;
        struct inmem_pages *cur = NULL;
 
-       f2fs_bug_on(sbi, !IS_ATOMIC_WRITTEN_PAGE(page));
+       f2fs_bug_on(sbi, !page_private_atomic(page));
 
        mutex_lock(&fi->inmem_lock);
        list_for_each_entry(cur, head, list) {
@@ -373,9 +371,12 @@ void f2fs_drop_inmem_page(struct inode *inode, struct page *page)
        kmem_cache_free(inmem_entry_slab, cur);
 
        ClearPageUptodate(page);
-       f2fs_clear_page_private(page);
+       clear_page_private_atomic(page);
        f2fs_put_page(page, 0);
 
+       detach_page_private(page);
+       set_page_private(page, 0);
+
        trace_f2fs_commit_inmem_page(page, INMEM_INVALIDATE);
 }
 
@@ -2321,6 +2322,7 @@ void f2fs_invalidate_blocks(struct f2fs_sb_info *sbi, block_t addr)
                return;
 
        invalidate_mapping_pages(META_MAPPING(sbi), addr, addr);
+       f2fs_invalidate_compress_page(sbi, addr);
 
        /* add it into sit main buffer */
        down_write(&sit_i->sentry_lock);
@@ -3289,7 +3291,10 @@ static int __get_segment_type_6(struct f2fs_io_info *fio)
        if (fio->type == DATA) {
                struct inode *inode = fio->page->mapping->host;
 
-               if (is_cold_data(fio->page)) {
+               if (is_inode_flag_set(inode, FI_ALIGNED_WRITE))
+                       return CURSEG_COLD_DATA_PINNED;
+
+               if (page_private_gcing(fio->page)) {
                        if (fio->sbi->am.atgc_enabled &&
                                (fio->io_type == FS_DATA_IO) &&
                                (fio->sbi->gc_mode != GC_URGENT_HIGH))
@@ -3468,9 +3473,11 @@ static void do_write_page(struct f2fs_summary *sum, struct f2fs_io_info *fio)
 reallocate:
        f2fs_allocate_data_block(fio->sbi, fio->page, fio->old_blkaddr,
                        &fio->new_blkaddr, sum, type, fio);
-       if (GET_SEGNO(fio->sbi, fio->old_blkaddr) != NULL_SEGNO)
+       if (GET_SEGNO(fio->sbi, fio->old_blkaddr) != NULL_SEGNO) {
                invalidate_mapping_pages(META_MAPPING(fio->sbi),
                                        fio->old_blkaddr, fio->old_blkaddr);
+               f2fs_invalidate_compress_page(fio->sbi, fio->old_blkaddr);
+       }
 
        /* writeout dirty page into bdev */
        f2fs_submit_page_write(fio);
@@ -3660,6 +3667,7 @@ void f2fs_do_replace_block(struct f2fs_sb_info *sbi, struct f2fs_summary *sum,
        if (GET_SEGNO(sbi, old_blkaddr) != NULL_SEGNO) {
                invalidate_mapping_pages(META_MAPPING(sbi),
                                        old_blkaddr, old_blkaddr);
+               f2fs_invalidate_compress_page(sbi, old_blkaddr);
                if (!from_gc)
                        update_segment_mtime(sbi, old_blkaddr, 0);
                update_sit_entry(sbi, old_blkaddr, -1);
@@ -3919,7 +3927,7 @@ static int restore_curseg_summaries(struct f2fs_sb_info *sbi)
        /* sanity check for summary blocks */
        if (nats_in_cursum(nat_j) > NAT_JOURNAL_ENTRIES ||
                        sits_in_cursum(sit_j) > SIT_JOURNAL_ENTRIES) {
-               f2fs_err(sbi, "invalid journal entries nats %u sits %u\n",
+               f2fs_err(sbi, "invalid journal entries nats %u sits %u",
                         nats_in_cursum(nat_j), sits_in_cursum(sit_j));
                return -EINVAL;
        }
@@ -4682,6 +4690,10 @@ static int sanity_check_curseg(struct f2fs_sb_info *sbi)
                struct seg_entry *se = get_seg_entry(sbi, curseg->segno);
                unsigned int blkofs = curseg->next_blkoff;
 
+               if (f2fs_sb_has_readonly(sbi) &&
+                       i != CURSEG_HOT_DATA && i != CURSEG_HOT_NODE)
+                       continue;
+
                sanity_check_seg_type(sbi, curseg->seg_type);
 
                if (f2fs_test_bit(blkofs, se->cur_valid_map))