Commit 36281caa authored by Trond Myklebust's avatar Trond Myklebust

NFSv4: Further clean-ups of delegation stateid validation

Change the name to reflect what we're really doing: testing two
stateids for whether or not they match according the the rules in
RFC3530 and RFC5661.
Move the code from callback_proc.c to nfs4proc.c
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 8e663f0e
...@@ -98,14 +98,6 @@ __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy, ...@@ -98,14 +98,6 @@ __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy,
return res; return res;
} }
int nfs4_validate_delegation_stateid(struct nfs_delegation *delegation, const nfs4_stateid *stateid)
{
if (delegation == NULL || memcmp(delegation->stateid.data, stateid->data,
sizeof(delegation->stateid.data)) != 0)
return 0;
return 1;
}
#if defined(CONFIG_NFS_V4_1) #if defined(CONFIG_NFS_V4_1)
/* /*
...@@ -319,22 +311,6 @@ __be32 nfs4_callback_devicenotify(struct cb_devicenotifyargs *args, ...@@ -319,22 +311,6 @@ __be32 nfs4_callback_devicenotify(struct cb_devicenotifyargs *args,
return res; return res;
} }
int nfs41_validate_delegation_stateid(struct nfs_delegation *delegation, const nfs4_stateid *stateid)
{
if (delegation == NULL)
return 0;
if (stateid->stateid.seqid != 0 &&
stateid->stateid.seqid != delegation->stateid.stateid.seqid)
return 0;
if (memcmp(delegation->stateid.stateid.other,
stateid->stateid.other,
NFS4_STATEID_OTHER_SIZE))
return 0;
return 1;
}
/* /*
* Validate the sequenceID sent by the server. * Validate the sequenceID sent by the server.
* Return success if the sequenceID is one more than what we last saw on * Return success if the sequenceID is one more than what we last saw on
......
...@@ -556,7 +556,7 @@ int nfs_async_inode_return_delegation(struct inode *inode, ...@@ -556,7 +556,7 @@ int nfs_async_inode_return_delegation(struct inode *inode,
rcu_read_lock(); rcu_read_lock();
delegation = rcu_dereference(NFS_I(inode)->delegation); delegation = rcu_dereference(NFS_I(inode)->delegation);
if (!clp->cl_mvops->validate_stateid(delegation, stateid)) { if (!clp->cl_mvops->match_stateid(&delegation->stateid, stateid)) {
rcu_read_unlock(); rcu_read_unlock();
return -ENOENT; return -ENOENT;
} }
......
...@@ -43,7 +43,7 @@ struct nfs4_minor_version_ops { ...@@ -43,7 +43,7 @@ struct nfs4_minor_version_ops {
struct nfs4_sequence_args *args, struct nfs4_sequence_args *args,
struct nfs4_sequence_res *res, struct nfs4_sequence_res *res,
int cache_reply); int cache_reply);
int (*validate_stateid)(struct nfs_delegation *, bool (*match_stateid)(const nfs4_stateid *,
const nfs4_stateid *); const nfs4_stateid *);
int (*find_root_sec)(struct nfs_server *, struct nfs_fh *, int (*find_root_sec)(struct nfs_server *, struct nfs_fh *,
struct nfs_fsinfo *); struct nfs_fsinfo *);
......
...@@ -6271,8 +6271,31 @@ static int nfs41_free_stateid(struct nfs_server *server, nfs4_stateid *stateid) ...@@ -6271,8 +6271,31 @@ static int nfs41_free_stateid(struct nfs_server *server, nfs4_stateid *stateid)
} while (exception.retry); } while (exception.retry);
return err; return err;
} }
static bool nfs41_match_stateid(const nfs4_stateid *s1,
const nfs4_stateid *s2)
{
if (memcmp(s1->stateid.other, s2->stateid.other,
sizeof(s1->stateid.other)) != 0)
return false;
if (s1->stateid.seqid == s2->stateid.seqid)
return true;
if (s1->stateid.seqid == 0 || s2->stateid.seqid == 0)
return true;
return false;
}
#endif /* CONFIG_NFS_V4_1 */ #endif /* CONFIG_NFS_V4_1 */
static bool nfs4_match_stateid(const nfs4_stateid *s1,
const nfs4_stateid *s2)
{
return memcmp(s1->data, s2->data, sizeof(s1->data)) == 0;
}
struct nfs4_state_recovery_ops nfs40_reboot_recovery_ops = { struct nfs4_state_recovery_ops nfs40_reboot_recovery_ops = {
.owner_flag_bit = NFS_OWNER_RECLAIM_REBOOT, .owner_flag_bit = NFS_OWNER_RECLAIM_REBOOT,
.state_flag_bit = NFS_STATE_RECLAIM_REBOOT, .state_flag_bit = NFS_STATE_RECLAIM_REBOOT,
...@@ -6331,7 +6354,7 @@ struct nfs4_state_maintenance_ops nfs41_state_renewal_ops = { ...@@ -6331,7 +6354,7 @@ struct nfs4_state_maintenance_ops nfs41_state_renewal_ops = {
static const struct nfs4_minor_version_ops nfs_v4_0_minor_ops = { static const struct nfs4_minor_version_ops nfs_v4_0_minor_ops = {
.minor_version = 0, .minor_version = 0,
.call_sync = _nfs4_call_sync, .call_sync = _nfs4_call_sync,
.validate_stateid = nfs4_validate_delegation_stateid, .match_stateid = nfs4_match_stateid,
.find_root_sec = nfs4_find_root_sec, .find_root_sec = nfs4_find_root_sec,
.reboot_recovery_ops = &nfs40_reboot_recovery_ops, .reboot_recovery_ops = &nfs40_reboot_recovery_ops,
.nograce_recovery_ops = &nfs40_nograce_recovery_ops, .nograce_recovery_ops = &nfs40_nograce_recovery_ops,
...@@ -6342,7 +6365,7 @@ static const struct nfs4_minor_version_ops nfs_v4_0_minor_ops = { ...@@ -6342,7 +6365,7 @@ static const struct nfs4_minor_version_ops nfs_v4_0_minor_ops = {
static const struct nfs4_minor_version_ops nfs_v4_1_minor_ops = { static const struct nfs4_minor_version_ops nfs_v4_1_minor_ops = {
.minor_version = 1, .minor_version = 1,
.call_sync = _nfs4_call_sync_session, .call_sync = _nfs4_call_sync_session,
.validate_stateid = nfs41_validate_delegation_stateid, .match_stateid = nfs41_match_stateid,
.find_root_sec = nfs41_find_root_sec, .find_root_sec = nfs41_find_root_sec,
.reboot_recovery_ops = &nfs41_reboot_recovery_ops, .reboot_recovery_ops = &nfs41_reboot_recovery_ops,
.nograce_recovery_ops = &nfs41_nograce_recovery_ops, .nograce_recovery_ops = &nfs41_nograce_recovery_ops,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment