Lines Matching refs:rbd_dev

292 	struct rbd_device	*rbd_dev;  member
430 static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth);
488 void rbd_warn(struct rbd_device *rbd_dev, const char *fmt, ...) in rbd_warn() argument
497 if (!rbd_dev) in rbd_warn()
499 else if (rbd_dev->disk) in rbd_warn()
501 RBD_DRV_NAME, rbd_dev->disk->disk_name, &vaf); in rbd_warn()
502 else if (rbd_dev->spec && rbd_dev->spec->image_name) in rbd_warn()
504 RBD_DRV_NAME, rbd_dev->spec->image_name, &vaf); in rbd_warn()
505 else if (rbd_dev->spec && rbd_dev->spec->image_id) in rbd_warn()
507 RBD_DRV_NAME, rbd_dev->spec->image_id, &vaf); in rbd_warn()
510 RBD_DRV_NAME, rbd_dev, &vaf); in rbd_warn()
530 static void rbd_dev_remove_parent(struct rbd_device *rbd_dev);
532 static int rbd_dev_refresh(struct rbd_device *rbd_dev);
533 static int rbd_dev_v2_header_onetime(struct rbd_device *rbd_dev);
534 static int rbd_dev_header_info(struct rbd_device *rbd_dev);
535 static int rbd_dev_v2_parent_info(struct rbd_device *rbd_dev);
536 static const char *rbd_dev_v2_snap_name(struct rbd_device *rbd_dev,
538 static int _rbd_dev_v2_snap_size(struct rbd_device *rbd_dev, u64 snap_id,
540 static int _rbd_dev_v2_snap_features(struct rbd_device *rbd_dev, u64 snap_id,
542 static u64 rbd_snap_id_by_name(struct rbd_device *rbd_dev, const char *name);
546 struct rbd_device *rbd_dev = bdev->bd_disk->private_data; in rbd_open() local
549 if ((mode & FMODE_WRITE) && rbd_dev->mapping.read_only) in rbd_open()
552 spin_lock_irq(&rbd_dev->lock); in rbd_open()
553 if (test_bit(RBD_DEV_FLAG_REMOVING, &rbd_dev->flags)) in rbd_open()
556 rbd_dev->open_count++; in rbd_open()
557 spin_unlock_irq(&rbd_dev->lock); in rbd_open()
561 (void) get_device(&rbd_dev->dev); in rbd_open()
568 struct rbd_device *rbd_dev = disk->private_data; in rbd_release() local
571 spin_lock_irq(&rbd_dev->lock); in rbd_release()
572 open_count_before = rbd_dev->open_count--; in rbd_release()
573 spin_unlock_irq(&rbd_dev->lock); in rbd_release()
576 put_device(&rbd_dev->dev); in rbd_release()
579 static int rbd_ioctl_set_ro(struct rbd_device *rbd_dev, unsigned long arg) in rbd_ioctl_set_ro() argument
592 if (rbd_dev->spec->snap_id != CEPH_NOSNAP && !ro) in rbd_ioctl_set_ro()
595 spin_lock_irq(&rbd_dev->lock); in rbd_ioctl_set_ro()
597 if (rbd_dev->open_count > 1) { in rbd_ioctl_set_ro()
602 if (rbd_dev->mapping.read_only != ro) { in rbd_ioctl_set_ro()
603 rbd_dev->mapping.read_only = ro; in rbd_ioctl_set_ro()
608 spin_unlock_irq(&rbd_dev->lock); in rbd_ioctl_set_ro()
611 set_disk_ro(rbd_dev->disk, ro ? 1 : 0); in rbd_ioctl_set_ro()
619 struct rbd_device *rbd_dev = bdev->bd_disk->private_data; in rbd_ioctl() local
624 ret = rbd_ioctl_set_ro(rbd_dev, arg); in rbd_ioctl()
911 static int rbd_header_from_disk(struct rbd_device *rbd_dev, in rbd_header_from_disk() argument
914 struct rbd_image_header *header = &rbd_dev->header; in rbd_header_from_disk()
1018 static const char *_rbd_dev_v1_snap_name(struct rbd_device *rbd_dev, u32 which) in _rbd_dev_v1_snap_name() argument
1022 rbd_assert(which < rbd_dev->header.snapc->num_snaps); in _rbd_dev_v1_snap_name()
1026 snap_name = rbd_dev->header.snap_names; in _rbd_dev_v1_snap_name()
1057 static u32 rbd_dev_snap_index(struct rbd_device *rbd_dev, u64 snap_id) in rbd_dev_snap_index() argument
1059 struct ceph_snap_context *snapc = rbd_dev->header.snapc; in rbd_dev_snap_index()
1068 static const char *rbd_dev_v1_snap_name(struct rbd_device *rbd_dev, in rbd_dev_v1_snap_name() argument
1074 which = rbd_dev_snap_index(rbd_dev, snap_id); in rbd_dev_v1_snap_name()
1078 snap_name = _rbd_dev_v1_snap_name(rbd_dev, which); in rbd_dev_v1_snap_name()
1082 static const char *rbd_snap_name(struct rbd_device *rbd_dev, u64 snap_id) in rbd_snap_name() argument
1087 rbd_assert(rbd_image_format_valid(rbd_dev->image_format)); in rbd_snap_name()
1088 if (rbd_dev->image_format == 1) in rbd_snap_name()
1089 return rbd_dev_v1_snap_name(rbd_dev, snap_id); in rbd_snap_name()
1091 return rbd_dev_v2_snap_name(rbd_dev, snap_id); in rbd_snap_name()
1094 static int rbd_snap_size(struct rbd_device *rbd_dev, u64 snap_id, in rbd_snap_size() argument
1097 rbd_assert(rbd_image_format_valid(rbd_dev->image_format)); in rbd_snap_size()
1099 *snap_size = rbd_dev->header.image_size; in rbd_snap_size()
1100 } else if (rbd_dev->image_format == 1) { in rbd_snap_size()
1103 which = rbd_dev_snap_index(rbd_dev, snap_id); in rbd_snap_size()
1107 *snap_size = rbd_dev->header.snap_sizes[which]; in rbd_snap_size()
1112 ret = _rbd_dev_v2_snap_size(rbd_dev, snap_id, NULL, &size); in rbd_snap_size()
1121 static int rbd_snap_features(struct rbd_device *rbd_dev, u64 snap_id, in rbd_snap_features() argument
1124 rbd_assert(rbd_image_format_valid(rbd_dev->image_format)); in rbd_snap_features()
1126 *snap_features = rbd_dev->header.features; in rbd_snap_features()
1127 } else if (rbd_dev->image_format == 1) { in rbd_snap_features()
1133 ret = _rbd_dev_v2_snap_features(rbd_dev, snap_id, &features); in rbd_snap_features()
1142 static int rbd_dev_mapping_set(struct rbd_device *rbd_dev) in rbd_dev_mapping_set() argument
1144 u64 snap_id = rbd_dev->spec->snap_id; in rbd_dev_mapping_set()
1149 ret = rbd_snap_size(rbd_dev, snap_id, &size); in rbd_dev_mapping_set()
1152 ret = rbd_snap_features(rbd_dev, snap_id, &features); in rbd_dev_mapping_set()
1156 rbd_dev->mapping.size = size; in rbd_dev_mapping_set()
1157 rbd_dev->mapping.features = features; in rbd_dev_mapping_set()
1162 static void rbd_dev_mapping_clear(struct rbd_device *rbd_dev) in rbd_dev_mapping_clear() argument
1164 rbd_dev->mapping.size = 0; in rbd_dev_mapping_clear()
1165 rbd_dev->mapping.features = 0; in rbd_dev_mapping_clear()
1175 static const char *rbd_segment_name(struct rbd_device *rbd_dev, u64 offset) in rbd_segment_name() argument
1185 segment = offset >> rbd_dev->header.obj_order; in rbd_segment_name()
1187 if (rbd_dev->image_format == 2) in rbd_segment_name()
1190 rbd_dev->header.object_prefix, segment); in rbd_segment_name()
1201 static u64 rbd_segment_offset(struct rbd_device *rbd_dev, u64 offset) in rbd_segment_offset() argument
1203 u64 segment_size = (u64) 1 << rbd_dev->header.obj_order; in rbd_segment_offset()
1208 static u64 rbd_segment_length(struct rbd_device *rbd_dev, in rbd_segment_length() argument
1211 u64 segment_size = (u64) 1 << rbd_dev->header.obj_order; in rbd_segment_length()
1397 struct rbd_device *rbd_dev; in obj_request_img_data_set() local
1399 rbd_dev = obj_request->img_request->rbd_dev; in obj_request_img_data_set()
1400 rbd_warn(rbd_dev, "obj_request %p already marked img_data", in obj_request_img_data_set()
1414 struct rbd_device *rbd_dev = NULL; in obj_request_done_set() local
1417 rbd_dev = obj_request->img_request->rbd_dev; in obj_request_done_set()
1418 rbd_warn(rbd_dev, "obj_request %p already marked done", in obj_request_done_set()
1462 struct rbd_device *rbd_dev = obj_request->img_request->rbd_dev; in obj_request_overlaps_parent() local
1465 round_up(rbd_dev->parent_overlap, rbd_obj_bytes(&rbd_dev->header)); in obj_request_overlaps_parent()
1745 struct rbd_device *rbd_dev = NULL; in rbd_osd_read_callback() local
1751 rbd_dev = img_request->rbd_dev; in rbd_osd_read_callback()
1758 obj_request->img_offset < rbd_dev->parent_overlap) in rbd_osd_read_callback()
1911 struct rbd_device *rbd_dev, in rbd_osd_req_create() argument
1935 osdc = &rbd_dev->rbd_client->client->osdc; in rbd_osd_req_create()
1949 osd_req->r_base_oloc.pool = ceph_file_layout_pg_pool(rbd_dev->layout); in rbd_osd_req_create()
1966 struct rbd_device *rbd_dev; in rbd_osd_req_create_copyup() local
1983 rbd_dev = img_request->rbd_dev; in rbd_osd_req_create_copyup()
1984 osdc = &rbd_dev->rbd_client->client->osdc; in rbd_osd_req_create_copyup()
1994 osd_req->r_base_oloc.pool = ceph_file_layout_pg_pool(rbd_dev->layout); in rbd_osd_req_create_copyup()
2082 static void rbd_dev_unparent(struct rbd_device *rbd_dev) in rbd_dev_unparent() argument
2084 rbd_dev_remove_parent(rbd_dev); in rbd_dev_unparent()
2085 rbd_spec_put(rbd_dev->parent_spec); in rbd_dev_unparent()
2086 rbd_dev->parent_spec = NULL; in rbd_dev_unparent()
2087 rbd_dev->parent_overlap = 0; in rbd_dev_unparent()
2096 static void rbd_dev_parent_put(struct rbd_device *rbd_dev) in rbd_dev_parent_put() argument
2100 if (!rbd_dev->parent_spec) in rbd_dev_parent_put()
2103 counter = atomic_dec_return_safe(&rbd_dev->parent_ref); in rbd_dev_parent_put()
2110 rbd_dev_unparent(rbd_dev); in rbd_dev_parent_put()
2112 rbd_warn(rbd_dev, "parent reference underflow"); in rbd_dev_parent_put()
2123 static bool rbd_dev_parent_get(struct rbd_device *rbd_dev) in rbd_dev_parent_get() argument
2127 if (!rbd_dev->parent_spec) in rbd_dev_parent_get()
2130 down_read(&rbd_dev->header_rwsem); in rbd_dev_parent_get()
2131 if (rbd_dev->parent_overlap) in rbd_dev_parent_get()
2132 counter = atomic_inc_return_safe(&rbd_dev->parent_ref); in rbd_dev_parent_get()
2133 up_read(&rbd_dev->header_rwsem); in rbd_dev_parent_get()
2136 rbd_warn(rbd_dev, "parent reference overflow"); in rbd_dev_parent_get()
2147 struct rbd_device *rbd_dev, in rbd_img_request_create() argument
2159 img_request->rbd_dev = rbd_dev; in rbd_img_request_create()
2170 img_request->snap_id = rbd_dev->spec->snap_id; in rbd_img_request_create()
2172 if (rbd_dev_parent_get(rbd_dev)) in rbd_img_request_create()
2182 dout("%s: rbd_dev %p %s %llu/%llu -> img %p\n", __func__, rbd_dev, in rbd_img_request_create()
2204 rbd_dev_parent_put(img_request->rbd_dev); in rbd_img_request_destroy()
2219 struct rbd_device *rbd_dev; in rbd_parent_request_create() local
2222 rbd_dev = obj_request->img_request->rbd_dev; in rbd_parent_request_create()
2224 parent_request = rbd_img_request_create(rbd_dev->parent, img_offset, in rbd_parent_request_create()
2265 struct rbd_device *rbd_dev = img_request->rbd_dev; in rbd_img_obj_end_request() local
2275 rbd_warn(rbd_dev, "%s %llx at %llx (%llx)", in rbd_img_obj_end_request()
2278 rbd_warn(rbd_dev, " result %d xferred %x", in rbd_img_obj_end_request()
2360 struct rbd_device *rbd_dev = img_request->rbd_dev; in rbd_img_obj_request_fill() local
2361 u64 object_size = rbd_obj_bytes(&rbd_dev->header); in rbd_img_obj_request_fill()
2375 down_read(&rbd_dev->header_rwsem); in rbd_img_obj_request_fill()
2376 img_end = rbd_dev->header.image_size; in rbd_img_obj_request_fill()
2377 up_read(&rbd_dev->header_rwsem); in rbd_img_obj_request_fill()
2426 struct rbd_device *rbd_dev = img_request->rbd_dev; in rbd_img_request_fill() local
2458 object_name = rbd_segment_name(rbd_dev, img_offset); in rbd_img_request_fill()
2461 offset = rbd_segment_offset(rbd_dev, img_offset); in rbd_img_request_fill()
2462 length = rbd_segment_length(rbd_dev, img_offset, resid); in rbd_img_request_fill()
2499 osd_req = rbd_osd_req_create(rbd_dev, op_type, in rbd_img_request_fill()
2530 struct rbd_device *rbd_dev; in rbd_osd_copyup_callback() local
2542 rbd_dev = img_request->rbd_dev; in rbd_osd_copyup_callback()
2543 rbd_assert(rbd_dev); in rbd_osd_copyup_callback()
2571 struct rbd_device *rbd_dev; in rbd_img_obj_parent_read_full_callback() local
2598 rbd_dev = orig_request->img_request->rbd_dev; in rbd_img_obj_parent_read_full_callback()
2599 rbd_assert(rbd_dev); in rbd_img_obj_parent_read_full_callback()
2606 if (!rbd_dev->parent_overlap) { in rbd_img_obj_parent_read_full_callback()
2610 osdc = &rbd_dev->rbd_client->client->osdc; in rbd_img_obj_parent_read_full_callback()
2647 osdc = &rbd_dev->rbd_client->client->osdc; in rbd_img_obj_parent_read_full_callback()
2678 struct rbd_device *rbd_dev; in rbd_img_obj_parent_read_full() local
2690 rbd_dev = img_request->rbd_dev; in rbd_img_obj_parent_read_full()
2691 rbd_assert(rbd_dev->parent != NULL); in rbd_img_obj_parent_read_full()
2698 length = (u64)1 << rbd_dev->header.obj_order; in rbd_img_obj_parent_read_full()
2705 if (img_offset + length > rbd_dev->parent_overlap) { in rbd_img_obj_parent_read_full()
2706 rbd_assert(img_offset < rbd_dev->parent_overlap); in rbd_img_obj_parent_read_full()
2707 length = rbd_dev->parent_overlap - img_offset; in rbd_img_obj_parent_read_full()
2758 struct rbd_device *rbd_dev; in rbd_img_obj_exists_callback() local
2787 rbd_dev = orig_request->img_request->rbd_dev; in rbd_img_obj_exists_callback()
2788 if (!rbd_dev->parent_overlap) { in rbd_img_obj_exists_callback()
2791 osdc = &rbd_dev->rbd_client->client->osdc; in rbd_img_obj_exists_callback()
2825 struct rbd_device *rbd_dev; in rbd_img_obj_exists_submit() local
2858 rbd_dev = obj_request->img_request->rbd_dev; in rbd_img_obj_exists_submit()
2859 stat_request->osd_req = rbd_osd_req_create(rbd_dev, OBJ_OP_READ, 1, in rbd_img_obj_exists_submit()
2870 osdc = &rbd_dev->rbd_client->client->osdc; in rbd_img_obj_exists_submit()
2882 struct rbd_device *rbd_dev; in img_obj_request_simple() local
2888 rbd_dev = img_request->rbd_dev; in img_obj_request_simple()
2911 obj_request->length == rbd_obj_bytes(&rbd_dev->header)) in img_obj_request_simple()
2928 struct rbd_device *rbd_dev; in rbd_img_obj_request_submit() local
2931 rbd_dev = obj_request->img_request->rbd_dev; in rbd_img_obj_request_submit()
2932 osdc = &rbd_dev->rbd_client->client->osdc; in rbd_img_obj_request_submit()
2971 struct rbd_device *rbd_dev; in rbd_img_parent_read_callback() local
2992 rbd_dev = obj_request->img_request->rbd_dev; in rbd_img_parent_read_callback()
2993 if (!rbd_dev->parent_overlap) { in rbd_img_parent_read_callback()
2996 osdc = &rbd_dev->rbd_client->client->osdc; in rbd_img_parent_read_callback()
3015 if (obj_end > rbd_dev->parent_overlap) { in rbd_img_parent_read_callback()
3018 if (obj_request->img_offset < rbd_dev->parent_overlap) in rbd_img_parent_read_callback()
3019 xferred = rbd_dev->parent_overlap - in rbd_img_parent_read_callback()
3072 static int rbd_obj_notify_ack_sync(struct rbd_device *rbd_dev, u64 notify_id) in rbd_obj_notify_ack_sync() argument
3075 struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; in rbd_obj_notify_ack_sync()
3078 obj_request = rbd_obj_request_create(rbd_dev->header_name, 0, 0, in rbd_obj_notify_ack_sync()
3084 obj_request->osd_req = rbd_osd_req_create(rbd_dev, OBJ_OP_READ, 1, in rbd_obj_notify_ack_sync()
3105 struct rbd_device *rbd_dev = (struct rbd_device *)data; in rbd_watch_cb() local
3108 if (!rbd_dev) in rbd_watch_cb()
3112 rbd_dev->header_name, (unsigned long long)notify_id, in rbd_watch_cb()
3121 ret = rbd_dev_refresh(rbd_dev); in rbd_watch_cb()
3123 rbd_warn(rbd_dev, "refresh failed: %d", ret); in rbd_watch_cb()
3125 ret = rbd_obj_notify_ack_sync(rbd_dev, notify_id); in rbd_watch_cb()
3127 rbd_warn(rbd_dev, "notify_ack ret %d", ret); in rbd_watch_cb()
3135 struct rbd_device *rbd_dev, in rbd_obj_watch_request_helper() argument
3138 struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; in rbd_obj_watch_request_helper()
3142 obj_request = rbd_obj_request_create(rbd_dev->header_name, 0, 0, in rbd_obj_watch_request_helper()
3147 obj_request->osd_req = rbd_osd_req_create(rbd_dev, OBJ_OP_WRITE, 1, in rbd_obj_watch_request_helper()
3155 rbd_dev->watch_event->cookie, 0, watch); in rbd_obj_watch_request_helper()
3186 static int rbd_dev_header_watch_sync(struct rbd_device *rbd_dev) in rbd_dev_header_watch_sync() argument
3188 struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; in rbd_dev_header_watch_sync()
3192 rbd_assert(!rbd_dev->watch_event); in rbd_dev_header_watch_sync()
3193 rbd_assert(!rbd_dev->watch_request); in rbd_dev_header_watch_sync()
3195 ret = ceph_osdc_create_event(osdc, rbd_watch_cb, rbd_dev, in rbd_dev_header_watch_sync()
3196 &rbd_dev->watch_event); in rbd_dev_header_watch_sync()
3200 obj_request = rbd_obj_watch_request_helper(rbd_dev, true); in rbd_dev_header_watch_sync()
3202 ceph_osdc_cancel_event(rbd_dev->watch_event); in rbd_dev_header_watch_sync()
3203 rbd_dev->watch_event = NULL; in rbd_dev_header_watch_sync()
3215 rbd_dev->watch_request = obj_request; in rbd_dev_header_watch_sync()
3223 static void rbd_dev_header_unwatch_sync(struct rbd_device *rbd_dev) in rbd_dev_header_unwatch_sync() argument
3227 rbd_assert(rbd_dev->watch_event); in rbd_dev_header_unwatch_sync()
3228 rbd_assert(rbd_dev->watch_request); in rbd_dev_header_unwatch_sync()
3230 rbd_obj_request_end(rbd_dev->watch_request); in rbd_dev_header_unwatch_sync()
3231 rbd_obj_request_put(rbd_dev->watch_request); in rbd_dev_header_unwatch_sync()
3232 rbd_dev->watch_request = NULL; in rbd_dev_header_unwatch_sync()
3234 obj_request = rbd_obj_watch_request_helper(rbd_dev, false); in rbd_dev_header_unwatch_sync()
3238 rbd_warn(rbd_dev, "unable to tear down watch request (%ld)", in rbd_dev_header_unwatch_sync()
3241 ceph_osdc_cancel_event(rbd_dev->watch_event); in rbd_dev_header_unwatch_sync()
3242 rbd_dev->watch_event = NULL; in rbd_dev_header_unwatch_sync()
3249 static int rbd_obj_method_sync(struct rbd_device *rbd_dev, in rbd_obj_method_sync() argument
3258 struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; in rbd_obj_method_sync()
3285 obj_request->osd_req = rbd_osd_req_create(rbd_dev, OBJ_OP_READ, 1, in rbd_obj_method_sync()
3335 struct rbd_device *rbd_dev = rq->q->queuedata; in rbd_queue_workfn() local
3369 if (rbd_dev->mapping.read_only) { in rbd_queue_workfn()
3373 rbd_assert(rbd_dev->spec->snap_id == CEPH_NOSNAP); in rbd_queue_workfn()
3382 if (!test_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags)) { in rbd_queue_workfn()
3384 rbd_assert(rbd_dev->spec->snap_id != CEPH_NOSNAP); in rbd_queue_workfn()
3390 rbd_warn(rbd_dev, "bad request range (%llu~%llu)", offset, in rbd_queue_workfn()
3398 down_read(&rbd_dev->header_rwsem); in rbd_queue_workfn()
3399 mapping_size = rbd_dev->mapping.size; in rbd_queue_workfn()
3401 snapc = rbd_dev->header.snapc; in rbd_queue_workfn()
3404 up_read(&rbd_dev->header_rwsem); in rbd_queue_workfn()
3407 rbd_warn(rbd_dev, "beyond EOD (%llu~%llu > %llu)", offset, in rbd_queue_workfn()
3413 img_request = rbd_img_request_create(rbd_dev, offset, length, op_type, in rbd_queue_workfn()
3441 rbd_warn(rbd_dev, "%s %llx at %llx result %d", in rbd_queue_workfn()
3466 struct rbd_device *rbd_dev = q->queuedata; in rbd_merge_bvec() local
3478 sectors_per_obj = 1 << (rbd_dev->header.obj_order - SECTOR_SHIFT); in rbd_merge_bvec()
3504 static void rbd_free_disk(struct rbd_device *rbd_dev) in rbd_free_disk() argument
3506 struct gendisk *disk = rbd_dev->disk; in rbd_free_disk()
3511 rbd_dev->disk = NULL; in rbd_free_disk()
3516 blk_mq_free_tag_set(&rbd_dev->tag_set); in rbd_free_disk()
3521 static int rbd_obj_read_sync(struct rbd_device *rbd_dev, in rbd_obj_read_sync() argument
3526 struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; in rbd_obj_read_sync()
3547 obj_request->osd_req = rbd_osd_req_create(rbd_dev, OBJ_OP_READ, 1, in rbd_obj_read_sync()
3591 static int rbd_dev_v1_header_info(struct rbd_device *rbd_dev) in rbd_dev_v1_header_info() argument
3618 ret = rbd_obj_read_sync(rbd_dev, rbd_dev->header_name, in rbd_dev_v1_header_info()
3624 rbd_warn(rbd_dev, "short header read (want %zd got %d)", in rbd_dev_v1_header_info()
3630 rbd_warn(rbd_dev, "invalid header"); in rbd_dev_v1_header_info()
3639 ret = rbd_header_from_disk(rbd_dev, ondisk); in rbd_dev_v1_header_info()
3650 static void rbd_exists_validate(struct rbd_device *rbd_dev) in rbd_exists_validate() argument
3654 if (!test_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags)) in rbd_exists_validate()
3657 snap_id = rbd_dev->spec->snap_id; in rbd_exists_validate()
3661 if (rbd_dev_snap_index(rbd_dev, snap_id) == BAD_SNAP_INDEX) in rbd_exists_validate()
3662 clear_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags); in rbd_exists_validate()
3665 static void rbd_dev_update_size(struct rbd_device *rbd_dev) in rbd_dev_update_size() argument
3675 spin_lock_irq(&rbd_dev->lock); in rbd_dev_update_size()
3676 removing = test_bit(RBD_DEV_FLAG_REMOVING, &rbd_dev->flags); in rbd_dev_update_size()
3677 spin_unlock_irq(&rbd_dev->lock); in rbd_dev_update_size()
3683 size = (sector_t)rbd_dev->mapping.size / SECTOR_SIZE; in rbd_dev_update_size()
3685 set_capacity(rbd_dev->disk, size); in rbd_dev_update_size()
3686 revalidate_disk(rbd_dev->disk); in rbd_dev_update_size()
3690 static int rbd_dev_refresh(struct rbd_device *rbd_dev) in rbd_dev_refresh() argument
3695 down_write(&rbd_dev->header_rwsem); in rbd_dev_refresh()
3696 mapping_size = rbd_dev->mapping.size; in rbd_dev_refresh()
3698 ret = rbd_dev_header_info(rbd_dev); in rbd_dev_refresh()
3706 if (rbd_dev->parent) { in rbd_dev_refresh()
3707 ret = rbd_dev_v2_parent_info(rbd_dev); in rbd_dev_refresh()
3712 if (rbd_dev->spec->snap_id == CEPH_NOSNAP) { in rbd_dev_refresh()
3713 rbd_dev->mapping.size = rbd_dev->header.image_size; in rbd_dev_refresh()
3716 rbd_exists_validate(rbd_dev); in rbd_dev_refresh()
3720 up_write(&rbd_dev->header_rwsem); in rbd_dev_refresh()
3721 if (!ret && mapping_size != rbd_dev->mapping.size) in rbd_dev_refresh()
3722 rbd_dev_update_size(rbd_dev); in rbd_dev_refresh()
3743 static int rbd_init_disk(struct rbd_device *rbd_dev) in rbd_init_disk() argument
3758 rbd_dev->dev_id); in rbd_init_disk()
3759 disk->major = rbd_dev->major; in rbd_init_disk()
3760 disk->first_minor = rbd_dev->minor; in rbd_init_disk()
3764 disk->private_data = rbd_dev; in rbd_init_disk()
3766 memset(&rbd_dev->tag_set, 0, sizeof(rbd_dev->tag_set)); in rbd_init_disk()
3767 rbd_dev->tag_set.ops = &rbd_mq_ops; in rbd_init_disk()
3768 rbd_dev->tag_set.queue_depth = BLKDEV_MAX_RQ; in rbd_init_disk()
3769 rbd_dev->tag_set.numa_node = NUMA_NO_NODE; in rbd_init_disk()
3770 rbd_dev->tag_set.flags = in rbd_init_disk()
3772 rbd_dev->tag_set.nr_hw_queues = 1; in rbd_init_disk()
3773 rbd_dev->tag_set.cmd_size = sizeof(struct work_struct); in rbd_init_disk()
3775 err = blk_mq_alloc_tag_set(&rbd_dev->tag_set); in rbd_init_disk()
3779 q = blk_mq_init_queue(&rbd_dev->tag_set); in rbd_init_disk()
3789 segment_size = rbd_obj_bytes(&rbd_dev->header); in rbd_init_disk()
3803 if (!ceph_test_opt(rbd_dev->rbd_client->client, NOCRC)) in rbd_init_disk()
3808 q->queuedata = rbd_dev; in rbd_init_disk()
3810 rbd_dev->disk = disk; in rbd_init_disk()
3814 blk_mq_free_tag_set(&rbd_dev->tag_set); in rbd_init_disk()
3832 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_size_show() local
3835 (unsigned long long)rbd_dev->mapping.size); in rbd_size_show()
3845 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_features_show() local
3848 (unsigned long long)rbd_dev->mapping.features); in rbd_features_show()
3854 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_major_show() local
3856 if (rbd_dev->major) in rbd_major_show()
3857 return sprintf(buf, "%d\n", rbd_dev->major); in rbd_major_show()
3865 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_minor_show() local
3867 return sprintf(buf, "%d\n", rbd_dev->minor); in rbd_minor_show()
3873 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_client_id_show() local
3876 ceph_client_id(rbd_dev->rbd_client->client)); in rbd_client_id_show()
3882 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_pool_show() local
3884 return sprintf(buf, "%s\n", rbd_dev->spec->pool_name); in rbd_pool_show()
3890 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_pool_id_show() local
3893 (unsigned long long) rbd_dev->spec->pool_id); in rbd_pool_id_show()
3899 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_name_show() local
3901 if (rbd_dev->spec->image_name) in rbd_name_show()
3902 return sprintf(buf, "%s\n", rbd_dev->spec->image_name); in rbd_name_show()
3910 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_image_id_show() local
3912 return sprintf(buf, "%s\n", rbd_dev->spec->image_id); in rbd_image_id_show()
3923 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_snap_show() local
3925 return sprintf(buf, "%s\n", rbd_dev->spec->snap_name); in rbd_snap_show()
3937 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_parent_show() local
3940 if (!rbd_dev->parent) in rbd_parent_show()
3943 for ( ; rbd_dev->parent; rbd_dev = rbd_dev->parent) { in rbd_parent_show()
3944 struct rbd_spec *spec = rbd_dev->parent_spec; in rbd_parent_show()
3955 rbd_dev->parent_overlap); in rbd_parent_show()
3966 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_image_refresh() local
3969 ret = rbd_dev_refresh(rbd_dev); in rbd_image_refresh()
4067 struct rbd_device *rbd_dev; in rbd_dev_create() local
4069 rbd_dev = kzalloc(sizeof (*rbd_dev), GFP_KERNEL); in rbd_dev_create()
4070 if (!rbd_dev) in rbd_dev_create()
4073 spin_lock_init(&rbd_dev->lock); in rbd_dev_create()
4074 rbd_dev->flags = 0; in rbd_dev_create()
4075 atomic_set(&rbd_dev->parent_ref, 0); in rbd_dev_create()
4076 INIT_LIST_HEAD(&rbd_dev->node); in rbd_dev_create()
4077 init_rwsem(&rbd_dev->header_rwsem); in rbd_dev_create()
4079 rbd_dev->spec = spec; in rbd_dev_create()
4080 rbd_dev->rbd_client = rbdc; in rbd_dev_create()
4084 rbd_dev->layout.fl_stripe_unit = cpu_to_le32(1 << RBD_MAX_OBJ_ORDER); in rbd_dev_create()
4085 rbd_dev->layout.fl_stripe_count = cpu_to_le32(1); in rbd_dev_create()
4086 rbd_dev->layout.fl_object_size = cpu_to_le32(1 << RBD_MAX_OBJ_ORDER); in rbd_dev_create()
4087 rbd_dev->layout.fl_pg_pool = cpu_to_le32((u32) spec->pool_id); in rbd_dev_create()
4089 return rbd_dev; in rbd_dev_create()
4092 static void rbd_dev_destroy(struct rbd_device *rbd_dev) in rbd_dev_destroy() argument
4094 rbd_put_client(rbd_dev->rbd_client); in rbd_dev_destroy()
4095 rbd_spec_put(rbd_dev->spec); in rbd_dev_destroy()
4096 kfree(rbd_dev); in rbd_dev_destroy()
4104 static int _rbd_dev_v2_snap_size(struct rbd_device *rbd_dev, u64 snap_id, in _rbd_dev_v2_snap_size() argument
4114 ret = rbd_obj_method_sync(rbd_dev, rbd_dev->header_name, in _rbd_dev_v2_snap_size()
4137 static int rbd_dev_v2_image_size(struct rbd_device *rbd_dev) in rbd_dev_v2_image_size() argument
4139 return _rbd_dev_v2_snap_size(rbd_dev, CEPH_NOSNAP, in rbd_dev_v2_image_size()
4140 &rbd_dev->header.obj_order, in rbd_dev_v2_image_size()
4141 &rbd_dev->header.image_size); in rbd_dev_v2_image_size()
4144 static int rbd_dev_v2_object_prefix(struct rbd_device *rbd_dev) in rbd_dev_v2_object_prefix() argument
4154 ret = rbd_obj_method_sync(rbd_dev, rbd_dev->header_name, in rbd_dev_v2_object_prefix()
4162 rbd_dev->header.object_prefix = ceph_extract_encoded_string(&p, in rbd_dev_v2_object_prefix()
4166 if (IS_ERR(rbd_dev->header.object_prefix)) { in rbd_dev_v2_object_prefix()
4167 ret = PTR_ERR(rbd_dev->header.object_prefix); in rbd_dev_v2_object_prefix()
4168 rbd_dev->header.object_prefix = NULL; in rbd_dev_v2_object_prefix()
4170 dout(" object_prefix = %s\n", rbd_dev->header.object_prefix); in rbd_dev_v2_object_prefix()
4178 static int _rbd_dev_v2_snap_features(struct rbd_device *rbd_dev, u64 snap_id, in _rbd_dev_v2_snap_features() argument
4189 ret = rbd_obj_method_sync(rbd_dev, rbd_dev->header_name, in _rbd_dev_v2_snap_features()
4213 static int rbd_dev_v2_features(struct rbd_device *rbd_dev) in rbd_dev_v2_features() argument
4215 return _rbd_dev_v2_snap_features(rbd_dev, CEPH_NOSNAP, in rbd_dev_v2_features()
4216 &rbd_dev->header.features); in rbd_dev_v2_features()
4219 static int rbd_dev_v2_parent_info(struct rbd_device *rbd_dev) in rbd_dev_v2_parent_info() argument
4247 snapid = cpu_to_le64(rbd_dev->spec->snap_id); in rbd_dev_v2_parent_info()
4248 ret = rbd_obj_method_sync(rbd_dev, rbd_dev->header_name, in rbd_dev_v2_parent_info()
4270 if (rbd_dev->parent_overlap) { in rbd_dev_v2_parent_info()
4271 rbd_dev->parent_overlap = 0; in rbd_dev_v2_parent_info()
4272 rbd_dev_parent_put(rbd_dev); in rbd_dev_v2_parent_info()
4274 rbd_dev->disk->disk_name); in rbd_dev_v2_parent_info()
4302 if (!rbd_dev->parent_spec) { in rbd_dev_v2_parent_info()
4306 rbd_dev->parent_spec = parent_spec; in rbd_dev_v2_parent_info()
4319 if (rbd_dev->parent_overlap) in rbd_dev_v2_parent_info()
4320 rbd_warn(rbd_dev, in rbd_dev_v2_parent_info()
4324 rbd_warn(rbd_dev, "clone is standalone (overlap 0)"); in rbd_dev_v2_parent_info()
4327 rbd_dev->parent_overlap = overlap; in rbd_dev_v2_parent_info()
4338 static int rbd_dev_v2_striping_info(struct rbd_device *rbd_dev) in rbd_dev_v2_striping_info() argument
4351 ret = rbd_obj_method_sync(rbd_dev, rbd_dev->header_name, in rbd_dev_v2_striping_info()
4367 obj_size = (u64)1 << rbd_dev->header.obj_order; in rbd_dev_v2_striping_info()
4371 rbd_warn(rbd_dev, "unsupported stripe unit " in rbd_dev_v2_striping_info()
4378 rbd_warn(rbd_dev, "unsupported stripe count " in rbd_dev_v2_striping_info()
4382 rbd_dev->header.stripe_unit = stripe_unit; in rbd_dev_v2_striping_info()
4383 rbd_dev->header.stripe_count = stripe_count; in rbd_dev_v2_striping_info()
4388 static char *rbd_dev_image_name(struct rbd_device *rbd_dev) in rbd_dev_image_name() argument
4400 rbd_assert(!rbd_dev->spec->image_name); in rbd_dev_image_name()
4402 len = strlen(rbd_dev->spec->image_id); in rbd_dev_image_name()
4410 ceph_encode_string(&p, end, rbd_dev->spec->image_id, (u32)len); in rbd_dev_image_name()
4417 ret = rbd_obj_method_sync(rbd_dev, RBD_DIRECTORY, in rbd_dev_image_name()
4438 static u64 rbd_v1_snap_id_by_name(struct rbd_device *rbd_dev, const char *name) in rbd_v1_snap_id_by_name() argument
4440 struct ceph_snap_context *snapc = rbd_dev->header.snapc; in rbd_v1_snap_id_by_name()
4446 snap_name = rbd_dev->header.snap_names; in rbd_v1_snap_id_by_name()
4456 static u64 rbd_v2_snap_id_by_name(struct rbd_device *rbd_dev, const char *name) in rbd_v2_snap_id_by_name() argument
4458 struct ceph_snap_context *snapc = rbd_dev->header.snapc; in rbd_v2_snap_id_by_name()
4467 snap_name = rbd_dev_v2_snap_name(rbd_dev, snap_id); in rbd_v2_snap_id_by_name()
4485 static u64 rbd_snap_id_by_name(struct rbd_device *rbd_dev, const char *name) in rbd_snap_id_by_name() argument
4487 if (rbd_dev->image_format == 1) in rbd_snap_id_by_name()
4488 return rbd_v1_snap_id_by_name(rbd_dev, name); in rbd_snap_id_by_name()
4490 return rbd_v2_snap_id_by_name(rbd_dev, name); in rbd_snap_id_by_name()
4496 static int rbd_spec_fill_snap_id(struct rbd_device *rbd_dev) in rbd_spec_fill_snap_id() argument
4498 struct rbd_spec *spec = rbd_dev->spec; in rbd_spec_fill_snap_id()
4507 snap_id = rbd_snap_id_by_name(rbd_dev, spec->snap_name); in rbd_spec_fill_snap_id()
4525 static int rbd_spec_fill_names(struct rbd_device *rbd_dev) in rbd_spec_fill_names() argument
4527 struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; in rbd_spec_fill_names()
4528 struct rbd_spec *spec = rbd_dev->spec; in rbd_spec_fill_names()
4542 rbd_warn(rbd_dev, "no pool with id %llu", spec->pool_id); in rbd_spec_fill_names()
4551 image_name = rbd_dev_image_name(rbd_dev); in rbd_spec_fill_names()
4553 rbd_warn(rbd_dev, "unable to get image name"); in rbd_spec_fill_names()
4557 snap_name = rbd_snap_name(rbd_dev, spec->snap_id); in rbd_spec_fill_names()
4575 static int rbd_dev_v2_snap_context(struct rbd_device *rbd_dev) in rbd_dev_v2_snap_context() argument
4599 ret = rbd_obj_method_sync(rbd_dev, rbd_dev->header_name, in rbd_dev_v2_snap_context()
4636 ceph_put_snap_context(rbd_dev->header.snapc); in rbd_dev_v2_snap_context()
4637 rbd_dev->header.snapc = snapc; in rbd_dev_v2_snap_context()
4647 static const char *rbd_dev_v2_snap_name(struct rbd_device *rbd_dev, in rbd_dev_v2_snap_name() argument
4664 ret = rbd_obj_method_sync(rbd_dev, rbd_dev->header_name, in rbd_dev_v2_snap_name()
4688 static int rbd_dev_v2_header_info(struct rbd_device *rbd_dev) in rbd_dev_v2_header_info() argument
4690 bool first_time = rbd_dev->header.object_prefix == NULL; in rbd_dev_v2_header_info()
4693 ret = rbd_dev_v2_image_size(rbd_dev); in rbd_dev_v2_header_info()
4698 ret = rbd_dev_v2_header_onetime(rbd_dev); in rbd_dev_v2_header_info()
4703 ret = rbd_dev_v2_snap_context(rbd_dev); in rbd_dev_v2_header_info()
4709 static int rbd_dev_header_info(struct rbd_device *rbd_dev) in rbd_dev_header_info() argument
4711 rbd_assert(rbd_image_format_valid(rbd_dev->image_format)); in rbd_dev_header_info()
4713 if (rbd_dev->image_format == 1) in rbd_dev_header_info()
4714 return rbd_dev_v1_header_info(rbd_dev); in rbd_dev_header_info()
4716 return rbd_dev_v2_header_info(rbd_dev); in rbd_dev_header_info()
4719 static int rbd_bus_add_dev(struct rbd_device *rbd_dev) in rbd_bus_add_dev() argument
4724 dev = &rbd_dev->dev; in rbd_bus_add_dev()
4729 dev_set_name(dev, "%d", rbd_dev->dev_id); in rbd_bus_add_dev()
4735 static void rbd_bus_del_dev(struct rbd_device *rbd_dev) in rbd_bus_del_dev() argument
4737 device_unregister(&rbd_dev->dev); in rbd_bus_del_dev()
4744 static int rbd_dev_id_get(struct rbd_device *rbd_dev) in rbd_dev_id_get() argument
4754 rbd_dev->dev_id = new_dev_id; in rbd_dev_id_get()
4757 list_add_tail(&rbd_dev->node, &rbd_dev_list); in rbd_dev_id_get()
4760 dout("rbd_dev %p given dev id %d\n", rbd_dev, rbd_dev->dev_id); in rbd_dev_id_get()
4769 static void rbd_dev_id_put(struct rbd_device *rbd_dev) in rbd_dev_id_put() argument
4772 list_del_init(&rbd_dev->node); in rbd_dev_id_put()
4775 ida_simple_remove(&rbd_dev_id_ida, rbd_dev->dev_id); in rbd_dev_id_put()
4777 dout("rbd_dev %p released dev id %d\n", rbd_dev, rbd_dev->dev_id); in rbd_dev_id_put()
5025 static int rbd_dev_image_id(struct rbd_device *rbd_dev) in rbd_dev_image_id() argument
5039 if (rbd_dev->spec->image_id) { in rbd_dev_image_id()
5040 rbd_dev->image_format = *rbd_dev->spec->image_id ? 2 : 1; in rbd_dev_image_id()
5049 size = sizeof (RBD_ID_PREFIX) + strlen(rbd_dev->spec->image_name); in rbd_dev_image_id()
5053 sprintf(object_name, "%s%s", RBD_ID_PREFIX, rbd_dev->spec->image_name); in rbd_dev_image_id()
5067 ret = rbd_obj_method_sync(rbd_dev, object_name, in rbd_dev_image_id()
5075 rbd_dev->image_format = 1; in rbd_dev_image_id()
5083 rbd_dev->image_format = 2; in rbd_dev_image_id()
5087 rbd_dev->spec->image_id = image_id; in rbd_dev_image_id()
5101 static void rbd_dev_unprobe(struct rbd_device *rbd_dev) in rbd_dev_unprobe() argument
5105 rbd_dev_parent_put(rbd_dev); in rbd_dev_unprobe()
5109 header = &rbd_dev->header; in rbd_dev_unprobe()
5117 static int rbd_dev_v2_header_onetime(struct rbd_device *rbd_dev) in rbd_dev_v2_header_onetime() argument
5121 ret = rbd_dev_v2_object_prefix(rbd_dev); in rbd_dev_v2_header_onetime()
5129 ret = rbd_dev_v2_features(rbd_dev); in rbd_dev_v2_header_onetime()
5135 if (rbd_dev->header.features & RBD_FEATURE_STRIPINGV2) { in rbd_dev_v2_header_onetime()
5136 ret = rbd_dev_v2_striping_info(rbd_dev); in rbd_dev_v2_header_onetime()
5144 rbd_dev->header.features = 0; in rbd_dev_v2_header_onetime()
5145 kfree(rbd_dev->header.object_prefix); in rbd_dev_v2_header_onetime()
5146 rbd_dev->header.object_prefix = NULL; in rbd_dev_v2_header_onetime()
5156 static int rbd_dev_probe_parent(struct rbd_device *rbd_dev, int depth) in rbd_dev_probe_parent() argument
5161 if (!rbd_dev->parent_spec) in rbd_dev_probe_parent()
5170 parent = rbd_dev_create(rbd_dev->rbd_client, rbd_dev->parent_spec); in rbd_dev_probe_parent()
5180 __rbd_get_client(rbd_dev->rbd_client); in rbd_dev_probe_parent()
5181 rbd_spec_get(rbd_dev->parent_spec); in rbd_dev_probe_parent()
5187 rbd_dev->parent = parent; in rbd_dev_probe_parent()
5188 atomic_set(&rbd_dev->parent_ref, 1); in rbd_dev_probe_parent()
5192 rbd_dev_unparent(rbd_dev); in rbd_dev_probe_parent()
5198 static int rbd_dev_device_setup(struct rbd_device *rbd_dev) in rbd_dev_device_setup() argument
5204 ret = rbd_dev_id_get(rbd_dev); in rbd_dev_device_setup()
5210 sprintf(rbd_dev->name, "%s%d", RBD_DRV_NAME, rbd_dev->dev_id); in rbd_dev_device_setup()
5215 ret = register_blkdev(0, rbd_dev->name); in rbd_dev_device_setup()
5219 rbd_dev->major = ret; in rbd_dev_device_setup()
5220 rbd_dev->minor = 0; in rbd_dev_device_setup()
5222 rbd_dev->major = rbd_major; in rbd_dev_device_setup()
5223 rbd_dev->minor = rbd_dev_id_to_minor(rbd_dev->dev_id); in rbd_dev_device_setup()
5228 ret = rbd_init_disk(rbd_dev); in rbd_dev_device_setup()
5232 ret = rbd_dev_mapping_set(rbd_dev); in rbd_dev_device_setup()
5236 set_capacity(rbd_dev->disk, rbd_dev->mapping.size / SECTOR_SIZE); in rbd_dev_device_setup()
5237 set_disk_ro(rbd_dev->disk, rbd_dev->mapping.read_only); in rbd_dev_device_setup()
5239 ret = rbd_bus_add_dev(rbd_dev); in rbd_dev_device_setup()
5245 set_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags); in rbd_dev_device_setup()
5246 add_disk(rbd_dev->disk); in rbd_dev_device_setup()
5248 pr_info("%s: added with size 0x%llx\n", rbd_dev->disk->disk_name, in rbd_dev_device_setup()
5249 (unsigned long long) rbd_dev->mapping.size); in rbd_dev_device_setup()
5254 rbd_dev_mapping_clear(rbd_dev); in rbd_dev_device_setup()
5256 rbd_free_disk(rbd_dev); in rbd_dev_device_setup()
5259 unregister_blkdev(rbd_dev->major, rbd_dev->name); in rbd_dev_device_setup()
5261 rbd_dev_id_put(rbd_dev); in rbd_dev_device_setup()
5262 rbd_dev_mapping_clear(rbd_dev); in rbd_dev_device_setup()
5267 static int rbd_dev_header_name(struct rbd_device *rbd_dev) in rbd_dev_header_name() argument
5269 struct rbd_spec *spec = rbd_dev->spec; in rbd_dev_header_name()
5274 rbd_assert(rbd_image_format_valid(rbd_dev->image_format)); in rbd_dev_header_name()
5276 if (rbd_dev->image_format == 1) in rbd_dev_header_name()
5281 rbd_dev->header_name = kmalloc(size, GFP_KERNEL); in rbd_dev_header_name()
5282 if (!rbd_dev->header_name) in rbd_dev_header_name()
5285 if (rbd_dev->image_format == 1) in rbd_dev_header_name()
5286 sprintf(rbd_dev->header_name, "%s%s", in rbd_dev_header_name()
5289 sprintf(rbd_dev->header_name, "%s%s", in rbd_dev_header_name()
5294 static void rbd_dev_image_release(struct rbd_device *rbd_dev) in rbd_dev_image_release() argument
5296 rbd_dev_unprobe(rbd_dev); in rbd_dev_image_release()
5297 kfree(rbd_dev->header_name); in rbd_dev_image_release()
5298 rbd_dev->header_name = NULL; in rbd_dev_image_release()
5299 rbd_dev->image_format = 0; in rbd_dev_image_release()
5300 kfree(rbd_dev->spec->image_id); in rbd_dev_image_release()
5301 rbd_dev->spec->image_id = NULL; in rbd_dev_image_release()
5303 rbd_dev_destroy(rbd_dev); in rbd_dev_image_release()
5312 static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth) in rbd_dev_image_probe() argument
5322 ret = rbd_dev_image_id(rbd_dev); in rbd_dev_image_probe()
5326 ret = rbd_dev_header_name(rbd_dev); in rbd_dev_image_probe()
5331 ret = rbd_dev_header_watch_sync(rbd_dev); in rbd_dev_image_probe()
5335 rbd_dev->spec->pool_name, in rbd_dev_image_probe()
5336 rbd_dev->spec->image_name); in rbd_dev_image_probe()
5341 ret = rbd_dev_header_info(rbd_dev); in rbd_dev_image_probe()
5352 ret = rbd_spec_fill_snap_id(rbd_dev); in rbd_dev_image_probe()
5354 ret = rbd_spec_fill_names(rbd_dev); in rbd_dev_image_probe()
5358 rbd_dev->spec->pool_name, in rbd_dev_image_probe()
5359 rbd_dev->spec->image_name, in rbd_dev_image_probe()
5360 rbd_dev->spec->snap_name); in rbd_dev_image_probe()
5364 if (rbd_dev->header.features & RBD_FEATURE_LAYERING) { in rbd_dev_image_probe()
5365 ret = rbd_dev_v2_parent_info(rbd_dev); in rbd_dev_image_probe()
5373 if (!depth && rbd_dev->parent_spec) in rbd_dev_image_probe()
5374 rbd_warn(rbd_dev, in rbd_dev_image_probe()
5378 ret = rbd_dev_probe_parent(rbd_dev, depth); in rbd_dev_image_probe()
5383 rbd_dev->image_format, rbd_dev->header_name); in rbd_dev_image_probe()
5387 rbd_dev_unprobe(rbd_dev); in rbd_dev_image_probe()
5390 rbd_dev_header_unwatch_sync(rbd_dev); in rbd_dev_image_probe()
5392 kfree(rbd_dev->header_name); in rbd_dev_image_probe()
5393 rbd_dev->header_name = NULL; in rbd_dev_image_probe()
5395 rbd_dev->image_format = 0; in rbd_dev_image_probe()
5396 kfree(rbd_dev->spec->image_id); in rbd_dev_image_probe()
5397 rbd_dev->spec->image_id = NULL; in rbd_dev_image_probe()
5405 struct rbd_device *rbd_dev = NULL; in do_rbd_add() local
5448 rbd_dev = rbd_dev_create(rbdc, spec); in do_rbd_add()
5449 if (!rbd_dev) in do_rbd_add()
5454 rc = rbd_dev_image_probe(rbd_dev, 0); in do_rbd_add()
5460 if (rbd_dev->spec->snap_id != CEPH_NOSNAP) in do_rbd_add()
5462 rbd_dev->mapping.read_only = read_only; in do_rbd_add()
5464 rc = rbd_dev_device_setup(rbd_dev); in do_rbd_add()
5471 rbd_dev_header_unwatch_sync(rbd_dev); in do_rbd_add()
5472 rbd_dev_image_release(rbd_dev); in do_rbd_add()
5479 rbd_dev_destroy(rbd_dev); in do_rbd_add()
5511 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_dev_device_release() local
5513 rbd_free_disk(rbd_dev); in rbd_dev_device_release()
5514 clear_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags); in rbd_dev_device_release()
5515 rbd_dev_mapping_clear(rbd_dev); in rbd_dev_device_release()
5517 unregister_blkdev(rbd_dev->major, rbd_dev->name); in rbd_dev_device_release()
5518 rbd_dev_id_put(rbd_dev); in rbd_dev_device_release()
5519 rbd_dev_mapping_clear(rbd_dev); in rbd_dev_device_release()
5522 static void rbd_dev_remove_parent(struct rbd_device *rbd_dev) in rbd_dev_remove_parent() argument
5524 while (rbd_dev->parent) { in rbd_dev_remove_parent()
5525 struct rbd_device *first = rbd_dev; in rbd_dev_remove_parent()
5552 struct rbd_device *rbd_dev = NULL; in do_rbd_remove() local
5571 rbd_dev = list_entry(tmp, struct rbd_device, node); in do_rbd_remove()
5572 if (rbd_dev->dev_id == dev_id) { in do_rbd_remove()
5578 spin_lock_irq(&rbd_dev->lock); in do_rbd_remove()
5579 if (rbd_dev->open_count) in do_rbd_remove()
5583 &rbd_dev->flags); in do_rbd_remove()
5584 spin_unlock_irq(&rbd_dev->lock); in do_rbd_remove()
5590 rbd_dev_header_unwatch_sync(rbd_dev); in do_rbd_remove()
5596 ceph_osdc_flush_notifies(&rbd_dev->rbd_client->client->osdc); in do_rbd_remove()
5604 rbd_bus_del_dev(rbd_dev); in do_rbd_remove()
5605 rbd_dev_image_release(rbd_dev); in do_rbd_remove()