@@ -1790,10 +1790,7 @@ static void bitmap_flush(struct mddev *mddev)
bitmap_update_sb(bitmap);
}
-/*
- * free memory that was allocated
- */
-void md_bitmap_free(struct bitmap *bitmap)
+static void __bitmap_free(struct bitmap *bitmap)
{
unsigned long k, pages;
struct bitmap_page *bp;
@@ -1827,7 +1824,6 @@ void md_bitmap_free(struct bitmap *bitmap)
kfree(bp);
kfree(bitmap);
}
-EXPORT_SYMBOL(md_bitmap_free);
void md_bitmap_wait_behind_writes(struct mddev *mddev)
{
@@ -1861,7 +1857,7 @@ static void bitmap_destroy(struct mddev *mddev)
mutex_unlock(&mddev->bitmap_info.mutex);
mddev_set_timeout(mddev, MAX_SCHEDULE_TIMEOUT, true);
- md_bitmap_free(bitmap);
+ __bitmap_free(bitmap);
}
/*
@@ -1952,7 +1948,7 @@ static struct bitmap *bitmap_create(struct mddev *mddev, int slot)
return bitmap;
error:
- md_bitmap_free(bitmap);
+ __bitmap_free(bitmap);
return ERR_PTR(err);
}
@@ -2013,7 +2009,7 @@ static int bitmap_load(struct mddev *mddev)
return err;
}
-/* caller need to free returned bitmap with md_bitmap_free() */
+/* caller need to free returned bitmap with __bitmap_free() */
static struct bitmap *bitmap_get_from_slot(struct mddev *mddev, int slot)
{
int rv = 0;
@@ -2027,7 +2023,7 @@ static struct bitmap *bitmap_get_from_slot(struct mddev *mddev, int slot)
rv = md_bitmap_init_from_disk(bitmap, 0);
if (rv) {
- md_bitmap_free(bitmap);
+ __bitmap_free(bitmap);
return ERR_PTR(rv);
}
@@ -2076,7 +2072,7 @@ static int bitmap_copy_from_slot(struct mddev *mddev, int slot, sector_t *low,
md_bitmap_unplug(mddev->bitmap);
*low = lo;
*high = hi;
- md_bitmap_free(bitmap);
+ __bitmap_free(bitmap);
return rv;
}
@@ -2715,6 +2711,7 @@ static struct bitmap_operations bitmap_ops = {
.sync_with_cluster = bitmap_sync_with_cluster,
.get_from_slot = bitmap_get_from_slot,
.copy_from_slot = bitmap_copy_from_slot,
+ .free = __bitmap_free,
};
void mddev_set_bitmap_ops(struct mddev *mddev)
@@ -263,6 +263,7 @@ struct bitmap_operations {
struct bitmap* (*get_from_slot)(struct mddev *mddev, int slot);
int (*copy_from_slot)(struct mddev *mddev, int slot,
sector_t *lo, sector_t *hi, bool clear_bits);
+ void (*free)(struct bitmap *bitmap);
};
/* the bitmap API */
@@ -433,11 +434,18 @@ static inline int md_bitmap_copy_from_slot(struct mddev *mddev, int slot,
return mddev->bitmap_ops->copy_from_slot(mddev, slot, lo, hi, clear_bits);
}
+static inline void md_bitmap_free(struct mddev *mddev, struct bitmap *bitmap)
+{
+ if (!mddev->bitmap_ops->free)
+ return;
+
+ return mddev->bitmap_ops->free(bitmap);
+}
+
void md_bitmap_unplug(struct bitmap *bitmap);
void md_bitmap_unplug_async(struct bitmap *bitmap);
void md_bitmap_daemon_work(struct mddev *mddev);
-void md_bitmap_free(struct bitmap *bitmap);
void md_bitmap_wait_behind_writes(struct mddev *mddev);
static inline bool md_bitmap_enabled(struct bitmap *bitmap)
@@ -1192,12 +1192,12 @@ static int resize_bitmaps(struct mddev *mddev, sector_t newsize, sector_t oldsiz
* can't resize bitmap
*/
goto out;
- md_bitmap_free(bitmap);
+ md_bitmap_free(mddev, bitmap);
}
return 0;
out:
- md_bitmap_free(bitmap);
+ md_bitmap_free(mddev, bitmap);
update_bitmap_size(mddev, oldsize);
return -1;
}
@@ -1238,7 +1238,7 @@ static int cluster_check_sync_size(struct mddev *mddev)
bm_lockres = lockres_init(mddev, str, NULL, 1);
if (!bm_lockres) {
pr_err("md-cluster: Cannot initialize %s\n", str);
- md_bitmap_free(bitmap);
+ md_bitmap_free(mddev, bitmap);
return -1;
}
bm_lockres->flags |= DLM_LKF_NOQUEUE;
@@ -1253,11 +1253,11 @@ static int cluster_check_sync_size(struct mddev *mddev)
sync_size = sb->sync_size;
else if (sync_size != sb->sync_size) {
kunmap_atomic(sb);
- md_bitmap_free(bitmap);
+ md_bitmap_free(mddev, bitmap);
return -1;
}
kunmap_atomic(sb);
- md_bitmap_free(bitmap);
+ md_bitmap_free(mddev, bitmap);
}
return (my_sync_size == sync_size) ? 0 : -1;