@@ -751,7 +751,7 @@ static int device_ ## name ## _open(struct inode *inode, struct file *file) \
static int device_ ## name ## _release(struct inode *inode, struct file *file) \
{ \
struct drbd_device *device = inode->i_private; \
- kref_put(&device->kref, drbd_destroy_device); \
+ put_drbd_dev(device); \
return single_release(inode, file); \
} \
static const struct file_operations device_ ## name ## _fops = { \
@@ -1372,6 +1372,16 @@ extern enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx
extern void drbd_destroy_device(struct kref *kref);
extern void drbd_delete_device(struct drbd_device *device);
+static inline void get_drbd_dev(struct drbd_device *dev)
+{
+ kref_get(&dev->kref);
+}
+
+static inline void put_drbd_dev(struct drbd_device *dev)
+{
+ kref_put(&dev->kref, drbd_destroy_device);
+}
+
extern struct drbd_resource *drbd_create_resource(const char *name);
extern void drbd_free_resource(struct drbd_resource *resource);
@@ -2746,7 +2746,7 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
err = ERR_MINOR_OR_VOLUME_EXISTS;
goto out_no_minor_idr;
}
- kref_get(&device->kref);
+ get_drbd_dev(device);
id = idr_alloc(&resource->devices, device, vnr, vnr + 1, GFP_KERNEL);
if (id < 0) {
@@ -2754,7 +2754,7 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
err = ERR_MINOR_OR_VOLUME_EXISTS;
goto out_idr_remove_minor;
}
- kref_get(&device->kref);
+ get_drbd_dev(device);
INIT_LIST_HEAD(&device->peer_devices);
INIT_LIST_HEAD(&device->pending_bitmap_io);
@@ -2766,7 +2766,7 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
peer_device->device = device;
list_add(&peer_device->peer_devices, &device->peer_devices);
- kref_get(&device->kref);
+ get_drbd_dev(device);
id = idr_alloc(&connection->peer_devices, peer_device, vnr, vnr + 1, GFP_KERNEL);
if (id < 0) {
@@ -2839,15 +2839,15 @@ void drbd_delete_device(struct drbd_device *device)
drbd_debugfs_device_cleanup(device);
for_each_connection(connection, resource) {
idr_remove(&connection->peer_devices, device->vnr);
- kref_put(&device->kref, drbd_destroy_device);
+ put_drbd_dev(device);
}
idr_remove(&resource->devices, device->vnr);
- kref_put(&device->kref, drbd_destroy_device);
+ put_drbd_dev(device);
idr_remove(&drbd_devices, device_to_minor(device));
- kref_put(&device->kref, drbd_destroy_device);
+ put_drbd_dev(device);
del_gendisk(device->vdisk);
synchronize_rcu();
- kref_put(&device->kref, drbd_destroy_device);
+ put_drbd_dev(device);
}
static int __init drbd_init(void)
@@ -2959,10 +2959,10 @@ void conn_md_sync(struct drbd_connection *connection)
idr_for_each_entry(&connection->peer_devices, peer_device, vnr) {
struct drbd_device *device = peer_device->device;
- kref_get(&device->kref);
+ get_drbd_dev(device);
rcu_read_unlock();
drbd_md_sync(device);
- kref_put(&device->kref, drbd_destroy_device);
+ put_drbd_dev(device);
rcu_read_lock();
}
rcu_read_unlock();
@@ -228,7 +228,7 @@ static int drbd_adm_prepare(struct drbd_config_context *adm_ctx,
* But we may explicitly drop it/retake it in drbd_adm_set_role(),
* so make sure this object stays around. */
if (adm_ctx->device)
- kref_get(&adm_ctx->device->kref);
+ get_drbd_dev(adm_ctx->device);
if (adm_ctx->resource_name) {
adm_ctx->resource = drbd_find_resource(adm_ctx->resource_name);
@@ -304,7 +304,7 @@ static int drbd_adm_finish(struct drbd_config_context *adm_ctx,
struct genl_info *info, int retcode)
{
if (adm_ctx->device) {
- kref_put(&adm_ctx->device->kref, drbd_destroy_device);
+ put_drbd_dev(adm_ctx->device);
adm_ctx->device = NULL;
}
if (adm_ctx->connection) {
@@ -230,10 +230,10 @@ static void conn_reclaim_net_peer_reqs(struct drbd_connection *connection)
if (!atomic_read(&device->pp_in_use_by_net))
continue;
- kref_get(&device->kref);
+ get_drbd_dev(device);
rcu_read_unlock();
drbd_reclaim_net_peer_reqs(device);
- kref_put(&device->kref, drbd_destroy_device);
+ put_drbd_dev(device);
rcu_read_lock();
}
rcu_read_unlock();
@@ -1105,7 +1105,7 @@ static int conn_connect(struct drbd_connection *connection)
rcu_read_lock();
idr_for_each_entry(&connection->peer_devices, peer_device, vnr) {
struct drbd_device *device = peer_device->device;
- kref_get(&device->kref);
+ get_drbd_dev(device);
rcu_read_unlock();
if (discard_my_data)
@@ -1114,7 +1114,7 @@ static int conn_connect(struct drbd_connection *connection)
clear_bit(DISCARD_MY_DATA, &device->flags);
drbd_connected(peer_device);
- kref_put(&device->kref, drbd_destroy_device);
+ put_drbd_dev(device);
rcu_read_lock();
}
rcu_read_unlock();
@@ -1273,7 +1273,7 @@ static void one_flush_endio(struct bio *bio)
clear_bit(FLUSH_PENDING, &device->flags);
put_ldev(device);
- kref_put(&device->kref, drbd_destroy_device);
+ put_drbd_dev(device);
if (atomic_dec_and_test(&ctx->pending))
complete(&ctx->done);
@@ -1294,7 +1294,7 @@ static void submit_one_flush(struct drbd_device *device, struct issue_flush_cont
ctx->error = -ENOMEM;
put_ldev(device);
- kref_put(&device->kref, drbd_destroy_device);
+ put_drbd_dev(device);
return;
}
@@ -1326,7 +1326,7 @@ static void drbd_flush(struct drbd_connection *connection)
if (!get_ldev(device))
continue;
- kref_get(&device->kref);
+ get_drbd_dev(device);
rcu_read_unlock();
submit_one_flush(device, &ctx);
@@ -1746,10 +1746,10 @@ static void conn_wait_active_ee_empty(struct drbd_connection *connection)
idr_for_each_entry(&connection->peer_devices, peer_device, vnr) {
struct drbd_device *device = peer_device->device;
- kref_get(&device->kref);
+ get_drbd_dev(device);
rcu_read_unlock();
drbd_wait_ee_list_empty(device, &device->active_ee);
- kref_put(&device->kref, drbd_destroy_device);
+ put_drbd_dev(device);
rcu_read_lock();
}
rcu_read_unlock();
@@ -5129,10 +5129,10 @@ static void conn_disconnect(struct drbd_connection *connection)
rcu_read_lock();
idr_for_each_entry(&connection->peer_devices, peer_device, vnr) {
struct drbd_device *device = peer_device->device;
- kref_get(&device->kref);
+ get_drbd_dev(device);
rcu_read_unlock();
drbd_disconnected(peer_device);
- kref_put(&device->kref, drbd_destroy_device);
+ put_drbd_dev(device);
rcu_read_lock();
}
rcu_read_unlock();
@@ -6112,7 +6112,7 @@ void drbd_send_acks_wf(struct work_struct *ws)
tcp_sock_set_cork(connection->meta.socket->sk, true);
err = drbd_finish_peer_reqs(device);
- kref_put(&device->kref, drbd_destroy_device);
+ put_drbd_dev(device);
/* get is in drbd_endio_write_sec_final(). That is necessary to keep the
struct work_struct send_acks_work alive, which is in the peer_device object */
@@ -122,7 +122,7 @@ struct drbd_state_change *remember_old_state(struct drbd_resource *resource, gfp
device_state_change = state_change->devices;
peer_device_state_change = state_change->peer_devices;
idr_for_each_entry(&resource->devices, device, vnr) {
- kref_get(&device->kref);
+ get_drbd_dev(device);
device_state_change->device = device;
device_state_change->disk_state[OLD] = device->state.disk;
@@ -264,7 +264,7 @@ void forget_state_change(struct drbd_state_change *state_change)
struct drbd_device *device = state_change->devices[n].device;
if (device)
- kref_put(&device->kref, drbd_destroy_device);
+ put_drbd_dev(device);
}
for (n = 0; n < state_change->n_connections; n++) {
struct drbd_connection *connection =
@@ -147,9 +147,9 @@ void drbd_endio_write_sec_final(struct drbd_peer_request *peer_req) __releases(l
__drbd_chk_io_error(device, DRBD_WRITE_ERROR);
if (connection->cstate >= C_WF_REPORT_PARAMS) {
- kref_get(&device->kref); /* put is in drbd_send_acks_wf() */
+ get_drbd_dev(device); /* put is in drbd_send_acks_wf() */
if (!queue_work(connection->ack_sender, &peer_device->send_acks_work))
- kref_put(&device->kref, drbd_destroy_device);
+ put_drbd_dev(device);
}
spin_unlock_irqrestore(&device->resource->req_lock, flags);
@@ -2065,10 +2065,10 @@ static void do_unqueued_work(struct drbd_connection *connection)
if (!todo)
continue;
- kref_get(&device->kref);
+ get_drbd_dev(device);
rcu_read_unlock();
do_device_work(device, todo);
- kref_put(&device->kref, drbd_destroy_device);
+ put_drbd_dev(device);
rcu_read_lock();
}
rcu_read_unlock();
@@ -2229,10 +2229,10 @@ int drbd_worker(struct drbd_thread *thi)
idr_for_each_entry(&connection->peer_devices, peer_device, vnr) {
struct drbd_device *device = peer_device->device;
D_ASSERT(device, device->state.disk == D_DISKLESS && device->state.conn == C_STANDALONE);
- kref_get(&device->kref);
+ get_drbd_dev(device);
rcu_read_unlock();
drbd_device_cleanup(device);
- kref_put(&device->kref, drbd_destroy_device);
+ put_drbd_dev(device);
rcu_read_lock();
}
rcu_read_unlock();
The drbd_destroy_device() arg of this code is already duplicated 18 times, use helper function put_drbd_dev() to release drbd_device and related resources instead of open coding it to help improve code readability a bit. And add get_drbd_dev() helper function to be symmetrical with it. No functional change involved. Signed-off-by: Ruan Jinjie <ruanjinjie@huawei.com> --- drivers/block/drbd/drbd_debugfs.c | 2 +- drivers/block/drbd/drbd_int.h | 10 ++++++++++ drivers/block/drbd/drbd_main.c | 18 +++++++++--------- drivers/block/drbd/drbd_nl.c | 4 ++-- drivers/block/drbd/drbd_receiver.c | 24 ++++++++++++------------ drivers/block/drbd/drbd_state.c | 4 ++-- drivers/block/drbd/drbd_worker.c | 12 ++++++------ 7 files changed, 42 insertions(+), 32 deletions(-)