Hello,

I think that I have found obsolete code in mkfs.nilfs2. And I prepare a patch 
which fixes the bug with block info initialization in segment summary for the 
case of DAT file.

With the best regards,
Vyacheslav Dubeyko.
--
From: Vyacheslav Dubeyko <[email protected]>
Subject: [PATCH 1/1] mkfs.nilfs2: initialize block info array for DAT file by 
nilfs_binfo_dat structure

Segment summary block begins from segment summary header (nilfs_segment_summary 
structure). It follows array of file information items (nilfs_finfo structure) 
after it. And after each file information item follows array of block 
information items (nilfs_binfo union). The block information item can be 
nilfs_binfo_v structure (information for the block to which a virtual block 
number is assigned) or nilfs_binfo_dat structure (information for the block 
which belongs to the DAT file).

Current state of mkfs.nilfs2 code initializes block information items as 
sizeof(__le64) for the DAT file case. But driver code expects greater structure 
in size because it operates by bi_level field for the case of DAT file. The 
patch uses nilfs_binfo_dat structure instead of __le64 during creation of block 
information items for DAT file case.

Signed-off-by: Vyacheslav Dubeyko <[email protected]>
---
diff -up nilfs-utils/sbin/mkfs/mkfs.c{.orig,} 
--- nilfs-utils/sbin/mkfs/mkfs.c.orig   2012-05-04 12:30:58.308461058 +0400
+++ nilfs-utils/sbin/mkfs/mkfs.c        2012-05-04 12:32:39.593861721 +0400
@@ -444,7 +444,7 @@ static void increment_segsum_size(struct
                                  unsigned nblocks_in_file, int dat_flag)
 {
        unsigned binfo_size = dat_flag ? 
-               sizeof(__le64) /* offset */ : sizeof(struct nilfs_binfo_v);
+               sizeof(struct nilfs_binfo_dat) : sizeof(struct nilfs_binfo_v);
 
        si->sumbytes = __increment_segsum_size(si->sumbytes,
                                               sizeof(struct nilfs_finfo), 1);
@@ -1240,13 +1240,13 @@ static void update_blocknr(struct nilfs_
        finfo->fi_cno = cpu_to_le64(1);
 
        if (fi->ino == NILFS_DAT_INO) {
-               __le64 *pblkoff;
+               struct nilfs_binfo_dat *pbinfo_dat;
 
                fi->raw_inode->i_bmap[0] = 0;
                for (i = 0; i < fi->nblocks; i++) {
-                       pblkoff = map_segsum_info(start, sum_offset,
-                                                 sizeof(*pblkoff));
-                       *pblkoff = cpu_to_le64(i);
+                       pbinfo_dat = map_segsum_info(start, sum_offset,
+                                                 sizeof(*pbinfo_dat));
+                       pbinfo_dat->bi_blkoff = cpu_to_le64(i);
                        fi->raw_inode->i_bmap[i + 1] =
                                cpu_to_le64(fi->start + i);
                }
--

--
To unsubscribe from this list: send the line "unsubscribe linux-nilfs" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to