Whamcloud - gitweb
tests: add test for e2fsck of verity file
[tools/e2fsprogs.git] / lib / ext2fs / inline_data.c
index 6260c5f..b62fb67 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);
@@ -413,8 +403,7 @@ ext2fs_inline_data_file_expand(ext2_filsys fs, ext2_ino_t ino,
 
        /* Update inode */
        memset(inode->i_block, 0, sizeof(inode->i_block));
-       if (EXT2_HAS_INCOMPAT_FEATURE(fs->super,
-                                     EXT3_FEATURE_INCOMPAT_EXTENTS)) {
+       if (ext2fs_has_feature_extents(fs->super)) {
                ext2_extent_handle_t handle;
 
                inode->i_flags &= ~EXT4_EXTENTS_FL;
@@ -532,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)
@@ -546,7 +535,10 @@ errcode_t ext2fs_inline_data_set(ext2_filsys fs, ext2_ino_t ino,
                                 void *buf, size_t size)
 {
        struct ext2_inode inode_buf;
-       struct ext2_inline_data data;
+       struct ext2_inline_data data = {
+               .fs = fs,
+               .ino = ino,
+       };
        errcode_t retval;
        size_t free_ea_size, existing_size, free_inode_size;
 
@@ -558,38 +550,35 @@ 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);
+               memcpy((void *)inode->i_block, buf, size);
+       } else {
+               retval = ext2fs_xattr_inode_max_size(fs, ino, &free_ea_size);
                if (retval)
                        return retval;
-               memcpy((void *)inode->i_block, buf, size);
-               return ext2fs_write_inode(fs, ino, inode);
-       }
-
-       retval = ext2fs_xattr_inode_max_size(fs, ino, &free_ea_size);
-       if (retval)
-               return retval;
 
-       retval = ext2fs_inline_data_size(fs, ino, &existing_size);
-       if (retval)
-               return retval;
+               retval = ext2fs_inline_data_size(fs, ino, &existing_size);
+               if (retval)
+                       return retval;
 
-       if (existing_size < EXT4_MIN_INLINE_DATA_SIZE)
-               free_inode_size = EXT4_MIN_INLINE_DATA_SIZE - existing_size;
-       else
-               free_inode_size = 0;
+               if (existing_size < EXT4_MIN_INLINE_DATA_SIZE) {
+                       free_inode_size = EXT4_MIN_INLINE_DATA_SIZE -
+                                         existing_size;
+               } else {
+                       free_inode_size = 0;
+               }
 
-       if (size != existing_size &&
-           size > existing_size + free_ea_size + free_inode_size)
-               return EXT2_ET_INLINE_DATA_NO_SPACE;
+               if (size != existing_size &&
+                   size > existing_size + free_ea_size + free_inode_size)
+                       return EXT2_ET_INLINE_DATA_NO_SPACE;
 
-       memcpy((void *)inode->i_block, buf, EXT4_MIN_INLINE_DATA_SIZE);
+               memcpy((void *)inode->i_block, buf, EXT4_MIN_INLINE_DATA_SIZE);
+               if (size > EXT4_MIN_INLINE_DATA_SIZE)
+                       data.ea_size = size - EXT4_MIN_INLINE_DATA_SIZE;
+               data.ea_data = (char *) buf + EXT4_MIN_INLINE_DATA_SIZE;
+       }
        retval = ext2fs_write_inode(fs, ino, inode);
        if (retval)
                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;
        return ext2fs_inline_data_ea_set(&data);
 }
 
@@ -614,7 +603,7 @@ static errcode_t file_test(ext2_filsys fs)
        /* 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;
        }
 
@@ -624,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;
        }
 
@@ -704,7 +693,7 @@ static errcode_t dir_test(ext2_filsys fs)
        const char *parent_name = "test";
        ext2_ino_t parent, dir, tmp;
        errcode_t retval;
-       char dirname[PATH_MAX];
+       char dirname[32];
        int i;
 
        retval = ext2fs_mkdir(fs, 11, 11, stub_name);
@@ -812,7 +801,7 @@ 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);
        }
 
@@ -846,6 +835,7 @@ int main(int argc, char *argv[])
                return 1;
        }
        printf("tst_inline_data(DIR): OK\n");
+       ext2fs_free(fs);
 
        return 0;
 }