INIT_LIST_HEAD(&net->ipv4.mr_tables);
 
        mrt = ipmr_new_table(net, RT_TABLE_DEFAULT);
-       if (!mrt) {
-               err = -ENOMEM;
+       if (IS_ERR(mrt)) {
+               err = PTR_ERR(mrt);
                goto err1;
        }
 
 
 static int __net_init ipmr_rules_init(struct net *net)
 {
-       net->ipv4.mrt = ipmr_new_table(net, RT_TABLE_DEFAULT);
-       return net->ipv4.mrt ? 0 : -ENOMEM;
+       struct mr_table *mrt;
+
+       mrt = ipmr_new_table(net, RT_TABLE_DEFAULT);
+       if (IS_ERR(mrt))
+               return PTR_ERR(mrt);
+       net->ipv4.mrt = mrt;
+       return 0;
 }
 
 static void __net_exit ipmr_rules_exit(struct net *net)
        struct mr_table *mrt;
        unsigned int i;
 
+       /* "pimreg%u" should not exceed 16 bytes (IFNAMSIZ) */
+       if (id != RT_TABLE_DEFAULT && id >= 1000000000)
+               return ERR_PTR(-EINVAL);
+
        mrt = ipmr_get_table(net, id);
        if (mrt)
                return mrt;
 
        mrt = kzalloc(sizeof(*mrt), GFP_KERNEL);
        if (!mrt)
-               return NULL;
+               return ERR_PTR(-ENOMEM);
        write_pnet(&mrt->net, net);
        mrt->id = id;
 
                if (get_user(v, (u32 __user *)optval))
                        return -EFAULT;
 
-               /* "pimreg%u" should not exceed 16 bytes (IFNAMSIZ) */
-               if (v != RT_TABLE_DEFAULT && v >= 1000000000)
-                       return -EINVAL;
-
                rtnl_lock();
                ret = 0;
                if (sk == rtnl_dereference(mrt->mroute_sk)) {
                        ret = -EBUSY;
                } else {
-                       if (!ipmr_new_table(net, v))
-                               ret = -ENOMEM;
+                       mrt = ipmr_new_table(net, v);
+                       if (IS_ERR(mrt))
+                               ret = PTR_ERR(mrt);
                        else
                                raw_sk(sk)->ipmr_table = v;
                }