From ce002301b524b4f6377b7dd3df6bc683c919123c Mon Sep 17 00:00:00 2001 From: Manuel Bentele Date: Tue, 14 May 2019 01:13:20 +0200 Subject: Added sequence and class diagram of the loop device driver --- analysis/loop/class_diagram_loop_device.pdf | Bin 0 -> 23098 bytes analysis/loop/class_diagram_loop_device.svg | 10151 +++++++++++++++++++ analysis/loop/class_diagram_loop_device.xmi | 1632 +++ analysis/loop/class_diagram_loop_device_small.pdf | Bin 0 -> 22590 bytes analysis/loop/class_diagram_loop_device_small.svg | 8391 +++++++++++++++ analysis/loop/class_diagram_loop_device_small.xmi | 1522 +++ .../sequence_diagram_loop_device_init_exit.pdf | Bin 0 -> 25973 bytes .../sequence_diagram_loop_device_init_exit.svg | 1 + .../sequence_diagram_loop_device_init_exit.txt | 187 + 9 files changed, 21884 insertions(+) create mode 100644 analysis/loop/class_diagram_loop_device.pdf create mode 100644 analysis/loop/class_diagram_loop_device.svg create mode 100644 analysis/loop/class_diagram_loop_device.xmi create mode 100644 analysis/loop/class_diagram_loop_device_small.pdf create mode 100644 analysis/loop/class_diagram_loop_device_small.svg create mode 100644 analysis/loop/class_diagram_loop_device_small.xmi create mode 100644 analysis/loop/sequence_diagram_loop_device_init_exit.pdf create mode 100644 analysis/loop/sequence_diagram_loop_device_init_exit.svg create mode 100644 analysis/loop/sequence_diagram_loop_device_init_exit.txt diff --git a/analysis/loop/class_diagram_loop_device.pdf b/analysis/loop/class_diagram_loop_device.pdf new file mode 100644 index 0000000..55a54ae Binary files /dev/null and b/analysis/loop/class_diagram_loop_device.pdf differ diff --git a/analysis/loop/class_diagram_loop_device.svg b/analysis/loop/class_diagram_loop_device.svg new file mode 100644 index 0000000..ca177c0 --- /dev/null +++ b/analysis/loop/class_diagram_loop_device.svg @@ -0,0 +1,10151 @@ + + +Qt SVG Document +Generated with Qt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + + + + + + + + + + + + +1 + + + + + + + + + + + + ++fops + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + + + + + + + + + + + + +1 + + + + + + + + + + + + ++ops + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +loop_device + + + + + + + + + + + + +1 + + + + + + + + + + + + +1 + + + + + + + + + + + + ++private_data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +«use» + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +«implement» + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + + + + + + + + + + + + +1 + + + + + + + + + + + + ++tag_set + + + + + + + + + + + + +blk_mq_tag_set + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + + + + + + + + + + + + ++lo_disk + + + + + + + + + + + + + + + + + + + + + + +gendisk + + + + + + + + + + + + +1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +«use» + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +request_queue + + + + + + + + + + + + +1 + + + + + + + + + + + + +1 + + + + + + + + + + + + ++queue + + + + + + + + + + + + ++lo_queue + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + + + + + + + + + + + + +1 + + + + + + + + + + + + ++driver_data + + + + + + + + + + + + +loop_device + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + + + + + + + + + + + + +1 + + + + + + + + + + + + ++fops + + + + + + + + + + + + ++loop_ctl_fops + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + + + + + + + + + + + + +1 + + + + + + + + + + + + ++loop_misc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + + + + + + + + + + + + +0..255 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +blk_mq_ops + + + + + + + + + + + + + + + + + + + + + + + + + ++ queue_rq : queue_rq_fn* + + + + + + + + + + + + + + + + + + ++ commit_rqs : commit_rqs_fn* + + + + + + + + + + + + + + + + + + ++ get_budget : get_budget_fn* + + + + + + + + + + + + + + + + + + ++ put_budget : put_budget_fn* + + + + + + + + + + + + + + + + + + ++ timeout : timeout_fn* + + + + + + + + + + + + + + + + + + ++ poll : poll_fn* + + + + + + + + + + + + + + + + + + ++ complete : complete_fn* + + + + + + + + + + + + + + + + + + ++ init_hctx : init_hctx_fn* + + + + + + + + + + + + + + + + + + ++ exit_hctx : exit_hctx_fn* + + + + + + + + + + + + + + + + + + ++ init_request : init_request_fn* + + + + + + + + + + + + + + + + + + ++ exit_request : exit_request_fn* + + + + + + + + + + + + + + + + + + ++ (*initialize_rq_fn)(rq : struct request*) : void + + + + + + + + + + + + + + + + + + ++ busy : busy_fn* + + + + + + + + + + + + + + + + + + ++ map_queues : map_queues_fn* + + + + + + + + + + + + + + + + + + ++ (*show_rq)(m : struct seq_file*, rq : struct request*) : void + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +blk_mq_tag_set + + + + + + + + + + + + + + + + + + + + + + + + + ++ map : struct blk_mq_queue_map[HCTX_MAX_TYPES] + + + + + + + + + + + + + + + + + + ++ nr_maps : unsigned int + + + + + + + + + + + + + + + + + + ++ ops : struct const blk_mq_ops* + + + + + + + + + + + + + + + + + + ++ nr_hw_queues : unsigned int + + + + + + + + + + + + + + + + + + ++ queue_depth : unsigned int + + + + + + + + + + + + + + + + + + ++ reserved_tags : unsigned int + + + + + + + + + + + + + + + + + + ++ cmd_size : unsigned int + + + + + + + + + + + + + + + + + + ++ numa_node : int + + + + + + + + + + + + + + + + + + ++ timeout : unsigned int + + + + + + + + + + + + + + + + + + ++ flags : unsigned int + + + + + + + + + + + + + + + + + + ++ driver_data : void* + + + + + + + + + + + + + + + + + + ++ tags : struct blk_mq_tags** + + + + + + + + + + + + + + + + + + ++ tag_list_lock : struct mutex + + + + + + + + + + + + + + + + + + ++ tag_list : struct list_head + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +«interface» + + + + + + + + + + + + + + + + + + +kernel_module + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ module_init() : int + + + + + + + + + + + + + + + + + + ++ module_exit() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +loop_device + + + + + + + + + + + + + + + + + + + + + + + + + ++ lo_number : int + + + + + + + + + + + + + + + + + + ++ lo_refcnt : atomic_t + + + + + + + + + + + + + + + + + + ++ lo_offset : loff_t + + + + + + + + + + + + + + + + + + ++ lo_sizelimit : loff_t + + + + + + + + + + + + + + + + + + ++ lo_flags : int + + + + + + + + + + + + + + + + + + ++ transfer : int + + + + + + + + + + + + + + + + + + ++ lo_file_name : char[LO_NAME_SIZE] + + + + + + + + + + + + + + + + + + ++ lo_crypt_name : char[LO_NAME_SIZE] + + + + + + + + + + + + + + + + + + ++ lo_encrypt_key : char[LO_KEY_SIZE] + + + + + + + + + + + + + + + + + + ++ lo_encrypt_key_size : int + + + + + + + + + + + + + + + + + + ++ lo_encryption : struct loop_func_table* + + + + + + + + + + + + + + + + + + ++ lo_init : __u32[2] + + + + + + + + + + + + + + + + + + ++ lo_key_owner : kuid_t + + + + + + + + + + + + + + + + + + ++ ioctl : int + + + + + + + + + + + + + + + + + + ++ lo_backing_file : struct file* + + + + + + + + + + + + + + + + + + ++ lo_device : struct block_device* + + + + + + + + + + + + + + + + + + ++ key_data : void* + + + + + + + + + + + + + + + + + + ++ old_gfp_mask : gfp_t + + + + + + + + + + + + + + + + + + ++ lo_lock : spinlock_t + + + + + + + + + + + + + + + + + + ++ lo_state : int + + + + + + + + + + + + + + + + + + ++ worker : struct kthread_worker + + + + + + + + + + + + + + + + + + ++ worker_task : struct task_struct* + + + + + + + + + + + + + + + + + + ++ use_dio : bool + + + + + + + + + + + + + + + + + + ++ sysfs_inited : bool + + + + + + + + + + + + + + + + + + ++ lo_queue : struct request_queue* + + + + + + + + + + + + + + + + + + ++ tag_set : struct blk_mq_tag_set + + + + + + + + + + + + + + + + + + ++ lo_disk : struct gendisk* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ loop_attr_autoclear_show(lo : struct loop_device*, buf : char*) : ssize_t + + + + + + + + + + + + + + + + + + + + + + ++ loop_attr_backing_file_show(lo : struct loop_device*, buf : char*) : ssize_t + + + + + + + + + + + + + + + + + + + + + + ++ loop_attr_dio_show(lo : struct loop_device*, buf : char*) : ssize_t + + + + + + + + + + + + + + + + + + + + + + ++ loop_attr_offset_show(lo : struct loop_device*, buf : char*) : ssize_t + + + + + + + + + + + + + + + + + + + + + + ++ loop_attr_partscan_show(lo : struct loop_device*, buf : char*) : ssize_t + + + + + + + + + + + + + + + + + + + + + + ++ loop_attr_show(dev : struct device*, page : char*, (* callback)(struct loop_device *, char *, ) : ssize_t) : ssize_t + + + + + + + + + + + + + + + + + + + + + + ++ loop_attr_sizelimit_show(lo : struct loop_device*, buf : char*) : ssize_t + + + + + + + + + + + + + + + + + + + + + + ++ loop_change_fd(lo : struct loop_device*, bdev : struct block_device*, arg : unsigned int) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_clr_fd(lo : struct loop_device*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_config_discard(lo : struct loop_device*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_get_status(lo : struct loop_device*, info : struct loop_info64*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_get_status64(lo : struct loop_device*, arg : struct loop_info64*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_get_status_compat(lo : struct loop_device*, arg : struct compat_loop_info*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_get_status_old(lo : struct loop_device*, arg : struct loop_info*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_handle_cmd(cmd : struct loop_cmd*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_info64_from_compat(arg : struct const compat_loop_info*, info64 : struct loop_info64*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_info64_from_old(info : struct const loop_info*, info64 : struct loop_info64*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_info64_to_compat(info64 : struct const loop_info64*, arg : struct compat_loop_info*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_info64_to_old(info64 : struct const loop_info64*, info : struct loop_info*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_init_request(set : struct blk_mq_tag_set*, rq : struct request*, hctx_idx : unsigned int, numa_node : unsigned int) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_init_xfer(lo : struct loop_device*, xfer : struct loop_func_table*, i : struct const loop_info64*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_release_xfer(lo : struct loop_device*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_kthread_worker_fn(worker_ptr : void*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_prepare_queue(lo : struct loop_device*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_queue_rq(hctx : struct blk_mq_hw_ctx*, bd : struct const blk_mq_queue_data*) : blk_status_t + + + + + + + + + + + + + + + + + + + + + + ++ loop_queue_work(work : struct kthread_work*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_reread_partitions(lo : struct loop_device*, bdev : struct block_device*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_set_block_size(lo : struct loop_device*, arg : unsigned long) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_set_capacity(lo : struct loop_device*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_set_dio(lo : struct loop_device*, arg : unsigned long) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_set_fd(lo : struct loop_device*, mode : fmode_t, bdev : struct block_device*, arg : unsigned int) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_set_status(lo : struct loop_device*, info : struct const loop_info64*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_set_status64(lo : struct loop_device*, arg : struct const loop_info64*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_set_status_compat(lo : struct loop_device*, arg : struct const compat_loop_info*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_set_status_old(lo : struct loop_device*, __user : struct const loop_info) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_sysfs_exit(lo : struct loop_device*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_sysfs_init(lo : struct loop_device*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_unprepare_queue(lo : struct loop_device*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_update_dio(lo : struct loop_device*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_validate_file(file : struct file*, bdev : struct block_device*) : int + + + + + + + + + + + + + + + + + + + + + + ++ is_loop_device(file : struct file*) : int + + + + + + + + + + + + + + + + + + + + + + ++ do_req_filebacked(lo : struct loop_device*, rq : struct request*) : int + + + + + + + + + + + + + + + + + + + + + + ++ figure_loop_size(lo : struct loop_device*, offset : loff_t, sizelimit : loff_t) : int + + + + + + + + + + + + + + + + + + + + + + ++ get_loop_size(lo : struct loop_device*, file : struct file*) : loff_t + + + + + + + + + + + + + + + + + + + + + + ++ get_size(offset : loff_t, sizelimit : loff_t, file : struct file*) : loff_t + + + + + + + + + + + + + + + + + + + + + + ++ lo_open(bdev : struct block_device*, mode : fmode_t) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_release(disk : struct gendisk*, mode : fmode_t) + + + + + + + + + + + + + + + + + + + + + + ++ lo_ioctl(bdev : struct block_device*, mode : fmode_t, cmd : unsigned int, arg : unsigned long) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_compat_ioctl(bdev : struct block_device*, mode : fmode_t, cmd : unsigned int, arg : unsigned long) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_simple_ioctl(lo : struct loop_device*, cmd : unsigned int, arg : unsigned long) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_do_transfer(lo : struct loop_device*, cmd : int, rpage : struct page*, roffs : unsigned, lpage : struct page*, loffs : unsigned, size : int, rblock : sector_t) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_complete_rq(rq : struct request*) + + + + + + + + + + + + + + + + + + + + + + ++ lo_read_simple(lo : struct loop_device*, rq : struct request*, pos : loff_t) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_read_transfer(lo : struct loop_device*, rq : struct request*, pos : loff_t) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_req_flush(lo : struct loop_device*, rq : struct request*) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_rw_aio(lo : struct loop_device*, cmd : struct loop_cmd*, pos : loff_t, rw : bool) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_rw_aio_complete(iocb : struct kiocb*, ret : long, ret2 : long) + + + + + + + + + + + + + + + + + + + + + + ++ lo_rw_aio_do_completion(cmd : struct loop_cmd*) + + + + + + + + + + + + + + + + + + + + + + ++ lo_write_bvec(file : struct file*, bvec : struct bio_vec*, ppos : loff_t*) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_write_simple(lo : struct loop_device*, rq : struct request*, pos : loff_t) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_write_transfer(lo : struct loop_device*, rq : struct request*, pos : loff_t) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_discard(lo : struct loop_device*, rq : struct request*, pos : loff_t) : int + + + + + + + + + + + + + + + + + + + + + + +- __loop_update_dio(lo : struct loop_device*, dio : bool) + + + + + + + + + + + + + + + + + + + + + + +- __loop_clr_fd(lo : struct loop_device*, release : bool) : int + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +loop_devices + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ loop_add(l : struct loop_device**, i : int) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_remove(lo : struct loop_device*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_lookup(l : struct loop_device**, i : int) : int + + + + + + + + + + + + + + + + + + + + + + ++ find_free_cb(id : int, ptr : void*, data : void*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_probe(dev : dev_t, part : int*, data : void*) : struct kobject* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +loop_control + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ loop_control_ioctl(file : struct file*, cmd : unsigned int, parm : unsigned long) : long + + + + + + + + + + + + + + + + + + + + + + ++ loop_register_transfer(funcs : struct loop_func_table*) : int + + + + + + + + + + + + + + + + + + ++ loop_unregister_transfer(number : int) : int + + + + + + + + + + + + + + + + + + ++ unregister_transfer_cb(id : int, ptr : void*, data : void*) : int + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +loop_device_module + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ max_loop_setup(str : char*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_init() : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_exit() + + + + + + + + + + + + + + + + + + + + + + ++ loop_exit_cb(id : int, ptr : void*, data : void*) : int + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +miscdevice + + + + + + + + + + + + + + + + + + + + + + + + + ++ minor : int + + + + + + + + + + + + + + + + + + ++ name : const char* + + + + + + + + + + + + + + + + + + ++ fops : struct const file_operations* + + + + + + + + + + + + + + + + + + ++ list : struct list_head + + + + + + + + + + + + + + + + + + ++ parent : struct device* + + + + + + + + + + + + + + + + + + ++ this_device : struct device* + + + + + + + + + + + + + + + + + + ++ groups : struct const attribute_group** + + + + + + + + + + + + + + + + + + ++ nodename : const char* + + + + + + + + + + + + + + + + + + ++ mode : umode_t + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +gendisk + + + + + + + + + + + + + + + + + + + + + + + + + ++ major : int + + + + + + + + + + + + + + + + + + ++ first_minor : int + + + + + + + + + + + + + + + + + + ++ minors : int + + + + + + + + + + + + + + + + + + ++ disk_name : char[DISK_NAME_LEN] + + + + + + + + + + + + + + + + + + ++ (*devnode)(gd : struct gendisk*, mode : umode_t*) : char* + + + + + + + + + + + + + + + + + + ++ events : unsigned int + + + + + + + + + + + + + + + + + + ++ async_events : unsigned int + + + + + + + + + + + + + + + + + + ++ part_tbl : struct disk_part_tbl* + + + + + + + + + + + + + + + + + + ++ part0 : struct hd_struct + + + + + + + + + + + + + + + + + + ++ fops : struct const block_device_operations* + + + + + + + + + + + + + + + + + + ++ queue : struct request_queue* + + + + + + + + + + + + + + + + + + ++ private_data : void* + + + + + + + + + + + + + + + + + + ++ flags : int + + + + + + + + + + + + + + + + + + ++ lookup_sem : struct rw_semaphore + + + + + + + + + + + + + + + + + + ++ slave_dir : struct kobject* + + + + + + + + + + + + + + + + + + ++ random : struct timer_rand_state* + + + + + + + + + + + + + + + + + + ++ sync_io : atomic_t + + + + + + + + + + + + + + + + + + ++ ev : struct disk_events* + + + + + + + + + + + + + + + + + + ++ node_id : int + + + + + + + + + + + + + + + + + + ++ bb : struct badblocks* + + + + + + + + + + + + + + + + + + ++ lockdep_map : struct lockdep_map + + + + + + + + + + + + + + + + + + +- integrity_kobj : struct kobject + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +block_device_operations + + + + + + + + + + + + + + + + + + + + + + + + + ++ (*open)(struct block_device*, fmode_t) : int + + + + + + + + + + + + + + + + + + ++ (*release)(struct gendisk*, fmode_t) : void + + + + + + + + + + + + + + + + + + ++ (*rw_page)(struct block_device*, sector_t, struct page*, unsigned int) : int + + + + + + + + + + + + + + + + + + ++ (*ioctl)(struct block_device*, fmode_t, unsigned, unsigned long) : int + + + + + + + + + + + + + + + + + + ++ (*compat_ioctl)(struct block_device*, fmode_t, unsigned, unsigned long) : int + + + + + + + + + + + + + + + + + + ++ (*check_events)(disk : struct gendisk*, clearing : unsigned int) : unsigned int + + + + + + + + + + + + + + + + + + ++ (*media_changed)(struct gendisk*) : int + + + + + + + + + + + + + + + + + + ++ (*unlock_native_capacity)(struct gendisk*) : void + + + + + + + + + + + + + + + + + + ++ (*revalidate_disk)(struct gendisk*) : int + + + + + + + + + + + + + + + + + + ++ (*getgeo)(struct block_device*, struct hd_geometry*) : int + + + + + + + + + + + + + + + + + + ++ (*swap_slot_free_notify)(struct block_device*, unsigned long) : void + + + + + + + + + + + + + + + + + + ++ (*report_zones)(struct gendisk*, sector : sector_t, zones : struct blk_zone*, nr_zones : unsigned int*, gfp_mask : gfp_t) : int + + + + + + + + + + + + + + + + + + ++ owner : struct module* + + + + + + + + + + + + + + + + + + ++ pr_ops : struct const pr_ops* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +file_operations + + + + + + + + + + + + + + + + + + + + + + + + + ++ owner : struct module* + + + + + + + + + + + + + + + + + + ++ (*llseek)(struct file*, loff_t, int) : loff_t + + + + + + + + + + + + + + + + + + ++ (*read)(struct file*, char*, size_t, loff_t*) : ssize_t + + + + + + + + + + + + + + + + + + ++ (*write)(struct file*, const char*, size_t, loff_t*) : ssize_t + + + + + + + + + + + + + + + + + + ++ (*read_iter)(struct kiocb*, struct iov_iter*) : ssize_t + + + + + + + + + + + + + + + + + + ++ (*write_iter)(struct kiocb*, struct iov_iter*) : ssize_t + + + + + + + + + + + + + + + + + + ++ (*iopoll)(kiocb : struct kiocb*, spin : bool) : int + + + + + + + + + + + + + + + + + + ++ (*iterate) (struct file*, struct dir_context*) : int + + + + + + + + + + + + + + + + + + ++ (*iterate_shared)(struct file*, struct dir_context*) : int + + + + + + + + + + + + + + + + + + ++ (*poll)(struct file*, struct poll_table_struct*) : __poll_t + + + + + + + + + + + + + + + + + + ++ (*unlocked_ioctl)(struct file*, unsigned int, unsigned long) : long + + + + + + + + + + + + + + + + + + ++ (*compat_ioctl) (struct file*, unsigned int, unsigned long) : long + + + + + + + + + + + + + + + + + + ++ (*mmap)(struct file*, struct vm_area_struct*) : int + + + + + + + + + + + + + + + + + + ++ mmap_supported_flags : unsigned long + + + + + + + + + + + + + + + + + + ++ (*open)(struct inode*, struct file*) : int + + + + + + + + + + + + + + + + + + ++ (*flush)(struct file*, id : fl_owner_t) : int + + + + + + + + + + + + + + + + + + ++ (*release)(struct inode*, struct file*) : int + + + + + + + + + + + + + + + + + + ++ (*fsync)(struct file*, loff_t, loff_t, datasync : int) : int + + + + + + + + + + + + + + + + + + ++ (*fasync)(int, struct file*, int) : int + + + + + + + + + + + + + + + + + + ++ (*lock)(struct file*, int, struct file_lock*) : int + + + + + + + + + + + + + + + + + + ++ (*sendpage)(struct file*, struct page*, int, size_t, loff_t*, int) : ssize_t + + + + + + + + + + + + + + + + + + ++ (*get_unmapped_area)(struct file*, unsigned long, unsigned long, unsigned long, unsigned long) : unsigned long + + + + + + + + + + + + + + + + + + ++ (*check_flags)(int) : int + + + + + + + + + + + + + + + + + + ++ (*flock)(struct file*, int, struct file_lock*) : int + + + + + + + + + + + + + + + + + + ++ (*splice_write)(struct pipe_inode_info*, struct file*, loff_t*, size_t, unsigned int) : ssize_t + + + + + + + + + + + + + + + + + + ++ (*splice_read)(struct file*, loff_t*, struct pipe_inode_info*, size_t, unsigned int) : ssize_t + + + + + + + + + + + + + + + + + + ++ (*setlease)(struct file*, long, struct file_lock**, void**) : int + + + + + + + + + + + + + + + + + + ++ (*fallocate)(file : struct file*, mode : int, offset : loff_t, len : loff_t) : long + + + + + + + + + + + + + + + + + + ++ (*show_fdinfo)(m : struct seq_file*, f : struct file*) : void + + + + + + + + + + + + + + + + + + ++ (*mmap_capabilities)(struct file*) : unsigned + + + + + + + + + + + + + + + + + + ++ (*copy_file_range)(struct file*, loff_t, struct file*, loff_t, size_t, unsigned int) : ssize_t + + + + + + + + + + + + + + + + + + ++ (*remap_file_range)(file_in : struct file*, pos_in : loff_t, file_out : struct file*, pos_out : loff_t, len : loff_t, remap_flags : unsigned int) : loff_t + + + + + + + + + + + + + + + + + + ++ (*fadvise)(struct file*, loff_t, loff_t, int) : int + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LOOP_SET_FD + + + + + + + + + + + + + + + + LOOP_CHANGE_FD + + + + + + + + + + + + + + + + LOOP_CLR_FD + + + + + + + + + + + + + + + + LOOP_SET_STATUS + + + + + + + + + + + + + + + + LOOP_GET_STATUS + + + + + + + + + + + + + + + + LOOP_SET_STATUS64 + + + + + + + + + + + + + + + + LOOP_GET_STATUS64 + + + + + + + + + + + + + + + + LOOP_SET_CAPACITY + + + + + + + + + + + + + + + + LOOP_SET_DIRECT_IO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LOOP_CTL_ADD + + + + + + + + + + + + + + + + LOOP_CTL_REMOVE + + + + + + + + + + + + + + + + LOOP_CTL_GET_FREE + + + + + + + + + + + + + + + + + + diff --git a/analysis/loop/class_diagram_loop_device.xmi b/analysis/loop/class_diagram_loop_device.xmi new file mode 100644 index 0000000..108027e --- /dev/null +++ b/analysis/loop/class_diagram_loop_device.xmi @@ -0,0 +1,1632 @@ + + + + + umbrello uml modeller http://umbrello.kde.org + 1.6.16 + UnicodeUTF8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/analysis/loop/class_diagram_loop_device_small.pdf b/analysis/loop/class_diagram_loop_device_small.pdf new file mode 100644 index 0000000..85b35f5 Binary files /dev/null and b/analysis/loop/class_diagram_loop_device_small.pdf differ diff --git a/analysis/loop/class_diagram_loop_device_small.svg b/analysis/loop/class_diagram_loop_device_small.svg new file mode 100644 index 0000000..71959a0 --- /dev/null +++ b/analysis/loop/class_diagram_loop_device_small.svg @@ -0,0 +1,8391 @@ + + +Qt SVG Document +Generated with Qt + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + + + + + + + + + + + + +1 + + + + + + + + + + + + ++fops + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + + + + + + + + + + + + +1 + + + + + + + + + + + + + + + + + + + + + + ++ops + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +loop_device + + + + + + + + + + + + +1 + + + + + + + + + + + + +1 + + + + + + + + + + + + ++private_data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +«use» + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +«implement» + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +blk_mq_tag_set + + + + + + + + + + + + +1 + + + + + + + + + + + + +1 + + + + + + + + + + + + ++tag_set + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +gendisk + + + + + + + + + + + + +1 + + + + + + + + + + + + +1 + + + + + + + + + + + + ++lo_disk + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +«use» + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +request_queue + + + + + + + + + + + + +1 + + + + + + + + + + + + +1 + + + + + + + + + + + + ++queue + + + + + + + + + + + + ++lo_queue + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +loop_device + + + + + + + + + + + + +1 + + + + + + + + + + + + +1 + + + + + + + + + + + + ++driver_data + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + + + + + + + + + + + + +1 + + + + + + + + + + + + ++fops + + + + + + + + + + + + ++loop_ctl_fops + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + + + + + + + + + + + + +1 + + + + + + + + + + + + ++loop_misc + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +1 + + + + + + + + + + + + +0..255 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +blk_mq_ops + + + + + + + + + + + + + + + + + + + + + + + + + ++ queue_rq : queue_rq_fn* = loop_queue_rq + + + + + + + + + + + + + + + + + + ++ complete : complete_fn* = lo_complete_rq + + + + + + + + + + + + + + + + + + ++ init_request : init_request_fn* = loop_init_request + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +blk_mq_tag_set + + + + + + + + + + + + + + + + + + + + + + + + + ++ map : struct blk_mq_queue_map[HCTX_MAX_TYPES] + + + + + + + + + + + + + + + + + + ++ nr_maps : unsigned int + + + + + + + + + + + + + + + + + + ++ ops : struct const blk_mq_ops* + + + + + + + + + + + + + + + + + + ++ nr_hw_queues : unsigned int + + + + + + + + + + + + + + + + + + ++ queue_depth : unsigned int + + + + + + + + + + + + + + + + + + ++ reserved_tags : unsigned int + + + + + + + + + + + + + + + + + + ++ cmd_size : unsigned int + + + + + + + + + + + + + + + + + + ++ numa_node : int + + + + + + + + + + + + + + + + + + ++ timeout : unsigned int + + + + + + + + + + + + + + + + + + ++ flags : unsigned int + + + + + + + + + + + + + + + + + + ++ driver_data : void* + + + + + + + + + + + + + + + + + + ++ tags : struct blk_mq_tags** + + + + + + + + + + + + + + + + + + ++ tag_list_lock : struct mutex + + + + + + + + + + + + + + + + + + ++ tag_list : struct list_head + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +«interface» + + + + + + + + + + + + + + + + + + +kernel_module + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ module_init() : int + + + + + + + + + + + + + + + + + + ++ module_exit() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +loop_devices + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ loop_add(l : struct loop_device**, i : int) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_remove(lo : struct loop_device*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_lookup(l : struct loop_device**, i : int) : int + + + + + + + + + + + + + + + + + + + + + + ++ find_free_cb(id : int, ptr : void*, data : void*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_probe(dev : dev_t, part : int*, data : void*) : struct kobject* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +loop_device + + + + + + + + + + + + + + + + + + + + + + + + + ++ lo_number : int + + + + + + + + + + + + + + + + + + ++ lo_refcnt : atomic_t + + + + + + + + + + + + + + + + + + ++ lo_offset : loff_t + + + + + + + + + + + + + + + + + + ++ lo_sizelimit : loff_t + + + + + + + + + + + + + + + + + + ++ lo_flags : int + + + + + + + + + + + + + + + + + + ++ transfer : int + + + + + + + + + + + + + + + + + + ++ lo_file_name : char[LO_NAME_SIZE] + + + + + + + + + + + + + + + + + + ++ lo_crypt_name : char[LO_NAME_SIZE] + + + + + + + + + + + + + + + + + + ++ lo_encrypt_key : char[LO_KEY_SIZE] + + + + + + + + + + + + + + + + + + ++ lo_encrypt_key_size : int + + + + + + + + + + + + + + + + + + ++ lo_encryption : struct loop_func_table* + + + + + + + + + + + + + + + + + + ++ lo_init : __u32[2] + + + + + + + + + + + + + + + + + + ++ lo_key_owner : kuid_t + + + + + + + + + + + + + + + + + + ++ ioctl : int + + + + + + + + + + + + + + + + + + ++ lo_backing_file : struct file* + + + + + + + + + + + + + + + + + + ++ lo_device : struct block_device* + + + + + + + + + + + + + + + + + + ++ key_data : void* + + + + + + + + + + + + + + + + + + ++ old_gfp_mask : gfp_t + + + + + + + + + + + + + + + + + + ++ lo_lock : spinlock_t + + + + + + + + + + + + + + + + + + ++ lo_state : int + + + + + + + + + + + + + + + + + + ++ worker : struct kthread_worker + + + + + + + + + + + + + + + + + + ++ worker_task : struct task_struct* + + + + + + + + + + + + + + + + + + ++ use_dio : bool + + + + + + + + + + + + + + + + + + ++ sysfs_inited : bool + + + + + + + + + + + + + + + + + + ++ lo_queue : struct request_queue* + + + + + + + + + + + + + + + + + + ++ tag_set : struct blk_mq_tag_set + + + + + + + + + + + + + + + + + + ++ lo_disk : struct gendisk* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ loop_attr_autoclear_show(lo : struct loop_device*, buf : char*) : ssize_t + + + + + + + + + + + + + + + + + + + + + + ++ loop_attr_backing_file_show(lo : struct loop_device*, buf : char*) : ssize_t + + + + + + + + + + + + + + + + + + + + + + ++ loop_attr_dio_show(lo : struct loop_device*, buf : char*) : ssize_t + + + + + + + + + + + + + + + + + + + + + + ++ loop_attr_offset_show(lo : struct loop_device*, buf : char*) : ssize_t + + + + + + + + + + + + + + + + + + + + + + ++ loop_attr_partscan_show(lo : struct loop_device*, buf : char*) : ssize_t + + + + + + + + + + + + + + + + + + + + + + ++ loop_attr_show(dev : struct device*, page : char*, (* callback)(struct loop_device *, char *, ) : ssize_t) : ssize_t + + + + + + + + + + + + + + + + + + + + + + ++ loop_attr_sizelimit_show(lo : struct loop_device*, buf : char*) : ssize_t + + + + + + + + + + + + + + + + + + + + + + ++ loop_change_fd(lo : struct loop_device*, bdev : struct block_device*, arg : unsigned int) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_clr_fd(lo : struct loop_device*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_config_discard(lo : struct loop_device*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_get_status(lo : struct loop_device*, info : struct loop_info64*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_get_status64(lo : struct loop_device*, arg : struct loop_info64*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_get_status_compat(lo : struct loop_device*, arg : struct compat_loop_info*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_get_status_old(lo : struct loop_device*, arg : struct loop_info*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_handle_cmd(cmd : struct loop_cmd*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_info64_from_compat(arg : struct const compat_loop_info*, info64 : struct loop_info64*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_info64_from_old(info : struct const loop_info*, info64 : struct loop_info64*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_info64_to_compat(info64 : struct const loop_info64*, arg : struct compat_loop_info*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_info64_to_old(info64 : struct const loop_info64*, info : struct loop_info*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_init_request(set : struct blk_mq_tag_set*, rq : struct request*, hctx_idx : unsigned int, numa_node : unsigned int) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_init_xfer(lo : struct loop_device*, xfer : struct loop_func_table*, i : struct const loop_info64*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_release_xfer(lo : struct loop_device*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_kthread_worker_fn(worker_ptr : void*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_prepare_queue(lo : struct loop_device*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_queue_rq(hctx : struct blk_mq_hw_ctx*, bd : struct const blk_mq_queue_data*) : blk_status_t + + + + + + + + + + + + + + + + + + + + + + ++ loop_queue_work(work : struct kthread_work*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_reread_partitions(lo : struct loop_device*, bdev : struct block_device*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_set_block_size(lo : struct loop_device*, arg : unsigned long) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_set_capacity(lo : struct loop_device*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_set_dio(lo : struct loop_device*, arg : unsigned long) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_set_fd(lo : struct loop_device*, mode : fmode_t, bdev : struct block_device*, arg : unsigned int) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_set_status(lo : struct loop_device*, info : struct const loop_info64*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_set_status64(lo : struct loop_device*, arg : struct const loop_info64*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_set_status_compat(lo : struct loop_device*, arg : struct const compat_loop_info*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_set_status_old(lo : struct loop_device*, __user : struct const loop_info) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_sysfs_exit(lo : struct loop_device*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_sysfs_init(lo : struct loop_device*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_unprepare_queue(lo : struct loop_device*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_update_dio(lo : struct loop_device*) + + + + + + + + + + + + + + + + + + + + + + ++ loop_validate_file(file : struct file*, bdev : struct block_device*) : int + + + + + + + + + + + + + + + + + + + + + + ++ is_loop_device(file : struct file*) : int + + + + + + + + + + + + + + + + + + + + + + ++ do_req_filebacked(lo : struct loop_device*, rq : struct request*) : int + + + + + + + + + + + + + + + + + + + + + + ++ figure_loop_size(lo : struct loop_device*, offset : loff_t, sizelimit : loff_t) : int + + + + + + + + + + + + + + + + + + + + + + ++ get_loop_size(lo : struct loop_device*, file : struct file*) : loff_t + + + + + + + + + + + + + + + + + + + + + + ++ get_size(offset : loff_t, sizelimit : loff_t, file : struct file*) : loff_t + + + + + + + + + + + + + + + + + + + + + + ++ lo_open(bdev : struct block_device*, mode : fmode_t) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_release(disk : struct gendisk*, mode : fmode_t) + + + + + + + + + + + + + + + + + + + + + + ++ lo_ioctl(bdev : struct block_device*, mode : fmode_t, cmd : unsigned int, arg : unsigned long) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_compat_ioctl(bdev : struct block_device*, mode : fmode_t, cmd : unsigned int, arg : unsigned long) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_simple_ioctl(lo : struct loop_device*, cmd : unsigned int, arg : unsigned long) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_do_transfer(lo : struct loop_device*, cmd : int, rpage : struct page*, roffs : unsigned, lpage : struct page*, loffs : unsigned, size : int, rblock : sector_t) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_complete_rq(rq : struct request*) + + + + + + + + + + + + + + + + + + + + + + ++ lo_read_simple(lo : struct loop_device*, rq : struct request*, pos : loff_t) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_read_transfer(lo : struct loop_device*, rq : struct request*, pos : loff_t) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_req_flush(lo : struct loop_device*, rq : struct request*) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_rw_aio(lo : struct loop_device*, cmd : struct loop_cmd*, pos : loff_t, rw : bool) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_rw_aio_complete(iocb : struct kiocb*, ret : long, ret2 : long) + + + + + + + + + + + + + + + + + + + + + + ++ lo_rw_aio_do_completion(cmd : struct loop_cmd*) + + + + + + + + + + + + + + + + + + + + + + ++ lo_write_bvec(file : struct file*, bvec : struct bio_vec*, ppos : loff_t*) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_write_simple(lo : struct loop_device*, rq : struct request*, pos : loff_t) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_write_transfer(lo : struct loop_device*, rq : struct request*, pos : loff_t) : int + + + + + + + + + + + + + + + + + + + + + + ++ lo_discard(lo : struct loop_device*, rq : struct request*, pos : loff_t) : int + + + + + + + + + + + + + + + + + + + + + + +- __loop_update_dio(lo : struct loop_device*, dio : bool) + + + + + + + + + + + + + + + + + + + + + + +- __loop_clr_fd(lo : struct loop_device*, release : bool) : int + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +loop_control + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ loop_control_ioctl(file : struct file*, cmd : unsigned int, parm : unsigned long) : long + + + + + + + + + + + + + + + + + + + + + + ++ loop_register_transfer(funcs : struct loop_func_table*) : int + + + + + + + + + + + + + + + + + + ++ loop_unregister_transfer(number : int) : int + + + + + + + + + + + + + + + + + + ++ unregister_transfer_cb(id : int, ptr : void*, data : void*) : int + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +file_operations + + + + + + + + + + + + + + + + + + + + + + + + + ++ owner : struct module* = THIS_MODULE + + + + + + + + + + + + + + + + + + ++ (*llseek)(struct file*, loff_t, int) : loff_t = noop_llseek + + + + + + + + + + + + + + + + + + ++ (*unlocked_ioctl)(struct file*, unsigned int, unsigned long) : long = loop_control_ioctl + + + + + + + + + + + + + + + + + + ++ (*compat_ioctl) (struct file*, unsigned int, unsigned long) : long = loop_control_ioctl + + + + + + + + + + + + + + + + + + ++ (*open)(struct inode*, struct file*) : int = nonseekable_open + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +loop_device_module + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ++ max_loop_setup(str : char*) : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_init() : int + + + + + + + + + + + + + + + + + + + + + + ++ loop_exit() + + + + + + + + + + + + + + + + + + + + + + ++ loop_exit_cb(id : int, ptr : void*, data : void*) : int + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +gendisk + + + + + + + + + + + + + + + + + + + + + + + + + ++ major : int + + + + + + + + + + + + + + + + + + ++ first_minor : int + + + + + + + + + + + + + + + + + + ++ minors : int + + + + + + + + + + + + + + + + + + ++ disk_name : char[DISK_NAME_LEN] + + + + + + + + + + + + + + + + + + ++ (*devnode)(gd : struct gendisk*, mode : umode_t*) : char* + + + + + + + + + + + + + + + + + + ++ events : unsigned int + + + + + + + + + + + + + + + + + + ++ async_events : unsigned int + + + + + + + + + + + + + + + + + + ++ part_tbl : struct disk_part_tbl* + + + + + + + + + + + + + + + + + + ++ part0 : struct hd_struct + + + + + + + + + + + + + + + + + + ++ fops : struct const block_device_operations* + + + + + + + + + + + + + + + + + + ++ queue : struct request_queue* + + + + + + + + + + + + + + + + + + ++ private_data : void* + + + + + + + + + + + + + + + + + + ++ flags : int + + + + + + + + + + + + + + + + + + ++ lookup_sem : struct rw_semaphore + + + + + + + + + + + + + + + + + + ++ slave_dir : struct kobject* + + + + + + + + + + + + + + + + + + ++ random : struct timer_rand_state* + + + + + + + + + + + + + + + + + + ++ sync_io : atomic_t + + + + + + + + + + + + + + + + + + ++ ev : struct disk_events* + + + + + + + + + + + + + + + + + + ++ node_id : int + + + + + + + + + + + + + + + + + + ++ bb : struct badblocks* + + + + + + + + + + + + + + + + + + ++ lockdep_map : struct lockdep_map + + + + + + + + + + + + + + + + + + +- integrity_kobj : struct kobject + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +block_device_operations + + + + + + + + + + + + + + + + + + + + + + + + + +- (*open)(struct block_device*, fmode_t) : int = lo_open + + + + + + + + + + + + + + + + + + ++ (*release)(struct gendisk*, fmode_t) : void = lo_release + + + + + + + + + + + + + + + + + + ++ (*ioctl)(struct block_device*, fmode_t, unsigned, unsigned long) : int = lo_ioctl + + + + + + + + + + + + + + + + + + ++ (*compat_ioctl)(struct block_device*, fmode_t, unsigned, unsigned long) : int = lo_compat_ioctl + + + + + + + + + + + + + + + + + + ++ owner : struct module* = THIS_MODULE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +miscdevice + + + + + + + + + + + + + + + + + + + + + + + + + +- minor : int = LOOP_CTRL_MINOR + + + + + + + + + + + + + + + + + + ++ name : const char* = "loop-control" + + + + + + + + + + + + + + + + + + ++ fops : struct const file_operations* = &loop_ctl_fops + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LOOP_SET_FD + + + + + + + + + + + + + + + + LOOP_CHANGE_FD + + + + + + + + + + + + + + + + LOOP_CLR_FD + + + + + + + + + + + + + + + + LOOP_SET_STATUS + + + + + + + + + + + + + + + + LOOP_GET_STATUS + + + + + + + + + + + + + + + + LOOP_SET_STATUS64 + + + + + + + + + + + + + + + + LOOP_GET_STATUS64 + + + + + + + + + + + + + + + + LOOP_SET_CAPACITY + + + + + + + + + + + + + + + + LOOP_SET_DIRECT_IO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LOOP_CTL_ADD + + + + + + + + + + + + + + + + LOOP_CTL_REMOVE + + + + + + + + + + + + + + + + LOOP_CTL_GET_FREE + + + + + + + + + + + + + + + + + + diff --git a/analysis/loop/class_diagram_loop_device_small.xmi b/analysis/loop/class_diagram_loop_device_small.xmi new file mode 100644 index 0000000..91a2d2e --- /dev/null +++ b/analysis/loop/class_diagram_loop_device_small.xmi @@ -0,0 +1,1522 @@ + + + + + umbrello uml modeller http://umbrello.kde.org + 1.6.16 + UnicodeUTF8 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/analysis/loop/sequence_diagram_loop_device_init_exit.pdf b/analysis/loop/sequence_diagram_loop_device_init_exit.pdf new file mode 100644 index 0000000..4ce08a9 Binary files /dev/null and b/analysis/loop/sequence_diagram_loop_device_init_exit.pdf differ diff --git a/analysis/loop/sequence_diagram_loop_device_init_exit.svg b/analysis/loop/sequence_diagram_loop_device_init_exit.svg new file mode 100644 index 0000000..b01c93d --- /dev/null +++ b/analysis/loop/sequence_diagram_loop_device_init_exit.svg @@ -0,0 +1 @@ +Loop device kernel moduleKernelLoop device kernel moduleKernelModuleLoop controlLoop deviceMISCBlkdevBlk-mqBlk-settingsBlk-coreGenhdmodule_initloop_initmisc_registercreate "loop-control"misc deviceregister_blkdevcreate "loop"block deviceblk_register_regionregister devicenumbersloop_addblk_mq_alloc_tag_setblk_mq_init_queueblk_queue_max_hw_sectorsblk_queue_flag_setalloc_diskadd_diskmodule_exitloop_exitloop_removedel_gendiskblk_cleanup_queueblk_mq_free_tag_setput_diskblk_unregister_regiondelete devicenumbersunregister_blkdevdelete "loop"block devicemisc_deregisterdelete "loop-control"misc deviceKernel module initloop[pre-create loop devices]Kernel module exitloop[delete loop devices] \ No newline at end of file diff --git a/analysis/loop/sequence_diagram_loop_device_init_exit.txt b/analysis/loop/sequence_diagram_loop_device_init_exit.txt new file mode 100644 index 0000000..1c04f40 --- /dev/null +++ b/analysis/loop/sequence_diagram_loop_device_init_exit.txt @@ -0,0 +1,187 @@ +title Loop device kernel module +participantgroup #lightyellow Kernel +participant Kernel +participantgroup #lightblue Loop device kernel module +participant Module +participant Loop control +participant Loop device +end +participant MISC +participant Blkdev +participant Blk-mq +participant Blk-settings +participant Blk-core +participant Genhd +end + +group Kernel module init +activate Kernel + +Kernel->Module:module_init +activate Module +deactivate Kernel +Module->Loop control:loop_init +deactivate Module +activate Loop control +Loop control->MISC:misc_register +deactivate Loop control +activate MISC +note right of MISC:create "loop-control"\nmisc device +Loop control<--MISC: +deactivate MISC +activate Loop control +Loop control->Blkdev:register_blkdev +deactivate Loop control +activate Blkdev +note right of Blkdev:create "loop"\nblock device +Loop control<--Blkdev: +activate Loop control +deactivate Blkdev +Loop control->Genhd:blk_register_region +deactivate Loop control +activate Genhd +note right of Genhd:register device\nnumbers +Loop control<--Genhd: +deactivate Genhd +activate Loop control + +loop pre-create loop devices +Loop control->Loop device:loop_add +deactivate Loop control +activate Loop device +Loop device->Blk-mq:blk_mq_alloc_tag_set +activate Blk-mq +deactivate Loop device +Loop device<--Blk-mq: +deactivate Blk-mq +activate Loop device +Loop device->Blk-mq:blk_mq_init_queue +activate Blk-mq +deactivate Loop device +Loop device<--Blk-mq: +deactivate Blk-mq +activate Loop device +Loop device->Blk-settings:blk_queue_max_hw_sectors +activate Blk-settings +deactivate Loop device +Loop device<--Blk-settings: +deactivate Blk-settings + +activate Loop device +Loop device->Blk-core:blk_queue_flag_set +activate Blk-core +deactivate Loop device +Loop device<--Blk-core: +deactivate Blk-core + +activate Loop device +Loop device->Genhd:alloc_disk +activate Genhd +deactivate Loop device +Loop device<--Genhd: +deactivate Genhd + +activate Loop device +Loop device->Genhd:add_disk +activate Genhd +deactivate Loop device +Loop device<--Genhd: +deactivate Genhd + +activate Loop device +Loop control<--Loop device: +deactivate Loop device +activate Loop control +end + +Module<--Loop control: +deactivate Loop control +activate Module +Kernel<--Module: +deactivate Module +activate Kernel +space +deactivate Kernel +end + +group Kernel module exit +activate Kernel +Kernel->Module:module_exit +deactivate Kernel +activate Module +Module->Loop control:loop_exit +deactivate Module +activate Loop control + + +loop delete loop devices +Loop control->Loop device:loop_remove +deactivate Loop control + +activate Loop device +Loop device->Genhd:del_gendisk +activate Genhd +deactivate Loop device +Loop device<--Genhd: +deactivate Genhd + +activate Loop device +Loop device->Blk-core:blk_cleanup_queue +activate Blk-core +deactivate Loop device +Loop device<--Blk-core: +deactivate Blk-core + +activate Loop device +Loop device->Blk-mq:blk_mq_free_tag_set +activate Blk-mq +deactivate Loop device +Loop device<--Blk-mq: +deactivate Blk-mq + +activate Loop device +Loop device->Genhd:put_disk +activate Genhd +deactivate Loop device +Loop device<--Genhd: +deactivate Genhd + +activate Loop device +Loop control<--Loop device: +deactivate Loop device +activate Loop control +end + +Loop control->Genhd:blk_unregister_region +deactivate Loop control +activate Genhd +note right of Genhd:delete device\nnumbers +Loop control<--Genhd: +deactivate Genhd +activate Loop control + +Loop control->Blkdev:unregister_blkdev +deactivate Loop control +activate Blkdev +note right of Blkdev:delete "loop"\nblock device +Loop control<--Blkdev: +deactivate Blkdev +activate Loop control + +Loop control->MISC:misc_deregister +deactivate Loop control +activate MISC +note right of MISC:delete "loop-control"\nmisc device +Loop control<--MISC: +deactivate MISC + +activate Loop control +Module<--Loop control: +deactivate Loop control + +activate Module +Kernel<--Module: +deactivate Module + +activate Kernel +end \ No newline at end of file -- cgit v1.2.3-55-g7522