X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=lib%2Fext2fs%2Finline_data.c;h=7215c5173fe99614e46723a927050bc4bd7e0ad8;hb=0a3d8041892cc53c7ea1414c8dc2b274b9956daa;hp=7eb8b946cd224751d886d3a3f52eca5bddf36a04;hpb=657f508cbf4c2ff180ea086bd7041125ec4e5b61;p=tools%2Fe2fsprogs.git diff --git a/lib/ext2fs/inline_data.c b/lib/ext2fs/inline_data.c index 7eb8b94..7215c51 100644 --- a/lib/ext2fs/inline_data.c +++ b/lib/ext2fs/inline_data.c @@ -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; }