Skip to contentSkip to conversation

fs: delete unused Makefile

PATCH New Stephen Warren 4 participants 20 messages Oct 22, 2012 – Nov 4, 2012

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

PATCH v4 1/3 fs: delete unused Makefile

From: Stephen Warren <[email protected]>

fs/Makefile is unused. The top-level Makefile sets LIBS-y += fs/xxx and hence causes make to directly descend two directory levels into each individual filesystem, and it never descends into fs/ itself.

So, delete this useless file.

---
v4: No change.
v3: No change.
v2: No change.

---
 fs/Makefile |   42 ------------------------------------------
 1 files changed, 0 insertions(+), 42 deletions(-)
 delete mode 100644 fs/Makefile
fs/Makefile deleted +0 -42
deleted file mode 100644
index 901e189..0000000
@@ -1,42 +0,0 @@
-#
-# (C) Copyright 2000-2006
-# Wolfgang Denk, DENX Software Engineering, wd at denx.de.
-#
-# 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
-# the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-# MA 02111-1307 USA
-#
-#
-
-subdirs-$(CONFIG_CMD_CRAMFS) := cramfs
-subdirs-$(CONFIG_CMD_EXT4) += ext4
-ifndef CONFIG_CMD_EXT4
-subdirs-$(CONFIG_CMD_EXT2) += ext4
-endif
-subdirs-$(CONFIG_CMD_FAT) += fat
-subdirs-$(CONFIG_CMD_FDOS) += fdos
-subdirs-$(CONFIG_CMD_JFFS2) += jffs2
-subdirs-$(CONFIG_CMD_REISER) += reiserfs
-subdirs-$(CONFIG_YAFFS2) += yaffs2
-subdirs-$(CONFIG_CMD_UBIFS) += ubifs
-subdirs-$(CONFIG_CMD_ZFS) += zfs
-
-SUBDIRS	:= $(subdirs-y)
-
-$(obj).depend all:
-	@for dir in $(SUBDIRS) ; do \
-		$(MAKE) -C $$dir $@ ; done
Signature · 1 line
1.7.0.4
#1 lore raw

PATCH v4 2/3 fs: separate CONFIG_FS_{FAT, EXT4} from CONFIG_CMD_{FAT, EXT*}

From: Stephen Warren <[email protected]>

This makes the FAT and ext4 filesystem implementations build if CONFIG_FS_{FAT,EXT4} are defined, rather than basing the build on whether CONFIG_CMD_{FAT,EXT*} are defined. This will allow the filesystems to be built separately from the filesystem-specific commands that use them. This paves the way for the creation of filesystem-generic commands that used the filesystems, without requiring the filesystem- specific commands.

Minor documentation changes are made for this change.

The new config options are automatically selected by the old config options to retain backwards-compatibility.

---
v4: No change.
v3: No change.
v2: New patch.

---
 README                     |    4 +++-
 doc/README.ext4            |   13 +++++++++++++
 fs/ext4/Makefile           |    7 ++-----
 fs/ext4/ext4_common.c      |    2 +-
 fs/ext4/ext4_common.h      |    4 ++--
 fs/ext4/ext4fs.c           |    2 +-
 fs/fat/Makefile            |    4 ++--
 include/config_fallbacks.h |   13 +++++++++++++
 include/ext4fs.h           |    2 +-
 9 files changed, 38 insertions(+), 13 deletions(-)
README +3 -1
index 9804cea..f22ed1b 100644
@@ -801,9 +801,11 @@ The following options need to be configured:
 		CONFIG_CMD_EEPROM	* EEPROM read/write support
 		CONFIG_CMD_ELF		* bootelf, bootvx
 		CONFIG_CMD_EXPORTENV	* export the environment
+		CONFIG_CMD_EXT2		* ext2 command support
+		CONFIG_CMD_EXT4		* ext4 command support
 		CONFIG_CMD_SAVEENV	  saveenv
 		CONFIG_CMD_FDC		* Floppy Disk Support
-		CONFIG_CMD_FAT		* FAT partition support
+		CONFIG_CMD_FAT		* FAT command support
 		CONFIG_CMD_FDOS		* Dos diskette Support
 		CONFIG_CMD_FLASH	  flinfo, erase, protect
 		CONFIG_CMD_FPGA		  FPGA device initialization support
doc/README.ext4 +13 -0
index b3ea8b7..b7d0ad3 100644
@@ -1,15 +1,28 @@
 This patch series adds support for ext4 ls,load and write features in uboot
 Journaling is supported for write feature.
 
+To enable support for the ext4 (and ext2) filesystem implementation,
+#define CONFIG_FS_EXT4
+
+If you want write support,
+#define CONFIG_EXT4_WRITE
+
 To Enable ext2 ls and load commands, modify the board specific config file with
 #define CONFIG_CMD_EXT2
+This automatically defines CONFIG_FS_EXT4 for you.
 
 To Enable ext4 ls and load commands, modify the board specific config file with
 #define CONFIG_CMD_EXT4
+This automatically defines CONFIG_FS_EXT4 for you.
 
 To enable ext4 write command, modify the board specific config file with
 #define CONFIG_CMD_EXT4
 #define CONFIG_CMD_EXT4_WRITE
+These automatically define CONFIG_FS_EXT4 and CONFIG_EXT4_WRITE for you.
+
+Also relevant are the generic filesystem commands,
+#define CONFIG_CMD_FS_GENERIC
+This does not automatically enable EXT4 support for you.
 
 Steps to test:
 
fs/ext4/Makefile +2 -5
index 82cd9ae..bb801f9 100644
@@ -30,11 +30,8 @@ include $(TOPDIR)/config.mk
 LIB	= $(obj)libext4fs.o
 
 AOBJS	=
-COBJS-$(CONFIG_CMD_EXT4) := ext4fs.o ext4_common.o dev.o
-ifndef CONFIG_CMD_EXT4
-COBJS-$(CONFIG_CMD_EXT2) := ext4fs.o ext4_common.o dev.o
-endif
-COBJS-$(CONFIG_CMD_EXT4_WRITE) += ext4_journal.o crc16.o
+COBJS-$(CONFIG_FS_EXT4) := ext4fs.o ext4_common.o dev.o
+COBJS-$(CONFIG_EXT4_WRITE) += ext4_journal.o crc16.o
 
 SRCS	:= $(AOBJS:.o=.S) $(COBJS-y:.o=.c)
 OBJS	:= $(addprefix $(obj),$(AOBJS) $(COBJS-y))
fs/ext4/ext4_common.c +1 -1
index d6d55b9..323875f 100644
@@ -56,7 +56,7 @@ int ext4fs_indir3_blkno = -1;
 struct ext2_inode *g_parent_inode;
 static int symlinknest;
 
-#if defined(CONFIG_CMD_EXT4_WRITE)
+#if defined(CONFIG_EXT4_WRITE)
 uint32_t ext4fs_div_roundup(uint32_t size, uint32_t n)
 {
 	uint32_t res = size / n;
fs/ext4/ext4_common.h +2 -2
index f728134..87cab16 100644
@@ -37,7 +37,7 @@
 #include <ext4fs.h>
 #include <malloc.h>
 #include <asm/errno.h>
-#if defined(CONFIG_CMD_EXT4_WRITE)
+#if defined(CONFIG_EXT4_WRITE)
 #include "ext4_journal.h"
 #include "crc16.h"
 #endif
@@ -71,7 +71,7 @@ int ext4fs_find_file(const char *path, struct ext2fs_node *rootnode,
 int ext4fs_iterate_dir(struct ext2fs_node *dir, char *name,
 			struct ext2fs_node **fnode, int *ftype);
 
-#if defined(CONFIG_CMD_EXT4_WRITE)
+#if defined(CONFIG_EXT4_WRITE)
 uint32_t ext4fs_div_roundup(uint32_t size, uint32_t n);
 int ext4fs_checksum_update(unsigned int i);
 int ext4fs_get_parent_inode_num(const char *dirname, char *dname, int flags);
fs/ext4/ext4fs.c +1 -1
index 3a5ef20..06536ba 100644
@@ -196,7 +196,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;
fs/fat/Makefile +2 -2
index 9635d36..3e33e38 100644
@@ -24,11 +24,11 @@ include $(TOPDIR)/config.mk
 LIB	= $(obj)libfat.o
 
 AOBJS	=
-COBJS-$(CONFIG_CMD_FAT)	:= fat.o
+COBJS-$(CONFIG_FS_FAT)	:= fat.o
 COBJS-$(CONFIG_FAT_WRITE):= fat_write.o
 
 ifndef CONFIG_SPL_BUILD
-COBJS-$(CONFIG_CMD_FAT)	+= file.o
+COBJS-$(CONFIG_FS_FAT)	+= file.o
 endif
 
 SRCS	:= $(AOBJS:.o=.S) $(COBJS-y:.o=.c)
include/config_fallbacks.h +13 -0
index 430890c..bfb9680 100644
@@ -13,4 +13,17 @@
 #define CONFIG_SYS_BAUDRATE_TABLE	{ 9600, 19200, 38400, 57600, 115200 }
 #endif
 
+#if defined(CONFIG_CMD_FAT) && !defined(CONFIG_FS_FAT)
+#define CONFIG_FS_FAT
+#endif
+
+#if (defined(CONFIG_CMD_EXT4) || defined(CONFIG_CMD_EXT2)) && \
+						!defined(CONFIG_FS_EXT4)
+#define CONFIG_FS_EXT4
+#endif
+
+#if defined(CONFIG_CMD_EXT4_WRITE) && !defined(CONFIG_EXT4_WRITE)
+#define CONFIG_EXT4_WRITE
+#endif
+
 #endif	/* __CONFIG_FALLBACKS_H */
include/ext4fs.h +1 -1
index 23298fc..3b59d15 100644
@@ -116,7 +116,7 @@ struct ext_filesystem {
 extern struct ext2_data *ext4fs_root;
 extern struct ext2fs_node *ext4fs_file;
 
-#if defined(CONFIG_CMD_EXT4_WRITE)
+#if defined(CONFIG_EXT4_WRITE)
 extern struct ext2_inode *g_parent_inode;
 extern int gd_index;
 extern int gindex;
Signature · 1 line
1.7.0.4
#2 lore raw

PATCH v4 3/3 fs: add filesystem switch libary, implement ls and fsload commands

In reply to Stephen Warren

From: Stephen Warren <[email protected]>

Implement "ls" and "fsload" commands that act like {fat,ext2}{ls,load}, and transparently handle either file-system. This scheme could easily be extended to other filesystem types; I only didn't do it for zfs because I don't have any filesystems of that type to test with.

Replace the implementation of {fat,ext[24]}{ls,load} with this new code too.

---
v4:
* Use FS_TYPE_* everywhere, rather than separate FS_* and FS_TYPE_*.
* Make fs_set_blk_dev() loop over a table of filesystems.
v3:
* Updated the implementation of the new commands to be suitable for use as the body of {fat,ext[24]}{ls,load} too.
* Enhanced the implementation to make more fsload parameters optional (load address, filename); they can now come from environment variables like ext2load supported.
* Moved implementation into fs.c.
* Removed cmd_ext_common.c.
* s/partition/filesystem/ in patch subject.
v2:
* Build cmd_fs.c when CONFIG_CMD_FS_GENERIC not always.
* Use new CONFIG_FS_{FAT,EXT4} rather than CONFIG_CMD_{FAT,EXT2}.
* Implemented fs_close() and call it from the tail of fs_ls() and fs_read(). This ensures that any other usage of e.g. the ext4 library between fs_*() calls, then the two usages won't interfere.
* Re-organized fs.c to reduce the number of ifdef blocks.
* Added argc checking to do_ls().

---
 Makefile                |    3 +-
 common/Makefile         |    6 +-
 common/cmd_ext2.c       |   13 +--
 common/cmd_ext4.c       |   12 +--
 common/cmd_ext_common.c |  197 ------------------------------
 common/cmd_fat.c        |   76 +-----------
 common/cmd_fs.c         |   51 ++++++++
 fs/Makefile             |   47 +++++++
 fs/fs.c                 |  308 +++++++++++++++++++++++++++++++++++++++++++++++
 include/ext_common.h    |    3 -
 include/fs.h            |   65 ++++++++++
 11 files changed, 483 insertions(+), 298 deletions(-)
 delete mode 100644 common/cmd_ext_common.c
 create mode 100644 common/cmd_fs.c
 create mode 100644 fs/Makefile
 create mode 100644 fs/fs.c
 create mode 100644 include/fs.h
Makefile +2 -1
index ab34fa7..b92e2af 100644
@@ -260,7 +260,8 @@ LIBS-y += drivers/net/npe/libnpe.o
 endif
 LIBS-$(CONFIG_OF_EMBED) += dts/libdts.o
 LIBS-y += arch/$(ARCH)/lib/lib$(ARCH).o
-LIBS-y += fs/cramfs/libcramfs.o \
+LIBS-y += fs/libfs.o \
+	fs/cramfs/libcramfs.o \
 	fs/ext4/libext4fs.o \
 	fs/fat/libfat.o \
 	fs/fdos/libfdos.o \
common/Makefile +1 -5
index a4eb477..cc22c52 100644
@@ -88,11 +88,6 @@ COBJS-$(CONFIG_CMD_ELF) += cmd_elf.o
 COBJS-$(CONFIG_SYS_HUSH_PARSER) += cmd_exit.o
 COBJS-$(CONFIG_CMD_EXT4) += cmd_ext4.o
 COBJS-$(CONFIG_CMD_EXT2) += cmd_ext2.o
-ifdef CONFIG_CMD_EXT4
-COBJS-y	+= cmd_ext_common.o
-else
-COBJS-$(CONFIG_CMD_EXT2) += cmd_ext_common.o
-endif
 COBJS-$(CONFIG_CMD_FAT) += cmd_fat.o
 COBJS-$(CONFIG_CMD_FDC)$(CONFIG_CMD_FDOS) += cmd_fdc.o
 COBJS-$(CONFIG_OF_LIBFDT) += cmd_fdt.o fdt_support.o
@@ -102,6 +97,7 @@ COBJS-$(CONFIG_CMD_FLASH) += cmd_flash.o
 ifdef CONFIG_FPGA
 COBJS-$(CONFIG_CMD_FPGA) += cmd_fpga.o
 endif
+COBJS-$(CONFIG_CMD_FS_GENERIC) += cmd_fs.o
 COBJS-$(CONFIG_CMD_GPIO) += cmd_gpio.o
 COBJS-$(CONFIG_CMD_I2C) += cmd_i2c.o
 COBJS-$(CONFIG_CMD_IDE) += cmd_ide.o
common/cmd_ext2.c +3 -10
index c27d9c7..06d0234 100644
@@ -37,15 +37,11 @@
 /*
  * Ext2fs support
  */
-#include <common.h>
-#include <ext_common.h>
+#include <fs.h>
 
 int do_ext2ls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
-	if (do_ext_ls(cmdtp, flag, argc, argv))
-		return -1;
-
-	return 0;
+	return do_ls(cmdtp, flag, argc, argv, FS_TYPE_EXT);
 }
 
 /******************************************************************************
@@ -53,10 +49,7 @@ int do_ext2ls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
  */
 int do_ext2load (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
-	if (do_ext_load(cmdtp, flag, argc, argv))
-		return -1;
-
-	return 0;
+	return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_EXT);
 }
 
 U_BOOT_CMD(
common/cmd_ext4.c +3 -9
index ca46561..237bc19 100644
@@ -47,10 +47,10 @@
 #include <image.h>
 #include <linux/ctype.h>
 #include <asm/byteorder.h>
-#include <ext_common.h>
 #include <ext4fs.h>
 #include <linux/stat.h>
 #include <malloc.h>
+#include <fs.h>
 
 #if defined(CONFIG_CMD_USB) && defined(CONFIG_USB_STORAGE)
 #include <usb.h>
@@ -59,18 +59,12 @@
 int do_ext4_load(cmd_tbl_t *cmdtp, int flag, int argc,
 						char *const argv[])
 {
-	if (do_ext_load(cmdtp, flag, argc, argv))
-		return -1;
-
-	return 0;
+	return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_EXT);
 }
 
 int do_ext4_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
 {
-	if (do_ext_ls(cmdtp, flag, argc, argv))
-		return -1;
-
-	return 0;
+	return do_ls(cmdtp, flag, argc, argv, FS_TYPE_EXT);
 }
 
 #if defined(CONFIG_CMD_EXT4_WRITE)
common/cmd_ext_common.c deleted +0 -197

197 lines not on this page · raw message

common/cmd_fat.c +3 -73

91 lines not on this page · raw message

common/cmd_fs.c new file +51 -0

51 lines not on this page · raw message

fs/Makefile new file +47 -0

47 lines not on this page · raw message

fs/fs.c new file +308 -0

308 lines not on this page · raw message

include/ext_common.h +0 -3
index ce73857..86373a6 100644
@@ -195,7 +195,4 @@ int do_ext4_load(cmd_tbl_t *cmdtp, int flag, int argc,
 int do_ext4_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]);
 int do_ext4_write(cmd_tbl_t *cmdtp, int flag, int argc,
 				char *const argv[]);
-int do_ext_load(cmd_tbl_t *cmdtp, int flag, int argc,
-					char *const argv[]);
-int do_ext_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]);
 #endif
include/fs.h new file +65 -0

65 lines not on this page · raw message

Signature · 1 line
1.7.0.4
#3 lore raw

PATCH v4 3/3 fs: add filesystem switch libary, implement ls and fsload commands

Dear all,

Quoted 11 lines · Stephen Warren

From: Stephen Warren <[email protected]>

Implement "ls" and "fsload" commands that act like {fat,ext2}{ls,load}, and transparently handle either file-system. This scheme could easily be extended to other filesystem types; I only didn't do it for zfs because I don't have any filesystems of that type to test with.

Replace the implementation of {fat,ext[24]}{ls,load} with this new code too.

this patch (namely 045fa1e1142552799ad3203e9e0bc22a11e866ea) seems to break avr32 on runtime. It seems there is a new array introduced (the fstypes array in fs/fs.c) which do not provide a relocation method (CONFIG_NEEDS_MANUAL_RELOC). This is currently only a weak assumption, but has any other requiring manual relocation m86k, mips, nds32m sparc) also encountered this problem?

Quoted 1 line

---

<snip>

Quoted 6 lines
fs/fs.c new file +0 -0
new file mode 100644
index 0000000..23ffa25
@@ -0,0 +1,308 @@

<snip>

Quoted 4 lines
fs/fs.c new file +4 -0
+
+static const struct {
+	int fstype;
+	int (*probe)(void);

fs/fs.c line 156

Quoted 10 lines
fs/fs.c new file +10 -0
+} fstypes[] = {
+	{
+		.fstype = FS_TYPE_FAT,
+		.probe = fs_probe_fat,
+	},
+	{
+		.fstype = FS_TYPE_EXT,
+		.probe = fs_probe_ext,
+	},
+};

I currently think this should be manually relocated for those arches which need the manual relocation.

Quoted 13 lines
fs/fs.c new file +13 -0
+
+int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype)
+{
+	int part, i;
+
+	part = get_device_and_partition(ifname, dev_part_str, &fs_dev_desc,
+					&fs_partition, 1);
+	if (part < 0)
+		return -1;
+
+	for (i = 0; i < ARRAY_SIZE(fstypes); i++) {
+		if ((fstype != FS_TYPE_ANY) && (fstype != fstypes[i].fstype))
+			continue;

fs/fs.c line 179

Quoted 10 lines
fs/fs.c new file +10 -0
+
+		if (!fstypes[i].probe()) {
+			fs_type = fstypes[i].fstype;
+			return 0;
+		}
+	}
+
+	printf("** Unrecognized filesystem type **\n");
+	return -1;
+}

Best regards

Andreas Bie?mann

#4 lore raw

PATCH v4 3/3 fs: add filesystem switch libary, implement ls and fsload commands

Quoted 13 lines · Andreas Bie?mann

Dear all,

Quoted 10 lines · Stephen Warren

From: Stephen Warren <[email protected]>

Implement "ls" and "fsload" commands that act like {fat,ext2}{ls,load}, and transparently handle either file-system. This scheme could easily be extended to other filesystem types; I only didn't do it for zfs because I don't have any filesystems of that type to test with.

Replace the implementation of {fat,ext[24]}{ls,load} with this new code too.

Quoted 8 lines
Quoted 1 line

this patch (namely 045fa1e1142552799ad3203e9e0bc22a11e866ea) seems to break avr32 on runtime. It seems there is a new array introduced (the fstypes array in fs/fs.c) which do not provide a relocation method (CONFIG_NEEDS_MANUAL_RELOC). This is currently only a weak assumption, but has any other requiring manual relocation m86k, mips, nds32m sparc) also encountered this problem?

Urk, sorry. Can you prepare and test a patch? Thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20121030/d9c0af31/attachment.pgp>
#5 lore raw

PATCH 1/1 fs/fs.c: fix fs_set_blk_dev() for manual relocation

Commit 045fa1e1142552799ad3203e9e0bc22a11e866ea introduce an array with filesystem accessors. On arches which need manual reloc this is broken cause the function pointers still pointing to the privious location, fix it.

Cc swarren at wwwdotorg.org
Cc trini at ti.com
---
 fs/fs.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)
fs/fs.c +15 -1
index 23ffa25..66feb30 100644
@@ -21,6 +21,8 @@
 #include <fat.h>
 #include <fs.h>
 
+DECLARE_GLOBAL_DATA_PTR;
+
 static block_dev_desc_t *fs_dev_desc;
 static disk_partition_t fs_partition;
 static int fs_type = FS_TYPE_ANY;
@@ -141,7 +143,7 @@ static inline void fs_close_ext(void)
 #define fs_read_ext fs_read_unsupported
 #endif
 
-static const struct {
+static struct {
 	int fstype;
 	int (*probe)(void);
 } fstypes[] = {
@@ -158,6 +160,18 @@ static const struct {
 int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype)
 {
 	int part, i;
+#ifdef CONFIG_NEEDS_MANUAL_RELOC
+	static int relocated = 0;
+
+	/* relocate fstypes[].probe */
+	if (!relocated) {
+		int i;
+		for (i = 0; i < ARRAY_SIZE(fstypes); i++)
+			if (fstypes[i].probe != NULL)
+				fstypes[i].probe += gd->reloc_off;
+		relocated = 1;
+	}
+#endif
 
 	part = get_device_and_partition(ifname, dev_part_str, &fs_dev_desc,
 					&fs_partition, 1);
Signature · 1 line
1.8.0
#6 lore raw

PATCH 1/1 fs/fs.c: fix fs_set_blk_dev() for manual relocation

Quoted 3 lines · Andreas Bie?mann

Commit 045fa1e1142552799ad3203e9e0bc22a11e866ea introduce an array with filesystem accessors. On arches which need manual reloc this is broken cause the function pointers still pointing to the privious location, fix it.

We found the same code to copy:-)

fs/fs.c static const struct { · line 164

Quoted 6 lines
fs/fs.c +2 -0
 
 int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype)
 
+#ifdef CONFIG_NEEDS_MANUAL_RELOC
+	static int relocated = 0;

checkpatch bitches about the "= 0" there. I assume BSS initialization isn't also broken when CONFIG_NEEDS_MANUAL_RELOC is enabled?

#7 lore raw

PATCH 1/1 fs/fs.c: fix fs_set_blk_dev() for manual relocation

Quoted 9 lines · Stephen Warren
Quoted 3 lines · Andreas Bie??mann

Commit 045fa1e1142552799ad3203e9e0bc22a11e866ea introduce an array with filesystem accessors. On arches which need manual reloc this is broken cause the function pointers still pointing to the privious location, fix it.

We found the same code to copy:-)

Quoted 1 line
fs/fs.c +0 -0
Quoted 7 lines

fs/fs.c static const struct { · line 164

Quoted 4 lines

int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype)

fs/fs.c +2 -0
+#ifdef CONFIG_NEEDS_MANUAL_RELOC
+	static int relocated = 0;

checkpatch bitches about the "= 0" there. I assume BSS initialization isn't also broken when CONFIG_NEEDS_MANUAL_RELOC is enabled?

The only other example of relocation this way also does an inital assignment to 0. Andreas, can you run-time test? Thanks.

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20121030/a40656d0/attachment.pgp>
#8 lore raw

PATCH 1/1 fs/fs.c: fix fs_set_blk_dev() for manual relocation

In reply to Stephen Warren

Dear Stephen Warren,

Quoted 6 lines · Stephen Warren
Quoted 3 lines · Andreas Bie?mann

Commit 045fa1e1142552799ad3203e9e0bc22a11e866ea introduce an array with filesystem accessors. On arches which need manual reloc this is broken cause the function pointers still pointing to the privious location, fix it.

We found the same code to copy:-)

we did ;)

Quoted 9 lines

fs/fs.c static const struct { · line 164

Quoted 6 lines
fs/fs.c +2 -0
 
 int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype)
 
+#ifdef CONFIG_NEEDS_MANUAL_RELOC
+	static int relocated = 0;

checkpatch bitches about the "= 0" there. I assume BSS initialization isn't also broken when CONFIG_NEEDS_MANUAL_RELOC is enabled?

For AVR32 BSS initialization is working correctly, I do not know how the other arches behave, but I think it is Ok to remove the '0' here. Also the check for fstypes[i].probe != NULL in my patch seems to be not necessary. So I would favor using your patch then.

Best regards

Andreas Bie?mann

#9 lore raw

PATCH 1/1 fs: handle CONFIG_NEEDS_MANUAL_RELOC

In reply to Andreas Bießmann

From: Stephen Warren <[email protected]>

Without this, fstypes[].probe points at the wrong place, so calling the function results in undefined behaviour.

---
Note: I have compile-tested this with the relocation code forcibly enabled, but have no way of actually testing the result.

---
 fs/fs.c |   13 ++++++++++++-
 1 files changed, 12 insertions(+), 1 deletions(-)
fs/fs.c +12 -1
index 23ffa25..e148a07 100644
@@ -21,6 +21,8 @@
 #include <fat.h>
 #include <fs.h>
 
+DECLARE_GLOBAL_DATA_PTR;
+
 static block_dev_desc_t *fs_dev_desc;
 static disk_partition_t fs_partition;
 static int fs_type = FS_TYPE_ANY;
@@ -141,7 +143,7 @@ static inline void fs_close_ext(void)
 #define fs_read_ext fs_read_unsupported
 #endif
 
-static const struct {
+static struct {
 	int fstype;
 	int (*probe)(void);
 } fstypes[] = {
@@ -158,6 +160,15 @@ static const struct {
 int fs_set_blk_dev(const char *ifname, const char *dev_part_str, int fstype)
 {
 	int part, i;
+#ifdef CONFIG_NEEDS_MANUAL_RELOC
+	static int relocated;
+
+	if (!relocated) {
+		for (i = 0; i < ARRAY_SIZE(fstypes); i++)
+			fstypes[i].probe += gd->reloc_off;
+		relocated = 1;
+	}
+#endif
 
 	part = get_device_and_partition(ifname, dev_part_str, &fs_dev_desc,
 					&fs_partition, 1);
Signature · 1 line
1.7.0.4
#10 lore raw

PATCH 1/1 fs: handle CONFIG_NEEDS_MANUAL_RELOC

Dear Stephen Warren,

Quoted 6 lines · Stephen Warren

From: Stephen Warren <[email protected]>

Without this, fstypes[].probe points at the wrong place, so calling the function results in undefined behaviour.

Tested on AVR32 (atstk1002)

Quoted 4 lines

---
Note: I have compile-tested this with the relocation code forcibly enabled, but have no way of actually testing the result.
---

Best regards

Andreas Bie?mann

#11 lore raw

PATCH 1/1 fs: handle CONFIG_NEEDS_MANUAL_RELOC

Quoted 5 lines · Andreas Bie?mann

Dear Stephen Warren,

Quoted 2 lines · Stephen Warren

From: Stephen Warren <[email protected]>

Quoted 8 lines
Quoted 4 lines

Without this, fstypes[].probe points at the wrong place, so calling the function results in undefined behaviour.

Tested on AVR32 (atstk1002)

Applied to u-boot/master, thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20121104/de25a932/attachment.pgp>
#12 lore raw

PATCH v4 3/3 fs: add filesystem switch libary, implement ls and fsload commands

In reply to Stephen Warren

Hi Stephen,

Quoted 10 lines · Stephen Warren

From: Stephen Warren <[email protected]>

Implement "ls" and "fsload" commands that act like {fat,ext2}{ls,load},
and transparently handle either file-system. This scheme could easily be
extended to other filesystem types; I only didn't do it for zfs because
I don't have any filesystems of that type to test with.

Quoted 5 lines

Replace the implementation of {fat,ext[24]}{ls,load} with this new code
too.

Sorry to come after this has been applied. I've been ultra busy lately.

[--snip--]

fs/fs.c

Quoted 6 lines
fs/fs.c new file +0 -0
new file mode 100644
index 0000000..23ffa25
@@ -0,0 +1,308 @@

[--snip--]

fs/fs.c line 250

Quoted 13 lines
fs/fs.c new file +1 -0
+int do_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char * const

argv[],

fs/fs.c new file +11 -0
+		int fstype)
+{
+	unsigned long addr;
+	const char *addr_str;
+	const char *filename;
+	unsigned long bytes;
+	unsigned long pos;
+	int len_read;
+	char buf[12];
+
+	if (argc < 5)

With the arguments now made optional, this should rather be:
+ if (argc < 2)

fs/fs.c line 253

Quoted 3 lines
fs/fs.c new file +3 -0
+		return CMD_RET_USAGE;
+
+	if (fs_set_blk_dev(argv[1], argv[2], fstype))

With <dev[:part]> being optional, this should rather be:
+ if (fs_set_blk_dev(argv[1], (argc >= 3) ? argv[2] : NULL, fstype))

fs/fs.c line 257

Quoted 4 lines
fs/fs.c new file +4 -0
+		return 1;
+
+	if (argc >= 4) {
+		addr = simple_strtoul(argv[3], NULL, 0);

0 is just natural here. However, this raises the issue of the users of the legacy fat and ext commands, which used 16 here. So should we use 0 because it is cleaner, or 16 in order not to break compatibility for existing users?

fs/fs.c line 261

Quoted 4 lines
fs/fs.c new file +4 -0
+	} else {
+		addr_str = getenv("loadaddr");
+		if (addr_str != NULL)
+			addr = simple_strtoul(addr_str, NULL, 16);

Ditto.

Quoted 4 lines
fs/fs.c new file +4 -0
+		else
+			addr = CONFIG_SYS_LOAD_ADDR;
+	}
+	if (argc >= 5) {

fs/fs.c line 275

Quoted 10 lines
fs/fs.c new file +10 -0
+		filename = argv[4];
+	} else {
+		filename = getenv("bootfile");
+		if (!filename) {
+			puts("** No boot file defined **\n");
+			return 1;
+		}
+	}
+	if (argc >= 6)
+		bytes = simple_strtoul(argv[5], NULL, 0);

Ditto.

fs/fs.c line 279

Quoted 4 lines
fs/fs.c new file +4 -0
+	else
+		bytes = 0;
+	if (argc >= 7)
+		pos = simple_strtoul(argv[6], NULL, 0);

Ditto.

Quoted 15 lines
fs/fs.c new file +15 -0
+	else
+		pos = 0;
+
+	len_read = fs_read(filename, addr, pos, bytes);
+	if (len_read <= 0)
+		return 1;
+
+	printf("%d bytes read\n", len_read);
+
+	sprintf(buf, "0x%x", len_read);
+	setenv("filesize", buf);
+
+	return 0;
+}
+

fs/fs.c line 304

Quoted 10 lines
fs/fs.c new file +10 -0
+int do_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
+	int fstype)
+{
+	if (argc < 2)
+		return CMD_RET_USAGE;
+
+	if (fs_set_blk_dev(argv[1], (argc >= 3) ? argv[2] : NULL, fstype))
+		return 1;
+
+	if (fs_ls(argc == 4 ? argv[3] : "/"))

IMHO, it would be better to just ignore the possible extra arguments, like in:
+ if (fs_ls(argc >= 4 ? argv[3] : "/"))

fs/fs.c line 293

Quoted 4 lines
fs/fs.c new file +4 -0
+		return 1;
+
+	return 0;
+}

[--snip--]

Best regards,
Beno?t

#13 lore raw

PATCH v4 3/3 fs: add filesystem switch libary, implement ls and fsload commands

Quoted 21 lines · Beno?t Th?baudeau

Hi Stephen,

Quoted 17 lines · Stephen Warren

From: Stephen Warren <[email protected]>

Implement "ls" and "fsload" commands that act like {fat,ext2}{ls,load},
and transparently handle either file-system. This scheme could easily be
extended to other filesystem types; I only didn't do it for zfs because
I don't have any filesystems of that type to test with.

Replace the implementation of {fat,ext[24]}{ls,load} with this new code
too.

fs/fs.c +1 -0
 
+int do_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char * const
Quoted 8 lines

fs/fs.c line 257

Quoted 4 lines
fs/fs.c +4 -0
+		return 1;
+
+	if (argc >= 4) {
+		addr = simple_strtoul(argv[3], NULL, 0);

0 is just natural here. However, this raises the issue of the users of the legacy fat and ext commands, which used 16 here. So should we use 0 because it is cleaner, or 16 in order not to break compatibility for existing users?

Oh yes, that is a problem.

I think we should use 0 here for the new commands at least; it has always annoyed me that U-Boot assumes that clearly non-hex values (since there is no 0x) are actually hex. I often have to manually convert values because of this (e.g. host-based ls decimal output to U-Boot command input expecting hex without leading 0x.)

However, we do need to fix this for the existing legacy commands. I suggest we either:

a) Add a new parameter to do_fsload() indicating which base to use.

or:

b) Assume base 0 if fstype==FS_TYPE_ANY, otherwise use 16.

(a) is probably cleaner.

For the environment variables, I suppose we need to continue to explicitly request base 16 conversion, since those variables could be used with either the old or the new commands.

Review

Quoted 13 lines

fs/fs.c line 304

Quoted 10 lines
fs/fs.c +10 -0
+int do_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],
+	int fstype)
+{
+	if (argc < 2)
+		return CMD_RET_USAGE;
+
+	if (fs_set_blk_dev(argv[1], (argc >= 3) ? argv[2] : NULL, fstype))
+		return 1;
+
+	if (fs_ls(argc == 4 ? argv[3] : "/"))

IMHO, it would be better to just ignore the possible extra arguments, like in:

(quoted diff) +1 -0
+	if (fs_ls(argc >= 4 ? argv[3] : "/"))

Here I don't agree. If the command expects a certain set of arguments, we should validate that the user provided exactly that set, and no more. If we allow arbitrary cruft, then if we need to add new arguments later, we won't be able to guarantee that handling those extra arguments won't break some existing broken usage of the command.

#14 lore raw

PATCH v4 3/3 fs: add filesystem switch libary, implement ls and fsload commands

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Quoted 28 lines · Stephen Warren
Quoted 19 lines · Beno?t Th?baudeau

Hi Stephen,

Quoted 15 lines · Stephen Warren

From: Stephen Warren <[email protected]>

Implement "ls" and "fsload" commands that act like {fat,ext2}{ls,load}, and transparently handle either file-system. This scheme could easily be extended to other filesystem types; I only didn't do it for zfs because I don't have any filesystems of that type to test with.

Replace the implementation of {fat,ext[24]}{ls,load} with this new code too.

fs/fs.c +1 -0
 
+int do_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char *

const

Quoted 7 lines
Quoted 2 lines
fs/fs.c +1 -0
+		return 1; + +	if (argc >= 4) { +		addr =

simple_strtoul(argv[3], NULL, 0);

0 is just natural here. However, this raises the issue of the users of the legacy fat and ext commands, which used 16 here. So should we use 0 because it is cleaner, or 16 in order not to break compatibility for existing users?

Quoted 1 line

Oh yes, that is a problem.

I feel I should be donning a brown paper bag here as well.

Quoted 5 lines

I think we should use 0 here for the new commands at least; it has always annoyed me that U-Boot assumes that clearly non-hex values (since there is no 0x) are actually hex. I often have to manually convert values because of this (e.g. host-based ls decimal output to U-Boot command input expecting hex without leading 0x.)

I feel your pain (and have gotten in the habit of doing lots of printf
+ shell math) but don't like changing expectations on the users, even if they are seemingly odd (since they've gotten used to them too).

Quoted 8 lines

However, we do need to fix this for the existing legacy commands. I suggest we either:

a) Add a new parameter to do_fsload() indicating which base to use.

or:

Quoted 7 lines

b) Assume base 0 if fstype==FS_TYPE_ANY, otherwise use 16.

(a) is probably cleaner.

For the environment variables, I suppose we need to continue to explicitly request base 16 conversion, since those variables could be used with either the old or the new commands.

I agree with (a) along with adding to the help which parts are read in as decimal at the cli.

- --
Tom
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://www.enigmail.net/

iQIcBAEBAgAGBQJQkEbSAAoJENk4IS6UOR1W6RsP/3Smcwi5j2SMtVe0P+YjGHrX brNurEoFv60ezqEhssYjxwopTJJpl8Xo8kqS2pcY7JbR8DXszMhacoWhMDwqxqQD DS0tgbMXmXC+hSOs9nM6WY/auJUHbFkC4BbTCaxN8VZ2ovhX/3n//g6Jpbc7G4uC 5Lt0uYercP1NHVEeEoKAyWwklsndS2/+ywj4LN8GWfa7eA/GY0/RIhx56XCSHYLd ogXpOlRY0vZo0egj3a/UNMw3FLCy3XEOKQCGIU6TF5cYK+ZCS15irAFa+o1iv5oB am8Qsu6R6mQr3IgqmM91YV29KlhDYoAfNc8OHJovDYkSvqqon9M3Trr57b3mo0ko FYePs/w529yATS/FeuQgw62/dJd/dccNB/dvna7CjfOW/0B84R/xAAgCnPJn7Jhw +AOjGcILrNGAUQP7kcdNRDRKHelBN1JKsiJdnQpX1m70iAviFAJRV1tl5jktKu8j s57vLfN1uQ9qxcsZ7wyUKkFSfZm2AvdYAl85X9ATPYXKa6Z1acwECZbPXczwRHFm 7bdYZbB9dFIUrE8UMGqYbZUNVwcm+5i5d7pUHDD0rOzklyrqBgrQ/v4FzUSsQQdN eTM8DyrgCqCIbIz5mg63Mhykc20eRwTipp8Laflvp8+/nFUo21lxfvz1wbSMg/n1 /8mEDflYHo4fGKzq414r
=J3B9
-----END PGP SIGNATURE-----

#15 lore raw

PATCH v4 3/3 fs: add filesystem switch libary, implement ls and fsload commands

In reply to Stephen Warren
Quoted 19 lines · Stephen Warren
Quoted 15 lines · Beno?t Th?baudeau

fs/fs.c line 304

Quoted 12 lines

+int do_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],

fs/fs.c new file +6 -0
+	int fstype)
+{
+	if (argc < 2)
+		return CMD_RET_USAGE;
+
+	if (fs_set_blk_dev(argv[1], (argc >= 3) ? argv[2] : NULL,

fstype))

fs/fs.c new file +3 -0
+		return 1;
+
+	if (fs_ls(argc == 4 ? argv[3] : "/"))

IMHO, it would be better to just ignore the possible extra arguments, like in:

Review

Quoted 1 line
(quoted diff) +1 -0
+	if (fs_ls(argc >= 4 ? argv[3] : "/"))

Here I don't agree. If the command expects a certain set of

Quoted 8 lines

arguments,
we should validate that the user provided exactly that set, and no more.
If we allow arbitrary cruft, then if we need to add new arguments later,
we won't be able to guarantee that handling those extra arguments won't
break some existing broken usage of the command.

My comment was misleading. Actually, with the current code, do_ls() can not be called (except directly) if there are more than 4 arguments, because of the way the ls command is declared through U_BOOT_CMD(). Hence, if ">=" is used, arguments can be added later without changing existing lines.

And if we consider a direct call to do_ls() skipping the command system, then this function should return CMD_RET_USAGE if argc > 4.

Best regards,
Beno?t

#16 lore raw

PATCH v4 3/3 fs: add filesystem switch libary, implement ls and fsload commands

Quoted 29 lines · Beno?t Th?baudeau
Quoted 19 lines · Stephen Warren
Quoted 15 lines · Beno?t Th?baudeau

fs/fs.c line 304

Quoted 12 lines

+int do_ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[],

fs/fs.c new file +6 -0
+	int fstype)
+{
+	if (argc < 2)
+		return CMD_RET_USAGE;
+
+	if (fs_set_blk_dev(argv[1], (argc >= 3) ? argv[2] : NULL,

fstype))

fs/fs.c new file +3 -0
+		return 1;
+
+	if (fs_ls(argc == 4 ? argv[3] : "/"))

IMHO, it would be better to just ignore the possible extra arguments, like in:

Review

Quoted 1 line
(quoted diff) +1 -0
+	if (fs_ls(argc >= 4 ? argv[3] : "/"))

Here I don't agree. If the command expects a certain set of

Quoted 8 lines

arguments,
we should validate that the user provided exactly that set, and no more.
If we allow arbitrary cruft, then if we need to add new arguments later,
we won't be able to guarantee that handling those extra arguments won't
break some existing broken usage of the command.

Quoted 4 lines

My comment was misleading. Actually, with the current code, do_ls() can not be called (except directly) if there are more than 4 arguments, because of the way the ls command is declared through U_BOOT_CMD(). Hence, if ">=" is used, arguments can be added later without changing existing lines.

Ah OK, that makes sense.

Quoted 2 lines

And if we consider a direct call to do_ls() skipping the command system, then this function should return CMD_RET_USAGE if argc > 4.

True.

#17 lore raw

PATCH v4 3/3 fs: add filesystem switch libary, implement ls and fsload commands

In reply to Stephen Warren

Dear Stephen Warren,

Quoted 51 lines · Stephen Warren

From: Stephen Warren <[email protected]>

Implement "ls" and "fsload" commands that act like {fat,ext2}{ls,load}, and transparently handle either file-system. This scheme could easily be extended to other filesystem types; I only didn't do it for zfs because I don't have any filesystems of that type to test with.

Replace the implementation of {fat,ext[24]}{ls,load} with this new code too.

---
v4:
* Use FS_TYPE_* everywhere, rather than separate FS_* and FS_TYPE_*.
* Make fs_set_blk_dev() loop over a table of filesystems.
v3:
* Updated the implementation of the new commands to be suitable for use as the body of {fat,ext[24]}{ls,load} too.
* Enhanced the implementation to make more fsload parameters optional (load address, filename); they can now come from environment variables like ext2load supported.
* Moved implementation into fs.c.
* Removed cmd_ext_common.c.
* s/partition/filesystem/ in patch subject.
v2:
* Build cmd_fs.c when CONFIG_CMD_FS_GENERIC not always.
* Use new CONFIG_FS_{FAT,EXT4} rather than CONFIG_CMD_{FAT,EXT2}.
* Implemented fs_close() and call it from the tail of fs_ls() and fs_read(). This ensures that any other usage of e.g. the ext4 library between fs_*() calls, then the two usages won't interfere.
* Re-organized fs.c to reduce the number of ifdef blocks.
* Added argc checking to do_ls().

---
 Makefile                |    3 +-
 common/Makefile         |    6 +-
 common/cmd_ext2.c       |   13 +--
 common/cmd_ext4.c       |   12 +--
 common/cmd_ext_common.c |  197 ------------------------------
 common/cmd_fat.c        |   76 +-----------
 common/cmd_fs.c         |   51 ++++++++
 fs/Makefile             |   47 +++++++
 fs/fs.c                 |  308 +++++++++++++++++++++++++++++++++++++++++++++++
 include/ext_common.h    |    3 -
 include/fs.h            |   65 ++++++++++
 11 files changed, 483 insertions(+), 298 deletions(-)
 delete mode 100644 common/cmd_ext_common.c
 create mode 100644 common/cmd_fs.c
 create mode 100644 fs/Makefile
 create mode 100644 fs/fs.c
 create mode 100644 include/fs.h

<snip>

Quoted 25 lines
common/cmd_fs.c new file +19 -0
new file mode 100644
index 0000000..296124b
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * Inspired by cmd_ext_common.c, cmd_fat.c.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <common.h>

common/cmd_fs.c line 29

Quoted 10 lines
common/cmd_fs.c new file +10 -0
+#include <command.h>
+#include <fs.h>
+
+int do_fsload_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_ANY);
+}
+
+U_BOOT_CMD(
+	fsload,	7,	0,	do_fsload_wrapper,

I just realized that cmd_jffs2.c also defines a U_BOOT_CMD fsload ... this may also be a problem for users of the old command!

However if one defines CONFIG_CMD_JFFS2 _and_ CONFIG_CMD_FS_GENERIC the linker will throw following warning:

---8<--- /tmp/build_avr32/common/cmd_jffs2.o:(.u_boot_list.cmd.fsload+0x0):
multiple definition of _u_boot_list_cmd_fsload' /tmp/build_avr32/common/cmd_fs.o:(.u_boot_list.cmd.fsload+0x0): first defined here /tmp/build_avr32/common/cmd_jffs2.o:(.u_boot_list.cmd.ls+0x0): multiple definition of _u_boot_list_cmd_ls' /tmp/build_avr32/common/cmd_fs.o:(.u_boot_list.cmd.ls+0x0): first defined here
--->8---

Was this intended?

Best regards

Andreas Bie?mann

#18 lore raw

PATCH v4 3/3 fs: add filesystem switch libary, implement ls and fsload commands

Quoted 110 lines · Andreas Bie?mann

Dear Stephen Warren,

Quoted 51 lines · Stephen Warren

From: Stephen Warren <[email protected]>

Implement "ls" and "fsload" commands that act like {fat,ext2}{ls,load}, and transparently handle either file-system. This scheme could easily be extended to other filesystem types; I only didn't do it for zfs because I don't have any filesystems of that type to test with.

Replace the implementation of {fat,ext[24]}{ls,load} with this new code too.

---
v4:
* Use FS_TYPE_* everywhere, rather than separate FS_* and FS_TYPE_*.
* Make fs_set_blk_dev() loop over a table of filesystems.
v3:
* Updated the implementation of the new commands to be suitable for use as the body of {fat,ext[24]}{ls,load} too.
* Enhanced the implementation to make more fsload parameters optional (load address, filename); they can now come from environment variables like ext2load supported.
* Moved implementation into fs.c.
* Removed cmd_ext_common.c.
* s/partition/filesystem/ in patch subject.
v2:
* Build cmd_fs.c when CONFIG_CMD_FS_GENERIC not always.
* Use new CONFIG_FS_{FAT,EXT4} rather than CONFIG_CMD_{FAT,EXT2}.
* Implemented fs_close() and call it from the tail of fs_ls() and fs_read(). This ensures that any other usage of e.g. the ext4 library between fs_*() calls, then the two usages won't interfere.
* Re-organized fs.c to reduce the number of ifdef blocks.
* Added argc checking to do_ls().

---
 Makefile                |    3 +-
 common/Makefile         |    6 +-
 common/cmd_ext2.c       |   13 +--
 common/cmd_ext4.c       |   12 +--
 common/cmd_ext_common.c |  197 ------------------------------
 common/cmd_fat.c        |   76 +-----------
 common/cmd_fs.c         |   51 ++++++++
 fs/Makefile             |   47 +++++++
 fs/fs.c                 |  308 +++++++++++++++++++++++++++++++++++++++++++++++
 include/ext_common.h    |    3 -
 include/fs.h            |   65 ++++++++++
 11 files changed, 483 insertions(+), 298 deletions(-)
 delete mode 100644 common/cmd_ext_common.c
 create mode 100644 common/cmd_fs.c
 create mode 100644 fs/Makefile
 create mode 100644 fs/fs.c
 create mode 100644 include/fs.h

<snip>

Quoted 25 lines
common/cmd_fs.c new file +19 -0
new file mode 100644
index 0000000..296124b
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
+ *
+ * Inspired by cmd_ext_common.c, cmd_fat.c.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms and conditions of the GNU General Public License,
+ * version 2, as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <common.h>

common/cmd_fs.c line 29

Quoted 10 lines
common/cmd_fs.c new file +10 -0
+#include <command.h>
+#include <fs.h>
+
+int do_fsload_wrapper(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
+{
+	return do_fsload(cmdtp, flag, argc, argv, FS_TYPE_ANY);
+}
+
+U_BOOT_CMD(
+	fsload,	7,	0,	do_fsload_wrapper,

I just realized that cmd_jffs2.c also defines a U_BOOT_CMD fsload ... this may also be a problem for users of the old command!

However if one defines CONFIG_CMD_JFFS2 _and_ CONFIG_CMD_FS_GENERIC the linker will throw following warning:

---8<--- /tmp/build_avr32/common/cmd_jffs2.o:(.u_boot_list.cmd.fsload+0x0):
multiple definition of _u_boot_list_cmd_fsload' /tmp/build_avr32/common/cmd_fs.o:(.u_boot_list.cmd.fsload+0x0): first defined here /tmp/build_avr32/common/cmd_jffs2.o:(.u_boot_list.cmd.ls+0x0): multiple definition of _u_boot_list_cmd_ls' /tmp/build_avr32/common/cmd_fs.o:(.u_boot_list.cmd.ls+0x0): first defined here
--->8---

Quoted 1 line

Was this intended?

No, this is certainly a problem. I guess we need to rename the new command.

I had originally thought about calling it plain "load" rather than "fsload" (just like it's "ls" not "fsls"). However, that seemed far too generic. However, given this conflict, and the fact that I don't think there's any existing "load" command, perhaps we have no choice but to s/fsload/load/, unless anyone has any better ideas? "fileload"?

#19 lore raw

PATCH v4 1/3 fs: delete unused Makefile

In reply to Stephen Warren
Quoted 11 lines · Stephen Warren

From: Stephen Warren <[email protected]>

fs/Makefile is unused. The top-level Makefile sets LIBS-y += fs/xxx and hence causes make to directly descend two directory levels into each individual filesystem, and it never descends into fs/ itself.

So, delete this useless file.

This, and the series, now applied to u-boot/master, thanks!

Signature · 8 lines
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20121029/1f2d4722/attachment.pgp>