diff options
| author | gkostka <kostka.grzegorz@gmail.com> | 2013-10-10 20:15:09 +0000 |
|---|---|---|
| committer | gkostka <kostka.grzegorz@gmail.com> | 2013-10-10 20:15:09 +0000 |
| commit | 31e09211a04626c08219c545a1e8885a34376750 (patch) | |
| tree | d33b9f93f18c87d4647d07e33e7264885a4772cb /src | |
| parent | 6b8e5b91d54162a369f8962b09bbf07fb45eae6f (diff) | |
Add mount point stats.
Last char of mount point should be '/'
Diffstat (limited to 'src')
| -rw-r--r-- | src/demos/generic/main.c | 34 | ||||
| -rw-r--r-- | src/ext4.h | 36 | ||||
| -rw-r--r-- | src/lwext4/ext4.c | 51 |
3 files changed, 98 insertions, 23 deletions
diff --git a/src/demos/generic/main.c b/src/demos/generic/main.c index dfcde9d..20639d5 100644 --- a/src/demos/generic/main.c +++ b/src/demos/generic/main.c @@ -121,6 +121,27 @@ static void dir_ls(const char *path) ext4_dir_close(&d);
}
+static void mp_stats(void)
+{
+ struct ext4_mount_stats stats;
+ ext4_mount_point_stats("/mp/", &stats);
+
+ printf("**********************************************\n");
+ printf("ext4_mount_point_stats\n");
+ printf("inodes_count = %d\n", stats.inodes_count);
+ printf("free_inodes_count = %d\n", stats.free_inodes_count);
+ printf("blocks_count = %d\n", stats.blocks_count);
+ printf("free_blocks_count = %d\n", stats.free_blocks_count);
+ printf("block_size = %d\n", stats.block_size);
+ printf("block_group_count = %d\n", stats.block_group_count);
+ printf("blocks_per_group = %d\n", stats.blocks_per_group);
+ printf("inodes_per_group = %d\n", stats.inodes_per_group);
+ printf("volume_name = %s\n", stats.volume_name);
+
+ printf("**********************************************\n");
+
+}
+
int main(int argc, char **argv)
{
@@ -196,16 +217,24 @@ int main(int argc, char **argv) return EXIT_FAILURE;
}
- r = ext4_mount("ext4_filesim", "/mp");
+ r = ext4_mount("ext4_filesim", "/mp/");
if(r != EOK){
printf("ext4_mount ERROR = %d\n", r);
return EXIT_FAILURE;
}
+ ext4_fremove("/mp/hello.txt");
ext4_fremove("/mp/test1");
+ mp_stats();
dir_ls("/mp/");
+ /*Add hello world file.*/
+ r = ext4_fopen(&f, "/mp/hello.txt", "wb");
+ r = ext4_fwrite(&f, "Hello World !\n", strlen("Hello World !\n"), 0);
+ r = ext4_fclose(&f);
+
+
printf("ext4_fopen: test1\n");
r = ext4_fopen(&f, "/mp/test1", "wb");
@@ -264,9 +293,10 @@ int main(int argc, char **argv) r = ext4_fclose(&f);
+ mp_stats();
dir_ls("/mp/");
- r = ext4_umount("/mp");
+ r = ext4_umount("/mp/");
printf("Test finish: OK\n");
return EXIT_SUCCESS;
@@ -169,8 +169,9 @@ int ext4_device_register(struct ext4_blockdev *bd, struct ext4_bcache *bc, /**@brief Mount a block device with EXT4 partition to the mountpoint.
* @param dev_name block device name (@ref ext4_device_register)
* @param mount_point pount point, for example
- * - /my_partition
- * - /my_second_partition
+ * - /
+ * - /my_partition/
+ * - /my_second_partition/
*
* @return standard error code */
int ext4_mount(const char * dev_name, char *mount_point);
@@ -180,10 +181,29 @@ int ext4_mount(const char * dev_name, char *mount_point); * @return standard error code */
int ext4_umount(char *mount_point);
+
+/**@brief Some of the filesystem params.*/
+struct ext4_mount_stats {
+ uint32_t inodes_count;
+ uint32_t free_inodes_count;
+ uint64_t blocks_count;
+ uint64_t free_blocks_count;
+
+ uint32_t block_size;
+ uint32_t block_group_count;
+ uint32_t blocks_per_group;
+ uint32_t inodes_per_group;
+
+ char volume_name[16];
+};
+
+int ext4_mount_point_stats(const char *mount_point,
+ struct ext4_mount_stats *stats);
+
/********************************FILE OPERATIONS*****************************/
/**@brief */
-int ext4_fremove(const char *path);
+int ext4_fremove(const char *path);
/**@brief File open function.
* @param filename, (has to start from mountpoint)
@@ -204,19 +224,19 @@ int ext4_fremove(const char *path); * |---------------------------------------------------------------|
*
* @return standard error code*/
-int ext4_fopen (ext4_file *f, const char *path, const char *flags);
+int ext4_fopen (ext4_file *f, const char *path, const char *flags);
/**@brief */
-int ext4_fclose(ext4_file *f);
+int ext4_fclose(ext4_file *f);
/**@brief */
-int ext4_fread (ext4_file *f, void *buf, uint32_t size, uint32_t *rcnt);
+int ext4_fread (ext4_file *f, void *buf, uint32_t size, uint32_t *rcnt);
/**@brief */
-int ext4_fwrite(ext4_file *f, void *buf, uint32_t size, uint32_t *wcnt);
+int ext4_fwrite(ext4_file *f, void *buf, uint32_t size, uint32_t *wcnt);
/**@brief */
-int ext4_fseek (ext4_file *f, uint64_t offset, uint32_t origin);
+int ext4_fseek (ext4_file *f, uint64_t offset, uint32_t origin);
/**@brief */
uint64_t ext4_ftell (ext4_file *f);
diff --git a/src/lwext4/ext4.c b/src/lwext4/ext4.c index 011e612..a0ceecf 100644 --- a/src/lwext4/ext4.c +++ b/src/lwext4/ext4.c @@ -71,7 +71,7 @@ struct ext4_mountpoint { struct ext4_fs fs;
/**@brief Dynamic alocation cache flag.*/
- bool cache_dynamic;
+ bool cache_dynamic;
};
/**@brief Block devices descriptor.*/
@@ -315,6 +315,9 @@ int ext4_mount(const char * dev_name, char *mount_point) struct ext4_bcache *bc = 0;
struct ext4_mountpoint *mp = 0;
+ if(mount_point[strlen(mount_point) - 1] != '/')
+ return ENOTSUP;
+
for (i = 0; i < CONFIG_EXT4_BLOCKDEVS_COUNT; ++i) {
if(_bdevices[i].name){
if(!strcmp(dev_name, _bdevices[i].name)){
@@ -418,6 +421,40 @@ int ext4_umount(char *mount_point) return ext4_block_fini(mp->fs.bdev);
}
+int ext4_mount_point_stats(const char *mount_point,
+ struct ext4_mount_stats *stats)
+{
+ uint32_t i;
+ struct ext4_mountpoint *mp = 0;
+
+ for (i = 0; i < CONFIG_EXT4_MOUNTPOINTS_COUNT; ++i) {
+ if(_mp[i].name){
+ if(!strcmp(_mp[i].name, mount_point))
+ mp = &_mp[i];
+ break;
+ }
+ }
+
+ if(!mp)
+ return ENOENT;
+
+
+ EXT4_MP_LOCK(mp);
+ stats->inodes_count = ext4_get32(&mp->fs.sb, inodes_count);
+ stats->free_inodes_count = ext4_get32(&mp->fs.sb, free_inodes_count);
+ stats->blocks_count = ext4_sb_get_blocks_cnt(&mp->fs.sb);
+ stats->free_blocks_count = ext4_sb_get_free_blocks_cnt(&mp->fs.sb);
+ stats->block_size = ext4_sb_get_block_size(&mp->fs.sb);
+
+ stats->block_group_count = ext4_block_group_cnt(&mp->fs.sb);
+ stats->blocks_per_group = ext4_get32(&mp->fs.sb, blocks_per_group);
+ stats->inodes_per_group = ext4_get32(&mp->fs.sb, inodes_per_group);
+
+ memcpy(stats->volume_name, mp->fs.sb.volume_name, 16);
+ EXT4_MP_UNLOCK(mp);
+
+ return EOK;
+}
/********************************FILE OPERATIONS*****************************/
@@ -517,12 +554,6 @@ static int ext4_generic_open (ext4_file *f, const char *path, /*Skip mount point*/
path += strlen(mp->name);
- /*Skip first /*/
- if(*path != '/')
- return ENOENT;
-
- path++;
-
EXT4_MP_LOCK(mp);
/*Load root*/
@@ -677,12 +708,6 @@ int ext4_fremove(const char *path) /*Skip mount point*/
path += strlen(mp->name);
- /*Skip first /*/
- if(*path != '/')
- return ENOENT;
-
- path++;
-
/*Lock mountpoint*/
EXT4_MP_LOCK(mp);
|
