[PATCH 5/6] rpdfs: add rpdfs_write_iter/rpdfs_read_iter
Valerie Aurora <[email protected]> Thu, 7 May 2026 15:21:52 +0200
| Newsgroups | dev.linux.lists.rpdfs-devel |
|---|---|
| Message-ID | <[email protected]> |
Implement write_iter/read_iter with generic functions. Signed-off-by: Valerie Aurora <[email protected]> --- fs/rpdfs/file.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/fs/rpdfs/file.c b/fs/rpdfs/file.c index e8918e38b3fe..060de1070963 100644 --- a/fs/rpdfs/file.c +++ b/fs/rpdfs/file.c @@ -1,9 +1,12 @@ /* SPDX-License-Identifier: GPL-2.0 */ +#include <linux/kernel.h> #include <linux/fs.h> +#include <linux/slab.h> #include "file.h" #include "inode.h" +#include "pr.h" static loff_t rpdfs_file_llseek(struct file *file, loff_t offset, int whence) { @@ -22,6 +25,60 @@ static loff_t rpdfs_file_llseek(struct file *file, loff_t offset, int whence) return ret; } +static ssize_t rpdfs_file_write_iter(struct kiocb *iocb, struct iov_iter *from) +{ + struct file *file = iocb->ki_filp; + struct inode *inode = file->f_mapping->host; + struct rpdfs_fs_info *rfi = RPDFS_INODE_FS(inode); + struct rpdfs_block_handle *hnd = NULL; + struct rpdfs_transaction txn = RPDFS_INIT_TXN; + ssize_t ret; + + rpdfs_prd("ino %llu count %lu pos %lu", + rpdfs_inode_ino(inode), iov_iter_count(from), (unsigned long) iocb->ki_pos); + + inode_lock(inode); + + ret = rpdfs_inode_acquire(rfi, &txn, inode, &hnd, RBAF_WRITE); + if (ret < 0) + goto out; + + ret = generic_write_checks(iocb, from); + if (ret <= 0) + goto out; + + ret = __generic_file_write_iter(iocb, from); +out: + rpdfs_block_release(rfi, &hnd); + inode_unlock(inode); + + if (ret > 0) + ret = generic_write_sync(iocb, ret); + + return ret; +} + +static ssize_t rpdfs_file_read_iter(struct kiocb *iocb, struct iov_iter *from) +{ + struct file *file = iocb->ki_filp; + struct inode *inode = file_inode(file); + struct rpdfs_fs_info *rfi = RPDFS_INODE_FS(inode); + struct rpdfs_block_handle *hnd = NULL; + int ret; + + ret = rpdfs_inode_acquire(rfi, NULL, inode, &hnd, 0); + if (ret < 0) + goto out; + + rpdfs_prd("ino %llu count %lu pos %lu", + rpdfs_inode_ino(inode), iov_iter_count(from), (unsigned long) iocb->ki_pos); + + ret = generic_file_read_iter(iocb, from); +out: + rpdfs_block_release(rfi, &hnd); + return ret; +} + const struct inode_operations rpdfs_file_iops = { .getattr = rpdfs_getattr, .setattr = rpdfs_setattr, @@ -29,4 +86,6 @@ const struct inode_operations rpdfs_file_iops = { const struct file_operations rpdfs_file_fops = { .llseek = rpdfs_file_llseek, + .write_iter = rpdfs_file_write_iter, + .read_iter = rpdfs_file_read_iter, }; -- 2.49.0