Whamcloud - gitweb
libext2fs: allocate clusters to files in expand_dir.c and mkjournal.c
[tools/e2fsprogs.git] / lib / ext2fs / mkjournal.c
index 6afbbde..de4d51c 100644 (file)
@@ -4,8 +4,8 @@
  * Copyright (C) 2000 Theodore Ts'o.
  *
  * %Begin-Header%
- * This file may be redistributed under the terms of the GNU Public
- * License.
+ * This file may be redistributed under the terms of the GNU Library
+ * General Public License, version 2.
  * %End-Header%
  */
 
@@ -210,32 +210,38 @@ errcode_t ext2fs_zero_blocks(ext2_filsys fs, blk_t blk, int num,
 struct mkjournal_struct {
        int             num_blocks;
        int             newblocks;
-       blk_t           goal;
-       blk_t           blk_to_zero;
+       blk64_t         goal;
+       blk64_t         blk_to_zero;
        int             zero_count;
        char            *buf;
        errcode_t       err;
 };
 
 static int mkjournal_proc(ext2_filsys  fs,
-                          blk_t        *blocknr,
-                          e2_blkcnt_t  blockcnt,
-                          blk_t        ref_block EXT2FS_ATTR((unused)),
-                          int          ref_offset EXT2FS_ATTR((unused)),
-                          void         *priv_data)
+                         blk64_t       *blocknr,
+                         e2_blkcnt_t   blockcnt,
+                         blk64_t       ref_block EXT2FS_ATTR((unused)),
+                         int           ref_offset EXT2FS_ATTR((unused)),
+                         void          *priv_data)
 {
        struct mkjournal_struct *es = (struct mkjournal_struct *) priv_data;
-       blk_t   new_blk;
+       blk64_t new_blk;
        errcode_t       retval;
 
        if (*blocknr) {
                es->goal = *blocknr;
                return 0;
        }
-       retval = ext2fs_new_block(fs, es->goal, 0, &new_blk);
-       if (retval) {
-               es->err = retval;
-               return BLOCK_ABORT;
+       if (blockcnt &&
+           (EXT2FS_B2C(fs, es->goal) == EXT2FS_B2C(fs, es->goal+1)))
+               new_blk = es->goal+1;
+       else {
+               es->goal &= ~EXT2FS_CLUSTER_MASK(fs);
+               retval = ext2fs_new_block2(fs, es->goal, 0, &new_blk);
+               if (retval) {
+                       es->err = retval;
+                       return BLOCK_ABORT;
+               }
        }
        if (blockcnt >= 0)
                es->num_blocks--;
@@ -250,10 +256,10 @@ static int mkjournal_proc(ext2_filsys     fs,
                            (es->zero_count < 1024))
                                es->zero_count++;
                        else {
-                               retval = ext2fs_zero_blocks(fs,
-                                                           es->blk_to_zero,
-                                                           es->zero_count,
-                                                           0, 0);
+                               retval = ext2fs_zero_blocks2(fs,
+                                                            es->blk_to_zero,
+                                                            es->zero_count,
+                                                            0, 0);
                                es->zero_count = 0;
                        }
                }
@@ -284,7 +290,7 @@ static int mkjournal_proc(ext2_filsys       fs,
  * This function creates a journal using direct I/O routines.
  */
 static errcode_t write_journal_inode(ext2_filsys fs, ext2_ino_t journal_ino,
-                                    blk_t size, int flags)
+                                    blk64_t size, int flags)
 {
        char                    *buf;
        dgrp_t                  group, start, end, i, log_flex;
@@ -344,14 +350,14 @@ static errcode_t write_journal_inode(ext2_filsys fs, ext2_ino_t journal_ino,
        es.goal = (fs->super->s_blocks_per_group * group) +
                fs->super->s_first_data_block;
 
-       retval = ext2fs_block_iterate2(fs, journal_ino, BLOCK_FLAG_APPEND,
+       retval = ext2fs_block_iterate3(fs, journal_ino, BLOCK_FLAG_APPEND,
                                       0, mkjournal_proc, &es);
        if (es.err) {
                retval = es.err;
                goto errout;
        }
        if (es.zero_count) {
-               retval = ext2fs_zero_blocks(fs, es.blk_to_zero,
+               retval = ext2fs_zero_blocks2(fs, es.blk_to_zero,
                                            es.zero_count, 0, 0);
                if (retval)
                        goto errout;
@@ -376,6 +382,7 @@ static errcode_t write_journal_inode(ext2_filsys fs, ext2_ino_t journal_ino,
        ext2fs_mark_super_dirty(fs);
 
 errout:
+       ext2fs_zero_blocks2(0, 0, 0, 0, 0);
        ext2fs_free_mem(&buf);
        return retval;
 }