From 624c721f0c6e42368cc1b466dbaa540dd3014295 Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Wed, 31 Oct 2012 08:21:33 +0000 Subject: fs: zfs: fix illegal use of fp the upcoming sunxi (allwinner a10/a13) platform enables zfs by default, and using linaro's hf -msoft-float makes the build fail because this u64 division. Signed-off-by: Alejandro Mery Acked-by: Stefan Roese --- fs/zfs/zfs.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'fs') diff --git a/fs/zfs/zfs.c b/fs/zfs/zfs.c index 2db45b1928..1b73244c00 100644 --- a/fs/zfs/zfs.c +++ b/fs/zfs/zfs.c @@ -30,6 +30,7 @@ #include #include #include "zfs_common.h" +#include "div64.h" block_dev_desc_t *zfs_dev_desc; @@ -2115,7 +2116,8 @@ zfs_read(zfs_file_t file, char *buf, uint64_t len) /* * Find requested blkid and the offset within that block. */ - uint64_t blkid = (file->offset + red) / blksz; + uint64_t blkid = file->offset + red; + blkid = do_div(blkid, blksz); free(data->file_buf); data->file_buf = 0; -- cgit v1.2.1 From da1fd96ce4ec58604edfaa7dd1ae4a528ce62a06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Bie=C3=9Fmann?= Date: Wed, 14 Nov 2012 13:32:37 +0100 Subject: fs/fs.c: do_fsload: measure throughput MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch adds time measurement and throughput calculation for all supported load commands. The output of ext2load changes from ---8<--- 1830666 bytes read --->8--- to ---8<--- 1830666 bytes read in 237 ms (7.4 MiB/s) --->8--- Signed-off-by: Andreas Bießmann [agust: rebased and revised commit log] Signed-off-by: Anatolij Gustschin --- fs/fs.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'fs') diff --git a/fs/fs.c b/fs/fs.c index ff360afd4b..023e7ef16a 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -257,6 +257,7 @@ int do_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], unsigned long pos; int len_read; char buf[12]; + unsigned long time; if (argc < 2) return CMD_RET_USAGE; @@ -293,11 +294,19 @@ int do_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[], else pos = 0; + time = get_timer(0); len_read = fs_read(filename, addr, pos, bytes); + time = get_timer(time); if (len_read <= 0) return 1; - printf("%d bytes read\n", len_read); + printf("%d bytes read in %lu ms", len_read, time); + if (time > 0) { + puts(" ("); + print_size(len_read / time * 1000, "/s"); + puts(")"); + } + puts("\n"); sprintf(buf, "0x%x", len_read); setenv("filesize", buf); -- cgit v1.2.1 From 25920757765e22bdebf8e6fb1f777e21a31c9c21 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 5 Nov 2012 12:16:24 +0000 Subject: cbfs: Remove mention of CREDITS files As requested by Wolfgang, remove references to CREDITS in the CBFS files. Signed-off-by: Simon Glass --- fs/cbfs/Makefile | 4 +--- fs/cbfs/cbfs.c | 3 --- 2 files changed, 1 insertion(+), 6 deletions(-) (limited to 'fs') diff --git a/fs/cbfs/Makefile b/fs/cbfs/Makefile index 2be8a6880b..e0e6de69fa 100644 --- a/fs/cbfs/Makefile +++ b/fs/cbfs/Makefile @@ -1,6 +1,4 @@ -# -# See file CREDITS for list of people who contributed to this -# project. +# Copyright (c) 2011 The Chromium OS Authors. All rights reserved. # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License as diff --git a/fs/cbfs/cbfs.c b/fs/cbfs/cbfs.c index cae6d56db7..1b25a15e48 100644 --- a/fs/cbfs/cbfs.c +++ b/fs/cbfs/cbfs.c @@ -1,9 +1,6 @@ /* * Copyright (c) 2011 The Chromium OS Authors. All rights reserved. * - * See file CREDITS for list of people who contributed to this - * project. - * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of -- cgit v1.2.1 From 32fc16d7e7a81816ce247b7cd70c94f3210a228b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Majewski?= Date: Wed, 5 Dec 2012 08:06:37 +0000 Subject: fs:ext4:write: Add lldiv and do_div to perform 64-32 bits division The ext4write code has been using direct calls to 64-32 division (/ and %). Officially supported u-boot toolchains (eldk-5.[12].x) generate calls to __aeabi_uldivmod(), which is niether defined in the toolchain libs nor u-boot source tree. Due to that, when the ext4write command has been executed, "undefined instruction" execption was generated (since the __aeabi_uldivmod() is not provided). To fix this error, lldiv() for division and do_div() for modulo have been used. Those two functions are recommended for performing 64-32 bit number division in u-boot. Signed-off-by: Lukasz Majewski Signed-off-by: Kyungmin Park --- fs/ext4/ext4fs.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'fs') diff --git a/fs/ext4/ext4fs.c b/fs/ext4/ext4fs.c index 06536baf62..80b3b90907 100644 --- a/fs/ext4/ext4fs.c +++ b/fs/ext4/ext4fs.c @@ -40,6 +40,7 @@ #include #include #include +#include #include "ext4_common.h" int ext4fs_symlinknest; @@ -1051,8 +1052,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); } -- cgit v1.2.1 From a1f41f1a55230dcd2e195f193809901fc4a082cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Majewski?= Date: Wed, 5 Dec 2012 08:06:38 +0000 Subject: fs:ext4:write: Store block device descriptor in file system structure The device block descriptor (block_dev_desc_t) )shall be stored at ext4 early code (at ext4fs_set_blk_dev in this case) to be available for latter use (like put_ext4()). Signed-off-by: Lukasz Majewski Signed-off-by: Kyungmin Park --- fs/ext4/dev.c | 1 + 1 file changed, 1 insertion(+) (limited to 'fs') diff --git a/fs/ext4/dev.c b/fs/ext4/dev.c index 1596a92b9a..464a67d531 100644 --- a/fs/ext4/dev.c +++ b/fs/ext4/dev.c @@ -52,6 +52,7 @@ void ext4fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info) part_info = info; part_offset = info->start; get_fs()->total_sect = (info->size * info->blksz) / SECTOR_SIZE; + get_fs()->dev_desc = rbdd; } int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf) -- cgit v1.2.1 From d429ca0d831024b1b1845db8a5e950b44e10db04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Majewski?= Date: Wed, 5 Dec 2012 08:06:39 +0000 Subject: fs:ext4:fix: Code refactoring to suppress compiler warnings Several fixes to suppress compiler's (eldk-5.[12].x gcc 4.6) warning [-Wunused-but-set-variable] Signed-off-by: Lukasz Majewski Signed-off-by: Kyungmin Park --- fs/ext4/ext4_common.c | 14 ++++++++++---- fs/ext4/ext4_journal.c | 3 +-- fs/ext4/ext4fs.c | 3 --- 3 files changed, 11 insertions(+), 9 deletions(-) (limited to 'fs') diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c index 323875fa94..f12b8056cc 100644 --- a/fs/ext4/ext4_common.c +++ b/fs/ext4/ext4_common.c @@ -378,7 +378,6 @@ void ext4fs_update_parent_dentry(char *filename, int *p_ino, int file_type) struct ext_filesystem *fs = get_fs(); /* directory entry */ struct ext2_dirent *dir; - char *ptr = NULL; char *temp_dir = NULL; zero_buffer = zalloc(fs->blksz); @@ -415,7 +414,6 @@ restart: if (ext4fs_log_journal(root_first_block_buffer, first_block_no_of_root)) goto fail; dir = (struct ext2_dirent *)root_first_block_buffer; - ptr = (char *)dir; totalbytes = 0; while (dir->direntlen > 0) { /* @@ -483,14 +481,12 @@ restart: break; dir = (struct ext2_dirent *)((char *)dir + templength); - ptr = (char *)dir; } /* make a pointer ready for creating next directory entry */ templength = dir->direntlen; totalbytes = totalbytes + templength; dir = (struct ext2_dirent *)((char *)dir + templength); - ptr = (char *)dir; /* get the next available inode number */ inodeno = ext4fs_get_new_inode_no(); @@ -1200,6 +1196,11 @@ static void alloc_double_indirect_block(struct ext2_inode *file_inode, status = ext4fs_devread(di_blockno_parent * fs->sect_perblk, 0, fs->blksz, (char *)di_parent_buffer); + + if (!status) { + printf("%s: Device read error!\n", __func__); + goto fail; + } memset(di_parent_buffer, '\0', fs->blksz); /* @@ -1227,6 +1228,11 @@ static void alloc_double_indirect_block(struct ext2_inode *file_inode, fs->sect_perblk, 0, fs->blksz, (char *)di_child_buff); + + if (!status) { + printf("%s: Device read error!\n", __func__); + goto fail; + } memset(di_child_buff, '\0', fs->blksz); /* filling of actual datablocks for each child */ for (j = 0; j < (fs->blksz / sizeof(int)); j++) { diff --git a/fs/ext4/ext4_journal.c b/fs/ext4/ext4_journal.c index 8a252d66c3..9f017084f1 100644 --- a/fs/ext4/ext4_journal.c +++ b/fs/ext4/ext4_journal.c @@ -410,7 +410,7 @@ int ext4fs_check_journal_state(int recovery_flag) int transaction_state = TRANSACTION_COMPLETE; int prev_desc_logical_no = 0; int curr_desc_logical_no = 0; - int ofs, flags, block; + int ofs, flags; struct ext2_inode inode_journal; struct journal_superblock_t *jsb = NULL; struct journal_header_t *jdb = NULL; @@ -453,7 +453,6 @@ int ext4fs_check_journal_state(int recovery_flag) i = be32_to_cpu(jsb->s_first); while (1) { - block = be32_to_cpu(jsb->s_first); blknr = read_allocated_block(&inode_journal, i); memset(temp_buff1, '\0', fs->blksz); ext4fs_devread(blknr * fs->sect_perblk, diff --git a/fs/ext4/ext4fs.c b/fs/ext4/ext4fs.c index 80b3b90907..64d8a6d972 100644 --- a/fs/ext4/ext4fs.c +++ b/fs/ext4/ext4fs.c @@ -931,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; @@ -964,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); @@ -973,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); -- cgit v1.2.1 From 13d43555a9154cf12255023c47e80d947d7d0604 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Majewski?= Date: Wed, 5 Dec 2012 08:06:40 +0000 Subject: fs:ext4:write: Initialize cache aligned filename buffer The filename buffer is allocated dynamically. It must be cache aligned. Moreover, it is necessary to erase its content before we use it for file name operations. This prevents from corruption of written file names. Signed-off-by: Lukasz Majewski Signed-off-by: Kyungmin Park --- fs/ext4/ext4fs.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'fs') diff --git a/fs/ext4/ext4fs.c b/fs/ext4/ext4fs.c index 64d8a6d972..f02c215ccc 100644 --- a/fs/ext4/ext4fs.c +++ b/fs/ext4/ext4fs.c @@ -1011,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; @@ -1021,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; -- cgit v1.2.1