|
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,24 +1079,27 @@ 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 = S_IFREG | (0777); |
1071 | 1083 |
|
1072 | 1084 | if (file_type == CROMFS_DIRENT_ATTR_DIR)
|
1073 | 1085 | {
|
1074 | 1086 | st->st_mode &= ~S_IFREG;
|
1075 |
| - st->st_mode |= S_IFDIR | S_IXUSR | S_IXGRP | S_IXOTH; |
| 1087 | + st->st_mode |= S_IFDIR; |
1076 | 1088 | st->st_size = size;
|
1077 | 1089 | }
|
1078 | 1090 | else if(file_type == CROMFS_DIRENT_ATTR_SYMLINK)
|
1079 | 1091 | {
|
1080 | 1092 | st->st_mode &= ~S_IFREG;
|
1081 |
| - st->st_mode |= S_IFLNK | S_IXUSR | S_IXGRP | S_IXOTH; |
| 1093 | + st->st_mode |= S_IFLNK; |
1082 | 1094 | st->st_size = osize;
|
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