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