linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH_V9 0/12] NFSv4 find client fix Version 9
@ 2011-01-06  2:04 andros
  2011-01-06  2:04 ` [PATCH_V9 01/12] SUNRPC move svc_drop to caller of svc_process_common andros
  0 siblings, 1 reply; 13+ messages in thread
From: andros @ 2011-01-06  2:04 UTC (permalink / raw)
  To: trond.myklebust; +Cc: bfields, linux-nfs


Version 9 of these patches
Applies to Tronds nfs-for-next branch

New for Version 9:

- fixed the !CONFIG_NFS_V4 compile issues.
- moved the callback identifier assignment to nfs_alloc_client
        patch 0007-NFS-implement-v4.0-callback_ident.patch
- fixed a bracket bug in svc_bc_sock_free
        0008-NFS-associate-sessionid-with-callback-connection.patch

-->Andy

The back channel server svc_process_common RPC layer pg_authenticate call
[nfs_callback_authenticate] is shared by both the NFSv4.0 and the NFSv4.1
callback threads. It authenticates the incoming request by finding (and
referencing) an nfs_client struct based on the incoming request address
and the NFS version (4). This is akin to the NFS server which authenticates
requests by matching the server address to the exports file client list.

Since there is no minorversion in the search, it may find the wrong
nfs_client struct. For the nfsv4.0 callback service thread, this means it
could find an NFSv4.1 nfs_client. For the NFSv4.1 callback service thread, it
could find an NFSv4.0 instead of v4.1, or find an NFSv4.1 nfs_client with the
wrong session.

The nfs_client is dereferenced at the end of pg_authenticate. Another
nfs_find_client call is done in the NFS layouer per operation dispatcher
routines for NFSv4.0 and in the cb_sequence operation dispatcher routine for
NFSv4.1 after decoding.

This means the callback server could start processing a callback, passing
the pg_authenticate test, and have the nfs_client struct freed between the
pg_authenticate call and the dispatcher operation call. Or, it could have
found the wrong nfs_client in the pg_authenticate call.

The current code has this behavior: If the nfs_client is not found in
pg_authenticate, the request is simply dropped (SVC_DROP). If an nfs_client
is not found in the dispatcher routines NFS4ERR_BADSESSION is returned for
v4.1 requests and NFS4ERR_BADHANDLE for v4.0 requests.

The fix is to implement the v4.0 SETCLIENTID callback_ident and use it to find
the one and only client for v4.0 callbacks, and to associate the sessionid
with the sessions based callback service (v4.1) and use it to identify the
one and only client. This can be done in the NFS layer, in CB_COMPOUND header
processing for v4.0 and in CB_SEQUENCE processing in v4.1.
In both cases, a reference to the found client is held across CB_COMPOUND
processing.

The pg_authenticate method does not have the callback_ident for CB_NULL or
CB_COMPOUND v4.0 processing, so just the server address, nfsversion and
minorversion is used for the client search

For sessions based callback service, the sessionID can't be set until the
return of the CREATE_SESSION call, yet the CB_NULL ping from a server can
be initiated by the server at the receipt of the CREATE_SESSION call before
the response is sent. So for CB_NULL, the sessionid is (usually) not set, and
the sessionid is not used for CB_NULL pg_authenticate client searches.


^ permalink raw reply	[flat|nested] 13+ messages in thread

end of thread, other threads:[~2011-01-06  2:05 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-01-06  2:04 [PATCH_V9 0/12] NFSv4 find client fix Version 9 andros
2011-01-06  2:04 ` [PATCH_V9 01/12] SUNRPC move svc_drop to caller of svc_process_common andros
2011-01-06  2:04   ` [PATCH_V9 02/12] SUNRPC fix bc_send print andros
2011-01-06  2:04     ` [PATCH_V9 03/12] SUNRPC new transport for the NFSv4.1 shared back channel andros
2011-01-06  2:04       ` [PATCH_V9 04/12] SUNRPC register and unregister the back channel transport andros
2011-01-06  2:04         ` [PATCH_V9 05/12] NFS use svc_create_xprt for NFSv4.1 callback service andros
2011-01-06  2:04           ` [PATCH_V9 06/12] NFS do not clear minor version at nfs_client free andros
2011-01-06  2:04             ` [PATCH_V9 07/12] NFS implement v4.0 callback_ident andros
2011-01-06  2:04               ` [PATCH_V9 08/12] NFS associate sessionid with callback connection andros
2011-01-06  2:04                 ` [PATCH_V9 09/12] NFS refactor nfs_find_client and reference client across callback processing andros
2011-01-06  2:04                   ` [PATCH_V9 10/12] NFS RPC_AUTH_GSS unsupported on v4.1 back channel andros
2011-01-06  2:04                     ` [PATCH_V9 11/12] NFS add session back channel draining andros
2011-01-06  2:04                       ` [PATCH_V9 12/12] NFS rename client back channel transport field andros

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).