static int __init imgrement_init(void) { char* err; struct imgrement_device *dev; imgrement_device = kzalloc(sizeof(struct imgrement_device), GFP_KERNEL); _astgo(imgrement_device != NULL, "Error allocating", err, init_error); dev = imgrement_device; dev->major = register_blkdev(0, DRIVER_NAME); _astgo(dev->major > 0, "Error register block device", err, init_error); dev->base_dev = blkdev_get_by_path("/dev/sdb", FMODE_READ, NULL); _astgo(dev->base_dev != NULL, "Error getting base block device", err, init_error); dev->base_queue = bdev_get_queue(dev->base_dev); _astgo(dev->base_queue != NULL, "Error getting queue", err, init_error); dev->orig_req_fn = dev->base_queue->make_request_fn; dev->base_queue->make_request_fn = trace_request_fn; LOG("%s trace initialization succeeded", dev->base_dev->bd_disk->disk_name); return 0; init_error: LOG_VAR(err); imgrement_exit(); return -1; }
struct io_activity *extract_ioa(struct bio *bio) { int next_sector; bvec_iter iter; bio_vec bvec; char *err; struct block_delta *delta; struct io_activity *ioa = create_ioa(bio); _astgo(ioa != NULL, "Error creating io_activity", err, extract_error); next_sector = bio_sector(bio); delta = ioa->deltas; bio_for_each_segment(bvec, bio, iter) { next_sector = fill_delta(delta, bio, iter, next_sector); _astgo(next_sector >= 0, "Error filling delta->data", err, extract_error); delta++; }
struct io_activity *create_ioa(struct bio *bio) { char *err; struct io_activity *ioa = vmalloc(sizeof(struct io_activity)); _astgo(ioa != NULL, "Error allocating io_activity", err, create_ioa_error); ioa->rw = bio_data_dir(bio); ioa->data_size = bio_size(bio); ioa->delta_count = bio_cnt(bio); if (ioa->delta_count != 0) { ioa->deltas = vmalloc(ioa->delta_count * sizeof(struct block_delta)); _astgo(ioa->deltas != NULL, "Error allocating deltas", err, create_ioa_error); } else ioa->deltas = NULL; return ioa; create_ioa_error: LOG_VAR(err); LOG("Error creating ioa from bio with: %lu sector, %d size", bio_sector(bio), bio_size(bio)); ast_vfree(ioa->deltas); ast_vfree(ioa); return NULL; }