Commit ebc41854 authored by Jan Kara's avatar Jan Kara Committed by Christian Brauner

ocfs2: Convert to use bdev_open_by_dev()

Convert ocfs2 heartbeat code to use bdev_open_by_dev() and pass the
handle around.

CC: Joseph Qi <joseph.qi@linux.alibaba.com>
CC: ocfs2-devel@oss.oracle.com
Acked-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarJoseph Qi <joseph.qi@linux.alibaba.com>
Reviewed-by: default avatarChristian Brauner <brauner@kernel.org>
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Link: https://lore.kernel.org/r/20230927093442.25915-26-jack@suse.czSigned-off-by: default avatarChristian Brauner <brauner@kernel.org>
parent 3fe5d9fb
...@@ -213,7 +213,7 @@ struct o2hb_region { ...@@ -213,7 +213,7 @@ struct o2hb_region {
unsigned int hr_num_pages; unsigned int hr_num_pages;
struct page **hr_slot_data; struct page **hr_slot_data;
struct block_device *hr_bdev; struct bdev_handle *hr_bdev_handle;
struct o2hb_disk_slot *hr_slots; struct o2hb_disk_slot *hr_slots;
/* live node map of this region */ /* live node map of this region */
...@@ -261,6 +261,11 @@ struct o2hb_region { ...@@ -261,6 +261,11 @@ struct o2hb_region {
int hr_last_hb_status; int hr_last_hb_status;
}; };
static inline struct block_device *reg_bdev(struct o2hb_region *reg)
{
return reg->hr_bdev_handle ? reg->hr_bdev_handle->bdev : NULL;
}
struct o2hb_bio_wait_ctxt { struct o2hb_bio_wait_ctxt {
atomic_t wc_num_reqs; atomic_t wc_num_reqs;
struct completion wc_io_complete; struct completion wc_io_complete;
...@@ -286,7 +291,7 @@ static void o2hb_write_timeout(struct work_struct *work) ...@@ -286,7 +291,7 @@ static void o2hb_write_timeout(struct work_struct *work)
hr_write_timeout_work.work); hr_write_timeout_work.work);
mlog(ML_ERROR, "Heartbeat write timeout to device %pg after %u " mlog(ML_ERROR, "Heartbeat write timeout to device %pg after %u "
"milliseconds\n", reg->hr_bdev, "milliseconds\n", reg_bdev(reg),
jiffies_to_msecs(jiffies - reg->hr_last_timeout_start)); jiffies_to_msecs(jiffies - reg->hr_last_timeout_start));
if (o2hb_global_heartbeat_active()) { if (o2hb_global_heartbeat_active()) {
...@@ -383,7 +388,7 @@ static void o2hb_nego_timeout(struct work_struct *work) ...@@ -383,7 +388,7 @@ static void o2hb_nego_timeout(struct work_struct *work)
if (!test_bit(master_node, reg->hr_nego_node_bitmap)) { if (!test_bit(master_node, reg->hr_nego_node_bitmap)) {
printk(KERN_NOTICE "o2hb: node %d hb write hung for %ds on region %s (%pg).\n", printk(KERN_NOTICE "o2hb: node %d hb write hung for %ds on region %s (%pg).\n",
o2nm_this_node(), O2HB_NEGO_TIMEOUT_MS/1000, o2nm_this_node(), O2HB_NEGO_TIMEOUT_MS/1000,
config_item_name(&reg->hr_item), reg->hr_bdev); config_item_name(&reg->hr_item), reg_bdev(reg));
set_bit(master_node, reg->hr_nego_node_bitmap); set_bit(master_node, reg->hr_nego_node_bitmap);
} }
if (!bitmap_equal(reg->hr_nego_node_bitmap, live_node_bitmap, if (!bitmap_equal(reg->hr_nego_node_bitmap, live_node_bitmap,
...@@ -398,7 +403,8 @@ static void o2hb_nego_timeout(struct work_struct *work) ...@@ -398,7 +403,8 @@ static void o2hb_nego_timeout(struct work_struct *work)
} }
printk(KERN_NOTICE "o2hb: all nodes hb write hung, maybe region %s (%pg) is down.\n", printk(KERN_NOTICE "o2hb: all nodes hb write hung, maybe region %s (%pg) is down.\n",
config_item_name(&reg->hr_item), reg->hr_bdev); config_item_name(&reg->hr_item),
reg_bdev(reg));
/* approve negotiate timeout request. */ /* approve negotiate timeout request. */
o2hb_arm_timeout(reg); o2hb_arm_timeout(reg);
...@@ -419,7 +425,7 @@ static void o2hb_nego_timeout(struct work_struct *work) ...@@ -419,7 +425,7 @@ static void o2hb_nego_timeout(struct work_struct *work)
/* negotiate timeout with master node. */ /* negotiate timeout with master node. */
printk(KERN_NOTICE "o2hb: node %d hb write hung for %ds on region %s (%pg), negotiate timeout with node %d.\n", printk(KERN_NOTICE "o2hb: node %d hb write hung for %ds on region %s (%pg), negotiate timeout with node %d.\n",
o2nm_this_node(), O2HB_NEGO_TIMEOUT_MS/1000, config_item_name(&reg->hr_item), o2nm_this_node(), O2HB_NEGO_TIMEOUT_MS/1000, config_item_name(&reg->hr_item),
reg->hr_bdev, master_node); reg_bdev(reg), master_node);
ret = o2hb_send_nego_msg(reg->hr_key, O2HB_NEGO_TIMEOUT_MSG, ret = o2hb_send_nego_msg(reg->hr_key, O2HB_NEGO_TIMEOUT_MSG,
master_node); master_node);
if (ret) if (ret)
...@@ -436,7 +442,8 @@ static int o2hb_nego_timeout_handler(struct o2net_msg *msg, u32 len, void *data, ...@@ -436,7 +442,8 @@ static int o2hb_nego_timeout_handler(struct o2net_msg *msg, u32 len, void *data,
nego_msg = (struct o2hb_nego_msg *)msg->buf; nego_msg = (struct o2hb_nego_msg *)msg->buf;
printk(KERN_NOTICE "o2hb: receive negotiate timeout message from node %d on region %s (%pg).\n", printk(KERN_NOTICE "o2hb: receive negotiate timeout message from node %d on region %s (%pg).\n",
nego_msg->node_num, config_item_name(&reg->hr_item), reg->hr_bdev); nego_msg->node_num, config_item_name(&reg->hr_item),
reg_bdev(reg));
if (nego_msg->node_num < O2NM_MAX_NODES) if (nego_msg->node_num < O2NM_MAX_NODES)
set_bit(nego_msg->node_num, reg->hr_nego_node_bitmap); set_bit(nego_msg->node_num, reg->hr_nego_node_bitmap);
else else
...@@ -451,7 +458,7 @@ static int o2hb_nego_approve_handler(struct o2net_msg *msg, u32 len, void *data, ...@@ -451,7 +458,7 @@ static int o2hb_nego_approve_handler(struct o2net_msg *msg, u32 len, void *data,
struct o2hb_region *reg = data; struct o2hb_region *reg = data;
printk(KERN_NOTICE "o2hb: negotiate timeout approved by master node on region %s (%pg).\n", printk(KERN_NOTICE "o2hb: negotiate timeout approved by master node on region %s (%pg).\n",
config_item_name(&reg->hr_item), reg->hr_bdev); config_item_name(&reg->hr_item), reg_bdev(reg));
o2hb_arm_timeout(reg); o2hb_arm_timeout(reg);
return 0; return 0;
} }
...@@ -515,7 +522,7 @@ static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg, ...@@ -515,7 +522,7 @@ static struct bio *o2hb_setup_one_bio(struct o2hb_region *reg,
* GFP_KERNEL that the local node can get fenced. It would be * GFP_KERNEL that the local node can get fenced. It would be
* nicest if we could pre-allocate these bios and avoid this * nicest if we could pre-allocate these bios and avoid this
* all together. */ * all together. */
bio = bio_alloc(reg->hr_bdev, 16, opf, GFP_ATOMIC); bio = bio_alloc(reg_bdev(reg), 16, opf, GFP_ATOMIC);
if (!bio) { if (!bio) {
mlog(ML_ERROR, "Could not alloc slots BIO!\n"); mlog(ML_ERROR, "Could not alloc slots BIO!\n");
bio = ERR_PTR(-ENOMEM); bio = ERR_PTR(-ENOMEM);
...@@ -687,7 +694,7 @@ static int o2hb_check_own_slot(struct o2hb_region *reg) ...@@ -687,7 +694,7 @@ static int o2hb_check_own_slot(struct o2hb_region *reg)
errstr = ERRSTR3; errstr = ERRSTR3;
mlog(ML_ERROR, "%s (%pg): expected(%u:0x%llx, 0x%llx), " mlog(ML_ERROR, "%s (%pg): expected(%u:0x%llx, 0x%llx), "
"ondisk(%u:0x%llx, 0x%llx)\n", errstr, reg->hr_bdev, "ondisk(%u:0x%llx, 0x%llx)\n", errstr, reg_bdev(reg),
slot->ds_node_num, (unsigned long long)slot->ds_last_generation, slot->ds_node_num, (unsigned long long)slot->ds_last_generation,
(unsigned long long)slot->ds_last_time, hb_block->hb_node, (unsigned long long)slot->ds_last_time, hb_block->hb_node,
(unsigned long long)le64_to_cpu(hb_block->hb_generation), (unsigned long long)le64_to_cpu(hb_block->hb_generation),
...@@ -861,7 +868,7 @@ static void o2hb_set_quorum_device(struct o2hb_region *reg) ...@@ -861,7 +868,7 @@ static void o2hb_set_quorum_device(struct o2hb_region *reg)
goto unlock; goto unlock;
printk(KERN_NOTICE "o2hb: Region %s (%pg) is now a quorum device\n", printk(KERN_NOTICE "o2hb: Region %s (%pg) is now a quorum device\n",
config_item_name(&reg->hr_item), reg->hr_bdev); config_item_name(&reg->hr_item), reg_bdev(reg));
set_bit(reg->hr_region_num, o2hb_quorum_region_bitmap); set_bit(reg->hr_region_num, o2hb_quorum_region_bitmap);
...@@ -920,7 +927,7 @@ static int o2hb_check_slot(struct o2hb_region *reg, ...@@ -920,7 +927,7 @@ static int o2hb_check_slot(struct o2hb_region *reg,
* consider it a transient miss but don't populate any * consider it a transient miss but don't populate any
* other values as they may be junk. */ * other values as they may be junk. */
mlog(ML_ERROR, "Node %d has written a bad crc to %pg\n", mlog(ML_ERROR, "Node %d has written a bad crc to %pg\n",
slot->ds_node_num, reg->hr_bdev); slot->ds_node_num, reg_bdev(reg));
o2hb_dump_slot(hb_block); o2hb_dump_slot(hb_block);
slot->ds_equal_samples++; slot->ds_equal_samples++;
...@@ -1003,8 +1010,8 @@ static int o2hb_check_slot(struct o2hb_region *reg, ...@@ -1003,8 +1010,8 @@ static int o2hb_check_slot(struct o2hb_region *reg,
"of %u ms, but our count is %u ms.\n" "of %u ms, but our count is %u ms.\n"
"Please double check your configuration values " "Please double check your configuration values "
"for 'O2CB_HEARTBEAT_THRESHOLD'\n", "for 'O2CB_HEARTBEAT_THRESHOLD'\n",
slot->ds_node_num, reg->hr_bdev, slot_dead_ms, slot->ds_node_num, reg_bdev(reg),
dead_ms); slot_dead_ms, dead_ms);
} }
goto out; goto out;
} }
...@@ -1143,7 +1150,7 @@ static int o2hb_do_disk_heartbeat(struct o2hb_region *reg) ...@@ -1143,7 +1150,7 @@ static int o2hb_do_disk_heartbeat(struct o2hb_region *reg)
* can't be sure that the new block ever made it to * can't be sure that the new block ever made it to
* disk */ * disk */
mlog(ML_ERROR, "Write error %d on device \"%pg\"\n", mlog(ML_ERROR, "Write error %d on device \"%pg\"\n",
write_wc.wc_error, reg->hr_bdev); write_wc.wc_error, reg_bdev(reg));
ret = write_wc.wc_error; ret = write_wc.wc_error;
goto bail; goto bail;
} }
...@@ -1169,7 +1176,7 @@ static int o2hb_do_disk_heartbeat(struct o2hb_region *reg) ...@@ -1169,7 +1176,7 @@ static int o2hb_do_disk_heartbeat(struct o2hb_region *reg)
printk(KERN_NOTICE "o2hb: Unable to stabilize " printk(KERN_NOTICE "o2hb: Unable to stabilize "
"heartbeat on region %s (%pg)\n", "heartbeat on region %s (%pg)\n",
config_item_name(&reg->hr_item), config_item_name(&reg->hr_item),
reg->hr_bdev); reg_bdev(reg));
atomic_set(&reg->hr_steady_iterations, 0); atomic_set(&reg->hr_steady_iterations, 0);
reg->hr_aborted_start = 1; reg->hr_aborted_start = 1;
wake_up(&o2hb_steady_queue); wake_up(&o2hb_steady_queue);
...@@ -1489,7 +1496,7 @@ static void o2hb_region_release(struct config_item *item) ...@@ -1489,7 +1496,7 @@ static void o2hb_region_release(struct config_item *item)
struct page *page; struct page *page;
struct o2hb_region *reg = to_o2hb_region(item); struct o2hb_region *reg = to_o2hb_region(item);
mlog(ML_HEARTBEAT, "hb region release (%pg)\n", reg->hr_bdev); mlog(ML_HEARTBEAT, "hb region release (%pg)\n", reg_bdev(reg));
kfree(reg->hr_tmp_block); kfree(reg->hr_tmp_block);
...@@ -1502,8 +1509,8 @@ static void o2hb_region_release(struct config_item *item) ...@@ -1502,8 +1509,8 @@ static void o2hb_region_release(struct config_item *item)
kfree(reg->hr_slot_data); kfree(reg->hr_slot_data);
} }
if (reg->hr_bdev) if (reg->hr_bdev_handle)
blkdev_put(reg->hr_bdev, NULL); bdev_release(reg->hr_bdev_handle);
kfree(reg->hr_slots); kfree(reg->hr_slots);
...@@ -1562,7 +1569,7 @@ static ssize_t o2hb_region_block_bytes_store(struct config_item *item, ...@@ -1562,7 +1569,7 @@ static ssize_t o2hb_region_block_bytes_store(struct config_item *item,
unsigned long block_bytes; unsigned long block_bytes;
unsigned int block_bits; unsigned int block_bits;
if (reg->hr_bdev) if (reg->hr_bdev_handle)
return -EINVAL; return -EINVAL;
status = o2hb_read_block_input(reg, page, &block_bytes, status = o2hb_read_block_input(reg, page, &block_bytes,
...@@ -1591,7 +1598,7 @@ static ssize_t o2hb_region_start_block_store(struct config_item *item, ...@@ -1591,7 +1598,7 @@ static ssize_t o2hb_region_start_block_store(struct config_item *item,
char *p = (char *)page; char *p = (char *)page;
ssize_t ret; ssize_t ret;
if (reg->hr_bdev) if (reg->hr_bdev_handle)
return -EINVAL; return -EINVAL;
ret = kstrtoull(p, 0, &tmp); ret = kstrtoull(p, 0, &tmp);
...@@ -1616,7 +1623,7 @@ static ssize_t o2hb_region_blocks_store(struct config_item *item, ...@@ -1616,7 +1623,7 @@ static ssize_t o2hb_region_blocks_store(struct config_item *item,
unsigned long tmp; unsigned long tmp;
char *p = (char *)page; char *p = (char *)page;
if (reg->hr_bdev) if (reg->hr_bdev_handle)
return -EINVAL; return -EINVAL;
tmp = simple_strtoul(p, &p, 0); tmp = simple_strtoul(p, &p, 0);
...@@ -1635,8 +1642,8 @@ static ssize_t o2hb_region_dev_show(struct config_item *item, char *page) ...@@ -1635,8 +1642,8 @@ static ssize_t o2hb_region_dev_show(struct config_item *item, char *page)
{ {
unsigned int ret = 0; unsigned int ret = 0;
if (to_o2hb_region(item)->hr_bdev) if (to_o2hb_region(item)->hr_bdev_handle)
ret = sprintf(page, "%pg\n", to_o2hb_region(item)->hr_bdev); ret = sprintf(page, "%pg\n", reg_bdev(to_o2hb_region(item)));
return ret; return ret;
} }
...@@ -1745,7 +1752,10 @@ static int o2hb_populate_slot_data(struct o2hb_region *reg) ...@@ -1745,7 +1752,10 @@ static int o2hb_populate_slot_data(struct o2hb_region *reg)
return ret; return ret;
} }
/* this is acting as commit; we set up all of hr_bdev and hr_task or nothing */ /*
* this is acting as commit; we set up all of hr_bdev_handle and hr_task or
* nothing
*/
static ssize_t o2hb_region_dev_store(struct config_item *item, static ssize_t o2hb_region_dev_store(struct config_item *item,
const char *page, const char *page,
size_t count) size_t count)
...@@ -1759,7 +1769,7 @@ static ssize_t o2hb_region_dev_store(struct config_item *item, ...@@ -1759,7 +1769,7 @@ static ssize_t o2hb_region_dev_store(struct config_item *item,
ssize_t ret = -EINVAL; ssize_t ret = -EINVAL;
int live_threshold; int live_threshold;
if (reg->hr_bdev) if (reg->hr_bdev_handle)
goto out; goto out;
/* We can't heartbeat without having had our node number /* We can't heartbeat without having had our node number
...@@ -1785,16 +1795,15 @@ static ssize_t o2hb_region_dev_store(struct config_item *item, ...@@ -1785,16 +1795,15 @@ static ssize_t o2hb_region_dev_store(struct config_item *item,
if (!S_ISBLK(f.file->f_mapping->host->i_mode)) if (!S_ISBLK(f.file->f_mapping->host->i_mode))
goto out2; goto out2;
reg->hr_bdev = blkdev_get_by_dev(f.file->f_mapping->host->i_rdev, reg->hr_bdev_handle = bdev_open_by_dev(f.file->f_mapping->host->i_rdev,
BLK_OPEN_WRITE | BLK_OPEN_READ, NULL, BLK_OPEN_WRITE | BLK_OPEN_READ, NULL, NULL);
NULL); if (IS_ERR(reg->hr_bdev_handle)) {
if (IS_ERR(reg->hr_bdev)) { ret = PTR_ERR(reg->hr_bdev_handle);
ret = PTR_ERR(reg->hr_bdev); reg->hr_bdev_handle = NULL;
reg->hr_bdev = NULL;
goto out2; goto out2;
} }
sectsize = bdev_logical_block_size(reg->hr_bdev); sectsize = bdev_logical_block_size(reg_bdev(reg));
if (sectsize != reg->hr_block_bytes) { if (sectsize != reg->hr_block_bytes) {
mlog(ML_ERROR, mlog(ML_ERROR,
"blocksize %u incorrect for device, expected %d", "blocksize %u incorrect for device, expected %d",
...@@ -1890,12 +1899,12 @@ static ssize_t o2hb_region_dev_store(struct config_item *item, ...@@ -1890,12 +1899,12 @@ static ssize_t o2hb_region_dev_store(struct config_item *item,
if (hb_task && o2hb_global_heartbeat_active()) if (hb_task && o2hb_global_heartbeat_active())
printk(KERN_NOTICE "o2hb: Heartbeat started on region %s (%pg)\n", printk(KERN_NOTICE "o2hb: Heartbeat started on region %s (%pg)\n",
config_item_name(&reg->hr_item), reg->hr_bdev); config_item_name(&reg->hr_item), reg_bdev(reg));
out3: out3:
if (ret < 0) { if (ret < 0) {
blkdev_put(reg->hr_bdev, NULL); bdev_release(reg->hr_bdev_handle);
reg->hr_bdev = NULL; reg->hr_bdev_handle = NULL;
} }
out2: out2:
fdput(f); fdput(f);
...@@ -2085,7 +2094,7 @@ static void o2hb_heartbeat_group_drop_item(struct config_group *group, ...@@ -2085,7 +2094,7 @@ static void o2hb_heartbeat_group_drop_item(struct config_group *group,
printk(KERN_NOTICE "o2hb: Heartbeat %s on region %s (%pg)\n", printk(KERN_NOTICE "o2hb: Heartbeat %s on region %s (%pg)\n",
((atomic_read(&reg->hr_steady_iterations) == 0) ? ((atomic_read(&reg->hr_steady_iterations) == 0) ?
"stopped" : "start aborted"), config_item_name(item), "stopped" : "start aborted"), config_item_name(item),
reg->hr_bdev); reg_bdev(reg));
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment