char *                 rpcauth_stringify_acceptor(struct rpc_cred *);
 
 static inline
-struct rpc_cred *      get_rpccred(struct rpc_cred *cred)
+struct rpc_cred *get_rpccred(struct rpc_cred *cred)
 {
-       if (cred != NULL)
-               atomic_inc(&cred->cr_count);
-       return cred;
+       if (cred != NULL && atomic_inc_not_zero(&cred->cr_count))
+               return cred;
+       return NULL;
 }
 
 /**
 static inline struct rpc_cred *
 get_rpccred_rcu(struct rpc_cred *cred)
 {
-       if (atomic_inc_not_zero(&cred->cr_count))
-               return cred;
-       return NULL;
+       return get_rpccred(cred);
 }
 
 #endif /* __KERNEL__ */
 
                if (!entry->cr_ops->crmatch(acred, entry, flags))
                        continue;
                if (flags & RPCAUTH_LOOKUP_RCU) {
-                       if (test_bit(RPCAUTH_CRED_HASHED, &entry->cr_flags) &&
-                           !test_bit(RPCAUTH_CRED_NEW, &entry->cr_flags))
-                               cred = entry;
+                       if (test_bit(RPCAUTH_CRED_NEW, &entry->cr_flags) ||
+                           atomic_read(&entry->cr_count) == 0)
+                               continue;
+                       cred = entry;
                        break;
                }
-               spin_lock(&cache->lock);
-               if (test_bit(RPCAUTH_CRED_HASHED, &entry->cr_flags) == 0) {
-                       spin_unlock(&cache->lock);
-                       continue;
-               }
                cred = get_rpccred(entry);
-               spin_unlock(&cache->lock);
-               break;
+               if (cred)
+                       break;
        }
        rcu_read_unlock();
 
                if (!entry->cr_ops->crmatch(acred, entry, flags))
                        continue;
                cred = get_rpccred(entry);
-               break;
+               if (cred)
+                       break;
        }
        if (cred == NULL) {
                cred = new;