ref: 406d9c3c653b53f4202f0de3f9b3e8a0a1eec70c
parent: ec5adbc6757768592da6917a07f6bc1c588ad2f8
author: gkostka <[email protected]>
date: Thu Feb 16 19:54:06 EST 2017
ext4: add block device unregister by name & all methods
--- a/include/ext4.h
+++ b/include/ext4.h
@@ -108,25 +108,38 @@
/********************************MOUNT OPERATIONS****************************/
-/**@brief Register a block device to a name.
- * @warning Block device has to be filled by
- * Block cache may by created automatically when bc parameter is NULL.
- * @param bd block device
- * @param bd block device cache
- * @param dev_name register name
- * @param standard error code*/
+/**@brief Register block device.
+ *
+ * @param bd Block device.
+ * @param bd Block device cache.
+ * @param dev_name Block device name.
+ *
+ * @return Standard error code.*/
int ext4_device_register(struct ext4_blockdev *bd, struct ext4_bcache *bc,
const char *dev_name);
+/**@brief Un-register block device.
+ *
+ * @param dev_name Block device name.
+ *
+ * @return Standard error code.*/
+int ext4_device_unregister(const char *dev_name);
+
+/**@brief Un-register all block devices.
+ *
+ * @return Standard error code.*/
+int ext4_device_unregister_all(void);
+
/**@brief Mount a block device with EXT4 partition to the mount point.
- * @param dev_name block device name (@ref ext4_device_register)
- * @param mount_point mount point, for example
+ *
+ * @param dev_name block Device name (@ref ext4_device_register).
+ * @param mount_point Mount point, for example:
* - /
* - /my_partition/
* - /my_second_partition/
* @param read_only mount as read-only mode.
*
- * @return standard error code */
+ * @return Standard error code */
int ext4_mount(const char *dev_name,
const char *mount_point,
bool read_only);
--- a/include/ext4_config.h
+++ b/include/ext4_config.h
@@ -123,9 +123,21 @@
#define CONFIG_BLOCK_DEV_CACHE_SIZE 8
#endif
+
+/**@brief Maximum block device name*/
+#ifndef CONFIG_EXT4_MAX_BLOCKDEV_NAME
+#define CONFIG_EXT4_MAX_BLOCKDEV_NAME 32
+#endif
+
+
/**@brief Maximum block device count*/
#ifndef CONFIG_EXT4_BLOCKDEVS_COUNT
#define CONFIG_EXT4_BLOCKDEVS_COUNT 2
+#endif
+
+/**@brief Maximum mountpoint name*/
+#ifndef CONFIG_EXT4_MAX_MP_NAME
+#define CONFIG_EXT4_MAX_MP_NAME 32
#endif
/**@brief Maximum mountpoint count*/
--- a/src/ext4.c
+++ b/src/ext4.c
@@ -78,7 +78,7 @@
bool mounted;
/**@brief Mount point name (@ref ext4_mount)*/
- char name[32];
+ char name[CONFIG_EXT4_MAX_MP_NAME + 1];
/**@brief OS dependent lock/unlock functions.*/
const struct ext4_lock *os_locks;
@@ -89,15 +89,18 @@
/**@brief Dynamic allocation cache flag.*/
bool cache_dynamic;
+ /**@brief JBD fs.*/
struct jbd_fs jbd_fs;
+
+ /**@brief Journal.*/
struct jbd_journal jbd_journal;
};
/**@brief Block devices descriptor.*/
-struct _ext4_devices {
+struct ext4_block_devices {
/**@brief Block device name (@ref ext4_device_register)*/
- char name[32];
+ char name[CONFIG_EXT4_MAX_BLOCKDEV_NAME + 1];
/**@brief Block device handle.*/
struct ext4_blockdev *bd;
@@ -107,31 +110,57 @@
};
/**@brief Block devices.*/
-struct _ext4_devices _bdevices[CONFIG_EXT4_BLOCKDEVS_COUNT];
+static struct ext4_block_devices s_bdevices[CONFIG_EXT4_BLOCKDEVS_COUNT];
/**@brief Mountpoints.*/
-struct ext4_mountpoint _mp[CONFIG_EXT4_MOUNTPOINTS_COUNT];
+static struct ext4_mountpoint s_mp[CONFIG_EXT4_MOUNTPOINTS_COUNT];
int ext4_device_register(struct ext4_blockdev *bd, struct ext4_bcache *bc,
const char *dev_name)
{
- uint32_t i;
ext4_assert(bd && dev_name);
- for (i = 0; i < CONFIG_EXT4_BLOCKDEVS_COUNT; ++i) {
- if (!_bdevices[i].bd) {
- strcpy(_bdevices[i].name, dev_name);
- _bdevices[i].bd = bd;
- _bdevices[i].bc = bc;
- return EOK;
- }
+ if (strlen(dev_name) > CONFIG_EXT4_MAX_BLOCKDEV_NAME)
+ return EINVAL;
- if (!strcmp(_bdevices[i].name, dev_name))
+ for (size_t i = 0; i < CONFIG_EXT4_BLOCKDEVS_COUNT; ++i) {
+ if (!strcmp(s_bdevices[i].name, dev_name))
+ return EEXIST;
+ }
+
+ for (size_t i = 0; i < CONFIG_EXT4_BLOCKDEVS_COUNT; ++i) {
+ if (!s_bdevices[i].bd) {
+ strcpy(s_bdevices[i].name, dev_name);
+ s_bdevices[i].bd = bd;
+ s_bdevices[i].bc = bc;
return EOK;
+ }
}
+
return ENOSPC;
}
+int ext4_device_unregister(const char *dev_name)
+{
+ ext4_assert(dev_name);
+
+ for (size_t i = 0; i < CONFIG_EXT4_BLOCKDEVS_COUNT; ++i) {
+ if (strcmp(s_bdevices[i].name, dev_name))
+ continue;
+
+ memset(&s_bdevices[i], 0, sizeof(s_bdevices[i]));
+ }
+
+ return ENOENT;
+}
+
+int ext4_device_unregister_all(void)
+{
+ memset(s_bdevices, 0, sizeof(s_bdevices));
+
+ return EOK;
+}
+
/****************************************************************************/
static bool ext4_is_dots(const uint8_t *name, size_t name_size)
@@ -337,23 +366,27 @@
int ext4_mount(const char *dev_name, const char *mount_point,
bool read_only)
{
- ext4_assert(mount_point && dev_name);
int r;
- int i;
-
uint32_t bsize;
struct ext4_blockdev *bd = 0;
struct ext4_bcache *bc = 0;
struct ext4_mountpoint *mp = 0;
- if (mount_point[strlen(mount_point) - 1] != '/')
+ ext4_assert(mount_point && dev_name);
+
+ size_t mp_len = strlen(mount_point);
+
+ if (mp_len > CONFIG_EXT4_MAX_MP_NAME)
+ return EINVAL;
+
+ if (mount_point[mp_len - 1] != '/')
return ENOTSUP;
- for (i = 0; i < CONFIG_EXT4_BLOCKDEVS_COUNT; ++i) {
- if (_bdevices[i].name) {
- if (!strcmp(dev_name, _bdevices[i].name)) {
- bd = _bdevices[i].bd;
- bc = _bdevices[i].bc;
+ for (size_t i = 0; i < CONFIG_EXT4_BLOCKDEVS_COUNT; ++i) {
+ if (s_bdevices[i].name) {
+ if (!strcmp(dev_name, s_bdevices[i].name)) {
+ bd = s_bdevices[i].bd;
+ bc = s_bdevices[i].bc;
break;
}
}
@@ -362,15 +395,15 @@
if (!bd)
return ENODEV;
- for (i = 0; i < CONFIG_EXT4_MOUNTPOINTS_COUNT; ++i) {
- if (!_mp[i].mounted) {
- strcpy(_mp[i].name, mount_point);
- _mp[i].mounted = 1;
- mp = &_mp[i];
+ for (size_t i = 0; i < CONFIG_EXT4_MOUNTPOINTS_COUNT; ++i) {
+ if (!s_mp[i].mounted) {
+ strcpy(s_mp[i].name, mount_point);
+ s_mp[i].mounted = 1;
+ mp = &s_mp[i];
break;
}
- if (!strcmp(_mp[i].name, mount_point))
+ if (!strcmp(s_mp[i].name, mount_point))
return EOK;
}
@@ -433,8 +466,8 @@
struct ext4_mountpoint *mp = 0;
for (i = 0; i < CONFIG_EXT4_MOUNTPOINTS_COUNT; ++i) {
- if (!strcmp(_mp[i].name, mount_point)) {
- mp = &_mp[i];
+ if (!strcmp(s_mp[i].name, mount_point)) {
+ mp = &s_mp[i];
break;
}
}
@@ -464,11 +497,11 @@
int i;
for (i = 0; i < CONFIG_EXT4_MOUNTPOINTS_COUNT; ++i) {
- if (!_mp[i].mounted)
+ if (!s_mp[i].mounted)
continue;
- if (!strncmp(_mp[i].name, path, strlen(_mp[i].name)))
- return &_mp[i];
+ if (!strncmp(s_mp[i].name, path, strlen(s_mp[i].name)))
+ return &s_mp[i];
}
return NULL;
}
@@ -724,8 +757,8 @@
struct ext4_mountpoint *mp = 0;
for (i = 0; i < CONFIG_EXT4_MOUNTPOINTS_COUNT; ++i) {
- if (!strcmp(_mp[i].name, mount_point)) {
- mp = &_mp[i];
+ if (!strcmp(s_mp[i].name, mount_point)) {
+ mp = &s_mp[i];
break;
}
}