mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-28 06:34:12 +08:00
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 -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEKLLlsBKG3yQ88j7+M2qzM29mf5cFAmI3XNkACgkQM2qzM29m f5dNERAAqJ/nzfVp2H5BKLszJ7p/s13wFqbW719Rzymzl6/tUUHOqIsVdBsJsa/b BdZQLLDwa6ZB5zOAnC6FosRKYu4lwixOOf94pC6a9ZDD/glYVKF8mZG+RZXPAy16 g3JUOi/bcyHXv0ZUhbv7DqW+HHM+owPP4vlNJ9ChiiLr/Xdp8NBKj+4Qtn/wcAo+ Xuvx7fU/5Mbemh+dd5mWker4afHvpt9V6U6s04m5LiTPPnHVnxmeyekJGUCOY0QO cm/6SPNDqyn/VEfM/SRxEnLE9QcHRhZo/4PKRGF4wYolcviIogbILE1M7Ig/r/Gv 6Du2kcRAhyZ3zgWnu799Ivn3Q6IrVjxZwqmsi7YHURTwYKyZtxYsUk0MCBcpnxrE WyTS2onpElbMop3viKCnQdpIetbsHnUNg3udUV6ugbdCbnZuhUw5B/d6x0o8ZWDE C0f+jnX+GnBstn0vkcj2H0+VQTd5hUJtXMrooI42ODJoboQRZcmePwoXjqCmw3sy PXTxLZC/5+4zNHGUuz4Pq4V7FKr4nHhDzaW4ZDO3mILx4ahceotulY1B/yoBUu8o /LAhu2kJ6nFQkmpzdrGzPeOstgJYHm9CaitRvMzg+NJxEAJdebypdQDbX5iNpgfW MDXH4n8eIqroTlQ/mQYEV0EbC7BaTqSCL6rQdcrcFUPu9n4Fcno= =5nac -----END PGP SIGNATURE----- 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 ...
This commit is contained in:
commit
14705fda8f
@ -438,13 +438,13 @@ prototypes::
|
||||
locking rules:
|
||||
|
||||
====================== ============= ================= =========
|
||||
ops inode->i_lock blocked_lock_lock may block
|
||||
ops flc_lock blocked_lock_lock may block
|
||||
====================== ============= ================= =========
|
||||
lm_notify: yes yes no
|
||||
lm_notify: no yes no
|
||||
lm_grant: no no no
|
||||
lm_break: yes no no
|
||||
lm_change yes no no
|
||||
lm_breaker_owns_lease: no no no
|
||||
lm_breaker_owns_lease: yes no no
|
||||
====================== ============= ================= =========
|
||||
|
||||
buffer_head
|
||||
|
@ -62,7 +62,6 @@ CONFIG_TMPFS=y
|
||||
CONFIG_NFS_FS=m
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
|
@ -258,7 +258,6 @@ CONFIG_MINIX_FS=m
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ASCII=m
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
|
@ -309,7 +309,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NFSD_V3_ACL=y
|
||||
CONFIG_SMB_FS=m
|
||||
CONFIG_CIFS=m
|
||||
|
@ -283,7 +283,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NFSD_V3_ACL=y
|
||||
CONFIG_SMB_FS=m
|
||||
CONFIG_CIFS=m
|
||||
|
@ -79,7 +79,6 @@ CONFIG_CRAMFS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
|
@ -94,7 +94,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
|
@ -213,7 +213,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NFSD_V3_ACL=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
|
@ -59,7 +59,6 @@ CONFIG_CRAMFS=m
|
||||
CONFIG_NFS_FS=m
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_CODEPAGE_437=m
|
||||
CONFIG_NLS_CODEPAGE_850=m
|
||||
|
@ -71,7 +71,6 @@ CONFIG_NFS_V3=y
|
||||
CONFIG_NFS_V4=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_SMB_FS=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
|
@ -86,7 +86,6 @@ CONFIG_ROMFS_FS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NLS_CODEPAGE_850=m
|
||||
CONFIG_NLS_ISO8859_1=m
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
|
@ -145,7 +145,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_NLS_CODEPAGE_437=m
|
||||
CONFIG_NLS_CODEPAGE_850=m
|
||||
|
@ -160,7 +160,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_NLS_CODEPAGE_437=m
|
||||
CONFIG_NLS_CODEPAGE_850=m
|
||||
|
@ -106,7 +106,6 @@ CONFIG_HUGETLBFS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V4=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_CODEPAGE_737=y
|
||||
CONFIG_NLS_CODEPAGE_775=y
|
||||
|
@ -498,7 +498,6 @@ CONFIG_NFS_V4=m
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS2 is not set
|
||||
# CONFIG_CIFS_DEBUG is not set
|
||||
|
@ -455,7 +455,6 @@ CONFIG_NFS_V4=m
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS2 is not set
|
||||
# CONFIG_CIFS_DEBUG is not set
|
||||
|
@ -475,7 +475,6 @@ CONFIG_NFS_V4=m
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS2 is not set
|
||||
# CONFIG_CIFS_DEBUG is not set
|
||||
|
@ -447,7 +447,6 @@ CONFIG_NFS_V4=m
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS2 is not set
|
||||
# CONFIG_CIFS_DEBUG is not set
|
||||
|
@ -457,7 +457,6 @@ CONFIG_NFS_V4=m
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS2 is not set
|
||||
# CONFIG_CIFS_DEBUG is not set
|
||||
|
@ -477,7 +477,6 @@ CONFIG_NFS_V4=m
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS2 is not set
|
||||
# CONFIG_CIFS_DEBUG is not set
|
||||
|
@ -563,7 +563,6 @@ CONFIG_NFS_V4=m
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS2 is not set
|
||||
# CONFIG_CIFS_DEBUG is not set
|
||||
|
@ -446,7 +446,6 @@ CONFIG_NFS_V4=m
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS2 is not set
|
||||
# CONFIG_CIFS_DEBUG is not set
|
||||
|
@ -447,7 +447,6 @@ CONFIG_NFS_V4=m
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS2 is not set
|
||||
# CONFIG_CIFS_DEBUG is not set
|
||||
|
@ -464,7 +464,6 @@ CONFIG_NFS_V4=m
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS2 is not set
|
||||
# CONFIG_CIFS_DEBUG is not set
|
||||
|
@ -446,7 +446,6 @@ CONFIG_NFS_V4=m
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS2 is not set
|
||||
# CONFIG_CIFS_DEBUG is not set
|
||||
|
@ -445,7 +445,6 @@ CONFIG_NFS_V4=m
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS2 is not set
|
||||
# CONFIG_CIFS_DEBUG is not set
|
||||
|
@ -69,6 +69,5 @@ CONFIG_CONFIGFS_FS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NFSD_V3_ACL=y
|
||||
CONFIG_LIBCRC32C=y
|
||||
|
@ -159,7 +159,6 @@ CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NFSD_V3_ACL=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
CONFIG_NLS_ISO8859_8=m
|
||||
|
@ -154,7 +154,6 @@ CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NFSD_V3_ACL=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
CONFIG_NLS_ISO8859_8=m
|
||||
|
@ -154,7 +154,6 @@ CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NFS_SWAP=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NFSD_V3_ACL=y
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
CONFIG_NLS_ISO8859_8=m
|
||||
|
@ -269,7 +269,6 @@ CONFIG_UFS_FS=m
|
||||
CONFIG_NFS_FS=m
|
||||
CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NFSD_V3_ACL=y
|
||||
CONFIG_CIFS=m
|
||||
CONFIG_CIFS_UPCALL=y
|
||||
|
@ -112,7 +112,6 @@ CONFIG_CONFIGFS_FS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_CODEPAGE_437=m
|
||||
|
@ -92,5 +92,4 @@ CONFIG_TMPFS=y
|
||||
CONFIG_UFS_FS=m
|
||||
CONFIG_NFS_FS=m
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
|
@ -363,7 +363,6 @@ CONFIG_UFS_FS=m
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NLS_CODEPAGE_437=m
|
||||
CONFIG_NLS_CODEPAGE_737=m
|
||||
CONFIG_NLS_CODEPAGE_775=m
|
||||
|
@ -371,7 +371,6 @@ CONFIG_UFS_FS=m
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NLS_CODEPAGE_437=m
|
||||
CONFIG_NLS_CODEPAGE_737=m
|
||||
CONFIG_NLS_CODEPAGE_775=m
|
||||
|
@ -370,7 +370,6 @@ CONFIG_UFS_FS=m
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NLS_CODEPAGE_437=m
|
||||
CONFIG_NLS_CODEPAGE_737=m
|
||||
CONFIG_NLS_CODEPAGE_775=m
|
||||
|
@ -354,7 +354,6 @@ CONFIG_SYSV_FS=m
|
||||
CONFIG_UFS_FS=m
|
||||
CONFIG_NFS_FS=m
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
CONFIG_CODA_FS=m
|
||||
CONFIG_AFS_FS=m
|
||||
|
@ -72,6 +72,5 @@ CONFIG_ROMFS_FS=m
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="cca=3 mem=64M console=ttyVR0,115200 ip=any root=/dev/nfs"
|
||||
|
@ -67,6 +67,5 @@ CONFIG_ROMFS_FS=m
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="cca=3 mem=32M console=ttyVR0,115200"
|
||||
|
@ -77,7 +77,6 @@ CONFIG_ROMFS_FS=m
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_FONTS=y
|
||||
CONFIG_FONT_8x8=y
|
||||
CONFIG_FONT_8x16=y
|
||||
|
@ -63,6 +63,5 @@ CONFIG_TMPFS=y
|
||||
CONFIG_TMPFS_POSIX_ACL=y
|
||||
CONFIG_NFS_FS=m
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="console=ttyVR0,19200 ide0=0x170,0x376,49 mem=16M"
|
||||
|
@ -210,7 +210,6 @@ CONFIG_TMPFS_XATTR=y
|
||||
CONFIG_NFS_FS=m
|
||||
# CONFIG_NFS_V2 is not set
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
CONFIG_CIFS_XATTR=y
|
||||
CONFIG_CIFS_POSIX=y
|
||||
|
@ -120,7 +120,6 @@ CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NFS_V4=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
CONFIG_NLS_CODEPAGE_437=m
|
||||
CONFIG_NLS_CODEPAGE_932=m
|
||||
|
@ -101,7 +101,6 @@ CONFIG_NFS_V3_ACL=y
|
||||
CONFIG_NFS_V4=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_CIFS=m
|
||||
CONFIG_NLS=y
|
||||
CONFIG_NLS_CODEPAGE_437=m
|
||||
|
@ -93,7 +93,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_CODEPAGE_932=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
|
@ -123,7 +123,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_CODEPAGE_932=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
|
@ -108,7 +108,6 @@ CONFIG_UFS_FS=m
|
||||
CONFIG_NFS_FS=m
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_SMB_FS=m
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_CODEPAGE_932=y
|
||||
|
@ -120,7 +120,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_ASCII=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
|
@ -122,7 +122,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_CODEPAGE_932=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
|
@ -75,7 +75,6 @@ CONFIG_NFS_V3=y
|
||||
CONFIG_NFS_V4=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_NLS_CODEPAGE_437=m
|
||||
CONFIG_NLS_CODEPAGE_737=m
|
||||
|
@ -129,7 +129,6 @@ CONFIG_NFS_V3=y
|
||||
CONFIG_NFS_V4=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_NLS_CODEPAGE_437=y
|
||||
CONFIG_NLS_CODEPAGE_932=y
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
|
@ -239,7 +239,6 @@ CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
CONFIG_SMB_FS=m
|
||||
CONFIG_CIFS=m
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
|
@ -344,7 +344,7 @@ config LOCKD
|
||||
|
||||
config LOCKD_V4
|
||||
bool
|
||||
depends on NFSD_V3 || NFS_V3
|
||||
depends on NFSD || NFS_V3
|
||||
depends on FILE_LOCKING
|
||||
default y
|
||||
|
||||
|
@ -184,8 +184,7 @@ lockd(void *vrqstp)
|
||||
dprintk("lockd_down: service stopped\n");
|
||||
|
||||
svc_exit_thread(rqstp);
|
||||
|
||||
module_put_and_kthread_exit(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int create_lockd_listener(struct svc_serv *serv, const char *name,
|
||||
@ -197,8 +196,8 @@ static int create_lockd_listener(struct svc_serv *serv, const char *name,
|
||||
|
||||
xprt = svc_find_xprt(serv, name, net, family, 0);
|
||||
if (xprt == NULL)
|
||||
return svc_create_xprt(serv, name, net, family, port,
|
||||
SVC_SOCK_DEFAULTS, cred);
|
||||
return svc_xprt_create(serv, name, net, family, port,
|
||||
SVC_SOCK_DEFAULTS, cred);
|
||||
svc_xprt_put(xprt);
|
||||
return 0;
|
||||
}
|
||||
@ -248,7 +247,8 @@ out_err:
|
||||
if (warned++ == 0)
|
||||
printk(KERN_WARNING
|
||||
"lockd_up: makesock failed, error=%d\n", err);
|
||||
svc_shutdown_net(serv, net);
|
||||
svc_xprt_destroy_all(serv, net);
|
||||
svc_rpcb_cleanup(serv, net);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -286,9 +286,8 @@ static void lockd_down_net(struct svc_serv *serv, struct net *net)
|
||||
nlm_shutdown_hosts_net(net);
|
||||
cancel_delayed_work_sync(&ln->grace_period_end);
|
||||
locks_end_grace(&ln->lockd_manager);
|
||||
svc_shutdown_net(serv, net);
|
||||
dprintk("%s: per-net data destroyed; net=%x\n",
|
||||
__func__, net->ns.inum);
|
||||
svc_xprt_destroy_all(serv, net);
|
||||
svc_rpcb_cleanup(serv, net);
|
||||
}
|
||||
} else {
|
||||
pr_err("%s: no users! net=%x\n",
|
||||
@ -350,13 +349,6 @@ static struct notifier_block lockd_inet6addr_notifier = {
|
||||
};
|
||||
#endif
|
||||
|
||||
static const struct svc_serv_ops lockd_sv_ops = {
|
||||
.svo_shutdown = svc_rpcb_cleanup,
|
||||
.svo_function = lockd,
|
||||
.svo_enqueue_xprt = svc_xprt_do_enqueue,
|
||||
.svo_module = THIS_MODULE,
|
||||
};
|
||||
|
||||
static int lockd_get(void)
|
||||
{
|
||||
struct svc_serv *serv;
|
||||
@ -380,7 +372,7 @@ static int lockd_get(void)
|
||||
nlm_timeout = LOCKD_DFLT_TIMEO;
|
||||
nlmsvc_timeout = nlm_timeout * HZ;
|
||||
|
||||
serv = svc_create(&nlmsvc_program, LOCKD_BUFSIZE, &lockd_sv_ops);
|
||||
serv = svc_create(&nlmsvc_program, LOCKD_BUFSIZE, lockd);
|
||||
if (!serv) {
|
||||
printk(KERN_WARNING "lockd_up: create service failed\n");
|
||||
return -ENOMEM;
|
||||
|
@ -17,7 +17,6 @@
|
||||
#include <linux/errno.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/freezer.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/sunrpc/svcauth_gss.h>
|
||||
#include <linux/sunrpc/bc_xprt.h>
|
||||
|
||||
@ -45,18 +44,18 @@ static int nfs4_callback_up_net(struct svc_serv *serv, struct net *net)
|
||||
int ret;
|
||||
struct nfs_net *nn = net_generic(net, nfs_net_id);
|
||||
|
||||
ret = svc_create_xprt(serv, "tcp", net, PF_INET,
|
||||
nfs_callback_set_tcpport, SVC_SOCK_ANONYMOUS,
|
||||
cred);
|
||||
ret = svc_xprt_create(serv, "tcp", net, PF_INET,
|
||||
nfs_callback_set_tcpport, SVC_SOCK_ANONYMOUS,
|
||||
cred);
|
||||
if (ret <= 0)
|
||||
goto out_err;
|
||||
nn->nfs_callback_tcpport = ret;
|
||||
dprintk("NFS: Callback listener port = %u (af %u, net %x)\n",
|
||||
nn->nfs_callback_tcpport, PF_INET, net->ns.inum);
|
||||
|
||||
ret = svc_create_xprt(serv, "tcp", net, PF_INET6,
|
||||
nfs_callback_set_tcpport, SVC_SOCK_ANONYMOUS,
|
||||
cred);
|
||||
ret = svc_xprt_create(serv, "tcp", net, PF_INET6,
|
||||
nfs_callback_set_tcpport, SVC_SOCK_ANONYMOUS,
|
||||
cred);
|
||||
if (ret > 0) {
|
||||
nn->nfs_callback_tcpport6 = ret;
|
||||
dprintk("NFS: Callback listener port = %u (af %u, net %x)\n",
|
||||
@ -92,8 +91,8 @@ nfs4_callback_svc(void *vrqstp)
|
||||
continue;
|
||||
svc_process(rqstp);
|
||||
}
|
||||
|
||||
svc_exit_thread(rqstp);
|
||||
module_put_and_kthread_exit(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -136,8 +135,8 @@ nfs41_callback_svc(void *vrqstp)
|
||||
finish_wait(&serv->sv_cb_waitq, &wq);
|
||||
}
|
||||
}
|
||||
|
||||
svc_exit_thread(rqstp);
|
||||
module_put_and_kthread_exit(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -189,7 +188,7 @@ static void nfs_callback_down_net(u32 minorversion, struct svc_serv *serv, struc
|
||||
return;
|
||||
|
||||
dprintk("NFS: destroy per-net callback data; net=%x\n", net->ns.inum);
|
||||
svc_shutdown_net(serv, net);
|
||||
svc_xprt_destroy_all(serv, net);
|
||||
}
|
||||
|
||||
static int nfs_callback_up_net(int minorversion, struct svc_serv *serv,
|
||||
@ -232,33 +231,10 @@ err_bind:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct svc_serv_ops nfs40_cb_sv_ops = {
|
||||
.svo_function = nfs4_callback_svc,
|
||||
.svo_enqueue_xprt = svc_xprt_do_enqueue,
|
||||
.svo_module = THIS_MODULE,
|
||||
};
|
||||
#if defined(CONFIG_NFS_V4_1)
|
||||
static const struct svc_serv_ops nfs41_cb_sv_ops = {
|
||||
.svo_function = nfs41_callback_svc,
|
||||
.svo_enqueue_xprt = svc_xprt_do_enqueue,
|
||||
.svo_module = THIS_MODULE,
|
||||
};
|
||||
|
||||
static const struct svc_serv_ops *nfs4_cb_sv_ops[] = {
|
||||
[0] = &nfs40_cb_sv_ops,
|
||||
[1] = &nfs41_cb_sv_ops,
|
||||
};
|
||||
#else
|
||||
static const struct svc_serv_ops *nfs4_cb_sv_ops[] = {
|
||||
[0] = &nfs40_cb_sv_ops,
|
||||
[1] = NULL,
|
||||
};
|
||||
#endif
|
||||
|
||||
static struct svc_serv *nfs_callback_create_svc(int minorversion)
|
||||
{
|
||||
struct nfs_callback_data *cb_info = &nfs_callback_info[minorversion];
|
||||
const struct svc_serv_ops *sv_ops;
|
||||
int (*threadfn)(void *data);
|
||||
struct svc_serv *serv;
|
||||
|
||||
/*
|
||||
@ -267,17 +243,6 @@ static struct svc_serv *nfs_callback_create_svc(int minorversion)
|
||||
if (cb_info->serv)
|
||||
return svc_get(cb_info->serv);
|
||||
|
||||
switch (minorversion) {
|
||||
case 0:
|
||||
sv_ops = nfs4_cb_sv_ops[0];
|
||||
break;
|
||||
default:
|
||||
sv_ops = nfs4_cb_sv_ops[1];
|
||||
}
|
||||
|
||||
if (sv_ops == NULL)
|
||||
return ERR_PTR(-ENOTSUPP);
|
||||
|
||||
/*
|
||||
* Sanity check: if there's no task,
|
||||
* we should be the first user ...
|
||||
@ -286,7 +251,16 @@ static struct svc_serv *nfs_callback_create_svc(int minorversion)
|
||||
printk(KERN_WARNING "nfs_callback_create_svc: no kthread, %d users??\n",
|
||||
cb_info->users);
|
||||
|
||||
serv = svc_create(&nfs4_callback_program, NFS4_CALLBACK_BUFSIZE, sv_ops);
|
||||
threadfn = nfs4_callback_svc;
|
||||
#if defined(CONFIG_NFS_V4_1)
|
||||
if (minorversion)
|
||||
threadfn = nfs41_callback_svc;
|
||||
#else
|
||||
if (minorversion)
|
||||
return ERR_PTR(-ENOTSUPP);
|
||||
#endif
|
||||
serv = svc_create(&nfs4_callback_program, NFS4_CALLBACK_BUFSIZE,
|
||||
threadfn);
|
||||
if (!serv) {
|
||||
printk(KERN_ERR "nfs_callback_create_svc: create service failed\n");
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
@ -2697,6 +2697,5 @@ static int nfs4_run_state_manager(void *ptr)
|
||||
allow_signal(SIGKILL);
|
||||
nfs4_state_manager(clp);
|
||||
nfs_put_client(clp);
|
||||
module_put_and_kthread_exit(0);
|
||||
return 0;
|
||||
}
|
||||
|
@ -35,18 +35,9 @@ config NFSD_V2_ACL
|
||||
bool
|
||||
depends on NFSD
|
||||
|
||||
config NFSD_V3
|
||||
bool "NFS server support for NFS version 3"
|
||||
depends on NFSD
|
||||
help
|
||||
This option enables support in your system's NFS server for
|
||||
version 3 of the NFS protocol (RFC 1813).
|
||||
|
||||
If unsure, say Y.
|
||||
|
||||
config NFSD_V3_ACL
|
||||
bool "NFS server support for the NFSv3 ACL protocol extension"
|
||||
depends on NFSD_V3
|
||||
depends on NFSD
|
||||
select NFSD_V2_ACL
|
||||
help
|
||||
Solaris NFS servers support an auxiliary NFSv3 ACL protocol that
|
||||
@ -70,7 +61,6 @@ config NFSD_V3_ACL
|
||||
config NFSD_V4
|
||||
bool "NFS server support for NFS version 4"
|
||||
depends on NFSD && PROC_FS
|
||||
select NFSD_V3
|
||||
select FS_POSIX_ACL
|
||||
select SUNRPC_GSS
|
||||
select CRYPTO
|
||||
|
@ -12,9 +12,8 @@ nfsd-y += trace.o
|
||||
|
||||
nfsd-y += nfssvc.o nfsctl.o nfsproc.o nfsfh.o vfs.o \
|
||||
export.o auth.o lockd.o nfscache.o nfsxdr.o \
|
||||
stats.o filecache.o
|
||||
stats.o filecache.o nfs3proc.o nfs3xdr.o
|
||||
nfsd-$(CONFIG_NFSD_V2_ACL) += nfs2acl.o
|
||||
nfsd-$(CONFIG_NFSD_V3) += nfs3proc.o nfs3xdr.o
|
||||
nfsd-$(CONFIG_NFSD_V3_ACL) += nfs3acl.o
|
||||
nfsd-$(CONFIG_NFSD_V4) += nfs4proc.o nfs4xdr.o nfs4state.o nfs4idmap.o \
|
||||
nfs4acl.o nfs4callback.o nfs4recover.o
|
||||
|
@ -632,7 +632,7 @@ nfsd_file_cache_init(void)
|
||||
if (!nfsd_filecache_wq)
|
||||
goto out;
|
||||
|
||||
nfsd_file_hashtbl = kcalloc(NFSD_FILE_HASH_SIZE,
|
||||
nfsd_file_hashtbl = kvcalloc(NFSD_FILE_HASH_SIZE,
|
||||
sizeof(*nfsd_file_hashtbl), GFP_KERNEL);
|
||||
if (!nfsd_file_hashtbl) {
|
||||
pr_err("nfsd: unable to allocate nfsd_file_hashtbl\n");
|
||||
@ -700,7 +700,7 @@ out_err:
|
||||
nfsd_file_slab = NULL;
|
||||
kmem_cache_destroy(nfsd_file_mark_slab);
|
||||
nfsd_file_mark_slab = NULL;
|
||||
kfree(nfsd_file_hashtbl);
|
||||
kvfree(nfsd_file_hashtbl);
|
||||
nfsd_file_hashtbl = NULL;
|
||||
destroy_workqueue(nfsd_filecache_wq);
|
||||
nfsd_filecache_wq = NULL;
|
||||
@ -811,7 +811,7 @@ nfsd_file_cache_shutdown(void)
|
||||
fsnotify_wait_marks_destroyed();
|
||||
kmem_cache_destroy(nfsd_file_mark_slab);
|
||||
nfsd_file_mark_slab = NULL;
|
||||
kfree(nfsd_file_hashtbl);
|
||||
kvfree(nfsd_file_hashtbl);
|
||||
nfsd_file_hashtbl = NULL;
|
||||
destroy_workqueue(nfsd_filecache_wq);
|
||||
nfsd_filecache_wq = NULL;
|
||||
|
@ -117,7 +117,7 @@ nfsd4_ff_proc_getdeviceinfo(struct super_block *sb, struct svc_rqst *rqstp,
|
||||
|
||||
da->netaddr.addr_len =
|
||||
snprintf(da->netaddr.addr, FF_ADDR_LEN + 1,
|
||||
"%s.%hhu.%hhu", addr, port >> 8, port & 0xff);
|
||||
"%s.%d.%d", addr, port >> 8, port & 0xff);
|
||||
|
||||
da->tightly_coupled = false;
|
||||
|
||||
|
@ -422,7 +422,7 @@ nfsd4_insert_layout(struct nfsd4_layoutget *lgp, struct nfs4_layout_stateid *ls)
|
||||
new = kmem_cache_alloc(nfs4_layout_cache, GFP_KERNEL);
|
||||
if (!new)
|
||||
return nfserr_jukebox;
|
||||
memcpy(&new->lo_seg, seg, sizeof(lp->lo_seg));
|
||||
memcpy(&new->lo_seg, seg, sizeof(new->lo_seg));
|
||||
new->lo_state = ls;
|
||||
|
||||
spin_lock(&fp->fi_lock);
|
||||
|
@ -4711,6 +4711,14 @@ nfsd_break_deleg_cb(struct file_lock *fl)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* nfsd_breaker_owns_lease - Check if lease conflict was resolved
|
||||
* @fl: Lock state to check
|
||||
*
|
||||
* Return values:
|
||||
* %true: Lease conflict was resolved
|
||||
* %false: Lease conflict was not resolved.
|
||||
*/
|
||||
static bool nfsd_breaker_owns_lease(struct file_lock *fl)
|
||||
{
|
||||
struct nfs4_delegation *dl = fl->fl_owner;
|
||||
@ -4718,11 +4726,11 @@ static bool nfsd_breaker_owns_lease(struct file_lock *fl)
|
||||
struct nfs4_client *clp;
|
||||
|
||||
if (!i_am_nfsd())
|
||||
return NULL;
|
||||
return false;
|
||||
rqst = kthread_data(current);
|
||||
/* Note rq_prog == NFS_ACL_PROGRAM is also possible: */
|
||||
if (rqst->rq_prog != NFS_PROGRAM || rqst->rq_vers < 4)
|
||||
return NULL;
|
||||
return false;
|
||||
clp = *(rqst->rq_lease_breaker);
|
||||
return dl->dl_stid.sc_client == clp;
|
||||
}
|
||||
@ -6526,7 +6534,7 @@ nfs4_transform_lock_offset(struct file_lock *lock)
|
||||
}
|
||||
|
||||
static fl_owner_t
|
||||
nfsd4_fl_get_owner(fl_owner_t owner)
|
||||
nfsd4_lm_get_owner(fl_owner_t owner)
|
||||
{
|
||||
struct nfs4_lockowner *lo = (struct nfs4_lockowner *)owner;
|
||||
|
||||
@ -6535,7 +6543,7 @@ nfsd4_fl_get_owner(fl_owner_t owner)
|
||||
}
|
||||
|
||||
static void
|
||||
nfsd4_fl_put_owner(fl_owner_t owner)
|
||||
nfsd4_lm_put_owner(fl_owner_t owner)
|
||||
{
|
||||
struct nfs4_lockowner *lo = (struct nfs4_lockowner *)owner;
|
||||
|
||||
@ -6570,8 +6578,8 @@ nfsd4_lm_notify(struct file_lock *fl)
|
||||
|
||||
static const struct lock_manager_operations nfsd_posix_mng_ops = {
|
||||
.lm_notify = nfsd4_lm_notify,
|
||||
.lm_get_owner = nfsd4_fl_get_owner,
|
||||
.lm_put_owner = nfsd4_fl_put_owner,
|
||||
.lm_get_owner = nfsd4_lm_get_owner,
|
||||
.lm_put_owner = nfsd4_lm_put_owner,
|
||||
};
|
||||
|
||||
static inline void
|
||||
|
@ -2854,6 +2854,9 @@ nfsd4_encode_fattr(struct xdr_stream *xdr, struct svc_fh *fhp,
|
||||
err = vfs_getattr(&path, &stat, STATX_BASIC_STATS, AT_STATX_SYNC_AS_STAT);
|
||||
if (err)
|
||||
goto out_nfserr;
|
||||
if (!(stat.result_mask & STATX_BTIME))
|
||||
/* underlying FS does not offer btime so we can't share it */
|
||||
bmval1 &= ~FATTR4_WORD1_TIME_CREATE;
|
||||
if ((bmval0 & (FATTR4_WORD0_FILES_AVAIL | FATTR4_WORD0_FILES_FREE |
|
||||
FATTR4_WORD0_FILES_TOTAL | FATTR4_WORD0_MAXNAME)) ||
|
||||
(bmval1 & (FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE |
|
||||
@ -3254,6 +3257,13 @@ out_acl:
|
||||
p = xdr_encode_hyper(p, (s64)stat.mtime.tv_sec);
|
||||
*p++ = cpu_to_be32(stat.mtime.tv_nsec);
|
||||
}
|
||||
if (bmval1 & FATTR4_WORD1_TIME_CREATE) {
|
||||
p = xdr_reserve_space(xdr, 12);
|
||||
if (!p)
|
||||
goto out_resource;
|
||||
p = xdr_encode_hyper(p, (s64)stat.btime.tv_sec);
|
||||
*p++ = cpu_to_be32(stat.btime.tv_nsec);
|
||||
}
|
||||
if (bmval1 & FATTR4_WORD1_MOUNTED_ON_FILEID) {
|
||||
struct kstat parent_stat;
|
||||
u64 ino = stat.ino;
|
||||
|
@ -84,12 +84,6 @@ nfsd_hashsize(unsigned int limit)
|
||||
return roundup_pow_of_two(limit / TARGET_BUCKET_SIZE);
|
||||
}
|
||||
|
||||
static u32
|
||||
nfsd_cache_hash(__be32 xid, struct nfsd_net *nn)
|
||||
{
|
||||
return hash_32((__force u32)xid, nn->maskbits);
|
||||
}
|
||||
|
||||
static struct svc_cacherep *
|
||||
nfsd_reply_cache_alloc(struct svc_rqst *rqstp, __wsum csum,
|
||||
struct nfsd_net *nn)
|
||||
@ -241,6 +235,14 @@ lru_put_end(struct nfsd_drc_bucket *b, struct svc_cacherep *rp)
|
||||
list_move_tail(&rp->c_lru, &b->lru_head);
|
||||
}
|
||||
|
||||
static noinline struct nfsd_drc_bucket *
|
||||
nfsd_cache_bucket_find(__be32 xid, struct nfsd_net *nn)
|
||||
{
|
||||
unsigned int hash = hash_32((__force u32)xid, nn->maskbits);
|
||||
|
||||
return &nn->drc_hashtbl[hash];
|
||||
}
|
||||
|
||||
static long prune_bucket(struct nfsd_drc_bucket *b, struct nfsd_net *nn,
|
||||
unsigned int max)
|
||||
{
|
||||
@ -419,12 +421,10 @@ out:
|
||||
*/
|
||||
int nfsd_cache_lookup(struct svc_rqst *rqstp)
|
||||
{
|
||||
struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
|
||||
struct nfsd_net *nn;
|
||||
struct svc_cacherep *rp, *found;
|
||||
__be32 xid = rqstp->rq_xid;
|
||||
__wsum csum;
|
||||
u32 hash = nfsd_cache_hash(xid, nn);
|
||||
struct nfsd_drc_bucket *b = &nn->drc_hashtbl[hash];
|
||||
struct nfsd_drc_bucket *b;
|
||||
int type = rqstp->rq_cachetype;
|
||||
int rtn = RC_DOIT;
|
||||
|
||||
@ -440,17 +440,16 @@ int nfsd_cache_lookup(struct svc_rqst *rqstp)
|
||||
* Since the common case is a cache miss followed by an insert,
|
||||
* preallocate an entry.
|
||||
*/
|
||||
nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
|
||||
rp = nfsd_reply_cache_alloc(rqstp, csum, nn);
|
||||
if (!rp)
|
||||
goto out;
|
||||
|
||||
b = nfsd_cache_bucket_find(rqstp->rq_xid, nn);
|
||||
spin_lock(&b->cache_lock);
|
||||
found = nfsd_cache_insert(b, rp, nn);
|
||||
if (found != rp) {
|
||||
nfsd_reply_cache_free_locked(NULL, rp, nn);
|
||||
rp = found;
|
||||
if (found != rp)
|
||||
goto found_entry;
|
||||
}
|
||||
|
||||
nfsd_stats_rc_misses_inc();
|
||||
rqstp->rq_cacherep = rp;
|
||||
@ -468,8 +467,10 @@ out:
|
||||
|
||||
found_entry:
|
||||
/* We found a matching entry which is either in progress or done. */
|
||||
nfsd_reply_cache_free_locked(NULL, rp, nn);
|
||||
nfsd_stats_rc_hits_inc();
|
||||
rtn = RC_DROPIT;
|
||||
rp = found;
|
||||
|
||||
/* Request being processed */
|
||||
if (rp->c_state == RC_INPROG)
|
||||
@ -528,7 +529,6 @@ void nfsd_cache_update(struct svc_rqst *rqstp, int cachetype, __be32 *statp)
|
||||
struct nfsd_net *nn = net_generic(SVC_NET(rqstp), nfsd_net_id);
|
||||
struct svc_cacherep *rp = rqstp->rq_cacherep;
|
||||
struct kvec *resv = &rqstp->rq_res.head[0], *cachv;
|
||||
u32 hash;
|
||||
struct nfsd_drc_bucket *b;
|
||||
int len;
|
||||
size_t bufsize = 0;
|
||||
@ -536,8 +536,7 @@ void nfsd_cache_update(struct svc_rqst *rqstp, int cachetype, __be32 *statp)
|
||||
if (!rp)
|
||||
return;
|
||||
|
||||
hash = nfsd_cache_hash(rp->c_key.k_xid, nn);
|
||||
b = &nn->drc_hashtbl[hash];
|
||||
b = nfsd_cache_bucket_find(rp->c_key.k_xid, nn);
|
||||
|
||||
len = resv->iov_len - ((char*)statp - (char*)resv->iov_base);
|
||||
len >>= 2;
|
||||
|
@ -772,13 +772,13 @@ static ssize_t __write_ports_addxprt(char *buf, struct net *net, const struct cr
|
||||
if (err != 0)
|
||||
return err;
|
||||
|
||||
err = svc_create_xprt(nn->nfsd_serv, transport, net,
|
||||
PF_INET, port, SVC_SOCK_ANONYMOUS, cred);
|
||||
err = svc_xprt_create(nn->nfsd_serv, transport, net,
|
||||
PF_INET, port, SVC_SOCK_ANONYMOUS, cred);
|
||||
if (err < 0)
|
||||
goto out_err;
|
||||
|
||||
err = svc_create_xprt(nn->nfsd_serv, transport, net,
|
||||
PF_INET6, port, SVC_SOCK_ANONYMOUS, cred);
|
||||
err = svc_xprt_create(nn->nfsd_serv, transport, net,
|
||||
PF_INET6, port, SVC_SOCK_ANONYMOUS, cred);
|
||||
if (err < 0 && err != -EAFNOSUPPORT)
|
||||
goto out_close;
|
||||
|
||||
@ -790,7 +790,7 @@ static ssize_t __write_ports_addxprt(char *buf, struct net *net, const struct cr
|
||||
out_close:
|
||||
xprt = svc_find_xprt(nn->nfsd_serv, transport, net, PF_INET, port);
|
||||
if (xprt != NULL) {
|
||||
svc_close_xprt(xprt);
|
||||
svc_xprt_close(xprt);
|
||||
svc_xprt_put(xprt);
|
||||
}
|
||||
out_err:
|
||||
|
@ -364,7 +364,7 @@ void nfsd_lockd_shutdown(void);
|
||||
| FATTR4_WORD1_OWNER | FATTR4_WORD1_OWNER_GROUP | FATTR4_WORD1_RAWDEV \
|
||||
| FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE | FATTR4_WORD1_SPACE_TOTAL \
|
||||
| FATTR4_WORD1_SPACE_USED | FATTR4_WORD1_TIME_ACCESS | FATTR4_WORD1_TIME_ACCESS_SET \
|
||||
| FATTR4_WORD1_TIME_DELTA | FATTR4_WORD1_TIME_METADATA \
|
||||
| FATTR4_WORD1_TIME_DELTA | FATTR4_WORD1_TIME_METADATA | FATTR4_WORD1_TIME_CREATE \
|
||||
| FATTR4_WORD1_TIME_MODIFY | FATTR4_WORD1_TIME_MODIFY_SET | FATTR4_WORD1_MOUNTED_ON_FILEID)
|
||||
|
||||
#define NFSD4_SUPPORTED_ATTRS_WORD2 0
|
||||
|
@ -611,8 +611,6 @@ out_negative:
|
||||
return nfserr_serverfault;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NFSD_V3
|
||||
|
||||
/**
|
||||
* fh_fill_pre_attrs - Fill in pre-op attributes
|
||||
* @fhp: file handle to be updated
|
||||
@ -673,8 +671,6 @@ void fh_fill_post_attrs(struct svc_fh *fhp)
|
||||
nfsd4_change_attribute(&fhp->fh_post_attr, inode);
|
||||
}
|
||||
|
||||
#endif /* CONFIG_NFSD_V3 */
|
||||
|
||||
/*
|
||||
* Release a file handle.
|
||||
*/
|
||||
|
@ -90,7 +90,6 @@ typedef struct svc_fh {
|
||||
* operation
|
||||
*/
|
||||
int fh_flags; /* FH flags */
|
||||
#ifdef CONFIG_NFSD_V3
|
||||
bool fh_post_saved; /* post-op attrs saved */
|
||||
bool fh_pre_saved; /* pre-op attrs saved */
|
||||
|
||||
@ -107,7 +106,6 @@ typedef struct svc_fh {
|
||||
/* Post-op attributes saved in fh_unlock */
|
||||
struct kstat fh_post_attr; /* full attrs after operation */
|
||||
u64 fh_post_change; /* nfsv4 change; see above */
|
||||
#endif /* CONFIG_NFSD_V3 */
|
||||
} svc_fh;
|
||||
#define NFSD4_FH_FOREIGN (1<<0)
|
||||
#define SET_FH_FLAG(c, f) ((c)->fh_flags |= (f))
|
||||
@ -283,8 +281,6 @@ static inline u32 knfsd_fh_hash(const struct knfsd_fh *fh)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_NFSD_V3
|
||||
|
||||
/**
|
||||
* fh_clear_pre_post_attrs - Reset pre/post attributes
|
||||
* @fhp: file handle to be updated
|
||||
@ -327,22 +323,6 @@ static inline u64 nfsd4_change_attribute(struct kstat *stat,
|
||||
extern void fh_fill_pre_attrs(struct svc_fh *fhp);
|
||||
extern void fh_fill_post_attrs(struct svc_fh *fhp);
|
||||
|
||||
#else /* !CONFIG_NFSD_V3 */
|
||||
|
||||
static inline void fh_clear_pre_post_attrs(struct svc_fh *fhp)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void fh_fill_pre_attrs(struct svc_fh *fhp)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void fh_fill_post_attrs(struct svc_fh *fhp)
|
||||
{
|
||||
}
|
||||
|
||||
#endif /* !CONFIG_NFSD_V3 */
|
||||
|
||||
|
||||
/*
|
||||
* Lock a file handle/inode
|
||||
|
@ -230,7 +230,7 @@ nfsd_proc_write(struct svc_rqst *rqstp)
|
||||
unsigned long cnt = argp->len;
|
||||
unsigned int nvecs;
|
||||
|
||||
dprintk("nfsd: WRITE %s %d bytes at %d\n",
|
||||
dprintk("nfsd: WRITE %s %u bytes at %d\n",
|
||||
SVCFH_fmt(&argp->fh),
|
||||
argp->len, argp->offset);
|
||||
|
||||
|
@ -117,9 +117,7 @@ static struct svc_stat nfsd_acl_svcstats = {
|
||||
|
||||
static const struct svc_version *nfsd_version[] = {
|
||||
[2] = &nfsd_version2,
|
||||
#if defined(CONFIG_NFSD_V3)
|
||||
[3] = &nfsd_version3,
|
||||
#endif
|
||||
#if defined(CONFIG_NFSD_V4)
|
||||
[4] = &nfsd_version4,
|
||||
#endif
|
||||
@ -293,13 +291,13 @@ static int nfsd_init_socks(struct net *net, const struct cred *cred)
|
||||
if (!list_empty(&nn->nfsd_serv->sv_permsocks))
|
||||
return 0;
|
||||
|
||||
error = svc_create_xprt(nn->nfsd_serv, "udp", net, PF_INET, NFS_PORT,
|
||||
SVC_SOCK_DEFAULTS, cred);
|
||||
error = svc_xprt_create(nn->nfsd_serv, "udp", net, PF_INET, NFS_PORT,
|
||||
SVC_SOCK_DEFAULTS, cred);
|
||||
if (error < 0)
|
||||
return error;
|
||||
|
||||
error = svc_create_xprt(nn->nfsd_serv, "tcp", net, PF_INET, NFS_PORT,
|
||||
SVC_SOCK_DEFAULTS, cred);
|
||||
error = svc_xprt_create(nn->nfsd_serv, "tcp", net, PF_INET, NFS_PORT,
|
||||
SVC_SOCK_DEFAULTS, cred);
|
||||
if (error < 0)
|
||||
return error;
|
||||
|
||||
@ -612,13 +610,6 @@ static int nfsd_get_default_max_blksize(void)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct svc_serv_ops nfsd_thread_sv_ops = {
|
||||
.svo_shutdown = nfsd_last_thread,
|
||||
.svo_function = nfsd,
|
||||
.svo_enqueue_xprt = svc_xprt_do_enqueue,
|
||||
.svo_module = THIS_MODULE,
|
||||
};
|
||||
|
||||
void nfsd_shutdown_threads(struct net *net)
|
||||
{
|
||||
struct nfsd_net *nn = net_generic(net, nfsd_net_id);
|
||||
@ -657,8 +648,7 @@ int nfsd_create_serv(struct net *net)
|
||||
if (nfsd_max_blksize == 0)
|
||||
nfsd_max_blksize = nfsd_get_default_max_blksize();
|
||||
nfsd_reset_versions(nn);
|
||||
serv = svc_create_pooled(&nfsd_program, nfsd_max_blksize,
|
||||
&nfsd_thread_sv_ops);
|
||||
serv = svc_create_pooled(&nfsd_program, nfsd_max_blksize, nfsd);
|
||||
if (serv == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
@ -724,7 +714,8 @@ void nfsd_put(struct net *net)
|
||||
struct nfsd_net *nn = net_generic(net, nfsd_net_id);
|
||||
|
||||
if (kref_put(&nn->nfsd_serv->sv_refcnt, nfsd_noop)) {
|
||||
svc_shutdown_net(nn->nfsd_serv, net);
|
||||
svc_xprt_destroy_all(nn->nfsd_serv, net);
|
||||
nfsd_last_thread(nn->nfsd_serv, net);
|
||||
svc_destroy(&nn->nfsd_serv->sv_refcnt);
|
||||
spin_lock(&nfsd_notifier_lock);
|
||||
nn->nfsd_serv = NULL;
|
||||
@ -1019,8 +1010,6 @@ out:
|
||||
msleep(20);
|
||||
}
|
||||
|
||||
/* Release module */
|
||||
module_put_and_kthread_exit(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
107
fs/nfsd/trace.h
107
fs/nfsd/trace.h
@ -13,22 +13,6 @@
|
||||
#include "export.h"
|
||||
#include "nfsfh.h"
|
||||
|
||||
#define NFSD_TRACE_PROC_ARG_FIELDS \
|
||||
__field(unsigned int, netns_ino) \
|
||||
__field(u32, xid) \
|
||||
__array(unsigned char, server, sizeof(struct sockaddr_in6)) \
|
||||
__array(unsigned char, client, sizeof(struct sockaddr_in6))
|
||||
|
||||
#define NFSD_TRACE_PROC_ARG_ASSIGNMENTS \
|
||||
do { \
|
||||
__entry->netns_ino = SVC_NET(rqstp)->ns.inum; \
|
||||
__entry->xid = be32_to_cpu(rqstp->rq_xid); \
|
||||
memcpy(__entry->server, &rqstp->rq_xprt->xpt_local, \
|
||||
rqstp->rq_xprt->xpt_locallen); \
|
||||
memcpy(__entry->client, &rqstp->rq_xprt->xpt_remote, \
|
||||
rqstp->rq_xprt->xpt_remotelen); \
|
||||
} while (0);
|
||||
|
||||
#define NFSD_TRACE_PROC_RES_FIELDS \
|
||||
__field(unsigned int, netns_ino) \
|
||||
__field(u32, xid) \
|
||||
@ -53,16 +37,22 @@ DECLARE_EVENT_CLASS(nfsd_xdr_err_class,
|
||||
),
|
||||
TP_ARGS(rqstp),
|
||||
TP_STRUCT__entry(
|
||||
NFSD_TRACE_PROC_ARG_FIELDS
|
||||
|
||||
__field(unsigned int, netns_ino)
|
||||
__field(u32, xid)
|
||||
__field(u32, vers)
|
||||
__field(u32, proc)
|
||||
__sockaddr(server, rqstp->rq_xprt->xpt_locallen)
|
||||
__sockaddr(client, rqstp->rq_xprt->xpt_remotelen)
|
||||
),
|
||||
TP_fast_assign(
|
||||
NFSD_TRACE_PROC_ARG_ASSIGNMENTS
|
||||
const struct svc_xprt *xprt = rqstp->rq_xprt;
|
||||
|
||||
__entry->netns_ino = xprt->xpt_net->ns.inum;
|
||||
__entry->xid = be32_to_cpu(rqstp->rq_xid);
|
||||
__entry->vers = rqstp->rq_vers;
|
||||
__entry->proc = rqstp->rq_proc;
|
||||
__assign_sockaddr(server, &xprt->xpt_local, xprt->xpt_locallen);
|
||||
__assign_sockaddr(client, &xprt->xpt_remote, xprt->xpt_remotelen);
|
||||
),
|
||||
TP_printk("xid=0x%08x vers=%u proc=%u",
|
||||
__entry->xid, __entry->vers, __entry->proc
|
||||
@ -613,20 +603,21 @@ TRACE_EVENT(nfsd_clid_cred_mismatch,
|
||||
__field(u32, cl_id)
|
||||
__field(unsigned long, cl_flavor)
|
||||
__field(unsigned long, new_flavor)
|
||||
__array(unsigned char, addr, sizeof(struct sockaddr_in6))
|
||||
__sockaddr(addr, rqstp->rq_xprt->xpt_remotelen)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->cl_boot = clp->cl_clientid.cl_boot;
|
||||
__entry->cl_id = clp->cl_clientid.cl_id;
|
||||
__entry->cl_flavor = clp->cl_cred.cr_flavor;
|
||||
__entry->new_flavor = rqstp->rq_cred.cr_flavor;
|
||||
memcpy(__entry->addr, &rqstp->rq_xprt->xpt_remote,
|
||||
sizeof(struct sockaddr_in6));
|
||||
__assign_sockaddr(addr, &rqstp->rq_xprt->xpt_remote,
|
||||
rqstp->rq_xprt->xpt_remotelen);
|
||||
),
|
||||
TP_printk("client %08x:%08x flavor=%s, conflict=%s from addr=%pISpc",
|
||||
__entry->cl_boot, __entry->cl_id,
|
||||
show_nfsd_authflavor(__entry->cl_flavor),
|
||||
show_nfsd_authflavor(__entry->new_flavor), __entry->addr
|
||||
show_nfsd_authflavor(__entry->new_flavor),
|
||||
__get_sockaddr(addr)
|
||||
)
|
||||
)
|
||||
|
||||
@ -642,7 +633,7 @@ TRACE_EVENT(nfsd_clid_verf_mismatch,
|
||||
__field(u32, cl_id)
|
||||
__array(unsigned char, cl_verifier, NFS4_VERIFIER_SIZE)
|
||||
__array(unsigned char, new_verifier, NFS4_VERIFIER_SIZE)
|
||||
__array(unsigned char, addr, sizeof(struct sockaddr_in6))
|
||||
__sockaddr(addr, rqstp->rq_xprt->xpt_remotelen)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->cl_boot = clp->cl_clientid.cl_boot;
|
||||
@ -651,14 +642,14 @@ TRACE_EVENT(nfsd_clid_verf_mismatch,
|
||||
NFS4_VERIFIER_SIZE);
|
||||
memcpy(__entry->new_verifier, (void *)verf,
|
||||
NFS4_VERIFIER_SIZE);
|
||||
memcpy(__entry->addr, &rqstp->rq_xprt->xpt_remote,
|
||||
sizeof(struct sockaddr_in6));
|
||||
__assign_sockaddr(addr, &rqstp->rq_xprt->xpt_remote,
|
||||
rqstp->rq_xprt->xpt_remotelen);
|
||||
),
|
||||
TP_printk("client %08x:%08x verf=0x%s, updated=0x%s from addr=%pISpc",
|
||||
__entry->cl_boot, __entry->cl_id,
|
||||
__print_hex_str(__entry->cl_verifier, NFS4_VERIFIER_SIZE),
|
||||
__print_hex_str(__entry->new_verifier, NFS4_VERIFIER_SIZE),
|
||||
__entry->addr
|
||||
__get_sockaddr(addr)
|
||||
)
|
||||
);
|
||||
|
||||
@ -908,18 +899,17 @@ TRACE_EVENT(nfsd_cb_args,
|
||||
__field(u32, cl_id)
|
||||
__field(u32, prog)
|
||||
__field(u32, ident)
|
||||
__array(unsigned char, addr, sizeof(struct sockaddr_in6))
|
||||
__sockaddr(addr, conn->cb_addrlen)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->cl_boot = clp->cl_clientid.cl_boot;
|
||||
__entry->cl_id = clp->cl_clientid.cl_id;
|
||||
__entry->prog = conn->cb_prog;
|
||||
__entry->ident = conn->cb_ident;
|
||||
memcpy(__entry->addr, &conn->cb_addr,
|
||||
sizeof(struct sockaddr_in6));
|
||||
__assign_sockaddr(addr, &conn->cb_addr, conn->cb_addrlen);
|
||||
),
|
||||
TP_printk("addr=%pISpc client %08x:%08x prog=%u ident=%u",
|
||||
__entry->addr, __entry->cl_boot, __entry->cl_id,
|
||||
__get_sockaddr(addr), __entry->cl_boot, __entry->cl_id,
|
||||
__entry->prog, __entry->ident)
|
||||
);
|
||||
|
||||
@ -951,17 +941,17 @@ DECLARE_EVENT_CLASS(nfsd_cb_class,
|
||||
__field(unsigned long, state)
|
||||
__field(u32, cl_boot)
|
||||
__field(u32, cl_id)
|
||||
__array(unsigned char, addr, sizeof(struct sockaddr_in6))
|
||||
__sockaddr(addr, clp->cl_cb_conn.cb_addrlen)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->state = clp->cl_cb_state;
|
||||
__entry->cl_boot = clp->cl_clientid.cl_boot;
|
||||
__entry->cl_id = clp->cl_clientid.cl_id;
|
||||
memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr,
|
||||
sizeof(struct sockaddr_in6));
|
||||
__assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr,
|
||||
clp->cl_cb_conn.cb_addrlen)
|
||||
),
|
||||
TP_printk("addr=%pISpc client %08x:%08x state=%s",
|
||||
__entry->addr, __entry->cl_boot, __entry->cl_id,
|
||||
__get_sockaddr(addr), __entry->cl_boot, __entry->cl_id,
|
||||
show_cb_state(__entry->state))
|
||||
);
|
||||
|
||||
@ -1001,7 +991,7 @@ TRACE_EVENT(nfsd_cb_setup,
|
||||
__field(u32, cl_boot)
|
||||
__field(u32, cl_id)
|
||||
__field(unsigned long, authflavor)
|
||||
__array(unsigned char, addr, sizeof(struct sockaddr_in6))
|
||||
__sockaddr(addr, clp->cl_cb_conn.cb_addrlen)
|
||||
__array(unsigned char, netid, 8)
|
||||
),
|
||||
TP_fast_assign(
|
||||
@ -1009,11 +999,11 @@ TRACE_EVENT(nfsd_cb_setup,
|
||||
__entry->cl_id = clp->cl_clientid.cl_id;
|
||||
strlcpy(__entry->netid, netid, sizeof(__entry->netid));
|
||||
__entry->authflavor = authflavor;
|
||||
memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr,
|
||||
sizeof(struct sockaddr_in6));
|
||||
__assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr,
|
||||
clp->cl_cb_conn.cb_addrlen)
|
||||
),
|
||||
TP_printk("addr=%pISpc client %08x:%08x proto=%s flavor=%s",
|
||||
__entry->addr, __entry->cl_boot, __entry->cl_id,
|
||||
__get_sockaddr(addr), __entry->cl_boot, __entry->cl_id,
|
||||
__entry->netid, show_nfsd_authflavor(__entry->authflavor))
|
||||
);
|
||||
|
||||
@ -1027,30 +1017,32 @@ TRACE_EVENT(nfsd_cb_setup_err,
|
||||
__field(long, error)
|
||||
__field(u32, cl_boot)
|
||||
__field(u32, cl_id)
|
||||
__array(unsigned char, addr, sizeof(struct sockaddr_in6))
|
||||
__sockaddr(addr, clp->cl_cb_conn.cb_addrlen)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->error = error;
|
||||
__entry->cl_boot = clp->cl_clientid.cl_boot;
|
||||
__entry->cl_id = clp->cl_clientid.cl_id;
|
||||
memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr,
|
||||
sizeof(struct sockaddr_in6));
|
||||
__assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr,
|
||||
clp->cl_cb_conn.cb_addrlen)
|
||||
),
|
||||
TP_printk("addr=%pISpc client %08x:%08x error=%ld",
|
||||
__entry->addr, __entry->cl_boot, __entry->cl_id, __entry->error)
|
||||
__get_sockaddr(addr), __entry->cl_boot, __entry->cl_id,
|
||||
__entry->error)
|
||||
);
|
||||
|
||||
TRACE_EVENT(nfsd_cb_recall,
|
||||
TRACE_EVENT_CONDITION(nfsd_cb_recall,
|
||||
TP_PROTO(
|
||||
const struct nfs4_stid *stid
|
||||
),
|
||||
TP_ARGS(stid),
|
||||
TP_CONDITION(stid->sc_client),
|
||||
TP_STRUCT__entry(
|
||||
__field(u32, cl_boot)
|
||||
__field(u32, cl_id)
|
||||
__field(u32, si_id)
|
||||
__field(u32, si_generation)
|
||||
__array(unsigned char, addr, sizeof(struct sockaddr_in6))
|
||||
__sockaddr(addr, stid->sc_client->cl_cb_conn.cb_addrlen)
|
||||
),
|
||||
TP_fast_assign(
|
||||
const stateid_t *stp = &stid->sc_stateid;
|
||||
@ -1060,14 +1052,11 @@ TRACE_EVENT(nfsd_cb_recall,
|
||||
__entry->cl_id = stp->si_opaque.so_clid.cl_id;
|
||||
__entry->si_id = stp->si_opaque.so_id;
|
||||
__entry->si_generation = stp->si_generation;
|
||||
if (clp)
|
||||
memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr,
|
||||
sizeof(struct sockaddr_in6));
|
||||
else
|
||||
memset(__entry->addr, 0, sizeof(struct sockaddr_in6));
|
||||
__assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr,
|
||||
clp->cl_cb_conn.cb_addrlen)
|
||||
),
|
||||
TP_printk("addr=%pISpc client %08x:%08x stateid %08x:%08x",
|
||||
__entry->addr, __entry->cl_boot, __entry->cl_id,
|
||||
__get_sockaddr(addr), __entry->cl_boot, __entry->cl_id,
|
||||
__entry->si_id, __entry->si_generation)
|
||||
);
|
||||
|
||||
@ -1081,7 +1070,7 @@ TRACE_EVENT(nfsd_cb_notify_lock,
|
||||
__field(u32, cl_boot)
|
||||
__field(u32, cl_id)
|
||||
__field(u32, fh_hash)
|
||||
__array(unsigned char, addr, sizeof(struct sockaddr_in6))
|
||||
__sockaddr(addr, lo->lo_owner.so_client->cl_cb_conn.cb_addrlen)
|
||||
),
|
||||
TP_fast_assign(
|
||||
const struct nfs4_client *clp = lo->lo_owner.so_client;
|
||||
@ -1089,11 +1078,11 @@ TRACE_EVENT(nfsd_cb_notify_lock,
|
||||
__entry->cl_boot = clp->cl_clientid.cl_boot;
|
||||
__entry->cl_id = clp->cl_clientid.cl_id;
|
||||
__entry->fh_hash = knfsd_fh_hash(&nbl->nbl_fh);
|
||||
memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr,
|
||||
sizeof(struct sockaddr_in6));
|
||||
__assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr,
|
||||
clp->cl_cb_conn.cb_addrlen)
|
||||
),
|
||||
TP_printk("addr=%pISpc client %08x:%08x fh_hash=0x%08x",
|
||||
__entry->addr, __entry->cl_boot, __entry->cl_id,
|
||||
__get_sockaddr(addr), __entry->cl_boot, __entry->cl_id,
|
||||
__entry->fh_hash)
|
||||
);
|
||||
|
||||
@ -1114,7 +1103,7 @@ TRACE_EVENT(nfsd_cb_offload,
|
||||
__field(u32, fh_hash)
|
||||
__field(int, status)
|
||||
__field(u64, count)
|
||||
__array(unsigned char, addr, sizeof(struct sockaddr_in6))
|
||||
__sockaddr(addr, clp->cl_cb_conn.cb_addrlen)
|
||||
),
|
||||
TP_fast_assign(
|
||||
__entry->cl_boot = stp->si_opaque.so_clid.cl_boot;
|
||||
@ -1124,11 +1113,11 @@ TRACE_EVENT(nfsd_cb_offload,
|
||||
__entry->fh_hash = knfsd_fh_hash(fh);
|
||||
__entry->status = be32_to_cpu(status);
|
||||
__entry->count = count;
|
||||
memcpy(__entry->addr, &clp->cl_cb_conn.cb_addr,
|
||||
sizeof(struct sockaddr_in6));
|
||||
__assign_sockaddr(addr, &clp->cl_cb_conn.cb_addr,
|
||||
clp->cl_cb_conn.cb_addrlen)
|
||||
),
|
||||
TP_printk("addr=%pISpc client %08x:%08x stateid %08x:%08x fh_hash=0x%08x count=%llu status=%d",
|
||||
__entry->addr, __entry->cl_boot, __entry->cl_id,
|
||||
__get_sockaddr(addr), __entry->cl_boot, __entry->cl_id,
|
||||
__entry->si_id, __entry->si_generation,
|
||||
__entry->fh_hash, __entry->count, __entry->status)
|
||||
);
|
||||
|
@ -32,9 +32,7 @@
|
||||
#include <linux/writeback.h>
|
||||
#include <linux/security.h>
|
||||
|
||||
#ifdef CONFIG_NFSD_V3
|
||||
#include "xdr3.h"
|
||||
#endif /* CONFIG_NFSD_V3 */
|
||||
|
||||
#ifdef CONFIG_NFSD_V4
|
||||
#include "../internal.h"
|
||||
@ -608,7 +606,6 @@ __be32 nfsd4_vfs_fallocate(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||
}
|
||||
#endif /* defined(CONFIG_NFSD_V4) */
|
||||
|
||||
#ifdef CONFIG_NFSD_V3
|
||||
/*
|
||||
* Check server access rights to a file system object
|
||||
*/
|
||||
@ -720,7 +717,6 @@ nfsd_access(struct svc_rqst *rqstp, struct svc_fh *fhp, u32 *access, u32 *suppor
|
||||
out:
|
||||
return error;
|
||||
}
|
||||
#endif /* CONFIG_NFSD_V3 */
|
||||
|
||||
int nfsd_open_break_lease(struct inode *inode, int access)
|
||||
{
|
||||
@ -1113,7 +1109,6 @@ out:
|
||||
return err;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NFSD_V3
|
||||
/**
|
||||
* nfsd_commit - Commit pending writes to stable storage
|
||||
* @rqstp: RPC request being processed
|
||||
@ -1190,7 +1185,6 @@ nfsd_commit(struct svc_rqst *rqstp, struct svc_fh *fhp, u64 offset,
|
||||
out:
|
||||
return err;
|
||||
}
|
||||
#endif /* CONFIG_NFSD_V3 */
|
||||
|
||||
static __be32
|
||||
nfsd_create_setattr(struct svc_rqst *rqstp, struct svc_fh *resfhp,
|
||||
@ -1380,8 +1374,6 @@ nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||
rdev, resfhp);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_NFSD_V3
|
||||
|
||||
/*
|
||||
* NFSv3 and NFSv4 version of nfsd_create
|
||||
*/
|
||||
@ -1547,7 +1539,6 @@ do_nfsd_create(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||
err = nfserrno(host_err);
|
||||
goto out;
|
||||
}
|
||||
#endif /* CONFIG_NFSD_V3 */
|
||||
|
||||
/*
|
||||
* Read a symlink. On entry, *lenp must contain the maximum path length that
|
||||
|
@ -68,7 +68,6 @@ __be32 nfsd_create_locked(struct svc_rqst *, struct svc_fh *,
|
||||
__be32 nfsd_create(struct svc_rqst *, struct svc_fh *,
|
||||
char *name, int len, struct iattr *attrs,
|
||||
int type, dev_t rdev, struct svc_fh *res);
|
||||
#ifdef CONFIG_NFSD_V3
|
||||
__be32 nfsd_access(struct svc_rqst *, struct svc_fh *, u32 *, u32 *);
|
||||
__be32 do_nfsd_create(struct svc_rqst *, struct svc_fh *,
|
||||
char *name, int len, struct iattr *attrs,
|
||||
@ -76,7 +75,6 @@ __be32 do_nfsd_create(struct svc_rqst *, struct svc_fh *,
|
||||
u32 *verifier, bool *truncp, bool *created);
|
||||
__be32 nfsd_commit(struct svc_rqst *rqst, struct svc_fh *fhp,
|
||||
u64 offset, u32 count, __be32 *verf);
|
||||
#endif /* CONFIG_NFSD_V3 */
|
||||
#ifdef CONFIG_NFSD_V4
|
||||
__be32 nfsd_getxattr(struct svc_rqst *rqstp, struct svc_fh *fhp,
|
||||
char *name, void **bufp, int *lenp);
|
||||
|
@ -32,7 +32,7 @@ struct nfsd_readargs {
|
||||
struct nfsd_writeargs {
|
||||
svc_fh fh;
|
||||
__u32 offset;
|
||||
int len;
|
||||
__u32 len;
|
||||
struct xdr_buf payload;
|
||||
};
|
||||
|
||||
|
@ -52,24 +52,6 @@ struct svc_pool {
|
||||
unsigned long sp_flags;
|
||||
} ____cacheline_aligned_in_smp;
|
||||
|
||||
struct svc_serv;
|
||||
|
||||
struct svc_serv_ops {
|
||||
/* Callback to use when last thread exits. */
|
||||
void (*svo_shutdown)(struct svc_serv *, struct net *);
|
||||
|
||||
/* function for service threads to run */
|
||||
int (*svo_function)(void *);
|
||||
|
||||
/* queue up a transport for servicing */
|
||||
void (*svo_enqueue_xprt)(struct svc_xprt *);
|
||||
|
||||
/* optional module to count when adding threads.
|
||||
* Thread function must call module_put_and_kthread_exit() to exit.
|
||||
*/
|
||||
struct module *svo_module;
|
||||
};
|
||||
|
||||
/*
|
||||
* RPC service.
|
||||
*
|
||||
@ -102,7 +84,8 @@ struct svc_serv {
|
||||
|
||||
unsigned int sv_nrpools; /* number of thread pools */
|
||||
struct svc_pool * sv_pools; /* array of thread pools */
|
||||
const struct svc_serv_ops *sv_ops; /* server operations */
|
||||
int (*sv_threadfn)(void *data);
|
||||
|
||||
#if defined(CONFIG_SUNRPC_BACKCHANNEL)
|
||||
struct list_head sv_cb_list; /* queue for callback requests
|
||||
* that arrive over the same
|
||||
@ -503,7 +486,7 @@ int svc_rpcb_setup(struct svc_serv *serv, struct net *net);
|
||||
void svc_rpcb_cleanup(struct svc_serv *serv, struct net *net);
|
||||
int svc_bind(struct svc_serv *serv, struct net *net);
|
||||
struct svc_serv *svc_create(struct svc_program *, unsigned int,
|
||||
const struct svc_serv_ops *);
|
||||
int (*threadfn)(void *data));
|
||||
struct svc_rqst *svc_rqst_alloc(struct svc_serv *serv,
|
||||
struct svc_pool *pool, int node);
|
||||
void svc_rqst_replace_page(struct svc_rqst *rqstp,
|
||||
@ -511,10 +494,9 @@ void svc_rqst_replace_page(struct svc_rqst *rqstp,
|
||||
void svc_rqst_free(struct svc_rqst *);
|
||||
void svc_exit_thread(struct svc_rqst *);
|
||||
struct svc_serv * svc_create_pooled(struct svc_program *, unsigned int,
|
||||
const struct svc_serv_ops *);
|
||||
int (*threadfn)(void *data));
|
||||
int svc_set_num_threads(struct svc_serv *, struct svc_pool *, int);
|
||||
int svc_pool_stats_open(struct svc_serv *serv, struct file *file);
|
||||
void svc_shutdown_net(struct svc_serv *, struct net *);
|
||||
int svc_process(struct svc_rqst *);
|
||||
int bc_svc_process(struct svc_serv *, struct rpc_rqst *,
|
||||
struct svc_rqst *);
|
||||
|
@ -28,6 +28,7 @@ struct svc_xprt_ops {
|
||||
void (*xpo_free)(struct svc_xprt *);
|
||||
void (*xpo_secure_port)(struct svc_rqst *rqstp);
|
||||
void (*xpo_kill_temp_xprt)(struct svc_xprt *);
|
||||
void (*xpo_start_tls)(struct svc_xprt *);
|
||||
};
|
||||
|
||||
struct svc_xprt_class {
|
||||
@ -127,15 +128,16 @@ int svc_reg_xprt_class(struct svc_xprt_class *);
|
||||
void svc_unreg_xprt_class(struct svc_xprt_class *);
|
||||
void svc_xprt_init(struct net *, struct svc_xprt_class *, struct svc_xprt *,
|
||||
struct svc_serv *);
|
||||
int svc_create_xprt(struct svc_serv *, const char *, struct net *,
|
||||
const int, const unsigned short, int,
|
||||
const struct cred *);
|
||||
int svc_xprt_create(struct svc_serv *serv, const char *xprt_name,
|
||||
struct net *net, const int family,
|
||||
const unsigned short port, int flags,
|
||||
const struct cred *cred);
|
||||
void svc_xprt_destroy_all(struct svc_serv *serv, struct net *net);
|
||||
void svc_xprt_received(struct svc_xprt *xprt);
|
||||
void svc_xprt_do_enqueue(struct svc_xprt *xprt);
|
||||
void svc_xprt_enqueue(struct svc_xprt *xprt);
|
||||
void svc_xprt_put(struct svc_xprt *xprt);
|
||||
void svc_xprt_copy_addrs(struct svc_rqst *rqstp, struct svc_xprt *xprt);
|
||||
void svc_close_xprt(struct svc_xprt *xprt);
|
||||
void svc_xprt_close(struct svc_xprt *xprt);
|
||||
int svc_port_is_privileged(struct sockaddr *sin);
|
||||
int svc_print_xprts(char *buf, int maxlen);
|
||||
struct svc_xprt *svc_find_xprt(struct svc_serv *serv, const char *xcl_name,
|
||||
|
@ -731,6 +731,8 @@ xdr_stream_decode_uint32_array(struct xdr_stream *xdr,
|
||||
|
||||
if (unlikely(xdr_stream_decode_u32(xdr, &len) < 0))
|
||||
return -EBADMSG;
|
||||
if (len > SIZE_MAX / sizeof(*p))
|
||||
return -EBADMSG;
|
||||
p = xdr_inline_decode(xdr, len * sizeof(*p));
|
||||
if (unlikely(!p))
|
||||
return -EBADMSG;
|
||||
|
@ -21,6 +21,9 @@
|
||||
#undef __get_bitmask
|
||||
#define __get_bitmask(field) (char *)__get_dynamic_array(field)
|
||||
|
||||
#undef __get_sockaddr
|
||||
#define __get_sockaddr(field) ((struct sockaddr *)__get_dynamic_array(field))
|
||||
|
||||
#undef __get_rel_dynamic_array
|
||||
#define __get_rel_dynamic_array(field) \
|
||||
((void *)(&__entry->__rel_loc_##field) + \
|
||||
@ -37,6 +40,9 @@
|
||||
#undef __get_rel_bitmask
|
||||
#define __get_rel_bitmask(field) (char *)__get_rel_dynamic_array(field)
|
||||
|
||||
#undef __get_rel_sockaddr
|
||||
#define __get_rel_sockaddr(field) ((struct sockaddr *)__get_rel_dynamic_array(field))
|
||||
|
||||
#undef __perf_count
|
||||
#define __perf_count(c) (c)
|
||||
|
||||
|
@ -1625,26 +1625,53 @@ TRACE_DEFINE_ENUM(SVC_COMPLETE);
|
||||
{ SVC_PENDING, "SVC_PENDING" }, \
|
||||
{ SVC_COMPLETE, "SVC_COMPLETE" })
|
||||
|
||||
#define SVC_RQST_ENDPOINT_FIELDS(r) \
|
||||
__sockaddr(server, (r)->rq_xprt->xpt_locallen) \
|
||||
__sockaddr(client, (r)->rq_xprt->xpt_remotelen) \
|
||||
__field(unsigned int, netns_ino) \
|
||||
__field(u32, xid)
|
||||
|
||||
#define SVC_RQST_ENDPOINT_ASSIGNMENTS(r) \
|
||||
do { \
|
||||
struct svc_xprt *xprt = (r)->rq_xprt; \
|
||||
__assign_sockaddr(server, &xprt->xpt_local, \
|
||||
xprt->xpt_locallen); \
|
||||
__assign_sockaddr(client, &xprt->xpt_remote, \
|
||||
xprt->xpt_remotelen); \
|
||||
__entry->netns_ino = xprt->xpt_net->ns.inum; \
|
||||
__entry->xid = be32_to_cpu((r)->rq_xid); \
|
||||
} while (0)
|
||||
|
||||
#define SVC_RQST_ENDPOINT_FORMAT \
|
||||
"xid=0x%08x server=%pISpc client=%pISpc"
|
||||
|
||||
#define SVC_RQST_ENDPOINT_VARARGS \
|
||||
__entry->xid, __get_sockaddr(server), __get_sockaddr(client)
|
||||
|
||||
TRACE_EVENT(svc_authenticate,
|
||||
TP_PROTO(const struct svc_rqst *rqst, int auth_res),
|
||||
|
||||
TP_ARGS(rqst, auth_res),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(u32, xid)
|
||||
SVC_RQST_ENDPOINT_FIELDS(rqst)
|
||||
|
||||
__field(unsigned long, svc_status)
|
||||
__field(unsigned long, auth_stat)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->xid = be32_to_cpu(rqst->rq_xid);
|
||||
SVC_RQST_ENDPOINT_ASSIGNMENTS(rqst);
|
||||
|
||||
__entry->svc_status = auth_res;
|
||||
__entry->auth_stat = be32_to_cpu(rqst->rq_auth_stat);
|
||||
),
|
||||
|
||||
TP_printk("xid=0x%08x auth_res=%s auth_stat=%s",
|
||||
__entry->xid, svc_show_status(__entry->svc_status),
|
||||
rpc_show_auth_stat(__entry->auth_stat))
|
||||
TP_printk(SVC_RQST_ENDPOINT_FORMAT
|
||||
" auth_res=%s auth_stat=%s",
|
||||
SVC_RQST_ENDPOINT_VARARGS,
|
||||
svc_show_status(__entry->svc_status),
|
||||
rpc_show_auth_stat(__entry->auth_stat))
|
||||
);
|
||||
|
||||
TRACE_EVENT(svc_process,
|
||||
@ -1680,7 +1707,6 @@ TRACE_EVENT(svc_process,
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(svc_rqst_event,
|
||||
|
||||
TP_PROTO(
|
||||
const struct svc_rqst *rqst
|
||||
),
|
||||
@ -1688,20 +1714,20 @@ DECLARE_EVENT_CLASS(svc_rqst_event,
|
||||
TP_ARGS(rqst),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(u32, xid)
|
||||
SVC_RQST_ENDPOINT_FIELDS(rqst)
|
||||
|
||||
__field(unsigned long, flags)
|
||||
__string(addr, rqst->rq_xprt->xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->xid = be32_to_cpu(rqst->rq_xid);
|
||||
SVC_RQST_ENDPOINT_ASSIGNMENTS(rqst);
|
||||
|
||||
__entry->flags = rqst->rq_flags;
|
||||
__assign_str(addr, rqst->rq_xprt->xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("addr=%s xid=0x%08x flags=%s",
|
||||
__get_str(addr), __entry->xid,
|
||||
show_rqstp_flags(__entry->flags))
|
||||
TP_printk(SVC_RQST_ENDPOINT_FORMAT " flags=%s",
|
||||
SVC_RQST_ENDPOINT_VARARGS,
|
||||
show_rqstp_flags(__entry->flags))
|
||||
);
|
||||
#define DEFINE_SVC_RQST_EVENT(name) \
|
||||
DEFINE_EVENT(svc_rqst_event, svc_##name, \
|
||||
@ -1714,34 +1740,63 @@ DEFINE_SVC_RQST_EVENT(defer);
|
||||
DEFINE_SVC_RQST_EVENT(drop);
|
||||
|
||||
DECLARE_EVENT_CLASS(svc_rqst_status,
|
||||
|
||||
TP_PROTO(struct svc_rqst *rqst, int status),
|
||||
TP_PROTO(
|
||||
const struct svc_rqst *rqst,
|
||||
int status
|
||||
),
|
||||
|
||||
TP_ARGS(rqst, status),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(u32, xid)
|
||||
SVC_RQST_ENDPOINT_FIELDS(rqst)
|
||||
|
||||
__field(int, status)
|
||||
__field(unsigned long, flags)
|
||||
__string(addr, rqst->rq_xprt->xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->xid = be32_to_cpu(rqst->rq_xid);
|
||||
SVC_RQST_ENDPOINT_ASSIGNMENTS(rqst);
|
||||
|
||||
__entry->status = status;
|
||||
__entry->flags = rqst->rq_flags;
|
||||
__assign_str(addr, rqst->rq_xprt->xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("addr=%s xid=0x%08x status=%d flags=%s",
|
||||
__get_str(addr), __entry->xid,
|
||||
__entry->status, show_rqstp_flags(__entry->flags))
|
||||
TP_printk(SVC_RQST_ENDPOINT_FORMAT " status=%d flags=%s",
|
||||
SVC_RQST_ENDPOINT_VARARGS,
|
||||
__entry->status, show_rqstp_flags(__entry->flags))
|
||||
);
|
||||
|
||||
DEFINE_EVENT(svc_rqst_status, svc_send,
|
||||
TP_PROTO(struct svc_rqst *rqst, int status),
|
||||
TP_PROTO(const struct svc_rqst *rqst, int status),
|
||||
TP_ARGS(rqst, status));
|
||||
|
||||
TRACE_EVENT(svc_stats_latency,
|
||||
TP_PROTO(
|
||||
const struct svc_rqst *rqst
|
||||
),
|
||||
|
||||
TP_ARGS(rqst),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SVC_RQST_ENDPOINT_FIELDS(rqst)
|
||||
|
||||
__field(unsigned long, execute)
|
||||
__string(procedure, svc_proc_name(rqst))
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SVC_RQST_ENDPOINT_ASSIGNMENTS(rqst);
|
||||
|
||||
__entry->execute = ktime_to_us(ktime_sub(ktime_get(),
|
||||
rqst->rq_stime));
|
||||
__assign_str(procedure, svc_proc_name(rqst));
|
||||
),
|
||||
|
||||
TP_printk(SVC_RQST_ENDPOINT_FORMAT " proc=%s execute-us=%lu",
|
||||
SVC_RQST_ENDPOINT_VARARGS,
|
||||
__get_str(procedure), __entry->execute)
|
||||
);
|
||||
|
||||
#define show_svc_xprt_flags(flags) \
|
||||
__print_flags(flags, "|", \
|
||||
{ (1UL << XPT_BUSY), "XPT_BUSY"}, \
|
||||
@ -1774,65 +1829,114 @@ TRACE_EVENT(svc_xprt_create_err,
|
||||
__field(long, error)
|
||||
__string(program, program)
|
||||
__string(protocol, protocol)
|
||||
__array(unsigned char, addr, sizeof(struct sockaddr_in6))
|
||||
__sockaddr(addr, salen)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->error = PTR_ERR(xprt);
|
||||
__assign_str(program, program);
|
||||
__assign_str(protocol, protocol);
|
||||
memcpy(__entry->addr, sap, min(salen, sizeof(__entry->addr)));
|
||||
__assign_sockaddr(addr, sap, salen);
|
||||
),
|
||||
|
||||
TP_printk("addr=%pISpc program=%s protocol=%s error=%ld",
|
||||
__entry->addr, __get_str(program), __get_str(protocol),
|
||||
__get_sockaddr(addr), __get_str(program), __get_str(protocol),
|
||||
__entry->error)
|
||||
);
|
||||
|
||||
#define SVC_XPRT_ENDPOINT_FIELDS(x) \
|
||||
__sockaddr(server, (x)->xpt_locallen) \
|
||||
__sockaddr(client, (x)->xpt_remotelen) \
|
||||
__field(unsigned long, flags) \
|
||||
__field(unsigned int, netns_ino)
|
||||
|
||||
#define SVC_XPRT_ENDPOINT_ASSIGNMENTS(x) \
|
||||
do { \
|
||||
__assign_sockaddr(server, &(x)->xpt_local, \
|
||||
(x)->xpt_locallen); \
|
||||
__assign_sockaddr(client, &(x)->xpt_remote, \
|
||||
(x)->xpt_remotelen); \
|
||||
__entry->flags = (x)->xpt_flags; \
|
||||
__entry->netns_ino = (x)->xpt_net->ns.inum; \
|
||||
} while (0)
|
||||
|
||||
#define SVC_XPRT_ENDPOINT_FORMAT \
|
||||
"server=%pISpc client=%pISpc flags=%s"
|
||||
|
||||
#define SVC_XPRT_ENDPOINT_VARARGS \
|
||||
__get_sockaddr(server), __get_sockaddr(client), \
|
||||
show_svc_xprt_flags(__entry->flags)
|
||||
|
||||
TRACE_EVENT(svc_xprt_enqueue,
|
||||
TP_PROTO(struct svc_xprt *xprt, struct svc_rqst *rqst),
|
||||
TP_PROTO(
|
||||
const struct svc_xprt *xprt,
|
||||
const struct svc_rqst *rqst
|
||||
),
|
||||
|
||||
TP_ARGS(xprt, rqst),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SVC_XPRT_ENDPOINT_FIELDS(xprt)
|
||||
|
||||
__field(int, pid)
|
||||
__field(unsigned long, flags)
|
||||
__string(addr, xprt->xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SVC_XPRT_ENDPOINT_ASSIGNMENTS(xprt);
|
||||
|
||||
__entry->pid = rqst? rqst->rq_task->pid : 0;
|
||||
__entry->flags = xprt->xpt_flags;
|
||||
__assign_str(addr, xprt->xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("addr=%s pid=%d flags=%s", __get_str(addr),
|
||||
__entry->pid, show_svc_xprt_flags(__entry->flags))
|
||||
TP_printk(SVC_XPRT_ENDPOINT_FORMAT " pid=%d",
|
||||
SVC_XPRT_ENDPOINT_VARARGS, __entry->pid)
|
||||
);
|
||||
|
||||
TRACE_EVENT(svc_xprt_dequeue,
|
||||
TP_PROTO(
|
||||
const struct svc_rqst *rqst
|
||||
),
|
||||
|
||||
TP_ARGS(rqst),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
SVC_XPRT_ENDPOINT_FIELDS(rqst->rq_xprt)
|
||||
|
||||
__field(unsigned long, wakeup)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
SVC_XPRT_ENDPOINT_ASSIGNMENTS(rqst->rq_xprt);
|
||||
|
||||
__entry->wakeup = ktime_to_us(ktime_sub(ktime_get(),
|
||||
rqst->rq_qtime));
|
||||
),
|
||||
|
||||
TP_printk(SVC_XPRT_ENDPOINT_FORMAT " wakeup-us=%lu",
|
||||
SVC_XPRT_ENDPOINT_VARARGS, __entry->wakeup)
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(svc_xprt_event,
|
||||
TP_PROTO(struct svc_xprt *xprt),
|
||||
TP_PROTO(
|
||||
const struct svc_xprt *xprt
|
||||
),
|
||||
|
||||
TP_ARGS(xprt),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned long, flags)
|
||||
__string(addr, xprt->xpt_remotebuf)
|
||||
SVC_XPRT_ENDPOINT_FIELDS(xprt)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->flags = xprt->xpt_flags;
|
||||
__assign_str(addr, xprt->xpt_remotebuf);
|
||||
SVC_XPRT_ENDPOINT_ASSIGNMENTS(xprt);
|
||||
),
|
||||
|
||||
TP_printk("addr=%s flags=%s", __get_str(addr),
|
||||
show_svc_xprt_flags(__entry->flags))
|
||||
TP_printk(SVC_XPRT_ENDPOINT_FORMAT, SVC_XPRT_ENDPOINT_VARARGS)
|
||||
);
|
||||
|
||||
#define DEFINE_SVC_XPRT_EVENT(name) \
|
||||
DEFINE_EVENT(svc_xprt_event, svc_xprt_##name, \
|
||||
TP_PROTO( \
|
||||
struct svc_xprt *xprt \
|
||||
const struct svc_xprt *xprt \
|
||||
), \
|
||||
TP_ARGS(xprt))
|
||||
|
||||
@ -1850,44 +1954,25 @@ TRACE_EVENT(svc_xprt_accept,
|
||||
TP_ARGS(xprt, service),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string(addr, xprt->xpt_remotebuf)
|
||||
SVC_XPRT_ENDPOINT_FIELDS(xprt)
|
||||
|
||||
__string(protocol, xprt->xpt_class->xcl_name)
|
||||
__string(service, service)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(addr, xprt->xpt_remotebuf);
|
||||
SVC_XPRT_ENDPOINT_ASSIGNMENTS(xprt);
|
||||
|
||||
__assign_str(protocol, xprt->xpt_class->xcl_name);
|
||||
__assign_str(service, service);
|
||||
),
|
||||
|
||||
TP_printk("addr=%s protocol=%s service=%s",
|
||||
__get_str(addr), __get_str(protocol), __get_str(service)
|
||||
TP_printk(SVC_XPRT_ENDPOINT_FORMAT " protocol=%s service=%s",
|
||||
SVC_XPRT_ENDPOINT_VARARGS,
|
||||
__get_str(protocol), __get_str(service)
|
||||
)
|
||||
);
|
||||
|
||||
TRACE_EVENT(svc_xprt_dequeue,
|
||||
TP_PROTO(struct svc_rqst *rqst),
|
||||
|
||||
TP_ARGS(rqst),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned long, flags)
|
||||
__field(unsigned long, wakeup)
|
||||
__string(addr, rqst->rq_xprt->xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->flags = rqst->rq_xprt->xpt_flags;
|
||||
__entry->wakeup = ktime_to_us(ktime_sub(ktime_get(),
|
||||
rqst->rq_qtime));
|
||||
__assign_str(addr, rqst->rq_xprt->xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("addr=%s flags=%s wakeup-us=%lu", __get_str(addr),
|
||||
show_svc_xprt_flags(__entry->flags), __entry->wakeup)
|
||||
);
|
||||
|
||||
TRACE_EVENT(svc_wake_up,
|
||||
TP_PROTO(int pid),
|
||||
|
||||
@ -1922,31 +2007,6 @@ TRACE_EVENT(svc_alloc_arg_err,
|
||||
TP_printk("pages=%u", __entry->pages)
|
||||
);
|
||||
|
||||
TRACE_EVENT(svc_stats_latency,
|
||||
TP_PROTO(const struct svc_rqst *rqst),
|
||||
|
||||
TP_ARGS(rqst),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__field(u32, xid)
|
||||
__field(unsigned long, execute)
|
||||
__string(procedure, svc_proc_name(rqst))
|
||||
__string(addr, rqst->rq_xprt->xpt_remotebuf)
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__entry->xid = be32_to_cpu(rqst->rq_xid);
|
||||
__entry->execute = ktime_to_us(ktime_sub(ktime_get(),
|
||||
rqst->rq_stime));
|
||||
__assign_str(procedure, svc_proc_name(rqst));
|
||||
__assign_str(addr, rqst->rq_xprt->xpt_remotebuf);
|
||||
),
|
||||
|
||||
TP_printk("addr=%s xid=0x%08x proc=%s execute-us=%lu",
|
||||
__get_str(addr), __entry->xid, __get_str(procedure),
|
||||
__entry->execute)
|
||||
);
|
||||
|
||||
DECLARE_EVENT_CLASS(svc_deferred_event,
|
||||
TP_PROTO(
|
||||
const struct svc_deferred_req *dr
|
||||
|
@ -21,6 +21,9 @@
|
||||
#undef __get_bitmask
|
||||
#define __get_bitmask(field) (char *)__get_dynamic_array(field)
|
||||
|
||||
#undef __get_sockaddr
|
||||
#define __get_sockaddr(field) ((struct sockaddr *)__get_dynamic_array(field))
|
||||
|
||||
#undef __get_rel_dynamic_array
|
||||
#define __get_rel_dynamic_array(field) \
|
||||
((void *)__entry + \
|
||||
@ -38,6 +41,9 @@
|
||||
#undef __get_rel_bitmask
|
||||
#define __get_rel_bitmask(field) (char *)__get_rel_dynamic_array(field)
|
||||
|
||||
#undef __get_rel_sockaddr
|
||||
#define __get_rel_sockaddr(field) ((struct sockaddr *)__get_rel_dynamic_array(field))
|
||||
|
||||
#undef __perf_count
|
||||
#define __perf_count(c) (__count = (c))
|
||||
|
||||
|
@ -108,6 +108,9 @@ TRACE_MAKE_SYSTEM_STR();
|
||||
#undef __bitmask
|
||||
#define __bitmask(item, nr_bits) __dynamic_array(char, item, -1)
|
||||
|
||||
#undef __sockaddr
|
||||
#define __sockaddr(field, len) __dynamic_array(u8, field, len)
|
||||
|
||||
#undef __rel_dynamic_array
|
||||
#define __rel_dynamic_array(type, item, len) u32 __rel_loc_##item;
|
||||
|
||||
@ -120,6 +123,9 @@ TRACE_MAKE_SYSTEM_STR();
|
||||
#undef __rel_bitmask
|
||||
#define __rel_bitmask(item, nr_bits) __rel_dynamic_array(char, item, -1)
|
||||
|
||||
#undef __rel_sockaddr
|
||||
#define __rel_sockaddr(field, len) __rel_dynamic_array(u8, field, len)
|
||||
|
||||
#undef TP_STRUCT__entry
|
||||
#define TP_STRUCT__entry(args...) args
|
||||
|
||||
@ -212,11 +218,14 @@ TRACE_MAKE_SYSTEM_STR();
|
||||
#undef __string
|
||||
#define __string(item, src) __dynamic_array(char, item, -1)
|
||||
|
||||
#undef __string_len
|
||||
#define __string_len(item, src, len) __dynamic_array(char, item, -1)
|
||||
|
||||
#undef __bitmask
|
||||
#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)
|
||||
|
||||
#undef __string_len
|
||||
#define __string_len(item, src, len) __dynamic_array(char, item, -1)
|
||||
#undef __sockaddr
|
||||
#define __sockaddr(field, len) __dynamic_array(u8, field, len)
|
||||
|
||||
#undef __rel_dynamic_array
|
||||
#define __rel_dynamic_array(type, item, len) u32 item;
|
||||
@ -230,6 +239,9 @@ TRACE_MAKE_SYSTEM_STR();
|
||||
#undef __rel_bitmask
|
||||
#define __rel_bitmask(item, nr_bits) __rel_dynamic_array(unsigned long, item, -1)
|
||||
|
||||
#undef __rel_sockaddr
|
||||
#define __rel_sockaddr(field, len) __rel_dynamic_array(u8, field, len)
|
||||
|
||||
#undef DECLARE_EVENT_CLASS
|
||||
#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
|
||||
struct trace_event_data_offsets_##call { \
|
||||
@ -349,6 +361,12 @@ TRACE_MAKE_SYSTEM_STR();
|
||||
trace_print_bitmask_seq(p, __bitmask, __bitmask_size); \
|
||||
})
|
||||
|
||||
#undef __get_sockaddr
|
||||
#define __get_sockaddr(field) ((struct sockaddr *)__get_dynamic_array(field))
|
||||
|
||||
#undef __get_rel_sockaddr
|
||||
#define __get_rel_sockaddr(field) ((struct sockaddr *)__get_rel_dynamic_array(field))
|
||||
|
||||
#undef __print_flags
|
||||
#define __print_flags(flag, delim, flag_array...) \
|
||||
({ \
|
||||
@ -518,6 +536,9 @@ static struct trace_event_functions trace_event_type_funcs_##call = { \
|
||||
#undef __bitmask
|
||||
#define __bitmask(item, nr_bits) __dynamic_array(unsigned long, item, -1)
|
||||
|
||||
#undef __sockaddr
|
||||
#define __sockaddr(field, len) __dynamic_array(u8, field, len)
|
||||
|
||||
#undef __rel_dynamic_array
|
||||
#define __rel_dynamic_array(_type, _item, _len) { \
|
||||
.type = "__rel_loc " #_type "[]", .name = #_item, \
|
||||
@ -533,6 +554,9 @@ static struct trace_event_functions trace_event_type_funcs_##call = { \
|
||||
#undef __rel_bitmask
|
||||
#define __rel_bitmask(item, nr_bits) __rel_dynamic_array(unsigned long, item, -1)
|
||||
|
||||
#undef __rel_sockaddr
|
||||
#define __rel_sockaddr(field, len) __rel_dynamic_array(u8, field, len)
|
||||
|
||||
#undef DECLARE_EVENT_CLASS
|
||||
#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, func, print) \
|
||||
static struct trace_event_fields trace_event_fields_##call[] = { \
|
||||
@ -624,6 +648,12 @@ static struct trace_event_fields trace_event_fields_##call[] = { \
|
||||
#define __rel_bitmask(item, nr_bits) __rel_dynamic_array(unsigned long, item, \
|
||||
__bitmask_size_in_longs(nr_bits))
|
||||
|
||||
#undef __sockaddr
|
||||
#define __sockaddr(field, len) __dynamic_array(u8, field, len)
|
||||
|
||||
#undef __rel_sockaddr
|
||||
#define __rel_sockaddr(field, len) __rel_dynamic_array(u8, field, len)
|
||||
|
||||
#undef DECLARE_EVENT_CLASS
|
||||
#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \
|
||||
static inline notrace int trace_event_get_offsets_##call( \
|
||||
@ -788,6 +818,15 @@ static inline notrace int trace_event_get_offsets_##call( \
|
||||
#define __assign_bitmask(dst, src, nr_bits) \
|
||||
memcpy(__get_bitmask(dst), (src), __bitmask_size_in_bytes(nr_bits))
|
||||
|
||||
#undef __sockaddr
|
||||
#define __sockaddr(field, len) __dynamic_array(u8, field, len)
|
||||
|
||||
#undef __get_sockaddr
|
||||
#define __get_sockaddr(field) ((struct sockaddr *)__get_dynamic_array(field))
|
||||
|
||||
#define __assign_sockaddr(dest, src, len) \
|
||||
memcpy(__get_dynamic_array(dest), src, len)
|
||||
|
||||
#undef __rel_dynamic_array
|
||||
#define __rel_dynamic_array(type, item, len) \
|
||||
__entry->__rel_loc_##item = __data_offsets.item;
|
||||
@ -819,6 +858,16 @@ static inline notrace int trace_event_get_offsets_##call( \
|
||||
#define __assign_rel_bitmask(dst, src, nr_bits) \
|
||||
memcpy(__get_rel_bitmask(dst), (src), __bitmask_size_in_bytes(nr_bits))
|
||||
|
||||
#undef __rel_sockaddr
|
||||
#define __rel_sockaddr(field, len) __rel_dynamic_array(u8, field, len)
|
||||
|
||||
#undef __get_rel_sockaddr
|
||||
#define __get_rel_sockaddr(field) ((struct sockaddr *)__get_rel_dynamic_array(field))
|
||||
|
||||
#define __assign_rel_sockaddr(dest, src, len) \
|
||||
memcpy(__get_rel_dynamic_array(dest), src, len)
|
||||
|
||||
|
||||
#undef TP_fast_assign
|
||||
#define TP_fast_assign(args...) args
|
||||
|
||||
@ -883,10 +932,12 @@ static inline void ftrace_test_probe_##call(void) \
|
||||
#undef __get_dynamic_array_len
|
||||
#undef __get_str
|
||||
#undef __get_bitmask
|
||||
#undef __get_sockaddr
|
||||
#undef __get_rel_dynamic_array
|
||||
#undef __get_rel_dynamic_array_len
|
||||
#undef __get_rel_str
|
||||
#undef __get_rel_bitmask
|
||||
#undef __get_rel_sockaddr
|
||||
#undef __print_array
|
||||
#undef __print_hex_dump
|
||||
|
||||
|
@ -335,7 +335,7 @@ static inline void add_taint_module(struct module *mod, unsigned flag,
|
||||
|
||||
/*
|
||||
* A thread that wants to hold a reference to a module only while it
|
||||
* is running can call this to safely exit. nfsd and lockd use this.
|
||||
* is running can call this to safely exit.
|
||||
*/
|
||||
void __noreturn __module_put_and_kthread_exit(struct module *mod, long code)
|
||||
{
|
||||
|
@ -384,6 +384,12 @@ static void test_event_printk(struct trace_event_call *call)
|
||||
if (!(dereference_flags & (1ULL << arg)))
|
||||
goto next_arg;
|
||||
|
||||
/* Check for __get_sockaddr */;
|
||||
if (str_has_prefix(fmt + i, "__get_sockaddr(")) {
|
||||
dereference_flags &= ~(1ULL << arg);
|
||||
goto next_arg;
|
||||
}
|
||||
|
||||
/* Find the REC-> in the argument */
|
||||
c = strchr(fmt + i, ',');
|
||||
r = strstr(fmt + i, "REC->");
|
||||
|
@ -448,7 +448,7 @@ __svc_init_bc(struct svc_serv *serv)
|
||||
*/
|
||||
static struct svc_serv *
|
||||
__svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
|
||||
const struct svc_serv_ops *ops)
|
||||
int (*threadfn)(void *data))
|
||||
{
|
||||
struct svc_serv *serv;
|
||||
unsigned int vers;
|
||||
@ -465,7 +465,7 @@ __svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
|
||||
bufsize = RPCSVC_MAXPAYLOAD;
|
||||
serv->sv_max_payload = bufsize? bufsize : 4096;
|
||||
serv->sv_max_mesg = roundup(serv->sv_max_payload + PAGE_SIZE, PAGE_SIZE);
|
||||
serv->sv_ops = ops;
|
||||
serv->sv_threadfn = threadfn;
|
||||
xdrsize = 0;
|
||||
while (prog) {
|
||||
prog->pg_lovers = prog->pg_nvers-1;
|
||||
@ -511,22 +511,37 @@ __svc_create(struct svc_program *prog, unsigned int bufsize, int npools,
|
||||
return serv;
|
||||
}
|
||||
|
||||
struct svc_serv *
|
||||
svc_create(struct svc_program *prog, unsigned int bufsize,
|
||||
const struct svc_serv_ops *ops)
|
||||
/**
|
||||
* svc_create - Create an RPC service
|
||||
* @prog: the RPC program the new service will handle
|
||||
* @bufsize: maximum message size for @prog
|
||||
* @threadfn: a function to service RPC requests for @prog
|
||||
*
|
||||
* Returns an instantiated struct svc_serv object or NULL.
|
||||
*/
|
||||
struct svc_serv *svc_create(struct svc_program *prog, unsigned int bufsize,
|
||||
int (*threadfn)(void *data))
|
||||
{
|
||||
return __svc_create(prog, bufsize, /*npools*/1, ops);
|
||||
return __svc_create(prog, bufsize, 1, threadfn);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(svc_create);
|
||||
|
||||
struct svc_serv *
|
||||
svc_create_pooled(struct svc_program *prog, unsigned int bufsize,
|
||||
const struct svc_serv_ops *ops)
|
||||
/**
|
||||
* svc_create_pooled - Create an RPC service with pooled threads
|
||||
* @prog: the RPC program the new service will handle
|
||||
* @bufsize: maximum message size for @prog
|
||||
* @threadfn: a function to service RPC requests for @prog
|
||||
*
|
||||
* Returns an instantiated struct svc_serv object or NULL.
|
||||
*/
|
||||
struct svc_serv *svc_create_pooled(struct svc_program *prog,
|
||||
unsigned int bufsize,
|
||||
int (*threadfn)(void *data))
|
||||
{
|
||||
struct svc_serv *serv;
|
||||
unsigned int npools = svc_pool_map_get();
|
||||
|
||||
serv = __svc_create(prog, bufsize, npools, ops);
|
||||
serv = __svc_create(prog, bufsize, npools, threadfn);
|
||||
if (!serv)
|
||||
goto out_err;
|
||||
return serv;
|
||||
@ -536,15 +551,6 @@ out_err:
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(svc_create_pooled);
|
||||
|
||||
void svc_shutdown_net(struct svc_serv *serv, struct net *net)
|
||||
{
|
||||
svc_close_net(serv, net);
|
||||
|
||||
if (serv->sv_ops->svo_shutdown)
|
||||
serv->sv_ops->svo_shutdown(serv, net);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(svc_shutdown_net);
|
||||
|
||||
/*
|
||||
* Destroy an RPC service. Should be called with appropriate locking to
|
||||
* protect sv_permsocks and sv_tempsocks.
|
||||
@ -745,11 +751,9 @@ svc_start_kthreads(struct svc_serv *serv, struct svc_pool *pool, int nrservs)
|
||||
if (IS_ERR(rqstp))
|
||||
return PTR_ERR(rqstp);
|
||||
|
||||
__module_get(serv->sv_ops->svo_module);
|
||||
task = kthread_create_on_node(serv->sv_ops->svo_function, rqstp,
|
||||
task = kthread_create_on_node(serv->sv_threadfn, rqstp,
|
||||
node, "%s", serv->sv_name);
|
||||
if (IS_ERR(task)) {
|
||||
module_put(serv->sv_ops->svo_module);
|
||||
svc_exit_thread(rqstp);
|
||||
return PTR_ERR(task);
|
||||
}
|
||||
@ -1355,7 +1359,7 @@ svc_process_common(struct svc_rqst *rqstp, struct kvec *argv, struct kvec *resv)
|
||||
svc_authorise(rqstp);
|
||||
close_xprt:
|
||||
if (rqstp->rq_xprt && test_bit(XPT_TEMP, &rqstp->rq_xprt->xpt_flags))
|
||||
svc_close_xprt(rqstp->rq_xprt);
|
||||
svc_xprt_close(rqstp->rq_xprt);
|
||||
dprintk("svc: svc_process close\n");
|
||||
return 0;
|
||||
|
||||
|
@ -266,12 +266,12 @@ void svc_xprt_received(struct svc_xprt *xprt)
|
||||
}
|
||||
|
||||
/* As soon as we clear busy, the xprt could be closed and
|
||||
* 'put', so we need a reference to call svc_enqueue_xprt with:
|
||||
* 'put', so we need a reference to call svc_xprt_enqueue with:
|
||||
*/
|
||||
svc_xprt_get(xprt);
|
||||
smp_mb__before_atomic();
|
||||
clear_bit(XPT_BUSY, &xprt->xpt_flags);
|
||||
xprt->xpt_server->sv_ops->svo_enqueue_xprt(xprt);
|
||||
svc_xprt_enqueue(xprt);
|
||||
svc_xprt_put(xprt);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(svc_xprt_received);
|
||||
@ -285,7 +285,7 @@ void svc_add_new_perm_xprt(struct svc_serv *serv, struct svc_xprt *new)
|
||||
svc_xprt_received(new);
|
||||
}
|
||||
|
||||
static int _svc_create_xprt(struct svc_serv *serv, const char *xprt_name,
|
||||
static int _svc_xprt_create(struct svc_serv *serv, const char *xprt_name,
|
||||
struct net *net, const int family,
|
||||
const unsigned short port, int flags,
|
||||
const struct cred *cred)
|
||||
@ -321,21 +321,35 @@ static int _svc_create_xprt(struct svc_serv *serv, const char *xprt_name,
|
||||
return -EPROTONOSUPPORT;
|
||||
}
|
||||
|
||||
int svc_create_xprt(struct svc_serv *serv, const char *xprt_name,
|
||||
/**
|
||||
* svc_xprt_create - Add a new listener to @serv
|
||||
* @serv: target RPC service
|
||||
* @xprt_name: transport class name
|
||||
* @net: network namespace
|
||||
* @family: network address family
|
||||
* @port: listener port
|
||||
* @flags: SVC_SOCK flags
|
||||
* @cred: credential to bind to this transport
|
||||
*
|
||||
* Return values:
|
||||
* %0: New listener added successfully
|
||||
* %-EPROTONOSUPPORT: Requested transport type not supported
|
||||
*/
|
||||
int svc_xprt_create(struct svc_serv *serv, const char *xprt_name,
|
||||
struct net *net, const int family,
|
||||
const unsigned short port, int flags,
|
||||
const struct cred *cred)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = _svc_create_xprt(serv, xprt_name, net, family, port, flags, cred);
|
||||
err = _svc_xprt_create(serv, xprt_name, net, family, port, flags, cred);
|
||||
if (err == -EPROTONOSUPPORT) {
|
||||
request_module("svc%s", xprt_name);
|
||||
err = _svc_create_xprt(serv, xprt_name, net, family, port, flags, cred);
|
||||
err = _svc_xprt_create(serv, xprt_name, net, family, port, flags, cred);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(svc_create_xprt);
|
||||
EXPORT_SYMBOL_GPL(svc_xprt_create);
|
||||
|
||||
/*
|
||||
* Copy the local and remote xprt addresses to the rqstp structure
|
||||
@ -411,6 +425,8 @@ static bool svc_xprt_ready(struct svc_xprt *xprt)
|
||||
smp_rmb();
|
||||
xpt_flags = READ_ONCE(xprt->xpt_flags);
|
||||
|
||||
if (xpt_flags & BIT(XPT_BUSY))
|
||||
return false;
|
||||
if (xpt_flags & (BIT(XPT_CONN) | BIT(XPT_CLOSE)))
|
||||
return true;
|
||||
if (xpt_flags & (BIT(XPT_DATA) | BIT(XPT_DEFERRED))) {
|
||||
@ -423,7 +439,12 @@ static bool svc_xprt_ready(struct svc_xprt *xprt)
|
||||
return false;
|
||||
}
|
||||
|
||||
void svc_xprt_do_enqueue(struct svc_xprt *xprt)
|
||||
/**
|
||||
* svc_xprt_enqueue - Queue a transport on an idle nfsd thread
|
||||
* @xprt: transport with data pending
|
||||
*
|
||||
*/
|
||||
void svc_xprt_enqueue(struct svc_xprt *xprt)
|
||||
{
|
||||
struct svc_pool *pool;
|
||||
struct svc_rqst *rqstp = NULL;
|
||||
@ -467,19 +488,6 @@ out_unlock:
|
||||
put_cpu();
|
||||
trace_svc_xprt_enqueue(xprt, rqstp);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(svc_xprt_do_enqueue);
|
||||
|
||||
/*
|
||||
* Queue up a transport with data pending. If there are idle nfsd
|
||||
* processes, wake 'em up.
|
||||
*
|
||||
*/
|
||||
void svc_xprt_enqueue(struct svc_xprt *xprt)
|
||||
{
|
||||
if (test_bit(XPT_BUSY, &xprt->xpt_flags))
|
||||
return;
|
||||
xprt->xpt_server->sv_ops->svo_enqueue_xprt(xprt);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(svc_xprt_enqueue);
|
||||
|
||||
/*
|
||||
@ -1060,7 +1068,12 @@ static void svc_delete_xprt(struct svc_xprt *xprt)
|
||||
svc_xprt_put(xprt);
|
||||
}
|
||||
|
||||
void svc_close_xprt(struct svc_xprt *xprt)
|
||||
/**
|
||||
* svc_xprt_close - Close a client connection
|
||||
* @xprt: transport to disconnect
|
||||
*
|
||||
*/
|
||||
void svc_xprt_close(struct svc_xprt *xprt)
|
||||
{
|
||||
trace_svc_xprt_close(xprt);
|
||||
set_bit(XPT_CLOSE, &xprt->xpt_flags);
|
||||
@ -1075,7 +1088,7 @@ void svc_close_xprt(struct svc_xprt *xprt)
|
||||
*/
|
||||
svc_delete_xprt(xprt);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(svc_close_xprt);
|
||||
EXPORT_SYMBOL_GPL(svc_xprt_close);
|
||||
|
||||
static int svc_close_list(struct svc_serv *serv, struct list_head *xprt_list, struct net *net)
|
||||
{
|
||||
@ -1127,7 +1140,11 @@ static void svc_clean_up_xprts(struct svc_serv *serv, struct net *net)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
/**
|
||||
* svc_xprt_destroy_all - Destroy transports associated with @serv
|
||||
* @serv: RPC service to be shut down
|
||||
* @net: target network namespace
|
||||
*
|
||||
* Server threads may still be running (especially in the case where the
|
||||
* service is still running in other network namespaces).
|
||||
*
|
||||
@ -1139,7 +1156,7 @@ static void svc_clean_up_xprts(struct svc_serv *serv, struct net *net)
|
||||
* threads, we may need to wait a little while and then check again to
|
||||
* see if they're done.
|
||||
*/
|
||||
void svc_close_net(struct svc_serv *serv, struct net *net)
|
||||
void svc_xprt_destroy_all(struct svc_serv *serv, struct net *net)
|
||||
{
|
||||
int delay = 0;
|
||||
|
||||
@ -1150,6 +1167,7 @@ void svc_close_net(struct svc_serv *serv, struct net *net)
|
||||
msleep(delay++);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(svc_xprt_destroy_all);
|
||||
|
||||
/*
|
||||
* Handle defer and revisit of requests
|
||||
|
@ -31,10 +31,12 @@
|
||||
*/
|
||||
extern struct auth_ops svcauth_null;
|
||||
extern struct auth_ops svcauth_unix;
|
||||
extern struct auth_ops svcauth_tls;
|
||||
|
||||
static struct auth_ops __rcu *authtab[RPC_AUTH_MAXFLAVOR] = {
|
||||
[RPC_AUTH_NULL] = (struct auth_ops __force __rcu *)&svcauth_null,
|
||||
[RPC_AUTH_UNIX] = (struct auth_ops __force __rcu *)&svcauth_unix,
|
||||
[RPC_AUTH_TLS] = (struct auth_ops __force __rcu *)&svcauth_tls,
|
||||
};
|
||||
|
||||
static struct auth_ops *
|
||||
|
@ -37,6 +37,7 @@ struct unix_domain {
|
||||
|
||||
extern struct auth_ops svcauth_null;
|
||||
extern struct auth_ops svcauth_unix;
|
||||
extern struct auth_ops svcauth_tls;
|
||||
|
||||
static void svcauth_unix_domain_release_rcu(struct rcu_head *head)
|
||||
{
|
||||
@ -788,6 +789,65 @@ struct auth_ops svcauth_null = {
|
||||
};
|
||||
|
||||
|
||||
static int
|
||||
svcauth_tls_accept(struct svc_rqst *rqstp)
|
||||
{
|
||||
struct svc_cred *cred = &rqstp->rq_cred;
|
||||
struct kvec *argv = rqstp->rq_arg.head;
|
||||
struct kvec *resv = rqstp->rq_res.head;
|
||||
|
||||
if (argv->iov_len < XDR_UNIT * 3)
|
||||
return SVC_GARBAGE;
|
||||
|
||||
/* Call's cred length */
|
||||
if (svc_getu32(argv) != xdr_zero) {
|
||||
rqstp->rq_auth_stat = rpc_autherr_badcred;
|
||||
return SVC_DENIED;
|
||||
}
|
||||
|
||||
/* Call's verifier flavor and its length */
|
||||
if (svc_getu32(argv) != rpc_auth_null ||
|
||||
svc_getu32(argv) != xdr_zero) {
|
||||
rqstp->rq_auth_stat = rpc_autherr_badverf;
|
||||
return SVC_DENIED;
|
||||
}
|
||||
|
||||
/* AUTH_TLS is not valid on non-NULL procedures */
|
||||
if (rqstp->rq_proc != 0) {
|
||||
rqstp->rq_auth_stat = rpc_autherr_badcred;
|
||||
return SVC_DENIED;
|
||||
}
|
||||
|
||||
/* Mapping to nobody uid/gid is required */
|
||||
cred->cr_uid = INVALID_UID;
|
||||
cred->cr_gid = INVALID_GID;
|
||||
cred->cr_group_info = groups_alloc(0);
|
||||
if (cred->cr_group_info == NULL)
|
||||
return SVC_CLOSE; /* kmalloc failure - client must retry */
|
||||
|
||||
/* Reply's verifier */
|
||||
svc_putnl(resv, RPC_AUTH_NULL);
|
||||
if (rqstp->rq_xprt->xpt_ops->xpo_start_tls) {
|
||||
svc_putnl(resv, 8);
|
||||
memcpy(resv->iov_base + resv->iov_len, "STARTTLS", 8);
|
||||
resv->iov_len += 8;
|
||||
} else
|
||||
svc_putnl(resv, 0);
|
||||
|
||||
rqstp->rq_cred.cr_flavor = RPC_AUTH_TLS;
|
||||
return SVC_OK;
|
||||
}
|
||||
|
||||
struct auth_ops svcauth_tls = {
|
||||
.name = "tls",
|
||||
.owner = THIS_MODULE,
|
||||
.flavour = RPC_AUTH_TLS,
|
||||
.accept = svcauth_tls_accept,
|
||||
.release = svcauth_null_release,
|
||||
.set_client = svcauth_unix_set_client,
|
||||
};
|
||||
|
||||
|
||||
static int
|
||||
svcauth_unix_accept(struct svc_rqst *rqstp)
|
||||
{
|
||||
|
@ -198,7 +198,7 @@ static int xprt_rdma_bc_send_request(struct rpc_rqst *rqst)
|
||||
|
||||
ret = rpcrdma_bc_send_request(rdma, rqst);
|
||||
if (ret == -ENOTCONN)
|
||||
svc_close_xprt(sxprt);
|
||||
svc_xprt_close(sxprt);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user