Whamcloud - gitweb
AOSP: build mke2fs for windows using android mingw library
[tools/e2fsprogs.git] / lib / ext2fs / inline_data.c
index 7eb8b94..7215c51 100644 (file)
@@ -42,11 +42,6 @@ static errcode_t ext2fs_inline_data_ea_set(struct ext2_inline_data *data)
 
        retval = ext2fs_xattr_set(handle, "system.data",
                                  data->ea_data, data->ea_size);
-       if (retval)
-               goto err;
-
-       retval = ext2fs_xattrs_write(handle);
-
 err:
        (void) ext2fs_xattrs_close(&handle);
        return retval;
@@ -85,11 +80,12 @@ err:
 errcode_t ext2fs_inline_data_init(ext2_filsys fs, ext2_ino_t ino)
 {
        struct ext2_inline_data data;
+       char empty[1] = { '\0' };
 
        data.fs = fs;
        data.ino = ino;
        data.ea_size = 0;
-       data.ea_data = "";
+       data.ea_data = empty;
        return ext2fs_inline_data_ea_set(&data);
 }
 
@@ -269,11 +265,6 @@ errcode_t ext2fs_inline_data_ea_remove(ext2_filsys fs, ext2_ino_t ino)
                goto err;
 
        retval = ext2fs_xattr_remove(handle, "system.data");
-       if (retval)
-               goto err;
-
-       retval = ext2fs_xattrs_write(handle);
-
 err:
        (void) ext2fs_xattrs_close(&handle);
        return retval;
@@ -285,17 +276,16 @@ static errcode_t ext2fs_inline_data_convert_dir(ext2_filsys fs, ext2_ino_t ino,
        struct ext2_dir_entry *dir, *dir2;
        struct ext2_dir_entry_tail *t;
        errcode_t retval;
-       unsigned int offset, rec_len;
+       int offset;
+       unsigned int rec_len;
        int csum_size = 0;
        int filetype = 0;
 
-       if (EXT2_HAS_RO_COMPAT_FEATURE(fs->super,
-                                      EXT4_FEATURE_RO_COMPAT_METADATA_CSUM))
+       if (ext2fs_has_feature_metadata_csum(fs->super))
                csum_size = sizeof(struct ext2_dir_entry_tail);
 
        /* Create '.' and '..' */
-       if (EXT2_HAS_INCOMPAT_FEATURE(fs->super,
-                                     EXT2_FEATURE_INCOMPAT_FILETYPE))
+       if (ext2fs_has_feature_filetype(fs->super))
                filetype = EXT2_FT_DIR;
 
        /*
@@ -321,7 +311,7 @@ static errcode_t ext2fs_inline_data_convert_dir(ext2_filsys fs, ext2_ino_t ino,
        dir->name[1] = '.';
 
        /*
-        * Ajust the last rec_len
+        * Adjust the last rec_len
         */
        offset = EXT2_DIR_REC_LEN(1) + EXT2_DIR_REC_LEN(2);
        dir = (struct ext2_dir_entry *) (bbuf + offset);
@@ -384,7 +374,7 @@ ext2fs_inline_data_dir_expand(ext2_filsys fs, ext2_ino_t ino,
                goto errout;
 
        /* Update inode */
-       if (EXT2_HAS_INCOMPAT_FEATURE(fs->super, EXT3_FEATURE_INCOMPAT_EXTENTS))
+       if (ext2fs_has_feature_extents(fs->super))
                inode->i_flags |= EXT4_EXTENTS_FL;
        inode->i_flags &= ~EXT4_INLINE_DATA_FL;
        retval = ext2fs_iblk_add_blocks(fs, inode, 1);
@@ -412,19 +402,15 @@ ext2fs_inline_data_file_expand(ext2_filsys fs, ext2_ino_t ino,
        errcode_t retval;
 
        /* Update inode */
-       if (EXT2_HAS_INCOMPAT_FEATURE(fs->super,
-                                     EXT3_FEATURE_INCOMPAT_EXTENTS)) {
-               int i;
-               struct ext3_extent_header *eh;
-
-               eh = (struct ext3_extent_header *) &inode->i_block[0];
-               eh->eh_depth = 0;
-               eh->eh_entries = 0;
-               eh->eh_magic = EXT3_EXT_MAGIC;
-               i = (sizeof(inode->i_block) - sizeof(*eh)) /
-                       sizeof(struct ext3_extent);
-               eh->eh_max = ext2fs_cpu_to_le16(i);
-               inode->i_flags |= EXT4_EXTENTS_FL;
+       memset(inode->i_block, 0, sizeof(inode->i_block));
+       if (ext2fs_has_feature_extents(fs->super)) {
+               ext2_extent_handle_t handle;
+
+               inode->i_flags &= ~EXT4_EXTENTS_FL;
+               retval = ext2fs_extent_open2(fs, ino, inode, &handle);
+               if (retval)
+                       return retval;
+               ext2fs_extent_free(handle);
        }
        inode->i_flags &= ~EXT4_INLINE_DATA_FL;
        inode->i_size = 0;
@@ -535,7 +521,7 @@ errcode_t ext2fs_inline_data_get(ext2_filsys fs, ext2_ino_t ino,
 
        memcpy(buf, (void *)inode->i_block, EXT4_MIN_INLINE_DATA_SIZE);
        if (data.ea_size > 0)
-               memcpy(buf + EXT4_MIN_INLINE_DATA_SIZE,
+               memcpy((char *) buf + EXT4_MIN_INLINE_DATA_SIZE,
                       data.ea_data, data.ea_size);
 
        if (size)
@@ -561,9 +547,6 @@ errcode_t ext2fs_inline_data_set(ext2_filsys fs, ext2_ino_t ino,
        }
 
        if (size <= EXT4_MIN_INLINE_DATA_SIZE) {
-               retval = ext2fs_inline_data_ea_remove(fs, ino);
-               if (retval)
-                       return retval;
                memcpy((void *)inode->i_block, buf, size);
                return ext2fs_write_inode(fs, ino, inode);
        }
@@ -591,8 +574,11 @@ errcode_t ext2fs_inline_data_set(ext2_filsys fs, ext2_ino_t ino,
                return retval;
        data.fs = fs;
        data.ino = ino;
-       data.ea_size = size - EXT4_MIN_INLINE_DATA_SIZE;
-       data.ea_data = buf + EXT4_MIN_INLINE_DATA_SIZE;
+       if (size > EXT4_MIN_INLINE_DATA_SIZE)
+               data.ea_size = size - EXT4_MIN_INLINE_DATA_SIZE;
+       else
+               data.ea_size = 0;
+       data.ea_data = (char *) buf + EXT4_MIN_INLINE_DATA_SIZE;
        return ext2fs_inline_data_ea_set(&data);
 }
 
@@ -613,12 +599,11 @@ static errcode_t file_test(ext2_filsys fs)
        errcode_t retval;
        size_t size;
        char *buf = 0, *cmpbuf = 0;
-       int i;
 
        /* create a new file */
        retval = ext2fs_new_inode(fs, 2, 010755, 0, &newfile);
        if (retval) {
-               com_err("file_test", retval, "while allocaing a new inode");
+               com_err("file_test", retval, "while allocating a new inode");
                return 1;
        }
 
@@ -628,7 +613,7 @@ static errcode_t file_test(ext2_filsys fs)
        inode.i_mode = LINUX_S_IFREG;
        retval = ext2fs_write_new_inode(fs, newfile, &inode);
        if (retval) {
-               com_err("file_test", retval, "while writting a new inode");
+               com_err("file_test", retval, "while writing a new inode");
                return 1;
        }
 
@@ -793,7 +778,6 @@ int main(int argc, char *argv[])
        ext2_filsys             fs;
        struct ext2_super_block param;
        errcode_t               retval;
-       int                     i;
 
        /* setup */
        initialize_ext2_error_table();
@@ -817,13 +801,12 @@ int main(int argc, char *argv[])
        retval = ext2fs_allocate_tables(fs);
        if (retval) {
                com_err("setup", retval,
-                       "while allocating tables for test filesysmte");
+                       "while allocating tables for test filesystem");
                exit(1);
        }
 
        /* initialize inode cache */
        if (!fs->icache) {
-               struct ext2_inode inode;
                ext2_ino_t first_ino = EXT2_FIRST_INO(fs->super);
                int i;
 
@@ -852,6 +835,7 @@ int main(int argc, char *argv[])
                return 1;
        }
        printf("tst_inline_data(DIR): OK\n");
+       ext2fs_free(fs);
 
        return 0;
 }