RDMA/cxgb3: Don't ignore insert_handle() failures
[linux-2.6.git] / drivers / infiniband / hw / cxgb3 / iwch_mem.c
index ec49a5c..e1ec65e 100644 (file)
@@ -39,7 +39,7 @@
 #include "iwch.h"
 #include "iwch_provider.h"
 
-static void iwch_finish_mem_reg(struct iwch_mr *mhp, u32 stag)
+static int iwch_finish_mem_reg(struct iwch_mr *mhp, u32 stag)
 {
        u32 mmid;
 
@@ -47,14 +47,15 @@ static void iwch_finish_mem_reg(struct iwch_mr *mhp, u32 stag)
        mhp->attr.stag = stag;
        mmid = stag >> 8;
        mhp->ibmr.rkey = mhp->ibmr.lkey = stag;
-       insert_handle(mhp->rhp, &mhp->rhp->mmidr, mhp, mmid);
        PDBG("%s mmid 0x%x mhp %p\n", __func__, mmid, mhp);
+       return insert_handle(mhp->rhp, &mhp->rhp->mmidr, mhp, mmid);
 }
 
 int iwch_register_mem(struct iwch_dev *rhp, struct iwch_pd *php,
                      struct iwch_mr *mhp, int shift)
 {
        u32 stag;
+       int ret;
 
        if (cxio_register_phys_mem(&rhp->rdev,
                                   &stag, mhp->attr.pdid,
@@ -66,9 +67,11 @@ int iwch_register_mem(struct iwch_dev *rhp, struct iwch_pd *php,
                                   mhp->attr.pbl_size, mhp->attr.pbl_addr))
                return -ENOMEM;
 
-       iwch_finish_mem_reg(mhp, stag);
-
-       return 0;
+       ret = iwch_finish_mem_reg(mhp, stag);
+       if (ret)
+               cxio_dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size,
+                      mhp->attr.pbl_addr);
+       return ret;
 }
 
 int iwch_reregister_mem(struct iwch_dev *rhp, struct iwch_pd *php,
@@ -77,6 +80,7 @@ int iwch_reregister_mem(struct iwch_dev *rhp, struct iwch_pd *php,
                                        int npages)
 {
        u32 stag;
+       int ret;
 
        /* We could support this... */
        if (npages > mhp->attr.pbl_size)
@@ -93,9 +97,12 @@ int iwch_reregister_mem(struct iwch_dev *rhp, struct iwch_pd *php,
                                   mhp->attr.pbl_size, mhp->attr.pbl_addr))
                return -ENOMEM;
 
-       iwch_finish_mem_reg(mhp, stag);
+       ret = iwch_finish_mem_reg(mhp, stag);
+       if (ret)
+               cxio_dereg_mem(&rhp->rdev, mhp->attr.stag, mhp->attr.pbl_size,
+                      mhp->attr.pbl_addr);
 
-       return 0;
+       return ret;
 }
 
 int iwch_alloc_pbl(struct iwch_mr *mhp, int npages)