diff --git a/fs/ext4/ext4fs.c b/fs/ext4/ext4fs.c
index 7fdb463..4dddde2 100644
--- a/fs/ext4/ext4fs.c
+++ b/fs/ext4/ext4fs.c
@@ -191,3 +191,40 @@ int ext4fs_read(char *buf, unsigned len)
 
 	return ext4fs_read_file(ext4fs_file, 0, len, buf);
 }
+
+int ext4fs_probe(block_dev_desc_t *fs_dev_desc,
+		 disk_partition_t *fs_partition)
+{
+	ext4fs_set_blk_dev(fs_dev_desc, fs_partition);
+
+	if (!ext4fs_mount(fs_partition->size)) {
+		ext4fs_close();
+		return -1;
+	}
+
+	return 0;
+}
+
+int ext4_read_file(const char *filename, void *buf, int offset, int len)
+{
+	int file_len;
+	int len_read;
+
+	if (offset != 0) {
+		printf("** Cannot support non-zero offset **\n");
+		return -1;
+	}
+
+	file_len = ext4fs_open(filename);
+	if (file_len < 0) {
+		printf("** File not found %s **\n", filename);
+		return -1;
+	}
+
+	if (len == 0)
+		len = file_len;
+
+	len_read = ext4fs_read(buf, len);
+
+	return len_read;
+}
diff --git a/fs/fat/fat.c b/fs/fat/fat.c
index 393c378..82135b5 100644
--- a/fs/fat/fat.c
+++ b/fs/fat/fat.c
@@ -1256,3 +1256,20 @@ long file_fat_read(const char *filename, void *buffer, unsigned long maxsize)
 {
 	return file_fat_read_at(filename, 0, buffer, maxsize);
 }
+
+int fat_read_file(const char *filename, void *buf, int offset, int len)
+{
+	int len_read;
+
+	len_read = file_fat_read_at(filename, offset, buf, len);
+	if (len_read == -1) {
+		printf("** Unable to read file %s **\n", filename);
+		return -1;
+	}
+
+	return len_read;
+}
+
+void fat_close(void)
+{
+}
diff --git a/fs/fs.c b/fs/fs.c
index 0cbec99..95c882e 100644
--- a/fs/fs.c
+++ b/fs/fs.c
@@ -50,110 +50,6 @@ static inline void fs_close_unsupported(void)
 {
 }
 
-#ifdef CONFIG_FS_FAT
-static int fs_probe_fat(block_dev_desc_t *fs_dev_desc,
-			disk_partition_t *fs_partition)
-{
-	return fat_set_blk_dev(fs_dev_desc, fs_partition);
-}
-
-static void fs_close_fat(void)
-{
-}
-
-#define fs_ls_fat file_fat_ls
-
-static int fs_read_fat(const char *filename, void *buf, int offset, int len)
-{
-	int len_read;
-
-	len_read = file_fat_read_at(filename, offset, buf, len);
-	if (len_read == -1) {
-		printf("** Unable to read file %s **\n", filename);
-		return -1;
-	}
-
-	return len_read;
-}
-#else
-static inline int fs_probe_fat(void)
-{
-	return -1;
-}
-
-static inline void fs_close_fat(void)
-{
-}
-
-#define fs_ls_fat fs_ls_unsupported
-#define fs_read_fat fs_read_unsupported
-#endif
-
-#ifdef CONFIG_FS_EXT4
-static int fs_probe_ext(block_dev_desc_t *fs_dev_desc,
-			disk_partition_t *fs_partition)
-{
-	ext4fs_set_blk_dev(fs_dev_desc, fs_partition);
-
-	if (!ext4fs_mount(fs_partition->size)) {
-		ext4fs_close();
-		return -1;
-	}
-
-	return 0;
-}
-
-static void fs_close_ext(void)
-{
-	ext4fs_close();
-}
-
-#define fs_ls_ext ext4fs_ls
-
-static int fs_read_ext(const char *filename, void *buf, int offset, int len)
-{
-	int file_len;
-	int len_read;
-
-	if (offset != 0) {
-		printf("** Cannot support non-zero offset **\n");
-		return -1;
-	}
-
-	file_len = ext4fs_open(filename);
-	if (file_len < 0) {
-		printf("** File not found %s **\n", filename);
-		ext4fs_close();
-		return -1;
-	}
-
-	if (len == 0)
-		len = file_len;
-
-	len_read = ext4fs_read(buf, len);
-	ext4fs_close();
-
-	if (len_read != len) {
-		printf("** Unable to read file %s **\n", filename);
-		return -1;
-	}
-
-	return len_read;
-}
-#else
-static inline int fs_probe_ext(void)
-{
-	return -1;
-}
-
-static inline void fs_close_ext(void)
-{
-}
-
-#define fs_ls_ext fs_ls_unsupported
-#define fs_read_ext fs_read_unsupported
-#endif
-
 struct fstype_info {
 	int fstype;
 	int (*probe)(block_dev_desc_t *fs_dev_desc,
@@ -167,19 +63,19 @@ static struct fstype_info fstypes[] = {
 #ifdef CONFIG_FS_FAT
 	{
 		.fstype = FS_TYPE_FAT,
-		.probe = fs_probe_fat,
-		.close = fs_close_fat,
+		.probe = fat_set_blk_dev,
+		.close = fat_close,
 		.ls = file_fat_ls,
-		.read = fs_read_fat,
+		.read = fat_read_file,
 	},
 #endif
 #ifdef CONFIG_FS_EXT4
 	{
 		.fstype = FS_TYPE_EXT,
-		.probe = fs_probe_ext,
-		.close = fs_close_ext,
+		.probe = ext4fs_probe,
+		.close = ext4fs_close,
 		.ls = ext4fs_ls,
-		.read = fs_read_ext,
+		.read = ext4_read_file,
 	},
 #endif
 	{
@@ -248,6 +144,7 @@ static void fs_close(void)
 	struct fstype_info *info = fs_get_info(fs_type);
 
 	info->close();
+
 	fs_type = FS_TYPE_ANY;
 }
 
@@ -259,6 +156,7 @@ int fs_ls(const char *dirname)
 
 	ret = info->ls(dirname);
 
+	fs_type = FS_TYPE_ANY;
 	fs_close();
 
 	return ret;
diff --git a/include/ext4fs.h b/include/ext4fs.h
index 3b59d15..025a2e8 100644
--- a/include/ext4fs.h
+++ b/include/ext4fs.h
@@ -138,4 +138,7 @@ void ext4fs_free_node(struct ext2fs_node *node, struct ext2fs_node *currroot);
 int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf);
 void ext4fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info);
 long int read_allocated_block(struct ext2_inode *inode, int fileblock);
+int ext4fs_probe(block_dev_desc_t *fs_dev_desc,
+		 disk_partition_t *fs_partition);
+int ext4_read_file(const char *filename, void *buf, int offset, int len);
 #endif
diff --git a/include/fat.h b/include/fat.h
index 706cd7a..0b9017e 100644
--- a/include/fat.h
+++ b/include/fat.h
@@ -216,4 +216,6 @@ int fat_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info);
 int fat_register_device(block_dev_desc_t *dev_desc, int part_no);
 
 int file_fat_write(const char *filename, void *buffer, unsigned long maxsize);
+int fat_read_file(const char *filename, void *buf, int offset, int len);
+void fat_close(void);
 #endif /* _FAT_H_ */
