From cf037325f085838da991559c2249683448a90334 Mon Sep 17 00:00:00 2001 From: waterwin Date: Tue, 15 Feb 2022 17:21:21 +0800 Subject: [PATCH] hmdfs: modify read and write interface in hmdfs ohos inclusion category: bugfix issue: #I4T9TP CVE: NA ---------------------------------------------- vfs_read and vfs_write is not exported, change interface to vfs_read_iter and vfs_write_iter Signed-off-by: qianjiaxing --- fs/hmdfs/comm/connection.h | 2 +- fs/hmdfs/file_local.c | 109 +++++++++++++++++++++++------------ fs/hmdfs/file_merge.c | 14 ++++- fs/hmdfs/hmdfs_device_view.h | 10 +++- fs/hmdfs/inode_remote.c | 8 +-- 5 files changed, 96 insertions(+), 47 deletions(-) diff --git a/fs/hmdfs/comm/connection.h b/fs/hmdfs/comm/connection.h index 2d80491b9201..6137c549824c 100644 --- a/fs/hmdfs/comm/connection.h +++ b/fs/hmdfs/comm/connection.h @@ -144,7 +144,7 @@ struct hmdfs_peer { uint64_t device_id; unsigned long conn_time; uint8_t version; - u8 status; + int status; u64 features; long long old_sb_dirty_count; atomic64_t sb_dirty_count; diff --git a/fs/hmdfs/file_local.c b/fs/hmdfs/file_local.c index bef62b2c04f3..86d402515589 100644 --- a/fs/hmdfs/file_local.c +++ b/fs/hmdfs/file_local.c @@ -57,49 +57,84 @@ int hmdfs_file_release_local(struct inode *inode, struct file *file) return 0; } -ssize_t hmdfs_read_local(struct kiocb *iocb, struct iov_iter *iter) +static void hmdfs_file_accessed(struct file *file) { - struct file *lower_file = hmdfs_f(iocb->ki_filp)->lower_file; - int err; + struct file *lower_file = hmdfs_f(file)->lower_file; + struct inode *inode = file_inode(file); + struct inode *lower_inode = file_inode(lower_file); - if (iter->type & ITER_KVEC) - err = kernel_read(lower_file, iter->iov->iov_base, - iter->iov->iov_len, &(iocb->ki_pos)); - else - err = vfs_read(lower_file, iter->iov->iov_base, - iter->iov->iov_len, &(iocb->ki_pos)); + if (file->f_flags & O_NOATIME) + return; - if (err >= 0) - file_inode(iocb->ki_filp)->i_atime = file_inode(lower_file)->i_atime; - return err; + inode->i_atime = lower_inode->i_atime; +} + +ssize_t hmdfs_do_read_iter(struct file *file, struct iov_iter *iter, + loff_t *ppos) +{ + ssize_t ret; + struct file *lower_file = hmdfs_f(file)->lower_file; + + if (!iov_iter_count(iter)) + return 0; + + ret = vfs_iter_read(lower_file, iter, ppos, 0); + hmdfs_file_accessed(file); + + return ret; +} + +static ssize_t hmdfs_local_read_iter(struct kiocb *iocb, struct iov_iter *iter) +{ + return hmdfs_do_read_iter(iocb->ki_filp, iter, &iocb->ki_pos); } -ssize_t hmdfs_write_local(struct kiocb *iocb, struct iov_iter *iter) +static void hmdfs_file_modified(struct file *file) { - struct file *lower_file = hmdfs_f(iocb->ki_filp)->lower_file; - struct inode *inode = file_inode(iocb->ki_filp); + struct inode *inode = file_inode(file); + struct dentry *dentry = file_dentry(file); + struct file *lower_file = hmdfs_f(file)->lower_file; struct inode *lower_inode = file_inode(lower_file); - struct dentry *dentry = file_dentry(iocb->ki_filp); - int err; - if (iter->type & ITER_KVEC) - err = kernel_write(lower_file, iter->iov->iov_base, - iter->iov->iov_len, &(iocb->ki_pos)); - else - err = vfs_write(lower_file, iter->iov->iov_base, - iter->iov->iov_len, &(iocb->ki_pos)); - - if (err >= 0) { - inode_lock(inode); - i_size_write(inode, i_size_read(lower_inode)); - inode->i_atime = lower_inode->i_atime; - inode->i_ctime = lower_inode->i_ctime; - inode->i_mtime = lower_inode->i_mtime; - if (!hmdfs_i_merge(hmdfs_i(inode))) - update_inode_to_dentry(dentry, inode); - inode_unlock(inode); - } - return err; + inode->i_atime = lower_inode->i_atime; + inode->i_ctime = lower_inode->i_ctime; + inode->i_mtime = lower_inode->i_mtime; + i_size_write(inode, i_size_read(lower_inode)); + + if (!hmdfs_i_merge(hmdfs_i(inode))) + update_inode_to_dentry(dentry, inode); +} + +ssize_t hmdfs_do_write_iter(struct file *file, struct iov_iter *iter, + loff_t *ppos) +{ + ssize_t ret; + struct file *lower_file = hmdfs_f(file)->lower_file; + struct inode *inode = file_inode(file); + + if (!iov_iter_count(iter)) + return 0; + + inode_lock(inode); + + ret = file_remove_privs(file); + if (ret) + goto out_unlock; + + file_start_write(lower_file); + ret = vfs_iter_write(lower_file, iter, ppos, 0); + file_end_write(lower_file); + + hmdfs_file_modified(file); + +out_unlock: + inode_unlock(inode); + return ret; +} + +ssize_t hmdfs_local_write_iter(struct kiocb *iocb, struct iov_iter *iter) +{ + return hmdfs_do_write_iter(iocb->ki_filp, iter, &iocb->ki_pos); } int hmdfs_fsync_local(struct file *file, loff_t start, loff_t end, int datasync) @@ -164,8 +199,8 @@ int hmdfs_file_mmap_local(struct file *file, struct vm_area_struct *vma) const struct file_operations hmdfs_file_fops_local = { .owner = THIS_MODULE, .llseek = hmdfs_file_llseek_local, - .read_iter = hmdfs_read_local, - .write_iter = hmdfs_write_local, + .read_iter = hmdfs_local_read_iter, + .write_iter = hmdfs_local_write_iter, .mmap = hmdfs_file_mmap_local, .open = hmdfs_file_open_local, .release = hmdfs_file_release_local, diff --git a/fs/hmdfs/file_merge.c b/fs/hmdfs/file_merge.c index 237bb9e806d9..8c76b7e3098f 100644 --- a/fs/hmdfs/file_merge.c +++ b/fs/hmdfs/file_merge.c @@ -507,6 +507,16 @@ const struct file_operations hmdfs_dir_fops_merge = { .compat_ioctl = hmdfs_dir_compat_ioctl_merge, }; +static ssize_t hmdfs_merge_read_iter(struct kiocb *iocb, struct iov_iter *iter) +{ + return hmdfs_do_read_iter(iocb->ki_filp, iter, &iocb->ki_pos); +} + +ssize_t hmdfs_merge_write_iter(struct kiocb *iocb, struct iov_iter *iter) +{ + return hmdfs_do_write_iter(iocb->ki_filp, iter, &iocb->ki_pos); +} + int hmdfs_file_open_merge(struct inode *inode, struct file *file) { int err = 0; @@ -561,8 +571,8 @@ int hmdfs_file_flush_merge(struct file *file, fl_owner_t id) const struct file_operations hmdfs_file_fops_merge = { .owner = THIS_MODULE, .llseek = hmdfs_file_llseek_local, - .read_iter = hmdfs_read_local, - .write_iter = hmdfs_write_local, + .read_iter = hmdfs_merge_read_iter, + .write_iter = hmdfs_merge_write_iter, .mmap = hmdfs_file_mmap_local, .open = hmdfs_file_open_merge, .flush = hmdfs_file_flush_merge, diff --git a/fs/hmdfs/hmdfs_device_view.h b/fs/hmdfs/hmdfs_device_view.h index fc77ef9ebcbd..160391226caf 100644 --- a/fs/hmdfs/hmdfs_device_view.h +++ b/fs/hmdfs/hmdfs_device_view.h @@ -51,7 +51,7 @@ struct hmdfs_dentry_info { uint64_t device_id; spinlock_t lock; struct mutex cache_pull_lock; - bool async_readdir_in_progress; + int async_readdir_in_progress; }; struct hmdfs_lookup_ret { @@ -112,8 +112,12 @@ int hmdfs_rename(struct inode *old_dir, struct dentry *old_dentry, struct inode *new_dir, struct dentry *new_dentry, unsigned int flags); loff_t hmdfs_file_llseek_local(struct file *file, loff_t offset, int whence); -ssize_t hmdfs_read_local(struct kiocb *iocb, struct iov_iter *iter); -ssize_t hmdfs_write_local(struct kiocb *iocb, struct iov_iter *iter); + +ssize_t hmdfs_do_read_iter(struct file *file, struct iov_iter *iter, + loff_t *ppos); +ssize_t hmdfs_do_write_iter(struct file *file, struct iov_iter *iter, + loff_t *ppos); + int hmdfs_file_release_local(struct inode *inode, struct file *file); int hmdfs_file_mmap_local(struct file *file, struct vm_area_struct *vma); struct dentry *hmdfs_lookup(struct inode *parent_inode, diff --git a/fs/hmdfs/inode_remote.c b/fs/hmdfs/inode_remote.c index 32692b9ac67d..0a4493455e0f 100644 --- a/fs/hmdfs/inode_remote.c +++ b/fs/hmdfs/inode_remote.c @@ -117,7 +117,7 @@ static void hmdfs_remote_readdir_work(struct work_struct *work) bool empty = false; get_remote_dentry_file(dentry, con); - hmdfs_d(dentry)->async_readdir_in_progress = false; + hmdfs_d(dentry)->async_readdir_in_progress = 0; hmdfs_revert_creds(old_cred); dput(dentry); @@ -138,13 +138,13 @@ static void get_remote_dentry_file_in_wq(struct dentry *dentry, struct hmdfs_readdir_work *rw = NULL; /* do nothing if async readdir is already in progress */ - if (cmpxchg_relaxed(&hmdfs_d(dentry)->async_readdir_in_progress, false, - true)) + if (cmpxchg_relaxed(&hmdfs_d(dentry)->async_readdir_in_progress, 0, + 1)) return; rw = kmalloc(sizeof(*rw), GFP_KERNEL); if (!rw) { - hmdfs_d(dentry)->async_readdir_in_progress = false; + hmdfs_d(dentry)->async_readdir_in_progress = 0; return; } -- Gitee