mm/devm_memremap_pages: fix final page put race
[linux-2.6-microblaze.git] / drivers / dax / device.c
index 996d68f..8465d12 100644 (file)
@@ -27,9 +27,8 @@ static void dev_dax_percpu_release(struct percpu_ref *ref)
        complete(&dev_dax->cmp);
 }
 
-static void dev_dax_percpu_exit(void *data)
+static void dev_dax_percpu_exit(struct percpu_ref *ref)
 {
-       struct percpu_ref *ref = data;
        struct dev_dax *dev_dax = ref_to_dev_dax(ref);
 
        dev_dbg(&dev_dax->dev, "%s\n", __func__);
@@ -466,18 +465,12 @@ int dev_dax_probe(struct device *dev)
        if (rc)
                return rc;
 
-       rc = devm_add_action_or_reset(dev, dev_dax_percpu_exit, &dev_dax->ref);
-       if (rc)
-               return rc;
-
        dev_dax->pgmap.ref = &dev_dax->ref;
        dev_dax->pgmap.kill = dev_dax_percpu_kill;
+       dev_dax->pgmap.cleanup = dev_dax_percpu_exit;
        addr = devm_memremap_pages(dev, &dev_dax->pgmap);
-       if (IS_ERR(addr)) {
-               devm_remove_action(dev, dev_dax_percpu_exit, &dev_dax->ref);
-               percpu_ref_exit(&dev_dax->ref);
+       if (IS_ERR(addr))
                return PTR_ERR(addr);
-       }
 
        inode = dax_inode(dax_dev);
        cdev = inode->i_cdev;