)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"efa9283e1a08d8434d44902e62fb33c7918c9b7b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"38cc790a_2ed2632e","updated":"2024-07-25 18:17:41.000000000","message":"This looks correct based on what I see in the spec for GPT.","commit_id":"0bb42472f88739a83b08ba3922c7988eba4bfa36"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c5f11a186c6e7624574fa453969e096422cad174","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"b53a6f91_08948485","updated":"2024-08-19 16:50:38.000000000","message":"recheck volume snapshot fail, unrelated","commit_id":"a0481d5a61da9141e7b60d6d7159f95ab569c211"}],"oslo_utils/imageutils/format_inspector.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"efa9283e1a08d8434d44902e62fb33c7918c9b7b","unresolved":true,"context_lines":[{"line_number":1207,"context_line":""},{"line_number":1208,"context_line":""},{"line_number":1209,"context_line":"# GPT is a superset of legacy MBR and we can detect the two with the same"},{"line_number":1210,"context_line":"# inspector. There may be more we can safety check for GPT, but detecfting"},{"line_number":1211,"context_line":"# both formats is simpler."},{"line_number":1212,"context_line":"# https://uefi.org/specs/UEFI/2.10/05_GUID_Partition_Table_Format.html"},{"line_number":1213,"context_line":"class GPTInspector(FileInspector):"}],"source_content_type":"text/x-python","patch_set":1,"id":"99c09142_2e843cc7","line":1210,"range":{"start_line":1210,"start_character":64,"end_line":1210,"end_character":74},"updated":"2024-07-25 18:17:41.000000000","message":"detecting","commit_id":"0bb42472f88739a83b08ba3922c7988eba4bfa36"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3050181d643d0ca9380a3640b0d8ac53b7d5ab85","unresolved":false,"context_lines":[{"line_number":1207,"context_line":""},{"line_number":1208,"context_line":""},{"line_number":1209,"context_line":"# GPT is a superset of legacy MBR and we can detect the two with the same"},{"line_number":1210,"context_line":"# inspector. There may be more we can safety check for GPT, but detecfting"},{"line_number":1211,"context_line":"# both formats is simpler."},{"line_number":1212,"context_line":"# https://uefi.org/specs/UEFI/2.10/05_GUID_Partition_Table_Format.html"},{"line_number":1213,"context_line":"class GPTInspector(FileInspector):"}],"source_content_type":"text/x-python","patch_set":1,"id":"98dcb8b6_3f5fc198","line":1210,"range":{"start_line":1210,"start_character":64,"end_line":1210,"end_character":74},"in_reply_to":"94a03cf8_c2249760","updated":"2024-08-07 15:30:18.000000000","message":"Done","commit_id":"0bb42472f88739a83b08ba3922c7988eba4bfa36"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"de85df56ce9fb9c4d2010b3a57883a10c6b701fb","unresolved":true,"context_lines":[{"line_number":1207,"context_line":""},{"line_number":1208,"context_line":""},{"line_number":1209,"context_line":"# GPT is a superset of legacy MBR and we can detect the two with the same"},{"line_number":1210,"context_line":"# inspector. There may be more we can safety check for GPT, but detecfting"},{"line_number":1211,"context_line":"# both formats is simpler."},{"line_number":1212,"context_line":"# https://uefi.org/specs/UEFI/2.10/05_GUID_Partition_Table_Format.html"},{"line_number":1213,"context_line":"class GPTInspector(FileInspector):"}],"source_content_type":"text/x-python","patch_set":1,"id":"94a03cf8_c2249760","line":1210,"range":{"start_line":1210,"start_character":64,"end_line":1210,"end_character":74},"in_reply_to":"99c09142_2e843cc7","updated":"2024-07-25 18:25:33.000000000","message":"Yeah thanks, I noticed this while working on a safety check, which I\u0027ll push up in a few.","commit_id":"0bb42472f88739a83b08ba3922c7988eba4bfa36"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"9889299c7f5ef776338ec1005f8c3dc308ed01a6","unresolved":true,"context_lines":[{"line_number":1220,"context_line":"        self.new_region(\u0027gpt\u0027, CaptureRegion(512, 512))"},{"line_number":1221,"context_line":"        # If we detect that this is a GPT, we should capture the backup"},{"line_number":1222,"context_line":"        # and assert that it is equivalent"},{"line_number":1223,"context_line":"        # self.new_region(\u0027gpt_backup\u0027, EndCaptureRegion(512))"},{"line_number":1224,"context_line":"        self.add_safety_check(SafetyCheck(\u0027mbr\u0027, self.check_mbr_partitions))"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":5,"id":"02132948_9a8bfc42","line":1223,"range":{"start_line":1223,"start_character":10,"end_line":1223,"end_character":62},"updated":"2024-08-06 16:53:51.000000000","message":"is this leftover?","commit_id":"b491ec940110f2950b4d51c5b9eb17c430760835"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6c3a12a271c8bf021a457ce1751d1245a31a12eb","unresolved":true,"context_lines":[{"line_number":1220,"context_line":"        self.new_region(\u0027gpt\u0027, CaptureRegion(512, 512))"},{"line_number":1221,"context_line":"        # If we detect that this is a GPT, we should capture the backup"},{"line_number":1222,"context_line":"        # and assert that it is equivalent"},{"line_number":1223,"context_line":"        # self.new_region(\u0027gpt_backup\u0027, EndCaptureRegion(512))"},{"line_number":1224,"context_line":"        self.add_safety_check(SafetyCheck(\u0027mbr\u0027, self.check_mbr_partitions))"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":5,"id":"ad7511a5_b653ae91","line":1223,"range":{"start_line":1223,"start_character":10,"end_line":1223,"end_character":62},"in_reply_to":"02132948_9a8bfc42","updated":"2024-08-06 17:20:07.000000000","message":"No, it\u0027s left here for the future if we decide we want to validate the backup table. I could remove it if you think it\u0027s confusing, it\u0027s just a hint for the future.","commit_id":"b491ec940110f2950b4d51c5b9eb17c430760835"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"98ed71a072db7cbc211eb18d2a4e6c34123da2aa","unresolved":true,"context_lines":[{"line_number":1220,"context_line":"        self.new_region(\u0027gpt\u0027, CaptureRegion(512, 512))"},{"line_number":1221,"context_line":"        # If we detect that this is a GPT, we should capture the backup"},{"line_number":1222,"context_line":"        # and assert that it is equivalent"},{"line_number":1223,"context_line":"        # self.new_region(\u0027gpt_backup\u0027, EndCaptureRegion(512))"},{"line_number":1224,"context_line":"        self.add_safety_check(SafetyCheck(\u0027mbr\u0027, self.check_mbr_partitions))"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":5,"id":"3e12be5f_f6639ef7","line":1223,"range":{"start_line":1223,"start_character":10,"end_line":1223,"end_character":62},"in_reply_to":"132bcd08_3c60dd66","updated":"2024-08-07 08:55:28.000000000","message":"Yeah I agree, prefixing it would be better","commit_id":"b491ec940110f2950b4d51c5b9eb17c430760835"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"dd79ad0dec15712652317eccd9490f4afecb366b","unresolved":true,"context_lines":[{"line_number":1220,"context_line":"        self.new_region(\u0027gpt\u0027, CaptureRegion(512, 512))"},{"line_number":1221,"context_line":"        # If we detect that this is a GPT, we should capture the backup"},{"line_number":1222,"context_line":"        # and assert that it is equivalent"},{"line_number":1223,"context_line":"        # self.new_region(\u0027gpt_backup\u0027, EndCaptureRegion(512))"},{"line_number":1224,"context_line":"        self.add_safety_check(SafetyCheck(\u0027mbr\u0027, self.check_mbr_partitions))"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":5,"id":"f19dea3e_67750e46","line":1223,"range":{"start_line":1223,"start_character":10,"end_line":1223,"end_character":62},"in_reply_to":"3e12be5f_f6639ef7","updated":"2024-08-07 13:49:44.000000000","message":"Ack, I\u0027ll wait for the patch below to land and then I will update this. Thanks!","commit_id":"b491ec940110f2950b4d51c5b9eb17c430760835"},{"author":{"_account_id":9303,"name":"Abhishek Kekane","email":"akekane@redhat.com","username":"abhishekkekane"},"change_message_id":"bf7a5bd9a4c64694818b447003580c77aceed035","unresolved":true,"context_lines":[{"line_number":1220,"context_line":"        self.new_region(\u0027gpt\u0027, CaptureRegion(512, 512))"},{"line_number":1221,"context_line":"        # If we detect that this is a GPT, we should capture the backup"},{"line_number":1222,"context_line":"        # and assert that it is equivalent"},{"line_number":1223,"context_line":"        # self.new_region(\u0027gpt_backup\u0027, EndCaptureRegion(512))"},{"line_number":1224,"context_line":"        self.add_safety_check(SafetyCheck(\u0027mbr\u0027, self.check_mbr_partitions))"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":5,"id":"132bcd08_3c60dd66","line":1223,"range":{"start_line":1223,"start_character":10,"end_line":1223,"end_character":62},"in_reply_to":"ad7511a5_b653ae91","updated":"2024-08-06 17:24:02.000000000","message":"may be prefixing with TODO will help.\nThat is also if new PS is required.","commit_id":"b491ec940110f2950b4d51c5b9eb17c430760835"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3050181d643d0ca9380a3640b0d8ac53b7d5ab85","unresolved":false,"context_lines":[{"line_number":1220,"context_line":"        self.new_region(\u0027gpt\u0027, CaptureRegion(512, 512))"},{"line_number":1221,"context_line":"        # If we detect that this is a GPT, we should capture the backup"},{"line_number":1222,"context_line":"        # and assert that it is equivalent"},{"line_number":1223,"context_line":"        # self.new_region(\u0027gpt_backup\u0027, EndCaptureRegion(512))"},{"line_number":1224,"context_line":"        self.add_safety_check(SafetyCheck(\u0027mbr\u0027, self.check_mbr_partitions))"},{"line_number":1225,"context_line":""},{"line_number":1226,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":5,"id":"bf585e62_5fbce41d","line":1223,"range":{"start_line":1223,"start_character":10,"end_line":1223,"end_character":62},"in_reply_to":"f19dea3e_67750e46","updated":"2024-08-07 15:30:18.000000000","message":"Done","commit_id":"b491ec940110f2950b4d51c5b9eb17c430760835"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0c010374302997de8818ac5ded799e8249f20819","unresolved":true,"context_lines":[{"line_number":1236,"context_line":"        for i in range(4):"},{"line_number":1237,"context_line":"            pte_start \u003d self.MBR_PTE_START + (16 * i)"},{"line_number":1238,"context_line":"            pte \u003d self.region(\u0027mbr\u0027).data[pte_start:pte_start + 16]"},{"line_number":1239,"context_line":"            (boot, startc, starth, starts, ostype,"},{"line_number":1240,"context_line":"             endc, ehdh, ends, startlba, sizelba) \u003d struct.unpack("},{"line_number":1241,"context_line":"                \u0027\u003cBBBBBBBBII\u0027, pte)"},{"line_number":1242,"context_line":"            if boot not in (0x00, 0x80):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ad6e4cf7_a54a904a","line":1239,"range":{"start_line":1239,"start_character":19,"end_line":1239,"end_character":41},"updated":"2024-08-07 15:03:22.000000000","message":"Can we pack this into a single variable (by replacing BBB by 3B) and name the variable stackchs ?\n\nIf we keep the tree variables then these should be named stackhead, stacksector and stacktrack. IIUC, CHS(Cylinder head sector) is the format name and each character does not represent each field, according to the struct definition.\n\n```\n#pragma pack(1)\n///\n/// MBR Partition Entry\n///\ntypedef struct {\n   UINT8         BootIndicator;\n   UINT8         StartHead;\n   UINT8         StartSector;\n   UINT8         StartTrack;\n   UINT8         OSIndicator;\n   UINT8         EndHead;\n   UINT8         EndSector;\n   UINT8         EndTrack;\n   UINT8         StartingLBA[4];\n   UINT8         SizeInLBA[4];\n}    MBR_PARTITION_RECORD;\n```","commit_id":"b491ec940110f2950b4d51c5b9eb17c430760835"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3050181d643d0ca9380a3640b0d8ac53b7d5ab85","unresolved":true,"context_lines":[{"line_number":1236,"context_line":"        for i in range(4):"},{"line_number":1237,"context_line":"            pte_start \u003d self.MBR_PTE_START + (16 * i)"},{"line_number":1238,"context_line":"            pte \u003d self.region(\u0027mbr\u0027).data[pte_start:pte_start + 16]"},{"line_number":1239,"context_line":"            (boot, startc, starth, starts, ostype,"},{"line_number":1240,"context_line":"             endc, ehdh, ends, startlba, sizelba) \u003d struct.unpack("},{"line_number":1241,"context_line":"                \u0027\u003cBBBBBBBBII\u0027, pte)"},{"line_number":1242,"context_line":"            if boot not in (0x00, 0x80):"}],"source_content_type":"text/x-python","patch_set":5,"id":"cabaa94c_0be4cde7","line":1239,"range":{"start_line":1239,"start_character":19,"end_line":1239,"end_character":41},"in_reply_to":"ad6e4cf7_a54a904a","updated":"2024-08-07 15:30:18.000000000","message":"\u003e Can we pack this into a single variable (by replacing BBB by 3B) and name the variable stackchs ?\n\nNot that I know of:\n\n```\nstruct.unpack(\u0027B3B\u0027, b\u0027abcd\u0027)\n(97, 98, 99, 100)\n```\n\nBut I can do that to group the CHS values together for easier reading of the struct format if you like.\n\n\u003e If we keep the tree variables then these should be named stackhead, stacksector and stacktrack.\n\nI\u0027m not sure where you\u0027re getting \"stack\" in the name. Did you mean \"start\"?\n\n\u003e IIUC, CHS(Cylinder head sector) is the format name and each character does not represent each field, according to the struct definition.\n\u003e \n\u003e ```\n\u003e #pragma pack(1)\n\u003e ///\n\u003e /// MBR Partition Entry\n\u003e ///\n\u003e typedef struct {\n\u003e    UINT8         BootIndicator;\n\u003e    UINT8         StartHead;\n\u003e    UINT8         StartSector;\n\u003e    UINT8         StartTrack;\n\u003e    UINT8         OSIndicator;\n\u003e    UINT8         EndHead;\n\u003e    UINT8         EndSector;\n\u003e    UINT8         EndTrack;\n\u003e    UINT8         StartingLBA[4];\n\u003e    UINT8         SizeInLBA[4];\n\u003e }    MBR_PARTITION_RECORD;\n\u003e ```\n\nYeah, you\u0027re right, I\u0027ll change it from c,h,s to h,s,t.","commit_id":"b491ec940110f2950b4d51c5b9eb17c430760835"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"3b9dbd7625bb1b7daa095e2b8de215702fdbb06e","unresolved":false,"context_lines":[{"line_number":1236,"context_line":"        for i in range(4):"},{"line_number":1237,"context_line":"            pte_start \u003d self.MBR_PTE_START + (16 * i)"},{"line_number":1238,"context_line":"            pte \u003d self.region(\u0027mbr\u0027).data[pte_start:pte_start + 16]"},{"line_number":1239,"context_line":"            (boot, startc, starth, starts, ostype,"},{"line_number":1240,"context_line":"             endc, ehdh, ends, startlba, sizelba) \u003d struct.unpack("},{"line_number":1241,"context_line":"                \u0027\u003cBBBBBBBBII\u0027, pte)"},{"line_number":1242,"context_line":"            if boot not in (0x00, 0x80):"}],"source_content_type":"text/x-python","patch_set":5,"id":"10f553c1_f8000169","line":1239,"range":{"start_line":1239,"start_character":19,"end_line":1239,"end_character":41},"in_reply_to":"cabaa94c_0be4cde7","updated":"2024-08-08 01:18:57.000000000","message":"\u003e Not that I know of:\n\nUgh. That format only works for s(byte array). I think we can keep the current split parsing now.\n\n\u003e I\u0027m not sure where you\u0027re getting \"stack\" in the name. Did you mean \"start\"?\n\nYes. You are correct...","commit_id":"b491ec940110f2950b4d51c5b9eb17c430760835"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f8c938794a761d0711e89b283232b49fd40b5e7f","unresolved":true,"context_lines":[{"line_number":1240,"context_line":"            (boot, starth, starts, startt, ostype,"},{"line_number":1241,"context_line":"             endh, ehds, endt, startlba, sizelba) \u003d struct.unpack("},{"line_number":1242,"context_line":"                \u0027\u003cB3BB3BII\u0027, pte)"},{"line_number":1243,"context_line":"            if boot not in (0x00, 0x80):"},{"line_number":1244,"context_line":"                raise SafetyViolation(\u0027MBR PTE %i has invalid boot flag\u0027 % i)"},{"line_number":1245,"context_line":"            if ostype !\u003d 0:"},{"line_number":1246,"context_line":"                valid_partitions.append(i)"}],"source_content_type":"text/x-python","patch_set":6,"id":"355fea76_cd1f0b91","line":1243,"updated":"2024-08-16 12:04:19.000000000","message":"i would guess 0x00, is no boot flag set and  0x80 is for the boot partition\n\nhaving a constnat/comment woudl help here but this makes senes to validate","commit_id":"a0481d5a61da9141e7b60d6d7159f95ab569c211"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f8c938794a761d0711e89b283232b49fd40b5e7f","unresolved":true,"context_lines":[{"line_number":1251,"context_line":"                if startlba !\u003d 0x00000001:"},{"line_number":1252,"context_line":"                    raise SafetyViolation(\u0027GPT MBR has invalid start LBA\u0027)"},{"line_number":1253,"context_line":"        if found_gpt and valid_partitions !\u003d [0]:"},{"line_number":1254,"context_line":"            raise SafetyViolation(\u0027GPT MBR defines invalid extra partitions\u0027)"},{"line_number":1255,"context_line":"        if not valid_partitions:"},{"line_number":1256,"context_line":"            raise SafetyViolation(\u0027GPT MBR has no partitions defined\u0027)"},{"line_number":1257,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"f648b295_5e215721","line":1254,"updated":"2024-08-16 12:04:19.000000000","message":"im not sure about this check.\n\nwhy cant a gpt fromated iamge have multipel partitions?\n\ni guess only one of them shoudl have ostype \u003d\u003d 0xEE\n\nbut the exception message does not make that clear.","commit_id":"a0481d5a61da9141e7b60d6d7159f95ab569c211"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a6ace7dcf4b1c198cb67d845116cdfc1939fe130","unresolved":true,"context_lines":[{"line_number":1251,"context_line":"                if startlba !\u003d 0x00000001:"},{"line_number":1252,"context_line":"                    raise SafetyViolation(\u0027GPT MBR has invalid start LBA\u0027)"},{"line_number":1253,"context_line":"        if found_gpt and valid_partitions !\u003d [0]:"},{"line_number":1254,"context_line":"            raise SafetyViolation(\u0027GPT MBR defines invalid extra partitions\u0027)"},{"line_number":1255,"context_line":"        if not valid_partitions:"},{"line_number":1256,"context_line":"            raise SafetyViolation(\u0027GPT MBR has no partitions defined\u0027)"},{"line_number":1257,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"71ef1881_60d04c2a","line":1254,"in_reply_to":"46f043db_d3f08ed8","updated":"2024-08-16 13:27:48.000000000","message":"Yup, and this is what makes it pretty convenient for us so we don\u0027t need an MBR and GPT inspector.","commit_id":"a0481d5a61da9141e7b60d6d7159f95ab569c211"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3df2c87ba7427b4b97b0d5c6d6d47384edfd8dcb","unresolved":true,"context_lines":[{"line_number":1251,"context_line":"                if startlba !\u003d 0x00000001:"},{"line_number":1252,"context_line":"                    raise SafetyViolation(\u0027GPT MBR has invalid start LBA\u0027)"},{"line_number":1253,"context_line":"        if found_gpt and valid_partitions !\u003d [0]:"},{"line_number":1254,"context_line":"            raise SafetyViolation(\u0027GPT MBR defines invalid extra partitions\u0027)"},{"line_number":1255,"context_line":"        if not valid_partitions:"},{"line_number":1256,"context_line":"            raise SafetyViolation(\u0027GPT MBR has no partitions defined\u0027)"},{"line_number":1257,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"46f043db_d3f08ed8","line":1254,"in_reply_to":"f648b295_5e215721","updated":"2024-08-16 12:07:24.000000000","message":"ah https://wiki.osdev.org/GPT#LBA_0\\:_Protective_Master_Boot_Record\n\nThis is kept untouched for backward compatibility. The UEFI specification requires that the PMBR partition table contain one partition record, with the other three partition records set to zero. The partition record should be defined as follows:","commit_id":"a0481d5a61da9141e7b60d6d7159f95ab569c211"}]}
