mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Linux 6.3 compat: writepage_t first arg struct folio*
The type def of writepage_t in kernel 6.3 is changed to take struct folio* as the first argument. We need to detect this change and pass correct function to write_cache_pages(). Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Brian Atkinson <batkinson@lanl.gov> Signed-off-by: Youzhong Yang <yyang@mathworks.com> Closes #14699
This commit is contained in:
		
							parent
							
								
									35d43ba8ea
								
							
						
					
					
						commit
						04305bbd18
					
				
							
								
								
									
										26
									
								
								config/kernel-writepage_t.m4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								config/kernel-writepage_t.m4
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | |||||||
|  | AC_DEFUN([ZFS_AC_KERNEL_SRC_WRITEPAGE_T], [ | ||||||
|  | 	dnl # | ||||||
|  | 	dnl # 6.3 API change | ||||||
|  | 	dnl # The writepage_t function type now has its first argument as | ||||||
|  | 	dnl # struct folio* instead of struct page* | ||||||
|  | 	dnl # | ||||||
|  | 	ZFS_LINUX_TEST_SRC([writepage_t_folio], [ | ||||||
|  | 		#include <linux/writeback.h> | ||||||
|  | 		int putpage(struct folio *folio, | ||||||
|  | 		    struct writeback_control *wbc, void *data) | ||||||
|  | 		{ return 0; } | ||||||
|  | 		writepage_t func = putpage; | ||||||
|  | 	],[]) | ||||||
|  | ]) | ||||||
|  | 
 | ||||||
|  | AC_DEFUN([ZFS_AC_KERNEL_WRITEPAGE_T], [ | ||||||
|  | 	AC_MSG_CHECKING([whether int (*writepage_t)() takes struct folio*]) | ||||||
|  | 	ZFS_LINUX_TEST_RESULT([writepage_t_folio], [ | ||||||
|  | 		AC_MSG_RESULT(yes) | ||||||
|  | 		AC_DEFINE(HAVE_WRITEPAGE_T_FOLIO, 1, | ||||||
|  | 		   [int (*writepage_t)() takes struct folio*]) | ||||||
|  | 	],[ | ||||||
|  | 		AC_MSG_RESULT(no) | ||||||
|  | 	]) | ||||||
|  | ]) | ||||||
|  | 
 | ||||||
| @ -145,6 +145,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [ | |||||||
| 	ZFS_AC_KERNEL_SRC_ZERO_PAGE | 	ZFS_AC_KERNEL_SRC_ZERO_PAGE | ||||||
| 	ZFS_AC_KERNEL_SRC___COPY_FROM_USER_INATOMIC | 	ZFS_AC_KERNEL_SRC___COPY_FROM_USER_INATOMIC | ||||||
| 	ZFS_AC_KERNEL_SRC_FILEMAP | 	ZFS_AC_KERNEL_SRC_FILEMAP | ||||||
|  | 	ZFS_AC_KERNEL_SRC_WRITEPAGE_T | ||||||
| 	case "$host_cpu" in | 	case "$host_cpu" in | ||||||
| 		powerpc*) | 		powerpc*) | ||||||
| 			ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE | 			ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE | ||||||
| @ -269,6 +270,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [ | |||||||
| 	ZFS_AC_KERNEL_ZERO_PAGE | 	ZFS_AC_KERNEL_ZERO_PAGE | ||||||
| 	ZFS_AC_KERNEL___COPY_FROM_USER_INATOMIC | 	ZFS_AC_KERNEL___COPY_FROM_USER_INATOMIC | ||||||
| 	ZFS_AC_KERNEL_FILEMAP | 	ZFS_AC_KERNEL_FILEMAP | ||||||
|  | 	ZFS_AC_KERNEL_WRITEPAGE_T | ||||||
| 	case "$host_cpu" in | 	case "$host_cpu" in | ||||||
| 		powerpc*) | 		powerpc*) | ||||||
| 			ZFS_AC_KERNEL_CPU_HAS_FEATURE | 			ZFS_AC_KERNEL_CPU_HAS_FEATURE | ||||||
|  | |||||||
| @ -729,6 +729,29 @@ zpl_putpage(struct page *pp, struct writeback_control *wbc, void *data) | |||||||
| 	return (0); | 	return (0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #ifdef HAVE_WRITEPAGE_T_FOLIO | ||||||
|  | static int | ||||||
|  | zpl_putfolio(struct folio *pp, struct writeback_control *wbc, void *data) | ||||||
|  | { | ||||||
|  | 	(void) zpl_putpage(&pp->page, wbc, data); | ||||||
|  | 	return (0); | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | static inline int | ||||||
|  | zpl_write_cache_pages(struct address_space *mapping, | ||||||
|  |     struct writeback_control *wbc, void *data) | ||||||
|  | { | ||||||
|  | 	int result; | ||||||
|  | 
 | ||||||
|  | #ifdef HAVE_WRITEPAGE_T_FOLIO | ||||||
|  | 	result = write_cache_pages(mapping, wbc, zpl_putfolio, data); | ||||||
|  | #else | ||||||
|  | 	result = write_cache_pages(mapping, wbc, zpl_putpage, data); | ||||||
|  | #endif | ||||||
|  | 	return (result); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static int | static int | ||||||
| zpl_writepages(struct address_space *mapping, struct writeback_control *wbc) | zpl_writepages(struct address_space *mapping, struct writeback_control *wbc) | ||||||
| { | { | ||||||
| @ -752,7 +775,7 @@ zpl_writepages(struct address_space *mapping, struct writeback_control *wbc) | |||||||
| 	 */ | 	 */ | ||||||
| 	boolean_t for_sync = (sync_mode == WB_SYNC_ALL); | 	boolean_t for_sync = (sync_mode == WB_SYNC_ALL); | ||||||
| 	wbc->sync_mode = WB_SYNC_NONE; | 	wbc->sync_mode = WB_SYNC_NONE; | ||||||
| 	result = write_cache_pages(mapping, wbc, zpl_putpage, &for_sync); | 	result = zpl_write_cache_pages(mapping, wbc, &for_sync); | ||||||
| 	if (sync_mode != wbc->sync_mode) { | 	if (sync_mode != wbc->sync_mode) { | ||||||
| 		ZPL_ENTER(zfsvfs); | 		ZPL_ENTER(zfsvfs); | ||||||
| 		ZPL_VERIFY_ZP(zp); | 		ZPL_VERIFY_ZP(zp); | ||||||
| @ -768,8 +791,7 @@ zpl_writepages(struct address_space *mapping, struct writeback_control *wbc) | |||||||
| 		 * details). That being said, this is a no-op in most cases. | 		 * details). That being said, this is a no-op in most cases. | ||||||
| 		 */ | 		 */ | ||||||
| 		wbc->sync_mode = sync_mode; | 		wbc->sync_mode = sync_mode; | ||||||
| 		result = write_cache_pages(mapping, wbc, zpl_putpage, | 		result = zpl_write_cache_pages(mapping, wbc, &for_sync); | ||||||
| 		    &for_sync); |  | ||||||
| 	} | 	} | ||||||
| 	return (result); | 	return (result); | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 youzhongyang
						youzhongyang