@@ -19,4 +19,77 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
19
19
......
20
20
mddev = bdev->bd_disk->private_data;
21
21
22
- ```
22
+ ```
23
+
24
+
25
+ ```
26
+ if (cmd == SET_ARRAY_INFO) {
27
+ mdu_array_info_t info;
28
+ if (!arg)
29
+ memset(&info, 0, sizeof(info));
30
+ else if (copy_from_user(&info, argp, sizeof(info))) {
31
+ err = -EFAULT;
32
+ goto unlock;
33
+ }
34
+ ```
35
+
36
+
37
+ ```
38
+ (gdb) p info
39
+ $36 = {major_version = 1, minor_version = 2, patch_version = 0, ctime = 0, level = 0, size = 0,
40
+ nr_disks = 0, raid_disks = 0, md_minor = 0, not_persistent = 0, utime = 0, state = 0,
41
+ active_disks = 0, working_disks = 0, failed_disks = 0, spare_disks = 0, layout = 0,
42
+ chunk_size = 0}
43
+ ```
44
+
45
+
46
+
47
+ ```
48
+ if (mddev->pers) {
49
+ err = update_array_info(mddev, &info);
50
+ if (err) {
51
+ printk(KERN_WARNING "md: couldn't update"
52
+ " array info. %d\n", err);
53
+ goto unlock;
54
+ }
55
+ goto unlock;
56
+ }
57
+ if (!list_empty(&mddev->disks)) {
58
+ printk(KERN_WARNING
59
+ "md: array %s already has disks!\n",
60
+ mdname(mddev));
61
+ err = -EBUSY;
62
+ goto unlock;
63
+ }
64
+ if (mddev->raid_disks) {
65
+ printk(KERN_WARNING
66
+ "md: array %s already initialised!\n",
67
+ mdname(mddev));
68
+ err = -EBUSY;
69
+ goto unlock;
70
+ }
71
+ ```
72
+
73
+ 아직 생성이 안된 md 디스크이기때문에 mddev 객체에는 아무 정보도 없습니다.
74
+ ```
75
+ (gdb) p mddev->pers
76
+ $39 = (struct md_personality *) 0x0 <irq_stack_union>
77
+ (gdb) p mddev->raid_disks
78
+ $37 = 0
79
+ (gdb) p mddev->disks
80
+ $38 = {next = 0xffff880006832818, prev = 0xffff880006832818}
81
+ ```
82
+
83
+
84
+ ```
85
+ err = set_array_info(mddev, &info);
86
+ if (err) {
87
+ printk(KERN_WARNING "md: couldn't set"
88
+ " array info. %d\n", err);
89
+ goto unlock;
90
+ }
91
+ goto unlock;
92
+ }
93
+ ```
94
+
95
+
0 commit comments