]> git.ipfire.org Git - people/ms/linux.git/blobdiff - fs/nfs/nfs4proc.c
NFSv4: Further clean-ups of delegation stateid validation
[people/ms/linux.git] / fs / nfs / nfs4proc.c
index f31fcea1af7ee5fd26f9c0e71d5ec27cef1bcff0..b0647b387403e5efb1b75cdc8b0638282d1606d2 100644 (file)
@@ -6271,8 +6271,31 @@ static int nfs41_free_stateid(struct nfs_server *server, nfs4_stateid *stateid)
        } while (exception.retry);
        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 */
 
+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 = {
        .owner_flag_bit = NFS_OWNER_RECLAIM_REBOOT,
        .state_flag_bit = NFS_STATE_RECLAIM_REBOOT,
@@ -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 = {
        .minor_version = 0,
        .call_sync = _nfs4_call_sync,
-       .validate_stateid = nfs4_validate_delegation_stateid,
+       .match_stateid = nfs4_match_stateid,
        .find_root_sec = nfs4_find_root_sec,
        .reboot_recovery_ops = &nfs40_reboot_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 = {
 static const struct nfs4_minor_version_ops nfs_v4_1_minor_ops = {
        .minor_version = 1,
        .call_sync = _nfs4_call_sync_session,
-       .validate_stateid = nfs41_validate_delegation_stateid,
+       .match_stateid = nfs41_match_stateid,
        .find_root_sec = nfs41_find_root_sec,
        .reboot_recovery_ops = &nfs41_reboot_recovery_ops,
        .nograce_recovery_ops = &nfs41_nograce_recovery_ops,