]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
Wire ext2fs_bmap2() to use ext2fs_extent_set_bmap()
authorTheodore Ts'o <tytso@mit.edu>
Tue, 27 May 2008 11:00:48 +0000 (07:00 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 2 Jun 2008 22:52:12 +0000 (18:52 -0400)
This commit enables read/write access via the ext2fs_bmap2() interface
for extent-based inodes.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
lib/ext2fs/bmap.c

index ceb352ec6f663b2ce6002ae93f2e0605ac066405..e56a99acb537bcf1939557df004234256ed0aadb 100644 (file)
@@ -160,13 +160,14 @@ errcode_t ext2fs_bmap2(ext2_filsys fs, ext2_ino_t ino, struct ext2_inode *inode,
                struct ext2fs_extent    extent;
                unsigned int            offset;
 
-               if (bmap_flags & BMAP_SET) {
-                       retval = EXT2_ET_EXTENT_NOT_SUPPORTED;
-                       goto done;
-               }
                retval = ext2fs_extent_open(fs, ino, &handle);
                if (retval)
                        goto done;
+               if (bmap_flags & BMAP_SET) {
+                       retval = ext2fs_extent_set_bmap(handle, block,
+                                                       *phys_blk, 0);
+                       goto done;
+               }
                retval = ext2fs_extent_goto(handle, block);
                if (retval) {
                        /* If the extent is not found, return phys_blk = 0 */
@@ -183,6 +184,17 @@ errcode_t ext2fs_bmap2(ext2_filsys fs, ext2_ino_t ino, struct ext2_inode *inode,
                        if (ret_flags && extent.e_flags & EXT2_EXTENT_FLAGS_UNINIT)
                                *ret_flags |= BMAP_RET_UNINIT;
                }
+               if ((*phys_blk == 0) && (bmap_flags & BMAP_ALLOC)) {
+                       retval = ext2fs_alloc_block(fs, b, block_buf, &b);
+                       if (retval)
+                               goto done;
+                       retval = ext2fs_extent_set_bmap(handle, block,
+                                                       (blk64_t) b, 0);
+                       if (retval)
+                               goto done;
+                       blocks_alloc++;
+                       *phys_blk = b;
+               }
                retval = 0;
                goto done;
        }