diff options
Diffstat (limited to 'sys/contrib')
30 files changed, 636 insertions, 349 deletions
| diff --git a/sys/contrib/openzfs/.mailmap b/sys/contrib/openzfs/.mailmap index e6f09c6c9d43..3397fbc3745d 100644 --- a/sys/contrib/openzfs/.mailmap +++ b/sys/contrib/openzfs/.mailmap @@ -53,6 +53,7 @@ Jason Harmening <jason.harmening@gmail.com>  Jeremy Faulkner <gldisater@gmail.com>  Jinshan Xiong <jinshan.xiong@gmail.com>  John Poduska <jpoduska@datto.com> +Jo Zzsi <jozzsicsataban@gmail.com>  Justin Scholz <git@justinscholz.de>  Ka Ho Ng <khng300@gmail.com>  Kash Pande <github@tripleback.net> @@ -67,6 +68,7 @@ Michael Gmelin <grembo@FreeBSD.org>  Olivier Mazouffre <olivier.mazouffre@ims-bordeaux.fr>  Piotr Kubaj <pkubaj@anongoth.pl>  Quentin Zdanis <zdanisq@gmail.com> +Roberto Ricci <io@r-ricci.it>  Roberto Ricci <ricci@disroot.org>  Rob Norris <robn@despairlabs.com>  Rob Norris <rob.norris@klarasystems.com> @@ -83,7 +85,10 @@ Youzhong Yang <youzhong@gmail.com>  # Signed-off-by: overriding Author:  Alexander Ziaee <ziaee@FreeBSD.org> <concussious@runbox.com>  Felix Schmidt <felixschmidt20@aol.com> <f.sch.prototype@gmail.com> +Jean-Sébastien Pédron <dumbbell@FreeBSD.org> <jean-sebastien.pedron@dumbbell.fr> +Konstantin Belousov <kib@FreeBSD.org> <kib@kib.kiev.ua>  Olivier Certner <olce@FreeBSD.org> <olce.freebsd@certner.fr> +Patrick Xia <patrickx@google.com> <octalc0de@aim.com>  Phil Sutter <phil@nwl.cc> <p.github@nwl.cc>  poscat <poscat@poscat.moe> <poscat0x04@outlook.com>  Qiuhao Chen <chenqiuhao1997@gmail.com> <haohao0924@126.com> @@ -125,6 +130,7 @@ buzzingwires <buzzingwires@outlook.com> <131118055+buzzingwires@users.noreply.gi  Cedric Maunoury <cedric.maunoury@gmail.com> <38213715+cedricmaunoury@users.noreply.github.com>  Charles Suh <charles.suh@gmail.com> <charlessuh@users.noreply.github.com>  Chris Peredun <chris.peredun@ixsystems.com> <126915832+chrisperedun@users.noreply.github.com> +classabbyamp <dev@placeviolette.net> <5366828+classabbyamp@users.noreply.github.com>  Dacian Reece-Stremtan <dacianstremtan@gmail.com> <35844628+dacianstremtan@users.noreply.github.com>  Damian Szuberski <szuberskidamian@gmail.com> <30863496+szubersk@users.noreply.github.com>  Daniel Hiepler <d-git@coderdu.de> <32984777+heeplr@users.noreply.github.com> @@ -185,6 +191,7 @@ Michael Niewöhner <foss@mniewoehner.de> <c0d3z3r0@users.noreply.github.com>  Michael Zhivich <mzhivich@akamai.com> <33133421+mzhivich@users.noreply.github.com>  MigeljanImeri <ImeriMigel@gmail.com> <78048439+MigeljanImeri@users.noreply.github.com>  Mo Zhou <cdluminate@gmail.com> <5723047+cdluminate@users.noreply.github.com> +nav1s <nav1s@proton.me> <42621369+nav1s@users.noreply.github.com>  Nick Mattis <nickm970@gmail.com> <nmattis@users.noreply.github.com>  omni <omni+vagant@hack.org> <79493359+omnivagant@users.noreply.github.com>  Pablo Correa Gómez <ablocorrea@hotmail.com> <32678034+pablofsf@users.noreply.github.com> @@ -206,6 +213,7 @@ Samuel Wycliffe <samuelwycliffe@gmail.com> <50765275+npc203@users.noreply.github  Savyasachee Jha <hi@savyasacheejha.com> <savyajha@users.noreply.github.com>  Scott Colby <scott@scolby.com> <scolby33@users.noreply.github.com>  Sean Eric Fagan <kithrup@mac.com> <kithrup@users.noreply.github.com> +Shreshth Srivastava <shreshthsrivastava2@gmail.com> <66148173+Shreshth3@users.noreply.github.com>  Spencer Kinny <spencerkinny1995@gmail.com> <30333052+Spencer-Kinny@users.noreply.github.com>  Srikanth N S <srikanth.nagasubbaraoseetharaman@hpe.com> <75025422+nssrikanth@users.noreply.github.com>  Stefan Lendl <s.lendl@proxmox.com> <1321542+stfl@users.noreply.github.com> diff --git a/sys/contrib/openzfs/AUTHORS b/sys/contrib/openzfs/AUTHORS index 6c34c07f39ef..e496c0e8a807 100644 --- a/sys/contrib/openzfs/AUTHORS +++ b/sys/contrib/openzfs/AUTHORS @@ -154,6 +154,7 @@ CONTRIBUTORS:      Chris Zubrzycki <github@mid-earth.net>      Chuck Tuffli <ctuffli@gmail.com>      Chunwei Chen <david.chen@nutanix.com> +    classabbyamp <dev@placeviolette.net>      Clemens Fruhwirth <clemens@endorphin.org>      Clemens Lang <cl@clang.name>      Clint Armstrong <clint@clintarmstrong.net> @@ -161,6 +162,7 @@ CONTRIBUTORS:      Colin Ian King <colin.king@canonical.com>      Colin Percival <cperciva@tarsnap.com>      Colm Buckley <colm@tuatha.org> +    Cong Zhang <congzhangzh@users.noreply.github.com>      Crag Wang <crag0715@gmail.com>      Craig Loomis <cloomis@astro.princeton.edu>      Craig Sanders <github@taz.net.au> @@ -217,6 +219,7 @@ CONTRIBUTORS:      Eitan Adler <lists@eitanadler.com>      Eli Rosenthal <eli.rosenthal@delphix.com>      Eli Schwartz <eschwartz93@gmail.com> +    Eric A. Borisch <eborisch@gmail.com>      Eric Desrochers <eric.desrochers@canonical.com>      Eric Dillmann <eric@jave.fr>      Eric Schrock <Eric.Schrock@delphix.com> @@ -288,6 +291,7 @@ CONTRIBUTORS:      Henrik Riomar <henrik.riomar@gmail.com>      Herb Wartens <wartens2@llnl.gov>      Hiếu Lê <leorize+oss@disroot.org> +    hoshinomori <hoshinomorimorimo@gmail.com>      Huang Liu <liu.huang@zte.com.cn>      Håkan Johansson <f96hajo@chalmers.se>      Igor K <igor@dilos.org> @@ -300,6 +304,7 @@ CONTRIBUTORS:      ilovezfs <ilovezfs@icloud.com>      InsanePrawn <Insane.Prawny@gmail.com>      Isaac Huang <he.huang@intel.com> +    Ivan Shapovalov <intelfx@intelfx.name>      Ivan Volosyuk <Ivan.Volosyuk@gmail.com>      Jacek Fefliński <feflik@gmail.com>      Jacob Adams <tookmund@gmail.com> @@ -322,6 +327,7 @@ CONTRIBUTORS:      Javen Wu <wu.javen@gmail.com>      Jaydeep Kshirsagar <jkshirsagar@maxlinear.com>      Jean-Baptiste Lallement <jean-baptiste@ubuntu.com> +    Jean-Sébastien Pédron <dumbbell@FreeBSD.org>      Jeff Dike <jdike@akamai.com>      Jeremy Faulkner <gldisater@gmail.com>      Jeremy Gill <jgill@parallax-innovations.com> @@ -355,7 +361,9 @@ CONTRIBUTORS:      Josh Soref <jsoref@users.noreply.github.com>      Joshua M. Clulow <josh@sysmgr.org>      José Luis Salvador Rufo <salvador.joseluis@gmail.com> +    Jo Zzsi <jozzsicsataban@gmail.com>      João Carlos Mendes Luís <jonny@jonny.eng.br> +    JT Pennington <jt.pennington@klarasystems.com>      Julian Brunner <julian.brunner@gmail.com>      Julian Heuking <JulianH@beckhoff.com>      jumbi77 <jumbi77@users.noreply.github.com> @@ -388,6 +396,7 @@ CONTRIBUTORS:      Kleber Tarcísio <klebertarcisio@yahoo.com.br>      Kody A Kantor <kody.kantor@gmail.com>      Kohsuke Kawaguchi <kk@kohsuke.org> +    Konstantin Belousov <kib@FreeBSD.org>      Konstantin Khorenko <khorenko@virtuozzo.com>      KORN Andras <korn@elan.rulez.org>      kotauskas <v.toncharov@gmail.com> @@ -416,6 +425,7 @@ CONTRIBUTORS:      luozhengzheng <luo.zhengzheng@zte.com.cn>      Luís Henriques <henrix@camandro.org>      Madhav Suresh <madhav.suresh@delphix.com> +    Maksym Shkolnyi <maksym.shkolnyi@workato.com>      manfromafar <jonsonb10@gmail.com>      Manoj Joseph <manoj.joseph@delphix.com>      Manuel Amador (Rudd-O) <rudd-o@rudd-o.com> @@ -482,6 +492,7 @@ CONTRIBUTORS:      Nathaniel Clark <Nathaniel.Clark@misrule.us>      Nathaniel Wesley Filardo <nwf@cs.jhu.edu>      Nathan Lewis <linux.robotdude@gmail.com> +    nav1s <nav1s@proton.me>      Nav Ravindranath <nav@delphix.com>      Neal Gompa (ニール・ゴンパ) <ngompa13@gmail.com>      Ned Bass <bass6@llnl.gov> @@ -506,6 +517,7 @@ CONTRIBUTORS:      Palash Gandhi <pbg4930@rit.edu>      Patrick Fasano <patrick@patrickfasano.com>      Patrick Mooney <pmooney@pfmooney.com> +    Patrick Xia <patrickx@google.com>      Patrik Greco <sikevux@sikevux.se>      Paul B. Henson <henson@acm.org>      Paul Dagnelie <pcd@delphix.com> @@ -605,6 +617,7 @@ CONTRIBUTORS:      Shengqi Chen <harry-chen@outlook.com>      SHENGYI HONG <aokblast@FreeBSD.org>      Shen Yan <shenyanxxxy@qq.com> +    Shreshth Srivastava <shreshthsrivastava2@gmail.com>      Sietse <sietse@wizdom.nu>      Simon Guest <simon.guest@tesujimath.org>      Simon Howard <fraggle@soulsphere.org> @@ -665,6 +678,7 @@ CONTRIBUTORS:      Toyam Cox <aviator45003@gmail.com>      Trevor Bautista <trevrb@trevrb.net>      Trey Dockendorf <treydock@gmail.com> +    trick2011 <trick2011@users.noreply.github.com>      Troels Nørgaard <tnn@tradeshift.com>      tstabrawa <tstabrawa@users.noreply.github.com>      Tulsi Jain <tulsi.jain@delphix.com> diff --git a/sys/contrib/openzfs/cmd/zdb/zdb.c b/sys/contrib/openzfs/cmd/zdb/zdb.c index 1ffb8ebc70f2..2560ad045db3 100644 --- a/sys/contrib/openzfs/cmd/zdb/zdb.c +++ b/sys/contrib/openzfs/cmd/zdb/zdb.c @@ -9747,6 +9747,9 @@ main(int argc, char **argv)  	 */  	spa_mode_readable_spacemaps = B_TRUE; +	libspl_set_assert_ok((dump_opt['A'] == 1) || (dump_opt['A'] > 2)); +	zfs_recover = (dump_opt['A'] > 1); +  	if (dump_all)  		verbose = MAX(verbose, 1); @@ -9757,9 +9760,6 @@ main(int argc, char **argv)  			dump_opt[c] += verbose;  	} -	libspl_set_assert_ok((dump_opt['A'] == 1) || (dump_opt['A'] > 2)); -	zfs_recover = (dump_opt['A'] > 1); -  	argc -= optind;  	argv += optind;  	if (argc < 2 && dump_opt['R']) diff --git a/sys/contrib/openzfs/cmd/zpool/zpool_main.c b/sys/contrib/openzfs/cmd/zpool/zpool_main.c index 1feec55c0e8b..a6658a9c2800 100644 --- a/sys/contrib/openzfs/cmd/zpool/zpool_main.c +++ b/sys/contrib/openzfs/cmd/zpool/zpool_main.c @@ -6975,7 +6975,6 @@ collect_vdev_prop(zpool_prop_t prop, uint64_t value, const char *str,  /*   * print static default line per vdev - * not compatible with '-o' <proplist> option   */  static void  collect_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv, @@ -7031,48 +7030,98 @@ collect_list_stats(zpool_handle_t *zhp, const char *name, nvlist_t *nv,  		 * 'toplevel' boolean value is passed to the print_one_column()  		 * to indicate that the value is valid.  		 */ -		if (VDEV_STAT_VALID(vs_pspace, c) && vs->vs_pspace) { -			collect_vdev_prop(ZPOOL_PROP_SIZE, vs->vs_pspace, NULL, -			    scripted, B_TRUE, format, cb->cb_json, props, -			    cb->cb_json_as_int); -		} else { -			collect_vdev_prop(ZPOOL_PROP_SIZE, vs->vs_space, NULL, -			    scripted, toplevel, format, cb->cb_json, props, -			    cb->cb_json_as_int); +		for (zprop_list_t *pl = cb->cb_proplist; pl != NULL; +		    pl = pl->pl_next) { +			switch (pl->pl_prop) { +			case ZPOOL_PROP_SIZE: +				if (VDEV_STAT_VALID(vs_pspace, c) && +				    vs->vs_pspace) { +					collect_vdev_prop( +					    ZPOOL_PROP_SIZE, vs->vs_pspace, +					    NULL, scripted, B_TRUE, format, +					    cb->cb_json, props, +					    cb->cb_json_as_int); +				} else { +					collect_vdev_prop( +					    ZPOOL_PROP_SIZE, vs->vs_space, NULL, +					    scripted, toplevel, format, +					    cb->cb_json, props, +					    cb->cb_json_as_int); +				} +				break; +			case ZPOOL_PROP_ALLOCATED: +				collect_vdev_prop(ZPOOL_PROP_ALLOCATED, +				    vs->vs_alloc, NULL, scripted, toplevel, +				    format, cb->cb_json, props, +				    cb->cb_json_as_int); +				break; + +			case ZPOOL_PROP_FREE: +				collect_vdev_prop(ZPOOL_PROP_FREE, +				    vs->vs_space - vs->vs_alloc, NULL, scripted, +				    toplevel, format, cb->cb_json, props, +				    cb->cb_json_as_int); +				break; + +			case ZPOOL_PROP_CHECKPOINT: +				collect_vdev_prop(ZPOOL_PROP_CHECKPOINT, +				    vs->vs_checkpoint_space, NULL, scripted, +				    toplevel, format, cb->cb_json, props, +				    cb->cb_json_as_int); +				break; + +			case ZPOOL_PROP_EXPANDSZ: +				collect_vdev_prop(ZPOOL_PROP_EXPANDSZ, +				    vs->vs_esize, NULL, scripted, B_TRUE, +				    format, cb->cb_json, props, +				    cb->cb_json_as_int); +				break; + +			case ZPOOL_PROP_FRAGMENTATION: +				collect_vdev_prop( +				    ZPOOL_PROP_FRAGMENTATION, +				    vs->vs_fragmentation, NULL, scripted, +				    (vs->vs_fragmentation != ZFS_FRAG_INVALID && +				    toplevel), +				    format, cb->cb_json, props, +				    cb->cb_json_as_int); +				break; + +			case ZPOOL_PROP_CAPACITY: +				cap = (vs->vs_space == 0) ? +				    0 : (vs->vs_alloc * 10000 / vs->vs_space); +				collect_vdev_prop(ZPOOL_PROP_CAPACITY, cap, +				    NULL, scripted, toplevel, format, +				    cb->cb_json, props, cb->cb_json_as_int); +				break; + +			case ZPOOL_PROP_HEALTH: +				state = zpool_state_to_name(vs->vs_state, +				    vs->vs_aux); +				if (isspare) { +					if (vs->vs_aux == VDEV_AUX_SPARED) +						state = "INUSE"; +					else if (vs->vs_state == +					    VDEV_STATE_HEALTHY) +						state = "AVAIL"; +				} +				collect_vdev_prop(ZPOOL_PROP_HEALTH, 0, state, +				    scripted, B_TRUE, format, cb->cb_json, +				    props, cb->cb_json_as_int); +				break; + +			case ZPOOL_PROP_NAME: +				break; + +			default: +				collect_vdev_prop(pl->pl_prop, 0, +				    NULL, scripted, B_FALSE, format, +				    cb->cb_json, props, cb->cb_json_as_int); + +			} + +  		} -		collect_vdev_prop(ZPOOL_PROP_ALLOCATED, vs->vs_alloc, NULL, -		    scripted, toplevel, format, cb->cb_json, props, -		    cb->cb_json_as_int); -		collect_vdev_prop(ZPOOL_PROP_FREE, vs->vs_space - vs->vs_alloc, -		    NULL, scripted, toplevel, format, cb->cb_json, props, -		    cb->cb_json_as_int); -		collect_vdev_prop(ZPOOL_PROP_CHECKPOINT, -		    vs->vs_checkpoint_space, NULL, scripted, toplevel, format, -		    cb->cb_json, props, cb->cb_json_as_int); -		collect_vdev_prop(ZPOOL_PROP_EXPANDSZ, vs->vs_esize, NULL, -		    scripted, B_TRUE, format, cb->cb_json, props, -		    cb->cb_json_as_int); -		collect_vdev_prop(ZPOOL_PROP_FRAGMENTATION, -		    vs->vs_fragmentation, NULL, scripted, -		    (vs->vs_fragmentation != ZFS_FRAG_INVALID && toplevel), -		    format, cb->cb_json, props, cb->cb_json_as_int); -		cap = (vs->vs_space == 0) ? 0 : -		    (vs->vs_alloc * 10000 / vs->vs_space); -		collect_vdev_prop(ZPOOL_PROP_CAPACITY, cap, NULL, -		    scripted, toplevel, format, cb->cb_json, props, -		    cb->cb_json_as_int); -		collect_vdev_prop(ZPOOL_PROP_DEDUPRATIO, 0, NULL, -		    scripted, toplevel, format, cb->cb_json, props, -		    cb->cb_json_as_int); -		state = zpool_state_to_name(vs->vs_state, vs->vs_aux); -		if (isspare) { -			if (vs->vs_aux == VDEV_AUX_SPARED) -				state = "INUSE"; -			else if (vs->vs_state == VDEV_STATE_HEALTHY) -				state = "AVAIL"; -		} -		collect_vdev_prop(ZPOOL_PROP_HEALTH, 0, state, scripted, -		    B_TRUE, format, cb->cb_json, props, cb->cb_json_as_int);  		if (cb->cb_json) {  			fnvlist_add_nvlist(ent, "properties", props); diff --git a/sys/contrib/openzfs/config/kernel-block-device-operations.m4 b/sys/contrib/openzfs/config/kernel-block-device-operations.m4 index 4ff20b9c413d..1905340a9c7d 100644 --- a/sys/contrib/openzfs/config/kernel-block-device-operations.m4 +++ b/sys/contrib/openzfs/config/kernel-block-device-operations.m4 @@ -119,15 +119,49 @@ AC_DEFUN([ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_REVALIDATE_DISK], [  	])  ]) +dnl # +dnl # 6.18 API change +dnl # block_device_operation->getgeo takes struct gendisk* as first arg +dnl # +AC_DEFUN([ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_GETGEO_GENDISK], [ +	ZFS_LINUX_TEST_SRC([block_device_operations_getgeo_gendisk], [ +		#include <linux/blkdev.h> + +		static int blk_getgeo(struct gendisk *disk, struct hd_geometry *geo) +		{ +			(void) disk, (void) geo; +			return (0); +		} + +		static const struct block_device_operations +		    bops __attribute__ ((unused)) = { +			.getgeo	= blk_getgeo, +		}; +	], [], []) +]) + +AC_DEFUN([ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_GETGEO_GENDISK], [ +	AC_MSG_CHECKING([whether bops->getgeo() takes gendisk as first arg]) +	ZFS_LINUX_TEST_RESULT([block_device_operations_getgeo_gendisk], [ +		AC_MSG_RESULT(yes) +		AC_DEFINE([HAVE_BLOCK_DEVICE_OPERATIONS_GETGEO_GENDISK], [1], +			[Define if getgeo() in block_device_operations takes struct gendisk * as its first arg]) +	],[ +		AC_MSG_RESULT(no) +	]) +]) +  AC_DEFUN([ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS], [  	ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_CHECK_EVENTS  	ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID  	ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_RELEASE_1ARG  	ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_REVALIDATE_DISK +	ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS_GETGEO_GENDISK  ])  AC_DEFUN([ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS], [  	ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_CHECK_EVENTS  	ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_RELEASE_VOID  	ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_REVALIDATE_DISK +	ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS_GETGEO_GENDISK  ]) diff --git a/sys/contrib/openzfs/config/kernel-drop-inode.m4 b/sys/contrib/openzfs/config/kernel-drop-inode.m4 new file mode 100644 index 000000000000..6f2b12cadc02 --- /dev/null +++ b/sys/contrib/openzfs/config/kernel-drop-inode.m4 @@ -0,0 +1,24 @@ +dnl # +dnl # 6.18 API change +dnl # - generic_drop_inode() renamed to inode_generic_drop() +dnl # - generic_delete_inode() renamed to inode_just_drop() +dnl # +AC_DEFUN([ZFS_AC_KERNEL_SRC_INODE_GENERIC_DROP], [ +	ZFS_LINUX_TEST_SRC([inode_generic_drop], [ +		#include <linux/fs.h> +	],[ +		struct inode *ip = NULL; +		inode_generic_drop(ip); +	]) +]) + +AC_DEFUN([ZFS_AC_KERNEL_INODE_GENERIC_DROP], [ +	AC_MSG_CHECKING([whether inode_generic_drop() exists]) +	ZFS_LINUX_TEST_RESULT([inode_generic_drop], [ +		AC_MSG_RESULT(yes) +		AC_DEFINE(HAVE_INODE_GENERIC_DROP, 1, +			[inode_generic_drop() exists]) +	],[ +		AC_MSG_RESULT(no) +	]) +]) diff --git a/sys/contrib/openzfs/config/kernel-namespace.m4 b/sys/contrib/openzfs/config/kernel-namespace.m4 new file mode 100644 index 000000000000..9b0b12e4eab4 --- /dev/null +++ b/sys/contrib/openzfs/config/kernel-namespace.m4 @@ -0,0 +1,31 @@ +dnl # +dnl # 6.18 API change +dnl # ns->ops->type was moved to ns->ns.ns_type (struct ns_common) +dnl # +AC_DEFUN([ZFS_AC_KERNEL_SRC_NS_COMMON_TYPE], [ +	ZFS_LINUX_TEST_SRC([ns_common_type], [ +		#include <linux/user_namespace.h> +	],[ +		struct user_namespace ns; +		ns.ns.ns_type = 0; +	]) +]) + +AC_DEFUN([ZFS_AC_KERNEL_NS_COMMON_TYPE], [ +	AC_MSG_CHECKING([whether ns_type is accessible through ns_common]) +	ZFS_LINUX_TEST_RESULT([ns_common_type], [ +		AC_MSG_RESULT(yes) +		AC_DEFINE([HAVE_NS_COMMON_TYPE], 1, +			[Define if ns_type is accessible through ns_common]) +	],[ +		AC_MSG_RESULT(no) +	]) +]) + +AC_DEFUN([ZFS_AC_KERNEL_SRC_NAMESPACE], [ +	ZFS_AC_KERNEL_SRC_NS_COMMON_TYPE +]) + +AC_DEFUN([ZFS_AC_KERNEL_NAMESPACE], [ +	ZFS_AC_KERNEL_NS_COMMON_TYPE +]) diff --git a/sys/contrib/openzfs/config/kernel-userns-capabilities.m4 b/sys/contrib/openzfs/config/kernel-userns-capabilities.m4 deleted file mode 100644 index f4e24fb1606a..000000000000 --- a/sys/contrib/openzfs/config/kernel-userns-capabilities.m4 +++ /dev/null @@ -1,79 +0,0 @@ -dnl # -dnl # 2.6.38 API change -dnl # ns_capable() was introduced -dnl # -AC_DEFUN([ZFS_AC_KERNEL_SRC_NS_CAPABLE], [ -	ZFS_LINUX_TEST_SRC([ns_capable], [ -		#include <linux/capability.h> -	],[ -		ns_capable((struct user_namespace *)NULL, CAP_SYS_ADMIN); -	]) -]) - -AC_DEFUN([ZFS_AC_KERNEL_NS_CAPABLE], [ -	AC_MSG_CHECKING([whether ns_capable exists]) -	ZFS_LINUX_TEST_RESULT([ns_capable], [ -		AC_MSG_RESULT(yes) -	],[ -		ZFS_LINUX_TEST_ERROR([ns_capable()]) -	]) -]) - -dnl # -dnl # 2.6.39 API change -dnl # struct user_namespace was added to struct cred_t as cred->user_ns member -dnl # -AC_DEFUN([ZFS_AC_KERNEL_SRC_CRED_USER_NS], [ -	ZFS_LINUX_TEST_SRC([cred_user_ns], [ -		#include <linux/cred.h> -	],[ -		struct cred cr; -		cr.user_ns = (struct user_namespace *)NULL; -	]) -]) - -AC_DEFUN([ZFS_AC_KERNEL_CRED_USER_NS], [ -	AC_MSG_CHECKING([whether cred_t->user_ns exists]) -	ZFS_LINUX_TEST_RESULT([cred_user_ns], [ -		AC_MSG_RESULT(yes) -	],[ -		ZFS_LINUX_TEST_ERROR([cred_t->user_ns()]) -	]) -]) - -dnl # -dnl # 3.4 API change -dnl # kuid_has_mapping() and kgid_has_mapping() were added to distinguish -dnl # between internal kernel uids/gids and user namespace uids/gids. -dnl # -AC_DEFUN([ZFS_AC_KERNEL_SRC_KUID_HAS_MAPPING], [ -	ZFS_LINUX_TEST_SRC([kuid_has_mapping], [ -		#include <linux/uidgid.h> -	],[ -		kuid_has_mapping((struct user_namespace *)NULL, KUIDT_INIT(0)); -		kgid_has_mapping((struct user_namespace *)NULL, KGIDT_INIT(0)); -	]) -]) - -AC_DEFUN([ZFS_AC_KERNEL_KUID_HAS_MAPPING], [ -	AC_MSG_CHECKING([whether kuid_has_mapping/kgid_has_mapping exist]) -	ZFS_LINUX_TEST_RESULT([kuid_has_mapping], [ -		AC_MSG_RESULT(yes) -	],[ -		ZFS_LINUX_TEST_ERROR([kuid_has_mapping()]) -	]) -]) - -AC_DEFUN([ZFS_AC_KERNEL_SRC_USERNS_CAPABILITIES], [ -	ZFS_AC_KERNEL_SRC_NS_CAPABLE -	ZFS_AC_KERNEL_SRC_HAS_CAPABILITY -	ZFS_AC_KERNEL_SRC_CRED_USER_NS -	ZFS_AC_KERNEL_SRC_KUID_HAS_MAPPING -]) - -AC_DEFUN([ZFS_AC_KERNEL_USERNS_CAPABILITIES], [ -	ZFS_AC_KERNEL_NS_CAPABLE -	ZFS_AC_KERNEL_HAS_CAPABILITY -	ZFS_AC_KERNEL_CRED_USER_NS -	ZFS_AC_KERNEL_KUID_HAS_MAPPING -]) diff --git a/sys/contrib/openzfs/config/kernel-writeback.m4 b/sys/contrib/openzfs/config/kernel-writeback.m4 new file mode 100644 index 000000000000..334d65ef84b6 --- /dev/null +++ b/sys/contrib/openzfs/config/kernel-writeback.m4 @@ -0,0 +1,58 @@ +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> +		static 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) +	]) +]) + +AC_DEFUN([ZFS_AC_KERNEL_SRC_WRITE_CACHE_PAGES], [ +	dnl # +	dnl # 6.18 API change +	dnl # write_cache_pages() has been removed. +	dnl # +	ZFS_LINUX_TEST_SRC([write_cache_pages], [ +		#include <linux/writeback.h> +	], [ +		(void) write_cache_pages(NULL, NULL, NULL, NULL); +	]) +]) + +AC_DEFUN([ZFS_AC_KERNEL_WRITE_CACHE_PAGES], [ +	AC_MSG_CHECKING([whether write_cache_pages() is available]) +	ZFS_LINUX_TEST_RESULT([write_cache_pages], [ +		AC_MSG_RESULT(yes) +		AC_DEFINE(HAVE_WRITE_CACHE_PAGES, 1, +		    [write_cache_pages() is available]) +	],[ +		AC_MSG_RESULT(no) +	]) +]) + +AC_DEFUN([ZFS_AC_KERNEL_SRC_WRITEBACK], [ +	ZFS_AC_KERNEL_SRC_WRITEPAGE_T +	ZFS_AC_KERNEL_SRC_WRITE_CACHE_PAGES +]) + +AC_DEFUN([ZFS_AC_KERNEL_WRITEBACK], [ +	ZFS_AC_KERNEL_WRITEPAGE_T +	ZFS_AC_KERNEL_WRITE_CACHE_PAGES +]) diff --git a/sys/contrib/openzfs/config/kernel-writepage_t.m4 b/sys/contrib/openzfs/config/kernel-writepage_t.m4 deleted file mode 100644 index a82cf370c9d4..000000000000 --- a/sys/contrib/openzfs/config/kernel-writepage_t.m4 +++ /dev/null @@ -1,26 +0,0 @@ -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> -		static 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) -	]) -]) - diff --git a/sys/contrib/openzfs/config/kernel.m4 b/sys/contrib/openzfs/config/kernel.m4 index 35819e4d68c5..40b7de739882 100644 --- a/sys/contrib/openzfs/config/kernel.m4 +++ b/sys/contrib/openzfs/config/kernel.m4 @@ -121,7 +121,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [  	ZFS_AC_KERNEL_SRC_IDMAP_MNT_API  	ZFS_AC_KERNEL_SRC_IDMAP_NO_USERNS  	ZFS_AC_KERNEL_SRC_IATTR_VFSID -	ZFS_AC_KERNEL_SRC_WRITEPAGE_T +	ZFS_AC_KERNEL_SRC_WRITEBACK  	ZFS_AC_KERNEL_SRC_RECLAIMED  	ZFS_AC_KERNEL_SRC_REGISTER_SYSCTL_TABLE  	ZFS_AC_KERNEL_SRC_REGISTER_SYSCTL_SZ @@ -136,6 +136,8 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [  	ZFS_AC_KERNEL_SRC_TIMER  	ZFS_AC_KERNEL_SRC_SUPER_BLOCK_S_WB_ERR  	ZFS_AC_KERNEL_SRC_SOPS_FREE_INODE +	ZFS_AC_KERNEL_SRC_NAMESPACE +	ZFS_AC_KERNEL_SRC_INODE_GENERIC_DROP  	case "$host_cpu" in  		powerpc*)  			ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE @@ -240,7 +242,7 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [  	ZFS_AC_KERNEL_IDMAP_MNT_API  	ZFS_AC_KERNEL_IDMAP_NO_USERNS  	ZFS_AC_KERNEL_IATTR_VFSID -	ZFS_AC_KERNEL_WRITEPAGE_T +	ZFS_AC_KERNEL_WRITEBACK  	ZFS_AC_KERNEL_RECLAIMED  	ZFS_AC_KERNEL_REGISTER_SYSCTL_TABLE  	ZFS_AC_KERNEL_REGISTER_SYSCTL_SZ @@ -256,6 +258,8 @@ AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [  	ZFS_AC_KERNEL_TIMER  	ZFS_AC_KERNEL_SUPER_BLOCK_S_WB_ERR  	ZFS_AC_KERNEL_SOPS_FREE_INODE +	ZFS_AC_KERNEL_NAMESPACE +	ZFS_AC_KERNEL_INODE_GENERIC_DROP  	case "$host_cpu" in  		powerpc*)  			ZFS_AC_KERNEL_CPU_HAS_FEATURE diff --git a/sys/contrib/openzfs/include/os/linux/kernel/linux/vfs_compat.h b/sys/contrib/openzfs/include/os/linux/kernel/linux/vfs_compat.h index cbf14e28371f..d9dc904bc322 100644 --- a/sys/contrib/openzfs/include/os/linux/kernel/linux/vfs_compat.h +++ b/sys/contrib/openzfs/include/os/linux/kernel/linux/vfs_compat.h @@ -23,6 +23,7 @@  /*   * Copyright (C) 2011 Lawrence Livermore National Security, LLC.   * Copyright (C) 2015 Jörg Thalheim. + * Copyright (c) 2025, Rob Norris <robn@despairlabs.com>   */  #ifndef _ZFS_VFS_H @@ -262,4 +263,10 @@ zpl_is_32bit_api(void)  #define	zpl_generic_fillattr(user_ns, ip, sp)	generic_fillattr(ip, sp)  #endif +#ifdef HAVE_INODE_GENERIC_DROP +/* 6.18 API change. These were renamed, alias the old names to the new. */ +#define	generic_delete_inode(ip)	inode_just_drop(ip) +#define	generic_drop_inode(ip)		inode_generic_drop(ip) +#endif +  #endif /* _ZFS_VFS_H */ diff --git a/sys/contrib/openzfs/man/man8/zpool-remove.8 b/sys/contrib/openzfs/man/man8/zpool-remove.8 index 4d5fc431d332..483d885f10fd 100644 --- a/sys/contrib/openzfs/man/man8/zpool-remove.8 +++ b/sys/contrib/openzfs/man/man8/zpool-remove.8 @@ -58,8 +58,8 @@ This command supports removing hot spare, cache, log, and both mirrored and  non-redundant primary top-level vdevs, including dedup and special vdevs.  .Pp  Top-level vdevs can only be removed if the primary pool storage does not contain -a top-level raidz vdev, all top-level vdevs have the same sector size, and the -keys for all encrypted datasets are loaded. +a top-level raidz or draid vdev, all top-level vdevs have the same ashift size, +and the keys for all encrypted datasets are loaded.  .Pp  Removing a top-level vdev reduces the total amount of space in the storage pool.  The specified device will be evacuated by copying all allocated space from it to diff --git a/sys/contrib/openzfs/module/icp/algs/sha2/sha2_generic.c b/sys/contrib/openzfs/module/icp/algs/sha2/sha2_generic.c index d0fcca798fa9..ad707341eec7 100644 --- a/sys/contrib/openzfs/module/icp/algs/sha2/sha2_generic.c +++ b/sys/contrib/openzfs/module/icp/algs/sha2/sha2_generic.c @@ -77,7 +77,8 @@ static const uint32_t SHA256_K[64] = {  	h = g, g = f, f = e, e = d + T1; \  	d = c, c = b, b = a, a = T1 + T2; -static void sha256_generic(uint32_t state[8], const void *data, size_t num_blks) +static void +icp_sha256_generic(uint32_t state[8], const void *data, size_t num_blks)  {  	uint64_t blk; @@ -173,7 +174,8 @@ static const uint64_t SHA512_K[80] = {  	0x5fcb6fab3ad6faec, 0x6c44198c4a475817  }; -static void sha512_generic(uint64_t state[8], const void *data, size_t num_blks) +static void +icp_sha512_generic(uint64_t state[8], const void *data, size_t num_blks)  {  	uint64_t blk; @@ -226,7 +228,8 @@ static void sha512_generic(uint64_t state[8], const void *data, size_t num_blks)  	}  } -static void sha256_update(sha256_ctx *ctx, const uint8_t *data, size_t len) +static void +icp_sha256_update(sha256_ctx *ctx, const uint8_t *data, size_t len)  {  	uint64_t pos = ctx->count[0];  	uint64_t total = ctx->count[1]; @@ -258,7 +261,8 @@ static void sha256_update(sha256_ctx *ctx, const uint8_t *data, size_t len)  	ctx->count[1] = total;  } -static void sha512_update(sha512_ctx *ctx, const uint8_t *data, size_t len) +static void +icp_sha512_update(sha512_ctx *ctx, const uint8_t *data, size_t len)  {  	uint64_t pos = ctx->count[0];  	uint64_t total = ctx->count[1]; @@ -290,7 +294,8 @@ static void sha512_update(sha512_ctx *ctx, const uint8_t *data, size_t len)  	ctx->count[1] = total;  } -static void sha256_final(sha256_ctx *ctx, uint8_t *result, int bits) +static void +icp_sha256_final(sha256_ctx *ctx, uint8_t *result, int bits)  {  	uint64_t mlen, pos = ctx->count[0];  	uint8_t *m = ctx->wbuf; @@ -334,7 +339,8 @@ static void sha256_final(sha256_ctx *ctx, uint8_t *result, int bits)  	memset(ctx, 0, sizeof (*ctx));  } -static void sha512_final(sha512_ctx *ctx, uint8_t *result, int bits) +static void +icp_sha512_final(sha512_ctx *ctx, uint8_t *result, int bits)  {  	uint64_t mlen, pos = ctx->count[0];  	uint8_t *m = ctx->wbuf, *r; @@ -461,14 +467,14 @@ SHA2Update(SHA2_CTX *ctx, const void *data, size_t len)  	switch (ctx->algotype) {  		case SHA256: -			sha256_update(&ctx->sha256, data, len); +			icp_sha256_update(&ctx->sha256, data, len);  			break;  		case SHA512:  		case SHA512_HMAC_MECH_INFO_TYPE: -			sha512_update(&ctx->sha512, data, len); +			icp_sha512_update(&ctx->sha512, data, len);  			break;  		case SHA512_256: -			sha512_update(&ctx->sha512, data, len); +			icp_sha512_update(&ctx->sha512, data, len);  			break;  	}  } @@ -479,32 +485,33 @@ SHA2Final(void *digest, SHA2_CTX *ctx)  {  	switch (ctx->algotype) {  		case SHA256: -			sha256_final(&ctx->sha256, digest, 256); +			icp_sha256_final(&ctx->sha256, digest, 256);  			break;  		case SHA512:  		case SHA512_HMAC_MECH_INFO_TYPE: -			sha512_final(&ctx->sha512, digest, 512); +			icp_sha512_final(&ctx->sha512, digest, 512);  			break;  		case SHA512_256: -			sha512_final(&ctx->sha512, digest, 256); +			icp_sha512_final(&ctx->sha512, digest, 256);  			break;  	}  }  /* the generic implementation is always okay */ -static boolean_t sha2_is_supported(void) +static boolean_t +icp_sha2_is_supported(void)  {  	return (B_TRUE);  }  const sha256_ops_t sha256_generic_impl = {  	.name = "generic", -	.transform = sha256_generic, -	.is_supported = sha2_is_supported +	.transform = icp_sha256_generic, +	.is_supported = icp_sha2_is_supported  };  const sha512_ops_t sha512_generic_impl = {  	.name = "generic", -	.transform = sha512_generic, -	.is_supported = sha2_is_supported +	.transform = icp_sha512_generic, +	.is_supported = icp_sha2_is_supported  }; diff --git a/sys/contrib/openzfs/module/os/freebsd/zfs/zio_crypt.c b/sys/contrib/openzfs/module/os/freebsd/zfs/zio_crypt.c index 91cf38016e00..8562c42b3220 100644 --- a/sys/contrib/openzfs/module/os/freebsd/zfs/zio_crypt.c +++ b/sys/contrib/openzfs/module/os/freebsd/zfs/zio_crypt.c @@ -437,6 +437,7 @@ zio_crypt_key_wrap(crypto_key_t *cwkey, zio_crypt_key_t *key, uint8_t *iv,  	ASSERT3U(crypt, <, ZIO_CRYPT_FUNCTIONS); +	memset(&cuio_s, 0, sizeof (cuio_s));  	zfs_uio_init(&cuio, &cuio_s);  	keydata_len = zio_crypt_table[crypt].ci_keylen; @@ -519,6 +520,7 @@ zio_crypt_key_unwrap(crypto_key_t *cwkey, uint64_t crypt, uint64_t version,  	keydata_len = zio_crypt_table[crypt].ci_keylen;  	rw_init(&key->zk_salt_lock, NULL, RW_DEFAULT, NULL); +	memset(&cuio_s, 0, sizeof (cuio_s));  	zfs_uio_init(&cuio, &cuio_s);  	/* diff --git a/sys/contrib/openzfs/module/os/linux/spl/spl-zone.c b/sys/contrib/openzfs/module/os/linux/spl/spl-zone.c index 45c2999a4bb1..b2eae5d00b10 100644 --- a/sys/contrib/openzfs/module/os/linux/spl/spl-zone.c +++ b/sys/contrib/openzfs/module/os/linux/spl/spl-zone.c @@ -25,6 +25,10 @@   * SUCH DAMAGE.   */ +/* + * Copyright (c) 2025, Rob Norris <robn@despairlabs.com> + */ +  #include <sys/types.h>  #include <sys/sysmacros.h>  #include <sys/kmem.h> @@ -56,6 +60,19 @@ typedef struct zone_dataset {  } zone_dataset_t;  #ifdef CONFIG_USER_NS + +/* + * Linux 6.18 moved the generic namespace type away from ns->ops->type onto + * ns_common itself. + */ +#ifdef HAVE_NS_COMMON_TYPE +#define	ns_is_newuser(ns)	\ +	((ns)->ns_type == CLONE_NEWUSER) +#else +#define	ns_is_newuser(ns)	\ +	((ns)->ops != NULL && (ns)->ops->type == CLONE_NEWUSER) +#endif +  /*   * Returns:   * - 0 on success @@ -84,7 +101,7 @@ user_ns_get(int fd, struct user_namespace **userns)  		goto done;  	}  	ns = get_proc_ns(file_inode(nsfile)); -	if (ns->ops->type != CLONE_NEWUSER) { +	if (!ns_is_newuser(ns)) {  		error = ENOTTY;  		goto done;  	} diff --git a/sys/contrib/openzfs/module/os/linux/zfs/abd_os.c b/sys/contrib/openzfs/module/os/linux/zfs/abd_os.c index 8a8316f63c48..18f2426fbbfc 100644 --- a/sys/contrib/openzfs/module/os/linux/zfs/abd_os.c +++ b/sys/contrib/openzfs/module/os/linux/zfs/abd_os.c @@ -23,6 +23,7 @@   * Copyright (c) 2014 by Chunwei Chen. All rights reserved.   * Copyright (c) 2019 by Delphix. All rights reserved.   * Copyright (c) 2023, 2024, Klara Inc. + * Copyright (c) 2025, Rob Norris <robn@despairlabs.com>   */  /* @@ -1109,6 +1110,14 @@ abd_return_buf_copy(abd_t *abd, void *buf, size_t n)  #define	ABD_ITER_PAGE_SIZE(page)	(PAGESIZE)  #endif +#ifndef nth_page +/* + * Since 6.18 nth_page() no longer exists, and is no longer required to iterate + * within a single SG entry, so we replace it with a simple addition. + */ +#define	nth_page(p, n)	((p)+(n)) +#endif +  void  abd_iter_page(struct abd_iter *aiter)  { diff --git a/sys/contrib/openzfs/module/os/linux/zfs/zfs_acl.c b/sys/contrib/openzfs/module/os/linux/zfs/zfs_acl.c index daa4b5776837..934d74a112fd 100644 --- a/sys/contrib/openzfs/module/os/linux/zfs/zfs_acl.c +++ b/sys/contrib/openzfs/module/os/linux/zfs/zfs_acl.c @@ -2524,7 +2524,7 @@ zfs_zaccess_common(znode_t *zp, uint32_t v4_mode, uint32_t *working_mode,  	 * Also note: DOS R/O is ignored for directories.  	 */  	if ((v4_mode & WRITE_MASK_DATA) && -	    S_ISDIR(ZTOI(zp)->i_mode) && +	    !S_ISDIR(ZTOI(zp)->i_mode) &&  	    (zp->z_pflags & ZFS_READONLY)) {  		return (SET_ERROR(EPERM));  	} diff --git a/sys/contrib/openzfs/module/os/linux/zfs/zfs_vnops_os.c b/sys/contrib/openzfs/module/os/linux/zfs/zfs_vnops_os.c index 6106726651a3..e845ad69ad78 100644 --- a/sys/contrib/openzfs/module/os/linux/zfs/zfs_vnops_os.c +++ b/sys/contrib/openzfs/module/os/linux/zfs/zfs_vnops_os.c @@ -2033,10 +2033,7 @@ zfs_setattr(znode_t *zp, vattr_t *vap, int flags, cred_t *cr, zidmap_t *mnt_ns)  		goto out3;  	} -	if ((mask & ATTR_SIZE) && (zp->z_pflags & ZFS_READONLY)) { -		err = SET_ERROR(EPERM); -		goto out3; -	} +	/* ZFS_READONLY will be handled in zfs_zaccess() */  	/*  	 * Verify timestamps doesn't overflow 32 bits. diff --git a/sys/contrib/openzfs/module/os/linux/zfs/zpl_file.c b/sys/contrib/openzfs/module/os/linux/zfs/zpl_file.c index d07317b0d910..02965ac8cbee 100644 --- a/sys/contrib/openzfs/module/os/linux/zfs/zpl_file.c +++ b/sys/contrib/openzfs/module/os/linux/zfs/zpl_file.c @@ -23,6 +23,7 @@   * Copyright (c) 2011, Lawrence Livermore National Security, LLC.   * Copyright (c) 2015 by Chunwei Chen. All rights reserved.   * Copyright (c) 2025, Klara, Inc. + * Copyright (c) 2025, Rob Norris <robn@despairlabs.com>   */ @@ -478,6 +479,7 @@ zpl_putpage(struct page *pp, struct writeback_control *wbc, void *data)  	return (ret);  } +#ifdef HAVE_WRITE_CACHE_PAGES  #ifdef HAVE_WRITEPAGE_T_FOLIO  static int  zpl_putfolio(struct folio *pp, struct writeback_control *wbc, void *data) @@ -499,6 +501,78 @@ zpl_write_cache_pages(struct address_space *mapping,  #endif  	return (result);  } +#else +static inline int +zpl_write_cache_pages(struct address_space *mapping, +    struct writeback_control *wbc, void *data) +{ +	pgoff_t start = wbc->range_start >> PAGE_SHIFT; +	pgoff_t end = wbc->range_end >> PAGE_SHIFT; + +	struct folio_batch fbatch; +	folio_batch_init(&fbatch); + +	/* +	 * This atomically (-ish) tags all DIRTY pages in the range with +	 * TOWRITE, allowing users to continue dirtying or undirtying pages +	 * while we get on with writeback, without us treading on each other. +	 */ +	tag_pages_for_writeback(mapping, start, end); + +	int err = 0; +	unsigned int npages; + +	/* +	 * Grab references to the TOWRITE pages just flagged. This may not get +	 * all of them, so we do it in a loop until there are none left. +	 */ +	while ((npages = filemap_get_folios_tag(mapping, &start, end, +	    PAGECACHE_TAG_TOWRITE, &fbatch)) != 0) { + +		/* Loop over each page and write it out. */ +		struct folio *folio; +		while ((folio = folio_batch_next(&fbatch)) != NULL) { +			folio_lock(folio); + +			/* +			 * If the folio has been remapped, or is no longer +			 * dirty, then there's nothing to do. +			 */ +			if (folio->mapping != mapping || +			    !folio_test_dirty(folio)) { +				folio_unlock(folio); +				continue; +			} + +			/* +			 * If writeback is already in progress, wait for it to +			 * finish. We continue after this even if the page +			 * ends up clean; zfs_putpage() will skip it if no +			 * further work is required. +			 */ +			while (folio_test_writeback(folio)) +				folio_wait_bit(folio, PG_writeback); + +			/* +			 * Write it out and collect any error. zfs_putpage() +			 * will clear the TOWRITE and DIRTY flags, and return +			 * with the page unlocked. +			 */ +			int ferr = zpl_putpage(&folio->page, wbc, data); +			if (err == 0 && ferr != 0) +				err = ferr; + +			/* Housekeeping for the caller. */ +			wbc->nr_to_write -= folio_nr_pages(folio); +		} + +		/* Release any remaining references on the batch. */ +		folio_batch_release(&fbatch); +	} + +	return (err); +} +#endif  static int  zpl_writepages(struct address_space *mapping, struct writeback_control *wbc) diff --git a/sys/contrib/openzfs/module/os/linux/zfs/zpl_super.c b/sys/contrib/openzfs/module/os/linux/zfs/zpl_super.c index 444948d03cb3..347b352506e5 100644 --- a/sys/contrib/openzfs/module/os/linux/zfs/zpl_super.c +++ b/sys/contrib/openzfs/module/os/linux/zfs/zpl_super.c @@ -23,6 +23,7 @@   * Copyright (c) 2011, Lawrence Livermore National Security, LLC.   * Copyright (c) 2023, Datto Inc. All rights reserved.   * Copyright (c) 2025, Klara, Inc. + * Copyright (c) 2025, Rob Norris <robn@despairlabs.com>   */ @@ -33,6 +34,7 @@  #include <sys/zpl.h>  #include <linux/iversion.h>  #include <linux/version.h> +#include <linux/vfs_compat.h>  /*   * What to do when the last reference to an inode is released. If 0, the kernel @@ -104,7 +106,7 @@ zpl_dirty_inode(struct inode *ip, int flags)   * reporting memory pressure and requests OpenZFS release some memory (see   * zfs_prune()).   * - * When set to 1, we call generic_delete_node(), which always returns "destroy + * When set to 1, we call generic_delete_inode(), which always returns "destroy   * immediately", resulting in inodes being destroyed immediately, releasing   * their associated dnodes and dbufs to the dbuf cached and the ARC to be   * evicted as normal. diff --git a/sys/contrib/openzfs/module/os/linux/zfs/zvol_os.c b/sys/contrib/openzfs/module/os/linux/zfs/zvol_os.c index 4e66bee7744d..fe939150b641 100644 --- a/sys/contrib/openzfs/module/os/linux/zfs/zvol_os.c +++ b/sys/contrib/openzfs/module/os/linux/zfs/zvol_os.c @@ -21,7 +21,7 @@   */  /*   * Copyright (c) 2012, 2020 by Delphix. All rights reserved. - * Copyright (c) 2024, Rob Norris <robn@despairlabs.com> + * Copyright (c) 2024, 2025, Rob Norris <robn@despairlabs.com>   * Copyright (c) 2024, 2025, Klara, Inc.   */ @@ -1032,12 +1032,12 @@ zvol_os_update_volsize(zvol_state_t *zv, uint64_t volsize)   * tiny devices.  For devices over 1 Mib a standard head and sector count   * is used to keep the cylinders count reasonable.   */ -static int -zvol_getgeo(struct block_device *bdev, struct hd_geometry *geo) +static inline int +zvol_getgeo_impl(struct gendisk *disk, struct hd_geometry *geo)  { +	zvol_state_t *zv = atomic_load_ptr(&disk->private_data);  	sector_t sectors; -	zvol_state_t *zv = atomic_load_ptr(&bdev->bd_disk->private_data);  	ASSERT3P(zv, !=, NULL);  	ASSERT3U(zv->zv_open_count, >, 0); @@ -1057,6 +1057,20 @@ zvol_getgeo(struct block_device *bdev, struct hd_geometry *geo)  	return (0);  } +#ifdef HAVE_BLOCK_DEVICE_OPERATIONS_GETGEO_GENDISK +static int +zvol_getgeo(struct gendisk *disk, struct hd_geometry *geo) +{ +	return (zvol_getgeo_impl(disk, geo)); +} +#else +static int +zvol_getgeo(struct block_device *bdev, struct hd_geometry *geo) +{ +	return (zvol_getgeo_impl(bdev->bd_disk, geo)); +} +#endif +  /*   * Why have two separate block_device_operations structs?   * @@ -1500,7 +1514,7 @@ zvol_os_remove_minor(zvol_state_t *zv)  	if (zso->use_blk_mq)  		blk_mq_free_tag_set(&zso->tag_set); -	ida_simple_remove(&zvol_ida, MINOR(zso->zvo_dev) >> ZVOL_MINOR_BITS); +	ida_free(&zvol_ida, MINOR(zso->zvo_dev) >> ZVOL_MINOR_BITS);  	kmem_free(zso, sizeof (struct zvol_state_os)); @@ -1655,7 +1669,7 @@ zvol_os_create_minor(const char *name)  	if (zvol_inhibit_dev)  		return (0); -	idx = ida_simple_get(&zvol_ida, 0, 0, kmem_flags_convert(KM_SLEEP)); +	idx = ida_alloc(&zvol_ida, kmem_flags_convert(KM_SLEEP));  	if (idx < 0)  		return (SET_ERROR(-idx));  	minor = idx << ZVOL_MINOR_BITS; @@ -1663,7 +1677,7 @@ zvol_os_create_minor(const char *name)  		/* too many partitions can cause an overflow */  		zfs_dbgmsg("zvol: create minor overflow: %s, minor %u/%u",  		    name, minor, MINOR(minor)); -		ida_simple_remove(&zvol_ida, idx); +		ida_free(&zvol_ida, idx);  		return (SET_ERROR(EINVAL));  	} @@ -1671,7 +1685,7 @@ zvol_os_create_minor(const char *name)  	if (zv) {  		ASSERT(MUTEX_HELD(&zv->zv_state_lock));  		mutex_exit(&zv->zv_state_lock); -		ida_simple_remove(&zvol_ida, idx); +		ida_free(&zvol_ida, idx);  		return (SET_ERROR(EEXIST));  	} @@ -1771,7 +1785,7 @@ out_doi:  		rw_exit(&zvol_state_lock);  		error = zvol_os_add_disk(zv->zv_zso->zvo_disk);  	} else { -		ida_simple_remove(&zvol_ida, idx); +		ida_free(&zvol_ida, idx);  	}  	return (error); diff --git a/sys/contrib/openzfs/module/zfs/vdev_removal.c b/sys/contrib/openzfs/module/zfs/vdev_removal.c index 2f7a739da241..abb71543e3ab 100644 --- a/sys/contrib/openzfs/module/zfs/vdev_removal.c +++ b/sys/contrib/openzfs/module/zfs/vdev_removal.c @@ -51,34 +51,70 @@  #include <sys/trace_zfs.h>  /* - * This file contains the necessary logic to remove vdevs from a - * storage pool.  Currently, the only devices that can be removed - * are log, cache, and spare devices; and top level vdevs from a pool - * w/o raidz or mirrors.  (Note that members of a mirror can be removed - * by the detach operation.) + * This file contains the necessary logic to remove vdevs from a storage + * pool. Note that members of a mirror can be removed by the detach + * operation. Currently, the only devices that can be removed are:   * - * Log vdevs are removed by evacuating them and then turning the vdev - * into a hole vdev while holding spa config locks. + * 1) Traditional hot spare and cache vdevs. Note that draid distributed + *    spares are fixed at creation time and cannot be removed.   * - * Top level vdevs are removed and converted into an indirect vdev via - * a multi-step process: + * 2) Log vdevs are removed by evacuating them and then turning the vdev + *    into a hole vdev while holding spa config locks.   * - *  - Disable allocations from this device (spa_vdev_remove_top). + * 3) Top-level singleton and mirror vdevs, including dedup and special + *    vdevs, are removed and converted into an indirect vdev via a + *    multi-step process:   * - *  - From a new thread (spa_vdev_remove_thread), copy data from - *    the removing vdev to a different vdev.  The copy happens in open - *    context (spa_vdev_copy_impl) and issues a sync task - *    (vdev_mapping_sync) so the sync thread can update the partial - *    indirect mappings in core and on disk. + *    - Disable allocations from this device (spa_vdev_remove_top).   * - *  - If a free happens during a removal, it is freed from the - *    removing vdev, and if it has already been copied, from the new - *    location as well (free_from_removing_vdev). + *    - From a new thread (spa_vdev_remove_thread), copy data from the + *      removing vdev to a different vdev. The copy happens in open context + *      (spa_vdev_copy_impl) and issues a sync task (vdev_mapping_sync) so + *      the sync thread can update the partial indirect mappings in core + *      and on disk.   * - *  - After the removal is completed, the copy thread converts the vdev - *    into an indirect vdev (vdev_remove_complete) before instructing - *    the sync thread to destroy the space maps and finish the removal - *    (spa_finish_removal). + *    - If a free happens during a removal, it is freed from the removing + *      vdev, and if it has already been copied, from the new location as + *      well (free_from_removing_vdev). + * + *    - After the removal is completed, the copy thread converts the vdev + *      into an indirect vdev (vdev_remove_complete) before instructing + *      the sync thread to destroy the space maps and finish the removal + *      (spa_finish_removal). + * + *   The following constraints currently apply primary device removal: + * + *     - All vdevs must be online, healthy, and not be missing any data + *       according to the DTLs. + * + *     - When removing a singleton or mirror vdev, regardless of it's a + *       special, dedup, or primary device, it must have the same ashift + *       as the devices in the normal allocation class. Furthermore, all + *       vdevs in the normal allocation class must have the same ashift to + *       ensure the new allocations never includes additional padding. + * + *     - The normal allocation class cannot contain any raidz or draid + *       top-level vdevs since segments are copied without regard for block + *       boundaries. This makes it impossible to calculate the required + *       parity columns when using these vdev types as the destination. + * + *     - The encryption keys must be loaded so the ZIL logs can be reset + *       in order to prevent writing to the device being removed. + * + * N.B. ashift and raidz/draid constraints for primary top-level device + * removal could be slightly relaxed if it were possible to request that + * DVAs from a mirror or singleton in the specified allocation class be + * used (metaslab_alloc_dva). + * + * This flexibility would be particularly useful for raidz/draid pools which + * often include a mirrored special device. If a mistakenly added top-level + * singleton were added it could then still be removed at the cost of some + * special device capacity. This may be a worthwhile tradeoff depending on + * the pool capacity and expense (cost, complexity, time) of creating a new + * pool and copying all of the data to correct the configuration. + * + * Furthermore, while not currently supported it should be possible to allow + * vdevs of any type to be removed as long as they've never been written to.   */  typedef struct vdev_copy_arg { diff --git a/sys/contrib/openzfs/module/zfs/zvol.c b/sys/contrib/openzfs/module/zfs/zvol.c index faced0db7e9e..00f98168d3d8 100644 --- a/sys/contrib/openzfs/module/zfs/zvol.c +++ b/sys/contrib/openzfs/module/zfs/zvol.c @@ -410,7 +410,7 @@ zvol_set_volthreading(const char *name, boolean_t value)  {  	zvol_state_t *zv = zvol_find_by_name(name, RW_NONE);  	if (zv == NULL) -		return (SET_ERROR(ENOENT)); +		return (-1);  	zv->zv_threading = value;  	mutex_exit(&zv->zv_state_lock);  	return (0); diff --git a/sys/contrib/openzfs/scripts/zfs-tests.sh b/sys/contrib/openzfs/scripts/zfs-tests.sh index 5a0a1a609448..09a15bafc27e 100755 --- a/sys/contrib/openzfs/scripts/zfs-tests.sh +++ b/sys/contrib/openzfs/scripts/zfs-tests.sh @@ -797,6 +797,10 @@ msg "${TEST_RUNNER}" \      2>&1; echo $? >"$REPORT_FILE"; } | tee "$RESULTS_FILE"  read -r RUNRESULT <"$REPORT_FILE" +if [[ "$RUNRESULT" -eq "255" ]] ; then +    fail "$TEST_RUNNER failed, test aborted." +fi  +  #  # Analyze the results.  # diff --git a/sys/contrib/openzfs/tests/test-runner/bin/test-runner.py.in b/sys/contrib/openzfs/tests/test-runner/bin/test-runner.py.in index d2c1185e4a94..6688b6c4beb6 100755 --- a/sys/contrib/openzfs/tests/test-runner/bin/test-runner.py.in +++ b/sys/contrib/openzfs/tests/test-runner/bin/test-runner.py.in @@ -25,6 +25,7 @@ import sys  import ctypes  import re  import configparser +import traceback  from datetime import datetime  from optparse import OptionParser @@ -1138,7 +1139,7 @@ def filter_tests(testrun, options):      testrun.filter(failed) -def fail(retstr, ret=1): +def fail(retstr, ret=255):      print('%s: %s' % (sys.argv[0], retstr))      exit(ret) @@ -1247,23 +1248,27 @@ def parse_args():  def main():      options = parse_args() -    testrun = TestRun(options) +    try: +        testrun = TestRun(options) -    if options.runfiles: -        testrun.read(options) -    else: -        find_tests(testrun, options) +        if options.runfiles: +            testrun.read(options) +        else: +            find_tests(testrun, options) + +        if options.logfile: +            filter_tests(testrun, options) -    if options.logfile: -        filter_tests(testrun, options) +        if options.template: +            testrun.write(options) +            exit(0) -    if options.template: -        testrun.write(options) -        exit(0) +        testrun.complete_outputdirs() +        testrun.run(options) +        exit(testrun.summary()) -    testrun.complete_outputdirs() -    testrun.run(options) -    exit(testrun.summary()) +    except Exception: +        fail("Uncaught exception in test runner:\n" + traceback.format_exc())  if __name__ == '__main__': diff --git a/sys/contrib/vchiq/interface/vchiq_arm/vchiq_2835_arm.c b/sys/contrib/vchiq/interface/vchiq_arm/vchiq_2835_arm.c index 0150ce72f0a4..f4aee12dec53 100644 --- a/sys/contrib/vchiq/interface/vchiq_arm/vchiq_2835_arm.c +++ b/sys/contrib/vchiq/interface/vchiq_arm/vchiq_2835_arm.c @@ -204,8 +204,8 @@ vchiq_platform_init(VCHIQ_STATE_T *state)  	bcm_mbox_write(BCM2835_MBOX_CHAN_VCHIQ, (unsigned int)g_slot_phys);  	vchiq_log_info(vchiq_arm_log_level, -		"vchiq_init - done (slots %x, phys %x)", -		(unsigned int)vchiq_slot_zero, g_slot_phys); +		"vchiq_init - done (slots %zx, phys %zx)", +		(size_t)vchiq_slot_zero, g_slot_phys);     vchiq_call_connected_callbacks(); @@ -451,10 +451,7 @@ create_pagelist(char __user *buf, size_t count, unsigned short type,  	}  	vchiq_log_trace(vchiq_arm_log_level, -		"create_pagelist - %x (%d bytes @%p)", (unsigned int)pagelist, count, buf); - -	if (!pagelist) -		return -ENOMEM; +		"create_pagelist - %zx (%zu bytes @%p)", (size_t)pagelist, count, buf);  	addrs = pagelist->addrs;  	pages = (vm_page_t*)(addrs + num_pages); @@ -549,7 +546,7 @@ free_pagelist(BULKINFO_T *bi, int actual)  	pagelist = bi->pagelist;  	vchiq_log_trace(vchiq_arm_log_level, -		"free_pagelist - %x, %d (%lu bytes @%p)", (unsigned int)pagelist, actual, pagelist->length, bi->buf); +		"free_pagelist - %zx, %d (%u bytes @%p)", (size_t)pagelist, actual, pagelist->length, bi->buf);  	num_pages =  		(pagelist->length + pagelist->offset + PAGE_SIZE - 1) / diff --git a/sys/contrib/vchiq/interface/vchiq_arm/vchiq_arm.c b/sys/contrib/vchiq/interface/vchiq_arm/vchiq_arm.c index 763cd9ce9417..e25c4d738922 100644 --- a/sys/contrib/vchiq/interface/vchiq_arm/vchiq_arm.c +++ b/sys/contrib/vchiq/interface/vchiq_arm/vchiq_arm.c @@ -442,8 +442,8 @@ vchiq_ioctl(struct cdev *cdev, u_long cmd, caddr_t arg, int fflag,  #define	_IOC_TYPE(x)	IOCGROUP(x)  	vchiq_log_trace(vchiq_arm_log_level, -		 "vchiq_ioctl - instance %x, cmd %s, arg %p", -		(unsigned int)instance, +		 "vchiq_ioctl - instance %zx, cmd %s, arg %p", +		(size_t)instance,  		((_IOC_TYPE(cmd) == VCHIQ_IOC_MAGIC) &&  		(_IOC_NR(cmd) <= VCHIQ_IOC_MAX)) ?  		ioctl_names[_IOC_NR(cmd)] : "<invalid>", arg); @@ -745,8 +745,8 @@ vchiq_ioctl(struct cdev *cdev, u_long cmd, caddr_t arg, int fflag,  				break;  			}  			vchiq_log_info(vchiq_arm_log_level, -				"found bulk_waiter %x for pid %d", -				(unsigned int)waiter, current->p_pid); +				"found bulk_waiter %zx for pid %d", +				(size_t)waiter, current->p_pid);  			args.userdata = &waiter->bulk_waiter;  		}  		status = vchiq_bulk_transfer @@ -776,8 +776,8 @@ vchiq_ioctl(struct cdev *cdev, u_long cmd, caddr_t arg, int fflag,  			list_add(&waiter->list, &instance->bulk_waiter_list);  			lmutex_unlock(&instance->bulk_waiter_list_mutex);  			vchiq_log_info(vchiq_arm_log_level, -				"saved bulk_waiter %x for pid %d", -				(unsigned int)waiter, current->p_pid); +				"saved bulk_waiter %zx for pid %d", +				(size_t)waiter, current->p_pid);  			memcpy((void *)  				&(((VCHIQ_QUEUE_BULK_TRANSFER_T *) @@ -860,9 +860,9 @@ vchiq_ioctl(struct cdev *cdev, u_long cmd, caddr_t arg, int fflag,  					if (args.msgbufsize < msglen) {  						vchiq_log_error(  							vchiq_arm_log_level, -							"header %x: msgbufsize" +							"header %zx: msgbufsize"  							" %x < msglen %x", -							(unsigned int)header, +							(size_t)header,  							args.msgbufsize,  							msglen);  						WARN(1, "invalid message " @@ -1031,8 +1031,8 @@ vchiq_ioctl(struct cdev *cdev, u_long cmd, caddr_t arg, int fflag,  				ret = -EFAULT;  		} else {  			vchiq_log_error(vchiq_arm_log_level, -				"header %x: bufsize %x < size %x", -				(unsigned int)header, args.bufsize, +				"header %zx: bufsize %x < size %x", +				(size_t)header, args.bufsize,  				header->size);  			WARN(1, "invalid size\n");  			ret = -EMSGSIZE; @@ -1435,9 +1435,9 @@ vchiq_dump_platform_instances(void *dump_context)  			instance = service->instance;  			if (instance && !instance->mark) {  				len = snprintf(buf, sizeof(buf), -					"Instance %x: pid %d,%s completions " +					"Instance %zx: pid %d,%s completions "  						"%d/%d", -					(unsigned int)instance, instance->pid, +					(size_t)instance, instance->pid,  					instance->connected ? " connected, " :  						"",  					instance->completion_insert - @@ -1465,8 +1465,8 @@ vchiq_dump_platform_service_state(void *dump_context, VCHIQ_SERVICE_T *service)  	char buf[80];  	int len; -	len = snprintf(buf, sizeof(buf), "  instance %x", -		(unsigned int)service->instance); +	len = snprintf(buf, sizeof(buf), "  instance %zx", +		(size_t)service->instance);  	if ((service->base.callback == service_callback) &&  		user_service->is_vchi) { diff --git a/sys/contrib/vchiq/interface/vchiq_arm/vchiq_core.c b/sys/contrib/vchiq/interface/vchiq_arm/vchiq_core.c index 2e30dd7dc3de..e7459a5553e4 100644 --- a/sys/contrib/vchiq/interface/vchiq_arm/vchiq_core.c +++ b/sys/contrib/vchiq/interface/vchiq_arm/vchiq_core.c @@ -392,9 +392,9 @@ make_service_callback(VCHIQ_SERVICE_T *service, VCHIQ_REASON_T reason,  	VCHIQ_HEADER_T *header, void *bulk_userdata)  {  	VCHIQ_STATUS_T status; -	vchiq_log_trace(vchiq_core_log_level, "%d: callback:%d (%s, %x, %x)", +	vchiq_log_trace(vchiq_core_log_level, "%d: callback:%d (%s, %p, %p)",  		service->state->id, service->localport, reason_names[reason], -		(unsigned int)header, (unsigned int)bulk_userdata); +		header, bulk_userdata);  	status = service->base.callback(reason, header, service->handle,  		bulk_userdata);  	if (status == VCHIQ_ERROR) { @@ -640,8 +640,8 @@ process_free_queue(VCHIQ_STATE_T *state)  		rmb(); -		vchiq_log_trace(vchiq_core_log_level, "%d: pfq %d=%x %x %x", -			state->id, slot_index, (unsigned int)data, +		vchiq_log_trace(vchiq_core_log_level, "%d: pfq %d=%p %x %x", +			state->id, slot_index, data,  			local->slot_queue_recycle, slot_queue_available);  		/* Initialise the bitmask for services which have used this @@ -675,13 +675,13 @@ process_free_queue(VCHIQ_STATE_T *state)  					vchiq_log_error(vchiq_core_log_level,  						"service %d "  						"message_use_count=%d " -						"(header %x, msgid %x, " +						"(header %p, msgid %x, "  						"header->msgid %x, "  						"header->size %x)",  						port,  						service_quota->  							message_use_count, -						(unsigned int)header, msgid, +						header, msgid,  						header->msgid,  						header->size);  					WARN(1, "invalid message use count\n"); @@ -704,24 +704,24 @@ process_free_queue(VCHIQ_STATE_T *state)  						up(&service_quota->quota_event);  						vchiq_log_trace(  							vchiq_core_log_level, -							"%d: pfq:%d %x@%x - " +							"%d: pfq:%d %x@%p - "  							"slot_use->%d",  							state->id, port,  							header->size, -							(unsigned int)header, +							header,  							count - 1);  					} else {  						vchiq_log_error(  							vchiq_core_log_level,  								"service %d "  								"slot_use_count" -								"=%d (header %x" +								"=%d (header %p"  								", msgid %x, "  								"header->msgid"  								" %x, header->"  								"size %x)",  							port, count, -							(unsigned int)header, +							header,  							msgid,  							header->msgid,  							header->size); @@ -735,9 +735,9 @@ process_free_queue(VCHIQ_STATE_T *state)  			pos += calc_stride(header->size);  			if (pos > VCHIQ_SLOT_SIZE) {  				vchiq_log_error(vchiq_core_log_level, -					"pfq - pos %x: header %x, msgid %x, " +					"pfq - pos %x: header %p, msgid %x, "  					"header->msgid %x, header->size %x", -					pos, (unsigned int)header, msgid, +					pos, header, msgid,  					header->msgid, header->size);  				WARN(1, "invalid slot position\n");  			} @@ -885,17 +885,16 @@ queue_message(VCHIQ_STATE_T *state, VCHIQ_SERVICE_T *service,  		int slot_use_count;  		vchiq_log_info(vchiq_core_log_level, -			"%d: qm %s@%x,%x (%d->%d)", +			"%d: qm %s@%p,%x (%d->%d)",  			state->id,  			msg_type_str(VCHIQ_MSG_TYPE(msgid)), -			(unsigned int)header, size, +			header, size,  			VCHIQ_MSG_SRCPORT(msgid),  			VCHIQ_MSG_DSTPORT(msgid));  		BUG_ON(!service);  		BUG_ON((flags & (QMFLAGS_NO_MUTEX_LOCK |  				 QMFLAGS_NO_MUTEX_UNLOCK)) != 0); -  		for (i = 0, pos = 0; i < (unsigned int)count;  			pos += elements[i++].size)  			if (elements[i].size) { @@ -951,9 +950,9 @@ queue_message(VCHIQ_STATE_T *state, VCHIQ_SERVICE_T *service,  		VCHIQ_SERVICE_STATS_ADD(service, ctrl_tx_bytes, size);  	} else {  		vchiq_log_info(vchiq_core_log_level, -			"%d: qm %s@%x,%x (%d->%d)", state->id, +			"%d: qm %s@%p,%x (%d->%d)", state->id,  			msg_type_str(VCHIQ_MSG_TYPE(msgid)), -			(unsigned int)header, size, +			header, size,  			VCHIQ_MSG_SRCPORT(msgid),  			VCHIQ_MSG_DSTPORT(msgid));  		if (size != 0) { @@ -1036,9 +1035,9 @@ queue_message_sync(VCHIQ_STATE_T *state, VCHIQ_SERVICE_T *service,  		int i, pos;  		vchiq_log_info(vchiq_sync_log_level, -			"%d: qms %s@%x,%x (%d->%d)", state->id, +			"%d: qms %s@%p,%x (%d->%d)", state->id,  			msg_type_str(VCHIQ_MSG_TYPE(msgid)), -			(unsigned int)header, size, +			header, size,  			VCHIQ_MSG_SRCPORT(msgid),  			VCHIQ_MSG_DSTPORT(msgid)); @@ -1065,9 +1064,9 @@ queue_message_sync(VCHIQ_STATE_T *state, VCHIQ_SERVICE_T *service,  		VCHIQ_SERVICE_STATS_ADD(service, ctrl_tx_bytes, size);  	} else {  		vchiq_log_info(vchiq_sync_log_level, -			"%d: qms %s@%x,%x (%d->%d)", state->id, +			"%d: qms %s@%p,%x (%d->%d)", state->id,  			msg_type_str(VCHIQ_MSG_TYPE(msgid)), -			(unsigned int)header, size, +			header, size,  			VCHIQ_MSG_SRCPORT(msgid),  			VCHIQ_MSG_DSTPORT(msgid));  		if (size != 0) { @@ -1368,26 +1367,26 @@ resolve_bulks(VCHIQ_SERVICE_T *service, VCHIQ_BULK_QUEUE_T *queue)  				"Send Bulk to" : "Recv Bulk from";  			if (bulk->actual != VCHIQ_BULK_ACTUAL_ABORTED)  				vchiq_log_info(SRVTRACE_LEVEL(service), -					"%s %c%c%c%c d:%d len:%d %x<->%x", +					"%s %c%c%c%c d:%d len:%d %p<->%p",  					header,  					VCHIQ_FOURCC_AS_4CHARS(  						service->base.fourcc),  					service->remoteport,  					bulk->size, -					(unsigned int)bulk->data, -					(unsigned int)bulk->remote_data); +					bulk->data, +					bulk->remote_data);  			else  				vchiq_log_info(SRVTRACE_LEVEL(service),  					"%s %c%c%c%c d:%d ABORTED - tx len:%d," -					" rx len:%d %x<->%x", +					" rx len:%d %p<->%p",  					header,  					VCHIQ_FOURCC_AS_4CHARS(  						service->base.fourcc),  					service->remoteport,  					bulk->size,  					bulk->remote_size, -					(unsigned int)bulk->data, -					(unsigned int)bulk->remote_data); +					bulk->data, +					bulk->remote_data);  		}  		vchiq_complete_bulk(bulk); @@ -1522,8 +1521,8 @@ parse_open(VCHIQ_STATE_T *state, VCHIQ_HEADER_T *header)  		fourcc = payload->fourcc;  		vchiq_log_info(vchiq_core_log_level, -			"%d: prs OPEN@%x (%d->'%c%c%c%c')", -			state->id, (unsigned int)header, +			"%d: prs OPEN@%p (%d->'%c%c%c%c')", +			state->id, header,  			localport,  			VCHIQ_FOURCC_AS_4CHARS(fourcc)); @@ -1661,7 +1660,7 @@ parse_rx_slots(VCHIQ_STATE_T *state)  		header = (VCHIQ_HEADER_T *)(state->rx_data +  			(state->rx_pos & VCHIQ_SLOT_MASK)); -		DEBUG_VALUE(PARSE_HEADER, (int)header); +		DEBUG_VALUE(PARSE_HEADER, (size_t)header);  		msgid = header->msgid;  		DEBUG_VALUE(PARSE_MSGID, msgid);  		size = header->size; @@ -1695,20 +1694,20 @@ parse_rx_slots(VCHIQ_STATE_T *state)  					remoteport);  				if (service)  					vchiq_log_warning(vchiq_core_log_level, -						"%d: prs %s@%x (%d->%d) - " +						"%d: prs %s@%p (%d->%d) - "  						"found connected service %d",  						state->id, msg_type_str(type), -						(unsigned int)header, +						header,  						remoteport, localport,  						service->localport);  			}  			if (!service) {  				vchiq_log_error(vchiq_core_log_level, -					"%d: prs %s@%x (%d->%d) - " +					"%d: prs %s@%p (%d->%d) - " /* XXX */  					"invalid/closed service %d",  					state->id, msg_type_str(type), -					(unsigned int)header, +					header,  					remoteport, localport, localport);  				goto skip_message;  			} @@ -1734,12 +1733,12 @@ parse_rx_slots(VCHIQ_STATE_T *state)  					min(16, size));  		} -		if (((unsigned int)header & VCHIQ_SLOT_MASK) + calc_stride(size) +		if (((size_t)header & VCHIQ_SLOT_MASK) + calc_stride(size)  			> VCHIQ_SLOT_SIZE) {  			vchiq_log_error(vchiq_core_log_level, -				"header %x (msgid %x) - size %x too big for " +				"header %p (msgid %x) - size %x too big for "  				"slot", -				(unsigned int)header, (unsigned int)msgid, +				header, (unsigned int)msgid,  				(unsigned int)size);  			WARN(1, "oversized for slot\n");  		} @@ -1758,8 +1757,8 @@ parse_rx_slots(VCHIQ_STATE_T *state)  				service->peer_version = payload->version;  			}  			vchiq_log_info(vchiq_core_log_level, -				"%d: prs OPENACK@%x,%x (%d->%d) v:%d", -				state->id, (unsigned int)header, size, +				"%d: prs OPENACK@%p,%x (%d->%d) v:%d", +				state->id, header, size,  				remoteport, localport, service->peer_version);  			if (service->srvstate ==  				VCHIQ_SRVSTATE_OPENING) { @@ -1776,8 +1775,8 @@ parse_rx_slots(VCHIQ_STATE_T *state)  			WARN_ON(size != 0); /* There should be no data */  			vchiq_log_info(vchiq_core_log_level, -				"%d: prs CLOSE@%x (%d->%d)", -				state->id, (unsigned int)header, +				"%d: prs CLOSE@%p (%d->%d)", +				state->id, header,  				remoteport, localport);  			mark_service_closing_internal(service, 1); @@ -1794,8 +1793,8 @@ parse_rx_slots(VCHIQ_STATE_T *state)  			break;  		case VCHIQ_MSG_DATA:  			vchiq_log_info(vchiq_core_log_level, -				"%d: prs DATA@%x,%x (%d->%d)", -				state->id, (unsigned int)header, size, +				"%d: prs DATA@%p,%x (%d->%d)", +				state->id, header, size,  				remoteport, localport);  			if ((service->remoteport == remoteport) @@ -1819,8 +1818,8 @@ parse_rx_slots(VCHIQ_STATE_T *state)  			break;  		case VCHIQ_MSG_CONNECT:  			vchiq_log_info(vchiq_core_log_level, -				"%d: prs CONNECT@%x", -				state->id, (unsigned int)header); +				"%d: prs CONNECT@%p", +				state->id, header);  			state->version_common = ((VCHIQ_SLOT_ZERO_T *)  						 state->slot_data)->version;  			up(&state->connect); @@ -1854,12 +1853,12 @@ parse_rx_slots(VCHIQ_STATE_T *state)  				wmb();  				vchiq_log_info(vchiq_core_log_level, -					"%d: prs %s@%x (%d->%d) %x@%x", +					"%d: prs %s@%p (%d->%d) %x@%p",  					state->id, msg_type_str(type), -					(unsigned int)header, +					header,  					remoteport, localport,  					bulk->remote_size, -					(unsigned int)bulk->remote_data); +					bulk->remote_data);  				queue->remote_insert++; @@ -1912,10 +1911,10 @@ parse_rx_slots(VCHIQ_STATE_T *state)  				if ((int)(queue->remote_insert -  					queue->local_insert) >= 0) {  					vchiq_log_error(vchiq_core_log_level, -						"%d: prs %s@%x (%d->%d) " +						"%d: prs %s@%p (%d->%d) "  						"unexpected (ri=%d,li=%d)",  						state->id, msg_type_str(type), -						(unsigned int)header, +						header,  						remoteport, localport,  						queue->remote_insert,  						queue->local_insert); @@ -1932,11 +1931,11 @@ parse_rx_slots(VCHIQ_STATE_T *state)  				queue->remote_insert++;  				vchiq_log_info(vchiq_core_log_level, -					"%d: prs %s@%x (%d->%d) %x@%x", +					"%d: prs %s@%p (%d->%d) %x@%p",  					state->id, msg_type_str(type), -					(unsigned int)header, +					header,  					remoteport, localport, -					bulk->actual, (unsigned int)bulk->data); +					bulk->actual, bulk->data);  				vchiq_log_trace(vchiq_core_log_level,  					"%d: prs:%d %cx li=%x ri=%x p=%x", @@ -1958,14 +1957,14 @@ parse_rx_slots(VCHIQ_STATE_T *state)  			break;  		case VCHIQ_MSG_PADDING:  			vchiq_log_trace(vchiq_core_log_level, -				"%d: prs PADDING@%x,%x", -				state->id, (unsigned int)header, size); +				"%d: prs PADDING@%p,%x", +				state->id, header, size);  			break;  		case VCHIQ_MSG_PAUSE:  			/* If initiated, signal the application thread */  			vchiq_log_trace(vchiq_core_log_level, -				"%d: prs PAUSE@%x,%x", -				state->id, (unsigned int)header, size); +				"%d: prs PAUSE@%p,%x", +				state->id, header, size);  			if (state->conn_state == VCHIQ_CONNSTATE_PAUSED) {  				vchiq_log_error(vchiq_core_log_level,  					"%d: PAUSE received in state PAUSED", @@ -1988,8 +1987,8 @@ parse_rx_slots(VCHIQ_STATE_T *state)  			break;  		case VCHIQ_MSG_RESUME:  			vchiq_log_trace(vchiq_core_log_level, -				"%d: prs RESUME@%x,%x", -				state->id, (unsigned int)header, size); +				"%d: prs RESUME@%p,%x", +				state->id, header, size);  			/* Release the slot mutex */  			lmutex_unlock(&state->slot_mutex);  			if (state->is_master) @@ -2010,8 +2009,8 @@ parse_rx_slots(VCHIQ_STATE_T *state)  		default:  			vchiq_log_error(vchiq_core_log_level, -				"%d: prs invalid msgid %x@%x,%x", -				state->id, msgid, (unsigned int)header, size); +				"%d: prs invalid msgid %x@%p,%x", +				state->id, msgid, header, size);  			WARN(1, "invalid message\n");  			break;  		} @@ -2179,10 +2178,10 @@ sync_func(void *v)  		if (!service) {  			vchiq_log_error(vchiq_sync_log_level, -				"%d: sf %s@%x (%d->%d) - " +				"%d: sf %s@%p (%d->%d) - "  				"invalid/closed service %d",  				state->id, msg_type_str(type), -				(unsigned int)header, +				header,  				remoteport, localport, localport);  			release_message_sync(state, header);  			continue; @@ -2213,8 +2212,8 @@ sync_func(void *v)  				service->peer_version = payload->version;  			}  			vchiq_log_info(vchiq_sync_log_level, -				"%d: sf OPENACK@%x,%x (%d->%d) v:%d", -				state->id, (unsigned int)header, size, +				"%d: sf OPENACK@%p,%x (%d->%d) v:%d", +				state->id, header, size,  				remoteport, localport, service->peer_version);  			if (service->srvstate == VCHIQ_SRVSTATE_OPENING) {  				service->remoteport = remoteport; @@ -2228,8 +2227,8 @@ sync_func(void *v)  		case VCHIQ_MSG_DATA:  			vchiq_log_trace(vchiq_sync_log_level, -				"%d: sf DATA@%x,%x (%d->%d)", -				state->id, (unsigned int)header, size, +				"%d: sf DATA@%p,%x (%d->%d)", +				state->id, header, size,  				remoteport, localport);  			if ((service->remoteport == remoteport) && @@ -2248,8 +2247,8 @@ sync_func(void *v)  		default:  			vchiq_log_error(vchiq_sync_log_level, -				"%d: sf unexpected msgid %x@%x,%x", -				state->id, msgid, (unsigned int)header, size); +				"%d: sf unexpected msgid %x@%p,%x", +				state->id, msgid, header, size);  			release_message_sync(state, header);  			break;  		} @@ -2334,8 +2333,8 @@ vchiq_init_state(VCHIQ_STATE_T *state, VCHIQ_SLOT_ZERO_T *slot_zero,  	if (slot_zero->magic != VCHIQ_MAGIC) {  		vchiq_loud_error_header();  		vchiq_loud_error("Invalid VCHIQ magic value found."); -		vchiq_loud_error("slot_zero=%x: magic=%x (expected %x)", -			(unsigned int)slot_zero, slot_zero->magic, VCHIQ_MAGIC); +		vchiq_loud_error("slot_zero=%p: magic=%x (expected %x)", +			slot_zero, slot_zero->magic, VCHIQ_MAGIC);  		vchiq_loud_error_footer();  		return VCHIQ_ERROR;  	} @@ -2348,9 +2347,9 @@ vchiq_init_state(VCHIQ_STATE_T *state, VCHIQ_SLOT_ZERO_T *slot_zero,  	if (slot_zero->version < VCHIQ_VERSION_MIN) {  		vchiq_loud_error_header();  		vchiq_loud_error("Incompatible VCHIQ versions found."); -		vchiq_loud_error("slot_zero=%x: VideoCore version=%d " +		vchiq_loud_error("slot_zero=%p: VideoCore version=%d "  			"(minimum %d)", -			(unsigned int)slot_zero, slot_zero->version, +			slot_zero, slot_zero->version,  			VCHIQ_VERSION_MIN);  		vchiq_loud_error("Restart with a newer VideoCore image.");  		vchiq_loud_error_footer(); @@ -2360,9 +2359,9 @@ vchiq_init_state(VCHIQ_STATE_T *state, VCHIQ_SLOT_ZERO_T *slot_zero,  	if (VCHIQ_VERSION < slot_zero->version_min) {  		vchiq_loud_error_header();  		vchiq_loud_error("Incompatible VCHIQ versions found."); -		vchiq_loud_error("slot_zero=%x: version=%d (VideoCore " +		vchiq_loud_error("slot_zero=%p: version=%d (VideoCore "  			"minimum %d)", -			(unsigned int)slot_zero, VCHIQ_VERSION, +			slot_zero, VCHIQ_VERSION,  			slot_zero->version_min);  		vchiq_loud_error("Restart with a newer kernel.");  		vchiq_loud_error_footer(); @@ -2375,25 +2374,25 @@ vchiq_init_state(VCHIQ_STATE_T *state, VCHIQ_SLOT_ZERO_T *slot_zero,  		 (slot_zero->max_slots_per_side != VCHIQ_MAX_SLOTS_PER_SIDE)) {  		vchiq_loud_error_header();  		if (slot_zero->slot_zero_size != sizeof(VCHIQ_SLOT_ZERO_T)) -			vchiq_loud_error("slot_zero=%x: slot_zero_size=%x " +			vchiq_loud_error("slot_zero=%p: slot_zero_size=%x "  				"(expected %zx)", -				(unsigned int)slot_zero, +				slot_zero,  				slot_zero->slot_zero_size,  				sizeof(VCHIQ_SLOT_ZERO_T));  		if (slot_zero->slot_size != VCHIQ_SLOT_SIZE) -			vchiq_loud_error("slot_zero=%x: slot_size=%d " +			vchiq_loud_error("slot_zero=%p: slot_size=%d "  				"(expected %d", -				(unsigned int)slot_zero, slot_zero->slot_size, +				slot_zero, slot_zero->slot_size,  				VCHIQ_SLOT_SIZE);  		if (slot_zero->max_slots != VCHIQ_MAX_SLOTS) -			vchiq_loud_error("slot_zero=%x: max_slots=%d " +			vchiq_loud_error("slot_zero=%p: max_slots=%d "  				"(expected %d)", -				(unsigned int)slot_zero, slot_zero->max_slots, +				slot_zero, slot_zero->max_slots,  				VCHIQ_MAX_SLOTS);  		if (slot_zero->max_slots_per_side != VCHIQ_MAX_SLOTS_PER_SIDE) -			vchiq_loud_error("slot_zero=%x: max_slots_per_side=%d " +			vchiq_loud_error("slot_zero=%p: max_slots_per_side=%d "  				"(expected %d)", -				(unsigned int)slot_zero, +				slot_zero,  				slot_zero->max_slots_per_side,  				VCHIQ_MAX_SLOTS_PER_SIDE);  		vchiq_loud_error_footer(); @@ -2775,18 +2774,18 @@ release_service_messages(VCHIQ_SERVICE_T *service)  				if ((port == service->localport) &&  					(msgid & VCHIQ_MSGID_CLAIMED)) {  					vchiq_log_info(vchiq_core_log_level, -						"  fsi - hdr %x", -						(unsigned int)header); +						"  fsi - hdr %p", +						header);  					release_slot(state, slot_info, header,  						NULL);  				}  				pos += calc_stride(header->size);  				if (pos > VCHIQ_SLOT_SIZE) {  					vchiq_log_error(vchiq_core_log_level, -						"fsi - pos %x: header %x, " +						"fsi - pos %x: header %p, "  						"msgid %x, header->msgid %x, "  						"header->size %x", -						pos, (unsigned int)header, +						pos, header,  						msgid, header->msgid,  						header->size);  					WARN(1, "invalid slot position\n"); @@ -3360,10 +3359,10 @@ vchiq_bulk_transfer(VCHIQ_SERVICE_HANDLE_T handle,  	wmb();  	vchiq_log_info(vchiq_core_log_level, -		"%d: bt (%d->%d) %cx %x@%x %x", +		"%d: bt (%d->%d) %cx %x@%p %p",  		state->id,  		service->localport, service->remoteport, dir_char, -		size, (unsigned int)bulk->data, (unsigned int)userdata); +		size, bulk->data, userdata);  	/* The slot mutex must be held when the service is being closed, so  	   claim it here to ensure that isn't happening */ @@ -3710,12 +3709,12 @@ vchiq_dump_state(void *dump_context, VCHIQ_STATE_T *state)  	vchiq_dump(dump_context, buf, len + 1);  	len = snprintf(buf, sizeof(buf), -		"  tx_pos=%x(@%x), rx_pos=%x(@%x)", +		"  tx_pos=%x(@%p), rx_pos=%x(@%p)",  		state->local->tx_pos, -		(uint32_t)state->tx_data + +		state->tx_data +  			(state->local_tx_pos & VCHIQ_SLOT_MASK),  		state->rx_pos, -		(uint32_t)state->rx_data + +		state->rx_data +  			(state->rx_pos & VCHIQ_SLOT_MASK));  	vchiq_dump(dump_context, buf, len + 1); @@ -3817,21 +3816,21 @@ vchiq_dump_service_state(void *dump_context, VCHIQ_SERVICE_T *service)  			vchiq_dump(dump_context, buf, len + 1);  			len = snprintf(buf, sizeof(buf), -				"  Ctrl: tx_count=%d, tx_bytes=%llu, " -				"rx_count=%d, rx_bytes=%llu", +				"  Ctrl: tx_count=%d, tx_bytes=%ju, " +				"rx_count=%d, rx_bytes=%ju",  				service->stats.ctrl_tx_count, -				service->stats.ctrl_tx_bytes, +				(uintmax_t) service->stats.ctrl_tx_bytes,  				service->stats.ctrl_rx_count, -				service->stats.ctrl_rx_bytes); +				(uintmax_t) service->stats.ctrl_rx_bytes);  			vchiq_dump(dump_context, buf, len + 1);  			len = snprintf(buf, sizeof(buf), -				"  Bulk: tx_count=%d, tx_bytes=%llu, " -				"rx_count=%d, rx_bytes=%llu", +				"  Bulk: tx_count=%d, tx_bytes=%ju, " +				"rx_count=%d, rx_bytes=%ju",  				service->stats.bulk_tx_count, -				service->stats.bulk_tx_bytes, +				(uintmax_t) service->stats.bulk_tx_bytes,  				service->stats.bulk_rx_count, -				service->stats.bulk_rx_bytes); +				(uintmax_t) service->stats.bulk_rx_bytes);  			vchiq_dump(dump_context, buf, len + 1);  			len = snprintf(buf, sizeof(buf), diff --git a/sys/contrib/vchiq/interface/vchiq_arm/vchiq_kern_lib.c b/sys/contrib/vchiq/interface/vchiq_arm/vchiq_kern_lib.c index 1f849a09d854..4eddcf3b43b2 100644 --- a/sys/contrib/vchiq/interface/vchiq_arm/vchiq_kern_lib.c +++ b/sys/contrib/vchiq/interface/vchiq_arm/vchiq_kern_lib.c @@ -151,9 +151,9 @@ VCHIQ_STATUS_T vchiq_shutdown(VCHIQ_INSTANCE_T instance)  					list);  			list_del(pos);  			vchiq_log_info(vchiq_arm_log_level, -					"bulk_waiter - cleaned up %x " +					"bulk_waiter - cleaned up %p "  					"for pid %d", -					(unsigned int)waiter, waiter->pid); +					waiter, waiter->pid);  			_sema_destroy(&waiter->bulk_waiter.event);  			kfree(waiter); @@ -454,8 +454,8 @@ vchiq_blocking_bulk_transfer(VCHIQ_SERVICE_HANDLE_T handle, void *data,  		list_add(&waiter->list, &instance->bulk_waiter_list);  		lmutex_unlock(&instance->bulk_waiter_list_mutex);  		vchiq_log_info(vchiq_arm_log_level, -				"saved bulk_waiter %x for pid %d", -				(unsigned int)waiter, current->p_pid); +				"saved bulk_waiter %p for pid %d", +				waiter, current->p_pid);  	}  	return status; | 
