diff options
Diffstat (limited to 'drivers/md/dm-bufio.c')
-rw-r--r-- | drivers/md/dm-bufio.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/md/dm-bufio.c b/drivers/md/dm-bufio.c index d3c86bf00075..58df20fd5465 100644 --- a/drivers/md/dm-bufio.c +++ b/drivers/md/dm-bufio.c @@ -285,14 +285,22 @@ static void __remove(struct dm_bufio_client *c, struct dm_buffer *b) /*----------------------------------------------------------------*/ -static void adjust_total_allocated(unsigned char data_mode, long diff) +static void adjust_total_allocated(struct dm_buffer *b, bool unlink) { + unsigned char data_mode; + long diff; + static unsigned long * const class_ptr[DATA_MODE_LIMIT] = { &dm_bufio_allocated_kmem_cache, &dm_bufio_allocated_get_free_pages, &dm_bufio_allocated_vmalloc, }; + data_mode = b->data_mode; + diff = (long)b->c->block_size; + if (unlink) + diff = -diff; + spin_lock(¶m_spinlock); *class_ptr[data_mode] += diff; @@ -462,7 +470,7 @@ static void __link_buffer(struct dm_buffer *b, sector_t block, int dirty) __insert(b->c, b); b->last_accessed = jiffies; - adjust_total_allocated(b->data_mode, (long)c->block_size); + adjust_total_allocated(b, false); } /* @@ -478,7 +486,7 @@ static void __unlink_buffer(struct dm_buffer *b) __remove(b->c, b); list_del(&b->lru_list); - adjust_total_allocated(b->data_mode, -(long)c->block_size); + adjust_total_allocated(b, true); } /* |