From c4a21b445684bf39f39ece3e1a4d069ce5a08f41 Mon Sep 17 00:00:00 2001 From: "bernard.xiong" Date: Thu, 22 Apr 2010 09:33:25 +0000 Subject: [PATCH] add more options to filesystem mount function invoke. git-svn-id: https://rt-thread.googlecode.com/svn/trunk@665 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- components/SConscript | 8 +++- components/dfs/filesystems/elmfat/dfs_elm.c | 2 +- components/dfs/include/dfs_fs.h | 2 +- components/dfs/src/dfs_fs.c | 42 ++++++++++++--------- 4 files changed, 33 insertions(+), 21 deletions(-) diff --git a/components/SConscript b/components/SConscript index f8b5513c52..46ae96cfb3 100644 --- a/components/SConscript +++ b/components/SConscript @@ -5,8 +5,12 @@ Import('rtconfig') # build each components objs = '' -if 'RT_USING_MINILIBC' in dir(rtconfig) and rtconfig.RT_USING_MINILIBC: - objs = objs + SConscript('libc/minilibc/SConscript') +if rtconfig.CROSS_TOOL == 'gcc': + if 'RT_USING_NEWLIB' in dir(rtconfig) and rtconfig.RT_USING_NEWLIB: + objs = objs + SConscript('libc/newlib/SConscript') + else: + rtconfig.RT_USING_MINILIBC = True + objs = objs + SConscript('libc/minilibc/SConscript') if 'RT_USING_FINSH' in dir(rtconfig) and rtconfig.RT_USING_FINSH: objs = objs + SConscript('finsh/SConscript') diff --git a/components/dfs/filesystems/elmfat/dfs_elm.c b/components/dfs/filesystems/elmfat/dfs_elm.c index f7289fcadc..3112d30bc4 100644 --- a/components/dfs/filesystems/elmfat/dfs_elm.c +++ b/components/dfs/filesystems/elmfat/dfs_elm.c @@ -49,7 +49,7 @@ static int elm_result_to_dfs(FRESULT result) return status; } -int dfs_elm_mount(struct dfs_filesystem* fs) +int dfs_elm_mount(struct dfs_filesystem* fs, unsigned long rwflag, const void* data) { FATFS *fat; FRESULT result; diff --git a/components/dfs/include/dfs_fs.h b/components/dfs/include/dfs_fs.h index 2431765856..c31d9585a2 100644 --- a/components/dfs/include/dfs_fs.h +++ b/components/dfs/include/dfs_fs.h @@ -28,7 +28,7 @@ struct dfs_filesystem_operation { char name[DFS_FS_NAME_MAX + 1]; - int (*mount) (struct dfs_filesystem* fs); + int (*mount) (struct dfs_filesystem* fs, unsigned long rwflag, const void* data); int (*unmount) (struct dfs_filesystem* fs); int (*open) (struct dfs_fd* fd); diff --git a/components/dfs/src/dfs_fs.c b/components/dfs/src/dfs_fs.c index a20b9b26c0..9745ea0c41 100644 --- a/components/dfs/src/dfs_fs.c +++ b/components/dfs/src/dfs_fs.c @@ -206,13 +206,21 @@ int dfs_mount(const char* device_name, const char* path, int index; /* open specific device */ - dev_id = rt_device_find(device_name); - if (dev_id == RT_NULL) - { - /* no this device */ - rt_set_errno(-DFS_STATUS_ENODEV); - return -1; - } + 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; + } + } + else + { + /* which is a non-device filesystem mount */ + dev_id = RT_NULL; + } /* find out specific filesystem */ dfs_lock(); @@ -289,11 +297,12 @@ int dfs_mount(const char* device_name, const char* path, /* release filesystem_table lock */ dfs_unlock(); - /* open device, but do not check the status of device */ - rt_device_open(fs->dev_id, RT_DEVICE_OFLAG_RDWR); + /* open device, but do not check the status of device */ + if (dev_id != RT_NULL) rt_device_open(fs->dev_id, RT_DEVICE_OFLAG_RDWR); - if ( ops->mount == RT_NULL ) /* there is no mount implementation */ + if (ops->mount == RT_NULL) /* there is no mount implementation */ { + if (dev_id != RT_NULL) rt_device_close(dev_id); dfs_lock(); /* clear filesystem table entry */ rt_memset(fs, 0, sizeof(struct dfs_filesystem)); @@ -303,19 +312,18 @@ int dfs_mount(const char* device_name, const char* path, return -1; } /* call mount of this filesystem */ - else if ( ops->mount(fs) < 0 ) + else if (ops->mount(fs, rwflag, data) < 0) { + /* close device */ + if (dev_id != RT_NULL) rt_device_close(fs->dev_id); + /* mount failed */ dfs_lock(); - - /* close device */ - rt_device_close(fs->dev_id); - /* clear filesystem table entry */ rt_memset(fs, 0, sizeof(struct dfs_filesystem)); - dfs_unlock(); - return -1; + + return -1; } return 0;