Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a2bbe682 authored by Denis V. Lunev's avatar Denis V. Lunev Committed by David S. Miller
Browse files

[IPV4]: Unify assignment of fi to fib_result

parent c17860a0
Loading
Loading
Loading
Loading
+4 −15
Original line number Diff line number Diff line
@@ -315,10 +315,7 @@ fn_hash_select_default(struct fib_table *tb, const struct flowi *flp, struct fib
					break;
			} else if (!fib_detect_death(fi, order, &last_resort,
						     &last_idx, fn_hash_last_dflt)) {
				if (res->fi)
					fib_info_put(res->fi);
				res->fi = fi;
				atomic_inc(&fi->fib_clntref);
				fib_result_assign(res, fi);
				fn_hash_last_dflt = order;
				goto out;
			}
@@ -333,21 +330,13 @@ fn_hash_select_default(struct fib_table *tb, const struct flowi *flp, struct fib
	}

	if (!fib_detect_death(fi, order, &last_resort, &last_idx, fn_hash_last_dflt)) {
		if (res->fi)
			fib_info_put(res->fi);
		res->fi = fi;
		atomic_inc(&fi->fib_clntref);
		fib_result_assign(res, fi);
		fn_hash_last_dflt = order;
		goto out;
	}

	if (last_idx >= 0) {
		if (res->fi)
			fib_info_put(res->fi);
		res->fi = last_resort;
		if (last_resort)
			atomic_inc(&last_resort->fib_clntref);
	}
	if (last_idx >= 0)
		fib_result_assign(res, last_resort);
	fn_hash_last_dflt = last_idx;
out:
	read_unlock(&fib_hash_lock);
+10 −0
Original line number Diff line number Diff line
@@ -38,4 +38,14 @@ extern int fib_detect_death(struct fib_info *fi, int order,
			    struct fib_info **last_resort,
			    int *last_idx, int dflt);

static inline void fib_result_assign(struct fib_result *res,
				     struct fib_info *fi)
{
	if (res->fi != NULL)
		fib_info_put(res->fi);
	res->fi = fi;
	if (fi != NULL)
		atomic_inc(&fi->fib_clntref);
}

#endif /* _FIB_LOOKUP_H */
+4 −15
Original line number Diff line number Diff line
@@ -1831,10 +1831,7 @@ fn_trie_select_default(struct fib_table *tb, const struct flowi *flp, struct fib
				break;
		} else if (!fib_detect_death(fi, order, &last_resort,
					     &last_idx, trie_last_dflt)) {
			if (res->fi)
				fib_info_put(res->fi);
			res->fi = fi;
			atomic_inc(&fi->fib_clntref);
			fib_result_assign(res, fi);
			trie_last_dflt = order;
			goto out;
		}
@@ -1847,20 +1844,12 @@ fn_trie_select_default(struct fib_table *tb, const struct flowi *flp, struct fib
	}

	if (!fib_detect_death(fi, order, &last_resort, &last_idx, trie_last_dflt)) {
		if (res->fi)
			fib_info_put(res->fi);
		res->fi = fi;
		atomic_inc(&fi->fib_clntref);
		fib_result_assign(res, fi);
		trie_last_dflt = order;
		goto out;
	}
	if (last_idx >= 0) {
		if (res->fi)
			fib_info_put(res->fi);
		res->fi = last_resort;
		if (last_resort)
			atomic_inc(&last_resort->fib_clntref);
	}
	if (last_idx >= 0)
		fib_result_assign(res, last_resort);
	trie_last_dflt = last_idx;
 out:;
	rcu_read_unlock();