static __always_inline struct ns_common *__must_check ns_get_unless_inactive(struct ns_common *ns)
{
- VFS_WARN_ON_ONCE(__ns_ref_active_read(ns) && !__ns_ref_read(ns));
if (!__ns_ref_active_read(ns)) {
VFS_WARN_ON_ONCE(is_ns_init_id(ns));
return NULL;
if (is_ns_init_id(ns))
return;
- if (!atomic_dec_and_test(&ns->__ns_ref_active))
+ if (!atomic_dec_and_test(&ns->__ns_ref_active)) {
+ VFS_WARN_ON_ONCE(__ns_ref_active_read(ns) < 0);
return;
+ }
VFS_WARN_ON_ONCE(is_ns_init_id(ns));
VFS_WARN_ON_ONCE(!__ns_ref_read(ns));
if (!ns)
return;
VFS_WARN_ON_ONCE(is_ns_init_id(ns));
- if (!atomic_dec_and_test(&ns->__ns_ref_active))
+ if (!atomic_dec_and_test(&ns->__ns_ref_active)) {
+ VFS_WARN_ON_ONCE(__ns_ref_active_read(ns) < 0);
return;
+ }
}
}
*/
void __ns_ref_active_get(struct ns_common *ns)
{
+ int prev;
+
/* Initial namespaces are always active. */
if (is_ns_init_id(ns))
return;
/* If we didn't resurrect the namespace we're done. */
- if (atomic_fetch_add(1, &ns->__ns_ref_active))
+ prev = atomic_fetch_add(1, &ns->__ns_ref_active);
+ VFS_WARN_ON_ONCE(prev < 0);
+ if (likely(prev))
return;
/*
return;
VFS_WARN_ON_ONCE(is_ns_init_id(ns));
- if (atomic_fetch_add(1, &ns->__ns_ref_active))
+ prev = atomic_fetch_add(1, &ns->__ns_ref_active);
+ VFS_WARN_ON_ONCE(prev < 0);
+ if (likely(prev))
return;
}
}