return ret;
 }
 
-static struct mr_table *ipmr_get_table(struct net *net, u32 id)
+static struct mr_table *__ipmr_get_table(struct net *net, u32 id)
 {
        struct mr_table *mrt;
 
        return NULL;
 }
 
+static struct mr_table *ipmr_get_table(struct net *net, u32 id)
+{
+       struct mr_table *mrt;
+
+       rcu_read_lock();
+       mrt = __ipmr_get_table(net, id);
+       rcu_read_unlock();
+       return mrt;
+}
+
 static int ipmr_fib_lookup(struct net *net, struct flowi4 *flp4,
                           struct mr_table **mrt)
 {
 
        arg->table = fib_rule_get_table(rule, arg);
 
-       mrt = ipmr_get_table(rule->fr_net, arg->table);
+       mrt = __ipmr_get_table(rule->fr_net, arg->table);
        if (!mrt)
                return -EAGAIN;
        res->mrt = mrt;
        return net->ipv4.mrt;
 }
 
+#define __ipmr_get_table ipmr_get_table
+
 static int ipmr_fib_lookup(struct net *net, struct flowi4 *flp4,
                           struct mr_table **mrt)
 {
        if (id != RT_TABLE_DEFAULT && id >= 1000000000)
                return ERR_PTR(-EINVAL);
 
-       mrt = ipmr_get_table(net, id);
+       mrt = __ipmr_get_table(net, id);
        if (mrt)
                return mrt;
 
                goto out_unlock;
        }
 
-       mrt = ipmr_get_table(net, raw_sk(sk)->ipmr_table ? : RT_TABLE_DEFAULT);
+       mrt = __ipmr_get_table(net, raw_sk(sk)->ipmr_table ? : RT_TABLE_DEFAULT);
        if (!mrt) {
                ret = -ENOENT;
                goto out_unlock;
        struct mr_table *mrt;
        int err;
 
-       mrt = ipmr_get_table(net, RT_TABLE_DEFAULT);
-       if (!mrt)
+       rcu_read_lock();
+       mrt = __ipmr_get_table(net, RT_TABLE_DEFAULT);
+       if (!mrt) {
+               rcu_read_unlock();
                return -ENOENT;
+       }
 
-       rcu_read_lock();
        cache = ipmr_cache_find(mrt, saddr, daddr);
        if (!cache && skb->dev) {
                int vif = ipmr_find_vif(mrt, skb->dev);
        grp = nla_get_in_addr_default(tb[RTA_DST], 0);
        tableid = nla_get_u32_default(tb[RTA_TABLE], 0);
 
-       mrt = ipmr_get_table(net, tableid ? tableid : RT_TABLE_DEFAULT);
+       mrt = __ipmr_get_table(net, tableid ? tableid : RT_TABLE_DEFAULT);
        if (!mrt) {
                err = -ENOENT;
                goto errout_free;
        if (filter.table_id) {
                struct mr_table *mrt;
 
-               mrt = ipmr_get_table(sock_net(skb->sk), filter.table_id);
+               mrt = __ipmr_get_table(sock_net(skb->sk), filter.table_id);
                if (!mrt) {
                        if (rtnl_msg_family(cb->nlh) != RTNL_FAMILY_IPMR)
                                return skb->len;
                        break;
                }
        }
-       mrt = ipmr_get_table(net, tblid);
+       mrt = __ipmr_get_table(net, tblid);
        if (!mrt) {
                ret = -ENOENT;
                goto out;
        struct net *net = seq_file_net(seq);
        struct mr_table *mrt;
 
-       mrt = ipmr_get_table(net, RT_TABLE_DEFAULT);
-       if (!mrt)
+       rcu_read_lock();
+       mrt = __ipmr_get_table(net, RT_TABLE_DEFAULT);
+       if (!mrt) {
+               rcu_read_unlock();
                return ERR_PTR(-ENOENT);
+       }
 
        iter->mrt = mrt;
 
-       rcu_read_lock();
        return mr_vif_seq_start(seq, pos);
 }