summaryrefslogtreecommitdiff
path: root/components/dfs
diff options
context:
space:
mode:
authorWangHuachen <[email protected]>2020-11-08 19:30:50 +0800
committerGitHub <[email protected]>2020-11-08 19:30:50 +0800
commit9756c77f0447f9ce4f00a37600298a1f1fd90cda (patch)
tree093247a1719c087dba33783be3a4ee44c1026b2d /components/dfs
parent9545529b33cbaae137f1e389dd0e3a5233d516da (diff)
parent4b2b9a87c6f0a87b125e5c5a18bcfcf663de9fbb (diff)
Merge pull request #1 from RT-Thread/master
同步原有仓库
Diffstat (limited to 'components/dfs')
-rw-r--r--components/dfs/filesystems/devfs/devfs.c2
-rw-r--r--components/dfs/include/dfs.h1
-rw-r--r--components/dfs/src/dfs.c1
-rw-r--r--components/dfs/src/dfs_file.c2
-rw-r--r--components/dfs/src/dfs_fs.c7
-rw-r--r--components/dfs/src/poll.c18
6 files changed, 25 insertions, 6 deletions
diff --git a/components/dfs/filesystems/devfs/devfs.c b/components/dfs/filesystems/devfs/devfs.c
index 936b074ce1..7637074dbb 100644
--- a/components/dfs/filesystems/devfs/devfs.c
+++ b/components/dfs/filesystems/devfs/devfs.c
@@ -186,6 +186,7 @@ int dfs_device_fs_open(struct dfs_fd *file)
result = file->fops->open(file);
if (result == RT_EOK || result == -RT_ENOSYS)
{
+ file->type = FT_DEVICE;
return 0;
}
}
@@ -197,6 +198,7 @@ int dfs_device_fs_open(struct dfs_fd *file)
if (result == RT_EOK || result == -RT_ENOSYS)
{
file->data = device;
+ file->type = FT_DEVICE;
return RT_EOK;
}
}
diff --git a/components/dfs/include/dfs.h b/components/dfs/include/dfs.h
index eb32a4b411..1158df93cb 100644
--- a/components/dfs/include/dfs.h
+++ b/components/dfs/include/dfs.h
@@ -55,6 +55,7 @@
#define FT_SOCKET 1 /* socket file */
#define FT_DIRECTORY 2 /* directory */
#define FT_USER 3 /* user defined */
+#define FT_DEVICE 4 /* device */
/* File flags */
#define DFS_F_OPEN 0x01000000
diff --git a/components/dfs/src/dfs.c b/components/dfs/src/dfs.c
index b20de13988..7ace0bc160 100644
--- a/components/dfs/src/dfs.c
+++ b/components/dfs/src/dfs.c
@@ -542,6 +542,7 @@ int list_fd(void)
else if (fd->type == FT_REGULAR) rt_kprintf("%-7.7s ", "file");
else if (fd->type == FT_SOCKET) rt_kprintf("%-7.7s ", "socket");
else if (fd->type == FT_USER) rt_kprintf("%-7.7s ", "user");
+ else if (fd->type == FT_DEVICE) rt_kprintf("%-7.7s ", "device");
else rt_kprintf("%-8.8s ", "unknown");
rt_kprintf("%3d ", fd->ref_count);
rt_kprintf("%04x ", fd->magic);
diff --git a/components/dfs/src/dfs_file.c b/components/dfs/src/dfs_file.c
index 91d39597f0..fd205f2f3a 100644
--- a/components/dfs/src/dfs_file.c
+++ b/components/dfs/src/dfs_file.c
@@ -157,7 +157,7 @@ int dfs_file_ioctl(struct dfs_fd *fd, int cmd, void *args)
return -EINVAL;
/* regular file system fd */
- if (fd->type == FT_REGULAR)
+ if (fd->type == FT_REGULAR || fd->type == FT_DEVICE)
{
switch (cmd)
{
diff --git a/components/dfs/src/dfs_fs.c b/components/dfs/src/dfs_fs.c
index 476e47fc06..c21b914727 100644
--- a/components/dfs/src/dfs_fs.c
+++ b/components/dfs/src/dfs_fs.c
@@ -129,7 +129,7 @@ const char *dfs_filesystem_get_mounted_path(struct rt_device *device)
for (iter = &filesystem_table[0];
iter < &filesystem_table[DFS_FILESYSTEMS_MAX]; iter++)
{
- /* fint the mounted device */
+ /* find the mounted device */
if (iter->ops == NULL) continue;
else if (iter->dev_id == device)
{
@@ -321,7 +321,7 @@ int dfs_mount(const char *device_name,
if (rt_device_open(fs->dev_id,
RT_DEVICE_OFLAG_RDWR) != RT_EOK)
{
- /* The underlaying device has error, clear the entry. */
+ /* The underlying device has error, clear the entry. */
dfs_lock();
memset(fs, 0, sizeof(struct dfs_filesystem));
@@ -568,8 +568,7 @@ int dfs_unmount_device(rt_device_t dev)
iter < &filesystem_table[DFS_FILESYSTEMS_MAX]; iter++)
{
/* check if the PATH is mounted */
- if ((iter->dev_id->parent.name != NULL)
- && (strcmp(iter->dev_id->parent.name, dev->parent.name) == 0))
+ if (strcmp(iter->dev_id->parent.name, dev->parent.name) == 0)
{
fs = iter;
break;
diff --git a/components/dfs/src/poll.c b/components/dfs/src/poll.c
index 3f304549f7..fc48eca758 100644
--- a/components/dfs/src/poll.c
+++ b/components/dfs/src/poll.c
@@ -137,6 +137,14 @@ static int do_pollfd(struct pollfd *pollfd, rt_pollreq_t *req)
req->_key = pollfd->events | POLLERR | POLLHUP;
mask = f->fops->poll(f, req);
+
+ /* dealwith the device return error -1*/
+ if (mask < 0)
+ {
+ fd_put(f);
+ pollfd->revents = 0;
+ return mask;
+ }
}
/* Mask out unneeded events. */
mask &= pollfd->events | POLLERR | POLLHUP;
@@ -154,6 +162,7 @@ static int poll_do(struct pollfd *fds, nfds_t nfds, struct rt_poll_table *pt, in
int istimeout = 0;
int n;
struct pollfd *pf;
+ int ret = 0;
if (msec == 0)
{
@@ -168,7 +177,14 @@ static int poll_do(struct pollfd *fds, nfds_t nfds, struct rt_poll_table *pt, in
for (n = 0; n < nfds; n ++)
{
- if (do_pollfd(pf, &pt->req))
+ ret = do_pollfd(pf, &pt->req);
+ if(ret < 0)
+ {
+ /*dealwith the device return error -1 */
+ pt->req._proc = RT_NULL;
+ return ret;
+ }
+ else if(ret > 0)
{
num ++;
pt->req._proc = RT_NULL;