diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-09 12:19:15 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-09-09 12:19:15 -0400 |
| commit | bf97293eb878df3792d9de7213bd7b82135aea77 (patch) | |
| tree | 16cb367bd78095b9eb8a54c800fcddfcccb618c7 /include/linux | |
| parent | 16d70e15295953b19ecf59e943723a181782b856 (diff) | |
| parent | b1b3e136948a2bf4915326acb0d825d7d180753f (diff) | |
Merge tag 'nfs-for-3.12-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs
Pull NFS client updates from Trond Myklebust:
"Highlights include:
- Fix NFSv4 recovery so that it doesn't recover lost locks in cases
such as lease loss due to a network partition, where doing so may
result in data corruption. Add a kernel parameter to control
choice of legacy behaviour or not.
- Performance improvements when 2 processes are writing to the same
file.
- Flush data to disk when an RPCSEC_GSS session timeout is imminent.
- Implement NFSv4.1 SP4_MACH_CRED state protection to prevent other
NFS clients from being able to manipulate our lease and file
locking state.
- Allow sharing of RPCSEC_GSS caches between different rpc clients.
- Fix the broken NFSv4 security auto-negotiation between client and
server.
- Fix rmdir() to wait for outstanding sillyrename unlinks to complete
- Add a tracepoint framework for debugging NFSv4 state recovery
issues.
- Add tracing to the generic NFS layer.
- Add tracing for the SUNRPC socket connection state.
- Clean up the rpc_pipefs mount/umount event management.
- Merge more patches from Chuck in preparation for NFSv4 migration
support"
* tag 'nfs-for-3.12-1' of git://git.linux-nfs.org/projects/trondmy/linux-nfs: (107 commits)
NFSv4: use mach cred for SECINFO_NO_NAME w/ integrity
NFS: nfs_compare_super shouldn't check the auth flavour unless 'sec=' was set
NFSv4: Allow security autonegotiation for submounts
NFSv4: Disallow security negotiation for lookups when 'sec=' is specified
NFSv4: Fix security auto-negotiation
NFS: Clean up nfs_parse_security_flavors()
NFS: Clean up the auth flavour array mess
NFSv4.1 Use MDS auth flavor for data server connection
NFS: Don't check lock owner compatability unless file is locked (part 2)
NFS: Don't check lock owner compatibility in writes unless file is locked
nfs4: Map NFS4ERR_WRONG_CRED to EPERM
nfs4.1: Add SP4_MACH_CRED write and commit support
nfs4.1: Add SP4_MACH_CRED stateid support
nfs4.1: Add SP4_MACH_CRED secinfo support
nfs4.1: Add SP4_MACH_CRED cleanup support
nfs4.1: Add state protection handler
nfs4.1: Minimal SP4_MACH_CRED implementation
SUNRPC: Replace pointer values with task->tk_pid and rpc_clnt->cl_clid
SUNRPC: Add an identifier for struct rpc_clnt
SUNRPC: Ensure rpc_task->tk_pid is available for tracepoints
...
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/nfs_fs.h | 1 | ||||
| -rw-r--r-- | include/linux/nfs_fs_sb.h | 13 | ||||
| -rw-r--r-- | include/linux/nfs_xdr.h | 25 | ||||
| -rw-r--r-- | include/linux/sunrpc/auth.h | 28 | ||||
| -rw-r--r-- | include/linux/sunrpc/clnt.h | 6 | ||||
| -rw-r--r-- | include/linux/sunrpc/rpc_pipe_fs.h | 39 | ||||
| -rw-r--r-- | include/linux/sunrpc/sched.h | 2 |
7 files changed, 102 insertions, 12 deletions
diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h index 7125cef74164..3ea4cde8701c 100644 --- a/include/linux/nfs_fs.h +++ b/include/linux/nfs_fs.h | |||
| @@ -524,6 +524,7 @@ static inline void nfs4_label_free(void *label) {} | |||
| 524 | * linux/fs/nfs/unlink.c | 524 | * linux/fs/nfs/unlink.c |
| 525 | */ | 525 | */ |
| 526 | extern void nfs_complete_unlink(struct dentry *dentry, struct inode *); | 526 | extern void nfs_complete_unlink(struct dentry *dentry, struct inode *); |
| 527 | extern void nfs_wait_on_sillyrename(struct dentry *dentry); | ||
| 527 | extern void nfs_block_sillyrename(struct dentry *dentry); | 528 | extern void nfs_block_sillyrename(struct dentry *dentry); |
| 528 | extern void nfs_unblock_sillyrename(struct dentry *dentry); | 529 | extern void nfs_unblock_sillyrename(struct dentry *dentry); |
| 529 | extern int nfs_sillyrename(struct inode *dir, struct dentry *dentry); | 530 | extern int nfs_sillyrename(struct inode *dir, struct dentry *dentry); |
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index d2212432c456..b8cedced50c9 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h | |||
| @@ -56,6 +56,7 @@ struct nfs_client { | |||
| 56 | struct rpc_cred *cl_machine_cred; | 56 | struct rpc_cred *cl_machine_cred; |
| 57 | 57 | ||
| 58 | #if IS_ENABLED(CONFIG_NFS_V4) | 58 | #if IS_ENABLED(CONFIG_NFS_V4) |
| 59 | struct list_head cl_ds_clients; /* auth flavor data servers */ | ||
| 59 | u64 cl_clientid; /* constant */ | 60 | u64 cl_clientid; /* constant */ |
| 60 | nfs4_verifier cl_confirm; /* Clientid verifier */ | 61 | nfs4_verifier cl_confirm; /* Clientid verifier */ |
| 61 | unsigned long cl_state; | 62 | unsigned long cl_state; |
| @@ -78,6 +79,9 @@ struct nfs_client { | |||
| 78 | u32 cl_cb_ident; /* v4.0 callback identifier */ | 79 | u32 cl_cb_ident; /* v4.0 callback identifier */ |
| 79 | const struct nfs4_minor_version_ops *cl_mvops; | 80 | const struct nfs4_minor_version_ops *cl_mvops; |
| 80 | 81 | ||
| 82 | /* NFSv4.0 transport blocking */ | ||
| 83 | struct nfs4_slot_table *cl_slot_tbl; | ||
| 84 | |||
| 81 | /* The sequence id to use for the next CREATE_SESSION */ | 85 | /* The sequence id to use for the next CREATE_SESSION */ |
| 82 | u32 cl_seqid; | 86 | u32 cl_seqid; |
| 83 | /* The flags used for obtaining the clientid during EXCHANGE_ID */ | 87 | /* The flags used for obtaining the clientid during EXCHANGE_ID */ |
| @@ -87,6 +91,15 @@ struct nfs_client { | |||
| 87 | struct nfs41_server_owner *cl_serverowner; | 91 | struct nfs41_server_owner *cl_serverowner; |
| 88 | struct nfs41_server_scope *cl_serverscope; | 92 | struct nfs41_server_scope *cl_serverscope; |
| 89 | struct nfs41_impl_id *cl_implid; | 93 | struct nfs41_impl_id *cl_implid; |
| 94 | /* nfs 4.1+ state protection modes: */ | ||
| 95 | unsigned long cl_sp4_flags; | ||
| 96 | #define NFS_SP4_MACH_CRED_MINIMAL 1 /* Minimal sp4_mach_cred - state ops | ||
| 97 | * must use machine cred */ | ||
| 98 | #define NFS_SP4_MACH_CRED_CLEANUP 2 /* CLOSE and LOCKU */ | ||
| 99 | #define NFS_SP4_MACH_CRED_SECINFO 3 /* SECINFO and SECINFO_NO_NAME */ | ||
| 100 | #define NFS_SP4_MACH_CRED_STATEID 4 /* TEST_STATEID and FREE_STATEID */ | ||
| 101 | #define NFS_SP4_MACH_CRED_WRITE 5 /* WRITE */ | ||
| 102 | #define NFS_SP4_MACH_CRED_COMMIT 6 /* COMMIT */ | ||
| 90 | #endif /* CONFIG_NFS_V4 */ | 103 | #endif /* CONFIG_NFS_V4 */ |
| 91 | 104 | ||
| 92 | #ifdef CONFIG_NFS_FSCACHE | 105 | #ifdef CONFIG_NFS_FSCACHE |
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h index 8651574a305b..01fd84b566f7 100644 --- a/include/linux/nfs_xdr.h +++ b/include/linux/nfs_xdr.h | |||
| @@ -1107,6 +1107,23 @@ struct pnfs_ds_commit_info { | |||
| 1107 | struct pnfs_commit_bucket *buckets; | 1107 | struct pnfs_commit_bucket *buckets; |
| 1108 | }; | 1108 | }; |
| 1109 | 1109 | ||
| 1110 | #define NFS4_OP_MAP_NUM_LONGS \ | ||
| 1111 | DIV_ROUND_UP(LAST_NFS4_OP, 8 * sizeof(unsigned long)) | ||
| 1112 | #define NFS4_OP_MAP_NUM_WORDS \ | ||
| 1113 | (NFS4_OP_MAP_NUM_LONGS * sizeof(unsigned long) / sizeof(u32)) | ||
| 1114 | struct nfs4_op_map { | ||
| 1115 | union { | ||
| 1116 | unsigned long longs[NFS4_OP_MAP_NUM_LONGS]; | ||
| 1117 | u32 words[NFS4_OP_MAP_NUM_WORDS]; | ||
| 1118 | } u; | ||
| 1119 | }; | ||
| 1120 | |||
| 1121 | struct nfs41_state_protection { | ||
| 1122 | u32 how; | ||
| 1123 | struct nfs4_op_map enforce; | ||
| 1124 | struct nfs4_op_map allow; | ||
| 1125 | }; | ||
| 1126 | |||
| 1110 | #define NFS4_EXCHANGE_ID_LEN (48) | 1127 | #define NFS4_EXCHANGE_ID_LEN (48) |
| 1111 | struct nfs41_exchange_id_args { | 1128 | struct nfs41_exchange_id_args { |
| 1112 | struct nfs_client *client; | 1129 | struct nfs_client *client; |
| @@ -1114,6 +1131,7 @@ struct nfs41_exchange_id_args { | |||
| 1114 | unsigned int id_len; | 1131 | unsigned int id_len; |
| 1115 | char id[NFS4_EXCHANGE_ID_LEN]; | 1132 | char id[NFS4_EXCHANGE_ID_LEN]; |
| 1116 | u32 flags; | 1133 | u32 flags; |
| 1134 | struct nfs41_state_protection state_protect; | ||
| 1117 | }; | 1135 | }; |
| 1118 | 1136 | ||
| 1119 | struct nfs41_server_owner { | 1137 | struct nfs41_server_owner { |
| @@ -1146,6 +1164,7 @@ struct nfs41_exchange_id_res { | |||
| 1146 | struct nfs41_server_owner *server_owner; | 1164 | struct nfs41_server_owner *server_owner; |
| 1147 | struct nfs41_server_scope *server_scope; | 1165 | struct nfs41_server_scope *server_scope; |
| 1148 | struct nfs41_impl_id *impl_id; | 1166 | struct nfs41_impl_id *impl_id; |
| 1167 | struct nfs41_state_protection state_protect; | ||
| 1149 | }; | 1168 | }; |
| 1150 | 1169 | ||
| 1151 | struct nfs41_create_session_args { | 1170 | struct nfs41_create_session_args { |
| @@ -1419,12 +1438,12 @@ struct nfs_rpc_ops { | |||
| 1419 | void (*read_setup) (struct nfs_read_data *, struct rpc_message *); | 1438 | void (*read_setup) (struct nfs_read_data *, struct rpc_message *); |
| 1420 | void (*read_pageio_init)(struct nfs_pageio_descriptor *, struct inode *, | 1439 | void (*read_pageio_init)(struct nfs_pageio_descriptor *, struct inode *, |
| 1421 | const struct nfs_pgio_completion_ops *); | 1440 | const struct nfs_pgio_completion_ops *); |
| 1422 | void (*read_rpc_prepare)(struct rpc_task *, struct nfs_read_data *); | 1441 | int (*read_rpc_prepare)(struct rpc_task *, struct nfs_read_data *); |
| 1423 | int (*read_done) (struct rpc_task *, struct nfs_read_data *); | 1442 | int (*read_done) (struct rpc_task *, struct nfs_read_data *); |
| 1424 | void (*write_setup) (struct nfs_write_data *, struct rpc_message *); | 1443 | void (*write_setup) (struct nfs_write_data *, struct rpc_message *); |
| 1425 | void (*write_pageio_init)(struct nfs_pageio_descriptor *, struct inode *, int, | 1444 | void (*write_pageio_init)(struct nfs_pageio_descriptor *, struct inode *, int, |
| 1426 | const struct nfs_pgio_completion_ops *); | 1445 | const struct nfs_pgio_completion_ops *); |
| 1427 | void (*write_rpc_prepare)(struct rpc_task *, struct nfs_write_data *); | 1446 | int (*write_rpc_prepare)(struct rpc_task *, struct nfs_write_data *); |
| 1428 | int (*write_done) (struct rpc_task *, struct nfs_write_data *); | 1447 | int (*write_done) (struct rpc_task *, struct nfs_write_data *); |
| 1429 | void (*commit_setup) (struct nfs_commit_data *, struct rpc_message *); | 1448 | void (*commit_setup) (struct nfs_commit_data *, struct rpc_message *); |
| 1430 | void (*commit_rpc_prepare)(struct rpc_task *, struct nfs_commit_data *); | 1449 | void (*commit_rpc_prepare)(struct rpc_task *, struct nfs_commit_data *); |
| @@ -1442,7 +1461,7 @@ struct nfs_rpc_ops { | |||
| 1442 | struct nfs_client *(*alloc_client) (const struct nfs_client_initdata *); | 1461 | struct nfs_client *(*alloc_client) (const struct nfs_client_initdata *); |
| 1443 | struct nfs_client * | 1462 | struct nfs_client * |
| 1444 | (*init_client) (struct nfs_client *, const struct rpc_timeout *, | 1463 | (*init_client) (struct nfs_client *, const struct rpc_timeout *, |
| 1445 | const char *, rpc_authflavor_t); | 1464 | const char *); |
| 1446 | void (*free_client) (struct nfs_client *); | 1465 | void (*free_client) (struct nfs_client *); |
| 1447 | struct nfs_server *(*create_server)(struct nfs_mount_info *, struct nfs_subversion *); | 1466 | struct nfs_server *(*create_server)(struct nfs_mount_info *, struct nfs_subversion *); |
| 1448 | struct nfs_server *(*clone_server)(struct nfs_server *, struct nfs_fh *, | 1467 | struct nfs_server *(*clone_server)(struct nfs_server *, struct nfs_fh *, |
diff --git a/include/linux/sunrpc/auth.h b/include/linux/sunrpc/auth.h index 0dd00f4f6810..790be1472792 100644 --- a/include/linux/sunrpc/auth.h +++ b/include/linux/sunrpc/auth.h | |||
| @@ -24,12 +24,21 @@ | |||
| 24 | 24 | ||
| 25 | struct rpcsec_gss_info; | 25 | struct rpcsec_gss_info; |
| 26 | 26 | ||
| 27 | /* auth_cred ac_flags bits */ | ||
| 28 | enum { | ||
| 29 | RPC_CRED_NO_CRKEY_TIMEOUT = 0, /* underlying cred has no key timeout */ | ||
| 30 | RPC_CRED_KEY_EXPIRE_SOON = 1, /* underlying cred key will expire soon */ | ||
| 31 | RPC_CRED_NOTIFY_TIMEOUT = 2, /* nofity generic cred when underlying | ||
| 32 | key will expire soon */ | ||
| 33 | }; | ||
| 34 | |||
| 27 | /* Work around the lack of a VFS credential */ | 35 | /* Work around the lack of a VFS credential */ |
| 28 | struct auth_cred { | 36 | struct auth_cred { |
| 29 | kuid_t uid; | 37 | kuid_t uid; |
| 30 | kgid_t gid; | 38 | kgid_t gid; |
| 31 | struct group_info *group_info; | 39 | struct group_info *group_info; |
| 32 | const char *principal; | 40 | const char *principal; |
| 41 | unsigned long ac_flags; | ||
| 33 | unsigned char machine_cred : 1; | 42 | unsigned char machine_cred : 1; |
| 34 | }; | 43 | }; |
| 35 | 44 | ||
| @@ -87,6 +96,11 @@ struct rpc_auth { | |||
| 87 | /* per-flavor data */ | 96 | /* per-flavor data */ |
| 88 | }; | 97 | }; |
| 89 | 98 | ||
| 99 | struct rpc_auth_create_args { | ||
| 100 | rpc_authflavor_t pseudoflavor; | ||
| 101 | const char *target_name; | ||
| 102 | }; | ||
| 103 | |||
| 90 | /* Flags for rpcauth_lookupcred() */ | 104 | /* Flags for rpcauth_lookupcred() */ |
| 91 | #define RPCAUTH_LOOKUP_NEW 0x01 /* Accept an uninitialised cred */ | 105 | #define RPCAUTH_LOOKUP_NEW 0x01 /* Accept an uninitialised cred */ |
| 92 | 106 | ||
| @@ -97,17 +111,17 @@ struct rpc_authops { | |||
| 97 | struct module *owner; | 111 | struct module *owner; |
| 98 | rpc_authflavor_t au_flavor; /* flavor (RPC_AUTH_*) */ | 112 | rpc_authflavor_t au_flavor; /* flavor (RPC_AUTH_*) */ |
| 99 | char * au_name; | 113 | char * au_name; |
| 100 | struct rpc_auth * (*create)(struct rpc_clnt *, rpc_authflavor_t); | 114 | struct rpc_auth * (*create)(struct rpc_auth_create_args *, struct rpc_clnt *); |
| 101 | void (*destroy)(struct rpc_auth *); | 115 | void (*destroy)(struct rpc_auth *); |
| 102 | 116 | ||
| 103 | struct rpc_cred * (*lookup_cred)(struct rpc_auth *, struct auth_cred *, int); | 117 | struct rpc_cred * (*lookup_cred)(struct rpc_auth *, struct auth_cred *, int); |
| 104 | struct rpc_cred * (*crcreate)(struct rpc_auth*, struct auth_cred *, int); | 118 | struct rpc_cred * (*crcreate)(struct rpc_auth*, struct auth_cred *, int); |
| 105 | int (*pipes_create)(struct rpc_auth *); | ||
| 106 | void (*pipes_destroy)(struct rpc_auth *); | ||
| 107 | int (*list_pseudoflavors)(rpc_authflavor_t *, int); | 119 | int (*list_pseudoflavors)(rpc_authflavor_t *, int); |
| 108 | rpc_authflavor_t (*info2flavor)(struct rpcsec_gss_info *); | 120 | rpc_authflavor_t (*info2flavor)(struct rpcsec_gss_info *); |
| 109 | int (*flavor2info)(rpc_authflavor_t, | 121 | int (*flavor2info)(rpc_authflavor_t, |
| 110 | struct rpcsec_gss_info *); | 122 | struct rpcsec_gss_info *); |
| 123 | int (*key_timeout)(struct rpc_auth *, | ||
| 124 | struct rpc_cred *); | ||
| 111 | }; | 125 | }; |
| 112 | 126 | ||
| 113 | struct rpc_credops { | 127 | struct rpc_credops { |
| @@ -124,6 +138,8 @@ struct rpc_credops { | |||
| 124 | void *, __be32 *, void *); | 138 | void *, __be32 *, void *); |
| 125 | int (*crunwrap_resp)(struct rpc_task *, kxdrdproc_t, | 139 | int (*crunwrap_resp)(struct rpc_task *, kxdrdproc_t, |
| 126 | void *, __be32 *, void *); | 140 | void *, __be32 *, void *); |
| 141 | int (*crkey_timeout)(struct rpc_cred *); | ||
| 142 | bool (*crkey_to_expire)(struct rpc_cred *); | ||
| 127 | }; | 143 | }; |
| 128 | 144 | ||
| 129 | extern const struct rpc_authops authunix_ops; | 145 | extern const struct rpc_authops authunix_ops; |
| @@ -140,7 +156,8 @@ struct rpc_cred * rpc_lookup_cred(void); | |||
| 140 | struct rpc_cred * rpc_lookup_machine_cred(const char *service_name); | 156 | struct rpc_cred * rpc_lookup_machine_cred(const char *service_name); |
| 141 | int rpcauth_register(const struct rpc_authops *); | 157 | int rpcauth_register(const struct rpc_authops *); |
| 142 | int rpcauth_unregister(const struct rpc_authops *); | 158 | int rpcauth_unregister(const struct rpc_authops *); |
| 143 | struct rpc_auth * rpcauth_create(rpc_authflavor_t, struct rpc_clnt *); | 159 | struct rpc_auth * rpcauth_create(struct rpc_auth_create_args *, |
| 160 | struct rpc_clnt *); | ||
| 144 | void rpcauth_release(struct rpc_auth *); | 161 | void rpcauth_release(struct rpc_auth *); |
| 145 | rpc_authflavor_t rpcauth_get_pseudoflavor(rpc_authflavor_t, | 162 | rpc_authflavor_t rpcauth_get_pseudoflavor(rpc_authflavor_t, |
| 146 | struct rpcsec_gss_info *); | 163 | struct rpcsec_gss_info *); |
| @@ -162,6 +179,9 @@ int rpcauth_uptodatecred(struct rpc_task *); | |||
| 162 | int rpcauth_init_credcache(struct rpc_auth *); | 179 | int rpcauth_init_credcache(struct rpc_auth *); |
| 163 | void rpcauth_destroy_credcache(struct rpc_auth *); | 180 | void rpcauth_destroy_credcache(struct rpc_auth *); |
| 164 | void rpcauth_clear_credcache(struct rpc_cred_cache *); | 181 | void rpcauth_clear_credcache(struct rpc_cred_cache *); |
| 182 | int rpcauth_key_timeout_notify(struct rpc_auth *, | ||
| 183 | struct rpc_cred *); | ||
| 184 | bool rpcauth_cred_key_to_expire(struct rpc_cred *); | ||
| 165 | 185 | ||
| 166 | static inline | 186 | static inline |
| 167 | struct rpc_cred * get_rpccred(struct rpc_cred *cred) | 187 | struct rpc_cred * get_rpccred(struct rpc_cred *cred) |
diff --git a/include/linux/sunrpc/clnt.h b/include/linux/sunrpc/clnt.h index bfe11be81f6f..6740801aa71a 100644 --- a/include/linux/sunrpc/clnt.h +++ b/include/linux/sunrpc/clnt.h | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | #include <linux/sunrpc/stats.h> | 21 | #include <linux/sunrpc/stats.h> |
| 22 | #include <linux/sunrpc/xdr.h> | 22 | #include <linux/sunrpc/xdr.h> |
| 23 | #include <linux/sunrpc/timer.h> | 23 | #include <linux/sunrpc/timer.h> |
| 24 | #include <linux/sunrpc/rpc_pipe_fs.h> | ||
| 24 | #include <asm/signal.h> | 25 | #include <asm/signal.h> |
| 25 | #include <linux/path.h> | 26 | #include <linux/path.h> |
| 26 | #include <net/ipv6.h> | 27 | #include <net/ipv6.h> |
| @@ -32,6 +33,7 @@ struct rpc_inode; | |||
| 32 | */ | 33 | */ |
| 33 | struct rpc_clnt { | 34 | struct rpc_clnt { |
| 34 | atomic_t cl_count; /* Number of references */ | 35 | atomic_t cl_count; /* Number of references */ |
| 36 | unsigned int cl_clid; /* client id */ | ||
| 35 | struct list_head cl_clients; /* Global list of clients */ | 37 | struct list_head cl_clients; /* Global list of clients */ |
| 36 | struct list_head cl_tasks; /* List of tasks */ | 38 | struct list_head cl_tasks; /* List of tasks */ |
| 37 | spinlock_t cl_lock; /* spinlock */ | 39 | spinlock_t cl_lock; /* spinlock */ |
| @@ -41,7 +43,6 @@ struct rpc_clnt { | |||
| 41 | cl_vers, /* RPC version number */ | 43 | cl_vers, /* RPC version number */ |
| 42 | cl_maxproc; /* max procedure number */ | 44 | cl_maxproc; /* max procedure number */ |
| 43 | 45 | ||
| 44 | const char * cl_protname; /* protocol name */ | ||
| 45 | struct rpc_auth * cl_auth; /* authenticator */ | 46 | struct rpc_auth * cl_auth; /* authenticator */ |
| 46 | struct rpc_stat * cl_stats; /* per-program statistics */ | 47 | struct rpc_stat * cl_stats; /* per-program statistics */ |
| 47 | struct rpc_iostats * cl_metrics; /* per-client statistics */ | 48 | struct rpc_iostats * cl_metrics; /* per-client statistics */ |
| @@ -56,12 +57,11 @@ struct rpc_clnt { | |||
| 56 | 57 | ||
| 57 | int cl_nodelen; /* nodename length */ | 58 | int cl_nodelen; /* nodename length */ |
| 58 | char cl_nodename[UNX_MAXNODENAME]; | 59 | char cl_nodename[UNX_MAXNODENAME]; |
| 59 | struct dentry * cl_dentry; | 60 | struct rpc_pipe_dir_head cl_pipedir_objects; |
| 60 | struct rpc_clnt * cl_parent; /* Points to parent of clones */ | 61 | struct rpc_clnt * cl_parent; /* Points to parent of clones */ |
| 61 | struct rpc_rtt cl_rtt_default; | 62 | struct rpc_rtt cl_rtt_default; |
| 62 | struct rpc_timeout cl_timeout_default; | 63 | struct rpc_timeout cl_timeout_default; |
| 63 | const struct rpc_program *cl_program; | 64 | const struct rpc_program *cl_program; |
| 64 | char *cl_principal; /* target to authenticate to */ | ||
| 65 | }; | 65 | }; |
| 66 | 66 | ||
| 67 | /* | 67 | /* |
diff --git a/include/linux/sunrpc/rpc_pipe_fs.h b/include/linux/sunrpc/rpc_pipe_fs.h index aa5b582cc471..a353e0300b54 100644 --- a/include/linux/sunrpc/rpc_pipe_fs.h +++ b/include/linux/sunrpc/rpc_pipe_fs.h | |||
| @@ -5,6 +5,26 @@ | |||
| 5 | 5 | ||
| 6 | #include <linux/workqueue.h> | 6 | #include <linux/workqueue.h> |
| 7 | 7 | ||
| 8 | struct rpc_pipe_dir_head { | ||
| 9 | struct list_head pdh_entries; | ||
| 10 | struct dentry *pdh_dentry; | ||
| 11 | }; | ||
| 12 | |||
| 13 | struct rpc_pipe_dir_object_ops; | ||
| 14 | struct rpc_pipe_dir_object { | ||
| 15 | struct list_head pdo_head; | ||
| 16 | const struct rpc_pipe_dir_object_ops *pdo_ops; | ||
| 17 | |||
| 18 | void *pdo_data; | ||
| 19 | }; | ||
| 20 | |||
| 21 | struct rpc_pipe_dir_object_ops { | ||
| 22 | int (*create)(struct dentry *dir, | ||
| 23 | struct rpc_pipe_dir_object *pdo); | ||
| 24 | void (*destroy)(struct dentry *dir, | ||
| 25 | struct rpc_pipe_dir_object *pdo); | ||
| 26 | }; | ||
| 27 | |||
| 8 | struct rpc_pipe_msg { | 28 | struct rpc_pipe_msg { |
| 9 | struct list_head list; | 29 | struct list_head list; |
| 10 | void *data; | 30 | void *data; |
| @@ -74,7 +94,24 @@ extern int rpc_queue_upcall(struct rpc_pipe *, struct rpc_pipe_msg *); | |||
| 74 | 94 | ||
| 75 | struct rpc_clnt; | 95 | struct rpc_clnt; |
| 76 | extern struct dentry *rpc_create_client_dir(struct dentry *, const char *, struct rpc_clnt *); | 96 | extern struct dentry *rpc_create_client_dir(struct dentry *, const char *, struct rpc_clnt *); |
| 77 | extern int rpc_remove_client_dir(struct dentry *); | 97 | extern int rpc_remove_client_dir(struct rpc_clnt *); |
| 98 | |||
| 99 | extern void rpc_init_pipe_dir_head(struct rpc_pipe_dir_head *pdh); | ||
| 100 | extern void rpc_init_pipe_dir_object(struct rpc_pipe_dir_object *pdo, | ||
| 101 | const struct rpc_pipe_dir_object_ops *pdo_ops, | ||
| 102 | void *pdo_data); | ||
| 103 | extern int rpc_add_pipe_dir_object(struct net *net, | ||
| 104 | struct rpc_pipe_dir_head *pdh, | ||
| 105 | struct rpc_pipe_dir_object *pdo); | ||
| 106 | extern void rpc_remove_pipe_dir_object(struct net *net, | ||
| 107 | struct rpc_pipe_dir_head *pdh, | ||
| 108 | struct rpc_pipe_dir_object *pdo); | ||
| 109 | extern struct rpc_pipe_dir_object *rpc_find_or_alloc_pipe_dir_object( | ||
| 110 | struct net *net, | ||
| 111 | struct rpc_pipe_dir_head *pdh, | ||
| 112 | int (*match)(struct rpc_pipe_dir_object *, void *), | ||
| 113 | struct rpc_pipe_dir_object *(*alloc)(void *), | ||
| 114 | void *data); | ||
| 78 | 115 | ||
| 79 | struct cache_detail; | 116 | struct cache_detail; |
| 80 | extern struct dentry *rpc_create_cache_dir(struct dentry *, | 117 | extern struct dentry *rpc_create_cache_dir(struct dentry *, |
diff --git a/include/linux/sunrpc/sched.h b/include/linux/sunrpc/sched.h index 1821445708d6..096ee58be11a 100644 --- a/include/linux/sunrpc/sched.h +++ b/include/linux/sunrpc/sched.h | |||
| @@ -79,7 +79,7 @@ struct rpc_task { | |||
| 79 | unsigned short tk_flags; /* misc flags */ | 79 | unsigned short tk_flags; /* misc flags */ |
| 80 | unsigned short tk_timeouts; /* maj timeouts */ | 80 | unsigned short tk_timeouts; /* maj timeouts */ |
| 81 | 81 | ||
| 82 | #ifdef RPC_DEBUG | 82 | #if defined(RPC_DEBUG) || defined(RPC_TRACEPOINTS) |
| 83 | unsigned short tk_pid; /* debugging aid */ | 83 | unsigned short tk_pid; /* debugging aid */ |
| 84 | #endif | 84 | #endif |
| 85 | unsigned char tk_priority : 2,/* Task priority */ | 85 | unsigned char tk_priority : 2,/* Task priority */ |
