)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"04d8ae02cd52213b3d211022533a573f5f097524","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6594d4d8_cf5418c5","updated":"2024-08-26 12:05:21.000000000","message":"Split this CL (into blockdev, gpt and Metropolis code), this is really bad for reverting if we need to.","commit_id":"b1bab6b00d35718e862780f2e402bcc6a6140c96"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"8d17bb1211addfb2bbffa19b632ece9da9881fbc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"4dba68b1_c3c1ac93","in_reply_to":"6594d4d8_cf5418c5","updated":"2024-08-27 16:03:45.000000000","message":"Done","commit_id":"b1bab6b00d35718e862780f2e402bcc6a6140c96"}],"metropolis/node/core/localstorage/crypt/blockdev.go":[{"author":{"_account_id":1000019,"name":"Tim Windelschmidt","display_name":"Tim","email":"tim@monogon.tech","username":"fionera","avatars":[{"url":"https://www.gravatar.com/avatar/57e6137fdb8185cd15ac27ba188780ff.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/57e6137fdb8185cd15ac27ba188780ff.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/57e6137fdb8185cd15ac27ba188780ff.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/57e6137fdb8185cd15ac27ba188780ff.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"919c6eb09dad58bb7d6aa1092c07c890a8184e66","unresolved":true,"context_lines":[{"line_number":348,"context_line":"\t\treturn nil"},{"line_number":349,"context_line":"\t}"},{"line_number":350,"context_line":"\tif overlap {"},{"line_number":351,"context_line":"\t\treturn errors.New(\"found overlap in GPT partitions, refusing to grow partition\")"},{"line_number":352,"context_line":"\t}"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"\t// We found free space after the partition to grow into."}],"source_content_type":"text/x-go","patch_set":2,"id":"ed861528_c3bac3c1","line":351,"updated":"2024-08-26 21:24:33.000000000","message":"nit: replace with fmt.Errorf as that\u0027s already used everywhere else","commit_id":"b1bab6b00d35718e862780f2e402bcc6a6140c96"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"8d17bb1211addfb2bbffa19b632ece9da9881fbc","unresolved":false,"context_lines":[{"line_number":348,"context_line":"\t\treturn nil"},{"line_number":349,"context_line":"\t}"},{"line_number":350,"context_line":"\tif overlap {"},{"line_number":351,"context_line":"\t\treturn errors.New(\"found overlap in GPT partitions, refusing to grow partition\")"},{"line_number":352,"context_line":"\t}"},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"\t// We found free space after the partition to grow into."}],"source_content_type":"text/x-go","patch_set":2,"id":"e2ce6412_8201ad4e","line":351,"in_reply_to":"ed861528_c3bac3c1","updated":"2024-08-27 16:03:45.000000000","message":"Done","commit_id":"b1bab6b00d35718e862780f2e402bcc6a6140c96"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"4a38246180512ef8186f8d51aa33a984a380fa88","unresolved":true,"context_lines":[{"line_number":277,"context_line":"// partition. The main use for this are virtual machines which are launched from"},{"line_number":278,"context_line":"// an image which is smaller than the virtual disk."},{"line_number":279,"context_line":"func GrowPartition(partitionPath string) error {"},{"line_number":280,"context_line":"\t// Obtain sysfs path of the partition."},{"line_number":281,"context_line":"\tvar partS unix.Stat_t"},{"line_number":282,"context_line":"\tif err :\u003d unix.Stat(partitionPath, \u0026partS); err !\u003d nil {"},{"line_number":283,"context_line":"\t\treturn fmt.Errorf(\"inspecting partition %q: %w\", partitionPath, err)"}],"source_content_type":"text/x-go","patch_set":4,"id":"93626af0_6269d90a","line":280,"range":{"start_line":280,"start_character":4,"end_line":280,"end_character":39},"updated":"2024-08-28 15:26:31.000000000","message":"By calling this logic from handlePartition in the same package you could save yourself a lot of code as basically all handles (GPT, partition) would already be available.","commit_id":"d3ee9b97f4a47bc9f79ad292b878d8b709b2a4a0"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"afb8aa66c68aeca9ad61779ccdcbfbb49ff9d1f6","unresolved":true,"context_lines":[{"line_number":277,"context_line":"// partition. The main use for this are virtual machines which are launched from"},{"line_number":278,"context_line":"// an image which is smaller than the virtual disk."},{"line_number":279,"context_line":"func GrowPartition(partitionPath string) error {"},{"line_number":280,"context_line":"\t// Obtain sysfs path of the partition."},{"line_number":281,"context_line":"\tvar partS unix.Stat_t"},{"line_number":282,"context_line":"\tif err :\u003d unix.Stat(partitionPath, \u0026partS); err !\u003d nil {"},{"line_number":283,"context_line":"\t\treturn fmt.Errorf(\"inspecting partition %q: %w\", partitionPath, err)"}],"source_content_type":"text/x-go","patch_set":4,"id":"969e6413_adca26a0","line":280,"range":{"start_line":280,"start_character":4,"end_line":280,"end_character":39},"in_reply_to":"93626af0_6269d90a","updated":"2024-09-02 15:53:51.000000000","message":"I only want to grow the partition if it has not been initialized yet. When it is already initialized, we would then also need to grow the device mapper layers and file system, which is a lot more complicated. In handlePartition, I don\u0027t know if the partition has been initialized.","commit_id":"d3ee9b97f4a47bc9f79ad292b878d8b709b2a4a0"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"dc2c582d43bb3da0a1893a1eef413009dc1b9d7b","unresolved":false,"context_lines":[{"line_number":277,"context_line":"// partition. The main use for this are virtual machines which are launched from"},{"line_number":278,"context_line":"// an image which is smaller than the virtual disk."},{"line_number":279,"context_line":"func GrowPartition(partitionPath string) error {"},{"line_number":280,"context_line":"\t// Obtain sysfs path of the partition."},{"line_number":281,"context_line":"\tvar partS unix.Stat_t"},{"line_number":282,"context_line":"\tif err :\u003d unix.Stat(partitionPath, \u0026partS); err !\u003d nil {"},{"line_number":283,"context_line":"\t\treturn fmt.Errorf(\"inspecting partition %q: %w\", partitionPath, err)"}],"source_content_type":"text/x-go","patch_set":4,"id":"7ed09af6_e7e45acd","line":280,"range":{"start_line":280,"start_character":4,"end_line":280,"end_character":39},"in_reply_to":"969e6413_adca26a0","updated":"2024-09-04 16:07:00.000000000","message":"Acknowledged","commit_id":"d3ee9b97f4a47bc9f79ad292b878d8b709b2a4a0"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"4a38246180512ef8186f8d51aa33a984a380fa88","unresolved":true,"context_lines":[{"line_number":351,"context_line":"\t}"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"\t// We found free space after the partition to grow into."},{"line_number":354,"context_line":"\ttableEntry.LastBlock \u003d uint64(freeSpace[1] - 1)"},{"line_number":355,"context_line":"\terr \u003d table.Write()"},{"line_number":356,"context_line":"\tif err !\u003d nil {"},{"line_number":357,"context_line":"\t\treturn fmt.Errorf(\"failed to write GPT with grown partition: %w\", err)"}],"source_content_type":"text/x-go","patch_set":4,"id":"5a74b90f_6c13f18b","line":354,"range":{"start_line":354,"start_character":24,"end_line":354,"end_character":48},"updated":"2024-08-28 15:26:31.000000000","message":"Align LastBlock to 1MiB to make sure that we do not constantly overwrite hardware blocks associated with the alternate GPT at the end, increasing the possibility of corruption.","commit_id":"d3ee9b97f4a47bc9f79ad292b878d8b709b2a4a0"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"afb8aa66c68aeca9ad61779ccdcbfbb49ff9d1f6","unresolved":false,"context_lines":[{"line_number":351,"context_line":"\t}"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":"\t// We found free space after the partition to grow into."},{"line_number":354,"context_line":"\ttableEntry.LastBlock \u003d uint64(freeSpace[1] - 1)"},{"line_number":355,"context_line":"\terr \u003d table.Write()"},{"line_number":356,"context_line":"\tif err !\u003d nil {"},{"line_number":357,"context_line":"\t\treturn fmt.Errorf(\"failed to write GPT with grown partition: %w\", err)"}],"source_content_type":"text/x-go","patch_set":4,"id":"0c7a546d_1a64654b","line":354,"range":{"start_line":354,"start_character":24,"end_line":354,"end_character":48},"in_reply_to":"5a74b90f_6c13f18b","updated":"2024-09-02 15:53:51.000000000","message":"This should also be done when adding the partition, not just when resizing it. I pushed another change for AddPartition.","commit_id":"d3ee9b97f4a47bc9f79ad292b878d8b709b2a4a0"}],"osbase/blockdev/blockdev_linux.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"04d8ae02cd52213b3d211022533a573f5f097524","unresolved":true,"context_lines":[{"line_number":119,"context_line":"}"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"// blkpgIoctlArg is a copy unix.BlkpgIoctlArg with the type of the Data field"},{"line_number":122,"context_line":"// changed from *byte to uintptr."},{"line_number":123,"context_line":"type blkpgIoctlArg struct {"},{"line_number":124,"context_line":"\tOp      int32"},{"line_number":125,"context_line":"\tFlags   int32"}],"source_content_type":"text/x-go","patch_set":2,"id":"349c6302_f287977e","line":122,"range":{"start_line":122,"start_character":3,"end_line":122,"end_character":33},"updated":"2024-08-26 12:05:21.000000000","message":"Could this also be done this way? https://github.com/bradfitz/embiggen-disk/blob/9e7b2fc7b99c4dece41a805489a6ca377ce55a62/part.go#L217","commit_id":"b1bab6b00d35718e862780f2e402bcc6a6140c96"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"4a38246180512ef8186f8d51aa33a984a380fa88","unresolved":false,"context_lines":[{"line_number":119,"context_line":"}"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"// blkpgIoctlArg is a copy unix.BlkpgIoctlArg with the type of the Data field"},{"line_number":122,"context_line":"// changed from *byte to uintptr."},{"line_number":123,"context_line":"type blkpgIoctlArg struct {"},{"line_number":124,"context_line":"\tOp      int32"},{"line_number":125,"context_line":"\tFlags   int32"}],"source_content_type":"text/x-go","patch_set":2,"id":"0f09ff20_344ef417","line":122,"range":{"start_line":122,"start_character":3,"end_line":122,"end_character":33},"in_reply_to":"267482fc_0bdfb3f8","updated":"2024-08-28 15:26:31.000000000","message":"Done","commit_id":"b1bab6b00d35718e862780f2e402bcc6a6140c96"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"8d17bb1211addfb2bbffa19b632ece9da9881fbc","unresolved":true,"context_lines":[{"line_number":119,"context_line":"}"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"// blkpgIoctlArg is a copy unix.BlkpgIoctlArg with the type of the Data field"},{"line_number":122,"context_line":"// changed from *byte to uintptr."},{"line_number":123,"context_line":"type blkpgIoctlArg struct {"},{"line_number":124,"context_line":"\tOp      int32"},{"line_number":125,"context_line":"\tFlags   int32"}],"source_content_type":"text/x-go","patch_set":2,"id":"267482fc_0bdfb3f8","line":122,"range":{"start_line":122,"start_character":3,"end_line":122,"end_character":33},"in_reply_to":"349c6302_f287977e","updated":"2024-08-27 16:03:45.000000000","message":"This doesn\u0027t look like a valid use of `unsafe.Pointer` to me. I don\u0027t think that `byte` and `unix.BlkpgPartition` have the same memory layout, so case (1) in https://pkg.go.dev/unsafe#Pointer does not apply.","commit_id":"b1bab6b00d35718e862780f2e402bcc6a6140c96"}]}
