git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
sweep through entire page table to free up intermediate tables
[lunaix-os.git]
/
lunaix-os
/
kernel
/
fs
/
vfs.c
diff --git
a/lunaix-os/kernel/fs/vfs.c
b/lunaix-os/kernel/fs/vfs.c
index 1696d6e961ace4b3ac092809db67cd9dddd42183..53c1efa93f822dffe16e4f468f1a3df8970d681e 100644
(file)
--- a/
lunaix-os/kernel/fs/vfs.c
+++ b/
lunaix-os/kernel/fs/vfs.c
@@
-558,6
+558,8
@@
vfs_i_alloc(struct v_superblock* sb)
void
vfs_i_free(struct v_inode* inode)
{
void
vfs_i_free(struct v_inode* inode)
{
+ assert(inode->link_count == 0);
+
if (inode->pg_cache) {
pcache_release(inode->pg_cache);
vfree(inode->pg_cache);
if (inode->pg_cache) {
pcache_release(inode->pg_cache);
vfree(inode->pg_cache);
@@
-791,8
+793,12
@@
__vfs_readdir_callback(struct dir_context* dctx,
const int dtype)
{
struct lx_dirent* dent = (struct lx_dirent*)dctx->cb_data;
const int dtype)
{
struct lx_dirent* dent = (struct lx_dirent*)dctx->cb_data;
- strncpy(dent->d_name, name, MIN(len, DIRENT_NAME_MAX_LEN));
- dent->d_nlen = len;
+ int len_ = MIN(len, DIRENT_NAME_MAX_LEN - 1);
+
+ strncpy(dent->d_name, name, len_);
+ dent->d_name[len_] = 0;
+
+ dent->d_nlen = len_;
dent->d_type = dtype;
}
dent->d_type = dtype;
}
@@
-832,6
+838,17
@@
done:
return DO_STATUS_OR_RETURN(errno);
}
return DO_STATUS_OR_RETURN(errno);
}
+static inline bool
+check_pcache_eligibility(struct v_fd* fd_s)
+{
+ struct v_inode* inode;
+
+ inode = fd_s->file->inode;
+ return !check_seqdev_node(inode) \
+ && !fsm_check_pseudo_fs(inode->sb->fs) \
+ && !(fd_s->flags & FO_DIRECT);
+}
+
__DEFINE_LXSYSCALL3(int, read, int, fd, void*, buf, size_t, count)
{
int errno = 0;
__DEFINE_LXSYSCALL3(int, read, int, fd, void*, buf, size_t, count)
{
int errno = 0;
@@
-850,7
+867,7
@@
__DEFINE_LXSYSCALL3(int, read, int, fd, void*, buf, size_t, count)
file->inode->atime = clock_unixtime();
file->inode->atime = clock_unixtime();
- if (
check_seqdev_node(file->inode) || (fd_s->flags & FO_DIRECT
)) {
+ if (
!check_pcache_eligibility(fd_s
)) {
errno = file->ops->read(file->inode, buf, count, file->f_pos);
} else {
errno = pcache_read(file->inode, buf, count, file->f_pos);
errno = file->ops->read(file->inode, buf, count, file->f_pos);
} else {
errno = pcache_read(file->inode, buf, count, file->f_pos);
@@
-896,7
+913,7
@@
__DEFINE_LXSYSCALL3(int, write, int, fd, void*, buf, size_t, count)
file->f_pos = inode->fsize;
}
file->f_pos = inode->fsize;
}
- if (
check_seqdev_node(inode) || (fd_s->flags & FO_DIRECT
)) {
+ if (
!check_pcache_eligibility(fd_s
)) {
errno = file->ops->write(inode, buf, count, file->f_pos);
} else {
errno = pcache_write(inode, buf, count, file->f_pos);
errno = file->ops->write(inode, buf, count, file->f_pos);
} else {
errno = pcache_write(inode, buf, count, file->f_pos);
@@
-993,6
+1010,8
@@
vfs_get_path(struct v_dnode* dnode, char* buf, size_t size, int depth)
size_t cpy_size = MIN(dnode->name.len, size - len);
strncpy(buf + len, dnode->name.value, cpy_size);
size_t cpy_size = MIN(dnode->name.len, size - len);
strncpy(buf + len, dnode->name.value, cpy_size);
+ buf[len + cpy_size] = 0;
+
len += cpy_size;
return len;
len += cpy_size;
return len;
@@
-1453,9
+1472,9
@@
vfs_do_chdir(struct proc_info* proc, struct v_dnode* dnode)
vfs_ref_dnode(dnode);
proc->cwd = dnode;
vfs_ref_dnode(dnode);
proc->cwd = dnode;
+done:
unlock_dnode(dnode);
unlock_dnode(dnode);
-done:
return errno;
}
return errno;
}