@@ -119,13 +119,12 @@ static inline bool dst_metrics_read_only(const struct dst_entry *dst)
return dst->_metrics & DST_METRICS_READ_ONLY;
}
-void __dst_destroy_metrics_generic(struct dst_entry *dst, unsigned long old);
+void __dst_destroy_metrics_generic(struct dst_entry *dst);
static inline void dst_destroy_metrics_generic(struct dst_entry *dst)
{
- unsigned long val = dst->_metrics;
- if (!(val & DST_METRICS_READ_ONLY))
- __dst_destroy_metrics_generic(dst, val);
+ if (!dst_metrics_read_only(dst))
+ __dst_destroy_metrics_generic(dst);
}
static inline u32 *dst_metrics_write_ptr(struct dst_entry *dst)
@@ -308,10 +308,11 @@ u32 *dst_cow_metrics_generic(struct dst_entry *dst, unsigned long old)
EXPORT_SYMBOL(dst_cow_metrics_generic);
/* Caller asserts that dst_metrics_read_only(dst) is false. */
-void __dst_destroy_metrics_generic(struct dst_entry *dst, unsigned long old)
+void __dst_destroy_metrics_generic(struct dst_entry *dst)
{
- unsigned long prev, new;
+ unsigned long prev, new, old;
+ old = dst->_metrics;
new = ((unsigned long) dst_default_metrics) | DST_METRICS_READ_ONLY;
prev = cmpxchg(&dst->_metrics, old, new);
if (prev == old)