Skip to content

Commit 0c6c246

Browse files
committed
✨ feat(dfs_v2/cromfs): add cromfs mmap
1 parent f95eaad commit 0c6c246

File tree

1 file changed

+39
-5
lines changed

1 file changed

+39
-5
lines changed

components/dfs/dfs_v2/filesystems/cromfs/dfs_cromfs.c

+39-5
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@
2121

2222
#include "zlib.h"
2323

24+
#ifdef RT_USING_PAGECACHE
25+
#include "dfs_pcache.h"
26+
#endif
27+
2428
/**********************************/
2529

2630
#define CROMFS_PATITION_HEAD_SIZE 256
@@ -502,6 +506,15 @@ static void cromfs_dirent_cache_destroy(cromfs_info *ci)
502506

503507
/**********************************/
504508

509+
#ifdef RT_USING_PAGECACHE
510+
static ssize_t dfs_cromfs_page_read(struct dfs_file *file, struct dfs_page *page);
511+
512+
static struct dfs_aspace_ops dfs_cromfs_aspace_ops =
513+
{
514+
.read = dfs_cromfs_page_read
515+
};
516+
#endif
517+
505518
static int dfs_cromfs_mount(struct dfs_mnt *mnt, unsigned long rwflag, const void *data)
506519
{
507520
struct rt_device_blk_geometry geometry;
@@ -1066,8 +1079,7 @@ static int dfs_cromfs_stat(struct dfs_dentry *dentry, struct stat *st)
10661079
}
10671080

10681081
st->st_dev = 0;
1069-
st->st_mode = S_IFREG | S_IRUSR | S_IRGRP | S_IROTH |
1070-
S_IWUSR | S_IWGRP | S_IWOTH;
1082+
st->st_mode = 0777;
10711083

10721084
if (file_type == CROMFS_DIRENT_ATTR_DIR)
10731085
{
@@ -1083,7 +1095,11 @@ static int dfs_cromfs_stat(struct dfs_dentry *dentry, struct stat *st)
10831095
}
10841096
else
10851097
{
1098+
#ifdef RT_USING_PAGECACHE
1099+
st->st_size = (dentry->vnode && dentry->vnode->aspace) ? dentry->vnode->size : osize;
1100+
#else
10861101
st->st_size = osize;
1102+
#endif
10871103
}
10881104

10891105
st->st_mtime = 0;
@@ -1201,21 +1217,24 @@ static struct dfs_vnode *dfs_cromfs_lookup (struct dfs_dentry *dentry)
12011217

12021218
if (file_type == CROMFS_DIRENT_ATTR_DIR)
12031219
{
1204-
vnode->mode = S_IFDIR | (0555);
1220+
vnode->mode = S_IFDIR | (0777);
12051221
vnode->type = FT_DIRECTORY;
12061222
vnode->size = size;
12071223
}
12081224
else if (file_type == CROMFS_DIRENT_ATTR_SYMLINK)
12091225
{
1210-
vnode->mode = S_IFLNK | (0555);
1226+
vnode->mode = S_IFLNK | (0777);
12111227
vnode->type = FT_SYMLINK;
12121228
vnode->size = osize;
12131229
}
12141230
else
12151231
{
1216-
vnode->mode = S_IFREG | (0555);
1232+
vnode->mode = S_IFREG | (0777);
12171233
vnode->type = FT_REGULAR;
12181234
vnode->size = osize;
1235+
#ifdef RT_USING_PAGECACHE
1236+
vnode->aspace = dfs_aspace_create(dentry, vnode, &dfs_cromfs_aspace_ops);
1237+
#endif
12191238
}
12201239

12211240
vnode->mnt = dentry->mnt;
@@ -1297,6 +1316,21 @@ static int cromfs_readlink(cromfs_info *ci, char *path, char *buf, int len)
12971316
return ret;
12981317
}
12991318

1319+
#ifdef RT_USING_PAGECACHE
1320+
static ssize_t dfs_cromfs_page_read(struct dfs_file *file, struct dfs_page *page)
1321+
{
1322+
int ret = -EINVAL;
1323+
1324+
if (page->page)
1325+
{
1326+
off_t fpos = page->fpos;
1327+
ret = dfs_cromfs_read(file, page->page, page->size, &fpos);
1328+
}
1329+
1330+
return ret;
1331+
}
1332+
#endif
1333+
13001334
static int dfs_cromfs_readlink(struct dfs_dentry *dentry, char *buf, int len)
13011335
{
13021336
cromfs_info *ci = NULL;

0 commit comments

Comments
 (0)