]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cxl: Fix unregister_region() callback parameter assignment
authorDave Jiang <dave.jiang@intel.com>
Thu, 14 Dec 2023 19:13:58 +0000 (12:13 -0700)
committerDan Williams <dan.j.williams@intel.com>
Mon, 18 Dec 2023 23:35:00 +0000 (15:35 -0800)
In devm_cxl_add_region(), devm_add_action_or_reset() is called by
passing in unregister_region() with data ptr of 'cxlr'. However, in
unregister_region(), the passed in parameter is incorrectly assumed to
be a 'struct device' rather than the 'cxlr' pointer. The code has been
working because 'struct device' is the first member of 'struct
cxl_region'. Issue found by inspection. Fix the assignment so that cxlr
is pointing directly to the passed in parameter.

Not flagged for -stable since there is no functional impact of this fix.

Signed-off-by: Dave Jiang <dave.jiang@intel.com>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Link: https://lore.kernel.org/r/170258123810.952211.3907381447996426480.stgit@djiang5-mobl3
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
drivers/cxl/core/region.c

index 56e575c79bb49187f909aa87d4f6c5d9894c3b75..a61703c9d72abe481d79b9adf6b6cc134f6a79df 100644 (file)
@@ -2083,13 +2083,13 @@ static struct cxl_region *to_cxl_region(struct device *dev)
        return container_of(dev, struct cxl_region, dev);
 }
 
-static void unregister_region(void *dev)
+static void unregister_region(void *_cxlr)
 {
-       struct cxl_region *cxlr = to_cxl_region(dev);
+       struct cxl_region *cxlr = _cxlr;
        struct cxl_region_params *p = &cxlr->params;
        int i;
 
-       device_del(dev);
+       device_del(&cxlr->dev);
 
        /*
         * Now that region sysfs is shutdown, the parameter block is now
@@ -2100,7 +2100,7 @@ static void unregister_region(void *dev)
                detach_target(cxlr, i);
 
        cxl_region_iomem_release(cxlr);
-       put_device(dev);
+       put_device(&cxlr->dev);
 }
 
 static struct lock_class_key cxl_region_key;