if (status)
                return status;
        spin_lock(®istered_mechs_lock);
-       list_add(&gm->gm_list, ®istered_mechs);
+       list_add_rcu(&gm->gm_list, ®istered_mechs);
        spin_unlock(®istered_mechs_lock);
        dprintk("RPC:       registered gss mechanism %s\n", gm->gm_name);
        return 0;
 void gss_mech_unregister(struct gss_api_mech *gm)
 {
        spin_lock(®istered_mechs_lock);
-       list_del(&gm->gm_list);
+       list_del_rcu(&gm->gm_list);
        spin_unlock(®istered_mechs_lock);
        dprintk("RPC:       unregistered gss mechanism %s\n", gm->gm_name);
        gss_mech_free(gm);
 {
        struct gss_api_mech     *pos, *gm = NULL;
 
-       spin_lock(®istered_mechs_lock);
-       list_for_each_entry(pos, ®istered_mechs, gm_list) {
+       rcu_read_lock();
+       list_for_each_entry_rcu(pos, ®istered_mechs, gm_list) {
                if (0 == strcmp(name, pos->gm_name)) {
                        if (try_module_get(pos->gm_owner))
                                gm = pos;
                        break;
                }
        }
-       spin_unlock(®istered_mechs_lock);
+       rcu_read_unlock();
        return gm;
 
 }
        dprintk("RPC:       %s(%s)\n", __func__, buf);
        request_module("rpc-auth-gss-%s", buf);
 
-       spin_lock(®istered_mechs_lock);
-       list_for_each_entry(pos, ®istered_mechs, gm_list) {
+       rcu_read_lock();
+       list_for_each_entry_rcu(pos, ®istered_mechs, gm_list) {
                if (obj->len == pos->gm_oid.len) {
                        if (0 == memcmp(obj->data, pos->gm_oid.data, obj->len)) {
                                if (try_module_get(pos->gm_owner))
                        }
                }
        }
-       spin_unlock(®istered_mechs_lock);
+       rcu_read_unlock();
        return gm;
 }
 
 {
        struct gss_api_mech *gm = NULL, *pos;
 
-       spin_lock(®istered_mechs_lock);
-       list_for_each_entry(pos, ®istered_mechs, gm_list) {
+       rcu_read_lock();
+       list_for_each_entry_rcu(pos, ®istered_mechs, gm_list) {
                if (!mech_supports_pseudoflavor(pos, pseudoflavor))
                        continue;
                if (try_module_get(pos->gm_owner))
                        gm = pos;
                break;
        }
-       spin_unlock(®istered_mechs_lock);
+       rcu_read_unlock();
        return gm;
 }
 
        struct gss_api_mech *pos = NULL;
        int j, i = 0;
 
-       spin_lock(®istered_mechs_lock);
-       list_for_each_entry(pos, ®istered_mechs, gm_list) {
+       rcu_read_lock();
+       list_for_each_entry_rcu(pos, ®istered_mechs, gm_list) {
                for (j = 0; j < pos->gm_pf_num; j++) {
                        if (i >= size) {
                                spin_unlock(®istered_mechs_lock);
                        array_ptr[i++] = pos->gm_pfs[j].pseudoflavor;
                }
        }
-       spin_unlock(®istered_mechs_lock);
+       rcu_read_unlock();
        return i;
 }