Index: user/glebius/course/08.io2/kern.geom.conf.dot =================================================================== --- user/glebius/course/08.io2/kern.geom.conf.dot (nonexistent) +++ user/glebius/course/08.io2/kern.geom.conf.dot (revision 258674) @@ -0,0 +1,191 @@ +digraph geom { +z0xfffff800045c0900 [shape=box,label="VFS\nffs.ada2p1\nr#3"]; +z0xfffff8000452d800 [label="r1w1e1"]; +z0xfffff8000452d800 -> z0xfffff800045bea00; +z0xfffff800045c0900 -> z0xfffff8000452d800; +z0xfffff800045f6800 [shape=box,label="VFS\nffs.ada1p4\nr#3"]; +z0xfffff80004507900 [label="r1w1e1"]; +z0xfffff80004507900 -> z0xfffff80004520800; +z0xfffff800045f6800 -> z0xfffff80004507900; +z0xfffff80004927200 [shape=box,label="VFS\nffs.ada1p3\nr#3"]; +z0xfffff80004582c80 [label="r1w1e1"]; +z0xfffff80004582c80 -> z0xfffff80004520a00; +z0xfffff80004927200 -> z0xfffff80004582c80; +z0xfffff800045f6100 [shape=box,label="VFS\nffs.ada1p5\nr#3"]; +z0xfffff800045ae500 [label="r1w1e1"]; +z0xfffff800045ae500 -> z0xfffff80004520600; +z0xfffff800045f6100 -> z0xfffff800045ae500; +z0xfffff800045f6600 [shape=box,label="SWAP\nswap\nr#3"]; +z0xfffff800045ae080 [label="r1w1e0"]; +z0xfffff800045ae080 -> z0xfffff80004520c00; +z0xfffff800045f6600 -> z0xfffff800045ae080; +z0xfffff8010ed01a00 [shape=box,label="DISK\nda1\nr#1"]; +z0xfffff8010ed99700 [shape=hexagon,label="da1\nr0w0e0\nerr#0"]; +z0xfffff8010ed99700 -> z0xfffff8010ed01a00; +z0xfffff8010ecf8700 [shape=box,label="DISK\nda0\nr#1"]; +z0xfffff8010ec89200 [shape=hexagon,label="da0\nr0w0e0\nerr#0"]; +z0xfffff8010ec89200 -> z0xfffff8010ecf8700; +z0xfffff800043dad00 [shape=box,label="DISK\ncd0\nr#1"]; +z0xfffff800043dac00 [shape=hexagon,label="cd0\nr0w0e0\nerr#0"]; +z0xfffff800043dac00 -> z0xfffff800043dad00; +z0xfffff80004520400 [shape=box,label="DISK\nada2\nr#1"]; +z0xfffff80004520000 [shape=hexagon,label="ada2\nr1w1e2\nerr#0"]; +z0xfffff80004520000 -> z0xfffff80004520400; +z0xfffff80004522900 [shape=box,label="DISK\nada1\nr#1"]; +z0xfffff80004522800 [shape=hexagon,label="ada1\nr4w4e7\nerr#0"]; +z0xfffff80004522800 -> z0xfffff80004522900; +z0xfffff80004522c00 [shape=box,label="DISK\nada0\nr#1"]; +z0xfffff80004522b00 [shape=hexagon,label="ada0\nr0w0e0\nerr#0"]; +z0xfffff80004522b00 -> z0xfffff80004522c00; +z0xfffff8010ec8a600 [shape=box,label="DEV\nmsdosfs/NO_NAME\nr#4"]; +z0xfffff8010e08a580 [label="r0w0e0"]; +z0xfffff8010e08a580 -> z0xfffff8010ecf8c00; +z0xfffff8010ec8a600 -> z0xfffff8010e08a580; +z0xfffff8010ee04c00 [shape=box,label="DEV\nda1\nr#2"]; +z0xfffff800859a9e00 [label="r0w0e0"]; +z0xfffff800859a9e00 -> z0xfffff8010ed99700; +z0xfffff8010ee04c00 -> z0xfffff800859a9e00; +z0xfffff8010ef0bb00 [shape=box,label="DEV\nda0s1\nr#3"]; +z0xfffff800853c1080 [label="r0w0e0"]; +z0xfffff800853c1080 -> z0xfffff8010ef14500; +z0xfffff8010ef0bb00 -> z0xfffff800853c1080; +z0xfffff8010ec82c00 [shape=box,label="DEV\nda0\nr#2"]; +z0xfffff8010ef1e580 [label="r0w0e0"]; +z0xfffff8010ef1e580 -> z0xfffff8010ec89200; +z0xfffff8010ec82c00 -> z0xfffff8010ef1e580; +z0xfffff800045bed00 [shape=box,label="DEV\nada2p1\nr#3"]; +z0xfffff800045dc580 [label="r0w0e0"]; +z0xfffff800045dc580 -> z0xfffff800045bea00; +z0xfffff800045bed00 -> z0xfffff800045dc580; +z0xfffff800045c1800 [shape=box,label="DEV\ngptid/d4d0af71-4f14-11e3-a99e-002215734f17\nr#4"]; +z0xfffff8000452d080 [label="r0w0e0"]; +z0xfffff8000452d080 -> z0xfffff800045c1500; +z0xfffff800045c1800 -> z0xfffff8000452d080; +z0xfffff800043da700 [shape=box,label="DEV\ndiskid/DISK-5MS02EWGs2\nr#4"]; +z0xfffff8000452d180 [label="r0w0e0"]; +z0xfffff8000452d180 -> z0xfffff800043da600; +z0xfffff800043da700 -> z0xfffff8000452d180; +z0xfffff8000457e500 [shape=box,label="DEV\ndiskid/DISK-5MS02EWGs1\nr#4"]; +z0xfffff8000452d280 [label="r0w0e0"]; +z0xfffff8000452d280 -> z0xfffff800043da800; +z0xfffff8000457e500 -> z0xfffff8000452d280; +z0xfffff800043dab00 [shape=box,label="DEV\nntfs/System%20Reserved\nr#4"]; +z0xfffff8000452d380 [label="r0w0e0"]; +z0xfffff8000452d380 -> z0xfffff8000457e600; +z0xfffff800043dab00 -> z0xfffff8000452d380; +z0xfffff800043dae00 [shape=box,label="DEV\ncd0\nr#2"]; +z0xfffff8000452d480 [label="r0w0e0"]; +z0xfffff8000452d480 -> z0xfffff800043dac00; +z0xfffff800043dae00 -> z0xfffff8000452d480; +z0xfffff80004520100 [shape=box,label="DEV\nada2\nr#2"]; +z0xfffff8000452d600 [label="r0w0e0"]; +z0xfffff8000452d600 -> z0xfffff80004520000; +z0xfffff80004520100 -> z0xfffff8000452d600; +z0xfffff80004520700 [shape=box,label="DEV\nada1p5\nr#3"]; +z0xfffff8000452da80 [label="r0w0e0"]; +z0xfffff8000452da80 -> z0xfffff80004520600; +z0xfffff80004520700 -> z0xfffff8000452da80; +z0xfffff80004520900 [shape=box,label="DEV\nada1p4\nr#3"]; +z0xfffff8000452dc00 [label="r0w0e0"]; +z0xfffff8000452dc00 -> z0xfffff80004520800; +z0xfffff80004520900 -> z0xfffff8000452dc00; +z0xfffff80004520b00 [shape=box,label="DEV\nada1p3\nr#3"]; +z0xfffff8000452dd00 [label="r0w0e0"]; +z0xfffff8000452dd00 -> z0xfffff80004520a00; +z0xfffff80004520b00 -> z0xfffff8000452dd00; +z0xfffff80004520d00 [shape=box,label="DEV\nada1p2\nr#3"]; +z0xfffff8000452de00 [label="r0w0e0"]; +z0xfffff8000452de00 -> z0xfffff80004520c00; +z0xfffff80004520d00 -> z0xfffff8000452de00; +z0xfffff80004521500 [shape=box,label="DEV\nada1p1\nr#3"]; +z0xfffff8000452de80 [label="r0w0e0"]; +z0xfffff8000452de80 -> z0xfffff80004520e00; +z0xfffff80004521500 -> z0xfffff8000452de80; +z0xfffff80004521900 [shape=box,label="DEV\ndiskid/DISK-5MS02EWG\nr#3"]; +z0xfffff800045ae700 [label="r0w0e0"]; +z0xfffff800045ae700 -> z0xfffff80004521600; +z0xfffff80004521900 -> z0xfffff800045ae700; +z0xfffff80004521b00 [shape=box,label="DEV\nada0s2\nr#3"]; +z0xfffff8000458a680 [label="r0w0e0"]; +z0xfffff8000458a680 -> z0xfffff80004521a00; +z0xfffff80004521b00 -> z0xfffff8000458a680; +z0xfffff80004521d00 [shape=box,label="DEV\nada0s1\nr#3"]; +z0xfffff8000452f100 [label="r0w0e0"]; +z0xfffff8000452f100 -> z0xfffff80004521c00; +z0xfffff80004521d00 -> z0xfffff8000452f100; +z0xfffff80004522a00 [shape=box,label="DEV\nada1\nr#2"]; +z0xfffff8000452f580 [label="r0w0e0"]; +z0xfffff8000452f580 -> z0xfffff80004522800; +z0xfffff80004522a00 -> z0xfffff8000452f580; +z0xfffff80004522e00 [shape=box,label="DEV\nada0\nr#2"]; +z0xfffff8000441f900 [label="r0w0e0"]; +z0xfffff8000441f900 -> z0xfffff80004522b00; +z0xfffff80004522e00 -> z0xfffff8000441f900; +z0xfffff80085fc4800 [shape=box,label="PART\nda0\nr#2"]; +z0xfffff8010ef1e980 [label="r0w0e0"]; +z0xfffff8010ef1e980 -> z0xfffff8010ec89200; +z0xfffff80085fc4800 -> z0xfffff8010ef1e980; +z0xfffff8010ef14500 [shape=hexagon,label="da0s1\nr0w0e0\nerr#0"]; +z0xfffff8010ef14500 -> z0xfffff80085fc4800; +z0xfffff800045bec00 [shape=box,label="PART\nada2\nr#2"]; +z0xfffff8000452d580 [label="r1w1e2"]; +z0xfffff8000452d580 -> z0xfffff80004520000; +z0xfffff800045bec00 -> z0xfffff8000452d580; +z0xfffff800045bea00 [shape=hexagon,label="ada2p1\nr1w1e1\nerr#0"]; +z0xfffff800045bea00 -> z0xfffff800045bec00; +z0xfffff800043da900 [shape=box,label="PART\ndiskid/DISK-5MS02EWG\nr#3"]; +z0xfffff8000452e080 [label="r0w0e0"]; +z0xfffff8000452e080 -> z0xfffff80004521600; +z0xfffff800043da900 -> z0xfffff8000452e080; +z0xfffff800043da600 [shape=hexagon,label="diskid/DISK-5MS02EWGs2\nr0w0e0\nerr#0"]; +z0xfffff800043da600 -> z0xfffff800043da900; +z0xfffff800043da800 [shape=hexagon,label="diskid/DISK-5MS02EWGs1\nr0w0e0\nerr#0"]; +z0xfffff800043da800 -> z0xfffff800043da900; +z0xfffff80004521800 [shape=box,label="PART\nada1\nr#2"]; +z0xfffff8000452f480 [label="r4w4e7"]; +z0xfffff8000452f480 -> z0xfffff80004522800; +z0xfffff80004521800 -> z0xfffff8000452f480; +z0xfffff80004520600 [shape=hexagon,label="ada1p5\nr1w1e1\nerr#0"]; +z0xfffff80004520600 -> z0xfffff80004521800; +z0xfffff80004520800 [shape=hexagon,label="ada1p4\nr1w1e1\nerr#0"]; +z0xfffff80004520800 -> z0xfffff80004521800; +z0xfffff80004520a00 [shape=hexagon,label="ada1p3\nr1w1e1\nerr#0"]; +z0xfffff80004520a00 -> z0xfffff80004521800; +z0xfffff80004520c00 [shape=hexagon,label="ada1p2\nr1w1e0\nerr#0"]; +z0xfffff80004520c00 -> z0xfffff80004521800; +z0xfffff80004520e00 [shape=hexagon,label="ada1p1\nr0w0e0\nerr#0"]; +z0xfffff80004520e00 -> z0xfffff80004521800; +z0xfffff80004522600 [shape=box,label="PART\nada0\nr#2"]; +z0xfffff8000441f880 [label="r0w0e0"]; +z0xfffff8000441f880 -> z0xfffff80004522b00; +z0xfffff80004522600 -> z0xfffff8000441f880; +z0xfffff80004521a00 [shape=hexagon,label="ada0s2\nr0w0e0\nerr#0"]; +z0xfffff80004521a00 -> z0xfffff80004522600; +z0xfffff80004521c00 [shape=hexagon,label="ada0s1\nr0w0e0\nerr#0"]; +z0xfffff80004521c00 -> z0xfffff80004522600; +z0xfffff80004ff6c00 [shape=box,label="LABEL\nda0s1\nr#3"]; +z0xfffff8010e0b3a00 [label="r0w0e0"]; +z0xfffff8010e0b3a00 -> z0xfffff8010ef14500; +z0xfffff80004ff6c00 -> z0xfffff8010e0b3a00; +z0xfffff8010ecf8c00 [shape=hexagon,label="msdosfs/NO_NAME\nr0w0e0\nerr#0"]; +z0xfffff8010ecf8c00 -> z0xfffff80004ff6c00; +z0xfffff800045c1600 [shape=box,label="LABEL\nada1p1\nr#3"]; +z0xfffff8000452dd80 [label="r0w0e0"]; +z0xfffff8000452dd80 -> z0xfffff80004520e00; +z0xfffff800045c1600 -> z0xfffff8000452dd80; +z0xfffff800045c1500 [shape=hexagon,label="gptid/d4d0af71-4f14-11e3-a99e-002215734f17\nr0w0e0\nerr#0"]; +z0xfffff800045c1500 -> z0xfffff800045c1600; +z0xfffff8000457e700 [shape=box,label="LABEL\nada0s1\nr#3"]; +z0xfffff8000452f000 [label="r0w0e0"]; +z0xfffff8000452f000 -> z0xfffff80004521c00; +z0xfffff8000457e700 -> z0xfffff8000452f000; +z0xfffff8000457e600 [shape=hexagon,label="ntfs/System%20Reserved\nr0w0e0\nerr#0"]; +z0xfffff8000457e600 -> z0xfffff8000457e700; +z0xfffff80004521700 [shape=box,label="LABEL\nada0\nr#2"]; +z0xfffff8000452f500 [label="r0w0e0"]; +z0xfffff8000452f500 -> z0xfffff80004522b00; +z0xfffff80004521700 -> z0xfffff8000452f500; +z0xfffff80004521600 [shape=hexagon,label="diskid/DISK-5MS02EWG\nr0w0e0\nerr#0"]; +z0xfffff80004521600 -> z0xfffff80004521700; +} + Index: user/glebius/course/08.io2/kern.geom.conf.png =================================================================== Cannot display: file marked as a binary type. svn:mime-type = image/png Property changes on: user/glebius/course/08.io2/kern.geom.conf.png ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +image/png \ No newline at end of property Index: user/glebius/course/08.io2/kern.geom.conf.xml =================================================================== --- user/glebius/course/08.io2/kern.geom.conf.xml (nonexistent) +++ user/glebius/course/08.io2/kern.geom.conf.xml (revision 258674) @@ -0,0 +1,860 @@ + + + FD + + + VFS + + + ffs.ada2p1 + 3 + + + + r1w1e1 + + + + + ffs.ada1p4 + 3 + + + + r1w1e1 + + + + + ffs.ada1p3 + 3 + + + + r1w1e1 + + + + + ffs.ada1p5 + 3 + + + + r1w1e1 + + + + + SWAP + + + swap + 3 + + + + r1w1e0 + + + + + DISK + + + da1 + 1 + + + + + r0w0e0 + da1 + 62914560 + 512 + 0 + 0 + + 64 + 32 + + MEDIATEK FLASH DISK + + + + + + da0 + 1 + + + + + r0w0e0 + da0 + 15931539456 + 512 + 0 + 0 + + 255 + 63 + + MEDIATEK FLASH DISK + + + + + + cd0 + 1 + + + + + r0w0e0 + cd0 + 0 + 2048 + 0 + 0 + + 0 + 0 + + TEAC DV-W518GM + + + + + + ada2 + 1 + + + + + r1w1e2 + ada2 + 1000204886016 + 512 + 0 + 0 + + 16 + 63 + 9QJ10GCN + 5000c5000d425c24 + ST31000340NS + + + + + + ada1 + 1 + + + + + r4w4e7 + ada1 + 80026361856 + 512 + 0 + 0 + + 16 + 63 + 5JV9KQLH + ST380013AS + + + + + + ada0 + 1 + + + + + r0w0e0 + ada0 + 120034123776 + 512 + 0 + 0 + + 16 + 63 + 5MS02EWG + ST3120827AS + + + + + + DEV + + + msdosfs/NO_NAME + 4 + + + + r0w0e0 + + + + + da1 + 2 + + + + r0w0e0 + + + + + da0s1 + 3 + + + + r0w0e0 + + + + + da0 + 2 + + + + r0w0e0 + + + + + ada2p1 + 3 + + + + r0w0e0 + + + + + gptid/d4d0af71-4f14-11e3-a99e-002215734f17 + 4 + + + + r0w0e0 + + + + + diskid/DISK-5MS02EWGs2 + 4 + + + + r0w0e0 + + + + + diskid/DISK-5MS02EWGs1 + 4 + + + + r0w0e0 + + + + + ntfs/System%20Reserved + 4 + + + + r0w0e0 + + + + + cd0 + 2 + + + + r0w0e0 + + + + + ada2 + 2 + + + + r0w0e0 + + + + + ada1p5 + 3 + + + + r0w0e0 + + + + + ada1p4 + 3 + + + + r0w0e0 + + + + + ada1p3 + 3 + + + + r0w0e0 + + + + + ada1p2 + 3 + + + + r0w0e0 + + + + + ada1p1 + 3 + + + + r0w0e0 + + + + + diskid/DISK-5MS02EWG + 3 + + + + r0w0e0 + + + + + ada0s2 + 3 + + + + r0w0e0 + + + + + ada0s1 + 3 + + + + r0w0e0 + + + + + ada1 + 2 + + + + r0w0e0 + + + + + ada0 + 2 + + + + r0w0e0 + + + + + PART + + + da0 + 2 + + MBR + 4 + 63 + 31116287 + 63 + 255 + OK + false + + + + + r0w0e0 + + + + + + r0w0e0 + da0s1 + 15927345152 + 512 + 0 + 4194304 + + 8192 + 31116287 + 1 + !12 + 4194304 + 15927345152 + 12 + + + + + + ada2 + 2 + + GPT + 128 + 34 + 1953525134 + 63 + 16 + OK + false + + + + + r1w1e2 + + + + + + r1w1e1 + ada2p1 + 1000204851712 + 512 + 0 + 17408 + + 34 + 1953525134 + 1 + freebsd-ufs + 17408 + 1000204851712 + + 516e7cb6-6ecf-11d6-8ff8-00022d09712b + aeb923e7-5b68-11de-9b01-002215734f17 + + + + + + diskid/DISK-5MS02EWG + 3 + + MBR + 4 + 63 + 234441647 + 63 + 16 + OK + false + + + + + r0w0e0 + + + + + + r0w0e0 + diskid/DISK-5MS02EWGs2 + 119664541696 + 512 + 0 + 368050176 + + 718848 + 234438655 + 2 + ntfs + 368050176 + 119664541696 + 7 + + + + + r0w0e0 + diskid/DISK-5MS02EWGs1 + 367001600 + 512 + 0 + 1048576 + + 2048 + 718847 + 1 + ntfs + 1048576 + 367001600 + 7 + active + + + + + + ada1 + 2 + + GPT + 128 + 34 + 156301454 + 63 + 16 + OK + false + + + + + r4w4e7 + + + + + + r1w1e1 + ada1p5 + 2147436544 + 512 + 0 + 64512 + + 126 + 4194337 + 5 + freebsd-ufs + 64512 + 2147436544 + + bootme + 516e7cb6-6ecf-11d6-8ff8-00022d09712b + dde64000-4f14-11e3-a99e-002215734f17 + + + + + r1w1e1 + ada1p4 + 69288909312 + 512 + 0 + 2147501056 + + 20971554 + 156301454 + 4 + freebsd-ufs + 10737435648 + 69288909312 + + 516e7cb6-6ecf-11d6-8ff8-00022d09712b + f2debecc-4e91-11e3-9a26-002215734f17 + + + + + r1w1e1 + ada1p3 + 4294967296 + 512 + 0 + 2147501056 + + 12582946 + 20971553 + 3 + freebsd-ufs + 6442468352 + 4294967296 + + 516e7cb6-6ecf-11d6-8ff8-00022d09712b + ebe8528e-4e91-11e3-9a26-002215734f17 + + + + + r1w1e0 + ada1p2 + 4294967296 + 512 + 0 + 2147501056 + + 4194338 + 12582945 + 2 + freebsd-swap + 2147501056 + 4294967296 + + 516e7cb5-6ecf-11d6-8ff8-00022d09712b + de5224ef-4e91-11e3-9a26-002215734f17 + + + + + r0w0e0 + ada1p1 + 47104 + 512 + 0 + 17408 + + 34 + 125 + 1 + freebsd-boot + 17408 + 47104 + + 83bd6b9d-7f41-11dc-be0b-001560b84f0f + d4d0af71-4f14-11e3-a99e-002215734f17 + + + + + + ada0 + 2 + + MBR + 4 + 63 + 234441647 + 63 + 16 + OK + false + + + + + r0w0e0 + + + + + + r0w0e0 + ada0s2 + 119664541696 + 512 + 0 + 368050176 + + 718848 + 234438655 + 2 + ntfs + 368050176 + 119664541696 + 7 + + + + + r0w0e0 + ada0s1 + 367001600 + 512 + 0 + 1048576 + + 2048 + 718847 + 1 + ntfs + 1048576 + 367001600 + 7 + active + + + + + + LABEL + + + da0s1 + 3 + + + + + + r0w0e0 + + + + + + r0w0e0 + msdosfs/NO_NAME + 15927345152 + 512 + 0 + 4194304 + + 0 + 15927345152 + 31108096 + 0 + 0 + + + + + + ada1p1 + 3 + + + + + + r0w0e0 + + + + + + r0w0e0 + gptid/d4d0af71-4f14-11e3-a99e-002215734f17 + 47104 + 512 + 0 + 17408 + + 0 + 47104 + 92 + 0 + 0 + + + + + + ada0s1 + 3 + + + + + + r0w0e0 + + + + + + r0w0e0 + ntfs/System%20Reserved + 367001600 + 512 + 0 + 1048576 + + 0 + 367001600 + 716800 + 0 + 0 + + + + + + ada0 + 2 + + + + + + r0w0e0 + + + + + + r0w0e0 + diskid/DISK-5MS02EWG + 120034123776 + 512 + 0 + 0 + + 0 + 120034123776 + 234441648 + 0 + 0 + + + + + + Property changes on: user/glebius/course/08.io2/kern.geom.conf.xml ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +FreeBSD=%H \ No newline at end of property Added: svn:mime-type ## -0,0 +1 ## +text/xml \ No newline at end of property Index: user/glebius/course/08.io2/lection.tex =================================================================== --- user/glebius/course/08.io2/lection.tex (revision 258673) +++ user/glebius/course/08.io2/lection.tex (revision 258674) @@ -1,28 +1,368 @@ \documentclass{beamer} \usepackage[utf8]{inputenc} \usepackage[russian]{babel} \usepackage{tikz} \usepackage{adjustbox} \usepackage{url} \usepackage{array} \usepackage{xcolor} \usepackage{listings} \usepackage{verbatim} \usepackage{ifthen} \usetikzlibrary{positioning} \usetikzlibrary{shapes} \usetikzlibrary{decorations.pathmorphing} +\usetikzlibrary{decorations.text} \input{../course.tex} -\title{Input/Output system: GEOM} +\title{Input/Output system: block I/O and GEOM} \begin{document} \begin{frame} \titlepage +\end{frame} + +\begin{frame} +\frametitle{I/O below VFS} +Filesystem code posts I/O request: +\only <1> { +request passes down through the I/O to the hardware layer. +} +\only <2> { +driver returns, geom returns, filesystem code sleeps. +} +\only <3> { +I/O comletion interrupt triggers, wakeups thread waiting on bio, +both threads return. +} +\begin{figure} +\small\begin{tikzpicture}[ + every node/.style={node distance=2mm} + ] + \node [name=user, draw, rounded corners] { write(2) }; + \node [name=sys, below=of user] { sys\_write() }; + \draw [->] (user) -- (sys); + \node [name=vn, below=of sys] { vn\_write() }; + \draw [->] (sys) -- (vn); + \node [name=vop, below=of vn] { VOP\_WRITE\_APV() }; + \draw [->] (vn) -- (vop); + \node [name=fs, below=of vop] { fs specific code: ufs, zfs, ext2fs, ... }; + \draw [->] (vop) -- (fs); +\onslide <1> { + \node [name=geom, below=of fs] { geom classes }; + \draw [->] (fs) -- (geom); + \node [name=disk, below=of geom] { g\_disk\_start(bio) }; + \draw [->] (geom) -- (disk); + \node [name=driver, below=of disk] { disk strategy(bio) }; + \draw [->] (disk) -- (driver); + \node [name=hw, below=of driver] { I/O posted to hardware }; + \draw [->] (driver) -- (hw); +} + + \node [name=uk1, below left=1mm and .2\paperwidth of user] {}; + \node [name=uk2, below right=1mm and .4\paperwidth of user] {}; + \draw (uk1) -- + node [above, pos=.9] { userland } + node [below, pos=.9] { kernel } (uk2); + + \node [name=kd1, below left=1mm and .2\paperwidth of disk] {}; + \node [name=kd2, below right=1mm and .4\paperwidth of disk] {}; + \draw (kd1) -- + node [below, pos=.9, name=drivertext] { driver } (kd2); + +\onslide <2-3> { + \node [name=sleep, below=of fs] { sleep(\&bio) }; + \draw [->] (fs) -- (sleep); +} + +\onslide <3> { + \node [name=intr, below left=of drivertext, draw, rounded corners] + { interrupt }; + \node [name=dintr, above=of intr] { driver code }; + \draw [->] (intr) -- (dintr); + \node [name=biodone, above=of dintr] { biodone() }; + \draw [->] (dintr) -- (biodone); + \node [name=wakeup, above=of biodone] { wakeup(bio) }; + \draw [->] (biodone) -- (wakeup); + \draw [->, color=red] (wakeup.south west) + to [out=225, in=325] (sleep.south east); +} +\end{tikzpicture} +\end{figure} +\end{frame} + + +\begin{frame} +\frametitle<1-2>{Block storage API: basic block storage} +\frametitle<3>{Block storage API: removable block storage} +\frametitle<4>{Block storage API: write-caching block storage} +\frametitle<5>{Block storage API: thin-provisioned block storage} +\frametitle<6>{Block storage API: additional attributes} +\begin{columns} + \begin{column}{.4\paperwidth} + \begin{itemize} +\onslide<3-> { + \item{Media lock/notify} +} + \item{Data operations: + \begin{itemize} + \item{Read} + \item{Write} +\onslide <4-> { + \item{Cache flush} +} +\onslide <5-> { + \item{Unmap/Trim} +} + \end{itemize} + } + \item{Properties: + \begin{itemize} + \item{Block size} + \item{Capacity} +\onslide <6-> { + \item {C/H/S, physical sector size, \ldots} +} + \end{itemize} + } + \end{itemize} + \end{column} + \begin{column}{.4\paperwidth} + \begin{itemize} +\onslide<3-> { + \item{access(), spoiled()} +} +\onslide <2-> { + \item{strategy(struct bio *) + \begin{itemize} + \item{BIO\_READ} + \item{BIO\_WRITE} +\onslide <4-> { + \item{BIO\_FLUSH} +} +\onslide <5-> { + \item{BIO\_DELETE} +} + \end{itemize} + } + \begin{itemize} + \item{sector size} + \item{media size} +\onslide <6-> { + \item {stripe size, stripe offset, BIO\_GETATTR } +} + \end{itemize} +} + \end{itemize} + \end{column} +\end{columns} +\end{frame} + + +\FootReferences{disk(9)}{sys/geom/geom\_disk.h} +\begin{frame}[fragile] +\frametitle{The disk(9) API} +\small\begin{verbatim} +struct disk { + disk_open_t *d_open; + disk_close_t *d_close; + disk_strategy_t *d_strategy; + disk_ioctl_t *d_ioctl; + dumper_t *d_dump; + disk_getattr_t *d_getattr; + disk_gone_t *d_gone; + + u_int d_sectorsize; + u_int d_maxsize; + off_t d_mediasize; + + u_int d_stripeoffset; + u_int d_stripesize; +} +\end{verbatim} +\end{frame} + + +\FootReferences{disk(9)}{sys/geom/geom\_disk.h} +\begin{frame} +\frametitle{The disk(9) API} +Brief history: +\begin{itemize} + \item{FreeBSD 3: d\_strategy(), d\_open(), d\_close() is provided by cdevsw} + \item{FreeBSD 4: disk(9) introduced} + \item{FreeBSD 5: disk(9) is a GEOM class} +\end{itemize} +\end{frame} + + +\FootReferences{geom(9)}{} +\begin{frame} +\frametitle{And what is GEOM?} +Assume DOS partitioning scheme on disk ada0. +\onslide <2-> { + Now assume BSD partitioning scheme on ``disk'' ada0s2. +} + \begin{figure} + \begin{tikzpicture}[ + every node/.style={ draw, rounded corners, text centered, + text width = 20ex, node distance = 3mm } + ] + \node [name=ada0] { ada0\\ mediasize = 100 Gb }; + \node [name=ada0s1, above left=of ada0.north] + { ada0s1\\ mediasize = 50 Gb }; + \node [name=ada0s2, above right=of ada0.north] + { ada0s2\\ mediasize = 50 Gb }; + \draw [->] (ada0) -- (ada0s1); + \draw [->] (ada0) -- (ada0s2); +\onslide <2-> { + \node [name=ada0s2a, text width = 10ex, above left=of ada0s2.north] + { ada0s2a\\ 10 Gb }; + \node [name=ada0s2b, text width = 10ex, above right=of ada0s2.north] + { ada0s2b\\ 40 Gb }; + \draw [->] (ada0s2) -- (ada0s2a); + \draw [->] (ada0s2) -- (ada0s2b); +} + \end{tikzpicture} + \end{figure} +\end{frame} + + +\FootReferences{geom(9)}{} +\begin{frame} +\frametitle{And what is GEOM?} +\only <1> { +Another example: a stripe of disks aka RAID0 +} +\only <2> { +... or a disk mirror aka RAID1 +} +\only <3> { +Who said that mirror can be built only on bare disks? +} + \begin{figure} + \begin{tikzpicture}[ + every node/.style={ draw, rounded corners, text centered, + text width = 20ex, node distance = 3mm } + ] +\only <1> { + \node [name=top] { mirror\\ mediasize = 200 Gb }; +} +\only <2-> { + \node [name=top] { stripe\\ mediasize = 100 Gb }; +} +\onslide <1-2> { + \node [name=ada0, below left=of top.south] + { ada0\\ mediasize = 100 Gb }; + \node [name=ada1, below right=of top.south] + { ada1\\ mediasize = 100 Gb }; +} +\onslide <3-> { + \node [name=ada0, below left=of top.south] + { ada0{\color{red}a}\\ mediasize = 100 Gb }; + \node [name=ada1, below right=of top.south] + { ada1{\color{red}a}\\ mediasize = 100 Gb }; + \node [name=ada00, below=of ada0] { ada0 }; + \node [name=ada10, below=of ada1] { ada1 }; + \draw [->] (ada00) -- (ada0); + \draw [->] (ada10) -- (ada1); +} + \draw [->] (ada0) -- (top); + \draw [->] (ada1) -- (top); + \end{tikzpicture} + \end{figure} +\end{frame} + + +\FootReferences{geom(9)}{} +\begin{frame} +\frametitle{GEOM — modular disk I/O request transformation framework} +\begin{itemize} + \item { + \textbf{class} - a particular transformation: partitioning, RAIDs, + encryption. About 40 of them. + } +\onslide <2-> { + \item { + \textbf{geom} - instance of a single class. A node in GEOM graph. + Multiple \textbf{geom} instances of same class can exist. + } +} +\onslide <3-> { + \item { + \textbf{provider} - a disk-like thing that a \textbf{geom} provides + to devfs, or to other \textbf{geom}. + } +} +\onslide <4-> { + \item { + \textbf{consumer} - an interface of a \textbf{geom}, that attaches to + underlying \textbf{provider}. + } +} +\end{itemize} +\end{frame} + + +\FootReferences{geom(9)}{} +\begin{frame} +\frametitle{provider and consumer} +\begin{figure} +\begin{tikzpicture}[ + every node/.style={ rounded corners, text centered } + ] + \node [name=up, draw] { ada0a }; + \node [name=down, draw, below=3cm of up] { ada0 }; + \draw [->, thick, postaction = { + decorate, decoration = { + text along path, text align = center, + text = { consumer of } + }}] + (up.south east) to [out=315, in=45] (down.north east); + \draw [->, thick, postaction = { + decorate, decoration = { + text along path, text align = center, + text = { provider for } + }}] + (down.north west) to [out=135, in=225] (up.south west); +\end{tikzpicture} +\end{figure} +\end{frame} + + +\FootReferences{geom(9)}{sys/geom/geom\_subr.c} +\begin{frame} +\frametitle{GEOM graph is acyclic} +\begin{figure} +\begin{tikzpicture}[ + every node/.style={ draw, rounded corners, text centered, + text width = 10ex, node distance = 3mm } + ] + \node [name=top, text width = 40ex] + { mirror\\ rank = max(rank of consumers) = 2 }; + \node [name=ada0, below left=of top.south] + { ada0\\ rank = 1 }; + \node [name=ada1, below right=of top.south] + { ada1\\ rank = 1 }; + \draw [->] (ada0) -- (top); + \draw [->] (ada1) -- (top); +\end{tikzpicture} +\end{figure} +\end{frame} + + +\FootReferences{geom(9)}{sys/geom/geom\_subr.c} +\begin{frame} +\frametitle{GEOM topology management} +\begin{itemize} + \item { + \textbf{configuration} - manual request for a given class to instantiate + itself, with certain parameters. + } +\end{itemize} \end{frame} \end{document}