Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'nfsd-5.18' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux

Pull nfsd updates from Chuck Lever:
"New features:

- NFSv3 support in NFSD is now always built

- Added NFSD support for the NFSv4 birth-time file attribute

- Added support for storing and displaying sockaddrs in trace points

- NFSD now recognizes RPC_AUTH_TLS probes

Performance improvements:

- Optimized the svc transport enqueuing mechanism

- Added micro-optimizations for the duplicate reply cache

Notable bug fixes:

- Allocation of the NFSD file cache hash table is more reliable"

* tag 'nfsd-5.18' of git://git.kernel.org/pub/scm/linux/kernel/git/cel/linux: (30 commits)
nfsd: fix using the correct variable for sizeof()
nfsd: use correct format characters
NFSD: prevent integer overflow on 32 bit systems
NFSD: prevent underflow in nfssvc_decode_writeargs()
fs/lock: documentation cleanup. Replace inode->i_lock with flc_lock.
NFSD: Fix nfsd_breaker_owns_lease() return values
NFSD: Clean up _lm_ operation names
arch: Remove references to CONFIG_NFSD_V3 in the default configs
NFSD: Remove CONFIG_NFSD_V3
nfsd: more robust allocation failure handling in nfsd_file_cache_init
SUNRPC: Teach server to recognize RPC_AUTH_TLS
NFSD: Move svc_serv_ops::svo_function into struct svc_serv
NFSD: Remove svc_serv_ops::svo_module
SUNRPC: Remove svc_shutdown_net()
SUNRPC: Rename svc_close_xprt()
SUNRPC: Rename svc_create_xprt()
SUNRPC: Remove svo_shutdown method
SUNRPC: Merge svc_do_enqueue_xprt() into svc_enqueue_xprt()
SUNRPC: Remove the .svo_enqueue_xprt method
SUNRPC: Record endpoint information in trace log
...

+512 -450
+3 -3
Documentation/filesystems/locking.rst
··· 438 438 locking rules: 439 439 440 440 ====================== ============= ================= ========= 441 - ops inode->i_lock blocked_lock_lock may block 441 + ops flc_lock blocked_lock_lock may block 442 442 ====================== ============= ================= ========= 443 - lm_notify: yes yes no 443 + lm_notify: no yes no 444 444 lm_grant: no no no 445 445 lm_break: yes no no 446 446 lm_change yes no no 447 - lm_breaker_owns_lease: no no no 447 + lm_breaker_owns_lease: yes no no 448 448 ====================== ============= ================= ========= 449 449 450 450 buffer_head
-1
arch/alpha/configs/defconfig
··· 62 62 CONFIG_NFS_FS=m 63 63 CONFIG_NFS_V3=y 64 64 CONFIG_NFSD=m 65 - CONFIG_NFSD_V3=y 66 65 CONFIG_NLS_CODEPAGE_437=y 67 66 CONFIG_MAGIC_SYSRQ=y 68 67 CONFIG_DEBUG_KERNEL=y
-1
arch/arm/configs/davinci_all_defconfig
··· 258 258 CONFIG_NFS_FS=y 259 259 CONFIG_ROOT_NFS=y 260 260 CONFIG_NFSD=m 261 - CONFIG_NFSD_V3=y 262 261 CONFIG_NLS_CODEPAGE_437=y 263 262 CONFIG_NLS_ASCII=m 264 263 CONFIG_NLS_ISO8859_1=y
-1
arch/arm/configs/ezx_defconfig
··· 309 309 CONFIG_NFS_V3=y 310 310 CONFIG_NFS_V3_ACL=y 311 311 CONFIG_NFSD=m 312 - CONFIG_NFSD_V3=y 313 312 CONFIG_NFSD_V3_ACL=y 314 313 CONFIG_SMB_FS=m 315 314 CONFIG_CIFS=m
-1
arch/arm/configs/imote2_defconfig
··· 283 283 CONFIG_NFS_V3=y 284 284 CONFIG_NFS_V3_ACL=y 285 285 CONFIG_NFSD=m 286 - CONFIG_NFSD_V3=y 287 286 CONFIG_NFSD_V3_ACL=y 288 287 CONFIG_SMB_FS=m 289 288 CONFIG_CIFS=m
-1
arch/arm/configs/integrator_defconfig
··· 79 79 CONFIG_NFS_FS=y 80 80 CONFIG_ROOT_NFS=y 81 81 CONFIG_NFSD=y 82 - CONFIG_NFSD_V3=y 83 82 CONFIG_NLS_CODEPAGE_437=y 84 83 CONFIG_NLS_ISO8859_1=y 85 84 CONFIG_MAGIC_SYSRQ=y
-1
arch/arm/configs/iop32x_defconfig
··· 94 94 CONFIG_NFS_V3=y 95 95 CONFIG_ROOT_NFS=y 96 96 CONFIG_NFSD=y 97 - CONFIG_NFSD_V3=y 98 97 CONFIG_PARTITION_ADVANCED=y 99 98 CONFIG_MAGIC_SYSRQ=y 100 99 CONFIG_DEBUG_KERNEL=y
-1
arch/arm/configs/keystone_defconfig
··· 213 213 CONFIG_NFS_V3_ACL=y 214 214 CONFIG_ROOT_NFS=y 215 215 CONFIG_NFSD=y 216 - CONFIG_NFSD_V3=y 217 216 CONFIG_NFSD_V3_ACL=y 218 217 CONFIG_NLS_CODEPAGE_437=y 219 218 CONFIG_NLS_ISO8859_1=y
-1
arch/arm/configs/lart_defconfig
··· 59 59 CONFIG_NFS_FS=m 60 60 CONFIG_NFS_V3=y 61 61 CONFIG_NFSD=m 62 - CONFIG_NFSD_V3=y 63 62 CONFIG_NLS=y 64 63 CONFIG_NLS_CODEPAGE_437=m 65 64 CONFIG_NLS_CODEPAGE_850=m
-1
arch/arm/configs/netwinder_defconfig
··· 71 71 CONFIG_NFS_V4=y 72 72 CONFIG_ROOT_NFS=y 73 73 CONFIG_NFSD=y 74 - CONFIG_NFSD_V3=y 75 74 CONFIG_SMB_FS=y 76 75 CONFIG_PARTITION_ADVANCED=y 77 76 CONFIG_NLS_CODEPAGE_437=y
-1
arch/arm/configs/versatile_defconfig
··· 86 86 CONFIG_NFS_FS=y 87 87 CONFIG_ROOT_NFS=y 88 88 CONFIG_NFSD=y 89 - CONFIG_NFSD_V3=y 90 89 CONFIG_NLS_CODEPAGE_850=m 91 90 CONFIG_NLS_ISO8859_1=m 92 91 CONFIG_MAGIC_SYSRQ=y
-1
arch/arm/configs/viper_defconfig
··· 145 145 CONFIG_NFS_V3=y 146 146 CONFIG_ROOT_NFS=y 147 147 CONFIG_NFSD=m 148 - CONFIG_NFSD_V3=y 149 148 CONFIG_PARTITION_ADVANCED=y 150 149 CONFIG_NLS_CODEPAGE_437=m 151 150 CONFIG_NLS_CODEPAGE_850=m
-1
arch/arm/configs/zeus_defconfig
··· 160 160 CONFIG_NFS_V3=y 161 161 CONFIG_ROOT_NFS=y 162 162 CONFIG_NFSD=m 163 - CONFIG_NFSD_V3=y 164 163 CONFIG_PARTITION_ADVANCED=y 165 164 CONFIG_NLS_CODEPAGE_437=m 166 165 CONFIG_NLS_CODEPAGE_850=m
-1
arch/ia64/configs/zx1_defconfig
··· 106 106 CONFIG_NFS_FS=y 107 107 CONFIG_NFS_V4=y 108 108 CONFIG_NFSD=y 109 - CONFIG_NFSD_V3=y 110 109 CONFIG_NLS_CODEPAGE_437=y 111 110 CONFIG_NLS_CODEPAGE_737=y 112 111 CONFIG_NLS_CODEPAGE_775=y
-1
arch/m68k/configs/amiga_defconfig
··· 498 498 CONFIG_NFS_SWAP=y 499 499 CONFIG_ROOT_NFS=y 500 500 CONFIG_NFSD=m 501 - CONFIG_NFSD_V3=y 502 501 CONFIG_CIFS=m 503 502 # CONFIG_CIFS_STATS2 is not set 504 503 # CONFIG_CIFS_DEBUG is not set
-1
arch/m68k/configs/apollo_defconfig
··· 455 455 CONFIG_NFS_SWAP=y 456 456 CONFIG_ROOT_NFS=y 457 457 CONFIG_NFSD=m 458 - CONFIG_NFSD_V3=y 459 458 CONFIG_CIFS=m 460 459 # CONFIG_CIFS_STATS2 is not set 461 460 # CONFIG_CIFS_DEBUG is not set
-1
arch/m68k/configs/atari_defconfig
··· 475 475 CONFIG_NFS_SWAP=y 476 476 CONFIG_ROOT_NFS=y 477 477 CONFIG_NFSD=m 478 - CONFIG_NFSD_V3=y 479 478 CONFIG_CIFS=m 480 479 # CONFIG_CIFS_STATS2 is not set 481 480 # CONFIG_CIFS_DEBUG is not set
-1
arch/m68k/configs/bvme6000_defconfig
··· 447 447 CONFIG_NFS_SWAP=y 448 448 CONFIG_ROOT_NFS=y 449 449 CONFIG_NFSD=m 450 - CONFIG_NFSD_V3=y 451 450 CONFIG_CIFS=m 452 451 # CONFIG_CIFS_STATS2 is not set 453 452 # CONFIG_CIFS_DEBUG is not set
-1
arch/m68k/configs/hp300_defconfig
··· 457 457 CONFIG_NFS_SWAP=y 458 458 CONFIG_ROOT_NFS=y 459 459 CONFIG_NFSD=m 460 - CONFIG_NFSD_V3=y 461 460 CONFIG_CIFS=m 462 461 # CONFIG_CIFS_STATS2 is not set 463 462 # CONFIG_CIFS_DEBUG is not set
-1
arch/m68k/configs/mac_defconfig
··· 477 477 CONFIG_NFS_SWAP=y 478 478 CONFIG_ROOT_NFS=y 479 479 CONFIG_NFSD=m 480 - CONFIG_NFSD_V3=y 481 480 CONFIG_CIFS=m 482 481 # CONFIG_CIFS_STATS2 is not set 483 482 # CONFIG_CIFS_DEBUG is not set
-1
arch/m68k/configs/multi_defconfig
··· 563 563 CONFIG_NFS_SWAP=y 564 564 CONFIG_ROOT_NFS=y 565 565 CONFIG_NFSD=m 566 - CONFIG_NFSD_V3=y 567 566 CONFIG_CIFS=m 568 567 # CONFIG_CIFS_STATS2 is not set 569 568 # CONFIG_CIFS_DEBUG is not set
-1
arch/m68k/configs/mvme147_defconfig
··· 446 446 CONFIG_NFS_SWAP=y 447 447 CONFIG_ROOT_NFS=y 448 448 CONFIG_NFSD=m 449 - CONFIG_NFSD_V3=y 450 449 CONFIG_CIFS=m 451 450 # CONFIG_CIFS_STATS2 is not set 452 451 # CONFIG_CIFS_DEBUG is not set
-1
arch/m68k/configs/mvme16x_defconfig
··· 447 447 CONFIG_NFS_SWAP=y 448 448 CONFIG_ROOT_NFS=y 449 449 CONFIG_NFSD=m 450 - CONFIG_NFSD_V3=y 451 450 CONFIG_CIFS=m 452 451 # CONFIG_CIFS_STATS2 is not set 453 452 # CONFIG_CIFS_DEBUG is not set
-1
arch/m68k/configs/q40_defconfig
··· 464 464 CONFIG_NFS_SWAP=y 465 465 CONFIG_ROOT_NFS=y 466 466 CONFIG_NFSD=m 467 - CONFIG_NFSD_V3=y 468 467 CONFIG_CIFS=m 469 468 # CONFIG_CIFS_STATS2 is not set 470 469 # CONFIG_CIFS_DEBUG is not set
-1
arch/m68k/configs/sun3_defconfig
··· 446 446 CONFIG_NFS_SWAP=y 447 447 CONFIG_ROOT_NFS=y 448 448 CONFIG_NFSD=m 449 - CONFIG_NFSD_V3=y 450 449 CONFIG_CIFS=m 451 450 # CONFIG_CIFS_STATS2 is not set 452 451 # CONFIG_CIFS_DEBUG is not set
-1
arch/m68k/configs/sun3x_defconfig
··· 445 445 CONFIG_NFS_SWAP=y 446 446 CONFIG_ROOT_NFS=y 447 447 CONFIG_NFSD=m 448 - CONFIG_NFSD_V3=y 449 448 CONFIG_CIFS=m 450 449 # CONFIG_CIFS_STATS2 is not set 451 450 # CONFIG_CIFS_DEBUG is not set
-1
arch/mips/configs/cobalt_defconfig
··· 69 69 CONFIG_NFS_FS=y 70 70 CONFIG_NFS_V3_ACL=y 71 71 CONFIG_NFSD=y 72 - CONFIG_NFSD_V3=y 73 72 CONFIG_NFSD_V3_ACL=y 74 73 CONFIG_LIBCRC32C=y
-1
arch/mips/configs/decstation_64_defconfig
··· 159 159 CONFIG_NFS_SWAP=y 160 160 CONFIG_ROOT_NFS=y 161 161 CONFIG_NFSD=m 162 - CONFIG_NFSD_V3=y 163 162 CONFIG_NFSD_V3_ACL=y 164 163 # CONFIG_RPCSEC_GSS_KRB5 is not set 165 164 CONFIG_NLS_ISO8859_8=m
-1
arch/mips/configs/decstation_defconfig
··· 154 154 CONFIG_NFS_SWAP=y 155 155 CONFIG_ROOT_NFS=y 156 156 CONFIG_NFSD=m 157 - CONFIG_NFSD_V3=y 158 157 CONFIG_NFSD_V3_ACL=y 159 158 # CONFIG_RPCSEC_GSS_KRB5 is not set 160 159 CONFIG_NLS_ISO8859_8=m
-1
arch/mips/configs/decstation_r4k_defconfig
··· 154 154 CONFIG_NFS_SWAP=y 155 155 CONFIG_ROOT_NFS=y 156 156 CONFIG_NFSD=m 157 - CONFIG_NFSD_V3=y 158 157 CONFIG_NFSD_V3_ACL=y 159 158 # CONFIG_RPCSEC_GSS_KRB5 is not set 160 159 CONFIG_NLS_ISO8859_8=m
-1
arch/mips/configs/ip22_defconfig
··· 269 269 CONFIG_NFS_FS=m 270 270 CONFIG_NFS_V3_ACL=y 271 271 CONFIG_NFSD=m 272 - CONFIG_NFSD_V3=y 273 272 CONFIG_NFSD_V3_ACL=y 274 273 CONFIG_CIFS=m 275 274 CONFIG_CIFS_UPCALL=y
-1
arch/mips/configs/ip32_defconfig
··· 112 112 CONFIG_NFS_FS=y 113 113 CONFIG_ROOT_NFS=y 114 114 CONFIG_NFSD=m 115 - CONFIG_NFSD_V3=y 116 115 CONFIG_CIFS=m 117 116 CONFIG_NLS=y 118 117 CONFIG_NLS_CODEPAGE_437=m
-1
arch/mips/configs/jazz_defconfig
··· 92 92 CONFIG_UFS_FS=m 93 93 CONFIG_NFS_FS=m 94 94 CONFIG_NFSD=m 95 - CONFIG_NFSD_V3=y 96 95 CONFIG_CIFS=m
-1
arch/mips/configs/malta_defconfig
··· 363 363 CONFIG_NFS_FS=y 364 364 CONFIG_ROOT_NFS=y 365 365 CONFIG_NFSD=y 366 - CONFIG_NFSD_V3=y 367 366 CONFIG_NLS_CODEPAGE_437=m 368 367 CONFIG_NLS_CODEPAGE_737=m 369 368 CONFIG_NLS_CODEPAGE_775=m
-1
arch/mips/configs/malta_kvm_defconfig
··· 371 371 CONFIG_NFS_FS=y 372 372 CONFIG_ROOT_NFS=y 373 373 CONFIG_NFSD=y 374 - CONFIG_NFSD_V3=y 375 374 CONFIG_NLS_CODEPAGE_437=m 376 375 CONFIG_NLS_CODEPAGE_737=m 377 376 CONFIG_NLS_CODEPAGE_775=m
-1
arch/mips/configs/maltaup_xpa_defconfig
··· 370 370 CONFIG_NFS_FS=y 371 371 CONFIG_ROOT_NFS=y 372 372 CONFIG_NFSD=y 373 - CONFIG_NFSD_V3=y 374 373 CONFIG_NLS_CODEPAGE_437=m 375 374 CONFIG_NLS_CODEPAGE_737=m 376 375 CONFIG_NLS_CODEPAGE_775=m
-1
arch/mips/configs/rm200_defconfig
··· 354 354 CONFIG_UFS_FS=m 355 355 CONFIG_NFS_FS=m 356 356 CONFIG_NFSD=m 357 - CONFIG_NFSD_V3=y 358 357 CONFIG_CIFS=m 359 358 CONFIG_CODA_FS=m 360 359 CONFIG_AFS_FS=m
-1
arch/mips/configs/tb0219_defconfig
··· 72 72 CONFIG_NFS_FS=y 73 73 CONFIG_ROOT_NFS=y 74 74 CONFIG_NFSD=y 75 - CONFIG_NFSD_V3=y 76 75 CONFIG_CMDLINE_BOOL=y 77 76 CONFIG_CMDLINE="cca=3 mem=64M console=ttyVR0,115200 ip=any root=/dev/nfs"
-1
arch/mips/configs/tb0226_defconfig
··· 67 67 CONFIG_NFS_FS=y 68 68 CONFIG_ROOT_NFS=y 69 69 CONFIG_NFSD=m 70 - CONFIG_NFSD_V3=y 71 70 CONFIG_CMDLINE_BOOL=y 72 71 CONFIG_CMDLINE="cca=3 mem=32M console=ttyVR0,115200"
-1
arch/mips/configs/tb0287_defconfig
··· 77 77 CONFIG_NFS_FS=y 78 78 CONFIG_ROOT_NFS=y 79 79 CONFIG_NFSD=m 80 - CONFIG_NFSD_V3=y 81 80 CONFIG_FONTS=y 82 81 CONFIG_FONT_8x8=y 83 82 CONFIG_FONT_8x16=y
-1
arch/mips/configs/workpad_defconfig
··· 63 63 CONFIG_TMPFS_POSIX_ACL=y 64 64 CONFIG_NFS_FS=m 65 65 CONFIG_NFSD=m 66 - CONFIG_NFSD_V3=y 67 66 CONFIG_CMDLINE_BOOL=y 68 67 CONFIG_CMDLINE="console=ttyVR0,19200 ide0=0x170,0x376,49 mem=16M"
-1
arch/parisc/configs/generic-32bit_defconfig
··· 210 210 CONFIG_NFS_FS=m 211 211 # CONFIG_NFS_V2 is not set 212 212 CONFIG_NFSD=m 213 - CONFIG_NFSD_V3=y 214 213 CONFIG_CIFS=m 215 214 CONFIG_CIFS_XATTR=y 216 215 CONFIG_CIFS_POSIX=y
-1
arch/powerpc/configs/linkstation_defconfig
··· 120 120 CONFIG_NFS_V4=y 121 121 CONFIG_ROOT_NFS=y 122 122 CONFIG_NFSD=m 123 - CONFIG_NFSD_V3=y 124 123 CONFIG_CIFS=m 125 124 CONFIG_NLS_CODEPAGE_437=m 126 125 CONFIG_NLS_CODEPAGE_932=m
-1
arch/powerpc/configs/mvme5100_defconfig
··· 101 101 CONFIG_NFS_V4=y 102 102 CONFIG_ROOT_NFS=y 103 103 CONFIG_NFSD=m 104 - CONFIG_NFSD_V3=y 105 104 CONFIG_CIFS=m 106 105 CONFIG_NLS=y 107 106 CONFIG_NLS_CODEPAGE_437=m
-1
arch/sh/configs/ap325rxa_defconfig
··· 93 93 CONFIG_NFS_V3=y 94 94 CONFIG_ROOT_NFS=y 95 95 CONFIG_NFSD=y 96 - CONFIG_NFSD_V3=y 97 96 CONFIG_NLS_CODEPAGE_437=y 98 97 CONFIG_NLS_CODEPAGE_932=y 99 98 CONFIG_NLS_ISO8859_1=y
-1
arch/sh/configs/ecovec24_defconfig
··· 123 123 CONFIG_NFS_V3=y 124 124 CONFIG_ROOT_NFS=y 125 125 CONFIG_NFSD=y 126 - CONFIG_NFSD_V3=y 127 126 CONFIG_NLS_CODEPAGE_437=y 128 127 CONFIG_NLS_CODEPAGE_932=y 129 128 CONFIG_NLS_ISO8859_1=y
-1
arch/sh/configs/landisk_defconfig
··· 108 108 CONFIG_NFS_FS=m 109 109 CONFIG_NFS_V3=y 110 110 CONFIG_NFSD=m 111 - CONFIG_NFSD_V3=y 112 111 CONFIG_SMB_FS=m 113 112 CONFIG_NLS_CODEPAGE_437=y 114 113 CONFIG_NLS_CODEPAGE_932=y
-1
arch/sh/configs/sdk7780_defconfig
··· 120 120 CONFIG_NFS_V3=y 121 121 CONFIG_ROOT_NFS=y 122 122 CONFIG_NFSD=y 123 - CONFIG_NFSD_V3=y 124 123 CONFIG_NLS_CODEPAGE_437=y 125 124 CONFIG_NLS_ASCII=y 126 125 CONFIG_NLS_ISO8859_1=y
-1
arch/sh/configs/se7724_defconfig
··· 122 122 CONFIG_NFS_V3=y 123 123 CONFIG_ROOT_NFS=y 124 124 CONFIG_NFSD=y 125 - CONFIG_NFSD_V3=y 126 125 CONFIG_NLS_CODEPAGE_437=y 127 126 CONFIG_NLS_CODEPAGE_932=y 128 127 CONFIG_NLS_ISO8859_1=y
-1
arch/sh/configs/sh03_defconfig
··· 75 75 CONFIG_NFS_V4=y 76 76 CONFIG_ROOT_NFS=y 77 77 CONFIG_NFSD=y 78 - CONFIG_NFSD_V3=y 79 78 CONFIG_PARTITION_ADVANCED=y 80 79 CONFIG_NLS_CODEPAGE_437=m 81 80 CONFIG_NLS_CODEPAGE_737=m
-1
arch/sh/configs/sh7785lcr_32bit_defconfig
··· 129 129 CONFIG_NFS_V4=y 130 130 CONFIG_ROOT_NFS=y 131 131 CONFIG_NFSD=m 132 - CONFIG_NFSD_V3=y 133 132 CONFIG_NLS_CODEPAGE_437=y 134 133 CONFIG_NLS_CODEPAGE_932=y 135 134 CONFIG_NLS_ISO8859_1=y
-1
arch/sh/configs/titan_defconfig
··· 239 239 CONFIG_NFS_V3=y 240 240 CONFIG_ROOT_NFS=y 241 241 CONFIG_NFSD=y 242 - CONFIG_NFSD_V3=y 243 242 CONFIG_SMB_FS=m 244 243 CONFIG_CIFS=m 245 244 CONFIG_PARTITION_ADVANCED=y
+1 -1
fs/Kconfig
··· 344 344 345 345 config LOCKD_V4 346 346 bool 347 - depends on NFSD_V3 || NFS_V3 347 + depends on NFSD || NFS_V3 348 348 depends on FILE_LOCKING 349 349 default y 350 350
+8 -16
fs/lockd/svc.c
··· 184 184 dprintk("lockd_down: service stopped\n"); 185 185 186 186 svc_exit_thread(rqstp); 187 - 188 - module_put_and_kthread_exit(0); 187 + return 0; 189 188 } 190 189 191 190 static int create_lockd_listener(struct svc_serv *serv, const char *name, ··· 196 197 197 198 xprt = svc_find_xprt(serv, name, net, family, 0); 198 199 if (xprt == NULL) 199 - return svc_create_xprt(serv, name, net, family, port, 200 - SVC_SOCK_DEFAULTS, cred); 200 + return svc_xprt_create(serv, name, net, family, port, 201 + SVC_SOCK_DEFAULTS, cred); 201 202 svc_xprt_put(xprt); 202 203 return 0; 203 204 } ··· 247 248 if (warned++ == 0) 248 249 printk(KERN_WARNING 249 250 "lockd_up: makesock failed, error=%d\n", err); 250 - svc_shutdown_net(serv, net); 251 + svc_xprt_destroy_all(serv, net); 252 + svc_rpcb_cleanup(serv, net); 251 253 return err; 252 254 } 253 255 ··· 286 286 nlm_shutdown_hosts_net(net); 287 287 cancel_delayed_work_sync(&ln->grace_period_end); 288 288 locks_end_grace(&ln->lockd_manager); 289 - svc_shutdown_net(serv, net); 290 - dprintk("%s: per-net data destroyed; net=%x\n", 291 - __func__, net->ns.inum); 289 + svc_xprt_destroy_all(serv, net); 290 + svc_rpcb_cleanup(serv, net); 292 291 } 293 292 } else { 294 293 pr_err("%s: no users! net=%x\n", ··· 349 350 }; 350 351 #endif 351 352 352 - static const struct svc_serv_ops lockd_sv_ops = { 353 - .svo_shutdown = svc_rpcb_cleanup, 354 - .svo_function = lockd, 355 - .svo_enqueue_xprt = svc_xprt_do_enqueue, 356 - .svo_module = THIS_MODULE, 357 - }; 358 - 359 353 static int lockd_get(void) 360 354 { 361 355 struct svc_serv *serv; ··· 372 380 nlm_timeout = LOCKD_DFLT_TIMEO; 373 381 nlmsvc_timeout = nlm_timeout * HZ; 374 382 375 - serv = svc_create(&nlmsvc_program, LOCKD_BUFSIZE, &lockd_sv_ops); 383 + serv = svc_create(&nlmsvc_program, LOCKD_BUFSIZE, lockd); 376 384 if (!serv) { 377 385 printk(KERN_WARNING "lockd_up: create service failed\n"); 378 386 return -ENOMEM;
+20 -46
fs/nfs/callback.c
··· 17 17 #include <linux/errno.h> 18 18 #include <linux/mutex.h> 19 19 #include <linux/freezer.h> 20 - #include <linux/kthread.h> 21 20 #include <linux/sunrpc/svcauth_gss.h> 22 21 #include <linux/sunrpc/bc_xprt.h> 23 22 ··· 44 45 int ret; 45 46 struct nfs_net *nn = net_generic(net, nfs_net_id); 46 47 47 - ret = svc_create_xprt(serv, "tcp", net, PF_INET, 48 - nfs_callback_set_tcpport, SVC_SOCK_ANONYMOUS, 49 - cred); 48 + ret = svc_xprt_create(serv, "tcp", net, PF_INET, 49 + nfs_callback_set_tcpport, SVC_SOCK_ANONYMOUS, 50 + cred); 50 51 if (ret <= 0) 51 52 goto out_err; 52 53 nn->nfs_callback_tcpport = ret; 53 54 dprintk("NFS: Callback listener port = %u (af %u, net %x)\n", 54 55 nn->nfs_callback_tcpport, PF_INET, net->ns.inum); 55 56 56 - ret = svc_create_xprt(serv, "tcp", net, PF_INET6, 57 - nfs_callback_set_tcpport, SVC_SOCK_ANONYMOUS, 58 - cred); 57 + ret = svc_xprt_create(serv, "tcp", net, PF_INET6, 58 + nfs_callback_set_tcpport, SVC_SOCK_ANONYMOUS, 59 + cred); 59 60 if (ret > 0) { 60 61 nn->nfs_callback_tcpport6 = ret; 61 62 dprintk("NFS: Callback listener port = %u (af %u, net %x)\n", ··· 91 92 continue; 92 93 svc_process(rqstp); 93 94 } 95 + 94 96 svc_exit_thread(rqstp); 95 - module_put_and_kthread_exit(0); 96 97 return 0; 97 98 } 98 99 ··· 135 136 finish_wait(&serv->sv_cb_waitq, &wq); 136 137 } 137 138 } 139 + 138 140 svc_exit_thread(rqstp); 139 - module_put_and_kthread_exit(0); 140 141 return 0; 141 142 } 142 143 ··· 188 189 return; 189 190 190 191 dprintk("NFS: destroy per-net callback data; net=%x\n", net->ns.inum); 191 - svc_shutdown_net(serv, net); 192 + svc_xprt_destroy_all(serv, net); 192 193 } 193 194 194 195 static int nfs_callback_up_net(int minorversion, struct svc_serv *serv, ··· 231 232 return ret; 232 233 } 233 234 234 - static const struct svc_serv_ops nfs40_cb_sv_ops = { 235 - .svo_function = nfs4_callback_svc, 236 - .svo_enqueue_xprt = svc_xprt_do_enqueue, 237 - .svo_module = THIS_MODULE, 238 - }; 239 - #if defined(CONFIG_NFS_V4_1) 240 - static const struct svc_serv_ops nfs41_cb_sv_ops = { 241 - .svo_function = nfs41_callback_svc, 242 - .svo_enqueue_xprt = svc_xprt_do_enqueue, 243 - .svo_module = THIS_MODULE, 244 - }; 245 - 246 - static const struct svc_serv_ops *nfs4_cb_sv_ops[] = { 247 - [0] = &nfs40_cb_sv_ops, 248 - [1] = &nfs41_cb_sv_ops, 249 - }; 250 - #else 251 - static const struct svc_serv_ops *nfs4_cb_sv_ops[] = { 252 - [0] = &nfs40_cb_sv_ops, 253 - [1] = NULL, 254 - }; 255 - #endif 256 - 257 235 static struct svc_serv *nfs_callback_create_svc(int minorversion) 258 236 { 259 237 struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion]; 260 - const struct svc_serv_ops *sv_ops; 238 + int (*threadfn)(void *data); 261 239 struct svc_serv *serv; 262 240 263 241 /* ··· 242 266 */ 243 267 if (cb_info->serv) 244 268 return svc_get(cb_info->serv); 245 - 246 - switch (minorversion) { 247 - case 0: 248 - sv_ops = nfs4_cb_sv_ops[0]; 249 - break; 250 - default: 251 - sv_ops = nfs4_cb_sv_ops[1]; 252 - } 253 - 254 - if (sv_ops == NULL) 255 - return ERR_PTR(-ENOTSUPP); 256 269 257 270 /* 258 271 * Sanity check: if there's no task, ··· 251 286 printk(KERN_WARNING "nfs_callback_create_svc: no kthread, %d users??\n", 252 287 cb_info->users); 253 288 254 - serv = svc_create(&nfs4_callback_program, NFS4_CALLBACK_BUFSIZE, sv_ops); 289 + threadfn = nfs4_callback_svc; 290 + #if defined(CONFIG_NFS_V4_1) 291 + if (minorversion) 292 + threadfn = nfs41_callback_svc; 293 + #else 294 + if (minorversion) 295 + return ERR_PTR(-ENOTSUPP); 296 + #endif 297 + serv = svc_create(&nfs4_callback_program, NFS4_CALLBACK_BUFSIZE, 298 + threadfn); 255 299 if (!serv) { 256 300 printk(KERN_ERR "nfs_callback_create_svc: create service failed\n"); 257 301 return ERR_PTR(-ENOMEM);
-1
fs/nfs/nfs4state.c
··· 2697 2697 allow_signal(SIGKILL); 2698 2698 nfs4_state_manager(clp); 2699 2699 nfs_put_client(clp); 2700 - module_put_and_kthread_exit(0); 2701 2700 return 0; 2702 2701 }
+1 -11
fs/nfsd/Kconfig
··· 35 35 bool 36 36 depends on NFSD 37 37 38 - config NFSD_V3 39 - bool "NFS server support for NFS version 3" 40 - depends on NFSD 41 - help 42 - This option enables support in your system's NFS server for 43 - version 3 of the NFS protocol (RFC 1813). 44 - 45 - If unsure, say Y. 46 - 47 38 config NFSD_V3_ACL 48 39 bool "NFS server support for the NFSv3 ACL protocol extension" 49 - depends on NFSD_V3 40 + depends on NFSD 50 41 select NFSD_V2_ACL 51 42 help 52 43 Solaris NFS servers support an auxiliary NFSv3 ACL protocol that ··· 61 70 config NFSD_V4 62 71 bool "NFS server support for NFS version 4" 63 72 depends on NFSD && PROC_FS 64 - select NFSD_V3 65 73 select FS_POSIX_ACL 66 74 select SUNRPC_GSS 67 75 select CRYPTO
+1 -2
fs/nfsd/Makefile
··· 12 12 13 13 nfsd-y += nfssvc.o nfsctl.o nfsproc.o nfsfh.o vfs.o \ 14 14 export.o auth.o lockd.o nfscache.o nfsxdr.o \ 15 - stats.o filecache.o 15 + stats.o filecache.o nfs3proc.o nfs3xdr.o 16 16 nfsd-$(CONFIG_NFSD_V2_ACL) += nfs2acl.o 17 - nfsd-$(CONFIG_NFSD_V3) += nfs3proc.o nfs3xdr.o 18 17 nfsd-$(CONFIG_NFSD_V3_ACL) += nfs3acl.o 19 18 nfsd-$(CONFIG_NFSD_V4) += nfs4proc.o nfs4xdr.o nfs4state.o nfs4idmap.o \ 20 19 nfs4acl.o nfs4callback.o nfs4recover.o
+3 -3
fs/nfsd/filecache.c
··· 632 632 if (!nfsd_filecache_wq) 633 633 goto out; 634 634 635 - nfsd_file_hashtbl = kcalloc(NFSD_FILE_HASH_SIZE, 635 + nfsd_file_hashtbl = kvcalloc(NFSD_FILE_HASH_SIZE, 636 636 sizeof(*nfsd_file_hashtbl), GFP_KERNEL); 637 637 if (!nfsd_file_hashtbl) { 638 638 pr_err("nfsd: unable to allocate nfsd_file_hashtbl\n"); ··· 700 700 nfsd_file_slab = NULL; 701 701 kmem_cache_destroy(nfsd_file_mark_slab); 702 702 nfsd_file_mark_slab = NULL; 703 - kfree(nfsd_file_hashtbl); 703 + kvfree(nfsd_file_hashtbl); 704 704 nfsd_file_hashtbl = NULL; 705 705 destroy_workqueue(nfsd_filecache_wq); 706 706 nfsd_filecache_wq = NULL; ··· 811 811 fsnotify_wait_marks_destroyed(); 812 812 kmem_cache_destroy(nfsd_file_mark_slab); 813 813 nfsd_file_mark_slab = NULL; 814 - kfree(nfsd_file_hashtbl); 814 + kvfree(nfsd_file_hashtbl); 815 815 nfsd_file_hashtbl = NULL; 816 816 destroy_workqueue(nfsd_filecache_wq); 817 817 nfsd_filecache_wq = NULL;
+1 -1
fs/nfsd/flexfilelayout.c
··· 117 117 118 118 da->netaddr.addr_len = 119 119 snprintf(da->netaddr.addr, FF_ADDR_LEN + 1, 120 - "%s.%hhu.%hhu", addr, port >> 8, port & 0xff); 120 + "%s.%d.%d", addr, port >> 8, port & 0xff); 121 121 122 122 da->tightly_coupled = false; 123 123
+1 -1
fs/nfsd/nfs4layouts.c
··· 422 422 new = kmem_cache_alloc(nfs4_layout_cache, GFP_KERNEL); 423 423 if (!new) 424 424 return nfserr_jukebox; 425 - memcpy(&new->lo_seg, seg, sizeof(lp->lo_seg)); 425 + memcpy(&new->lo_seg, seg, sizeof(new->lo_seg)); 426 426 new->lo_state = ls; 427 427 428 428 spin_lock(&fp->fi_lock);
+14 -6
fs/nfsd/nfs4state.c
··· 4711 4711 return ret; 4712 4712 } 4713 4713 4714 + /** 4715 + * nfsd_breaker_owns_lease - Check if lease conflict was resolved 4716 + * @fl: Lock state to check 4717 + * 4718 + * Return values: 4719 + * %true: Lease conflict was resolved 4720 + * %false: Lease conflict was not resolved. 4721 + */ 4714 4722 static bool nfsd_breaker_owns_lease(struct file_lock *fl) 4715 4723 { 4716 4724 struct nfs4_delegation *dl = fl->fl_owner; ··· 4726 4718 struct nfs4_client *clp; 4727 4719 4728 4720 if (!i_am_nfsd()) 4729 - return NULL; 4721 + return false; 4730 4722 rqst = kthread_data(current); 4731 4723 /* Note rq_prog == NFS_ACL_PROGRAM is also possible: */ 4732 4724 if (rqst->rq_prog != NFS_PROGRAM || rqst->rq_vers < 4) 4733 - return NULL; 4725 + return false; 4734 4726 clp = *(rqst->rq_lease_breaker); 4735 4727 return dl->dl_stid.sc_client == clp; 4736 4728 } ··· 6534 6526 } 6535 6527 6536 6528 static fl_owner_t 6537 - nfsd4_fl_get_owner(fl_owner_t owner) 6529 + nfsd4_lm_get_owner(fl_owner_t owner) 6538 6530 { 6539 6531 struct nfs4_lockowner *lo = (struct nfs4_lockowner *)owner; 6540 6532 ··· 6543 6535 } 6544 6536 6545 6537 static void 6546 - nfsd4_fl_put_owner(fl_owner_t owner) 6538 + nfsd4_lm_put_owner(fl_owner_t owner) 6547 6539 { 6548 6540 struct nfs4_lockowner *lo = (struct nfs4_lockowner *)owner; 6549 6541 ··· 6578 6570 6579 6571 static const struct lock_manager_operations nfsd_posix_mng_ops = { 6580 6572 .lm_notify = nfsd4_lm_notify, 6581 - .lm_get_owner = nfsd4_fl_get_owner, 6582 - .lm_put_owner = nfsd4_fl_put_owner, 6573 + .lm_get_owner = nfsd4_lm_get_owner, 6574 + .lm_put_owner = nfsd4_lm_put_owner, 6583 6575 }; 6584 6576 6585 6577 static inline void
+10
fs/nfsd/nfs4xdr.c
··· 2854 2854 err = vfs_getattr(&path, &stat, STATX_BASIC_STATS, AT_STATX_SYNC_AS_STAT); 2855 2855 if (err) 2856 2856 goto out_nfserr; 2857 + if (!(stat.result_mask & STATX_BTIME)) 2858 + /* underlying FS does not offer btime so we can't share it */ 2859 + bmval1 &= ~FATTR4_WORD1_TIME_CREATE; 2857 2860 if ((bmval0 & (FATTR4_WORD0_FILES_AVAIL | FATTR4_WORD0_FILES_FREE | 2858 2861 FATTR4_WORD0_FILES_TOTAL | FATTR4_WORD0_MAXNAME)) || 2859 2862 (bmval1 & (FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE | ··· 3256 3253 goto out_resource; 3257 3254 p = xdr_encode_hyper(p, (s64)stat.mtime.tv_sec); 3258 3255 *p++ = cpu_to_be32(stat.mtime.tv_nsec); 3256 + } 3257 + if (bmval1 & FATTR4_WORD1_TIME_CREATE) { 3258 + p = xdr_reserve_space(xdr, 12); 3259 + if (!p) 3260 + goto out_resource; 3261 + p = xdr_encode_hyper(p, (s64)stat.btime.tv_sec); 3262 + *p++ = cpu_to_be32(stat.btime.tv_nsec); 3259 3263 } 3260 3264 if (bmval1 & FATTR4_WORD1_MOUNTED_ON_FILEID) { 3261 3265 struct kstat parent_stat;
+16 -17
fs/nfsd/nfscache.c
··· 84 84 return roundup_pow_of_two(limit / TARGET_BUCKET_SIZE); 85 85 } 86 86 87 - static u32 88 - nfsd_cache_hash(__be32 xid, struct nfsd_net *nn) 89 - { 90 - return hash_32((__force u32)xid, nn->maskbits); 91 - } 92 - 93 87 static struct svc_cacherep * 94 88 nfsd_reply_cache_alloc(struct svc_rqst *rqstp, __wsum csum, 95 89 struct nfsd_net *nn) ··· 233 239 { 234 240 rp->c_timestamp = jiffies; 235 241 list_move_tail(&rp->c_lru, &b->lru_head); 242 + } 243 + 244 + static noinline struct nfsd_drc_bucket * 245 + nfsd_cache_bucket_find(__be32 xid, struct nfsd_net *nn) 246 + { 247 + unsigned int hash = hash_32((__force u32)xid, nn->maskbits); 248 + 249 + return &nn->drc_hashtbl[hash]; 236 250 } 237 251 238 252 static long prune_bucket(struct nfsd_drc_bucket *b, struct nfsd_net *nn, ··· 421 419 */ 422 420 int nfsd_cache_lookup(struct svc_rqst *rqstp) 423 421 { 424 - struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id); 422 + struct nfsd_net *nn; 425 423 struct svc_cacherep *rp, *found; 426 - __be32 xid = rqstp->rq_xid; 427 424 __wsum csum; 428 - u32 hash = nfsd_cache_hash(xid, nn); 429 - struct nfsd_drc_bucket *b = &nn->drc_hashtbl[hash]; 425 + struct nfsd_drc_bucket *b; 430 426 int type = rqstp->rq_cachetype; 431 427 int rtn = RC_DOIT; 432 428 ··· 440 440 * Since the common case is a cache miss followed by an insert, 441 441 * preallocate an entry. 442 442 */ 443 + nn = net_generic(SVC_NET(rqstp), nfsd_net_id); 443 444 rp = nfsd_reply_cache_alloc(rqstp, csum, nn); 444 445 if (!rp) 445 446 goto out; 446 447 448 + b = nfsd_cache_bucket_find(rqstp->rq_xid, nn); 447 449 spin_lock(&b->cache_lock); 448 450 found = nfsd_cache_insert(b, rp, nn); 449 - if (found != rp) { 450 - nfsd_reply_cache_free_locked(NULL, rp, nn); 451 - rp = found; 451 + if (found != rp) 452 452 goto found_entry; 453 - } 454 453 455 454 nfsd_stats_rc_misses_inc(); 456 455 rqstp->rq_cacherep = rp; ··· 467 468 468 469 found_entry: 469 470 /* We found a matching entry which is either in progress or done. */ 471 + nfsd_reply_cache_free_locked(NULL, rp, nn); 470 472 nfsd_stats_rc_hits_inc(); 471 473 rtn = RC_DROPIT; 474 + rp = found; 472 475 473 476 /* Request being processed */ 474 477 if (rp->c_state == RC_INPROG) ··· 529 528 struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id); 530 529 struct svc_cacherep *rp = rqstp->rq_cacherep; 531 530 struct kvec *resv = &rqstp->rq_res.head[0], *cachv; 532 - u32 hash; 533 531 struct nfsd_drc_bucket *b; 534 532 int len; 535 533 size_t bufsize = 0; ··· 536 536 if (!rp) 537 537 return; 538 538 539 - hash = nfsd_cache_hash(rp->c_key.k_xid, nn); 540 - b = &nn->drc_hashtbl[hash]; 539 + b = nfsd_cache_bucket_find(rp->c_key.k_xid, nn); 541 540 542 541 len = resv->iov_len - ((char*)statp - (char*)resv->iov_base); 543 542 len >>= 2;
+5 -5
fs/nfsd/nfsctl.c
··· 772 772 if (err != 0) 773 773 return err; 774 774 775 - err = svc_create_xprt(nn->nfsd_serv, transport, net, 776 - PF_INET, port, SVC_SOCK_ANONYMOUS, cred); 775 + err = svc_xprt_create(nn->nfsd_serv, transport, net, 776 + PF_INET, port, SVC_SOCK_ANONYMOUS, cred); 777 777 if (err < 0) 778 778 goto out_err; 779 779 780 - err = svc_create_xprt(nn->nfsd_serv, transport, net, 781 - PF_INET6, port, SVC_SOCK_ANONYMOUS, cred); 780 + err = svc_xprt_create(nn->nfsd_serv, transport, net, 781 + PF_INET6, port, SVC_SOCK_ANONYMOUS, cred); 782 782 if (err < 0 && err != -EAFNOSUPPORT) 783 783 goto out_close; 784 784 ··· 790 790 out_close: 791 791 xprt = svc_find_xprt(nn->nfsd_serv, transport, net, PF_INET, port); 792 792 if (xprt != NULL) { 793 - svc_close_xprt(xprt); 793 + svc_xprt_close(xprt); 794 794 svc_xprt_put(xprt); 795 795 } 796 796 out_err:
+1 -1
fs/nfsd/nfsd.h
··· 364 364 | FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP | FATTR4_WORD1_RAWDEV \ 365 365 | FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE | FATTR4_WORD1_SPACE_TOTAL \ 366 366 | FATTR4_WORD1_SPACE_USED | FATTR4_WORD1_TIME_ACCESS | FATTR4_WORD1_TIME_ACCESS_SET \ 367 - | FATTR4_WORD1_TIME_DELTA | FATTR4_WORD1_TIME_METADATA \ 367 + | FATTR4_WORD1_TIME_DELTA | FATTR4_WORD1_TIME_METADATA | FATTR4_WORD1_TIME_CREATE \ 368 368 | FATTR4_WORD1_TIME_MODIFY | FATTR4_WORD1_TIME_MODIFY_SET | FATTR4_WORD1_MOUNTED_ON_FILEID) 369 369 370 370 #define NFSD4_SUPPORTED_ATTRS_WORD2 0
-4
fs/nfsd/nfsfh.c
··· 611 611 return nfserr_serverfault; 612 612 } 613 613 614 - #ifdef CONFIG_NFSD_V3 615 - 616 614 /** 617 615 * fh_fill_pre_attrs - Fill in pre-op attributes 618 616 * @fhp: file handle to be updated ··· 670 672 fhp->fh_post_change = 671 673 nfsd4_change_attribute(&fhp->fh_post_attr, inode); 672 674 } 673 - 674 - #endif /* CONFIG_NFSD_V3 */ 675 675 676 676 /* 677 677 * Release a file handle.
-20
fs/nfsd/nfsfh.h
··· 90 90 * operation 91 91 */ 92 92 int fh_flags; /* FH flags */ 93 - #ifdef CONFIG_NFSD_V3 94 93 bool fh_post_saved; /* post-op attrs saved */ 95 94 bool fh_pre_saved; /* pre-op attrs saved */ 96 95 ··· 106 107 /* Post-op attributes saved in fh_unlock */ 107 108 struct kstat fh_post_attr; /* full attrs after operation */ 108 109 u64 fh_post_change; /* nfsv4 change; see above */ 109 - #endif /* CONFIG_NFSD_V3 */ 110 110 } svc_fh; 111 111 #define NFSD4_FH_FOREIGN (1<<0) 112 112 #define SET_FH_FLAG(c, f) ((c)->fh_flags |= (f)) ··· 281 283 } 282 284 #endif 283 285 284 - #ifdef CONFIG_NFSD_V3 285 - 286 286 /** 287 287 * fh_clear_pre_post_attrs - Reset pre/post attributes 288 288 * @fhp: file handle to be updated ··· 322 326 323 327 extern void fh_fill_pre_attrs(struct svc_fh *fhp); 324 328 extern void fh_fill_post_attrs(struct svc_fh *fhp); 325 - 326 - #else /* !CONFIG_NFSD_V3 */ 327 - 328 - static inline void fh_clear_pre_post_attrs(struct svc_fh *fhp) 329 - { 330 - } 331 - 332 - static inline void fh_fill_pre_attrs(struct svc_fh *fhp) 333 - { 334 - } 335 - 336 - static inline void fh_fill_post_attrs(struct svc_fh *fhp) 337 - { 338 - } 339 - 340 - #endif /* !CONFIG_NFSD_V3 */ 341 329 342 330 343 331 /*
+1 -1
fs/nfsd/nfsproc.c
··· 230 230 unsigned long cnt = argp->len; 231 231 unsigned int nvecs; 232 232 233 - dprintk("nfsd: WRITE %s %d bytes at %d\n", 233 + dprintk("nfsd: WRITE %s %u bytes at %d\n", 234 234 SVCFH_fmt(&argp->fh), 235 235 argp->len, argp->offset); 236 236
+7 -18
fs/nfsd/nfssvc.c
··· 117 117 118 118 static const struct svc_version *nfsd_version[] = { 119 119 [2] = &nfsd_version2, 120 - #if defined(CONFIG_NFSD_V3) 121 120 [3] = &nfsd_version3, 122 - #endif 123 121 #if defined(CONFIG_NFSD_V4) 124 122 [4] = &nfsd_version4, 125 123 #endif ··· 291 293 if (!list_empty(&nn->nfsd_serv->sv_permsocks)) 292 294 return 0; 293 295 294 - error = svc_create_xprt(nn->nfsd_serv, "udp", net, PF_INET, NFS_PORT, 295 - SVC_SOCK_DEFAULTS, cred); 296 + error = svc_xprt_create(nn->nfsd_serv, "udp", net, PF_INET, NFS_PORT, 297 + SVC_SOCK_DEFAULTS, cred); 296 298 if (error < 0) 297 299 return error; 298 300 299 - error = svc_create_xprt(nn->nfsd_serv, "tcp", net, PF_INET, NFS_PORT, 300 - SVC_SOCK_DEFAULTS, cred); 301 + error = svc_xprt_create(nn->nfsd_serv, "tcp", net, PF_INET, NFS_PORT, 302 + SVC_SOCK_DEFAULTS, cred); 301 303 if (error < 0) 302 304 return error; 303 305 ··· 610 612 return ret; 611 613 } 612 614 613 - static const struct svc_serv_ops nfsd_thread_sv_ops = { 614 - .svo_shutdown = nfsd_last_thread, 615 - .svo_function = nfsd, 616 - .svo_enqueue_xprt = svc_xprt_do_enqueue, 617 - .svo_module = THIS_MODULE, 618 - }; 619 - 620 615 void nfsd_shutdown_threads(struct net *net) 621 616 { 622 617 struct nfsd_net *nn = net_generic(net, nfsd_net_id); ··· 648 657 if (nfsd_max_blksize == 0) 649 658 nfsd_max_blksize = nfsd_get_default_max_blksize(); 650 659 nfsd_reset_versions(nn); 651 - serv = svc_create_pooled(&nfsd_program, nfsd_max_blksize, 652 - &nfsd_thread_sv_ops); 660 + serv = svc_create_pooled(&nfsd_program, nfsd_max_blksize, nfsd); 653 661 if (serv == NULL) 654 662 return -ENOMEM; 655 663 ··· 714 724 struct nfsd_net *nn = net_generic(net, nfsd_net_id); 715 725 716 726 if (kref_put(&nn->nfsd_serv->sv_refcnt, nfsd_noop)) { 717 - svc_shutdown_net(nn->nfsd_serv, net); 727 + svc_xprt_destroy_all(nn->nfsd_serv, net); 728 + nfsd_last_thread(nn->nfsd_serv, net); 718 729 svc_destroy(&nn->nfsd_serv->sv_refcnt); 719 730 spin_lock(&nfsd_notifier_lock); 720 731 nn->nfsd_serv = NULL; ··· 1010 1019 msleep(20); 1011 1020 } 1012 1021 1013 - /* Release module */ 1014 - module_put_and_kthread_exit(0); 1015 1022 return 0; 1016 1023 } 1017 1024
+48 -59
fs/nfsd/trace.h
··· 13 13 #include "export.h" 14 14 #include "nfsfh.h" 15 15 16 - #define NFSD_TRACE_PROC_ARG_FIELDS \ 17 - __field(unsigned int, netns_ino) \ 18 - __field(u32, xid) \ 19 - __array(unsigned char, server, sizeof(struct sockaddr_in6)) \ 20 - __array(unsigned char, client, sizeof(struct sockaddr_in6)) 21 - 22 - #define NFSD_TRACE_PROC_ARG_ASSIGNMENTS \ 23 - do { \ 24 - __entry->netns_ino = SVC_NET(rqstp)->ns.inum; \ 25 - __entry->xid = be32_to_cpu(rqstp->rq_xid); \ 26 - memcpy(__entry->server, &rqstp->rq_xprt->xpt_local, \ 27 - rqstp->rq_xprt->xpt_locallen); \ 28 - memcpy(__entry->client, &rqstp->rq_xprt->xpt_remote, \ 29 - rqstp->rq_xprt->xpt_remotelen); \ 30 - } while (0); 31 - 32 16 #define NFSD_TRACE_PROC_RES_FIELDS \ 33 17 __field(unsigned int, netns_ino) \ 34 18 __field(u32, xid) \ ··· 37 53 ), 38 54 TP_ARGS(rqstp), 39 55 TP_STRUCT__entry( 40 - NFSD_TRACE_PROC_ARG_FIELDS 41 - 56 + __field(unsigned int, netns_ino) 57 + __field(u32, xid) 42 58 __field(u32, vers) 43 59 __field(u32, proc) 60 + __sockaddr(server, rqstp->rq_xprt->xpt_locallen) 61 + __sockaddr(client, rqstp->rq_xprt->xpt_remotelen) 44 62 ), 45 63 TP_fast_assign( 46 - NFSD_TRACE_PROC_ARG_ASSIGNMENTS 64 + const struct svc_xprt *xprt = rqstp->rq_xprt; 47 65 66 + __entry->netns_ino = xprt->xpt_net->ns.inum; 67 + __entry->xid = be32_to_cpu(rqstp->rq_xid); 48 68 __entry->vers = rqstp->rq_vers; 49 69 __entry->proc = rqstp->rq_proc; 70 + __assign_sockaddr(server, &xprt->xpt_local, xprt->xpt_locallen); 71 + __assign_sockaddr(client, &xprt->xpt_remote, xprt->xpt_remotelen); 50 72 ), 51 73 TP_printk("xid=0x%08x vers=%u proc=%u", 52 74 __entry->xid, __entry->vers, __entry->proc ··· 603 613 __field(u32, cl_id) 604 614 __field(unsigned long, cl_flavor) 605 615 __field(unsigned long, new_flavor) 606 - __array(unsigned char, addr, sizeof(struct sockaddr_in6)) 616 + __sockaddr(addr, rqstp->rq_xprt->xpt_remotelen) 607 617 ), 608 618 TP_fast_assign( 609 619 __entry->cl_boot = clp->cl_clientid.cl_boot; 610 620 __entry->cl_id = clp->cl_clientid.cl_id; 611 621 __entry->cl_flavor = clp->cl_cred.cr_flavor; 612 622 __entry->new_flavor = rqstp->rq_cred.cr_flavor; 613 - memcpy(__entry->addr, &rqstp->rq_xprt->xpt_remote, 614 - sizeof(struct sockaddr_in6)); 623 + __assign_sockaddr(addr, &rqstp->rq_xprt->xpt_remote, 624 + rqstp->rq_xprt->xpt_remotelen); 615 625 ), 616 626 TP_printk("client %08x:%08x flavor=%s, conflict=%s from addr=%pISpc", 617 627 __entry->cl_boot, __entry->cl_id, 618 628 show_nfsd_authflavor(__entry->cl_flavor), 619 - show_nfsd_authflavor(__entry->new_flavor), __entry->addr 629 + show_nfsd_authflavor(__entry->new_flavor), 630 + __get_sockaddr(addr) 620 631 ) 621 632 ) 622 633 ··· 633 642 __field(u32, cl_id) 634 643 __array(unsigned char, cl_verifier, NFS4_VERIFIER_SIZE) 635 644 __array(unsigned char, new_verifier, NFS4_VERIFIER_SIZE) 636 - __array(unsigned char, addr, sizeof(struct sockaddr_in6)) 645 + __sockaddr(addr, rqstp->rq_xprt->xpt_remotelen) 637 646 ), 638 647 TP_fast_assign( 639 648 __entry->cl_boot = clp->cl_clientid.cl_boot; ··· 642 651 NFS4_VERIFIER_SIZE); 643 652 memcpy(__entry->new_verifier, (void *)verf, 644 653 NFS4_VERIFIER_SIZE); 645 - memcpy(__entry->addr, &rqstp->rq_xprt->xpt_remote, 646 - sizeof(struct sockaddr_in6)); 654 + __assign_sockaddr(addr, &rqstp->rq_xprt->xpt_remote, 655 + rqstp->rq_xprt->xpt_remotelen); 647 656 ), 648 657 TP_printk("client %08x:%08x verf=0x%s, updated=0x%s from addr=%pISpc", 649 658 __entry->cl_boot, __entry->cl_id, 650 659 __print_hex_str(__entry->cl_verifier, NFS4_VERIFIER_SIZE), 651 660 __print_hex_str(__entry->new_verifier, NFS4_VERIFIER_SIZE), 652 - __entry->addr 661 + __get_sockaddr(addr) 653 662 ) 654 663 ); 655 664 ··· 899 908 __field(u32, cl_id) 900 909 __field(u32, prog) 901 910 __field(u32, ident) 902 - __array(unsigned char, addr, sizeof(struct sockaddr_in6)) 911 + __sockaddr(addr, conn->cb_addrlen) 903 912 ), 904 913 TP_fast_assign( 905 914 __entry->cl_boot = clp->cl_clientid.cl_boot; 906 915 __entry->cl_id = clp->cl_clientid.cl_id; 907 916 __entry->prog = conn->cb_prog; 908 917 __entry->ident = conn->cb_ident; 909 - memcpy(__entry->addr, &conn->cb_addr, 910 - sizeof(struct sockaddr_in6)); 918 + __assign_sockaddr(addr, &conn->cb_addr, conn->cb_addrlen); 911 919 ), 912 920 TP_printk("addr=%pISpc client %08x:%08x prog=%u ident=%u", 913 - __entry->addr, __entry->cl_boot, __entry->cl_id, 921 + __get_sockaddr(addr), __entry->cl_boot, __entry->cl_id, 914 922 __entry->prog, __entry->ident) 915 923 ); 916 924 ··· 941 951 __field(unsigned long, state) 942 952 __field(u32, cl_boot) 943 953 __field(u32, cl_id) 944 - __array(unsigned char, addr, sizeof(struct sockaddr_in6)) 954 + __sockaddr(addr, clp->cl_cb_conn.cb_addrlen) 945 955 ), 946 956 TP_fast_assign( 947 957 __entry->state = clp->cl_cb_state; 948 958 __entry->cl_boot = clp->cl_clientid.cl_boot; 949 959 __entry->cl_id = clp->cl_clientid.cl_id; 950 - memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr, 951 - sizeof(struct sockaddr_in6)); 960 + __assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr, 961 + clp->cl_cb_conn.cb_addrlen) 952 962 ), 953 963 TP_printk("addr=%pISpc client %08x:%08x state=%s", 954 - __entry->addr, __entry->cl_boot, __entry->cl_id, 964 + __get_sockaddr(addr), __entry->cl_boot, __entry->cl_id, 955 965 show_cb_state(__entry->state)) 956 966 ); 957 967 ··· 991 1001 __field(u32, cl_boot) 992 1002 __field(u32, cl_id) 993 1003 __field(unsigned long, authflavor) 994 - __array(unsigned char, addr, sizeof(struct sockaddr_in6)) 1004 + __sockaddr(addr, clp->cl_cb_conn.cb_addrlen) 995 1005 __array(unsigned char, netid, 8) 996 1006 ), 997 1007 TP_fast_assign( ··· 999 1009 __entry->cl_id = clp->cl_clientid.cl_id; 1000 1010 strlcpy(__entry->netid, netid, sizeof(__entry->netid)); 1001 1011 __entry->authflavor = authflavor; 1002 - memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr, 1003 - sizeof(struct sockaddr_in6)); 1012 + __assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr, 1013 + clp->cl_cb_conn.cb_addrlen) 1004 1014 ), 1005 1015 TP_printk("addr=%pISpc client %08x:%08x proto=%s flavor=%s", 1006 - __entry->addr, __entry->cl_boot, __entry->cl_id, 1016 + __get_sockaddr(addr), __entry->cl_boot, __entry->cl_id, 1007 1017 __entry->netid, show_nfsd_authflavor(__entry->authflavor)) 1008 1018 ); 1009 1019 ··· 1017 1027 __field(long, error) 1018 1028 __field(u32, cl_boot) 1019 1029 __field(u32, cl_id) 1020 - __array(unsigned char, addr, sizeof(struct sockaddr_in6)) 1030 + __sockaddr(addr, clp->cl_cb_conn.cb_addrlen) 1021 1031 ), 1022 1032 TP_fast_assign( 1023 1033 __entry->error = error; 1024 1034 __entry->cl_boot = clp->cl_clientid.cl_boot; 1025 1035 __entry->cl_id = clp->cl_clientid.cl_id; 1026 - memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr, 1027 - sizeof(struct sockaddr_in6)); 1036 + __assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr, 1037 + clp->cl_cb_conn.cb_addrlen) 1028 1038 ), 1029 1039 TP_printk("addr=%pISpc client %08x:%08x error=%ld", 1030 - __entry->addr, __entry->cl_boot, __entry->cl_id, __entry->error) 1040 + __get_sockaddr(addr), __entry->cl_boot, __entry->cl_id, 1041 + __entry->error) 1031 1042 ); 1032 1043 1033 - TRACE_EVENT(nfsd_cb_recall, 1044 + TRACE_EVENT_CONDITION(nfsd_cb_recall, 1034 1045 TP_PROTO( 1035 1046 const struct nfs4_stid *stid 1036 1047 ), 1037 1048 TP_ARGS(stid), 1049 + TP_CONDITION(stid->sc_client), 1038 1050 TP_STRUCT__entry( 1039 1051 __field(u32, cl_boot) 1040 1052 __field(u32, cl_id) 1041 1053 __field(u32, si_id) 1042 1054 __field(u32, si_generation) 1043 - __array(unsigned char, addr, sizeof(struct sockaddr_in6)) 1055 + __sockaddr(addr, stid->sc_client->cl_cb_conn.cb_addrlen) 1044 1056 ), 1045 1057 TP_fast_assign( 1046 1058 const stateid_t *stp = &stid->sc_stateid; ··· 1052 1060 __entry->cl_id = stp->si_opaque.so_clid.cl_id; 1053 1061 __entry->si_id = stp->si_opaque.so_id; 1054 1062 __entry->si_generation = stp->si_generation; 1055 - if (clp) 1056 - memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr, 1057 - sizeof(struct sockaddr_in6)); 1058 - else 1059 - memset(__entry->addr, 0, sizeof(struct sockaddr_in6)); 1063 + __assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr, 1064 + clp->cl_cb_conn.cb_addrlen) 1060 1065 ), 1061 1066 TP_printk("addr=%pISpc client %08x:%08x stateid %08x:%08x", 1062 - __entry->addr, __entry->cl_boot, __entry->cl_id, 1067 + __get_sockaddr(addr), __entry->cl_boot, __entry->cl_id, 1063 1068 __entry->si_id, __entry->si_generation) 1064 1069 ); 1065 1070 ··· 1070 1081 __field(u32, cl_boot) 1071 1082 __field(u32, cl_id) 1072 1083 __field(u32, fh_hash) 1073 - __array(unsigned char, addr, sizeof(struct sockaddr_in6)) 1084 + __sockaddr(addr, lo->lo_owner.so_client->cl_cb_conn.cb_addrlen) 1074 1085 ), 1075 1086 TP_fast_assign( 1076 1087 const struct nfs4_client *clp = lo->lo_owner.so_client; ··· 1078 1089 __entry->cl_boot = clp->cl_clientid.cl_boot; 1079 1090 __entry->cl_id = clp->cl_clientid.cl_id; 1080 1091 __entry->fh_hash = knfsd_fh_hash(&nbl->nbl_fh); 1081 - memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr, 1082 - sizeof(struct sockaddr_in6)); 1092 + __assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr, 1093 + clp->cl_cb_conn.cb_addrlen) 1083 1094 ), 1084 1095 TP_printk("addr=%pISpc client %08x:%08x fh_hash=0x%08x", 1085 - __entry->addr, __entry->cl_boot, __entry->cl_id, 1096 + __get_sockaddr(addr), __entry->cl_boot, __entry->cl_id, 1086 1097 __entry->fh_hash) 1087 1098 ); 1088 1099 ··· 1103 1114 __field(u32, fh_hash) 1104 1115 __field(int, status) 1105 1116 __field(u64, count) 1106 - __array(unsigned char, addr, sizeof(struct sockaddr_in6)) 1117 + __sockaddr(addr, clp->cl_cb_conn.cb_addrlen) 1107 1118 ), 1108 1119 TP_fast_assign( 1109 1120 __entry->cl_boot = stp->si_opaque.so_clid.cl_boot; ··· 1113 1124 __entry->fh_hash = knfsd_fh_hash(fh); 1114 1125 __entry->status = be32_to_cpu(status); 1115 1126 __entry->count = count; 1116 - memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr, 1117 - sizeof(struct sockaddr_in6)); 1127 + __assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr, 1128 + clp->cl_cb_conn.cb_addrlen) 1118 1129 ), 1119 1130 TP_printk("addr=%pISpc client %08x:%08x stateid %08x:%08x fh_hash=0x%08x count=%llu status=%d", 1120 - __entry->addr, __entry->cl_boot, __entry->cl_id, 1131 + __get_sockaddr(addr), __entry->cl_boot, __entry->cl_id, 1121 1132 __entry->si_id, __entry->si_generation, 1122 1133 __entry->fh_hash, __entry->count, __entry->status) 1123 1134 );
-9
fs/nfsd/vfs.c
··· 32 32 #include <linux/writeback.h> 33 33 #include <linux/security.h> 34 34 35 - #ifdef CONFIG_NFSD_V3 36 35 #include "xdr3.h" 37 - #endif /* CONFIG_NFSD_V3 */ 38 36 39 37 #ifdef CONFIG_NFSD_V4 40 38 #include "../internal.h" ··· 606 608 } 607 609 #endif /* defined(CONFIG_NFSD_V4) */ 608 610 609 - #ifdef CONFIG_NFSD_V3 610 611 /* 611 612 * Check server access rights to a file system object 612 613 */ ··· 717 720 out: 718 721 return error; 719 722 } 720 - #endif /* CONFIG_NFSD_V3 */ 721 723 722 724 int nfsd_open_break_lease(struct inode *inode, int access) 723 725 { ··· 1109 1113 return err; 1110 1114 } 1111 1115 1112 - #ifdef CONFIG_NFSD_V3 1113 1116 /** 1114 1117 * nfsd_commit - Commit pending writes to stable storage 1115 1118 * @rqstp: RPC request being processed ··· 1185 1190 out: 1186 1191 return err; 1187 1192 } 1188 - #endif /* CONFIG_NFSD_V3 */ 1189 1193 1190 1194 static __be32 1191 1195 nfsd_create_setattr(struct svc_rqst *rqstp, struct svc_fh *resfhp, ··· 1374 1380 rdev, resfhp); 1375 1381 } 1376 1382 1377 - #ifdef CONFIG_NFSD_V3 1378 - 1379 1383 /* 1380 1384 * NFSv3 and NFSv4 version of nfsd_create 1381 1385 */ ··· 1539 1547 err = nfserrno(host_err); 1540 1548 goto out; 1541 1549 } 1542 - #endif /* CONFIG_NFSD_V3 */ 1543 1550 1544 1551 /* 1545 1552 * Read a symlink. On entry, *lenp must contain the maximum path length that
-2
fs/nfsd/vfs.h
··· 68 68 __be32 nfsd_create(struct svc_rqst *, struct svc_fh *, 69 69 char *name, int len, struct iattr *attrs, 70 70 int type, dev_t rdev, struct svc_fh *res); 71 - #ifdef CONFIG_NFSD_V3 72 71 __be32 nfsd_access(struct svc_rqst *, struct svc_fh *, u32 *, u32 *); 73 72 __be32 do_nfsd_create(struct svc_rqst *, struct svc_fh *, 74 73 char *name, int len, struct iattr *attrs, ··· 75 76 u32 *verifier, bool *truncp, bool *created); 76 77 __be32 nfsd_commit(struct svc_rqst *rqst, struct svc_fh *fhp, 77 78 u64 offset, u32 count, __be32 *verf); 78 - #endif /* CONFIG_NFSD_V3 */ 79 79 #ifdef CONFIG_NFSD_V4 80 80 __be32 nfsd_getxattr(struct svc_rqst *rqstp, struct svc_fh *fhp, 81 81 char *name, void **bufp, int *lenp);
+1 -1
fs/nfsd/xdr.h
··· 32 32 struct nfsd_writeargs { 33 33 svc_fh fh; 34 34 __u32 offset; 35 - int len; 35 + __u32 len; 36 36 struct xdr_buf payload; 37 37 }; 38 38
+4 -22
include/linux/sunrpc/svc.h
··· 52 52 unsigned long sp_flags; 53 53 } ____cacheline_aligned_in_smp; 54 54 55 - struct svc_serv; 56 - 57 - struct svc_serv_ops { 58 - /* Callback to use when last thread exits. */ 59 - void (*svo_shutdown)(struct svc_serv *, struct net *); 60 - 61 - /* function for service threads to run */ 62 - int (*svo_function)(void *); 63 - 64 - /* queue up a transport for servicing */ 65 - void (*svo_enqueue_xprt)(struct svc_xprt *); 66 - 67 - /* optional module to count when adding threads. 68 - * Thread function must call module_put_and_kthread_exit() to exit. 69 - */ 70 - struct module *svo_module; 71 - }; 72 - 73 55 /* 74 56 * RPC service. 75 57 * ··· 84 102 85 103 unsigned int sv_nrpools; /* number of thread pools */ 86 104 struct svc_pool * sv_pools; /* array of thread pools */ 87 - const struct svc_serv_ops *sv_ops; /* server operations */ 105 + int (*sv_threadfn)(void *data); 106 + 88 107 #if defined(CONFIG_SUNRPC_BACKCHANNEL) 89 108 struct list_head sv_cb_list; /* queue for callback requests 90 109 * that arrive over the same ··· 486 503 void svc_rpcb_cleanup(struct svc_serv *serv, struct net *net); 487 504 int svc_bind(struct svc_serv *serv, struct net *net); 488 505 struct svc_serv *svc_create(struct svc_program *, unsigned int, 489 - const struct svc_serv_ops *); 506 + int (*threadfn)(void *data)); 490 507 struct svc_rqst *svc_rqst_alloc(struct svc_serv *serv, 491 508 struct svc_pool *pool, int node); 492 509 void svc_rqst_replace_page(struct svc_rqst *rqstp, ··· 494 511 void svc_rqst_free(struct svc_rqst *); 495 512 void svc_exit_thread(struct svc_rqst *); 496 513 struct svc_serv * svc_create_pooled(struct svc_program *, unsigned int, 497 - const struct svc_serv_ops *); 514 + int (*threadfn)(void *data)); 498 515 int svc_set_num_threads(struct svc_serv *, struct svc_pool *, int); 499 516 int svc_pool_stats_open(struct svc_serv *serv, struct file *file); 500 - void svc_shutdown_net(struct svc_serv *, struct net *); 501 517 int svc_process(struct svc_rqst *); 502 518 int bc_svc_process(struct svc_serv *, struct rpc_rqst *, 503 519 struct svc_rqst *);
+7 -5
include/linux/sunrpc/svc_xprt.h
··· 28 28 void (*xpo_free)(struct svc_xprt *); 29 29 void (*xpo_secure_port)(struct svc_rqst *rqstp); 30 30 void (*xpo_kill_temp_xprt)(struct svc_xprt *); 31 + void (*xpo_start_tls)(struct svc_xprt *); 31 32 }; 32 33 33 34 struct svc_xprt_class { ··· 128 127 void svc_unreg_xprt_class(struct svc_xprt_class *); 129 128 void svc_xprt_init(struct net *, struct svc_xprt_class *, struct svc_xprt *, 130 129 struct svc_serv *); 131 - int svc_create_xprt(struct svc_serv *, const char *, struct net *, 132 - const int, const unsigned short, int, 133 - const struct cred *); 130 + int svc_xprt_create(struct svc_serv *serv, const char *xprt_name, 131 + struct net *net, const int family, 132 + const unsigned short port, int flags, 133 + const struct cred *cred); 134 + void svc_xprt_destroy_all(struct svc_serv *serv, struct net *net); 134 135 void svc_xprt_received(struct svc_xprt *xprt); 135 - void svc_xprt_do_enqueue(struct svc_xprt *xprt); 136 136 void svc_xprt_enqueue(struct svc_xprt *xprt); 137 137 void svc_xprt_put(struct svc_xprt *xprt); 138 138 void svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt); 139 - void svc_close_xprt(struct svc_xprt *xprt); 139 + void svc_xprt_close(struct svc_xprt *xprt); 140 140 int svc_port_is_privileged(struct sockaddr *sin); 141 141 int svc_print_xprts(char *buf, int maxlen); 142 142 struct svc_xprt *svc_find_xprt(struct svc_serv *serv, const char *xcl_name,
+2
include/linux/sunrpc/xdr.h
··· 731 731 732 732 if (unlikely(xdr_stream_decode_u32(xdr, &len) < 0)) 733 733 return -EBADMSG; 734 + if (len > SIZE_MAX / sizeof(*p)) 735 + return -EBADMSG; 734 736 p = xdr_inline_decode(xdr, len * sizeof(*p)); 735 737 if (unlikely(!p)) 736 738 return -EBADMSG;
+6
include/trace/bpf_probe.h
··· 21 21 #undef __get_bitmask 22 22 #define __get_bitmask(field) (char *)__get_dynamic_array(field) 23 23 24 + #undef __get_sockaddr 25 + #define __get_sockaddr(field) ((struct sockaddr *)__get_dynamic_array(field)) 26 + 24 27 #undef __get_rel_dynamic_array 25 28 #define __get_rel_dynamic_array(field) \ 26 29 ((void *)(&__entry->__rel_loc_##field) + \ ··· 39 36 40 37 #undef __get_rel_bitmask 41 38 #define __get_rel_bitmask(field) (char *)__get_rel_dynamic_array(field) 39 + 40 + #undef __get_rel_sockaddr 41 + #define __get_rel_sockaddr(field) ((struct sockaddr *)__get_rel_dynamic_array(field)) 42 42 43 43 #undef __perf_count 44 44 #define __perf_count(c) (c)
+152 -92
include/trace/events/sunrpc.h
··· 1625 1625 { SVC_PENDING, "SVC_PENDING" }, \ 1626 1626 { SVC_COMPLETE, "SVC_COMPLETE" }) 1627 1627 1628 + #define SVC_RQST_ENDPOINT_FIELDS(r) \ 1629 + __sockaddr(server, (r)->rq_xprt->xpt_locallen) \ 1630 + __sockaddr(client, (r)->rq_xprt->xpt_remotelen) \ 1631 + __field(unsigned int, netns_ino) \ 1632 + __field(u32, xid) 1633 + 1634 + #define SVC_RQST_ENDPOINT_ASSIGNMENTS(r) \ 1635 + do { \ 1636 + struct svc_xprt *xprt = (r)->rq_xprt; \ 1637 + __assign_sockaddr(server, &xprt->xpt_local, \ 1638 + xprt->xpt_locallen); \ 1639 + __assign_sockaddr(client, &xprt->xpt_remote, \ 1640 + xprt->xpt_remotelen); \ 1641 + __entry->netns_ino = xprt->xpt_net->ns.inum; \ 1642 + __entry->xid = be32_to_cpu((r)->rq_xid); \ 1643 + } while (0) 1644 + 1645 + #define SVC_RQST_ENDPOINT_FORMAT \ 1646 + "xid=0x%08x server=%pISpc client=%pISpc" 1647 + 1648 + #define SVC_RQST_ENDPOINT_VARARGS \ 1649 + __entry->xid, __get_sockaddr(server), __get_sockaddr(client) 1650 + 1628 1651 TRACE_EVENT(svc_authenticate, 1629 1652 TP_PROTO(const struct svc_rqst *rqst, int auth_res), 1630 1653 1631 1654 TP_ARGS(rqst, auth_res), 1632 1655 1633 1656 TP_STRUCT__entry( 1634 - __field(u32, xid) 1657 + SVC_RQST_ENDPOINT_FIELDS(rqst) 1658 + 1635 1659 __field(unsigned long, svc_status) 1636 1660 __field(unsigned long, auth_stat) 1637 1661 ), 1638 1662 1639 1663 TP_fast_assign( 1640 - __entry->xid = be32_to_cpu(rqst->rq_xid); 1664 + SVC_RQST_ENDPOINT_ASSIGNMENTS(rqst); 1665 + 1641 1666 __entry->svc_status = auth_res; 1642 1667 __entry->auth_stat = be32_to_cpu(rqst->rq_auth_stat); 1643 1668 ), 1644 1669 1645 - TP_printk("xid=0x%08x auth_res=%s auth_stat=%s", 1646 - __entry->xid, svc_show_status(__entry->svc_status), 1647 - rpc_show_auth_stat(__entry->auth_stat)) 1670 + TP_printk(SVC_RQST_ENDPOINT_FORMAT 1671 + " auth_res=%s auth_stat=%s", 1672 + SVC_RQST_ENDPOINT_VARARGS, 1673 + svc_show_status(__entry->svc_status), 1674 + rpc_show_auth_stat(__entry->auth_stat)) 1648 1675 ); 1649 1676 1650 1677 TRACE_EVENT(svc_process, ··· 1707 1680 ); 1708 1681 1709 1682 DECLARE_EVENT_CLASS(svc_rqst_event, 1710 - 1711 1683 TP_PROTO( 1712 1684 const struct svc_rqst *rqst 1713 1685 ), ··· 1714 1688 TP_ARGS(rqst), 1715 1689 1716 1690 TP_STRUCT__entry( 1717 - __field(u32, xid) 1691 + SVC_RQST_ENDPOINT_FIELDS(rqst) 1692 + 1718 1693 __field(unsigned long, flags) 1719 - __string(addr, rqst->rq_xprt->xpt_remotebuf) 1720 1694 ), 1721 1695 1722 1696 TP_fast_assign( 1723 - __entry->xid = be32_to_cpu(rqst->rq_xid); 1697 + SVC_RQST_ENDPOINT_ASSIGNMENTS(rqst); 1698 + 1724 1699 __entry->flags = rqst->rq_flags; 1725 - __assign_str(addr, rqst->rq_xprt->xpt_remotebuf); 1726 1700 ), 1727 1701 1728 - TP_printk("addr=%s xid=0x%08x flags=%s", 1729 - __get_str(addr), __entry->xid, 1730 - show_rqstp_flags(__entry->flags)) 1702 + TP_printk(SVC_RQST_ENDPOINT_FORMAT " flags=%s", 1703 + SVC_RQST_ENDPOINT_VARARGS, 1704 + show_rqstp_flags(__entry->flags)) 1731 1705 ); 1732 1706 #define DEFINE_SVC_RQST_EVENT(name) \ 1733 1707 DEFINE_EVENT(svc_rqst_event, svc_##name, \ ··· 1740 1714 DEFINE_SVC_RQST_EVENT(drop); 1741 1715 1742 1716 DECLARE_EVENT_CLASS(svc_rqst_status, 1743 - 1744 - TP_PROTO(struct svc_rqst *rqst, int status), 1717 + TP_PROTO( 1718 + const struct svc_rqst *rqst, 1719 + int status 1720 + ), 1745 1721 1746 1722 TP_ARGS(rqst, status), 1747 1723 1748 1724 TP_STRUCT__entry( 1749 - __field(u32, xid) 1725 + SVC_RQST_ENDPOINT_FIELDS(rqst) 1726 + 1750 1727 __field(int, status) 1751 1728 __field(unsigned long, flags) 1752 - __string(addr, rqst->rq_xprt->xpt_remotebuf) 1753 1729 ), 1754 1730 1755 1731 TP_fast_assign( 1756 - __entry->xid = be32_to_cpu(rqst->rq_xid); 1732 + SVC_RQST_ENDPOINT_ASSIGNMENTS(rqst); 1733 + 1757 1734 __entry->status = status; 1758 1735 __entry->flags = rqst->rq_flags; 1759 - __assign_str(addr, rqst->rq_xprt->xpt_remotebuf); 1760 1736 ), 1761 1737 1762 - TP_printk("addr=%s xid=0x%08x status=%d flags=%s", 1763 - __get_str(addr), __entry->xid, 1764 - __entry->status, show_rqstp_flags(__entry->flags)) 1738 + TP_printk(SVC_RQST_ENDPOINT_FORMAT " status=%d flags=%s", 1739 + SVC_RQST_ENDPOINT_VARARGS, 1740 + __entry->status, show_rqstp_flags(__entry->flags)) 1765 1741 ); 1766 1742 1767 1743 DEFINE_EVENT(svc_rqst_status, svc_send, 1768 - TP_PROTO(struct svc_rqst *rqst, int status), 1744 + TP_PROTO(const struct svc_rqst *rqst, int status), 1769 1745 TP_ARGS(rqst, status)); 1746 + 1747 + TRACE_EVENT(svc_stats_latency, 1748 + TP_PROTO( 1749 + const struct svc_rqst *rqst 1750 + ), 1751 + 1752 + TP_ARGS(rqst), 1753 + 1754 + TP_STRUCT__entry( 1755 + SVC_RQST_ENDPOINT_FIELDS(rqst) 1756 + 1757 + __field(unsigned long, execute) 1758 + __string(procedure, svc_proc_name(rqst)) 1759 + ), 1760 + 1761 + TP_fast_assign( 1762 + SVC_RQST_ENDPOINT_ASSIGNMENTS(rqst); 1763 + 1764 + __entry->execute = ktime_to_us(ktime_sub(ktime_get(), 1765 + rqst->rq_stime)); 1766 + __assign_str(procedure, svc_proc_name(rqst)); 1767 + ), 1768 + 1769 + TP_printk(SVC_RQST_ENDPOINT_FORMAT " proc=%s execute-us=%lu", 1770 + SVC_RQST_ENDPOINT_VARARGS, 1771 + __get_str(procedure), __entry->execute) 1772 + ); 1770 1773 1771 1774 #define show_svc_xprt_flags(flags) \ 1772 1775 __print_flags(flags, "|", \ ··· 1829 1774 __field(long, error) 1830 1775 __string(program, program) 1831 1776 __string(protocol, protocol) 1832 - __array(unsigned char, addr, sizeof(struct sockaddr_in6)) 1777 + __sockaddr(addr, salen) 1833 1778 ), 1834 1779 1835 1780 TP_fast_assign( 1836 1781 __entry->error = PTR_ERR(xprt); 1837 1782 __assign_str(program, program); 1838 1783 __assign_str(protocol, protocol); 1839 - memcpy(__entry->addr, sap, min(salen, sizeof(__entry->addr))); 1784 + __assign_sockaddr(addr, sap, salen); 1840 1785 ), 1841 1786 1842 1787 TP_printk("addr=%pISpc program=%s protocol=%s error=%ld", 1843 - __entry->addr, __get_str(program), __get_str(protocol), 1788 + __get_sockaddr(addr), __get_str(program), __get_str(protocol), 1844 1789 __entry->error) 1845 1790 ); 1846 1791 1792 + #define SVC_XPRT_ENDPOINT_FIELDS(x) \ 1793 + __sockaddr(server, (x)->xpt_locallen) \ 1794 + __sockaddr(client, (x)->xpt_remotelen) \ 1795 + __field(unsigned long, flags) \ 1796 + __field(unsigned int, netns_ino) 1797 + 1798 + #define SVC_XPRT_ENDPOINT_ASSIGNMENTS(x) \ 1799 + do { \ 1800 + __assign_sockaddr(server, &(x)->xpt_local, \ 1801 + (x)->xpt_locallen); \ 1802 + __assign_sockaddr(client, &(x)->xpt_remote, \ 1803 + (x)->xpt_remotelen); \ 1804 + __entry->flags = (x)->xpt_flags; \ 1805 + __entry->netns_ino = (x)->xpt_net->ns.inum; \ 1806 + } while (0) 1807 + 1808 + #define SVC_XPRT_ENDPOINT_FORMAT \ 1809 + "server=%pISpc client=%pISpc flags=%s" 1810 + 1811 + #define SVC_XPRT_ENDPOINT_VARARGS \ 1812 + __get_sockaddr(server), __get_sockaddr(client), \ 1813 + show_svc_xprt_flags(__entry->flags) 1814 + 1847 1815 TRACE_EVENT(svc_xprt_enqueue, 1848 - TP_PROTO(struct svc_xprt *xprt, struct svc_rqst *rqst), 1816 + TP_PROTO( 1817 + const struct svc_xprt *xprt, 1818 + const struct svc_rqst *rqst 1819 + ), 1849 1820 1850 1821 TP_ARGS(xprt, rqst), 1851 1822 1852 1823 TP_STRUCT__entry( 1824 + SVC_XPRT_ENDPOINT_FIELDS(xprt) 1825 + 1853 1826 __field(int, pid) 1854 - __field(unsigned long, flags) 1855 - __string(addr, xprt->xpt_remotebuf) 1856 1827 ), 1857 1828 1858 1829 TP_fast_assign( 1830 + SVC_XPRT_ENDPOINT_ASSIGNMENTS(xprt); 1831 + 1859 1832 __entry->pid = rqst? rqst->rq_task->pid : 0; 1860 - __entry->flags = xprt->xpt_flags; 1861 - __assign_str(addr, xprt->xpt_remotebuf); 1862 1833 ), 1863 1834 1864 - TP_printk("addr=%s pid=%d flags=%s", __get_str(addr), 1865 - __entry->pid, show_svc_xprt_flags(__entry->flags)) 1835 + TP_printk(SVC_XPRT_ENDPOINT_FORMAT " pid=%d", 1836 + SVC_XPRT_ENDPOINT_VARARGS, __entry->pid) 1837 + ); 1838 + 1839 + TRACE_EVENT(svc_xprt_dequeue, 1840 + TP_PROTO( 1841 + const struct svc_rqst *rqst 1842 + ), 1843 + 1844 + TP_ARGS(rqst), 1845 + 1846 + TP_STRUCT__entry( 1847 + SVC_XPRT_ENDPOINT_FIELDS(rqst->rq_xprt) 1848 + 1849 + __field(unsigned long, wakeup) 1850 + ), 1851 + 1852 + TP_fast_assign( 1853 + SVC_XPRT_ENDPOINT_ASSIGNMENTS(rqst->rq_xprt); 1854 + 1855 + __entry->wakeup = ktime_to_us(ktime_sub(ktime_get(), 1856 + rqst->rq_qtime)); 1857 + ), 1858 + 1859 + TP_printk(SVC_XPRT_ENDPOINT_FORMAT " wakeup-us=%lu", 1860 + SVC_XPRT_ENDPOINT_VARARGS, __entry->wakeup) 1866 1861 ); 1867 1862 1868 1863 DECLARE_EVENT_CLASS(svc_xprt_event, 1869 - TP_PROTO(struct svc_xprt *xprt), 1864 + TP_PROTO( 1865 + const struct svc_xprt *xprt 1866 + ), 1870 1867 1871 1868 TP_ARGS(xprt), 1872 1869 1873 1870 TP_STRUCT__entry( 1874 - __field(unsigned long, flags) 1875 - __string(addr, xprt->xpt_remotebuf) 1871 + SVC_XPRT_ENDPOINT_FIELDS(xprt) 1876 1872 ), 1877 1873 1878 1874 TP_fast_assign( 1879 - __entry->flags = xprt->xpt_flags; 1880 - __assign_str(addr, xprt->xpt_remotebuf); 1875 + SVC_XPRT_ENDPOINT_ASSIGNMENTS(xprt); 1881 1876 ), 1882 1877 1883 - TP_printk("addr=%s flags=%s", __get_str(addr), 1884 - show_svc_xprt_flags(__entry->flags)) 1878 + TP_printk(SVC_XPRT_ENDPOINT_FORMAT, SVC_XPRT_ENDPOINT_VARARGS) 1885 1879 ); 1886 1880 1887 1881 #define DEFINE_SVC_XPRT_EVENT(name) \ 1888 1882 DEFINE_EVENT(svc_xprt_event, svc_xprt_##name, \ 1889 1883 TP_PROTO( \ 1890 - struct svc_xprt *xprt \ 1884 + const struct svc_xprt *xprt \ 1891 1885 ), \ 1892 1886 TP_ARGS(xprt)) 1893 1887 ··· 1954 1850 TP_ARGS(xprt, service), 1955 1851 1956 1852 TP_STRUCT__entry( 1957 - __string(addr, xprt->xpt_remotebuf) 1853 + SVC_XPRT_ENDPOINT_FIELDS(xprt) 1854 + 1958 1855 __string(protocol, xprt->xpt_class->xcl_name) 1959 1856 __string(service, service) 1960 1857 ), 1961 1858 1962 1859 TP_fast_assign( 1963 - __assign_str(addr, xprt->xpt_remotebuf); 1860 + SVC_XPRT_ENDPOINT_ASSIGNMENTS(xprt); 1861 + 1964 1862 __assign_str(protocol, xprt->xpt_class->xcl_name); 1965 1863 __assign_str(service, service); 1966 1864 ), 1967 1865 1968 - TP_printk("addr=%s protocol=%s service=%s", 1969 - __get_str(addr), __get_str(protocol), __get_str(service) 1866 + TP_printk(SVC_XPRT_ENDPOINT_FORMAT " protocol=%s service=%s", 1867 + SVC_XPRT_ENDPOINT_VARARGS, 1868 + __get_str(protocol), __get_str(service) 1970 1869 ) 1971 - ); 1972 - 1973 - TRACE_EVENT(svc_xprt_dequeue, 1974 - TP_PROTO(struct svc_rqst *rqst), 1975 - 1976 - TP_ARGS(rqst), 1977 - 1978 - TP_STRUCT__entry( 1979 - __field(unsigned long, flags) 1980 - __field(unsigned long, wakeup) 1981 - __string(addr, rqst->rq_xprt->xpt_remotebuf) 1982 - ), 1983 - 1984 - TP_fast_assign( 1985 - __entry->flags = rqst->rq_xprt->xpt_flags; 1986 - __entry->wakeup = ktime_to_us(ktime_sub(ktime_get(), 1987 - rqst->rq_qtime)); 1988 - __assign_str(addr, rqst->rq_xprt->xpt_remotebuf); 1989 - ), 1990 - 1991 - TP_printk("addr=%s flags=%s wakeup-us=%lu", __get_str(addr), 1992 - show_svc_xprt_flags(__entry->flags), __entry->wakeup) 1993 1870 ); 1994 1871 1995 1872 TRACE_EVENT(svc_wake_up, ··· 2005 1920 ), 2006 1921 2007 1922 TP_printk("pages=%u", __entry->pages) 2008 - ); 2009 - 2010 - TRACE_EVENT(svc_stats_latency, 2011 - TP_PROTO(const struct svc_rqst *rqst), 2012 - 2013 - TP_ARGS(rqst), 2014 - 2015 - TP_STRUCT__entry( 2016 - __field(u32, xid) 2017 - __field(unsigned long, execute) 2018 - __string(procedure, svc_proc_name(rqst)) 2019 - __string(addr, rqst->rq_xprt->xpt_remotebuf) 2020 - ), 2021 - 2022 - TP_fast_assign( 2023 - __entry->xid = be32_to_cpu(rqst->rq_xid); 2024 - __entry->execute = ktime_to_us(ktime_sub(ktime_get(), 2025 - rqst->rq_stime)); 2026 - __assign_str(procedure, svc_proc_name(rqst)); 2027 - __assign_str(addr, rqst->rq_xprt->xpt_remotebuf); 2028 - ), 2029 - 2030 - TP_printk("addr=%s xid=0x%08x proc=%s execute-us=%lu", 2031 - __get_str(addr), __entry->xid, __get_str(procedure), 2032 - __entry->execute) 2033 1923 ); 2034 1924 2035 1925 DECLARE_EVENT_CLASS(svc_deferred_event,
+6
include/trace/perf.h
··· 21 21 #undef __get_bitmask 22 22 #define __get_bitmask(field) (char *)__get_dynamic_array(field) 23 23 24 + #undef __get_sockaddr 25 + #define __get_sockaddr(field) ((struct sockaddr *)__get_dynamic_array(field)) 26 + 24 27 #undef __get_rel_dynamic_array 25 28 #define __get_rel_dynamic_array(field) \ 26 29 ((void *)__entry + \ ··· 40 37 41 38 #undef __get_rel_bitmask 42 39 #define __get_rel_bitmask(field) (char *)__get_rel_dynamic_array(field) 40 + 41 + #undef __get_rel_sockaddr 42 + #define __get_rel_sockaddr(field) ((struct sockaddr *)__get_rel_dynamic_array(field)) 43 43 44 44 #undef __perf_count 45 45 #define __perf_count(c) (__count = (c))
+53 -2
include/trace/trace_events.h
··· 108 108 #undef __bitmask 109 109 #define __bitmask(item, nr_bits) __dynamic_array(char, item, -1) 110 110 111 + #undef __sockaddr 112 + #define __sockaddr(field, len) __dynamic_array(u8, field, len) 113 + 111 114 #undef __rel_dynamic_array 112 115 #define __rel_dynamic_array(type, item, len) u32 __rel_loc_##item; 113 116 ··· 122 119 123 120 #undef __rel_bitmask 124 121 #define __rel_bitmask(item, nr_bits) __rel_dynamic_array(char, item, -1) 122 + 123 + #undef __rel_sockaddr 124 + #define __rel_sockaddr(field, len) __rel_dynamic_array(u8, field, len) 125 125 126 126 #undef TP_STRUCT__entry 127 127 #define TP_STRUCT__entry(args...) args ··· 218 212 #undef __string 219 213 #define __string(item, src) __dynamic_array(char, item, -1) 220 214 215 + #undef __string_len 216 + #define __string_len(item, src, len) __dynamic_array(char, item, -1) 217 + 221 218 #undef __bitmask 222 219 #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1) 223 220 224 - #undef __string_len 225 - #define __string_len(item, src, len) __dynamic_array(char, item, -1) 221 + #undef __sockaddr 222 + #define __sockaddr(field, len) __dynamic_array(u8, field, len) 226 223 227 224 #undef __rel_dynamic_array 228 225 #define __rel_dynamic_array(type, item, len) u32 item; ··· 238 229 239 230 #undef __rel_bitmask 240 231 #define __rel_bitmask(item, nr_bits) __rel_dynamic_array(unsigned long, item, -1) 232 + 233 + #undef __rel_sockaddr 234 + #define __rel_sockaddr(field, len) __rel_dynamic_array(u8, field, len) 241 235 242 236 #undef DECLARE_EVENT_CLASS 243 237 #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ ··· 360 348 __bitmask_size = __get_rel_dynamic_array_len(field); \ 361 349 trace_print_bitmask_seq(p, __bitmask, __bitmask_size); \ 362 350 }) 351 + 352 + #undef __get_sockaddr 353 + #define __get_sockaddr(field) ((struct sockaddr *)__get_dynamic_array(field)) 354 + 355 + #undef __get_rel_sockaddr 356 + #define __get_rel_sockaddr(field) ((struct sockaddr *)__get_rel_dynamic_array(field)) 363 357 364 358 #undef __print_flags 365 359 #define __print_flags(flag, delim, flag_array...) \ ··· 536 518 #undef __bitmask 537 519 #define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1) 538 520 521 + #undef __sockaddr 522 + #define __sockaddr(field, len) __dynamic_array(u8, field, len) 523 + 539 524 #undef __rel_dynamic_array 540 525 #define __rel_dynamic_array(_type, _item, _len) { \ 541 526 .type = "__rel_loc " #_type "[]", .name = #_item, \ ··· 553 532 554 533 #undef __rel_bitmask 555 534 #define __rel_bitmask(item, nr_bits) __rel_dynamic_array(unsigned long, item, -1) 535 + 536 + #undef __rel_sockaddr 537 + #define __rel_sockaddr(field, len) __rel_dynamic_array(u8, field, len) 556 538 557 539 #undef DECLARE_EVENT_CLASS 558 540 #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, func, print) \ ··· 647 623 #undef __rel_bitmask 648 624 #define __rel_bitmask(item, nr_bits) __rel_dynamic_array(unsigned long, item, \ 649 625 __bitmask_size_in_longs(nr_bits)) 626 + 627 + #undef __sockaddr 628 + #define __sockaddr(field, len) __dynamic_array(u8, field, len) 629 + 630 + #undef __rel_sockaddr 631 + #define __rel_sockaddr(field, len) __rel_dynamic_array(u8, field, len) 650 632 651 633 #undef DECLARE_EVENT_CLASS 652 634 #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ ··· 818 788 #define __assign_bitmask(dst, src, nr_bits) \ 819 789 memcpy(__get_bitmask(dst), (src), __bitmask_size_in_bytes(nr_bits)) 820 790 791 + #undef __sockaddr 792 + #define __sockaddr(field, len) __dynamic_array(u8, field, len) 793 + 794 + #undef __get_sockaddr 795 + #define __get_sockaddr(field) ((struct sockaddr *)__get_dynamic_array(field)) 796 + 797 + #define __assign_sockaddr(dest, src, len) \ 798 + memcpy(__get_dynamic_array(dest), src, len) 799 + 821 800 #undef __rel_dynamic_array 822 801 #define __rel_dynamic_array(type, item, len) \ 823 802 __entry->__rel_loc_##item = __data_offsets.item; ··· 857 818 #undef __assign_rel_bitmask 858 819 #define __assign_rel_bitmask(dst, src, nr_bits) \ 859 820 memcpy(__get_rel_bitmask(dst), (src), __bitmask_size_in_bytes(nr_bits)) 821 + 822 + #undef __rel_sockaddr 823 + #define __rel_sockaddr(field, len) __rel_dynamic_array(u8, field, len) 824 + 825 + #undef __get_rel_sockaddr 826 + #define __get_rel_sockaddr(field) ((struct sockaddr *)__get_rel_dynamic_array(field)) 827 + 828 + #define __assign_rel_sockaddr(dest, src, len) \ 829 + memcpy(__get_rel_dynamic_array(dest), src, len) 830 + 860 831 861 832 #undef TP_fast_assign 862 833 #define TP_fast_assign(args...) args ··· 932 883 #undef __get_dynamic_array_len 933 884 #undef __get_str 934 885 #undef __get_bitmask 886 + #undef __get_sockaddr 935 887 #undef __get_rel_dynamic_array 936 888 #undef __get_rel_dynamic_array_len 937 889 #undef __get_rel_str 938 890 #undef __get_rel_bitmask 891 + #undef __get_rel_sockaddr 939 892 #undef __print_array 940 893 #undef __print_hex_dump 941 894
+1 -1
kernel/module.c
··· 335 335 336 336 /* 337 337 * A thread that wants to hold a reference to a module only while it 338 - * is running can call this to safely exit. nfsd and lockd use this. 338 + * is running can call this to safely exit. 339 339 */ 340 340 void __noreturn __module_put_and_kthread_exit(struct module *mod, long code) 341 341 {
+6
kernel/trace/trace_events.c
··· 384 384 if (!(dereference_flags & (1ULL << arg))) 385 385 goto next_arg; 386 386 387 + /* Check for __get_sockaddr */; 388 + if (str_has_prefix(fmt + i, "__get_sockaddr(")) { 389 + dereference_flags &= ~(1ULL << arg); 390 + goto next_arg; 391 + } 392 + 387 393 /* Find the REC-> in the argument */ 388 394 c = strchr(fmt + i, ','); 389 395 r = strstr(fmt + i, "REC->");
+27 -23
net/sunrpc/svc.c
··· 448 448 */ 449 449 static struct svc_serv * 450 450 __svc_create(struct svc_program *prog, unsigned int bufsize, int npools, 451 - const struct svc_serv_ops *ops) 451 + int (*threadfn)(void *data)) 452 452 { 453 453 struct svc_serv *serv; 454 454 unsigned int vers; ··· 465 465 bufsize = RPCSVC_MAXPAYLOAD; 466 466 serv->sv_max_payload = bufsize? bufsize : 4096; 467 467 serv->sv_max_mesg = roundup(serv->sv_max_payload + PAGE_SIZE, PAGE_SIZE); 468 - serv->sv_ops = ops; 468 + serv->sv_threadfn = threadfn; 469 469 xdrsize = 0; 470 470 while (prog) { 471 471 prog->pg_lovers = prog->pg_nvers-1; ··· 511 511 return serv; 512 512 } 513 513 514 - struct svc_serv * 515 - svc_create(struct svc_program *prog, unsigned int bufsize, 516 - const struct svc_serv_ops *ops) 514 + /** 515 + * svc_create - Create an RPC service 516 + * @prog: the RPC program the new service will handle 517 + * @bufsize: maximum message size for @prog 518 + * @threadfn: a function to service RPC requests for @prog 519 + * 520 + * Returns an instantiated struct svc_serv object or NULL. 521 + */ 522 + struct svc_serv *svc_create(struct svc_program *prog, unsigned int bufsize, 523 + int (*threadfn)(void *data)) 517 524 { 518 - return __svc_create(prog, bufsize, /*npools*/1, ops); 525 + return __svc_create(prog, bufsize, 1, threadfn); 519 526 } 520 527 EXPORT_SYMBOL_GPL(svc_create); 521 528 522 - struct svc_serv * 523 - svc_create_pooled(struct svc_program *prog, unsigned int bufsize, 524 - const struct svc_serv_ops *ops) 529 + /** 530 + * svc_create_pooled - Create an RPC service with pooled threads 531 + * @prog: the RPC program the new service will handle 532 + * @bufsize: maximum message size for @prog 533 + * @threadfn: a function to service RPC requests for @prog 534 + * 535 + * Returns an instantiated struct svc_serv object or NULL. 536 + */ 537 + struct svc_serv *svc_create_pooled(struct svc_program *prog, 538 + unsigned int bufsize, 539 + int (*threadfn)(void *data)) 525 540 { 526 541 struct svc_serv *serv; 527 542 unsigned int npools = svc_pool_map_get(); 528 543 529 - serv = __svc_create(prog, bufsize, npools, ops); 544 + serv = __svc_create(prog, bufsize, npools, threadfn); 530 545 if (!serv) 531 546 goto out_err; 532 547 return serv; ··· 550 535 return NULL; 551 536 } 552 537 EXPORT_SYMBOL_GPL(svc_create_pooled); 553 - 554 - void svc_shutdown_net(struct svc_serv *serv, struct net *net) 555 - { 556 - svc_close_net(serv, net); 557 - 558 - if (serv->sv_ops->svo_shutdown) 559 - serv->sv_ops->svo_shutdown(serv, net); 560 - } 561 - EXPORT_SYMBOL_GPL(svc_shutdown_net); 562 538 563 539 /* 564 540 * Destroy an RPC service. Should be called with appropriate locking to ··· 751 745 if (IS_ERR(rqstp)) 752 746 return PTR_ERR(rqstp); 753 747 754 - __module_get(serv->sv_ops->svo_module); 755 - task = kthread_create_on_node(serv->sv_ops->svo_function, rqstp, 748 + task = kthread_create_on_node(serv->sv_threadfn, rqstp, 756 749 node, "%s", serv->sv_name); 757 750 if (IS_ERR(task)) { 758 - module_put(serv->sv_ops->svo_module); 759 751 svc_exit_thread(rqstp); 760 752 return PTR_ERR(task); 761 753 } ··· 1359 1355 svc_authorise(rqstp); 1360 1356 close_xprt: 1361 1357 if (rqstp->rq_xprt && test_bit(XPT_TEMP, &rqstp->rq_xprt->xpt_flags)) 1362 - svc_close_xprt(rqstp->rq_xprt); 1358 + svc_xprt_close(rqstp->rq_xprt); 1363 1359 dprintk("svc: svc_process close\n"); 1364 1360 return 0; 1365 1361
+43 -25
net/sunrpc/svc_xprt.c
··· 266 266 } 267 267 268 268 /* As soon as we clear busy, the xprt could be closed and 269 - * 'put', so we need a reference to call svc_enqueue_xprt with: 269 + * 'put', so we need a reference to call svc_xprt_enqueue with: 270 270 */ 271 271 svc_xprt_get(xprt); 272 272 smp_mb__before_atomic(); 273 273 clear_bit(XPT_BUSY, &xprt->xpt_flags); 274 - xprt->xpt_server->sv_ops->svo_enqueue_xprt(xprt); 274 + svc_xprt_enqueue(xprt); 275 275 svc_xprt_put(xprt); 276 276 } 277 277 EXPORT_SYMBOL_GPL(svc_xprt_received); ··· 285 285 svc_xprt_received(new); 286 286 } 287 287 288 - static int _svc_create_xprt(struct svc_serv *serv, const char *xprt_name, 288 + static int _svc_xprt_create(struct svc_serv *serv, const char *xprt_name, 289 289 struct net *net, const int family, 290 290 const unsigned short port, int flags, 291 291 const struct cred *cred) ··· 321 321 return -EPROTONOSUPPORT; 322 322 } 323 323 324 - int svc_create_xprt(struct svc_serv *serv, const char *xprt_name, 324 + /** 325 + * svc_xprt_create - Add a new listener to @serv 326 + * @serv: target RPC service 327 + * @xprt_name: transport class name 328 + * @net: network namespace 329 + * @family: network address family 330 + * @port: listener port 331 + * @flags: SVC_SOCK flags 332 + * @cred: credential to bind to this transport 333 + * 334 + * Return values: 335 + * %0: New listener added successfully 336 + * %-EPROTONOSUPPORT: Requested transport type not supported 337 + */ 338 + int svc_xprt_create(struct svc_serv *serv, const char *xprt_name, 325 339 struct net *net, const int family, 326 340 const unsigned short port, int flags, 327 341 const struct cred *cred) 328 342 { 329 343 int err; 330 344 331 - err = _svc_create_xprt(serv, xprt_name, net, family, port, flags, cred); 345 + err = _svc_xprt_create(serv, xprt_name, net, family, port, flags, cred); 332 346 if (err == -EPROTONOSUPPORT) { 333 347 request_module("svc%s", xprt_name); 334 - err = _svc_create_xprt(serv, xprt_name, net, family, port, flags, cred); 348 + err = _svc_xprt_create(serv, xprt_name, net, family, port, flags, cred); 335 349 } 336 350 return err; 337 351 } 338 - EXPORT_SYMBOL_GPL(svc_create_xprt); 352 + EXPORT_SYMBOL_GPL(svc_xprt_create); 339 353 340 354 /* 341 355 * Copy the local and remote xprt addresses to the rqstp structure ··· 425 411 smp_rmb(); 426 412 xpt_flags = READ_ONCE(xprt->xpt_flags); 427 413 414 + if (xpt_flags & BIT(XPT_BUSY)) 415 + return false; 428 416 if (xpt_flags & (BIT(XPT_CONN) | BIT(XPT_CLOSE))) 429 417 return true; 430 418 if (xpt_flags & (BIT(XPT_DATA) | BIT(XPT_DEFERRED))) { ··· 439 423 return false; 440 424 } 441 425 442 - void svc_xprt_do_enqueue(struct svc_xprt *xprt) 426 + /** 427 + * svc_xprt_enqueue - Queue a transport on an idle nfsd thread 428 + * @xprt: transport with data pending 429 + * 430 + */ 431 + void svc_xprt_enqueue(struct svc_xprt *xprt) 443 432 { 444 433 struct svc_pool *pool; 445 434 struct svc_rqst *rqstp = NULL; ··· 487 466 rcu_read_unlock(); 488 467 put_cpu(); 489 468 trace_svc_xprt_enqueue(xprt, rqstp); 490 - } 491 - EXPORT_SYMBOL_GPL(svc_xprt_do_enqueue); 492 - 493 - /* 494 - * Queue up a transport with data pending. If there are idle nfsd 495 - * processes, wake 'em up. 496 - * 497 - */ 498 - void svc_xprt_enqueue(struct svc_xprt *xprt) 499 - { 500 - if (test_bit(XPT_BUSY, &xprt->xpt_flags)) 501 - return; 502 - xprt->xpt_server->sv_ops->svo_enqueue_xprt(xprt); 503 469 } 504 470 EXPORT_SYMBOL_GPL(svc_xprt_enqueue); 505 471 ··· 1068 1060 svc_xprt_put(xprt); 1069 1061 } 1070 1062 1071 - void svc_close_xprt(struct svc_xprt *xprt) 1063 + /** 1064 + * svc_xprt_close - Close a client connection 1065 + * @xprt: transport to disconnect 1066 + * 1067 + */ 1068 + void svc_xprt_close(struct svc_xprt *xprt) 1072 1069 { 1073 1070 trace_svc_xprt_close(xprt); 1074 1071 set_bit(XPT_CLOSE, &xprt->xpt_flags); ··· 1088 1075 */ 1089 1076 svc_delete_xprt(xprt); 1090 1077 } 1091 - EXPORT_SYMBOL_GPL(svc_close_xprt); 1078 + EXPORT_SYMBOL_GPL(svc_xprt_close); 1092 1079 1093 1080 static int svc_close_list(struct svc_serv *serv, struct list_head *xprt_list, struct net *net) 1094 1081 { ··· 1140 1127 } 1141 1128 } 1142 1129 1143 - /* 1130 + /** 1131 + * svc_xprt_destroy_all - Destroy transports associated with @serv 1132 + * @serv: RPC service to be shut down 1133 + * @net: target network namespace 1134 + * 1144 1135 * Server threads may still be running (especially in the case where the 1145 1136 * service is still running in other network namespaces). 1146 1137 * ··· 1156 1139 * threads, we may need to wait a little while and then check again to 1157 1140 * see if they're done. 1158 1141 */ 1159 - void svc_close_net(struct svc_serv *serv, struct net *net) 1142 + void svc_xprt_destroy_all(struct svc_serv *serv, struct net *net) 1160 1143 { 1161 1144 int delay = 0; 1162 1145 ··· 1167 1150 msleep(delay++); 1168 1151 } 1169 1152 } 1153 + EXPORT_SYMBOL_GPL(svc_xprt_destroy_all); 1170 1154 1171 1155 /* 1172 1156 * Handle defer and revisit of requests
+2
net/sunrpc/svcauth.c
··· 31 31 */ 32 32 extern struct auth_ops svcauth_null; 33 33 extern struct auth_ops svcauth_unix; 34 + extern struct auth_ops svcauth_tls; 34 35 35 36 static struct auth_ops __rcu *authtab[RPC_AUTH_MAXFLAVOR] = { 36 37 [RPC_AUTH_NULL] = (struct auth_ops __force __rcu *)&svcauth_null, 37 38 [RPC_AUTH_UNIX] = (struct auth_ops __force __rcu *)&svcauth_unix, 39 + [RPC_AUTH_TLS] = (struct auth_ops __force __rcu *)&svcauth_tls, 38 40 }; 39 41 40 42 static struct auth_ops *
+60
net/sunrpc/svcauth_unix.c
··· 37 37 38 38 extern struct auth_ops svcauth_null; 39 39 extern struct auth_ops svcauth_unix; 40 + extern struct auth_ops svcauth_tls; 40 41 41 42 static void svcauth_unix_domain_release_rcu(struct rcu_head *head) 42 43 { ··· 784 783 .owner = THIS_MODULE, 785 784 .flavour = RPC_AUTH_NULL, 786 785 .accept = svcauth_null_accept, 786 + .release = svcauth_null_release, 787 + .set_client = svcauth_unix_set_client, 788 + }; 789 + 790 + 791 + static int 792 + svcauth_tls_accept(struct svc_rqst *rqstp) 793 + { 794 + struct svc_cred *cred = &rqstp->rq_cred; 795 + struct kvec *argv = rqstp->rq_arg.head; 796 + struct kvec *resv = rqstp->rq_res.head; 797 + 798 + if (argv->iov_len < XDR_UNIT * 3) 799 + return SVC_GARBAGE; 800 + 801 + /* Call's cred length */ 802 + if (svc_getu32(argv) != xdr_zero) { 803 + rqstp->rq_auth_stat = rpc_autherr_badcred; 804 + return SVC_DENIED; 805 + } 806 + 807 + /* Call's verifier flavor and its length */ 808 + if (svc_getu32(argv) != rpc_auth_null || 809 + svc_getu32(argv) != xdr_zero) { 810 + rqstp->rq_auth_stat = rpc_autherr_badverf; 811 + return SVC_DENIED; 812 + } 813 + 814 + /* AUTH_TLS is not valid on non-NULL procedures */ 815 + if (rqstp->rq_proc != 0) { 816 + rqstp->rq_auth_stat = rpc_autherr_badcred; 817 + return SVC_DENIED; 818 + } 819 + 820 + /* Mapping to nobody uid/gid is required */ 821 + cred->cr_uid = INVALID_UID; 822 + cred->cr_gid = INVALID_GID; 823 + cred->cr_group_info = groups_alloc(0); 824 + if (cred->cr_group_info == NULL) 825 + return SVC_CLOSE; /* kmalloc failure - client must retry */ 826 + 827 + /* Reply's verifier */ 828 + svc_putnl(resv, RPC_AUTH_NULL); 829 + if (rqstp->rq_xprt->xpt_ops->xpo_start_tls) { 830 + svc_putnl(resv, 8); 831 + memcpy(resv->iov_base + resv->iov_len, "STARTTLS", 8); 832 + resv->iov_len += 8; 833 + } else 834 + svc_putnl(resv, 0); 835 + 836 + rqstp->rq_cred.cr_flavor = RPC_AUTH_TLS; 837 + return SVC_OK; 838 + } 839 + 840 + struct auth_ops svcauth_tls = { 841 + .name = "tls", 842 + .owner = THIS_MODULE, 843 + .flavour = RPC_AUTH_TLS, 844 + .accept = svcauth_tls_accept, 787 845 .release = svcauth_null_release, 788 846 .set_client = svcauth_unix_set_client, 789 847 };
+1 -1
net/sunrpc/xprtrdma/svc_rdma_backchannel.c
··· 198 198 199 199 ret = rpcrdma_bc_send_request(rdma, rqst); 200 200 if (ret == -ENOTCONN) 201 - svc_close_xprt(sxprt); 201 + svc_xprt_close(sxprt); 202 202 return ret; 203 203 } 204 204