From 6c41274f092fc6134af855cdc358882574aea0d6 Mon Sep 17 00:00:00 2001 From: Seung-Woo Kim Date: Tue, 7 Jan 2025 14:23:17 +0900 Subject: [PATCH] kdbus: Fix to use folio for v6.12 or later kernel version From v6.12, write_begin and write_end callback parameter is chnaged from page to folio. Fix to use folio for v6.12 or later kernel. Change-Id: I0df1a6a77f0e7843ebdb28c59d658ca32cac4e3f Ref: 1da86618bdce ("fs: Convert aops->write_begin to take a folio") Ref: a225800f322a ("fs: Convert aops->write_end to take a folio") Signed-off-by: Seung-Woo Kim --- kernel/kdbus/pool.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/kernel/kdbus/pool.c b/kernel/kdbus/pool.c index 381a119..9ac1ad1 100644 --- a/kernel/kdbus/pool.c +++ b/kernel/kdbus/pool.c @@ -651,17 +651,29 @@ int kdbus_pool_slice_copy(const struct kdbus_pool_slice *slice_dst, while (len > 0) { unsigned long page_off; unsigned long copy_len; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6,12,0)) + void *kaddr; + struct folio *folio; +#else char __user *kaddr; struct page *page; +#endif ssize_t n_read; void *fsdata; long status; +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6,12,0)) + page_off = offset_in_page(off_dst) & (PAGE_SIZE - 1); +#else page_off = off_dst & (PAGE_SIZE - 1); +#endif copy_len = min_t(unsigned long, PAGE_SIZE - page_off, len); -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,19,0)) +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6,12,0)) + status = aops->write_begin(f_dst, mapping_dst, off_dst, + copy_len, &folio, &fsdata); +#elif (LINUX_VERSION_CODE >= KERNEL_VERSION(5,19,0)) status = aops->write_begin(f_dst, mapping_dst, off_dst, copy_len, &page, &fsdata); #else @@ -673,19 +685,32 @@ int kdbus_pool_slice_copy(const struct kdbus_pool_slice *slice_dst, break; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6,12,0)) + kaddr = (char __force __user *)kmap(&folio->page) + page_off; + n_read = kernel_read(f_src, kaddr, copy_len, &off_src); + kunmap(&folio->page); + mark_page_accessed(&folio->page); + flush_dcache_page(&folio->page); +#else kaddr = (char __force __user *)kmap(page) + page_off; n_read = kernel_read(f_src, kaddr, copy_len, &off_src); kunmap(page); mark_page_accessed(page); flush_dcache_page(page); +#endif if (unlikely(n_read != copy_len)) { ret = -EFAULT; break; } +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6,12,0)) + status = aops->write_end(f_dst, mapping_dst, off_dst, + copy_len, copy_len, folio, fsdata); +#else status = aops->write_end(f_dst, mapping_dst, off_dst, copy_len, copy_len, page, fsdata); +#endif if (unlikely(status != copy_len)) { ret = -EFAULT; break; -- 2.34.1