ref: 869c17132d7266c2a09d791a10e42ff7396028fe
parent: ab3010aeb7aff7581d67866819a1ec74ce36916a
author: root <ngkaho1234@gmail.com>
date: Sun Sep 20 13:17:24 EDT 2015
Revert "Symbolic link support: ext4_fsymlink proposed." This reverts commit ab3010aeb7aff7581d67866819a1ec74ce36916a.
--- a/lwext4/ext4.c
+++ b/lwext4/ext4.c
@@ -1279,30 +1279,6 @@
sblock_end = (f->fpos + size) / block_size;
u = (f->fpos) % block_size;
- /*If the size of symlink is smaller than 60 bytes*/
- if ((ext4_inode_get_mode(&f->mp->fs.sb, ref.inode) & EXT4_INODE_MODE_SOFTLINK)
- == EXT4_INODE_MODE_SOFTLINK
- && f->fsize < sizeof(ref.inode->blocks)
- && !ext4_inode_get_blocks_count(&f->mp->fs.sb, ref.inode)) {
- char *content = (char *)ref.inode->blocks;
- if (f->fpos < f->fsize) {
- r = (u + size > f->fsize)
- ?(f->fsize - u)
- :(size);
- memcpy(buf, content + u, r);
- if (rcnt)
- *rcnt = r;
-
- } else {
- r = 0;
- if (rcnt)
- *rcnt = 0;
-
- }
-
- goto Finish;
- }
-
if (u) {
uint32_t ll = size > (block_size - u) ? (block_size - u) : size;
@@ -1735,109 +1711,6 @@
inode_ref.dirty = true;
ext4_fs_put_inode_ref(&inode_ref);
- EXT4_MP_UNLOCK(mp);
- return r;
-}
-
-static int ext4_fsymlink_set(ext4_file *f, const void *buf, uint32_t size)
-{
- struct ext4_block b;
- struct ext4_inode_ref ref;
- uint32_t sblock, fblock;
- uint32_t block_size;
- int r;
-
- ext4_assert(f && f->mp);
-
- if (!size)
- return EOK;
-
- r = ext4_fs_get_inode_ref(&f->mp->fs, f->inode, &ref);
- if (r != EOK) {
- EXT4_MP_UNLOCK(f->mp);
- return r;
- }
-
- /*Sync file size*/
- block_size = ext4_sb_get_block_size(&f->mp->fs.sb);
- if (size > block_size) {
- r = EINVAL;
- goto Finish;
- }
- r = ext4_ftruncate_no_lock(f, 0);
- if (r != EOK)
- goto Finish;
-
- /*Start write back cache mode.*/
- r = ext4_block_cache_write_back(f->mp->fs.bdev, 1);
- if (r != EOK)
- goto Finish;
-
- /*If the size of symlink is smaller than 60 bytes*/
- if (size < sizeof(ref.inode->blocks)) {
- char *content = (char *)ref.inode->blocks;
- memset(content, 0, sizeof(ref.inode->blocks));
- memcpy(content, buf, size);
- ext4_inode_clear_flag(ref.inode, EXT4_INODE_FLAG_EXTENTS);
- } else {
- ext4_fs_inode_blocks_init(&f->mp->fs, &ref);
- r = ext4_fs_append_inode_block(&ref, &fblock, &sblock);
- if (r != EOK)
- goto Finish;
-
- r = ext4_block_get(f->mp->fs.bdev, &b, fblock);
- if (r != EOK)
- goto Finish;
-
- memcpy(b.data, buf, size);
- b.dirty = true;
- r = ext4_block_set(f->mp->fs.bdev, &b);
- if (r != EOK)
- goto Finish;
-
- }
-
- /*Stop write back cache mode*/
- ext4_block_cache_write_back(f->mp->fs.bdev, 0);
-
- if (r != EOK)
- goto Finish;
-
- ext4_inode_set_size(ref.inode, size);
- ext4_inode_set_mode(&f->mp->fs.sb, ref.inode,
- ext4_inode_get_mode(&f->mp->fs.sb, ref.inode) | EXT4_INODE_MODE_SOFTLINK);
- ref.dirty = true;
-
- f->fsize = size;
- if (f->fpos > size)
- f->fpos = size;
-
-Finish:
- ext4_fs_put_inode_ref(&ref);
- return r;
-}
-
-int ext4_fsymlink(const char *path, const char *target)
-{
- struct ext4_mountpoint *mp = ext4_get_mount(path);
- int r;
- ext4_file f;
- int filetype;
-
- if (!mp)
- return ENOENT;
-
- filetype = EXT4_DIRECTORY_FILETYPE_SYMLINK;
-
- EXT4_MP_LOCK(mp);
- ext4_block_cache_write_back(mp->fs.bdev, 1);
- r = ext4_generic_open2(&f, path, O_RDWR, filetype, 0, 0);
- if (r == EOK)
- r = ext4_fsymlink_set(&f, target, strlen(target));
-
- ext4_fclose(&f);
-
- ext4_block_cache_write_back(mp->fs.bdev, 0);
EXT4_MP_UNLOCK(mp);
return r;
}
--- a/lwext4/ext4.h
+++ b/lwext4/ext4.h
@@ -258,12 +258,6 @@
* @return standard error code */
int ext4_fremove(const char *path);
-/**@brief Create symlink against target
- * @param path path to file
- * @param target path to target
- * @return standard error code */
-int ext4_fsymlink(const char *path, const char *target);
-
/**@brief create a hardlink for a file.
* @param path path to file
* @param hardlink_path path of hardlink
--- a/lwext4/ext4_fs.c
+++ b/lwext4/ext4_fs.c
@@ -613,40 +613,11 @@
return ext4_block_set(ref->fs->bdev, &ref->block);
}
-void ext4_fs_inode_blocks_init(struct ext4_fs *fs, struct ext4_inode_ref *inode_ref)
-{
- int i;
- struct ext4_inode *inode = inode_ref->inode;
-
- for (i = 0; i < EXT4_INODE_BLOCKS; i++)
- inode->blocks[i] = 0;
-
-#if CONFIG_EXTENT_ENABLE
- /* Initialize extents if needed */
- if (ext4_sb_has_feature_incompatible(&fs->sb,
- EXT4_FEATURE_INCOMPAT_EXTENTS)) {
- ext4_inode_set_flag(inode, EXT4_INODE_FLAG_EXTENTS);
-
- /* Initialize extent root header */
- struct ext4_extent_header *header = ext4_inode_get_extent_header(inode);
- ext4_extent_header_set_depth(header, 0);
- ext4_extent_header_set_entries_count(header, 0);
- ext4_extent_header_set_generation(header, 0);
- ext4_extent_header_set_magic(header, EXT4_EXTENT_MAGIC);
-
- uint16_t max_entries = (EXT4_INODE_BLOCKS * sizeof(uint32_t) -
- sizeof(struct ext4_extent_header)) /
- sizeof(struct ext4_extent);
-
- ext4_extent_header_set_max_entries_count(header, max_entries);
- }
-#endif
-}
-
int ext4_fs_alloc_inode(struct ext4_fs *fs, struct ext4_inode_ref *inode_ref,
bool is_directory)
{
/* Check if newly allocated i-node will be a directory */
+ uint32_t i;
bool is_dir;
is_dir = is_directory;
@@ -702,7 +673,30 @@
ext4_inode_set_generation(inode, 0);
/* Reset blocks array */
- ext4_fs_inode_blocks_init(fs, inode_ref);
+ for (i = 0; i < EXT4_INODE_BLOCKS; i++)
+ inode->blocks[i] = 0;
+
+#if CONFIG_EXTENT_ENABLE
+ /* Initialize extents if needed */
+ if (ext4_sb_has_feature_incompatible(&fs->sb,
+ EXT4_FEATURE_INCOMPAT_EXTENTS)) {
+ ext4_inode_set_flag(inode, EXT4_INODE_FLAG_EXTENTS);
+
+ /* Initialize extent root header */
+ struct ext4_extent_header *header =
+ ext4_inode_get_extent_header(inode);
+ ext4_extent_header_set_depth(header, 0);
+ ext4_extent_header_set_entries_count(header, 0);
+ ext4_extent_header_set_generation(header, 0);
+ ext4_extent_header_set_magic(header, EXT4_EXTENT_MAGIC);
+
+ uint16_t max_entries = (EXT4_INODE_BLOCKS * sizeof(uint32_t) -
+ sizeof(struct ext4_extent_header)) /
+ sizeof(struct ext4_extent);
+
+ ext4_extent_header_set_max_entries_count(header, max_entries);
+ }
+#endif
inode_ref->dirty = true;
--- a/lwext4/ext4_fs.h
+++ b/lwext4/ext4_fs.h
@@ -155,13 +155,6 @@
*/
int ext4_fs_free_inode(struct ext4_inode_ref *inode_ref);
-/**@brief Reset blocks field of i-node.
- * @param fs Filesystem to reset blocks field of i-inode on
- * @param inode_ref ref Pointer for inode to be operated on
- */
-void ext4_fs_inode_blocks_init(struct ext4_fs *fs,
- struct ext4_inode_ref *inode_ref);
-
/**@brief Truncate i-node data blocks.
* @param inode_ref I-node to be truncated
* @param new_size New size of inode (must be < current size)