OSDN Git Service

libext2fs: allow callers to punch a single block
authorDarrick J. Wong <darrick.wong@oracle.com>
Mon, 7 Oct 2013 13:51:20 +0000 (09:51 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 7 Oct 2013 13:51:20 +0000 (09:51 -0400)
The range of blocks to punch is treated as an inclusive range on both
ends, i.e. if start=1 and end=2, both blocks 1 and 2 are punched out.
Thus, start == end means that the caller wishes to punch a single
block.  Remove the check that prevents us from punching a single
block.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
lib/ext2fs/ext2fs.h
lib/ext2fs/punch.c

index 326d5c1..e3920d0 100644 (file)
@@ -1308,6 +1308,10 @@ extern errcode_t ext2fs_check_mount_point(const char *device, int *mount_flags,
                                          char *mtpt, int mtlen);
 
 /* punch.c */
+/*
+ * NOTE: This function removes from an inode the blocks "start", "end", and
+ * every block in between.
+ */
 extern errcode_t ext2fs_punch(ext2_filsys fs, ext2_ino_t ino,
                              struct ext2_inode *inode,
                              char *block_buf, blk64_t start,
index 11c7668..aac1942 100644 (file)
@@ -315,9 +315,6 @@ extern errcode_t ext2fs_punch(ext2_filsys fs, ext2_ino_t ino,
        if (start > end)
                return EINVAL;
 
-       if (start == end)
-               return 0;
-
        /* Read inode structure if necessary */
        if (!inode) {
                retval = ext2fs_read_inode(fs, ino, &inode_buf);
@@ -332,7 +329,7 @@ extern errcode_t ext2fs_punch(ext2_filsys fs, ext2_ino_t ino,
 
                if (start > ~0U)
                        return 0;
-               count = ((end - start) < ~0U) ? (end - start) : ~0U;
+               count = ((end - start + 1) < ~0U) ? (end - start + 1) : ~0U;
                retval = ext2fs_punch_ind(fs, inode, block_buf, 
                                          (blk_t) start, count);
        }