Lines Matching refs:rbd_dev
292 struct rbd_device *rbd_dev; member
429 static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth);
487 void rbd_warn(struct rbd_device *rbd_dev, const char *fmt, ...) in rbd_warn() argument
496 if (!rbd_dev) in rbd_warn()
498 else if (rbd_dev->disk) in rbd_warn()
500 RBD_DRV_NAME, rbd_dev->disk->disk_name, &vaf); in rbd_warn()
501 else if (rbd_dev->spec && rbd_dev->spec->image_name) in rbd_warn()
503 RBD_DRV_NAME, rbd_dev->spec->image_name, &vaf); in rbd_warn()
504 else if (rbd_dev->spec && rbd_dev->spec->image_id) in rbd_warn()
506 RBD_DRV_NAME, rbd_dev->spec->image_id, &vaf); in rbd_warn()
509 RBD_DRV_NAME, rbd_dev, &vaf); in rbd_warn()
529 static void rbd_dev_remove_parent(struct rbd_device *rbd_dev);
531 static int rbd_dev_refresh(struct rbd_device *rbd_dev);
532 static int rbd_dev_v2_header_onetime(struct rbd_device *rbd_dev);
533 static int rbd_dev_header_info(struct rbd_device *rbd_dev);
534 static int rbd_dev_v2_parent_info(struct rbd_device *rbd_dev);
535 static const char *rbd_dev_v2_snap_name(struct rbd_device *rbd_dev,
537 static int _rbd_dev_v2_snap_size(struct rbd_device *rbd_dev, u64 snap_id,
539 static int _rbd_dev_v2_snap_features(struct rbd_device *rbd_dev, u64 snap_id,
541 static u64 rbd_snap_id_by_name(struct rbd_device *rbd_dev, const char *name);
545 struct rbd_device *rbd_dev = bdev->bd_disk->private_data; in rbd_open() local
548 if ((mode & FMODE_WRITE) && rbd_dev->mapping.read_only) in rbd_open()
551 spin_lock_irq(&rbd_dev->lock); in rbd_open()
552 if (test_bit(RBD_DEV_FLAG_REMOVING, &rbd_dev->flags)) in rbd_open()
555 rbd_dev->open_count++; in rbd_open()
556 spin_unlock_irq(&rbd_dev->lock); in rbd_open()
560 (void) get_device(&rbd_dev->dev); in rbd_open()
567 struct rbd_device *rbd_dev = disk->private_data; in rbd_release() local
570 spin_lock_irq(&rbd_dev->lock); in rbd_release()
571 open_count_before = rbd_dev->open_count--; in rbd_release()
572 spin_unlock_irq(&rbd_dev->lock); in rbd_release()
575 put_device(&rbd_dev->dev); in rbd_release()
578 static int rbd_ioctl_set_ro(struct rbd_device *rbd_dev, unsigned long arg) in rbd_ioctl_set_ro() argument
591 if (rbd_dev->spec->snap_id != CEPH_NOSNAP && !ro) in rbd_ioctl_set_ro()
594 spin_lock_irq(&rbd_dev->lock); in rbd_ioctl_set_ro()
596 if (rbd_dev->open_count > 1) { in rbd_ioctl_set_ro()
601 if (rbd_dev->mapping.read_only != ro) { in rbd_ioctl_set_ro()
602 rbd_dev->mapping.read_only = ro; in rbd_ioctl_set_ro()
607 spin_unlock_irq(&rbd_dev->lock); in rbd_ioctl_set_ro()
610 set_disk_ro(rbd_dev->disk, ro ? 1 : 0); in rbd_ioctl_set_ro()
618 struct rbd_device *rbd_dev = bdev->bd_disk->private_data; in rbd_ioctl() local
623 ret = rbd_ioctl_set_ro(rbd_dev, arg); in rbd_ioctl()
913 static int rbd_header_from_disk(struct rbd_device *rbd_dev, in rbd_header_from_disk() argument
916 struct rbd_image_header *header = &rbd_dev->header; in rbd_header_from_disk()
1020 static const char *_rbd_dev_v1_snap_name(struct rbd_device *rbd_dev, u32 which) in _rbd_dev_v1_snap_name() argument
1024 rbd_assert(which < rbd_dev->header.snapc->num_snaps); in _rbd_dev_v1_snap_name()
1028 snap_name = rbd_dev->header.snap_names; in _rbd_dev_v1_snap_name()
1059 static u32 rbd_dev_snap_index(struct rbd_device *rbd_dev, u64 snap_id) in rbd_dev_snap_index() argument
1061 struct ceph_snap_context *snapc = rbd_dev->header.snapc; in rbd_dev_snap_index()
1070 static const char *rbd_dev_v1_snap_name(struct rbd_device *rbd_dev, in rbd_dev_v1_snap_name() argument
1076 which = rbd_dev_snap_index(rbd_dev, snap_id); in rbd_dev_v1_snap_name()
1080 snap_name = _rbd_dev_v1_snap_name(rbd_dev, which); in rbd_dev_v1_snap_name()
1084 static const char *rbd_snap_name(struct rbd_device *rbd_dev, u64 snap_id) in rbd_snap_name() argument
1089 rbd_assert(rbd_image_format_valid(rbd_dev->image_format)); in rbd_snap_name()
1090 if (rbd_dev->image_format == 1) in rbd_snap_name()
1091 return rbd_dev_v1_snap_name(rbd_dev, snap_id); in rbd_snap_name()
1093 return rbd_dev_v2_snap_name(rbd_dev, snap_id); in rbd_snap_name()
1096 static int rbd_snap_size(struct rbd_device *rbd_dev, u64 snap_id, in rbd_snap_size() argument
1099 rbd_assert(rbd_image_format_valid(rbd_dev->image_format)); in rbd_snap_size()
1101 *snap_size = rbd_dev->header.image_size; in rbd_snap_size()
1102 } else if (rbd_dev->image_format == 1) { in rbd_snap_size()
1105 which = rbd_dev_snap_index(rbd_dev, snap_id); in rbd_snap_size()
1109 *snap_size = rbd_dev->header.snap_sizes[which]; in rbd_snap_size()
1114 ret = _rbd_dev_v2_snap_size(rbd_dev, snap_id, NULL, &size); in rbd_snap_size()
1123 static int rbd_snap_features(struct rbd_device *rbd_dev, u64 snap_id, in rbd_snap_features() argument
1126 rbd_assert(rbd_image_format_valid(rbd_dev->image_format)); in rbd_snap_features()
1128 *snap_features = rbd_dev->header.features; in rbd_snap_features()
1129 } else if (rbd_dev->image_format == 1) { in rbd_snap_features()
1135 ret = _rbd_dev_v2_snap_features(rbd_dev, snap_id, &features); in rbd_snap_features()
1144 static int rbd_dev_mapping_set(struct rbd_device *rbd_dev) in rbd_dev_mapping_set() argument
1146 u64 snap_id = rbd_dev->spec->snap_id; in rbd_dev_mapping_set()
1151 ret = rbd_snap_size(rbd_dev, snap_id, &size); in rbd_dev_mapping_set()
1154 ret = rbd_snap_features(rbd_dev, snap_id, &features); in rbd_dev_mapping_set()
1158 rbd_dev->mapping.size = size; in rbd_dev_mapping_set()
1159 rbd_dev->mapping.features = features; in rbd_dev_mapping_set()
1164 static void rbd_dev_mapping_clear(struct rbd_device *rbd_dev) in rbd_dev_mapping_clear() argument
1166 rbd_dev->mapping.size = 0; in rbd_dev_mapping_clear()
1167 rbd_dev->mapping.features = 0; in rbd_dev_mapping_clear()
1177 static const char *rbd_segment_name(struct rbd_device *rbd_dev, u64 offset) in rbd_segment_name() argument
1187 segment = offset >> rbd_dev->header.obj_order; in rbd_segment_name()
1189 if (rbd_dev->image_format == 2) in rbd_segment_name()
1192 rbd_dev->header.object_prefix, segment); in rbd_segment_name()
1203 static u64 rbd_segment_offset(struct rbd_device *rbd_dev, u64 offset) in rbd_segment_offset() argument
1205 u64 segment_size = (u64) 1 << rbd_dev->header.obj_order; in rbd_segment_offset()
1210 static u64 rbd_segment_length(struct rbd_device *rbd_dev, in rbd_segment_length() argument
1213 u64 segment_size = (u64) 1 << rbd_dev->header.obj_order; in rbd_segment_length()
1399 struct rbd_device *rbd_dev; in obj_request_img_data_set() local
1401 rbd_dev = obj_request->img_request->rbd_dev; in obj_request_img_data_set()
1402 rbd_warn(rbd_dev, "obj_request %p already marked img_data", in obj_request_img_data_set()
1416 struct rbd_device *rbd_dev = NULL; in obj_request_done_set() local
1419 rbd_dev = obj_request->img_request->rbd_dev; in obj_request_done_set()
1420 rbd_warn(rbd_dev, "obj_request %p already marked done", in obj_request_done_set()
1464 struct rbd_device *rbd_dev = obj_request->img_request->rbd_dev; in obj_request_overlaps_parent() local
1467 round_up(rbd_dev->parent_overlap, rbd_obj_bytes(&rbd_dev->header)); in obj_request_overlaps_parent()
1764 struct rbd_device *rbd_dev = NULL; in rbd_osd_read_callback() local
1770 rbd_dev = img_request->rbd_dev; in rbd_osd_read_callback()
1777 obj_request->img_offset < rbd_dev->parent_overlap) in rbd_osd_read_callback()
1932 struct rbd_device *rbd_dev, in rbd_osd_req_create() argument
1956 osdc = &rbd_dev->rbd_client->client->osdc; in rbd_osd_req_create()
1970 osd_req->r_base_oloc.pool = ceph_file_layout_pg_pool(rbd_dev->layout); in rbd_osd_req_create()
1987 struct rbd_device *rbd_dev; in rbd_osd_req_create_copyup() local
2004 rbd_dev = img_request->rbd_dev; in rbd_osd_req_create_copyup()
2005 osdc = &rbd_dev->rbd_client->client->osdc; in rbd_osd_req_create_copyup()
2015 osd_req->r_base_oloc.pool = ceph_file_layout_pg_pool(rbd_dev->layout); in rbd_osd_req_create_copyup()
2103 static void rbd_dev_unparent(struct rbd_device *rbd_dev) in rbd_dev_unparent() argument
2105 rbd_dev_remove_parent(rbd_dev); in rbd_dev_unparent()
2106 rbd_spec_put(rbd_dev->parent_spec); in rbd_dev_unparent()
2107 rbd_dev->parent_spec = NULL; in rbd_dev_unparent()
2108 rbd_dev->parent_overlap = 0; in rbd_dev_unparent()
2117 static void rbd_dev_parent_put(struct rbd_device *rbd_dev) in rbd_dev_parent_put() argument
2121 if (!rbd_dev->parent_spec) in rbd_dev_parent_put()
2124 counter = atomic_dec_return_safe(&rbd_dev->parent_ref); in rbd_dev_parent_put()
2131 rbd_dev_unparent(rbd_dev); in rbd_dev_parent_put()
2133 rbd_warn(rbd_dev, "parent reference underflow"); in rbd_dev_parent_put()
2144 static bool rbd_dev_parent_get(struct rbd_device *rbd_dev) in rbd_dev_parent_get() argument
2148 if (!rbd_dev->parent_spec) in rbd_dev_parent_get()
2151 down_read(&rbd_dev->header_rwsem); in rbd_dev_parent_get()
2152 if (rbd_dev->parent_overlap) in rbd_dev_parent_get()
2153 counter = atomic_inc_return_safe(&rbd_dev->parent_ref); in rbd_dev_parent_get()
2154 up_read(&rbd_dev->header_rwsem); in rbd_dev_parent_get()
2157 rbd_warn(rbd_dev, "parent reference overflow"); in rbd_dev_parent_get()
2168 struct rbd_device *rbd_dev, in rbd_img_request_create() argument
2180 img_request->rbd_dev = rbd_dev; in rbd_img_request_create()
2191 img_request->snap_id = rbd_dev->spec->snap_id; in rbd_img_request_create()
2193 if (rbd_dev_parent_get(rbd_dev)) in rbd_img_request_create()
2203 dout("%s: rbd_dev %p %s %llu/%llu -> img %p\n", __func__, rbd_dev, in rbd_img_request_create()
2225 rbd_dev_parent_put(img_request->rbd_dev); in rbd_img_request_destroy()
2240 struct rbd_device *rbd_dev; in rbd_parent_request_create() local
2243 rbd_dev = obj_request->img_request->rbd_dev; in rbd_parent_request_create()
2245 parent_request = rbd_img_request_create(rbd_dev->parent, img_offset, in rbd_parent_request_create()
2286 struct rbd_device *rbd_dev = img_request->rbd_dev; in rbd_img_obj_end_request() local
2296 rbd_warn(rbd_dev, "%s %llx at %llx (%llx)", in rbd_img_obj_end_request()
2299 rbd_warn(rbd_dev, " result %d xferred %x", in rbd_img_obj_end_request()
2381 struct rbd_device *rbd_dev = img_request->rbd_dev; in rbd_img_obj_request_fill() local
2382 u64 object_size = rbd_obj_bytes(&rbd_dev->header); in rbd_img_obj_request_fill()
2396 down_read(&rbd_dev->header_rwsem); in rbd_img_obj_request_fill()
2397 img_end = rbd_dev->header.image_size; in rbd_img_obj_request_fill()
2398 up_read(&rbd_dev->header_rwsem); in rbd_img_obj_request_fill()
2450 struct rbd_device *rbd_dev = img_request->rbd_dev; in rbd_img_request_fill() local
2482 object_name = rbd_segment_name(rbd_dev, img_offset); in rbd_img_request_fill()
2485 offset = rbd_segment_offset(rbd_dev, img_offset); in rbd_img_request_fill()
2486 length = rbd_segment_length(rbd_dev, img_offset, resid); in rbd_img_request_fill()
2523 osd_req = rbd_osd_req_create(rbd_dev, op_type, in rbd_img_request_fill()
2554 struct rbd_device *rbd_dev; in rbd_osd_copyup_callback() local
2566 rbd_dev = img_request->rbd_dev; in rbd_osd_copyup_callback()
2567 rbd_assert(rbd_dev); in rbd_osd_copyup_callback()
2595 struct rbd_device *rbd_dev; in rbd_img_obj_parent_read_full_callback() local
2622 rbd_dev = orig_request->img_request->rbd_dev; in rbd_img_obj_parent_read_full_callback()
2623 rbd_assert(rbd_dev); in rbd_img_obj_parent_read_full_callback()
2630 if (!rbd_dev->parent_overlap) { in rbd_img_obj_parent_read_full_callback()
2634 osdc = &rbd_dev->rbd_client->client->osdc; in rbd_img_obj_parent_read_full_callback()
2671 osdc = &rbd_dev->rbd_client->client->osdc; in rbd_img_obj_parent_read_full_callback()
2702 struct rbd_device *rbd_dev; in rbd_img_obj_parent_read_full() local
2714 rbd_dev = img_request->rbd_dev; in rbd_img_obj_parent_read_full()
2715 rbd_assert(rbd_dev->parent != NULL); in rbd_img_obj_parent_read_full()
2722 length = (u64)1 << rbd_dev->header.obj_order; in rbd_img_obj_parent_read_full()
2729 if (img_offset + length > rbd_dev->parent_overlap) { in rbd_img_obj_parent_read_full()
2730 rbd_assert(img_offset < rbd_dev->parent_overlap); in rbd_img_obj_parent_read_full()
2731 length = rbd_dev->parent_overlap - img_offset; in rbd_img_obj_parent_read_full()
2782 struct rbd_device *rbd_dev; in rbd_img_obj_exists_callback() local
2811 rbd_dev = orig_request->img_request->rbd_dev; in rbd_img_obj_exists_callback()
2812 if (!rbd_dev->parent_overlap) { in rbd_img_obj_exists_callback()
2815 osdc = &rbd_dev->rbd_client->client->osdc; in rbd_img_obj_exists_callback()
2849 struct rbd_device *rbd_dev; in rbd_img_obj_exists_submit() local
2882 rbd_dev = obj_request->img_request->rbd_dev; in rbd_img_obj_exists_submit()
2883 stat_request->osd_req = rbd_osd_req_create(rbd_dev, OBJ_OP_READ, 1, in rbd_img_obj_exists_submit()
2894 osdc = &rbd_dev->rbd_client->client->osdc; in rbd_img_obj_exists_submit()
2906 struct rbd_device *rbd_dev; in img_obj_request_simple() local
2912 rbd_dev = img_request->rbd_dev; in img_obj_request_simple()
2935 obj_request->length == rbd_obj_bytes(&rbd_dev->header)) in img_obj_request_simple()
2952 struct rbd_device *rbd_dev; in rbd_img_obj_request_submit() local
2955 rbd_dev = obj_request->img_request->rbd_dev; in rbd_img_obj_request_submit()
2956 osdc = &rbd_dev->rbd_client->client->osdc; in rbd_img_obj_request_submit()
2995 struct rbd_device *rbd_dev; in rbd_img_parent_read_callback() local
3016 rbd_dev = obj_request->img_request->rbd_dev; in rbd_img_parent_read_callback()
3017 if (!rbd_dev->parent_overlap) { in rbd_img_parent_read_callback()
3020 osdc = &rbd_dev->rbd_client->client->osdc; in rbd_img_parent_read_callback()
3039 if (obj_end > rbd_dev->parent_overlap) { in rbd_img_parent_read_callback()
3042 if (obj_request->img_offset < rbd_dev->parent_overlap) in rbd_img_parent_read_callback()
3043 xferred = rbd_dev->parent_overlap - in rbd_img_parent_read_callback()
3096 static int rbd_obj_notify_ack_sync(struct rbd_device *rbd_dev, u64 notify_id) in rbd_obj_notify_ack_sync() argument
3099 struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; in rbd_obj_notify_ack_sync()
3102 obj_request = rbd_obj_request_create(rbd_dev->header_name, 0, 0, in rbd_obj_notify_ack_sync()
3108 obj_request->osd_req = rbd_osd_req_create(rbd_dev, OBJ_OP_READ, 1, in rbd_obj_notify_ack_sync()
3129 struct rbd_device *rbd_dev = (struct rbd_device *)data; in rbd_watch_cb() local
3132 if (!rbd_dev) in rbd_watch_cb()
3136 rbd_dev->header_name, (unsigned long long)notify_id, in rbd_watch_cb()
3145 ret = rbd_dev_refresh(rbd_dev); in rbd_watch_cb()
3147 rbd_warn(rbd_dev, "refresh failed: %d", ret); in rbd_watch_cb()
3149 ret = rbd_obj_notify_ack_sync(rbd_dev, notify_id); in rbd_watch_cb()
3151 rbd_warn(rbd_dev, "notify_ack ret %d", ret); in rbd_watch_cb()
3159 struct rbd_device *rbd_dev, in rbd_obj_watch_request_helper() argument
3162 struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; in rbd_obj_watch_request_helper()
3167 obj_request = rbd_obj_request_create(rbd_dev->header_name, 0, 0, in rbd_obj_watch_request_helper()
3172 obj_request->osd_req = rbd_osd_req_create(rbd_dev, OBJ_OP_WRITE, 1, in rbd_obj_watch_request_helper()
3180 rbd_dev->watch_event->cookie, 0, watch); in rbd_obj_watch_request_helper()
3211 static int rbd_dev_header_watch_sync(struct rbd_device *rbd_dev) in rbd_dev_header_watch_sync() argument
3213 struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; in rbd_dev_header_watch_sync()
3217 rbd_assert(!rbd_dev->watch_event); in rbd_dev_header_watch_sync()
3218 rbd_assert(!rbd_dev->watch_request); in rbd_dev_header_watch_sync()
3220 ret = ceph_osdc_create_event(osdc, rbd_watch_cb, rbd_dev, in rbd_dev_header_watch_sync()
3221 &rbd_dev->watch_event); in rbd_dev_header_watch_sync()
3225 obj_request = rbd_obj_watch_request_helper(rbd_dev, true); in rbd_dev_header_watch_sync()
3227 ceph_osdc_cancel_event(rbd_dev->watch_event); in rbd_dev_header_watch_sync()
3228 rbd_dev->watch_event = NULL; in rbd_dev_header_watch_sync()
3240 rbd_dev->watch_request = obj_request; in rbd_dev_header_watch_sync()
3248 static void rbd_dev_header_unwatch_sync(struct rbd_device *rbd_dev) in rbd_dev_header_unwatch_sync() argument
3252 rbd_assert(rbd_dev->watch_event); in rbd_dev_header_unwatch_sync()
3253 rbd_assert(rbd_dev->watch_request); in rbd_dev_header_unwatch_sync()
3255 rbd_obj_request_end(rbd_dev->watch_request); in rbd_dev_header_unwatch_sync()
3256 rbd_obj_request_put(rbd_dev->watch_request); in rbd_dev_header_unwatch_sync()
3257 rbd_dev->watch_request = NULL; in rbd_dev_header_unwatch_sync()
3259 obj_request = rbd_obj_watch_request_helper(rbd_dev, false); in rbd_dev_header_unwatch_sync()
3263 rbd_warn(rbd_dev, "unable to tear down watch request (%ld)", in rbd_dev_header_unwatch_sync()
3266 ceph_osdc_cancel_event(rbd_dev->watch_event); in rbd_dev_header_unwatch_sync()
3267 rbd_dev->watch_event = NULL; in rbd_dev_header_unwatch_sync()
3274 static int rbd_obj_method_sync(struct rbd_device *rbd_dev, in rbd_obj_method_sync() argument
3283 struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; in rbd_obj_method_sync()
3310 obj_request->osd_req = rbd_osd_req_create(rbd_dev, OBJ_OP_READ, 1, in rbd_obj_method_sync()
3360 struct rbd_device *rbd_dev = rq->q->queuedata; in rbd_queue_workfn() local
3394 if (rbd_dev->mapping.read_only) { in rbd_queue_workfn()
3398 rbd_assert(rbd_dev->spec->snap_id == CEPH_NOSNAP); in rbd_queue_workfn()
3407 if (!test_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags)) { in rbd_queue_workfn()
3409 rbd_assert(rbd_dev->spec->snap_id != CEPH_NOSNAP); in rbd_queue_workfn()
3415 rbd_warn(rbd_dev, "bad request range (%llu~%llu)", offset, in rbd_queue_workfn()
3423 down_read(&rbd_dev->header_rwsem); in rbd_queue_workfn()
3424 mapping_size = rbd_dev->mapping.size; in rbd_queue_workfn()
3426 snapc = rbd_dev->header.snapc; in rbd_queue_workfn()
3429 up_read(&rbd_dev->header_rwsem); in rbd_queue_workfn()
3432 rbd_warn(rbd_dev, "beyond EOD (%llu~%llu > %llu)", offset, in rbd_queue_workfn()
3438 img_request = rbd_img_request_create(rbd_dev, offset, length, op_type, in rbd_queue_workfn()
3466 rbd_warn(rbd_dev, "%s %llx at %llx result %d", in rbd_queue_workfn()
3483 static void rbd_free_disk(struct rbd_device *rbd_dev) in rbd_free_disk() argument
3485 struct gendisk *disk = rbd_dev->disk; in rbd_free_disk()
3490 rbd_dev->disk = NULL; in rbd_free_disk()
3495 blk_mq_free_tag_set(&rbd_dev->tag_set); in rbd_free_disk()
3500 static int rbd_obj_read_sync(struct rbd_device *rbd_dev, in rbd_obj_read_sync() argument
3505 struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; in rbd_obj_read_sync()
3526 obj_request->osd_req = rbd_osd_req_create(rbd_dev, OBJ_OP_READ, 1, in rbd_obj_read_sync()
3570 static int rbd_dev_v1_header_info(struct rbd_device *rbd_dev) in rbd_dev_v1_header_info() argument
3597 ret = rbd_obj_read_sync(rbd_dev, rbd_dev->header_name, in rbd_dev_v1_header_info()
3603 rbd_warn(rbd_dev, "short header read (want %zd got %d)", in rbd_dev_v1_header_info()
3609 rbd_warn(rbd_dev, "invalid header"); in rbd_dev_v1_header_info()
3618 ret = rbd_header_from_disk(rbd_dev, ondisk); in rbd_dev_v1_header_info()
3629 static void rbd_exists_validate(struct rbd_device *rbd_dev) in rbd_exists_validate() argument
3633 if (!test_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags)) in rbd_exists_validate()
3636 snap_id = rbd_dev->spec->snap_id; in rbd_exists_validate()
3640 if (rbd_dev_snap_index(rbd_dev, snap_id) == BAD_SNAP_INDEX) in rbd_exists_validate()
3641 clear_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags); in rbd_exists_validate()
3644 static void rbd_dev_update_size(struct rbd_device *rbd_dev) in rbd_dev_update_size() argument
3654 spin_lock_irq(&rbd_dev->lock); in rbd_dev_update_size()
3655 removing = test_bit(RBD_DEV_FLAG_REMOVING, &rbd_dev->flags); in rbd_dev_update_size()
3656 spin_unlock_irq(&rbd_dev->lock); in rbd_dev_update_size()
3662 size = (sector_t)rbd_dev->mapping.size / SECTOR_SIZE; in rbd_dev_update_size()
3664 set_capacity(rbd_dev->disk, size); in rbd_dev_update_size()
3665 revalidate_disk(rbd_dev->disk); in rbd_dev_update_size()
3669 static int rbd_dev_refresh(struct rbd_device *rbd_dev) in rbd_dev_refresh() argument
3674 down_write(&rbd_dev->header_rwsem); in rbd_dev_refresh()
3675 mapping_size = rbd_dev->mapping.size; in rbd_dev_refresh()
3677 ret = rbd_dev_header_info(rbd_dev); in rbd_dev_refresh()
3685 if (rbd_dev->parent) { in rbd_dev_refresh()
3686 ret = rbd_dev_v2_parent_info(rbd_dev); in rbd_dev_refresh()
3691 if (rbd_dev->spec->snap_id == CEPH_NOSNAP) { in rbd_dev_refresh()
3692 rbd_dev->mapping.size = rbd_dev->header.image_size; in rbd_dev_refresh()
3695 rbd_exists_validate(rbd_dev); in rbd_dev_refresh()
3699 up_write(&rbd_dev->header_rwsem); in rbd_dev_refresh()
3700 if (!ret && mapping_size != rbd_dev->mapping.size) in rbd_dev_refresh()
3701 rbd_dev_update_size(rbd_dev); in rbd_dev_refresh()
3722 static int rbd_init_disk(struct rbd_device *rbd_dev) in rbd_init_disk() argument
3737 rbd_dev->dev_id); in rbd_init_disk()
3738 disk->major = rbd_dev->major; in rbd_init_disk()
3739 disk->first_minor = rbd_dev->minor; in rbd_init_disk()
3743 disk->private_data = rbd_dev; in rbd_init_disk()
3745 memset(&rbd_dev->tag_set, 0, sizeof(rbd_dev->tag_set)); in rbd_init_disk()
3746 rbd_dev->tag_set.ops = &rbd_mq_ops; in rbd_init_disk()
3747 rbd_dev->tag_set.queue_depth = rbd_dev->opts->queue_depth; in rbd_init_disk()
3748 rbd_dev->tag_set.numa_node = NUMA_NO_NODE; in rbd_init_disk()
3749 rbd_dev->tag_set.flags = BLK_MQ_F_SHOULD_MERGE | BLK_MQ_F_SG_MERGE; in rbd_init_disk()
3750 rbd_dev->tag_set.nr_hw_queues = 1; in rbd_init_disk()
3751 rbd_dev->tag_set.cmd_size = sizeof(struct work_struct); in rbd_init_disk()
3753 err = blk_mq_alloc_tag_set(&rbd_dev->tag_set); in rbd_init_disk()
3757 q = blk_mq_init_queue(&rbd_dev->tag_set); in rbd_init_disk()
3767 segment_size = rbd_obj_bytes(&rbd_dev->header); in rbd_init_disk()
3782 if (!ceph_test_opt(rbd_dev->rbd_client->client, NOCRC)) in rbd_init_disk()
3787 q->queuedata = rbd_dev; in rbd_init_disk()
3789 rbd_dev->disk = disk; in rbd_init_disk()
3793 blk_mq_free_tag_set(&rbd_dev->tag_set); in rbd_init_disk()
3811 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_size_show() local
3814 (unsigned long long)rbd_dev->mapping.size); in rbd_size_show()
3824 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_features_show() local
3827 (unsigned long long)rbd_dev->mapping.features); in rbd_features_show()
3833 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_major_show() local
3835 if (rbd_dev->major) in rbd_major_show()
3836 return sprintf(buf, "%d\n", rbd_dev->major); in rbd_major_show()
3844 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_minor_show() local
3846 return sprintf(buf, "%d\n", rbd_dev->minor); in rbd_minor_show()
3852 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_client_id_show() local
3855 ceph_client_id(rbd_dev->rbd_client->client)); in rbd_client_id_show()
3861 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_pool_show() local
3863 return sprintf(buf, "%s\n", rbd_dev->spec->pool_name); in rbd_pool_show()
3869 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_pool_id_show() local
3872 (unsigned long long) rbd_dev->spec->pool_id); in rbd_pool_id_show()
3878 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_name_show() local
3880 if (rbd_dev->spec->image_name) in rbd_name_show()
3881 return sprintf(buf, "%s\n", rbd_dev->spec->image_name); in rbd_name_show()
3889 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_image_id_show() local
3891 return sprintf(buf, "%s\n", rbd_dev->spec->image_id); in rbd_image_id_show()
3902 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_snap_show() local
3904 return sprintf(buf, "%s\n", rbd_dev->spec->snap_name); in rbd_snap_show()
3916 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_parent_show() local
3919 if (!rbd_dev->parent) in rbd_parent_show()
3922 for ( ; rbd_dev->parent; rbd_dev = rbd_dev->parent) { in rbd_parent_show()
3923 struct rbd_spec *spec = rbd_dev->parent_spec; in rbd_parent_show()
3934 rbd_dev->parent_overlap); in rbd_parent_show()
3945 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_image_refresh() local
3948 ret = rbd_dev_refresh(rbd_dev); in rbd_image_refresh()
4043 struct rbd_device *rbd_dev = dev_to_rbd_dev(dev); in rbd_dev_release() local
4044 bool need_put = !!rbd_dev->opts; in rbd_dev_release()
4046 rbd_put_client(rbd_dev->rbd_client); in rbd_dev_release()
4047 rbd_spec_put(rbd_dev->spec); in rbd_dev_release()
4048 kfree(rbd_dev->opts); in rbd_dev_release()
4049 kfree(rbd_dev); in rbd_dev_release()
4064 struct rbd_device *rbd_dev; in rbd_dev_create() local
4066 rbd_dev = kzalloc(sizeof (*rbd_dev), GFP_KERNEL); in rbd_dev_create()
4067 if (!rbd_dev) in rbd_dev_create()
4070 spin_lock_init(&rbd_dev->lock); in rbd_dev_create()
4071 rbd_dev->flags = 0; in rbd_dev_create()
4072 atomic_set(&rbd_dev->parent_ref, 0); in rbd_dev_create()
4073 INIT_LIST_HEAD(&rbd_dev->node); in rbd_dev_create()
4074 init_rwsem(&rbd_dev->header_rwsem); in rbd_dev_create()
4076 rbd_dev->dev.bus = &rbd_bus_type; in rbd_dev_create()
4077 rbd_dev->dev.type = &rbd_device_type; in rbd_dev_create()
4078 rbd_dev->dev.parent = &rbd_root_dev; in rbd_dev_create()
4079 device_initialize(&rbd_dev->dev); in rbd_dev_create()
4081 rbd_dev->rbd_client = rbdc; in rbd_dev_create()
4082 rbd_dev->spec = spec; in rbd_dev_create()
4083 rbd_dev->opts = opts; in rbd_dev_create()
4087 rbd_dev->layout.fl_stripe_unit = cpu_to_le32(1 << RBD_MAX_OBJ_ORDER); in rbd_dev_create()
4088 rbd_dev->layout.fl_stripe_count = cpu_to_le32(1); in rbd_dev_create()
4089 rbd_dev->layout.fl_object_size = cpu_to_le32(1 << RBD_MAX_OBJ_ORDER); in rbd_dev_create()
4090 rbd_dev->layout.fl_pg_pool = cpu_to_le32((u32) spec->pool_id); in rbd_dev_create()
4097 if (rbd_dev->opts) in rbd_dev_create()
4100 return rbd_dev; in rbd_dev_create()
4103 static void rbd_dev_destroy(struct rbd_device *rbd_dev) in rbd_dev_destroy() argument
4105 if (rbd_dev) in rbd_dev_destroy()
4106 put_device(&rbd_dev->dev); in rbd_dev_destroy()
4114 static int _rbd_dev_v2_snap_size(struct rbd_device *rbd_dev, u64 snap_id, in _rbd_dev_v2_snap_size() argument
4124 ret = rbd_obj_method_sync(rbd_dev, rbd_dev->header_name, in _rbd_dev_v2_snap_size()
4147 static int rbd_dev_v2_image_size(struct rbd_device *rbd_dev) in rbd_dev_v2_image_size() argument
4149 return _rbd_dev_v2_snap_size(rbd_dev, CEPH_NOSNAP, in rbd_dev_v2_image_size()
4150 &rbd_dev->header.obj_order, in rbd_dev_v2_image_size()
4151 &rbd_dev->header.image_size); in rbd_dev_v2_image_size()
4154 static int rbd_dev_v2_object_prefix(struct rbd_device *rbd_dev) in rbd_dev_v2_object_prefix() argument
4164 ret = rbd_obj_method_sync(rbd_dev, rbd_dev->header_name, in rbd_dev_v2_object_prefix()
4172 rbd_dev->header.object_prefix = ceph_extract_encoded_string(&p, in rbd_dev_v2_object_prefix()
4176 if (IS_ERR(rbd_dev->header.object_prefix)) { in rbd_dev_v2_object_prefix()
4177 ret = PTR_ERR(rbd_dev->header.object_prefix); in rbd_dev_v2_object_prefix()
4178 rbd_dev->header.object_prefix = NULL; in rbd_dev_v2_object_prefix()
4180 dout(" object_prefix = %s\n", rbd_dev->header.object_prefix); in rbd_dev_v2_object_prefix()
4188 static int _rbd_dev_v2_snap_features(struct rbd_device *rbd_dev, u64 snap_id, in _rbd_dev_v2_snap_features() argument
4199 ret = rbd_obj_method_sync(rbd_dev, rbd_dev->header_name, in _rbd_dev_v2_snap_features()
4223 static int rbd_dev_v2_features(struct rbd_device *rbd_dev) in rbd_dev_v2_features() argument
4225 return _rbd_dev_v2_snap_features(rbd_dev, CEPH_NOSNAP, in rbd_dev_v2_features()
4226 &rbd_dev->header.features); in rbd_dev_v2_features()
4229 static int rbd_dev_v2_parent_info(struct rbd_device *rbd_dev) in rbd_dev_v2_parent_info() argument
4257 snapid = cpu_to_le64(rbd_dev->spec->snap_id); in rbd_dev_v2_parent_info()
4258 ret = rbd_obj_method_sync(rbd_dev, rbd_dev->header_name, in rbd_dev_v2_parent_info()
4280 if (rbd_dev->parent_overlap) { in rbd_dev_v2_parent_info()
4281 rbd_dev->parent_overlap = 0; in rbd_dev_v2_parent_info()
4282 rbd_dev_parent_put(rbd_dev); in rbd_dev_v2_parent_info()
4284 rbd_dev->disk->disk_name); in rbd_dev_v2_parent_info()
4312 if (!rbd_dev->parent_spec) { in rbd_dev_v2_parent_info()
4316 rbd_dev->parent_spec = parent_spec; in rbd_dev_v2_parent_info()
4329 if (rbd_dev->parent_overlap) in rbd_dev_v2_parent_info()
4330 rbd_warn(rbd_dev, in rbd_dev_v2_parent_info()
4334 rbd_warn(rbd_dev, "clone is standalone (overlap 0)"); in rbd_dev_v2_parent_info()
4337 rbd_dev->parent_overlap = overlap; in rbd_dev_v2_parent_info()
4348 static int rbd_dev_v2_striping_info(struct rbd_device *rbd_dev) in rbd_dev_v2_striping_info() argument
4361 ret = rbd_obj_method_sync(rbd_dev, rbd_dev->header_name, in rbd_dev_v2_striping_info()
4377 obj_size = (u64)1 << rbd_dev->header.obj_order; in rbd_dev_v2_striping_info()
4381 rbd_warn(rbd_dev, "unsupported stripe unit " in rbd_dev_v2_striping_info()
4388 rbd_warn(rbd_dev, "unsupported stripe count " in rbd_dev_v2_striping_info()
4392 rbd_dev->header.stripe_unit = stripe_unit; in rbd_dev_v2_striping_info()
4393 rbd_dev->header.stripe_count = stripe_count; in rbd_dev_v2_striping_info()
4398 static char *rbd_dev_image_name(struct rbd_device *rbd_dev) in rbd_dev_image_name() argument
4410 rbd_assert(!rbd_dev->spec->image_name); in rbd_dev_image_name()
4412 len = strlen(rbd_dev->spec->image_id); in rbd_dev_image_name()
4420 ceph_encode_string(&p, end, rbd_dev->spec->image_id, (u32)len); in rbd_dev_image_name()
4427 ret = rbd_obj_method_sync(rbd_dev, RBD_DIRECTORY, in rbd_dev_image_name()
4448 static u64 rbd_v1_snap_id_by_name(struct rbd_device *rbd_dev, const char *name) in rbd_v1_snap_id_by_name() argument
4450 struct ceph_snap_context *snapc = rbd_dev->header.snapc; in rbd_v1_snap_id_by_name()
4456 snap_name = rbd_dev->header.snap_names; in rbd_v1_snap_id_by_name()
4466 static u64 rbd_v2_snap_id_by_name(struct rbd_device *rbd_dev, const char *name) in rbd_v2_snap_id_by_name() argument
4468 struct ceph_snap_context *snapc = rbd_dev->header.snapc; in rbd_v2_snap_id_by_name()
4477 snap_name = rbd_dev_v2_snap_name(rbd_dev, snap_id); in rbd_v2_snap_id_by_name()
4495 static u64 rbd_snap_id_by_name(struct rbd_device *rbd_dev, const char *name) in rbd_snap_id_by_name() argument
4497 if (rbd_dev->image_format == 1) in rbd_snap_id_by_name()
4498 return rbd_v1_snap_id_by_name(rbd_dev, name); in rbd_snap_id_by_name()
4500 return rbd_v2_snap_id_by_name(rbd_dev, name); in rbd_snap_id_by_name()
4506 static int rbd_spec_fill_snap_id(struct rbd_device *rbd_dev) in rbd_spec_fill_snap_id() argument
4508 struct rbd_spec *spec = rbd_dev->spec; in rbd_spec_fill_snap_id()
4517 snap_id = rbd_snap_id_by_name(rbd_dev, spec->snap_name); in rbd_spec_fill_snap_id()
4535 static int rbd_spec_fill_names(struct rbd_device *rbd_dev) in rbd_spec_fill_names() argument
4537 struct ceph_osd_client *osdc = &rbd_dev->rbd_client->client->osdc; in rbd_spec_fill_names()
4538 struct rbd_spec *spec = rbd_dev->spec; in rbd_spec_fill_names()
4552 rbd_warn(rbd_dev, "no pool with id %llu", spec->pool_id); in rbd_spec_fill_names()
4561 image_name = rbd_dev_image_name(rbd_dev); in rbd_spec_fill_names()
4563 rbd_warn(rbd_dev, "unable to get image name"); in rbd_spec_fill_names()
4567 snap_name = rbd_snap_name(rbd_dev, spec->snap_id); in rbd_spec_fill_names()
4585 static int rbd_dev_v2_snap_context(struct rbd_device *rbd_dev) in rbd_dev_v2_snap_context() argument
4609 ret = rbd_obj_method_sync(rbd_dev, rbd_dev->header_name, in rbd_dev_v2_snap_context()
4646 ceph_put_snap_context(rbd_dev->header.snapc); in rbd_dev_v2_snap_context()
4647 rbd_dev->header.snapc = snapc; in rbd_dev_v2_snap_context()
4657 static const char *rbd_dev_v2_snap_name(struct rbd_device *rbd_dev, in rbd_dev_v2_snap_name() argument
4674 ret = rbd_obj_method_sync(rbd_dev, rbd_dev->header_name, in rbd_dev_v2_snap_name()
4698 static int rbd_dev_v2_header_info(struct rbd_device *rbd_dev) in rbd_dev_v2_header_info() argument
4700 bool first_time = rbd_dev->header.object_prefix == NULL; in rbd_dev_v2_header_info()
4703 ret = rbd_dev_v2_image_size(rbd_dev); in rbd_dev_v2_header_info()
4708 ret = rbd_dev_v2_header_onetime(rbd_dev); in rbd_dev_v2_header_info()
4713 ret = rbd_dev_v2_snap_context(rbd_dev); in rbd_dev_v2_header_info()
4715 kfree(rbd_dev->header.object_prefix); in rbd_dev_v2_header_info()
4716 rbd_dev->header.object_prefix = NULL; in rbd_dev_v2_header_info()
4722 static int rbd_dev_header_info(struct rbd_device *rbd_dev) in rbd_dev_header_info() argument
4724 rbd_assert(rbd_image_format_valid(rbd_dev->image_format)); in rbd_dev_header_info()
4726 if (rbd_dev->image_format == 1) in rbd_dev_header_info()
4727 return rbd_dev_v1_header_info(rbd_dev); in rbd_dev_header_info()
4729 return rbd_dev_v2_header_info(rbd_dev); in rbd_dev_header_info()
4736 static int rbd_dev_id_get(struct rbd_device *rbd_dev) in rbd_dev_id_get() argument
4746 rbd_dev->dev_id = new_dev_id; in rbd_dev_id_get()
4749 list_add_tail(&rbd_dev->node, &rbd_dev_list); in rbd_dev_id_get()
4752 dout("rbd_dev %p given dev id %d\n", rbd_dev, rbd_dev->dev_id); in rbd_dev_id_get()
4761 static void rbd_dev_id_put(struct rbd_device *rbd_dev) in rbd_dev_id_put() argument
4764 list_del_init(&rbd_dev->node); in rbd_dev_id_put()
4767 ida_simple_remove(&rbd_dev_id_ida, rbd_dev->dev_id); in rbd_dev_id_put()
4769 dout("rbd_dev %p released dev id %d\n", rbd_dev, rbd_dev->dev_id); in rbd_dev_id_put()
5019 static int rbd_dev_image_id(struct rbd_device *rbd_dev) in rbd_dev_image_id() argument
5033 if (rbd_dev->spec->image_id) { in rbd_dev_image_id()
5034 rbd_dev->image_format = *rbd_dev->spec->image_id ? 2 : 1; in rbd_dev_image_id()
5043 size = sizeof (RBD_ID_PREFIX) + strlen(rbd_dev->spec->image_name); in rbd_dev_image_id()
5047 sprintf(object_name, "%s%s", RBD_ID_PREFIX, rbd_dev->spec->image_name); in rbd_dev_image_id()
5061 ret = rbd_obj_method_sync(rbd_dev, object_name, in rbd_dev_image_id()
5069 rbd_dev->image_format = 1; in rbd_dev_image_id()
5077 rbd_dev->image_format = 2; in rbd_dev_image_id()
5081 rbd_dev->spec->image_id = image_id; in rbd_dev_image_id()
5095 static void rbd_dev_unprobe(struct rbd_device *rbd_dev) in rbd_dev_unprobe() argument
5099 rbd_dev_parent_put(rbd_dev); in rbd_dev_unprobe()
5103 header = &rbd_dev->header; in rbd_dev_unprobe()
5111 static int rbd_dev_v2_header_onetime(struct rbd_device *rbd_dev) in rbd_dev_v2_header_onetime() argument
5115 ret = rbd_dev_v2_object_prefix(rbd_dev); in rbd_dev_v2_header_onetime()
5123 ret = rbd_dev_v2_features(rbd_dev); in rbd_dev_v2_header_onetime()
5129 if (rbd_dev->header.features & RBD_FEATURE_STRIPINGV2) { in rbd_dev_v2_header_onetime()
5130 ret = rbd_dev_v2_striping_info(rbd_dev); in rbd_dev_v2_header_onetime()
5138 rbd_dev->header.features = 0; in rbd_dev_v2_header_onetime()
5139 kfree(rbd_dev->header.object_prefix); in rbd_dev_v2_header_onetime()
5140 rbd_dev->header.object_prefix = NULL; in rbd_dev_v2_header_onetime()
5150 static int rbd_dev_probe_parent(struct rbd_device *rbd_dev, int depth) in rbd_dev_probe_parent() argument
5155 if (!rbd_dev->parent_spec) in rbd_dev_probe_parent()
5164 parent = rbd_dev_create(rbd_dev->rbd_client, rbd_dev->parent_spec, in rbd_dev_probe_parent()
5175 __rbd_get_client(rbd_dev->rbd_client); in rbd_dev_probe_parent()
5176 rbd_spec_get(rbd_dev->parent_spec); in rbd_dev_probe_parent()
5182 rbd_dev->parent = parent; in rbd_dev_probe_parent()
5183 atomic_set(&rbd_dev->parent_ref, 1); in rbd_dev_probe_parent()
5187 rbd_dev_unparent(rbd_dev); in rbd_dev_probe_parent()
5193 static int rbd_dev_device_setup(struct rbd_device *rbd_dev) in rbd_dev_device_setup() argument
5199 ret = rbd_dev_id_get(rbd_dev); in rbd_dev_device_setup()
5205 sprintf(rbd_dev->name, "%s%d", RBD_DRV_NAME, rbd_dev->dev_id); in rbd_dev_device_setup()
5210 ret = register_blkdev(0, rbd_dev->name); in rbd_dev_device_setup()
5214 rbd_dev->major = ret; in rbd_dev_device_setup()
5215 rbd_dev->minor = 0; in rbd_dev_device_setup()
5217 rbd_dev->major = rbd_major; in rbd_dev_device_setup()
5218 rbd_dev->minor = rbd_dev_id_to_minor(rbd_dev->dev_id); in rbd_dev_device_setup()
5223 ret = rbd_init_disk(rbd_dev); in rbd_dev_device_setup()
5227 ret = rbd_dev_mapping_set(rbd_dev); in rbd_dev_device_setup()
5231 set_capacity(rbd_dev->disk, rbd_dev->mapping.size / SECTOR_SIZE); in rbd_dev_device_setup()
5232 set_disk_ro(rbd_dev->disk, rbd_dev->mapping.read_only); in rbd_dev_device_setup()
5234 dev_set_name(&rbd_dev->dev, "%d", rbd_dev->dev_id); in rbd_dev_device_setup()
5235 ret = device_add(&rbd_dev->dev); in rbd_dev_device_setup()
5241 set_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags); in rbd_dev_device_setup()
5242 add_disk(rbd_dev->disk); in rbd_dev_device_setup()
5244 pr_info("%s: added with size 0x%llx\n", rbd_dev->disk->disk_name, in rbd_dev_device_setup()
5245 (unsigned long long) rbd_dev->mapping.size); in rbd_dev_device_setup()
5250 rbd_dev_mapping_clear(rbd_dev); in rbd_dev_device_setup()
5252 rbd_free_disk(rbd_dev); in rbd_dev_device_setup()
5255 unregister_blkdev(rbd_dev->major, rbd_dev->name); in rbd_dev_device_setup()
5257 rbd_dev_id_put(rbd_dev); in rbd_dev_device_setup()
5261 static int rbd_dev_header_name(struct rbd_device *rbd_dev) in rbd_dev_header_name() argument
5263 struct rbd_spec *spec = rbd_dev->spec; in rbd_dev_header_name()
5268 rbd_assert(rbd_image_format_valid(rbd_dev->image_format)); in rbd_dev_header_name()
5270 if (rbd_dev->image_format == 1) in rbd_dev_header_name()
5275 rbd_dev->header_name = kmalloc(size, GFP_KERNEL); in rbd_dev_header_name()
5276 if (!rbd_dev->header_name) in rbd_dev_header_name()
5279 if (rbd_dev->image_format == 1) in rbd_dev_header_name()
5280 sprintf(rbd_dev->header_name, "%s%s", in rbd_dev_header_name()
5283 sprintf(rbd_dev->header_name, "%s%s", in rbd_dev_header_name()
5288 static void rbd_dev_image_release(struct rbd_device *rbd_dev) in rbd_dev_image_release() argument
5290 rbd_dev_unprobe(rbd_dev); in rbd_dev_image_release()
5291 kfree(rbd_dev->header_name); in rbd_dev_image_release()
5292 rbd_dev->header_name = NULL; in rbd_dev_image_release()
5293 rbd_dev->image_format = 0; in rbd_dev_image_release()
5294 kfree(rbd_dev->spec->image_id); in rbd_dev_image_release()
5295 rbd_dev->spec->image_id = NULL; in rbd_dev_image_release()
5297 rbd_dev_destroy(rbd_dev); in rbd_dev_image_release()
5306 static int rbd_dev_image_probe(struct rbd_device *rbd_dev, int depth) in rbd_dev_image_probe() argument
5316 ret = rbd_dev_image_id(rbd_dev); in rbd_dev_image_probe()
5320 ret = rbd_dev_header_name(rbd_dev); in rbd_dev_image_probe()
5325 ret = rbd_dev_header_watch_sync(rbd_dev); in rbd_dev_image_probe()
5329 rbd_dev->spec->pool_name, in rbd_dev_image_probe()
5330 rbd_dev->spec->image_name); in rbd_dev_image_probe()
5335 ret = rbd_dev_header_info(rbd_dev); in rbd_dev_image_probe()
5346 ret = rbd_spec_fill_snap_id(rbd_dev); in rbd_dev_image_probe()
5348 ret = rbd_spec_fill_names(rbd_dev); in rbd_dev_image_probe()
5352 rbd_dev->spec->pool_name, in rbd_dev_image_probe()
5353 rbd_dev->spec->image_name, in rbd_dev_image_probe()
5354 rbd_dev->spec->snap_name); in rbd_dev_image_probe()
5358 if (rbd_dev->header.features & RBD_FEATURE_LAYERING) { in rbd_dev_image_probe()
5359 ret = rbd_dev_v2_parent_info(rbd_dev); in rbd_dev_image_probe()
5367 if (!depth && rbd_dev->parent_spec) in rbd_dev_image_probe()
5368 rbd_warn(rbd_dev, in rbd_dev_image_probe()
5372 ret = rbd_dev_probe_parent(rbd_dev, depth); in rbd_dev_image_probe()
5377 rbd_dev->image_format, rbd_dev->header_name); in rbd_dev_image_probe()
5381 rbd_dev_unprobe(rbd_dev); in rbd_dev_image_probe()
5384 rbd_dev_header_unwatch_sync(rbd_dev); in rbd_dev_image_probe()
5386 kfree(rbd_dev->header_name); in rbd_dev_image_probe()
5387 rbd_dev->header_name = NULL; in rbd_dev_image_probe()
5389 rbd_dev->image_format = 0; in rbd_dev_image_probe()
5390 kfree(rbd_dev->spec->image_id); in rbd_dev_image_probe()
5391 rbd_dev->spec->image_id = NULL; in rbd_dev_image_probe()
5399 struct rbd_device *rbd_dev = NULL; in do_rbd_add() local
5439 rbd_dev = rbd_dev_create(rbdc, spec, rbd_opts); in do_rbd_add()
5440 if (!rbd_dev) { in do_rbd_add()
5448 rc = rbd_dev_image_probe(rbd_dev, 0); in do_rbd_add()
5454 read_only = rbd_dev->opts->read_only; in do_rbd_add()
5455 if (rbd_dev->spec->snap_id != CEPH_NOSNAP) in do_rbd_add()
5457 rbd_dev->mapping.read_only = read_only; in do_rbd_add()
5459 rc = rbd_dev_device_setup(rbd_dev); in do_rbd_add()
5466 rbd_dev_header_unwatch_sync(rbd_dev); in do_rbd_add()
5467 rbd_dev_image_release(rbd_dev); in do_rbd_add()
5477 rbd_dev_destroy(rbd_dev); in do_rbd_add()
5503 static void rbd_dev_device_release(struct rbd_device *rbd_dev) in rbd_dev_device_release() argument
5505 rbd_free_disk(rbd_dev); in rbd_dev_device_release()
5506 clear_bit(RBD_DEV_FLAG_EXISTS, &rbd_dev->flags); in rbd_dev_device_release()
5507 device_del(&rbd_dev->dev); in rbd_dev_device_release()
5508 rbd_dev_mapping_clear(rbd_dev); in rbd_dev_device_release()
5510 unregister_blkdev(rbd_dev->major, rbd_dev->name); in rbd_dev_device_release()
5511 rbd_dev_id_put(rbd_dev); in rbd_dev_device_release()
5514 static void rbd_dev_remove_parent(struct rbd_device *rbd_dev) in rbd_dev_remove_parent() argument
5516 while (rbd_dev->parent) { in rbd_dev_remove_parent()
5517 struct rbd_device *first = rbd_dev; in rbd_dev_remove_parent()
5544 struct rbd_device *rbd_dev = NULL; in do_rbd_remove() local
5563 rbd_dev = list_entry(tmp, struct rbd_device, node); in do_rbd_remove()
5564 if (rbd_dev->dev_id == dev_id) { in do_rbd_remove()
5570 spin_lock_irq(&rbd_dev->lock); in do_rbd_remove()
5571 if (rbd_dev->open_count) in do_rbd_remove()
5575 &rbd_dev->flags); in do_rbd_remove()
5576 spin_unlock_irq(&rbd_dev->lock); in do_rbd_remove()
5582 rbd_dev_header_unwatch_sync(rbd_dev); in do_rbd_remove()
5588 ceph_osdc_flush_notifies(&rbd_dev->rbd_client->client->osdc); in do_rbd_remove()
5596 rbd_dev_device_release(rbd_dev); in do_rbd_remove()
5597 rbd_dev_image_release(rbd_dev); in do_rbd_remove()