Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package mksusecd for openSUSE:Factory 
checked in at 2026-03-19 17:38:33
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/mksusecd (Old)
 and      /work/SRC/openSUSE:Factory/.mksusecd.new.8177 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "mksusecd"

Thu Mar 19 17:38:33 2026 rev:98 rq:1341022 version:5.1

Changes:
--------
--- /work/SRC/openSUSE:Factory/mksusecd/mksusecd.changes        2026-03-06 
18:19:12.789700841 +0100
+++ /work/SRC/openSUSE:Factory/.mksusecd.new.8177/mksusecd.changes      
2026-03-19 17:39:17.362562916 +0100
@@ -1,0 +2,25 @@
+Wed Mar 18 18:18:39 UTC 2026 - [email protected]
+
+- merge gh#openSUSE/mksusecd#100
+- follow parti 2.11 update
+- 5.1
+
+--------------------------------------------------------------------
+Wed Mar 18 17:47:38 UTC 2026 - [email protected]
+
+- merge gh#openSUSE/mksusecd#99
+- more doc updates
+
+--------------------------------------------------------------------
+Wed Mar 18 17:36:09 UTC 2026 - [email protected]
+
+- merge gh#openSUSE/mksusecd#98
+- avoid problems with xz and landlock lsm
+- rewrite boot option handling to allow to repeat boot options
+  (bsc#1259255)
+- update boot options in all s390x parmfiles (bsc#1259255)
+- set umask to a sensible value and clear ACLs for tmp dir
+  (bsc#1259255)
+- documentation update
+
+--------------------------------------------------------------------

Old:
----
  mksusecd-5.0.tar.xz

New:
----
  mksusecd-5.1.tar.xz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ mksusecd.spec ++++++
--- /var/tmp/diff_new_pack.pFZ5Pc/_old  2026-03-19 17:39:18.082592752 +0100
+++ /var/tmp/diff_new_pack.pFZ5Pc/_new  2026-03-19 17:39:18.086592918 +0100
@@ -18,7 +18,7 @@
 
 
 Name:           mksusecd
-Version:        5.0
+Version:        5.1
 Release:        0
 Summary:        Tool to create SUSE Linux installation ISOs
 License:        GPL-3.0+

++++++ mksusecd-5.0.tar.xz -> mksusecd-5.1.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mksusecd-5.0/VERSION new/mksusecd-5.1/VERSION
--- old/mksusecd-5.0/VERSION    2026-03-05 19:58:20.000000000 +0100
+++ new/mksusecd-5.1/VERSION    2026-03-18 19:18:39.000000000 +0100
@@ -1 +1 @@
-5.0
+5.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mksusecd-5.0/changelog new/mksusecd-5.1/changelog
--- old/mksusecd-5.0/changelog  2026-03-05 19:58:20.000000000 +0100
+++ new/mksusecd-5.1/changelog  2026-03-18 19:18:39.000000000 +0100
@@ -1,3 +1,17 @@
+2026-03-18:    5.1
+       - merge gh#openSUSE/mksusecd#98
+       - avoid problems with xz and landlock lsm
+       - rewrite boot option handling to allow to repeat boot options
+         (bsc#1259255)
+       - update boot options in all s390x parmfiles (bsc#1259255)
+       - set umask to a sensible value and clear ACLs for tmp dir
+         (bsc#1259255)
+       - documentation update
+       - merge gh#openSUSE/mksusecd#99
+       - more doc updates
+       - merge gh#openSUSE/mksusecd#100
+       - follow parti 2.11 update
+
 2026-03-05:    5.0
        - merge gh#openSUSE/mksusecd#97
        - boot loader config moved to boot/ARCH/loader directory for
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mksusecd-5.0/mkmedia new/mksusecd-5.1/mkmedia
--- old/mksusecd-5.0/mkmedia    2026-03-05 19:58:20.000000000 +0100
+++ new/mksusecd-5.1/mkmedia    2026-03-18 19:18:39.000000000 +0100
@@ -33,6 +33,10 @@
 
     $self->{base} = $t;
 
+    if(-x "/usr/bin/setfacl") {
+      system "/usr/bin/setfacl --remove-all '$t'";
+    }
+
     if(!$save_tmp) {
       my $s_t = $SIG{TERM};
       $SIG{TERM} = sub { File::Temp::cleanup; &$s_t if $s_t };
@@ -191,6 +195,10 @@
 sub unpack_orig_initrd;
 sub extract_installkeys;
 sub create_cd_ikr;
+sub append_option;
+sub insert_option;
+sub delete_option;
+sub parse_options;
 sub merge_options;
 sub isolinux_add_option;
 sub grub2_add_option;
@@ -460,6 +468,8 @@
   die "$opt_tmp_dir: directory not executable\n" unless -X _ && -X _;
 }
 
+umask 0022;
+
 $ENV{PATH} = "$LIBEXECDIR/mkmedia:/usr/bin:/bin:/usr/sbin:/sbin";
 
 if($>) {
@@ -1459,6 +1469,10 @@
       $boot->{$main_arch}{initrd} = "$z_dir/initrd" if 
is_file("$z_dir/initrd");
       $boot->{$main_arch}{kernel} = "$z_dir/linux" if is_file("$z_dir/linux");
 
+      for my $p (qw ( cdboot.prm generic.prm genericdvd.prm parmfile 
parmfile.hmc )) {
+        push @{$boot->{$main_arch}{parmfiles}}, "$z_dir/$p" if 
is_file("$z_dir/$p");
+      }
+
       $boot->{$main_arch}{parmfile} = $parmfile;
       $boot->{$main_arch}{zipl_map} = $boot->{$main_arch}{kernel};
       $boot->{$main_arch}{zipl_map} =~ s#/[^/]*$#/zipl.map#;
@@ -1472,6 +1486,7 @@
         $boot->{$main_arch}{bl}{ikr}{ins} = "suse.ins" if is_file("suse.ins");
         $boot->{$main_arch}{bl}{ikr}{ins} = "$z_dir/suse.ins" if 
is_file("$z_dir/suse.ins");
         $boot->{$main_arch}{bl}{ikr}{layout} = read_s390x_ins 
$boot->{$main_arch}{bl}{ikr}{ins};
+        # used when parsing boot loader config
         $boot->{$main_arch}{bl}{ikr}{config} = $parmfile;
       }
     }
@@ -1611,21 +1626,6 @@
     if($_ eq 's390x') {
       $opt_no_mbr_code = 1 if !defined $opt_no_mbr_code;
       $opt_zipl = 1 if !defined $opt_zipl;
-      if($opt_boot_options && $boot->{s390x}{parmfile}) {
-        my $f = copy_or_new_file $boot->{s390x}{parmfile};
-        my $boot_opts;
-        if(open my $fd, $f) {
-          local $/;
-          $boot_opts = <$fd>;
-          close $fd;
-        }
-        $boot_opts =~ s/\s*$//;
-        $opt_boot_options = merge_options $boot_opts, $opt_boot_options;
-        if(open my $fd, ">", $f) {
-          print $fd "$opt_boot_options\n";
-          close $fd;
-        }
-      }
       if($opt_zipl) {
         my $zipl_map = $boot->{s390x}{zipl_map};
         my $zipl_map_dirs = $zipl_map;
@@ -2301,7 +2301,7 @@
 
   $opt = " --kernel $kernel --initrd $initrd --map $map";
 
-  my $boot_opts = $opt_boot_options;
+  my $boot_opts = merge_options "", $opt_boot_options;
 
   if($parmfile) {
     $opt .= " --parm $parmfile";
@@ -3539,64 +3539,156 @@
 
 
 # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# append_option(option_list, option)
+#
+# Append option to option_list. option_list is modified.
+#
+sub append_option
+{
+  my $opts = $_[0];
+  my $opt = $_[1];
+
+  push @{$opts->{list}}, $opt;
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# insert_option(option_list, option)
+#
+# Insert option in option_list. Either replace existing option or append if
+# none existed in option_list. option_list is modified.
+#
+sub insert_option
+{
+  my $opts = $_[0];
+  my $opt = $_[1];
+
+  my $len = @{$opts->{list}};
+
+  for(my $idx = 0; $idx < $len; $idx++) {
+    my $opt_idx = $opts->{list}[$idx];
+    if($opt_idx->{key} eq $opt->{key}) {
+      $opts->{list}[$idx] = $opt;
+      return;
+    }
+  }
+
+  push @{$opts->{list}}, $opt;
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# delete_option(option_list, option)
+#
+# Delete option from option_list. option_list is modified.
+#
+sub delete_option
+{
+  my $opts = $_[0];
+  my $opt = $_[1];
+
+  my $len = @{$opts->{list}};
+
+  for(my $idx = 0; $idx < $len; $idx++) {
+    my $opt_idx = $opts->{list}[$idx];
+    if($opt_idx->{key} eq $opt->{key}) {
+      splice @{$opts->{list}}, $idx, 1;
+      $idx--;
+      $len--;
+    }
+  }
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+# parse_options(options)
+#
+# Parse option string into individual options and return hash with option data.
+#
+sub parse_options
+{
+  my $opts = $_[0];
+  my $parsed = { list => [], count => {} };
+
+  for my $opt (split " ", $opts) {
+    my $key = $opt;
+    my $value;
+    my $delete;
+    if($opt =~ /(.*?)=(.*)/) {
+      $key = $1;
+      $value = $2;
+    }
+    if($key =~ s/^-//) {
+      $delete = 1;
+    }
+    else {
+      $parsed->{count}{$key}++;
+    }
+    push @{$parsed->{list}}, { key => $key, value => $value, delete => $delete 
};
+  }
+
+  return $parsed;
+}
+
+
+# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 # merge_options(options, new_options)
 #
 # Update boot options with new_options and return updated option string.
 #
+# Options prefixed by '-' are removed.
+#
+# If an option key appears more than once it is assumed the option can be
+# used more than once and all options are added.
+#
+# If an option key appears only once de-duplication is done and any existing
+# option with this key is replaced.
+#
+# If this gets too magical, put some option in quotes ("") - in this case
+# the entire new option string is passed on verbatim.
+#
 sub merge_options
 {
   my $opts = $_[0];
   my $new_opts = $_[1];
 
+  $opts =~ s/\s*$//;
+
+  my $p_opts = parse_options $opts;
+  my $p_new_opts = parse_options $new_opts;
+
   # avoid tricky stuff...
   if($opts =~ /"/ || $new_opts =~ /"/) {
-    $opts .= " $new_opts";
+    $opts .= " " if $opts ne "";
+    $opts .= $new_opts;
   }
   else {
-    my @opts;
-    my %new_opts;
-    my @new_opts_order;
-    for my $n (split " ", $new_opts) {
-      if($n =~ /(.*?)=(.*)/) {
-        push @new_opts_order, $1;
-        $new_opts{$1} = $2;
+    for my $opt (@{$p_new_opts->{list}}) {
+      if($opt->{delete}) {
+        delete_option $p_opts, $opt;
+      }
+      # 'initrd' is special: never allow duplication (needed for isolinux 
config)
+      elsif($p_new_opts->{count}{$opt->{key}} > 1 && $opt->{key} ne 'initrd') {
+        append_option $p_opts, $opt;
       }
       else {
-        push @new_opts_order, $n;
-        $new_opts{$n} = undef;
+        insert_option $p_opts, $opt;
       }
     }
 
-    for my $opt (split " ", $opts) {
-      my $k = $opt;
-      $k =~ s/=.*//;
-      if(exists $new_opts{$k}) {
-        $opt = $k;
-        $opt .= "=$new_opts{$k}" if defined $new_opts{$k};
-        delete $new_opts{$k};
-      }
-      if(exists $new_opts{"-$k"}) {
-        $opt = undef;
-        delete $new_opts{$k};
+    my @opt_list;
+    for my $opt (@{$p_opts->{list}}) {
+      if(defined $opt->{value}) {
+        push @opt_list, "$opt->{key}=$opt->{value}"
       }
-      push @opts, $opt if defined $opt;
-    }
-
-    for my $opt (@new_opts_order) {
-      my $k = $opt;
-      if(exists $new_opts{$opt}) {
-        if($opt !~ /^-/) {
-          $opt .= "=$new_opts{$opt}" if defined $new_opts{$opt};
-          delete $new_opts{$k};
-          push @opts, $opt;
-        }
+      else {
+        push @opt_list, "$opt->{key}"
       }
     }
-
-    $opts = join ' ', @opts;
+    $opts = join ' ', @opt_list;
   }
 
-  print "boot options update:\n  \"$_[0]\"\n+ \"$_[1]\"\n= \"$opts\"\n" if 
$opt_verbose >= 3;
+  print "boot options update:\n  \"$_[0]\"\n+ \"$_[1]\"\n= \"$opts\"\n" if 
$opt_verbose >= 2;
 
   return $opts;
 }
@@ -3829,6 +3921,22 @@
       $m = copy_file "$boot->{$b}{bl}{isolinux}{base}/message" if 
$opt_new_boot_entry;
       isolinux_add_option $n, $opt_boot_options, $m;
     }
+    if($boot->{$b}{bl}{ikr}) {
+      for my $parmfile (@{$boot->{s390x}{parmfiles}}) {
+        my $f = copy_or_new_file $parmfile;
+        my $boot_opts;
+        if(open my $fd, $f) {
+          local $/;
+          $boot_opts = <$fd>;
+          close $fd;
+        }
+        $boot_opts = merge_options $boot_opts, $opt_boot_options;
+        if(open my $fd, ">", $f) {
+          print $fd "$boot_opts\n";
+          close $fd;
+        }
+      }
+    }
     if($boot->{$b}{bl}{grub2}) {
       my $n = copy_file $boot->{$b}{bl}{grub2}{config} || copy_file 
"$boot->{$b}{bl}{grub2}{base}/grub.cfg";
       grub2_add_option $n, $opt_boot_options;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mksusecd-5.0/mkmedia_man.adoc 
new/mksusecd-5.1/mkmedia_man.adoc
--- old/mksusecd-5.0/mkmedia_man.adoc   2026-03-05 19:58:20.000000000 +0100
+++ new/mksusecd-5.1/mkmedia_man.adoc   2026-03-18 19:18:39.000000000 +0100
@@ -481,7 +481,7 @@
 to be used for the whole image.
 
 For a detailed technical description of the ISO image layout in hybrid mode,
-see https://github.com/openSUSE/mksusecd/blob/master/layout.md.
+see https://github.com/openSUSE/mkmedia/blob/master/layout.md.
 
 There are several options to control the hybrid mode layout:
 
@@ -547,11 +547,33 @@
 
 === Boot option and initrd config option notes
 
-The argument to *--boot* is a space-separated list of boot options, e.g. 
*--boot="foo=1 bar zap=2"*.
+The argument to *--boot* is a space-separated list of boot options, e.g. 
*--boot "foo=1 bar zap=2"*.
 If an option is already used in the existng boot
 config, the option is modified in place. If it is a new option, it is appended 
to the
 list of boot options. You can also remove options by prefixing them with a 
minus sign, for example
-*--boot="-foo -bar zap=123"* would remove options *foo* and *bar* and 
add/modify opion *zap*.
+*--boot "-foo -bar zap=123"* would remove options *foo* and *bar* and 
add/modify opion *zap*.
+
+The boot config is modified in all boot loader config files on the medium.
+Notably, on s390x, all parmfiles are adjusted.
+
+There is some special magic implemented when it comes to boot options than
+can validly be specified more than once. For example *--boot "console=ttyS0
+console=ttyS1"*. If a boot option is specified at least twice, it is assumed
+that the intention is to have them all added to the kernel command line. In
+this case, these options are all added without replacing any existing
+option of the same name. If you intend to replace an existing old option
+of the same name, remove the old entry explicitly with *"-OPTION"*.
+
+For example, assuming there is an existing boot loader config with options
+"console=ttyS0". Then
+
+1. *--boot "console=ttyS1"* results in "console=ttyS1"
+2. *--boot "console=ttyS1 console=ttyS2"* results in "console=ttyS0 
console=ttyS1 console=ttyS2"
+3. *--boot "-console console=ttyS1 console=ttyS2"* results in "console=ttyS1 
console=ttyS2"
+
+This magic is turned off if there are quotes ("") used in any place in the 
boot options. For example
+*--boot "foo=\"X\""*. In this case, the entire boot option string is simply 
appended to any
+existing options verbatim.
 
 Boot options are often options intended for the installation program. For
 example, passing an AutoYaST profile. In some situations this might add up to
@@ -562,6 +584,8 @@
 can be used in various places without having to worry about getting all the 
boot
 options right.
 
+This is also a possible way to avoid lenghty parmfiles on s390x.
+
 Instead of *--boot foo=123* you can use *--initrd-config foo=123*. But watch 
out for the different
 syntax if you set more than one option:
 *--boot "foo=123 bar=abc"* vs. *--initrd-config foo=123 --initrd-config 
bar=abc*.
@@ -571,7 +595,7 @@
 from boot config to initrd config, make sure you remove the option from the 
boot config.
 
 For example, Fedora media set inst.stage2 (the installer root file system 
location) as boot option. To move it to
-the initrd, unset it there: *--boot=-inst.stage2* *--initrd-config 
inst.stage2=http://example.com/foo*.
+the initrd, unset it there: *--boot -inst.stage2* *--initrd-config 
inst.stage2=http://example.com/foo*.
 
 === Driver update notes
 
@@ -940,7 +964,7 @@
 mkmedia --create new.iso sles.iso tftpboot-installation-SLE.rpm
 ----
 
-Find more usage examples here: 
https://github.com/openSUSE/mksusecd/blob/master/HOWTO.md
+Find more usage examples here: 
https://github.com/openSUSE/mkmedia/blob/master/HOWTO.md
 
 == See Also
 
@@ -948,12 +972,14 @@
 
 == Links
 
-- YaST, linuxrc options: https://en.opensuse.org/SDB:Linuxrc (linuxrc, YaST)
-- dracut options: 
https://github.com/dracutdevs/dracut/blob/master/man/dracut.cmdline.7.asc
-- Agama options: 
https://agama-project.github.io/docs/user/reference/boot_options
-- Anaconda options: 
https://anaconda-installer.readthedocs.io/en/latest/boot-options.html
-- driver update documentaion: 
https://github.com/openSUSE/mkdud/blob/master/README.md
-- more documentation: /usr/share/doc/packages/mksusecd
-- get latest version: 
https://github.com/openSUSE/mksusecd?tab=readme-ov-file#downloads
-- mksusecd web site: https://github.com/openSUSE/mksusecd
+- extensive usage summary: 
https://www.suse.com/c/make-your-own-suse-dvd-tooling-for-suse-and-multi-linux-installation-live-media
 +
+- the same, locally: file:///usr/share/doc/packages/mksusecd/suse_blog.html +
+- mkmedia web site: https://github.com/openSUSE/mkmedia +
+- more documentation: file:///usr/share/doc/packages/mksusecd +
+- get latest version: 
https://github.com/openSUSE/mkmedia?tab=readme-ov-file#downloads +
+- driver update documentaion: 
https://github.com/openSUSE/mkdud/blob/master/README.md +
+- YaST, linuxrc options: https://en.opensuse.org/SDB:Linuxrc (linuxrc, YaST) +
+- dracut options: 
https://github.com/dracutdevs/dracut/blob/master/man/dracut.cmdline.7.asc +
+- Agama options: 
https://agama-project.github.io/docs/user/reference/boot_options +
+- Anaconda options: 
https://anaconda-installer.readthedocs.io/en/latest/boot-options.html +
 - openSUSE Build Service: https://build.opensuse.org
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mksusecd-5.0/suse_blog.adoc 
new/mksusecd-5.1/suse_blog.adoc
--- old/mksusecd-5.0/suse_blog.adoc     2026-03-05 19:58:20.000000000 +0100
+++ new/mksusecd-5.1/suse_blog.adoc     2026-03-18 19:18:39.000000000 +0100
@@ -1022,11 +1022,13 @@
 === Integrate driver updates
 
 Driver updates (DUDs) come in a special format. `mkmedia` recognizes this
-format and can integrate them directly into the initrd.
+format and can add them to the initrd or apply them directly to the ISO image.
 
 The advantage compared to using a `dud` or `inst.dud` boot option is that this 
way you do not have to download it
 during the installation process and there is no signature check because initrd 
content is implicitly trusted.
 
+To add a DUD to the initrd, do:
+
 [source]
 ----
 # mkmedia --create new.iso \
@@ -1035,6 +1037,24 @@
 ...
 ----
 
+This will make the DUD automatically available during the installation
+process. You do not have to specify it separately on the kernel command
+line. The DUD is applied during the installation.
+
+Alternatively, you can apply a DUD directly to the ISO image using the 
`--apply-dud` option:
+
+[source]
+----
+# mkmedia --create new.iso \
+  --apply-dud foobar.dud \
+  SLE-15-SP6-Online-x86_64-GM-Media1.iso
+...
+----
+
+The difference to using `--initrd` is that the DUD is applied by `mkmedia` 
when creating the new ISO image.
+This has the advantage that the DUD can also describe changes to the medium 
itself. For example, updating the kernel
+used during installation or an update to the boot loader used for booting the 
installation medium.
+
 === Integrate add-on repositories
 
 If you have additional software (or a bunch of package updates) for the
@@ -1056,6 +1076,29 @@
 
 This currently works only for YaST-based installation media like SLE-15, 
Leap-15, or Tumbleweed, though.
 
+=== Modify files on the installation medium
+
+If you need to apply changes to the installation medium not covered so far:
+you can also change or add directories and files directly on the installation
+medium.
+
+For this, specify several source arguments to `mkmedia`. All these sources
+(can be ISO images or plain directories) are combined, with later specified
+sources taking precedence.
+
+For example, to replace the parmfile on an s390x medium with your own version,
+create the necessary directory structure and copy your file into the right 
spot:
+
+[source]
+----
+# mkdir -p /tmp/foo/boot/s390x
+# cp my_special_parmfile /tmp/foo/boot/s390x/parmfile
+# mkmedia --create new.iso \
+  SLE-15-SP6-Full-s390x-GM-Media1.iso \
+  /tmp/foo
+...
+----
+
 === Advanced examples
 
 ==== 1. Create pure disk image (no ISO image)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mksusecd-5.0/tools/mnt/mnt 
new/mksusecd-5.1/tools/mnt/mnt
--- old/mksusecd-5.0/tools/mnt/mnt      2026-03-05 19:58:20.000000000 +0100
+++ new/mksusecd-5.1/tools/mnt/mnt      2026-03-18 19:18:39.000000000 +0100
@@ -328,6 +328,15 @@
 
   exit 0 if $opt_no_mount;
 
+  my $fd;
+
+  # get file handle in case $src is inside $dst and the tmpfs mount would 
shadow it
+  if(open $fd, $src) {
+    my $fnr = fileno $fd;
+    $src = "/proc/$$/fd/$fnr";
+    print "using $src\n" if $opt_verbose >= 2;
+  }
+
   sudo_cmd "mount -o 'size=0,nr_inodes=0' -t tmpfs tmpfs '$dst'";
 
   unpack_archive $archive_type, $src, $dst, $src_part;
@@ -985,7 +994,8 @@
           $c = 'gzip --quiet -dc';
         }
         elsif($1 eq 'xz') {
-          $c = 'xz --quiet -dc';
+          # xz doesn't like symlinks due to landlock lsm
+          $c = 'xz --quiet -dc <';
         }
         elsif($1 eq 'zst') {
           $c = 'zstd --quiet --force -dc';
@@ -997,6 +1007,9 @@
           $c = 'rpm2cpio';
         }
         if($cmd) {
+          # remove potential redirection, see xz
+          $c =~ s/\s*<$//;
+
           $cmd .= " | $c";
         }
         else {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mksusecd-5.0/tools/parti/NOTE 
new/mksusecd-5.1/tools/parti/NOTE
--- old/mksusecd-5.0/tools/parti/NOTE   2026-03-05 19:58:20.000000000 +0100
+++ new/mksusecd-5.1/tools/parti/NOTE   2026-03-18 19:18:39.000000000 +0100
@@ -1,3 +1,5 @@
+parti 2.11
+
 Does not contain libmediacheck related parts (see __WITH_MEDIA_CHECK__) to
 avoid additional linking dependency (and the info is not used by
 mkmedia/verifymedia anyway).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mksusecd-5.0/tools/parti/disk.c 
new/mksusecd-5.1/tools/parti/disk.c
--- old/mksusecd-5.0/tools/parti/disk.c 2026-03-05 19:58:20.000000000 +0100
+++ new/mksusecd-5.1/tools/parti/disk.c 2026-03-18 19:18:39.000000000 +0100
@@ -23,19 +23,21 @@
 
 int disk_read(disk_t *disk, void *buffer, uint64_t block_nr, unsigned count)
 {
-  unsigned factor = disk->block_size / disk->chunk_size;
+  unsigned factor = disk->block_size / DISK_CHUNK_SIZE;
 
   // fprintf(stderr, "read: %llu - %u (factor = %u)\n", (unsigned long long) 
block_nr, count, factor);
 
+  uint64_t chunk_nr = block_nr * factor;
+
   count *= factor;
-  block_nr *= factor;
 
-  for(unsigned u = 0; u < count; u++, block_nr++, buffer += disk->chunk_size) {
-    // fprintf(stderr, "read request: disk %u, addr %08"PRIx64"\n", 
disk->index, block_nr * disk->chunk_size);
-    if(!disk_cache_read(disk, buffer, block_nr)) {
-      int err = disk_read_single(disk, buffer, block_nr);
+  for(unsigned u = 0; u < count; u++, chunk_nr++, buffer += DISK_CHUNK_SIZE) {
+    // fprintf(stderr, "read request: disk %u, addr %08"PRIx64"\n", 
disk->index, chunk_nr * DISK_CHUNK_SIZE);
+    if(disk_cache_read(disk, &(disk_chunk_t) { .nr = chunk_nr, .data = buffer 
})) {
+      int err = disk_read_single(disk, buffer, chunk_nr);
+      if(err) return err;
+      err = disk_cache_store(disk, &(disk_chunk_t) { .nr = chunk_nr, .data = 
buffer });
       if(err) return err;
-      disk_cache_store(disk, buffer, block_nr);
     }
   }
 
@@ -46,15 +48,15 @@
 int disk_read_single(disk_t *disk, void *buffer, uint64_t block_nr)
 {
   if(disk->fd == -1) {
-    // fprintf(stderr, "cache miss: disk %u, addr %08"PRIx64"\n", disk->index, 
block_nr * disk->chunk_size);
-    memset(buffer, 0, disk->chunk_size);
+    // fprintf(stderr, "cache miss: disk %u, addr %08"PRIx64"\n", disk->index, 
block_nr * DISK_CHUNK_SIZE);
+    memset(buffer, 0, DISK_CHUNK_SIZE);
 
     return 0;
   }
 
   // fprintf(stderr, "read: %llu[%llu]\n", (unsigned long long) block_nr, 
(unsigned long long) disk->size);
 
-  off_t offset = block_nr * disk->chunk_size;
+  off_t offset = block_nr * DISK_CHUNK_SIZE;
 
   if(lseek(disk->fd, offset, SEEK_SET) != offset) {
     fprintf(stderr, "sector %"PRIu64" not found\n", block_nr);
@@ -62,7 +64,7 @@
     return 2;
   }
 
-  if(read(disk->fd, buffer, disk->chunk_size) != disk->chunk_size) {
+  if(read(disk->fd, buffer, DISK_CHUNK_SIZE) != DISK_CHUNK_SIZE) {
     fprintf(stderr, "error reading sector %"PRIu64"\n", block_nr);
 
     return 3;
@@ -72,30 +74,96 @@
 }
 
 
-int disk_cache_read(disk_t *disk, void *buffer, uint64_t chunk_nr)
+int disk_cache_read(disk_t *disk, disk_chunk_t *chunk)
 {
-  for(disk_data_t *disk_data = disk->data; disk_data; disk_data = 
disk_data->next) {
-    if(disk_data->chunk_nr == chunk_nr) {
-      memcpy(buffer, disk_data->data, disk->chunk_size);
-      return 1;
+  if(!chunk || !chunk->data || chunk->nr == UINT64_MAX) return 1;
+
+  int match;
+  unsigned u = disk_find_chunk(disk, chunk->nr, &match);
+
+  if(!match) return 2;
+
+  memcpy(chunk->data, disk->chunks.list[u].data, DISK_CHUNK_SIZE);
+
+  return 0;
+}
+
+
+int disk_cache_store(disk_t *disk, disk_chunk_t *chunk)
+{
+  if(!chunk || !chunk->data || chunk->nr == UINT64_MAX) return 1;
+
+  int match;
+  unsigned u = disk_find_chunk(disk, chunk->nr, &match);
+
+  if(!match) {
+    if(disk->chunks.len >= DISK_MAX_CHUNKS) return 2;
+    void *buffer = malloc(DISK_CHUNK_SIZE);
+    if(!buffer) return 3;
+    memcpy(buffer, chunk->data, DISK_CHUNK_SIZE);
+    disk->chunks.len++;
+    if(disk->chunks.len > disk->chunks.max) {
+      disk->chunks.max += DISK_CHUNKS_EXTRA;
+      disk->chunks.list = realloc(disk->chunks.list, disk->chunks.max * sizeof 
(disk_chunk_t));
+      if(disk->chunks.list == NULL) {
+        free(buffer);
+        disk->chunks.len = disk->chunks.max = 0;
+        return 4;
+      }
     }
+    if(u + 1 < disk->chunks.len) {
+      memmove(disk->chunks.list + u + 1, disk->chunks.list + u, sizeof 
(disk_chunk_t) * (disk->chunks.len - u - 1));
+    }
+    disk->chunks.list[u].nr = chunk->nr;
+    disk->chunks.list[u].data = buffer;
   }
 
   return 0;
 }
 
 
-void disk_cache_store(disk_t *disk, void *buffer, uint64_t chunk_nr)
+// Binary search.
+// If matched, return value is index that matched.
+// If no match, return value is position at which to insert new value (may
+// point at position right after end of the list).
+unsigned disk_find_chunk(disk_t *disk, uint64_t chunk_nr, int *match)
 {
-  // fprintf(stderr, "cache store: disk %u, addr %08"PRIx64"\n", disk->index, 
chunk_nr * disk->chunk_size);
-  disk_data_t *disk_data = calloc(1, sizeof *disk_data);
+  *match = 0;
+
+  disk_chunk_t *chunk_list = disk->chunks.list;
+
+  unsigned u_start = 0;
+  unsigned u_end = disk->chunks.len;
+  unsigned u = 0;
 
-  disk_data->chunk_nr = chunk_nr;
-  disk_data->data = malloc(disk->chunk_size);
-  memcpy(disk_data->data, buffer, disk->chunk_size);
+  while(u_end > u_start) {
+    u = (u_end + u_start) / 2;
+
+    int64_t i = chunk_nr - chunk_list[u].nr;
+
+    if(i == 0) {
+      *match = 1;
+      break;
+    }
+
+    if(u_end == u_start + 1) {
+      if(i > 0) u++;
+      break;
+    }
 
-  disk_data->next = disk->data;
-  disk->data = disk_data;
+    if(i > 0) {
+      if(u_end == u + 1) {
+        if(i > 0) u++;
+        break;
+      }
+      u_start = u;
+    }
+    else {
+      u_end = u;
+    }
+  }
+
+  return u;
 }
 
 
@@ -113,16 +181,9 @@
 
   fprintf(f, "# disk %u, size = %"PRIu64"\n", disk->index, 
disk->size_in_bytes);
 
-  uint64_t chunk_nr = 0;
-  disk_data_t *disk_data;
-
-  do {
-    disk_data = disk_cache_search(disk, &chunk_nr);
-    if(disk_data) {
-      disk_cache_dump(disk, disk_data, f);
-    }
+  for(unsigned u = 0; u < disk->chunks.len; u++) {
+    disk_cache_dump(disk, disk->chunks.list + u, f);
   }
-  while(chunk_nr != UINT64_MAX);
 
   if(f != stdout) fclose(f);
 
@@ -132,23 +193,16 @@
 
 int disk_to_fd(disk_t *disk, uint64_t offset)
 {
-  uint64_t chunk_nr = 0;
-  disk_data_t *disk_data;
-
   int fd = syscall(SYS_memfd_create, "", 0);
 
   if(fd == -1) return 0;
 
-  do {
-    disk_data = disk_cache_search(disk, &chunk_nr);
-    if(disk_data) {
-      if(disk_data->chunk_nr * disk->chunk_size >= offset) {
-        lseek(fd, disk_data->chunk_nr * disk->chunk_size - offset, SEEK_SET);
-        write(fd, disk_data->data, disk->chunk_size);
-      }
+  for(unsigned u = 0; u < disk->chunks.len; u++) {
+    if(disk->chunks.list[u].nr * DISK_CHUNK_SIZE >= offset) {
+      lseek(fd, disk->chunks.list[u].nr * DISK_CHUNK_SIZE - offset, SEEK_SET);
+      write(fd, disk->chunks.list[u].data, DISK_CHUNK_SIZE);
     }
   }
-  while(chunk_nr != UINT64_MAX);
 
   lseek(fd, 0, SEEK_SET);
 
@@ -156,19 +210,21 @@
 }
 
 
-void disk_cache_dump(disk_t *disk, disk_data_t *disk_data, FILE *file)
+int disk_cache_dump(disk_t *disk, disk_chunk_t *chunk, FILE *file)
 {
+  if(!file) return 1;
+
   uint8_t all_zeros[16] = {};
-  uint8_t *data = disk_data->data;
+  uint8_t *data = chunk->data;
 
   uint64_t max_addr = disk->size_in_bytes - 1;
   unsigned address_digits = 0;
   while(max_addr >>= 4) address_digits++;
   if(address_digits < 4) address_digits = 4;
 
-  for(unsigned u = 0; u < disk->chunk_size; u += 16) {
+  for(unsigned u = 0; u < DISK_CHUNK_SIZE; u += 16) {
     if(memcmp(data + u, &all_zeros, 16)) {
-      fprintf(file, "%0*"PRIx64" ", address_digits, disk_data->chunk_nr * 
disk->chunk_size + u);
+      fprintf(file, "%0*"PRIx64" ", address_digits, chunk->nr * 
DISK_CHUNK_SIZE + u);
       for(unsigned u1 = 0; u1 < 16; u1++) {
         fprintf(file, " %02x", data[u + u1]);
       }
@@ -179,28 +235,8 @@
       fprintf(file, "\n");
     }
   }
-}
-
-
-disk_data_t *disk_cache_search(disk_t *disk, uint64_t *chunk_nr)
-{
-  disk_data_t *disk_data_found = NULL;
-  uint64_t next_chunk_nr = UINT64_MAX;
-
-  if(*chunk_nr == next_chunk_nr) return NULL;
 
-  for(disk_data_t *disk_data = disk->data; disk_data; disk_data = 
disk_data->next) {
-    if(disk_data->chunk_nr == *chunk_nr) {
-      disk_data_found = disk_data;
-    }
-    if(disk_data->chunk_nr > *chunk_nr && disk_data->chunk_nr < next_chunk_nr) 
{
-      next_chunk_nr = disk_data->chunk_nr;
-    }
-  }
-
-  *chunk_nr = next_chunk_nr;
-
-  return disk_data_found;
+  return 0;
 }
 
 
@@ -231,7 +267,7 @@
 void disk_init(char *file_name)
 {
   struct stat sbuf;
-  disk_t disk = { .chunk_size = 512, .block_size = 512 };
+  disk_t disk = { .block_size = DISK_CHUNK_SIZE };
 
   disk.fd = open(file_name, O_RDONLY | O_LARGEFILE);
 
@@ -264,7 +300,7 @@
 
   disk_t disk = { .fd = -1 };
 
-  uint8_t chunk[512];
+  uint8_t buffer[DISK_CHUNK_SIZE];
   uint64_t current_chunk_nr = UINT64_MAX;
 
   while(getline(&line, &line_len, file) > 0) {
@@ -275,14 +311,14 @@
     uint8_t line_data[16];
     if(sscanf(line, "# disk %u, size = %"SCNu64"", &index, &size) == 2) {
       if(disk.name) {
-        if(current_chunk_nr != UINT64_MAX) disk_cache_store(&disk, chunk, 
current_chunk_nr);
+        if(current_chunk_nr != UINT64_MAX) disk_cache_store(&disk, 
&(disk_chunk_t) { .nr = current_chunk_nr, .data = buffer });
         disk_add_to_list(&disk);
         disk = (disk_t) { .index = disk_list_size };
         current_chunk_nr = UINT64_MAX;
       }
       asprintf(&disk.name, "%s#%u", file_name, index);
       disk.size_in_bytes = size;
-      disk.chunk_size = disk.block_size = 512;
+      disk.block_size = DISK_CHUNK_SIZE;
     }
     else if(
       sscanf(line,
@@ -296,15 +332,13 @@
       !(addr & 0xf) &&
       addr <= disk.size_in_bytes + 16
     ) {
-      // fprintf(stderr, "XXX %08"PRIx64" %02x %02x\n", addr, line_data[0], 
line_data[1]);
-      uint64_t chunk_nr = addr / disk.chunk_size;
-      // fprintf(stderr, "ZZZ chunk_nr %"PRIu64", current_chunk_nr 
%"PRIu64"\n", chunk_nr, current_chunk_nr);
+      uint64_t chunk_nr = addr / DISK_CHUNK_SIZE;
       if(chunk_nr != current_chunk_nr) {
-        if(current_chunk_nr != UINT64_MAX) disk_cache_store(&disk, chunk, 
current_chunk_nr);
+        if(current_chunk_nr != UINT64_MAX) disk_cache_store(&disk, 
&(disk_chunk_t) { .nr = current_chunk_nr, .data = buffer });
         current_chunk_nr = chunk_nr;
-        memset(chunk, 0, sizeof chunk);
+        memset(buffer, 0, sizeof buffer);
       }
-      memcpy(chunk + (addr % disk.chunk_size), line_data, 16);
+      memcpy(buffer + (addr % DISK_CHUNK_SIZE), line_data, 16);
     }
     else {
       fprintf(stderr, "%s: line %u: invalid import data: %s\n", file_name, 
line_nr, line);
@@ -315,7 +349,7 @@
   free(line);
 
   if(disk.name) {
-    if(current_chunk_nr != UINT64_MAX) disk_cache_store(&disk, chunk, 
current_chunk_nr);
+    if(current_chunk_nr != UINT64_MAX) disk_cache_store(&disk, &(disk_chunk_t) 
{ .nr = current_chunk_nr, .data = buffer });
     disk_add_to_list(&disk);
   }
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mksusecd-5.0/tools/parti/disk.h 
new/mksusecd-5.1/tools/parti/disk.h
--- old/mksusecd-5.0/tools/parti/disk.h 2026-03-05 19:58:20.000000000 +0100
+++ new/mksusecd-5.1/tools/parti/disk.h 2026-03-18 19:18:39.000000000 +0100
@@ -1,10 +1,16 @@
 #include <json-c/json.h>
 
-typedef struct disk_data_s {
-  struct disk_data_s *next;
-  uint64_t chunk_nr;
+// internal block size, fixed
+#define DISK_CHUNK_SIZE                512
+// resize internal chunk list by that amount, if needed
+#define DISK_CHUNKS_EXTRA      256
+// maximum number of chunks to store in internal cache (cache size = 512 MiB)
+#define DISK_MAX_CHUNKS                1024*1024
+
+typedef struct {
+  uint64_t nr;
   uint8_t *data;
-} disk_data_t;
+} disk_chunk_t;
 
 typedef struct {
   char *name;
@@ -14,11 +20,13 @@
   unsigned sectors;
   unsigned cylinders;
   uint64_t size_in_bytes;
-  unsigned chunk_size;
   unsigned block_size;
   unsigned grub_used:1;
   unsigned isolinux_used:1;
-  disk_data_t *data;
+  struct {
+    disk_chunk_t *list;
+    unsigned len, max;
+  } chunks;
   json_object *json_disk;
   json_object *json_current;
 } disk_t;
@@ -29,10 +37,11 @@
 int disk_read(disk_t *disk, void *buf, uint64_t sector, unsigned cnt);
 int disk_read_single(disk_t *disk, void *buffer, uint64_t block_nr);
 
-int disk_cache_read(disk_t *disk, void *buffer, uint64_t chunk_nr);
-void disk_cache_dump(disk_t *disk, disk_data_t *disk_data, FILE *file);
-void disk_cache_store(disk_t *disk, void *buffer, uint64_t chunk_nr);
-disk_data_t *disk_cache_search(disk_t *disk, uint64_t *chunk_nr);
+int disk_cache_read(disk_t *disk, disk_chunk_t *chunk);
+int disk_cache_store(disk_t *disk, disk_chunk_t *chunk);
+int disk_cache_dump(disk_t *disk, disk_chunk_t *chunk, FILE *file);
+
+unsigned disk_find_chunk(disk_t *disk, uint64_t chunk_nr, int *match);
 
 int disk_export(disk_t *disk, char *file_name);
 int disk_to_fd(disk_t *disk, uint64_t offset);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mksusecd-5.0/tools/parti/ptable_apple.c 
new/mksusecd-5.1/tools/parti/ptable_apple.c
--- old/mksusecd-5.0/tools/parti/ptable_apple.c 2026-03-05 19:58:20.000000000 
+0100
+++ new/mksusecd-5.1/tools/parti/ptable_apple.c 2026-03-18 19:18:39.000000000 
+0100
@@ -41,10 +41,12 @@
   json_object_object_add(disk->json_disk, "apple", json_apple);
 
   json_object_object_add(json_apple, "block_size", 
json_object_new_int(disk->block_size));
+  json_object_object_add(json_apple, "disk_size", 
json_object_new_int(disk->size_in_bytes / disk->block_size));
   json_object_object_add(json_apple, "entries", json_object_new_int(parts));
 
   log_info(SEP "\napple partition table: %d entries\n", parts);
   log_info("  sector size: %d\n", disk->block_size);
+  log_info("  disk size: %"PRIu64"\n", disk->size_in_bytes / disk->block_size);
 
   json_object *json_table = json_object_new_array();
   json_object_object_add(json_apple, "partitions", json_table);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mksusecd-5.0/tools/parti/ptable_gpt.c 
new/mksusecd-5.1/tools/parti/ptable_gpt.c
--- old/mksusecd-5.0/tools/parti/ptable_gpt.c   2026-03-05 19:58:20.000000000 
+0100
+++ new/mksusecd-5.1/tools/parti/ptable_gpt.c   2026-03-18 19:18:39.000000000 
+0100
@@ -56,82 +56,17 @@
 
 uint32_t chksum_crc32(void *buf, unsigned len)
 {
-  static uint32_t crc_tab[256] = {
-    0,          0x77073096, 0xee0e612c, 0x990951ba,
-    0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
-    0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
-    0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
-    0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
-    0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
-    0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
-    0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
-    0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
-    0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
-    0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
-    0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
-    0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
-    0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
-    0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
-    0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
-    0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
-    0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
-    0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
-    0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
-    0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
-    0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
-    0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
-    0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
-    0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
-    0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
-    0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
-    0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
-    0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
-    0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
-    0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
-    0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
-    0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
-    0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
-    0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
-    0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
-    0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
-    0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
-    0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
-    0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
-    0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
-    0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
-    0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
-    0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
-    0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
-    0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
-    0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
-    0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
-    0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
-    0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
-    0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
-    0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
-    0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
-    0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
-    0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
-    0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
-    0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
-    0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
-    0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
-    0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
-    0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
-    0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
-    0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
-    0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
-  };
-
-  uint32_t crc;
-  unsigned u;
-  unsigned char *p = buf;
+  uint8_t *bytes = buf;
+  uint32_t crc = -1u;
 
-  for(u = 0, crc = 0xffffffff; u < len; u++) {
-    crc = crc_tab[(uint8_t) crc ^ *p++] ^ (crc >> 8);
+  while(len--) {
+    crc ^= *bytes++;
+    for(int i = 0; i < 8; i++) {
+      crc = (crc >> 1) ^ 0xedb88320 * (crc & 1);
+    }
   }
 
-  return crc ^ 0xffffffff;
+  return ~crc;
 }
 
 
@@ -287,10 +222,12 @@
 
   json_object_object_add(json_gpt, "revision", json_object_new_format("%u.%u", 
gpt->revision >> 16, gpt->revision & 0xffff));
   json_object_object_add(json_gpt, "block_size", 
json_object_new_int(disk->block_size));
+  json_object_object_add(json_gpt, "disk_size", 
json_object_new_int(disk->size_in_bytes / disk->block_size));
   json_object_object_add(json_gpt, "guid", json_object_new_string(guid));
 
   log_info(SEP "\ngpt (%s) guid: %s\n", addr == 1 ? "primary" : "backup", 
guid);
   log_info("  sector size: %u\n", disk->block_size);
+  log_info("  disk size: %"PRIu64"\n", disk->size_in_bytes / disk->block_size);
   log_info("  revision: %u.%u\n", gpt->revision >> 16, gpt->revision & 0xffff);
 
   json_object *json_header = json_object_new_object();
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mksusecd-5.0/tools/parti/ptable_mbr.c 
new/mksusecd-5.1/tools/parti/ptable_mbr.c
--- old/mksusecd-5.0/tools/parti/ptable_mbr.c   2026-03-05 19:58:20.000000000 
+0100
+++ new/mksusecd-5.1/tools/parti/ptable_mbr.c   2026-03-18 19:18:39.000000000 
+0100
@@ -297,7 +297,9 @@
   log_info(SEP "\nmbr id: 0x%08x\n", id);
 
   json_object_object_add(json_mbr, "block_size", 
json_object_new_int(disk->block_size));
+  json_object_object_add(json_mbr, "disk_size", 
json_object_new_int(disk->size_in_bytes / disk->block_size));
   log_info("  sector size: %u\n", disk->block_size);
+  log_info("  disk size: %"PRIu64"\n", disk->size_in_bytes / disk->block_size);
 
   json_object_object_add(json_mbr, "id", json_object_new_format("0x%08x", id));
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/mksusecd-5.0/verifymedia_man.adoc 
new/mksusecd-5.1/verifymedia_man.adoc
--- old/mksusecd-5.0/verifymedia_man.adoc       2026-03-05 19:58:20.000000000 
+0100
+++ new/mksusecd-5.1/verifymedia_man.adoc       2026-03-18 19:18:39.000000000 
+0100
@@ -51,7 +51,9 @@
 
 == Links
 
-- more documentation: `/usr/share/doc/packages/mksusecd` +
-- get latest version: 
https://github.com/openSUSE/mksusecd?tab=readme-ov-file#downloads +
-- mksusecd web site: https://github.com/openSUSE/mksusecd +
+- extensive usage summary: 
https://www.suse.com/c/make-your-own-suse-dvd-tooling-for-suse-and-multi-linux-installation-live-media
 +
+- the same, locally: file:///usr/share/doc/packages/mksusecd/suse_blog.html +
+- more documentation: file:///usr/share/doc/packages/mksusecd +
+- get latest version: 
https://github.com/openSUSE/mkmedia?tab=readme-ov-file#downloads +
+- mkmedia web site: https://github.com/openSUSE/mkmedia +
 - openSUSE Build Service: https://build.opensuse.org

Reply via email to