]> git.kernelconcepts.de Git - karo-tx-uboot.git/blobdiff - fs/ext4/ext4fs.c
fs:ext4:write: Initialize cache aligned filename buffer
[karo-tx-uboot.git] / fs / ext4 / ext4fs.c
index 93dcb7e8face83e72adfcd54a5b2a2ff2181eddd..f02c215ccc2e5676dd1c8fd6783b4d582ae32b69 100644 (file)
@@ -40,6 +40,7 @@
 #include <linux/stat.h>
 #include <linux/time.h>
 #include <asm/byteorder.h>
+#include <div64.h>
 #include "ext4_common.h"
 
 int ext4fs_symlinknest;
@@ -196,7 +197,7 @@ int ext4fs_read(char *buf, unsigned len)
        return ext4fs_read_file(ext4fs_file, 0, len, buf);
 }
 
-#if defined(CONFIG_CMD_EXT4_WRITE)
+#if defined(CONFIG_EXT4_WRITE)
 static void ext4fs_update(void)
 {
        short i;
@@ -209,14 +210,14 @@ static void ext4fs_update(void)
 
        /* update block groups */
        for (i = 0; i < fs->no_blkgrp; i++) {
-               fs->gd[i].bg_checksum = ext4fs_checksum_update(i);
-               put_ext4((uint64_t)(fs->gd[i].block_id * fs->blksz),
+               fs->bgd[i].bg_checksum = ext4fs_checksum_update(i);
+               put_ext4((uint64_t)(fs->bgd[i].block_id * fs->blksz),
                         fs->blk_bmaps[i], fs->blksz);
        }
 
        /* update inode table groups */
        for (i = 0; i < fs->no_blkgrp; i++) {
-               put_ext4((uint64_t) (fs->gd[i].inode_id * fs->blksz),
+               put_ext4((uint64_t) (fs->bgd[i].inode_id * fs->blksz),
                         fs->inode_bmaps[i], fs->blksz);
        }
 
@@ -266,7 +267,7 @@ fail:
 
 static void delete_single_indirect_block(struct ext2_inode *inode)
 {
-       struct ext2_block_group *gd = NULL;
+       struct ext2_block_group *bgd = NULL;
        static int prev_bg_bmap_idx = -1;
        long int blknr;
        int remainder;
@@ -280,7 +281,7 @@ static void delete_single_indirect_block(struct ext2_inode *inode)
                return;
        }
        /* get  block group descriptor table */
-       gd = (struct ext2_block_group *)fs->gdtable;
+       bgd = (struct ext2_block_group *)fs->gdtable;
 
        /* deleting the single indirect block associated with inode */
        if (inode->b.blocks.indir_block != 0) {
@@ -295,18 +296,18 @@ static void delete_single_indirect_block(struct ext2_inode *inode)
                                bg_idx--;
                }
                ext4fs_reset_block_bmap(blknr, fs->blk_bmaps[bg_idx], bg_idx);
-               gd[bg_idx].free_blocks++;
+               bgd[bg_idx].free_blocks++;
                fs->sb->free_blocks++;
                /* journal backup */
                if (prev_bg_bmap_idx != bg_idx) {
                        status =
-                           ext4fs_devread(gd[bg_idx].block_id *
+                           ext4fs_devread(bgd[bg_idx].block_id *
                                           fs->sect_perblk, 0, fs->blksz,
                                           journal_buffer);
                        if (status == 0)
                                goto fail;
                        if (ext4fs_log_journal
-                           (journal_buffer, gd[bg_idx].block_id))
+                           (journal_buffer, bgd[bg_idx].block_id))
                                goto fail;
                        prev_bg_bmap_idx = bg_idx;
                }
@@ -326,7 +327,7 @@ static void delete_double_indirect_block(struct ext2_inode *inode)
        unsigned int blk_per_grp = ext4fs_root->sblock.blocks_per_group;
        unsigned int *di_buffer = NULL;
        unsigned int *DIB_start_addr = NULL;
-       struct ext2_block_group *gd = NULL;
+       struct ext2_block_group *bgd = NULL;
        struct ext_filesystem *fs = get_fs();
        char *journal_buffer = zalloc(fs->blksz);
        if (!journal_buffer) {
@@ -334,7 +335,7 @@ static void delete_double_indirect_block(struct ext2_inode *inode)
                return;
        }
        /* get the block group descriptor table */
-       gd = (struct ext2_block_group *)fs->gdtable;
+       bgd = (struct ext2_block_group *)fs->gdtable;
 
        if (inode->b.blocks.double_indir_block != 0) {
                di_buffer = zalloc(fs->blksz);
@@ -362,11 +363,11 @@ static void delete_double_indirect_block(struct ext2_inode *inode)
                        ext4fs_reset_block_bmap(*di_buffer,
                                        fs->blk_bmaps[bg_idx], bg_idx);
                        di_buffer++;
-                       gd[bg_idx].free_blocks++;
+                       bgd[bg_idx].free_blocks++;
                        fs->sb->free_blocks++;
                        /* journal backup */
                        if (prev_bg_bmap_idx != bg_idx) {
-                               status = ext4fs_devread(gd[bg_idx].block_id
+                               status = ext4fs_devread(bgd[bg_idx].block_id
                                                        * fs->sect_perblk, 0,
                                                        fs->blksz,
                                                        journal_buffer);
@@ -374,7 +375,7 @@ static void delete_double_indirect_block(struct ext2_inode *inode)
                                        goto fail;
 
                                if (ext4fs_log_journal(journal_buffer,
-                                                       gd[bg_idx].block_id))
+                                                       bgd[bg_idx].block_id))
                                        goto fail;
                                prev_bg_bmap_idx = bg_idx;
                        }
@@ -391,19 +392,19 @@ static void delete_double_indirect_block(struct ext2_inode *inode)
                                bg_idx--;
                }
                ext4fs_reset_block_bmap(blknr, fs->blk_bmaps[bg_idx], bg_idx);
-               gd[bg_idx].free_blocks++;
+               bgd[bg_idx].free_blocks++;
                fs->sb->free_blocks++;
                /* journal backup */
                if (prev_bg_bmap_idx != bg_idx) {
                        memset(journal_buffer, '\0', fs->blksz);
-                       status = ext4fs_devread(gd[bg_idx].block_id *
+                       status = ext4fs_devread(bgd[bg_idx].block_id *
                                                fs->sect_perblk, 0, fs->blksz,
                                                journal_buffer);
                        if (status == 0)
                                goto fail;
 
                        if (ext4fs_log_journal(journal_buffer,
-                                               gd[bg_idx].block_id))
+                                               bgd[bg_idx].block_id))
                                goto fail;
                        prev_bg_bmap_idx = bg_idx;
                }
@@ -427,7 +428,7 @@ static void delete_triple_indirect_block(struct ext2_inode *inode)
        unsigned int *tib_start_addr = NULL;
        unsigned int *tip_buffer = NULL;
        unsigned int *tipb_start_addr = NULL;
-       struct ext2_block_group *gd = NULL;
+       struct ext2_block_group *bgd = NULL;
        struct ext_filesystem *fs = get_fs();
        char *journal_buffer = zalloc(fs->blksz);
        if (!journal_buffer) {
@@ -435,7 +436,7 @@ static void delete_triple_indirect_block(struct ext2_inode *inode)
                return;
        }
        /* get block group descriptor table */
-       gd = (struct ext2_block_group *)fs->gdtable;
+       bgd = (struct ext2_block_group *)fs->gdtable;
 
        if (inode->b.blocks.triple_indir_block != 0) {
                tigp_buffer = zalloc(fs->blksz);
@@ -477,20 +478,21 @@ static void delete_triple_indirect_block(struct ext2_inode *inode)
                                                        bg_idx);
 
                                tip_buffer++;
-                               gd[bg_idx].free_blocks++;
+                               bgd[bg_idx].free_blocks++;
                                fs->sb->free_blocks++;
                                /* journal backup */
                                if (prev_bg_bmap_idx != bg_idx) {
                                        status =
-                                           ext4fs_devread(gd[bg_idx].block_id *
-                                                          fs->sect_perblk, 0,
-                                                          fs->blksz,
-                                                          journal_buffer);
+                                           ext4fs_devread(
+                                                       bgd[bg_idx].block_id *
+                                                       fs->sect_perblk, 0,
+                                                       fs->blksz,
+                                                       journal_buffer);
                                        if (status == 0)
                                                goto fail;
 
                                        if (ext4fs_log_journal(journal_buffer,
-                                                              gd[bg_idx].
+                                                              bgd[bg_idx].
                                                               block_id))
                                                goto fail;
                                        prev_bg_bmap_idx = bg_idx;
@@ -516,20 +518,20 @@ static void delete_triple_indirect_block(struct ext2_inode *inode)
                                                fs->blk_bmaps[bg_idx], bg_idx);
 
                        tigp_buffer++;
-                       gd[bg_idx].free_blocks++;
+                       bgd[bg_idx].free_blocks++;
                        fs->sb->free_blocks++;
                        /* journal backup */
                        if (prev_bg_bmap_idx != bg_idx) {
                                memset(journal_buffer, '\0', fs->blksz);
                                status =
-                                   ext4fs_devread(gd[bg_idx].block_id *
+                                   ext4fs_devread(bgd[bg_idx].block_id *
                                                   fs->sect_perblk, 0,
                                                   fs->blksz, journal_buffer);
                                if (status == 0)
                                        goto fail;
 
                                if (ext4fs_log_journal(journal_buffer,
-                                                       gd[bg_idx].block_id))
+                                                       bgd[bg_idx].block_id))
                                        goto fail;
                                prev_bg_bmap_idx = bg_idx;
                        }
@@ -546,19 +548,19 @@ static void delete_triple_indirect_block(struct ext2_inode *inode)
                                bg_idx--;
                }
                ext4fs_reset_block_bmap(blknr, fs->blk_bmaps[bg_idx], bg_idx);
-               gd[bg_idx].free_blocks++;
+               bgd[bg_idx].free_blocks++;
                fs->sb->free_blocks++;
                /* journal backup */
                if (prev_bg_bmap_idx != bg_idx) {
                        memset(journal_buffer, '\0', fs->blksz);
-                       status = ext4fs_devread(gd[bg_idx].block_id *
+                       status = ext4fs_devread(bgd[bg_idx].block_id *
                                                fs->sect_perblk, 0, fs->blksz,
                                                journal_buffer);
                        if (status == 0)
                                goto fail;
 
                        if (ext4fs_log_journal(journal_buffer,
-                                               gd[bg_idx].block_id))
+                                               bgd[bg_idx].block_id))
                                goto fail;
                        prev_bg_bmap_idx = bg_idx;
                }
@@ -590,13 +592,13 @@ static int ext4fs_delete_file(int inodeno)
        unsigned int blk_per_grp = ext4fs_root->sblock.blocks_per_group;
        unsigned int inode_per_grp = ext4fs_root->sblock.inodes_per_group;
        struct ext2_inode *inode_buffer = NULL;
-       struct ext2_block_group *gd = NULL;
+       struct ext2_block_group *bgd = NULL;
        struct ext_filesystem *fs = get_fs();
        char *journal_buffer = zalloc(fs->blksz);
        if (!journal_buffer)
                return -ENOMEM;
        /* get the block group descriptor table */
-       gd = (struct ext2_block_group *)fs->gdtable;
+       bgd = (struct ext2_block_group *)fs->gdtable;
        status = ext4fs_read_inode(ext4fs_root, inodeno, &inode);
        if (status == 0)
                goto fail;
@@ -631,19 +633,19 @@ static int ext4fs_delete_file(int inodeno)
                        debug("EXT4_EXTENTS Block releasing %ld: %d\n",
                              blknr, bg_idx);
 
-                       gd[bg_idx].free_blocks++;
+                       bgd[bg_idx].free_blocks++;
                        fs->sb->free_blocks++;
 
                        /* journal backup */
                        if (prev_bg_bmap_idx != bg_idx) {
                                status =
-                                   ext4fs_devread(gd[bg_idx].block_id *
+                                   ext4fs_devread(bgd[bg_idx].block_id *
                                                   fs->sect_perblk, 0,
                                                   fs->blksz, journal_buffer);
                                if (status == 0)
                                        goto fail;
                                if (ext4fs_log_journal(journal_buffer,
-                                                       gd[bg_idx].block_id))
+                                                       bgd[bg_idx].block_id))
                                        goto fail;
                                prev_bg_bmap_idx = bg_idx;
                        }
@@ -676,19 +678,19 @@ static int ext4fs_delete_file(int inodeno)
                                                bg_idx);
                        debug("ActualB releasing %ld: %d\n", blknr, bg_idx);
 
-                       gd[bg_idx].free_blocks++;
+                       bgd[bg_idx].free_blocks++;
                        fs->sb->free_blocks++;
                        /* journal backup */
                        if (prev_bg_bmap_idx != bg_idx) {
                                memset(journal_buffer, '\0', fs->blksz);
-                               status = ext4fs_devread(gd[bg_idx].block_id
+                               status = ext4fs_devread(bgd[bg_idx].block_id
                                                        * fs->sect_perblk,
                                                        0, fs->blksz,
                                                        journal_buffer);
                                if (status == 0)
                                        goto fail;
                                if (ext4fs_log_journal(journal_buffer,
-                                               gd[bg_idx].block_id))
+                                               bgd[bg_idx].block_id))
                                        goto fail;
                                prev_bg_bmap_idx = bg_idx;
                        }
@@ -701,7 +703,7 @@ static int ext4fs_delete_file(int inodeno)
 
        /* get the block no */
        inodeno--;
-       blkno = __le32_to_cpu(gd[ibmap_idx].inode_table_id) +
+       blkno = __le32_to_cpu(bgd[ibmap_idx].inode_table_id) +
                (inodeno % __le32_to_cpu(inode_per_grp)) / inodes_per_block;
 
        /* get the offset of the inode */
@@ -731,15 +733,15 @@ static int ext4fs_delete_file(int inodeno)
        /* update the respective inode bitmaps */
        inodeno++;
        ext4fs_reset_inode_bmap(inodeno, fs->inode_bmaps[ibmap_idx], ibmap_idx);
-       gd[ibmap_idx].free_inodes++;
+       bgd[ibmap_idx].free_inodes++;
        fs->sb->free_inodes++;
        /* journal backup */
        memset(journal_buffer, '\0', fs->blksz);
-       status = ext4fs_devread(gd[ibmap_idx].inode_id *
+       status = ext4fs_devread(bgd[ibmap_idx].inode_id *
                                fs->sect_perblk, 0, fs->blksz, journal_buffer);
        if (status == 0)
                goto fail;
-       if (ext4fs_log_journal(journal_buffer, gd[ibmap_idx].inode_id))
+       if (ext4fs_log_journal(journal_buffer, bgd[ibmap_idx].inode_id))
                goto fail;
 
        ext4fs_update();
@@ -797,7 +799,7 @@ int ext4fs_init(void)
                printf("Error in getting the block group descriptor table\n");
                goto fail;
        }
-       fs->gd = (struct ext2_block_group *)fs->gdtable;
+       fs->bgd = (struct ext2_block_group *)fs->gdtable;
 
        /* load all the available bitmap block of the partition */
        fs->blk_bmaps = zalloc(fs->no_blkgrp * sizeof(char *));
@@ -811,7 +813,7 @@ int ext4fs_init(void)
 
        for (i = 0; i < fs->no_blkgrp; i++) {
                status =
-                   ext4fs_devread(fs->gd[i].block_id * fs->sect_perblk, 0,
+                   ext4fs_devread(fs->bgd[i].block_id * fs->sect_perblk, 0,
                                   fs->blksz, (char *)fs->blk_bmaps[i]);
                if (status == 0)
                        goto fail;
@@ -828,7 +830,7 @@ int ext4fs_init(void)
        }
 
        for (i = 0; i < fs->no_blkgrp; i++) {
-               status = ext4fs_devread(fs->gd[i].inode_id * fs->sect_perblk,
+               status = ext4fs_devread(fs->bgd[i].inode_id * fs->sect_perblk,
                                        0, fs->blksz,
                                        (char *)fs->inode_bmaps[i]);
                if (status == 0)
@@ -842,7 +844,7 @@ int ext4fs_init(void)
         * reboot of a linux kernel
         */
        for (i = 0; i < fs->no_blkgrp; i++)
-               real_free_blocks = real_free_blocks + fs->gd[i].free_blocks;
+               real_free_blocks = real_free_blocks + fs->bgd[i].free_blocks;
        if (real_free_blocks != fs->sb->free_blocks)
                fs->sb->free_blocks = real_free_blocks;
 
@@ -907,7 +909,7 @@ void ext4fs_deinit(void)
 
        free(fs->gdtable);
        fs->gdtable = NULL;
-       fs->gd = NULL;
+       fs->bgd = NULL;
        /*
         * reinitiliazed the global inode and
         * block bitmap first execution check variables
@@ -929,7 +931,6 @@ static int ext4fs_write_file(struct ext2_inode *file_inode,
        int previous_block_number = -1;
        int delayed_start = 0;
        int delayed_extent = 0;
-       int delayed_skipfirst = 0;
        int delayed_next = 0;
        char *delayed_buf = NULL;
 
@@ -962,7 +963,6 @@ static int ext4fs_write_file(struct ext2_inode *file_inode,
                                        previous_block_number = blknr;
                                        delayed_start = blknr;
                                        delayed_extent = blockend;
-                                       delayed_skipfirst = skipfirst;
                                        delayed_buf = buf;
                                        delayed_next = blknr +
                                            (blockend >> SECTOR_BITS);
@@ -971,7 +971,6 @@ static int ext4fs_write_file(struct ext2_inode *file_inode,
                                previous_block_number = blknr;
                                delayed_start = blknr;
                                delayed_extent = blockend;
-                               delayed_skipfirst = skipfirst;
                                delayed_buf = buf;
                                delayed_next = blknr +
                                    (blockend >> SECTOR_BITS);
@@ -1012,8 +1011,6 @@ int ext4fs_write(const char *fname, unsigned char *buffer,
        unsigned int blks_reqd_for_file;
        unsigned int blocks_remaining;
        int existing_file_inodeno;
-       char filename[256];
-
        char *temp_ptr = NULL;
        long int itable_blkno;
        long int parent_itable_blkno;
@@ -1022,6 +1019,9 @@ int ext4fs_write(const char *fname, unsigned char *buffer,
        unsigned int inodes_per_block;
        unsigned int ibmap_idx;
        struct ext_filesystem *fs = get_fs();
+       ALLOC_CACHE_ALIGN_BUFFER(char, filename, 256);
+       memset(filename, 0x00, sizeof(filename));
+
        g_parent_inode = zalloc(sizeof(struct ext2_inode));
        if (!g_parent_inode)
                goto fail;
@@ -1050,8 +1050,8 @@ int ext4fs_write(const char *fname, unsigned char *buffer,
        }
        /* calucalate how many blocks required */
        bytes_reqd_for_file = sizebytes;
-       blks_reqd_for_file = bytes_reqd_for_file / fs->blksz;
-       if (bytes_reqd_for_file % fs->blksz != 0) {
+       blks_reqd_for_file = lldiv(bytes_reqd_for_file, fs->blksz);
+       if (do_div(bytes_reqd_for_file, fs->blksz) != 0) {
                blks_reqd_for_file++;
                debug("total bytes for a file %u\n", blks_reqd_for_file);
        }
@@ -1087,7 +1087,7 @@ int ext4fs_write(const char *fname, unsigned char *buffer,
                goto fail;
        ibmap_idx = inodeno / ext4fs_root->sblock.inodes_per_group;
        inodeno--;
-       itable_blkno = __le32_to_cpu(fs->gd[ibmap_idx].inode_table_id) +
+       itable_blkno = __le32_to_cpu(fs->bgd[ibmap_idx].inode_table_id) +
                        (inodeno % __le32_to_cpu(sblock->inodes_per_group)) /
                        inodes_per_block;
        blkoff = (inodeno % inodes_per_block) * fs->inodesz;
@@ -1105,7 +1105,7 @@ int ext4fs_write(const char *fname, unsigned char *buffer,
        }
        ibmap_idx = parent_inodeno / ext4fs_root->sblock.inodes_per_group;
        parent_inodeno--;
-       parent_itable_blkno = __le32_to_cpu(fs->gd[ibmap_idx].inode_table_id) +
+       parent_itable_blkno = __le32_to_cpu(fs->bgd[ibmap_idx].inode_table_id) +
            (parent_inodeno %
             __le32_to_cpu(sblock->inodes_per_group)) / inodes_per_block;
        blkoff = (parent_inodeno % inodes_per_block) * fs->inodesz;