pnfs: new locking model for layouts
exclusive locks are no longer held over LAYOUTGET, LAYOUTRETURN, or GETDEVICEINFO rpcs. this prevents a deadlock when CB_LAYOUTRECALL needs an exclusive lock while another operation is on the wire introduced a 'pending' condition variable to protect access to state->layout while the layout's lock is not held updated file_layout_recall() to compare the stateid sequence numbers to determine if the server has processed an outstanding LAYOUTGET or LAYOUTRETURN, where we're required to reply with NFS4ERR_DELAY LAYOUTGET, LAYOUTRETURN, and GETDEVICEINFO can now be sent with try_recovery=TRUE because they no longer hold an exclusive lock. this makes it possible for recover_client_state() to recall all of the client's layouts without deadlocking Signed-off-by: Casey Bodley <cbodley@citi.umich.edu>
This commit is contained in:
parent
c9585d937f
commit
bf53e3dc1a
4 changed files with 77 additions and 24 deletions
|
|
@ -41,20 +41,23 @@ static enum_t handle_cb_layoutrecall(
|
|||
OUT struct cb_layoutrecall_res *res)
|
||||
{
|
||||
enum pnfs_status status;
|
||||
/* forgetful model for layout recalls; return NOMATCHING_LAYOUT
|
||||
* and flag the layout(s) to prevent further use */
|
||||
res->status = NFS4ERR_NOMATCHING_LAYOUT;
|
||||
|
||||
status = pnfs_file_layout_recall(rpc_clnt->client, args);
|
||||
switch (status) {
|
||||
case PNFS_PENDING:
|
||||
/* not enough information to process the recall yet */
|
||||
res->status = NFS4ERR_DELAY;
|
||||
break;
|
||||
default:
|
||||
/* forgetful model for layout recalls */
|
||||
res->status = NFS4ERR_NOMATCHING_LAYOUT;
|
||||
break;
|
||||
}
|
||||
|
||||
dprintf(CBSLVL, " OP_CB_LAYOUTRECALL { %s, %s, recall %u } %s\n",
|
||||
pnfs_layout_type_string(args->type),
|
||||
pnfs_iomode_string(args->iomode), args->recall.type,
|
||||
nfs_error_string(res->status));
|
||||
|
||||
status = pnfs_file_layout_recall(rpc_clnt->client, args);
|
||||
if (status)
|
||||
eprintf("pnfs_file_layout_recall() failed with %s\n",
|
||||
pnfs_error_string(status));
|
||||
|
||||
return res->status;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue