21
21
22
22
#include "zlib.h"
23
23
24
+ #ifdef RT_USING_PAGECACHE
25
+ #include "dfs_pcache.h"
26
+ #endif
27
+
24
28
/**********************************/
25
29
26
30
#define CROMFS_PATITION_HEAD_SIZE 256
@@ -502,6 +506,15 @@ static void cromfs_dirent_cache_destroy(cromfs_info *ci)
502
506
503
507
/**********************************/
504
508
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
+
505
518
static int dfs_cromfs_mount (struct dfs_mnt * mnt , unsigned long rwflag , const void * data )
506
519
{
507
520
struct rt_device_blk_geometry geometry ;
@@ -1066,8 +1079,7 @@ static int dfs_cromfs_stat(struct dfs_dentry *dentry, struct stat *st)
1066
1079
}
1067
1080
1068
1081
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 ;
1071
1083
1072
1084
if (file_type == CROMFS_DIRENT_ATTR_DIR )
1073
1085
{
@@ -1083,7 +1095,11 @@ static int dfs_cromfs_stat(struct dfs_dentry *dentry, struct stat *st)
1083
1095
}
1084
1096
else
1085
1097
{
1098
+ #ifdef RT_USING_PAGECACHE
1099
+ st -> st_size = (dentry -> vnode && dentry -> vnode -> aspace ) ? dentry -> vnode -> size : osize ;
1100
+ #else
1086
1101
st -> st_size = osize ;
1102
+ #endif
1087
1103
}
1088
1104
1089
1105
st -> st_mtime = 0 ;
@@ -1201,21 +1217,24 @@ static struct dfs_vnode *dfs_cromfs_lookup (struct dfs_dentry *dentry)
1201
1217
1202
1218
if (file_type == CROMFS_DIRENT_ATTR_DIR )
1203
1219
{
1204
- vnode -> mode = S_IFDIR | (0555 );
1220
+ vnode -> mode = S_IFDIR | (0777 );
1205
1221
vnode -> type = FT_DIRECTORY ;
1206
1222
vnode -> size = size ;
1207
1223
}
1208
1224
else if (file_type == CROMFS_DIRENT_ATTR_SYMLINK )
1209
1225
{
1210
- vnode -> mode = S_IFLNK | (0555 );
1226
+ vnode -> mode = S_IFLNK | (0777 );
1211
1227
vnode -> type = FT_SYMLINK ;
1212
1228
vnode -> size = osize ;
1213
1229
}
1214
1230
else
1215
1231
{
1216
- vnode -> mode = S_IFREG | (0555 );
1232
+ vnode -> mode = S_IFREG | (0777 );
1217
1233
vnode -> type = FT_REGULAR ;
1218
1234
vnode -> size = osize ;
1235
+ #ifdef RT_USING_PAGECACHE
1236
+ vnode -> aspace = dfs_aspace_create (dentry , vnode , & dfs_cromfs_aspace_ops );
1237
+ #endif
1219
1238
}
1220
1239
1221
1240
vnode -> mnt = dentry -> mnt ;
@@ -1297,6 +1316,21 @@ static int cromfs_readlink(cromfs_info *ci, char *path, char *buf, int len)
1297
1316
return ret ;
1298
1317
}
1299
1318
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
+
1300
1334
static int dfs_cromfs_readlink (struct dfs_dentry * dentry , char * buf , int len )
1301
1335
{
1302
1336
cromfs_info * ci = NULL ;
0 commit comments