From f3abf9710bc93bfed457ac1d7b3e163e33e2c3ef Mon Sep 17 00:00:00 2001 From: Auke Kok Date: Tue, 17 Oct 2023 11:14:03 -0700 Subject: [PATCH] generic_perform_write signature changed It now only needs the iocb and no longer the flip. Signed-off-by: Auke Kok --- kmod/src/Makefile.kernelcompat | 8 ++++++++ kmod/src/kernelcompat.c | 3 +-- kmod/src/kernelcompat.h | 13 +++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/kmod/src/Makefile.kernelcompat b/kmod/src/Makefile.kernelcompat index 5c8d519b..61a74b8d 100644 --- a/kmod/src/Makefile.kernelcompat +++ b/kmod/src/Makefile.kernelcompat @@ -322,3 +322,11 @@ endif ifneq (,$(shell grep -s 'int fiemap_prep.struct inode' include/linux/fiemap.h)) ccflags-y += -DKC_FIEMAP_PREP endif + +# +# v5.17-13043-g800ba29547e1 +# +# generic_perform_write args use kiocb for passing filp and pos +ifneq (,$(shell grep 'ssize_t generic_perform_write.struct kiocb ., struct iov_iter' include/linux/fs.h)) +ccflags-y += -DKC_GENERIC_PERFORM_WRITE_KIOCB_IOV_ITER +endif diff --git a/kmod/src/kernelcompat.c b/kmod/src/kernelcompat.c index 7f8da413..cf1de599 100644 --- a/kmod/src/kernelcompat.c +++ b/kmod/src/kernelcompat.c @@ -67,12 +67,11 @@ kc_generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov, unsigned long nr_segs, loff_t pos, loff_t *ppos, size_t count, ssize_t written) { - struct file *file = iocb->ki_filp; ssize_t status; struct iov_iter i; iov_iter_init(&i, WRITE, iov, nr_segs, count); - status = generic_perform_write(file, &i, pos); + status = kc_generic_perform_write(iocb, &i, pos); if (likely(status >= 0)) { written += status; diff --git a/kmod/src/kernelcompat.h b/kmod/src/kernelcompat.h index 665d28fa..b79e9ef4 100644 --- a/kmod/src/kernelcompat.h +++ b/kmod/src/kernelcompat.h @@ -271,7 +271,20 @@ ssize_t kc_generic_file_buffered_write(struct kiocb *iocb, const struct iovec *i unsigned long nr_segs, loff_t pos, loff_t *ppos, size_t count, ssize_t written); #define generic_file_buffered_write kc_generic_file_buffered_write +#ifdef KC_GENERIC_PERFORM_WRITE_KIOCB_IOV_ITER +static inline int kc_generic_perform_write(struct kiocb *iocb, struct iov_iter *iter, loff_t pos) +{ + iocb->ki_pos = pos; + return generic_perform_write(iocb, iter); +} +#else +static inline int kc_generic_perform_write(struct kiocb *iocb, struct iov_iter *iter, loff_t pos) +{ + struct file *file = iocb->ki_filp; + return generic_perform_write(file, iter, pos); +} #endif +#endif // KC_GENERIC_FILE_BUFFERED_WRITE #ifndef KC_HAVE_BLK_OPF_T /* typedef __u32 __bitwise blk_opf_t; */