These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / fs / f2fs / segment.h
index 85d7fa7..ee44d34 100644 (file)
@@ -9,6 +9,7 @@
  * published by the Free Software Foundation.
  */
 #include <linux/blkdev.h>
+#include <linux/backing-dev.h>
 
 /* constant macro */
 #define NULL_SEGNO                     ((unsigned int)(~0))
@@ -136,10 +137,12 @@ enum {
 /*
  * BG_GC means the background cleaning job.
  * FG_GC means the on-demand cleaning job.
+ * FORCE_FG_GC means on-demand cleaning job in background.
  */
 enum {
        BG_GC = 0,
-       FG_GC
+       FG_GC,
+       FORCE_FG_GC,
 };
 
 /* for a function parameter to select a victim segment */
@@ -163,6 +166,7 @@ struct seg_entry {
         */
        unsigned short ckpt_valid_blocks;
        unsigned char *ckpt_valid_map;
+       unsigned char *discard_map;
        unsigned char type;             /* segment type like CURSEG_XXX_TYPE */
        unsigned long long mtime;       /* modification time of the segment */
 };
@@ -175,6 +179,15 @@ struct segment_allocation {
        void (*allocate_segment)(struct f2fs_sb_info *, int, bool);
 };
 
+/*
+ * this value is set in page as a private data which indicate that
+ * the page is atomically written, and it is in inmem_pages list.
+ */
+#define ATOMIC_WRITTEN_PAGE            0x0000ffff
+
+#define IS_ATOMIC_WRITTEN_PAGE(page)                   \
+               (page_private(page) == (unsigned long)ATOMIC_WRITTEN_PAGE)
+
 struct inmem_pages {
        struct list_head list;
        struct page *page;
@@ -553,16 +566,15 @@ static inline unsigned short curseg_blkoff(struct f2fs_sb_info *sbi, int type)
        return curseg->next_blkoff;
 }
 
-#ifdef CONFIG_F2FS_CHECK_FS
 static inline void check_seg_range(struct f2fs_sb_info *sbi, unsigned int segno)
 {
-       BUG_ON(segno > TOTAL_SEGS(sbi) - 1);
+       f2fs_bug_on(sbi, segno > TOTAL_SEGS(sbi) - 1);
 }
 
 static inline void verify_block_addr(struct f2fs_sb_info *sbi, block_t blk_addr)
 {
-       BUG_ON(blk_addr < SEG0_BLKADDR(sbi));
-       BUG_ON(blk_addr >= MAX_BLKADDR(sbi));
+       f2fs_bug_on(sbi, blk_addr < SEG0_BLKADDR(sbi)
+                                       || blk_addr >= MAX_BLKADDR(sbi));
 }
 
 /*
@@ -571,16 +583,11 @@ static inline void verify_block_addr(struct f2fs_sb_info *sbi, block_t blk_addr)
 static inline void check_block_count(struct f2fs_sb_info *sbi,
                int segno, struct f2fs_sit_entry *raw_sit)
 {
+#ifdef CONFIG_F2FS_CHECK_FS
        bool is_valid  = test_bit_le(0, raw_sit->valid_map) ? true : false;
        int valid_blocks = 0;
        int cur_pos = 0, next_pos;
 
-       /* check segment usage */
-       BUG_ON(GET_SIT_VBLOCKS(raw_sit) > sbi->blocks_per_seg);
-
-       /* check boundary of a given segment number */
-       BUG_ON(segno > TOTAL_SEGS(sbi) - 1);
-
        /* check bitmap with valid block count */
        do {
                if (is_valid) {
@@ -596,35 +603,11 @@ static inline void check_block_count(struct f2fs_sb_info *sbi,
                is_valid = !is_valid;
        } while (cur_pos < sbi->blocks_per_seg);
        BUG_ON(GET_SIT_VBLOCKS(raw_sit) != valid_blocks);
-}
-#else
-static inline void check_seg_range(struct f2fs_sb_info *sbi, unsigned int segno)
-{
-       if (segno > TOTAL_SEGS(sbi) - 1)
-               set_sbi_flag(sbi, SBI_NEED_FSCK);
-}
-
-static inline void verify_block_addr(struct f2fs_sb_info *sbi, block_t blk_addr)
-{
-       if (blk_addr < SEG0_BLKADDR(sbi) || blk_addr >= MAX_BLKADDR(sbi))
-               set_sbi_flag(sbi, SBI_NEED_FSCK);
-}
-
-/*
- * Summary block is always treated as an invalid block
- */
-static inline void check_block_count(struct f2fs_sb_info *sbi,
-               int segno, struct f2fs_sit_entry *raw_sit)
-{
-       /* check segment usage */
-       if (GET_SIT_VBLOCKS(raw_sit) > sbi->blocks_per_seg)
-               set_sbi_flag(sbi, SBI_NEED_FSCK);
-
-       /* check boundary of a given segment number */
-       if (segno > TOTAL_SEGS(sbi) - 1)
-               set_sbi_flag(sbi, SBI_NEED_FSCK);
-}
 #endif
+       /* check segment usage, and check boundary of a given segment number */
+       f2fs_bug_on(sbi, GET_SIT_VBLOCKS(raw_sit) > sbi->blocks_per_seg
+                                       || segno > TOTAL_SEGS(sbi) - 1);
+}
 
 static inline pgoff_t current_sit_addr(struct f2fs_sb_info *sbi,
                                                unsigned int start)
@@ -713,7 +696,7 @@ static inline unsigned int max_hw_blocks(struct f2fs_sb_info *sbi)
  */
 static inline int nr_pages_to_skip(struct f2fs_sb_info *sbi, int type)
 {
-       if (sbi->sb->s_bdi->dirty_exceeded)
+       if (sbi->sb->s_bdi->wb.dirty_exceeded)
                return 0;
 
        if (type == DATA)