فهرست منبع

dfs: refine code

decrease indentation to make cleaner code
fix mkfs bug when there is no mkfs implementation
prife 12 سال پیش
والد
کامیت
7fd6d17d5b
1فایلهای تغییر یافته به همراه70 افزوده شده و 117 حذف شده
  1. 70 117
      components/dfs/src/dfs_fs.c

+ 70 - 117
components/dfs/src/dfs_fs.c

@@ -103,25 +103,21 @@ struct dfs_filesystem *dfs_filesystem_lookup(const char *path)
     /* lookup it in the filesystem table */
     for (index = 0; index < DFS_FILESYSTEMS_MAX; index++)
     {
-        if (filesystem_table[index].path == RT_NULL)
+        if ((filesystem_table[index].path == RT_NULL)
+            || (filesystem_table[index].ops == RT_NULL))
             continue;
-        else
-        {
-            fspath = strlen(filesystem_table[index].path);
-            if (fspath < prefixlen)
-                continue;
-        }
 
-        if ((filesystem_table[index].ops != RT_NULL) &&
-            (strncmp(filesystem_table[index].path, path, fspath) == 0))
-        {
-            /* check next path separator */
-            if (fspath > 1 && (strlen(path) > fspath) && (path[fspath] != '/'))
-                continue;
+        fspath = strlen(filesystem_table[index].path);
+        if ((fspath < prefixlen)
+            || (strncmp(filesystem_table[index].path, path, fspath) != 0))
+            continue;
 
-            fs = &filesystem_table[index];
-            prefixlen = fspath;
-        }
+        /* check next path separator */
+        if (fspath > 1 && (strlen(path) > fspath) && (path[fspath] != '/'))
+            continue;
+
+        fs = &filesystem_table[index];
+        prefixlen = fspath;
     }
 
     dfs_unlock();
@@ -147,64 +143,42 @@ rt_err_t dfs_filesystem_get_partition(struct dfs_partition *part,
 
     rt_uint8_t *dpt;
     rt_uint8_t type;
-    rt_err_t result;
 
     RT_ASSERT(part != RT_NULL);
     RT_ASSERT(buf != RT_NULL);
 
-    result = RT_EOK;
-
     dpt = buf + DPT_ADDRESS + pindex * DPT_ITEM_SIZE;
 
+    /* check if it is a valid partition table */
     if ((*dpt != 0x80) && (*dpt != 0x00))
-    {
-        /* which is not a partition table */
-        result = -RT_ERROR;
-
-        return result;
-    }
+        return -RT_ERROR;
 
     /* get partition type */
     type = *(dpt+4);
-
-    if (type != 0)
-    {
-        /* set partition type */
-        part->type = type;
-
-        /* get partition offset and size */
-        part->offset = *(dpt+8) | *(dpt+9)<<8 | *(dpt+10)<<16 | *(dpt+11)<<24;
-        part->size = *(dpt+12) | *(dpt+13)<<8 | *(dpt+14)<<16 | *(dpt+15)<<24;
-
-        rt_kprintf("found part[%d], begin: %d, size: ",
-                   pindex, part->offset*512);
-        if ((part->size>>11) > 0) /* MB */
-        {
-            unsigned int part_size;
-            part_size = part->size >> 11;/* MB */
-            if ((part_size>>10) > 0) /* GB */
-            {
-                /* GB */
-                rt_kprintf("%d.%d%s",part_size>>10,part_size&0x3FF,"GB\r\n");
-            }
-            else
-            {
-                /* MB */
-                rt_kprintf("%d.%d%s",part_size,(part->size>>1)&0x3FF,"MB\r\n");
-            }
-        }
-        else
-        {
-            /* KB */
-            rt_kprintf("%d%s",part->size>>1,"KB\r\n");
-        }
-    }
+    if (type == 0)
+        return -RT_ERROR;
+
+    /* set partition information
+     *    size is the number of 512-Byte */
+    part->type = type;
+    part->offset = *(dpt+8) | *(dpt+9)<<8 | *(dpt+10)<<16 | *(dpt+11)<<24;
+    part->size = *(dpt+12) | *(dpt+13)<<8 | *(dpt+14)<<16 | *(dpt+15)<<24;
+
+    rt_kprintf("found part[%d], begin: %d, size: ",
+               pindex, part->offset*512);
+    if ((part->size>>11) == 0)
+        rt_kprintf("%d%s",part->size>>1,"KB\n");     /* KB */
     else
     {
-        result = -RT_ERROR;
+        unsigned int part_size;
+        part_size = part->size >> 11;                /* MB */
+        if ((part_size>>10) == 0)
+            rt_kprintf("%d.%d%s",part_size,(part->size>>1)&0x3FF,"MB\n");
+        else
+            rt_kprintf("%d.%d%s",part_size>>10,part_size&0x3FF,"GB\n");
     }
 
-    return result;
+    return RT_EOK;
 }
 
 /**
@@ -231,21 +205,16 @@ int dfs_mount(const char   *device_name,
     int index, free_index;
 
     /* open specific device */
-    if (device_name != RT_NULL)
+    if (device_name == RT_NULL)
     {
-        dev_id = rt_device_find(device_name);
-        if (dev_id == RT_NULL)
-        {
-            /* no this device */
-            rt_set_errno(-DFS_STATUS_ENODEV);
-
-            return -1;
-        }
+        /* which is a non-device filesystem mount */
+        dev_id = NULL;
     }
-    else
+    else if ((dev_id = rt_device_find(device_name)) == RT_NULL)
     {
-        /* which is a non-device filesystem mount */
-        dev_id = RT_NULL;
+        /* no this device */
+        rt_set_errno(-DFS_STATUS_ENODEV);
+        return -1;
     }
 
     /* find out specific filesystem */
@@ -264,17 +233,22 @@ int dfs_mount(const char   *device_name,
     if (index == DFS_FILESYSTEM_TYPES_MAX)
     {
         rt_set_errno(-DFS_STATUS_ENODEV);
-
         return -1;
     }
+
+    /* check if there is mount implementation */
     ops = filesystem_operation_table[index];
+    if ((ops == NULL) || (ops->mount == NULL))
+    {
+        rt_set_errno(-DFS_STATUS_ENOSYS);
+        return -1;
+    }
 
     /* make full path for special file */
     fullpath = dfs_normalize_path(RT_NULL, path);
     if (fullpath == RT_NULL) /* not an abstract path */
     {
         rt_set_errno(-DFS_STATUS_ENOTDIR);
-
         return -1;
     }
 
@@ -293,8 +267,8 @@ int dfs_mount(const char   *device_name,
         dfs_file_close(&fd);
     }
 
-    free_index = DFS_FILESYSTEMS_MAX;
     /* check whether the file system mounted or not */
+    free_index = DFS_FILESYSTEMS_MAX;
     dfs_lock();
     for (index = 0; index < DFS_FILESYSTEMS_MAX; index ++)
     {
@@ -304,6 +278,7 @@ int dfs_mount(const char   *device_name,
             if (free_index == DFS_FILESYSTEMS_MAX)
                 free_index = index;
         }
+        /* check if the PATH is mounted */
         else if (strcmp(filesystem_table[index].path, path) == 0)
         {
             rt_set_errno(-DFS_STATUS_EINVAL);
@@ -330,23 +305,8 @@ int dfs_mount(const char   *device_name,
     if (dev_id != RT_NULL)
         rt_device_open(fs->dev_id, RT_DEVICE_OFLAG_RDWR);
 
-    /* there is no mount implementation */
-    if (ops->mount == RT_NULL)
-    {
-        if (dev_id != RT_NULL)
-            rt_device_close(dev_id);
-        dfs_lock();
-        /* clear filesystem table entry */
-        rt_memset(fs, 0, sizeof(struct dfs_filesystem));
-        dfs_unlock();
-
-        rt_free(fullpath);
-        rt_set_errno(-DFS_STATUS_ENOSYS);
-
-        return -1;
-    }
     /* call mount of this filesystem */
-    else if (ops->mount(fs, rwflag, data) < 0)
+    if (ops->mount(fs, rwflag, data) < 0)
     {
         /* close device */
         if (dev_id != RT_NULL)
@@ -356,19 +316,14 @@ int dfs_mount(const char   *device_name,
         dfs_lock();
         /* clear filesystem table entry */
         rt_memset(fs, 0, sizeof(struct dfs_filesystem));
-        dfs_unlock();
-
-        rt_free(fullpath);
-
-        return -1;
+        goto err1;
     }
 
     return 0;
 
 err1:
     dfs_unlock();
-    if (fullpath != RT_NULL)
-        rt_free(fullpath);
+    rt_free(fullpath);
 
     return -1;
 }
@@ -437,12 +392,10 @@ err1:
 int dfs_mkfs(const char *fs_name, const char *device_name)
 {
     int index;
-    rt_device_t dev_id;
+    rt_device_t dev_id = RT_NULL;
 
     /* check device name, and it should not be NULL */
-    if (device_name == RT_NULL)
-        dev_id = RT_NULL;
-    else
+    if (device_name != RT_NULL)
         dev_id = rt_device_find(device_name);
 
     if (dev_id == RT_NULL)
@@ -458,19 +411,23 @@ int dfs_mkfs(const char *fs_name, const char *device_name)
     {
         if (filesystem_operation_table[index] != RT_NULL &&
             strcmp(filesystem_operation_table[index]->name, fs_name) == 0)
-        {
-            /* find file system operation */
-            const struct dfs_filesystem_operation *ops = filesystem_operation_table[index];
-            dfs_unlock();
-
-            if (ops->mkfs != RT_NULL)
-                return ops->mkfs(dev_id);
-
             break;
-        }
     }
     dfs_unlock();
 
+    if (index < DFS_FILESYSTEM_TYPES_MAX)
+    {
+        /* find file system operation */
+        const struct dfs_filesystem_operation *ops = filesystem_operation_table[index];
+        if (ops->mkfs == RT_NULL)
+        {
+            rt_set_errno(-DFS_STATUS_ENOSYS);
+            return -1;
+        }
+
+        return ops->mkfs(dev_id);
+    }
+
     rt_kprintf("Can not find the file system which named as %s.\n", fs_name);
     return -1;
 }
@@ -512,7 +469,7 @@ int dfs_mount_table(void)
 				mount_table[index].rwflag,
 				mount_table[index].data) != 0)
 		{
-			rt_kprintf("mount fs[%s] on %s failed.\n", mount_table[index].filesystemtype, 
+			rt_kprintf("mount fs[%s] on %s failed.\n", mount_table[index].filesystemtype,
 				mount_table[index].path);
 			return -RT_ERROR;
 		}
@@ -538,11 +495,7 @@ int df(const char *path)
     long long cap;
     struct statfs buffer;
 
-    if (path == RT_NULL)
-        result = dfs_statfs("/", &buffer);
-    else
-        result = dfs_statfs(path, &buffer);
-
+    result = dfs_statfs(path ? path : RT_NULL, &buffer);
     if (result != 0)
     {
         rt_kprintf("dfs_statfs failed.\n");