[U-Boot] [PATCH] fs/fs.c: fix fs_set_blk_dev() for manual relocation

Andreas Bießmann
2012-10-30T18:29:22Z

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.

Signed-off-by: Andreas Bie?mann <andreas.devel@googlemail.com>
Cc: swarren at wwwdotorg.org
Cc: trini at ti.com
---
fs/fs.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/fs/fs.c b/fs/fs.c
index 23ffa25..66feb30 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -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);
--
1.8.0