diff mbox

[U-Boot,v2,2/3] ubifs: Add functions for generic fs use

Message ID 1441037390-6334-3-git-send-email-hdegoede@redhat.com
State Superseded
Delegated to: Tom Rini
Headers show

Commit Message

Hans de Goede Aug. 31, 2015, 4:09 p.m. UTC
Implement the necessary functions for implementing generic fs support
for ubifs.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Heiko Schocher <hs@denx.de>
---
 fs/ubifs/ubifs.c      | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++
 include/ubifs_uboot.h |  4 ++++
 2 files changed, 66 insertions(+)
diff mbox

Patch

diff --git a/fs/ubifs/ubifs.c b/fs/ubifs/ubifs.c
index 04e9a21..4b064a6 100644
--- a/fs/ubifs/ubifs.c
+++ b/fs/ubifs/ubifs.c
@@ -568,6 +568,22 @@  static unsigned long ubifs_findfile(struct super_block *sb, char *filename)
 	return 0;
 }
 
+int ubifs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info)
+{
+	/* Check that ubifs is mounted and that we are not being a blkdev */
+	if (!ubifs_is_mounted()) {
+		printf("UBIFS not mounted, use ubifsmount to mount volume first!\n");
+		return -1;
+	}
+
+	if (rbdd) {
+		printf("UBIFS cannot be used with normal block devices\n");
+		return -1;
+	}
+
+	return 0;
+}
+
 int ubifs_ls(const char *filename)
 {
 	struct ubifs_info *c = ubifs_sb->s_fs_info;
@@ -616,6 +632,48 @@  out:
 	return ret;
 }
 
+int ubifs_exists(const char *filename)
+{
+	struct ubifs_info *c = ubifs_sb->s_fs_info;
+	unsigned long inum;
+
+	c->ubi = ubi_open_volume(c->vi.ubi_num, c->vi.vol_id, UBI_READONLY);
+	inum = ubifs_findfile(ubifs_sb, (char *)filename);
+	ubi_close_volume(c->ubi);
+
+	return inum != 0;
+}
+
+int ubifs_size(const char *filename, loff_t *size)
+{
+	struct ubifs_info *c = ubifs_sb->s_fs_info;
+	unsigned long inum;
+	struct inode *inode;
+	int err = 0;
+
+	c->ubi = ubi_open_volume(c->vi.ubi_num, c->vi.vol_id, UBI_READONLY);
+
+	inum = ubifs_findfile(ubifs_sb, (char *)filename);
+	if (!inum) {
+		err = -1;
+		goto out;
+	}
+
+	inode = ubifs_iget(ubifs_sb, inum);
+	if (IS_ERR(inode)) {
+		printf("%s: Error reading inode %ld!\n", __func__, inum);
+		err = PTR_ERR(inode);
+		goto out;
+	}
+
+	*size = inode->i_size;
+
+	ubifs_iput(inode);
+out:
+	ubi_close_volume(c->ubi);
+	return err;
+}
+
 /*
  * ubifsload...
  */
@@ -873,6 +931,10 @@  out:
 	return err;
 }
 
+void ubifs_close(void)
+{
+}
+
 /* Compat wrappers for common/cmd_ubifs.c */
 int ubifs_load(char *filename, u32 addr, u32 size)
 {
diff --git a/include/ubifs_uboot.h b/include/ubifs_uboot.h
index 3e0cd72..dab433a 100644
--- a/include/ubifs_uboot.h
+++ b/include/ubifs_uboot.h
@@ -21,8 +21,12 @@  void uboot_ubifs_umount(void);
 int ubifs_is_mounted(void);
 int ubifs_load(char *filename, u32 addr, u32 size);
 
+int ubifs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info);
 int ubifs_ls(const char *dir_name);
+int ubifs_exists(const char *filename);
+int ubifs_size(const char *filename, loff_t *size);
 int ubifs_read(const char *filename, void *buf, loff_t offset,
 	       loff_t size, loff_t *actread);
+void ubifs_close(void);
 
 #endif /* __UBIFS_UBOOT_H__ */