|
@@ -231,17 +231,18 @@ retry:
|
|
|
return NULL;
|
|
|
typemap = afinfo->type_map;
|
|
|
|
|
|
- type = typemap[proto];
|
|
|
+ type = READ_ONCE(typemap[proto]);
|
|
|
if (unlikely(type && !try_module_get(type->owner)))
|
|
|
type = NULL;
|
|
|
+
|
|
|
+ rcu_read_unlock();
|
|
|
+
|
|
|
if (!type && !modload_attempted) {
|
|
|
- rcu_read_unlock();
|
|
|
request_module("xfrm-type-%d-%d", family, proto);
|
|
|
modload_attempted = 1;
|
|
|
goto retry;
|
|
|
}
|
|
|
|
|
|
- rcu_read_unlock();
|
|
|
return type;
|
|
|
}
|
|
|
|
|
@@ -327,17 +328,17 @@ retry:
|
|
|
if (unlikely(afinfo == NULL))
|
|
|
return NULL;
|
|
|
|
|
|
- mode = afinfo->mode_map[encap];
|
|
|
+ mode = READ_ONCE(afinfo->mode_map[encap]);
|
|
|
if (unlikely(mode && !try_module_get(mode->owner)))
|
|
|
mode = NULL;
|
|
|
+
|
|
|
+ rcu_read_unlock();
|
|
|
if (!mode && !modload_attempted) {
|
|
|
- rcu_read_unlock();
|
|
|
request_module("xfrm-mode-%d-%d", family, encap);
|
|
|
modload_attempted = 1;
|
|
|
goto retry;
|
|
|
}
|
|
|
|
|
|
- rcu_read_unlock();
|
|
|
return mode;
|
|
|
}
|
|
|
|