|
|
1.1 root 1: LogicalDisk and NXDisk notes
2:
3:
4: r/w
5: device: raw, block - _blockSize = dtp->d_secsize
6: live - _blockSize = physical block size
7: limitations: works on live as long as disk is formatted (checked by
8: phys device)
9: works on raw and block only when label valid (checked by
10: NXDisk)
11: effects: faults in non-present disk (by LogicalDisk)
12:
13: read label
14: device: raw (any partition?)
15: limitations: physDev must be formatted (checked by NXDisk)
16: effects: faults in non-present disk (by NXDisk)
17:
18: write label
19: device: raw (any partition?)
20: limitations: physDev must be formatted (checked by NXDisk)
21: no block devices must be open (currently, maybe this won't
22: work...)
23: effects: frees all block devices
24: does a _probeLabel:, possibly creating new instances
25:
26: eject
27: device: raw
28: limitations: rejected by IODiskDevice ejectDisk if:
29: -- not removable
30: -- any block devices are open
31: -- physDevice and any logical disks attached
32: rejected by NXDisk devEjectDisk if not raw device
33: effects: formatted = 0 by [IODiskDevice ejectDisk]
34: all block devices freed by {NXDisk devEjectDisk]
35: label invalid by [NXDisk devEjectDisk]
36:
37: set formatted
38: device: raw
39: limitations: no logical disks upstream can be open (checked in
40: IODiskDevice's setFormatted:)
41: effects: calls getPhysParams if setting formatted true
42: calls setFormattedInt - this frees all block devices and
43: negates labelValid in NXDisk
44:
45: faulting in non-present disk
46: device: live, raw partition 0 (other raw partitions non-existent
47: when no disk present)
48: limitations: none
49: effects: NXDiskProbe invoked by volCheck thread. This reads a label
50: and creates NXDisk partition instances per label info.
51: volCheck thread blocks the whole time NXDiskProbe
52: is running.
53:
54: NXDiskProbe
55: device: none - NXDisk factory method, operates on physDevice
56: limitations: none - called ragardless of physDev state
57: effects: AS IS:
58: creates raw device if one doesn't exist
59: registerUnixDisk for both physDev and raw device
60: check ready loop, init lastReadyState
61: getPhysParams if newly ready
62: if not formatted or not ready, done
63: read a label
64: if good, probeLabel:
65:
66: probeLabel
67: device: raw
68: limitations: assumes that label is good and disk is present
69: effects: updates state of raw dev params per label
70: creates and inits one block device per partition
71:
72: .............
73: Changes:
74:
75: Instead of "are any logical disks upstream open" ([IOLoogicalDisk isOpen]) we really need "are any other logical disks in the chain other than me". This is for hazardous ops on the raw device like eject and setFormatted which require this to be the only open device.
76:
77: IOLogicalDisk anyOtherOpen
78: {
79: logicalDisk = [physDev logicalDisk];
80: while(logicalDisk) {
81: if(logicalDisk != self) {
82: if([logicalDisk diskIsOpen]
83: return 1;
84: }
85: logicalDisk = [logicalDisk logicalDisk];
86: }
87: }
88: ................
89:
90: Just have one NXDisk instance per partition. At the NXDisk level there is almost no difference between a block device and a raw device. Change "_diskIsOpen" to "blockDevOpen" and "RawDevOpen". Sometime we only care if any block devices are open (like when writing a label or ejecting); sometimes we want to know if ANY "other" devices are open (use anyOtherOpen).
91: ................
92: setting the formatted flag - current implementation is hosed.
93: Sould be:
94:
95: device: NXDisk (though has to work properly on live device!)
96: limitations: no other logical disks can be open
97: no block devices can be open
98: (Both checked in [IODiskDevice setFormatted]
99: effects: invalidates label
100: frees all NXDisks except for first one
101: updates physParams for physDevice of setting formatted TRUE
102:
103: /*
104: * Public version for physDevice.
105: */
106: IODiskDevice setFormatted
107: {
108: if ANY logical disks open
109: abort
110: update _formatted;
111: if setting true, [self getPhysParams]
112: if logicalDisk {
113: [logicalDisk setFormattedInt]
114: }
115: }
116:
117: /*
118: * Public version for NXDisk.
119: */
120: NXDisk setFormatted
121: {
122: if any block devices open
123: abort
124: if any other logical devices open
125: abort
126: [physDev setFormattedInt]
127: if setting true
128: [physDev getPhysParams]
129: [self setFormattedInt]
130: }
131:
132: /*
133: * Internal version for physDevice.
134: */
135: IODiskDevice setFormattedInt
136: {
137: update _formatted;
138: }
139:
140: /*
141: * Internal version for NXDisk.
142: */
143: NXDisk setFormattedInt
144: {
145: free NXDisks other than partition 0
146: mark label invalid and update _formatted;
147: }
148:
149: ............
150:
151: other new restrictions:
152:
153: anything that blows away NXDisk instances (write label, eject, setFormatted) must be done on the 'a' partition since that's the only one which survives. I think this should be reasonable restriction....
154: .............
155:
156: ejecting - kind of like setFormatted...
157:
158: IODiskDevice ejectDisk
159: {
160: if ANY logical disks attached
161: abort
162: [self devEjectDisk]; // to subclass, like SCSIDisk...
163: _formatted = 0;
164: }
165:
166: NXDisk ejectDisk
167: {
168: if any block devices open
169: abort
170: if any other logical devices open
171: abort
172: if this not partition 0
173: abort
174: [physDev devEjectDisk]
175: invalidate label
176: freePartitions
177: }
178:
179: IODiskDevice devEjectDisk
180: {
181: ...implemented by subclass...
182: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.