nilfs2: insert checkpoint number in segment summary header
authorRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Sat, 10 Apr 2010 08:59:15 +0000 (17:59 +0900)
committerRyusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Mon, 10 May 2010 02:32:31 +0000 (11:32 +0900)
This adds a field to record the latest checkpoint number in the
nilfs_segment_summary structure.  This will help to recover the latest
checkpoint number from logs on disk.  This field is intended for
crucial cases in which super blocks have lost pointer to the latest
log.

Even though this will change the disk format, both backward and
forward compatibility is preserved by a size field prepared in the
segment summary header.

Signed-off-by: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
fs/nilfs2/recovery.c
fs/nilfs2/segbuf.c
fs/nilfs2/segbuf.h
fs/nilfs2/segment.c
include/linux/nilfs2_fs.h

index ba43146f3c309308cfd8505382570906f971ee57..bae2a516b4ee0b6d72277d470747ae92cf40b4c5 100644 (file)
@@ -105,6 +105,8 @@ static void store_segsum_info(struct nilfs_segsum_info *ssi,
 
        ssi->nsumblk = DIV_ROUND_UP(ssi->sumbytes, blocksize);
        ssi->nfileblk = ssi->nblocks - ssi->nsumblk - !!NILFS_SEG_HAS_SR(ssi);
+
+       /* need to verify ->ss_bytes field if read ->ss_cno */
 }
 
 /**
index 9f83bc02593c34afe27b353815f13d923276200d..2e6a2723b8fa56e3c65e3a83af3aa346184ce510 100644 (file)
@@ -134,7 +134,7 @@ int nilfs_segbuf_extend_payload(struct nilfs_segment_buffer *segbuf,
 }
 
 int nilfs_segbuf_reset(struct nilfs_segment_buffer *segbuf, unsigned flags,
-                      time_t ctime)
+                      time_t ctime, __u64 cno)
 {
        int err;
 
@@ -147,6 +147,7 @@ int nilfs_segbuf_reset(struct nilfs_segment_buffer *segbuf, unsigned flags,
        segbuf->sb_sum.sumbytes = sizeof(struct nilfs_segment_summary);
        segbuf->sb_sum.nfinfo = segbuf->sb_sum.nfileblk = 0;
        segbuf->sb_sum.ctime = ctime;
+       segbuf->sb_sum.cno = cno;
        return 0;
 }
 
@@ -172,6 +173,7 @@ void nilfs_segbuf_fill_in_segsum(struct nilfs_segment_buffer *segbuf)
        raw_sum->ss_nfinfo   = cpu_to_le32(segbuf->sb_sum.nfinfo);
        raw_sum->ss_sumbytes = cpu_to_le32(segbuf->sb_sum.sumbytes);
        raw_sum->ss_pad      = 0;
+       raw_sum->ss_cno      = cpu_to_le64(segbuf->sb_sum.cno);
 }
 
 /*
index e21497f61b0cb9e1976eff365679748d92ff9289..fdf1c3b6d6739c6cc76bd451ee8230b573800acf 100644 (file)
@@ -37,6 +37,7 @@
  * @sumbytes: Byte count of segment summary
  * @nfileblk: Total number of file blocks
  * @seg_seq: Segment sequence number
+ * @cno: Checkpoint number
  * @ctime: Creation time
  * @next: Block number of the next full segment
  */
@@ -48,6 +49,7 @@ struct nilfs_segsum_info {
        unsigned long           sumbytes;
        unsigned long           nfileblk;
        u64                     seg_seq;
+       __u64                   cno;
        time_t                  ctime;
        sector_t                next;
 };
@@ -135,7 +137,7 @@ void nilfs_segbuf_map_cont(struct nilfs_segment_buffer *segbuf,
                           struct nilfs_segment_buffer *prev);
 void nilfs_segbuf_set_next_segnum(struct nilfs_segment_buffer *, __u64,
                                  struct the_nilfs *);
-int nilfs_segbuf_reset(struct nilfs_segment_buffer *, unsigned, time_t);
+int nilfs_segbuf_reset(struct nilfs_segment_buffer *, unsigned, time_t, __u64);
 int nilfs_segbuf_extend_segsum(struct nilfs_segment_buffer *);
 int nilfs_segbuf_extend_payload(struct nilfs_segment_buffer *,
                                struct buffer_head **);
index a17bfa193e3f12a353e2bc219fb365590ac37f81..9f50fde0cd06138ec62c5dedb9da2f2cd8e827b6 100644 (file)
@@ -366,7 +366,8 @@ static int nilfs_segctor_reset_segment_buffer(struct nilfs_sc_info *sci)
 
        if (nilfs_doing_gc())
                flags = NILFS_SS_GC;
-       err = nilfs_segbuf_reset(segbuf, flags, sci->sc_seg_ctime);
+       err = nilfs_segbuf_reset(segbuf, flags, sci->sc_seg_ctime,
+                                sci->sc_sbi->s_nilfs->ns_cno);
        if (unlikely(err))
                return err;
 
index f960e1d264e863286aecb5098fc46271e722143f..6505c00f1fc1c73db98a177d5d7d8c9cf90b0afc 100644 (file)
@@ -377,6 +377,7 @@ union nilfs_binfo {
  * @ss_nfinfo: number of finfo structures
  * @ss_sumbytes: total size of segment summary in bytes
  * @ss_pad: padding
+ * @ss_cno: checkpoint number
  */
 struct nilfs_segment_summary {
        __le32 ss_datasum;
@@ -391,6 +392,7 @@ struct nilfs_segment_summary {
        __le32 ss_nfinfo;
        __le32 ss_sumbytes;
        __le32 ss_pad;
+       __le64 ss_cno;
        /* array of finfo structures */
 };