mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Linux 6.8 compat: implement strlcpy fallback
Linux has removed strlcpy in favour of strscpy. This implements a
fallback implementation of strlcpy for this case.
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Rob Norris <robn@despairlabs.com>
Sponsored-by: https://despairlabs.com/sponsor/
Closes #15805
(cherry picked from commit 7466e09a49)
			
			
This commit is contained in:
		
							parent
							
								
									3271604242
								
							
						
					
					
						commit
						38f6f3ada1
					
				
							
								
								
									
										47
									
								
								config/kernel-strlcpy.m4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								config/kernel-strlcpy.m4
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,47 @@ | |||||||
|  | dnl # | ||||||
|  | dnl # 6.8.x replaced strlcpy with strscpy. Check for both so we can provide | ||||||
|  | dnl # appropriate fallbacks. | ||||||
|  | dnl # | ||||||
|  | AC_DEFUN([ZFS_AC_KERNEL_SRC_STRLCPY], [ | ||||||
|  | 	ZFS_LINUX_TEST_SRC([kernel_has_strlcpy], [ | ||||||
|  | 		#include <linux/string.h> | ||||||
|  | 	], [ | ||||||
|  | 		const char *src = "goodbye"; | ||||||
|  | 		char dst[32]; | ||||||
|  | 		size_t len; | ||||||
|  | 		len = strlcpy(dst, src, sizeof (dst)); | ||||||
|  | 	]) | ||||||
|  | ]) | ||||||
|  | 
 | ||||||
|  | AC_DEFUN([ZFS_AC_KERNEL_SRC_STRSCPY], [ | ||||||
|  | 	ZFS_LINUX_TEST_SRC([kernel_has_strscpy], [ | ||||||
|  | 		#include <linux/string.h> | ||||||
|  | 	], [ | ||||||
|  | 		const char *src = "goodbye"; | ||||||
|  | 		char dst[32]; | ||||||
|  | 		ssize_t len; | ||||||
|  | 		len = strscpy(dst, src, sizeof (dst)); | ||||||
|  | 	]) | ||||||
|  | ]) | ||||||
|  | 
 | ||||||
|  | AC_DEFUN([ZFS_AC_KERNEL_STRLCPY], [ | ||||||
|  | 	AC_MSG_CHECKING([whether strlcpy() exists]) | ||||||
|  | 	ZFS_LINUX_TEST_RESULT([kernel_has_strlcpy], [ | ||||||
|  | 		AC_MSG_RESULT([yes]) | ||||||
|  | 		AC_DEFINE(HAVE_KERNEL_STRLCPY, 1, | ||||||
|  | 			[strlcpy() exists]) | ||||||
|  | 	], [ | ||||||
|  | 		AC_MSG_RESULT([no]) | ||||||
|  | 	]) | ||||||
|  | ]) | ||||||
|  | 
 | ||||||
|  | AC_DEFUN([ZFS_AC_KERNEL_STRSCPY], [ | ||||||
|  | 	AC_MSG_CHECKING([whether strscpy() exists]) | ||||||
|  | 	ZFS_LINUX_TEST_RESULT([kernel_has_strscpy], [ | ||||||
|  | 		AC_MSG_RESULT([yes]) | ||||||
|  | 		AC_DEFINE(HAVE_KERNEL_STRSCPY, 1, | ||||||
|  | 			[strscpy() exists]) | ||||||
|  | 	], [ | ||||||
|  | 		AC_MSG_RESULT([no]) | ||||||
|  | 	]) | ||||||
|  | ]) | ||||||
| @ -140,6 +140,8 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [ | |||||||
| 	ZFS_AC_KERNEL_SRC_SYSFS | 	ZFS_AC_KERNEL_SRC_SYSFS | ||||||
| 	ZFS_AC_KERNEL_SRC_SET_SPECIAL_STATE | 	ZFS_AC_KERNEL_SRC_SET_SPECIAL_STATE | ||||||
| 	ZFS_AC_KERNEL_SRC_STANDALONE_LINUX_STDARG | 	ZFS_AC_KERNEL_SRC_STANDALONE_LINUX_STDARG | ||||||
|  | 	ZFS_AC_KERNEL_SRC_STRLCPY | ||||||
|  | 	ZFS_AC_KERNEL_SRC_STRSCPY | ||||||
| 	ZFS_AC_KERNEL_SRC_PAGEMAP_FOLIO_WAIT_BIT | 	ZFS_AC_KERNEL_SRC_PAGEMAP_FOLIO_WAIT_BIT | ||||||
| 	ZFS_AC_KERNEL_SRC_ADD_DISK | 	ZFS_AC_KERNEL_SRC_ADD_DISK | ||||||
| 	ZFS_AC_KERNEL_SRC_KTHREAD | 	ZFS_AC_KERNEL_SRC_KTHREAD | ||||||
| @ -270,6 +272,8 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [ | |||||||
| 	ZFS_AC_KERNEL_SYSFS | 	ZFS_AC_KERNEL_SYSFS | ||||||
| 	ZFS_AC_KERNEL_SET_SPECIAL_STATE | 	ZFS_AC_KERNEL_SET_SPECIAL_STATE | ||||||
| 	ZFS_AC_KERNEL_STANDALONE_LINUX_STDARG | 	ZFS_AC_KERNEL_STANDALONE_LINUX_STDARG | ||||||
|  | 	ZFS_AC_KERNEL_STRLCPY | ||||||
|  | 	ZFS_AC_KERNEL_STRSCPY | ||||||
| 	ZFS_AC_KERNEL_PAGEMAP_FOLIO_WAIT_BIT | 	ZFS_AC_KERNEL_PAGEMAP_FOLIO_WAIT_BIT | ||||||
| 	ZFS_AC_KERNEL_ADD_DISK | 	ZFS_AC_KERNEL_ADD_DISK | ||||||
| 	ZFS_AC_KERNEL_KTHREAD | 	ZFS_AC_KERNEL_KTHREAD | ||||||
|  | |||||||
| @ -34,6 +34,7 @@ KERNEL_H = \ | |||||||
| 	signal.h \
 | 	signal.h \
 | ||||||
| 	simd.h \
 | 	simd.h \
 | ||||||
| 	stat.h \
 | 	stat.h \
 | ||||||
|  | 	string.h \
 | ||||||
| 	strings.h \
 | 	strings.h \
 | ||||||
| 	sunddi.h \
 | 	sunddi.h \
 | ||||||
| 	sysmacros.h \
 | 	sysmacros.h \
 | ||||||
|  | |||||||
							
								
								
									
										50
									
								
								include/os/linux/spl/sys/string.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								include/os/linux/spl/sys/string.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,50 @@ | |||||||
|  | /*
 | ||||||
|  |  *  Copyright (C) 2007-2010 Lawrence Livermore National Security, LLC. | ||||||
|  |  *  Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). | ||||||
|  |  *  Written by Brian Behlendorf <behlendorf1@llnl.gov>. | ||||||
|  |  *  UCRL-CODE-235197 | ||||||
|  |  * | ||||||
|  |  *  This file is part of the SPL, Solaris Porting Layer. | ||||||
|  |  * | ||||||
|  |  *  The SPL is free software; you can redistribute it and/or modify it | ||||||
|  |  *  under the terms of the GNU General Public License as published by the | ||||||
|  |  *  Free Software Foundation; either version 2 of the License, or (at your | ||||||
|  |  *  option) any later version. | ||||||
|  |  * | ||||||
|  |  *  The SPL is distributed in the hope that it will be useful, but WITHOUT | ||||||
|  |  *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | ||||||
|  |  *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License | ||||||
|  |  *  for more details. | ||||||
|  |  * | ||||||
|  |  *  You should have received a copy of the GNU General Public License along | ||||||
|  |  *  with the SPL.  If not, see <http://www.gnu.org/licenses/>.
 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef _SPL_STRING_H | ||||||
|  | #define	_SPL_STRING_H | ||||||
|  | 
 | ||||||
|  | #include <linux/string.h> | ||||||
|  | 
 | ||||||
|  | /* Fallbacks for kernel missing strlcpy */ | ||||||
|  | #ifndef HAVE_KERNEL_STRLCPY | ||||||
|  | 
 | ||||||
|  | #if defined(HAVE_KERNEL_STRSCPY) | ||||||
|  | /*
 | ||||||
|  |  * strscpy is strlcpy, but returns an error on truncation. strlcpy is defined | ||||||
|  |  * to return strlen(src), so detect error and override it. | ||||||
|  |  */ | ||||||
|  | static inline size_t | ||||||
|  | strlcpy(char *dest, const char *src, size_t size) | ||||||
|  | { | ||||||
|  | 	ssize_t ret = strscpy(dest, src, size); | ||||||
|  | 	if (likely(ret > 0)) | ||||||
|  | 		return ((size_t)ret); | ||||||
|  | 	return (strlen(src)); | ||||||
|  | } | ||||||
|  | #else | ||||||
|  | #error "no strlcpy fallback available" | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #endif /* HAVE_KERNEL_STRLCPY */ | ||||||
|  | 
 | ||||||
|  | #endif /* _SPL_STRING_H */ | ||||||
| @ -57,6 +57,7 @@ extern "C" { | |||||||
| #include <sys/disp.h> | #include <sys/disp.h> | ||||||
| #include <sys/debug.h> | #include <sys/debug.h> | ||||||
| #include <sys/random.h> | #include <sys/random.h> | ||||||
|  | #include <sys/string.h> | ||||||
| #include <sys/strings.h> | #include <sys/strings.h> | ||||||
| #include <sys/byteorder.h> | #include <sys/byteorder.h> | ||||||
| #include <sys/list.h> | #include <sys/list.h> | ||||||
|  | |||||||
| @ -28,6 +28,7 @@ | |||||||
| #include <sys/timer.h> | #include <sys/timer.h> | ||||||
| #include <sys/vmem.h> | #include <sys/vmem.h> | ||||||
| #include <sys/wait.h> | #include <sys/wait.h> | ||||||
|  | #include <sys/string.h> | ||||||
| #include <linux/slab.h> | #include <linux/slab.h> | ||||||
| #include <linux/swap.h> | #include <linux/swap.h> | ||||||
| #include <linux/prefetch.h> | #include <linux/prefetch.h> | ||||||
|  | |||||||
| @ -32,6 +32,7 @@ | |||||||
| #include <sys/vmem.h> | #include <sys/vmem.h> | ||||||
| #include <sys/cmn_err.h> | #include <sys/cmn_err.h> | ||||||
| #include <sys/sysmacros.h> | #include <sys/sysmacros.h> | ||||||
|  | #include <sys/string.h> | ||||||
| 
 | 
 | ||||||
| static kmutex_t kstat_module_lock; | static kmutex_t kstat_module_lock; | ||||||
| static struct list_head kstat_module_list; | static struct list_head kstat_module_list; | ||||||
|  | |||||||
| @ -26,6 +26,7 @@ | |||||||
| #include <sys/thread.h> | #include <sys/thread.h> | ||||||
| #include <sys/kmem.h> | #include <sys/kmem.h> | ||||||
| #include <sys/tsd.h> | #include <sys/tsd.h> | ||||||
|  | #include <sys/string.h> | ||||||
| 
 | 
 | ||||||
| /*
 | /*
 | ||||||
|  * Thread interfaces |  * Thread interfaces | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Rob Norris
						Rob Norris