diff options
| author | Alfonso Sánchez-Beato <alfonso.sanchez-beato@canonical.com> | 2023-05-16 15:45:34 +0100 |
|---|---|---|
| committer | alfonsosanchezbeato <alfonsosanchezbeato@yahoo.es> | 2023-05-23 10:02:58 +0200 |
| commit | 2b285f17a6549f12157c469d544f9e77374d1a5e (patch) | |
| tree | bab576478b4d9c92f573d087f3504808b2dcca63 | |
| parent | 170b08671840d292f3937c1fe7157d5a8fe5e281 (diff) | |
gadget: remove offset-write from gadget structure content
Using offset-write from an image in a gadget volume structure content was never implemented by ubuntu-image and does not seem too useful. Removing it and the related checks therefore.
| -rw-r--r-- | gadget/gadget.go | 16 | ||||
| -rw-r--r-- | gadget/gadget_test.go | 20 | ||||
| -rw-r--r-- | gadget/layout.go | 35 | ||||
| -rw-r--r-- | gadget/layout_test.go | 62 |
4 files changed, 10 insertions, 123 deletions
diff --git a/gadget/gadget.go b/gadget/gadget.go index 538f9c6122..20510a52a2 100644 --- a/gadget/gadget.go +++ b/gadget/gadget.go @@ -353,10 +353,6 @@ type VolumeContent struct { Image string `yaml:"image" json:"image"` // Offset the image is written at Offset *quantity.Offset `yaml:"offset" json:"offset"` - // OffsetWrite describes a 32-bit address, within the volume, at which - // the offset of current image will be written. The position may be - // specified as a byte offset relative to the start of a named structure - OffsetWrite *RelativeOffset `yaml:"offset-write" json:"offset-write"` // Size of the image, when empty size is calculated by looking at the // image Size quantity.Size `yaml:"size" json:"size"` @@ -1180,16 +1176,6 @@ func validateCrossVolumeStructure(structures []VolumeStructure, knownStructures // content relative offset only possible if it's a bare structure continue } - for cidx, c := range ps.Content { - if c.OffsetWrite == nil || c.OffsetWrite.RelativeTo == "" { - continue - } - relativeToStructure := knownStructures[c.OffsetWrite.RelativeTo] - if relativeToStructure == nil { - return fmt.Errorf("structure %q, content %v refers to an unknown structure %q", - ps.Name, fmtIndexAndName(cidx, c.Image), c.OffsetWrite.RelativeTo) - } - } } return nil } @@ -1359,7 +1345,7 @@ func validateBareContent(vc *VolumeContent) error { } func validateFilesystemContent(vc *VolumeContent) error { - if vc.Image != "" || vc.Offset != nil || vc.OffsetWrite != nil || vc.Size != 0 { + if vc.Image != "" || vc.Offset != nil || vc.Size != 0 { return fmt.Errorf("cannot use image content for non-bare file system") } if vc.UnresolvedSource == "" { diff --git a/gadget/gadget_test.go b/gadget/gadget_test.go index 85461e8af8..17f5e57d90 100644 --- a/gadget/gadget_test.go +++ b/gadget/gadget_test.go @@ -1669,29 +1669,12 @@ volumes: content: - image: pc-core.img ` - gadgetYamlBadContentName := gadgetYamlHeader + ` - - name: other-name - type: DA,21686148-6449-6E6F-744E-656564454649 - size: 1M - offset: 1M - offset-write: my-name-is+92 - content: - - image: pc-core.img - offset-write: bad-name+123 -` err := ioutil.WriteFile(s.gadgetYamlPath, []byte(gadgetYamlBadStructureName), 0644) c.Assert(err, IsNil) _, err = gadget.ReadInfo(s.dir, nil) c.Check(err, ErrorMatches, `invalid volume "pc": structure "other-name" refers to an unknown structure "bad-name"`) - - err = ioutil.WriteFile(s.gadgetYamlPath, []byte(gadgetYamlBadContentName), 0644) - c.Assert(err, IsNil) - - _, err = gadget.ReadInfo(s.dir, nil) - c.Check(err, ErrorMatches, `invalid volume "pc": structure "other-name", content #0 \("pc-core.img"\) refers to an unknown structure "bad-name"`) - } func (s *gadgetYamlTestSuite) TestValidateStructureUpdatePreserveOnlyForFs(c *C) { @@ -4018,7 +4001,6 @@ func (s *gadgetYamlTestSuite) TestGadgetInfoVolumeStructureInternalFieldsNoJSON( Target: "some-target", Image: "image", Offset: asOffsetPtr(12), - OffsetWrite: mustParseGadgetRelativeOffset(c, "mbr+192"), Size: 321, Unpack: true, }, @@ -4031,7 +4013,7 @@ func (s *gadgetYamlTestSuite) TestGadgetInfoVolumeStructureInternalFieldsNoJSON( b, err := json.Marshal(volS) c.Assert(err, IsNil) // ensure the json looks json-ish - c.Check(string(b), Equals, `{"name":"pc","filesystem-label":"ubuntu-seed","offset":123,"offset-write":{"relative-to":"mbr","offset":92},"min-size":0,"size":888,"type":"0C","role":"system-seed","id":"gpt-id","filesystem":"vfat","content":[{"source":"source","target":"some-target","image":"image","offset":12,"offset-write":{"relative-to":"mbr","offset":192},"size":321,"unpack":true}],"update":{"edition":2,"preserve":["foo"]}}`) + c.Check(string(b), Equals, `{"name":"pc","filesystem-label":"ubuntu-seed","offset":123,"offset-write":{"relative-to":"mbr","offset":92},"min-size":0,"size":888,"type":"0C","role":"system-seed","id":"gpt-id","filesystem":"vfat","content":[{"source":"source","target":"some-target","image":"image","offset":12,"size":321,"unpack":true}],"update":{"edition":2,"preserve":["foo"]}}`) // check that the new structure has no volumeName var newVolS *gadget.VolumeStructure diff --git a/gadget/layout.go b/gadget/layout.go index 0a0f21086b..d3214bb71d 100644 --- a/gadget/layout.go +++ b/gadget/layout.go @@ -150,9 +150,6 @@ type LaidOutContent struct { // StartOffset defines the start offset of this content image StartOffset quantity.Offset - // AbsoluteOffsetWrite is the resolved absolute position of offset-write - // for this content element within the enclosing volume - AbsoluteOffsetWrite *quantity.Offset // Size is the maximum size occupied by this image Size quantity.Size // Index of the content in structure declaration inside gadget YAML @@ -178,9 +175,8 @@ type ResolvedContent struct { KernelUpdate bool } -func layoutVolumeStructures(volume *Volume) (structures []LaidOutStructure, byName map[string]*LaidOutStructure, err error) { +func layoutVolumeStructures(volume *Volume) (structures []LaidOutStructure, err error) { structures = make([]LaidOutStructure, len(volume.Structure)) - byName = make(map[string]*LaidOutStructure, len(volume.Structure)) // Even although we do not have the final offset as that depends on the // state of the installation disk and we do not know at this point, we @@ -192,9 +188,6 @@ func layoutVolumeStructures(volume *Volume) (structures []LaidOutStructure, byNa VolumeStructure: &volume.Structure[idx], } - if ps.Name() != "" { - byName[ps.Name()] = &ps - } if volume.Structure[idx].Offset != nil { offset = *volume.Structure[idx].Offset } @@ -217,23 +210,23 @@ func layoutVolumeStructures(volume *Volume) (structures []LaidOutStructure, byNa previousEnd := quantity.Offset(0) for idx, ps := range structures { if ps.StartOffset < previousEnd { - return nil, nil, fmt.Errorf("cannot lay out volume, structure %v overlaps with preceding structure %v", ps, structures[idx-1]) + return nil, fmt.Errorf("cannot lay out volume, structure %v overlaps with preceding structure %v", ps, structures[idx-1]) } previousEnd = ps.StartOffset + quantity.Offset(ps.VolumeStructure.Size) offsetWrite, err := resolveOffsetWrite(ps.VolumeStructure.OffsetWrite, byName) if err != nil { - return nil, nil, fmt.Errorf("cannot resolve offset-write of structure %v: %v", ps, err) + return nil, fmt.Errorf("cannot resolve offset-write of structure %v: %v", ps, err) } structures[idx].AbsoluteOffsetWrite = offsetWrite } - return structures, byName, nil + return structures, nil } // LayoutVolumePartially attempts to lay out only the structures in the volume. func LayoutVolumePartially(volume *Volume) (*PartiallyLaidOutVolume, error) { - structures, _, err := layoutVolumeStructures(volume) + structures, err := layoutVolumeStructures(volume) if err != nil { return nil, err } @@ -283,7 +276,7 @@ func LayoutVolume(volume *Volume, opts *LayoutOptions) (*LaidOutVolume, error) { } } - structures, byName, err := layoutVolumeStructures(volume) + structures, err := layoutVolumeStructures(volume) if err != nil { return nil, err } @@ -308,15 +301,10 @@ func LayoutVolume(volume *Volume, opts *LayoutOptions) (*LaidOutVolume, error) { // has a size so even without the structure content the layout // can be calculated. if !opts.IgnoreContent { - content, err := layOutStructureContent(opts.GadgetRootDir, &structures[idx], byName) + content, err := layOutStructureContent(opts.GadgetRootDir, &structures[idx]) if err != nil { return nil, err } - for _, c := range content { - if c.AbsoluteOffsetWrite != nil && *c.AbsoluteOffsetWrite > fartherstOffsetWrite { - fartherstOffsetWrite = *c.AbsoluteOffsetWrite - } - } structures[idx].LaidOutContent = content } @@ -448,7 +436,7 @@ func getImageSize(path string) (quantity.Size, error) { return quantity.Size(stat.Size()), nil } -func layOutStructureContent(gadgetRootDir string, ps *LaidOutStructure, known map[string]*LaidOutStructure) ([]LaidOutContent, error) { +func layOutStructureContent(gadgetRootDir string, ps *LaidOutStructure) ([]LaidOutContent, error) { if ps.HasFilesystem() { // structures with a filesystem do not need any extra layout return nil, nil @@ -482,18 +470,11 @@ func layOutStructureContent(gadgetRootDir string, ps *LaidOutStructure, known ma actualSize = c.Size } - offsetWrite, err := resolveOffsetWrite(c.OffsetWrite, known) - if err != nil { - return nil, fmt.Errorf("cannot resolve offset-write of structure %v content %q: %v", ps, c.Image, err) - } - content[idx] = LaidOutContent{ VolumeContent: &ps.VolumeStructure.Content[idx], Size: actualSize, StartOffset: ps.StartOffset + start, Index: idx, - // break for gofmt < 1.11 - AbsoluteOffsetWrite: offsetWrite, } previousEnd = start + quantity.Offset(actualSize) if quantity.Size(previousEnd) > ps.VolumeStructure.Size { diff --git a/gadget/layout_test.go b/gadget/layout_test.go index d9df478350..4446394038 100644 --- a/gadget/layout_test.go +++ b/gadget/layout_test.go @@ -916,8 +916,6 @@ volumes: VolumeContent: &vol.Structure[1].Content[0], Size: 200 * quantity.SizeKiB, StartOffset: 1 * quantity.OffsetMiB, - // offset-write: bar+10 - AbsoluteOffsetWrite: asOffsetPtr(2*quantity.OffsetMiB + 10), }, }, }, { @@ -936,8 +934,6 @@ volumes: VolumeContent: &vol.Structure[2].Content[0], Size: 150 * quantity.SizeKiB, StartOffset: 2 * quantity.OffsetMiB, - // offset-write: bar+10 - AbsoluteOffsetWrite: asOffsetPtr(450), }, }, }, @@ -961,25 +957,6 @@ func (p *layoutTestSuite) TestLayoutVolumeOffsetWriteBadRelativeTo(c *C) { }, }, } - volBadContent := gadget.Volume{ - Structure: []gadget.VolumeStructure{ - { - Name: "foo", - Type: "DA,21686148-6449-6E6F-744E-656564454649", - Offset: asOffsetPtr(0), - Size: 1 * quantity.SizeMiB, - Content: []gadget.VolumeContent{ - { - Image: "foo.img", - OffsetWrite: &gadget.RelativeOffset{ - RelativeTo: "bar", - Offset: 10, - }, - }, - }, - }, - }, - } makeSizedFile(c, filepath.Join(p.dir, "foo.img"), 200*quantity.SizeKiB, []byte("")) @@ -987,10 +964,6 @@ func (p *layoutTestSuite) TestLayoutVolumeOffsetWriteBadRelativeTo(c *C) { v, err := gadget.LayoutVolume(&volBadStructure, opts) c.Check(v, IsNil) c.Check(err, ErrorMatches, `cannot resolve offset-write of structure #0 \("foo"\): refers to an unknown structure "bar"`) - - v, err = gadget.LayoutVolume(&volBadContent, opts) - c.Check(v, IsNil) - c.Check(err, ErrorMatches, `cannot resolve offset-write of structure #0 \("foo"\) content "foo.img": refers to an unknown structure "bar"`) } func (p *layoutTestSuite) TestLayoutVolumeOffsetWriteEnlargesVolume(c *C) { @@ -1017,41 +990,6 @@ volumes: c.Assert(err, IsNil) // offset-write is at 1GB c.Check(v.Size, Equals, 1*quantity.SizeGiB+gadget.SizeLBA48Pointer) - - var gadgetYamlContent = ` -volumes: - pc: - bootloader: grub - structure: - - name: mbr - type: mbr - size: 440 - - name: foo - type: DA,21686148-6449-6E6F-744E-656564454649 - size: 1M - offset: 1M - content: - - image: foo.img - # 2GB - offset-write: mbr+2147483648 - - image: bar.img - # 1GB - offset-write: mbr+1073741824 - - image: baz.img - # 3GB - offset-write: mbr+3221225472 - -` - makeSizedFile(c, filepath.Join(p.dir, "foo.img"), 200*quantity.SizeKiB, []byte("")) - makeSizedFile(c, filepath.Join(p.dir, "bar.img"), 150*quantity.SizeKiB, []byte("")) - makeSizedFile(c, filepath.Join(p.dir, "baz.img"), 100*quantity.SizeKiB, []byte("")) - - vol = mustParseVolume(c, gadgetYamlContent, "pc") - - v, err = gadget.LayoutVolume(vol, opts) - c.Assert(err, IsNil) - // foo.img offset-write is at 3GB - c.Check(v.Size, Equals, 3*quantity.SizeGiB+gadget.SizeLBA48Pointer) } func (p *layoutTestSuite) TestLayoutVolumePartialNoSuchFile(c *C) { |
