- Add some missing patches from master and the loop label fixes
- tests: test loop labels (psusi) - libparted: don't trash filesystem when writing loop label (psusi) - libparted: give correct partition device name on loop labels (psusi) - partprobe: do not skip loop labels (psusi) - libparted: don't create partition on loop label (psusi) - libparted: fix loop labels to not vanish (psusi) - libparted: remove all old partitions, even if new label allows less (psusi) - libparted: remove old partitions *first* before adding new ones (psusi) - libparted: don't detect fat and ntfs boot sectors as dos MBR (psusi) - Fix filesystem detection on non 512 byte sectors (psusi) - tests: fix t2310-dos-extended-2-sector-min-offset.sh (psusi) - libparted: remove last_usable_if_grown (psusi)
This commit is contained in:
parent
3e3c91556c
commit
5dcb73843d
28
0101-libparted-remove-last_usable_if_grown.patch
Normal file
28
0101-libparted-remove-last_usable_if_grown.patch
Normal file
@ -0,0 +1,28 @@
|
||||
From 6aa11c2e96499a4a620b54433fd064961d1cbf66 Mon Sep 17 00:00:00 2001
|
||||
From: Phillip Susi <psusi@ubuntu.com>
|
||||
Date: Fri, 18 Apr 2014 11:01:03 -0400
|
||||
Subject: [PATCH 101/103] libparted: remove last_usable_if_grown
|
||||
|
||||
Commit 3398e82a: "libparted: Use common function to calculate PTE sectors"
|
||||
removed usage of the last_usable_if_grown variable, resulting in an error
|
||||
because it is now unused but still defined.
|
||||
---
|
||||
libparted/labels/gpt.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c
|
||||
index e1113ac..b7291a8 100644
|
||||
--- a/libparted/labels/gpt.c
|
||||
+++ b/libparted/labels/gpt.c
|
||||
@@ -723,7 +723,7 @@ _parse_header (PedDisk *disk, const GuidPartitionTableHeader_t *gpt,
|
||||
GPTDiskData *gpt_disk_data = disk->disk_specific;
|
||||
PedSector first_usable;
|
||||
PedSector last_usable;
|
||||
- PedSector last_usable_if_grown, last_usable_min_default;
|
||||
+ PedSector last_usable_if_grown;
|
||||
static int asked_already;
|
||||
|
||||
#ifndef DISCOVER_ONLY
|
||||
--
|
||||
1.9.0
|
||||
|
@ -0,0 +1,45 @@
|
||||
From d68ca7fe15915849629c85f5a5476b2173b3af2c Mon Sep 17 00:00:00 2001
|
||||
From: Phillip Susi <psusi@ubuntu.com>
|
||||
Date: Sat, 29 Mar 2014 16:29:06 -0400
|
||||
Subject: [PATCH 102/103] tests: fix t2310-dos-extended-2-sector-min-offset.sh
|
||||
|
||||
This test was ignoring the requested sector size and always using
|
||||
512 bytes per sector. Fix it to use the requested sector size.
|
||||
---
|
||||
tests/t2310-dos-extended-2-sector-min-offset.sh | 9 +++------
|
||||
1 file changed, 3 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/tests/t2310-dos-extended-2-sector-min-offset.sh b/tests/t2310-dos-extended-2-sector-min-offset.sh
|
||||
index f74cba5..53843ab 100644
|
||||
--- a/tests/t2310-dos-extended-2-sector-min-offset.sh
|
||||
+++ b/tests/t2310-dos-extended-2-sector-min-offset.sh
|
||||
@@ -23,7 +23,8 @@ require_root_
|
||||
require_scsi_debug_module_
|
||||
|
||||
# create memory-backed device
|
||||
-scsi_debug_setup_ dev_size_mb=1 > dev-name ||
|
||||
+ss=$sector_size_
|
||||
+scsi_debug_setup_ sector_size=$ss dev_size_mb=1 > dev-name ||
|
||||
skip_ 'failed to create scsi_debug device'
|
||||
scsi_dev=$(cat dev-name)
|
||||
p1=${scsi_dev}1
|
||||
@@ -31,15 +32,11 @@ p5=${scsi_dev}5
|
||||
|
||||
cat <<EOF > exp || framework_failure
|
||||
BYT;
|
||||
-$scsi_dev:2048s:scsi:512:512:msdos:Linux scsi_debug:;
|
||||
+$scsi_dev:$((2048*512/$ss))s:scsi:$ss:$ss:msdos:Linux scsi_debug:;
|
||||
1:64s:128s:65s:::lba;
|
||||
5:65s:128s:64s:::;
|
||||
EOF
|
||||
|
||||
-cat <<EOF > err.exp || framework_failure
|
||||
-Error: Partition(s) 5 on $scsi_dev have been written, but we have been unable to inform the kernel of the change, probably because it/they are in use. As a result, the old partition(s) will remain in use. You should reboot now before making further changes.
|
||||
-EOF
|
||||
-
|
||||
# Create a DOS label with an extended partition starting at sector 64.
|
||||
parted -s $scsi_dev mklabel msdos || fail=1
|
||||
parted --align=min -s $scsi_dev mkpart extended 64s 128s> out 2>&1 || fail=1
|
||||
--
|
||||
1.9.0
|
||||
|
1329
0103-Fix-filesystem-detection-on-non-512-byte-sectors.patch
Normal file
1329
0103-Fix-filesystem-detection-on-non-512-byte-sectors.patch
Normal file
File diff suppressed because it is too large
Load Diff
107
0104-libparted-don-t-detect-fat-and-ntfs-boot-sectors-as-.patch
Normal file
107
0104-libparted-don-t-detect-fat-and-ntfs-boot-sectors-as-.patch
Normal file
@ -0,0 +1,107 @@
|
||||
From 9f4d2b7c87f99f1dec592111a6a6d267949a2c33 Mon Sep 17 00:00:00 2001
|
||||
From: Phillip Susi <psusi@ubuntu.com>
|
||||
Date: Fri, 2 May 2014 21:50:43 -0400
|
||||
Subject: [PATCH 200/208] libparted: don't detect fat and ntfs boot sectors as
|
||||
dos MBR
|
||||
|
||||
fat and ntfs boot sectors are very similar to an MBR so if you had one of
|
||||
these filesystems on an unpartitioned disk, parted detected them as a dos
|
||||
partition table. Have the dos label code call the fat and ntfs filesystem
|
||||
probes and if they recognize the sector ( their tests are more stringent )
|
||||
then don't claim it as a dos label.
|
||||
---
|
||||
NEWS | 3 +++
|
||||
libparted/fs/ntfs/ntfs.c | 2 +-
|
||||
libparted/labels/dos.c | 29 +++++++++++++++++++++++++++++
|
||||
3 files changed, 33 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/NEWS b/NEWS
|
||||
index ae65106..0c3bad5 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -25,6 +25,9 @@ GNU parted NEWS -*- outline -*-
|
||||
|
||||
Fix filesystem detection on non 512 byte sector sizes
|
||||
|
||||
+ libparted: fat and ntfs boot sectors were misdetected as dos
|
||||
+ partition tables instead of being treated as a loop label.
|
||||
+
|
||||
Fix linux partition sync code to flush partitions > 16
|
||||
|
||||
Do not reject a FAT boot sector as invalid because it has no
|
||||
diff --git a/libparted/fs/ntfs/ntfs.c b/libparted/fs/ntfs/ntfs.c
|
||||
index 3ba2683..4c154fd 100644
|
||||
--- a/libparted/fs/ntfs/ntfs.c
|
||||
+++ b/libparted/fs/ntfs/ntfs.c
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
#define NTFS_SIGNATURE "NTFS"
|
||||
|
||||
-static PedGeometry*
|
||||
+PedGeometry*
|
||||
ntfs_probe (PedGeometry* geom)
|
||||
{
|
||||
char *buf = alloca (geom->dev->sector_size);
|
||||
diff --git a/libparted/labels/dos.c b/libparted/labels/dos.c
|
||||
index eff1c03..295fcf3 100644
|
||||
--- a/libparted/labels/dos.c
|
||||
+++ b/libparted/labels/dos.c
|
||||
@@ -235,12 +235,23 @@ maybe_FAT (unsigned char const *s)
|
||||
return true;
|
||||
}
|
||||
|
||||
+PedGeometry*
|
||||
+fat_probe_fat16 (PedGeometry* geom);
|
||||
+
|
||||
+PedGeometry*
|
||||
+fat_probe_fat32 (PedGeometry* geom);
|
||||
+
|
||||
+PedGeometry*
|
||||
+ntfs_probe (PedGeometry* geom);
|
||||
+
|
||||
static int
|
||||
msdos_probe (const PedDevice *dev)
|
||||
{
|
||||
PedDiskType* disk_type;
|
||||
DosRawTable* part_table;
|
||||
int i;
|
||||
+ PedGeometry *geom = NULL;
|
||||
+ PedGeometry *fsgeom = NULL;
|
||||
|
||||
PED_ASSERT (dev != NULL);
|
||||
|
||||
@@ -257,6 +268,20 @@ msdos_probe (const PedDevice *dev)
|
||||
if (PED_LE16_TO_CPU (part_table->magic) != MSDOS_MAGIC)
|
||||
goto probe_fail;
|
||||
|
||||
+ geom = ped_geometry_new (dev, 0, dev->length);
|
||||
+ PED_ASSERT (geom);
|
||||
+ fsgeom = fat_probe_fat16 (geom);
|
||||
+ if (fsgeom)
|
||||
+ goto probe_fail; /* fat fs looks like dos mbr */
|
||||
+ fsgeom = fat_probe_fat32 (geom);
|
||||
+ if (fsgeom)
|
||||
+ goto probe_fail; /* fat fs looks like dos mbr */
|
||||
+ fsgeom = ntfs_probe (geom);
|
||||
+ if (fsgeom)
|
||||
+ goto probe_fail; /* ntfs fs looks like dos mbr */
|
||||
+ ped_geometry_destroy (geom);
|
||||
+ geom = NULL;
|
||||
+
|
||||
/* If this is a FAT fs, fail here. Checking for the FAT signature
|
||||
* has some false positives; instead, do what the Linux kernel does
|
||||
* and ensure that each partition has a boot indicator that is
|
||||
@@ -303,6 +328,10 @@ msdos_probe (const PedDevice *dev)
|
||||
return 1;
|
||||
|
||||
probe_fail:
|
||||
+ if (geom)
|
||||
+ ped_geometry_destroy (geom);
|
||||
+ if (fsgeom)
|
||||
+ ped_geometry_destroy (fsgeom);
|
||||
free (label);
|
||||
return 0;
|
||||
}
|
||||
--
|
||||
1.9.0
|
||||
|
151
0105-libparted-remove-old-partitions-first-before-adding-.patch
Normal file
151
0105-libparted-remove-old-partitions-first-before-adding-.patch
Normal file
@ -0,0 +1,151 @@
|
||||
From 36f74e81b1da1ecadc071b3bd2f3a13db0161897 Mon Sep 17 00:00:00 2001
|
||||
From: Phillip Susi <psusi@ubuntu.com>
|
||||
Date: Fri, 2 May 2014 21:50:44 -0400
|
||||
Subject: [PATCH 201/208] libparted: remove old partitions *first* before
|
||||
adding new ones
|
||||
|
||||
"libparted: avoid disturbing partitions" put the remove of the old
|
||||
partition in second pass. If you simultaneously removed partitions 1
|
||||
and 2, and created a new partition #1 that overlapped the previous second
|
||||
partition, the sync would fail because it would try to create the new,
|
||||
larger partition #1 before removing the old partition #2.
|
||||
---
|
||||
libparted/arch/linux.c | 43 ++++++++++++++--------------
|
||||
tests/Makefile.am | 1 +
|
||||
tests/t1104-remove-and-add-partition.sh | 50 +++++++++++++++++++++++++++++++++
|
||||
3 files changed, 72 insertions(+), 22 deletions(-)
|
||||
create mode 100644 tests/t1104-remove-and-add-partition.sh
|
||||
|
||||
diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
|
||||
index 71f5034..ced06a3 100644
|
||||
--- a/libparted/arch/linux.c
|
||||
+++ b/libparted/arch/linux.c
|
||||
@@ -2855,23 +2855,8 @@ _disk_sync_part_table (PedDisk* disk)
|
||||
&& start == part->geom.start
|
||||
&& length == part->geom.length)
|
||||
{
|
||||
- ok[i - 1] = 1;
|
||||
- continue;
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
- for (i = 1; i <= lpn; i++) {
|
||||
- PedPartition *part = ped_disk_get_partition (disk, i);
|
||||
- if (part) {
|
||||
- unsigned long long length;
|
||||
- unsigned long long start;
|
||||
- /* get start and length of existing partition */
|
||||
- if (get_partition_start_and_length(part,
|
||||
- &start, &length)
|
||||
- && start == part->geom.start
|
||||
- && length == part->geom.length) {
|
||||
- ok[i - 1] = 1;
|
||||
/* partition is unchanged, so nothing to do */
|
||||
+ ok[i - 1] = 1;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -2890,12 +2875,26 @@ _disk_sync_part_table (PedDisk* disk)
|
||||
} while (n_sleep--);
|
||||
if (!ok[i - 1] && errnums[i - 1] == ENXIO)
|
||||
ok[i - 1] = 1; /* it already doesn't exist */
|
||||
- if (part && ok[i - 1]) {
|
||||
- /* add the (possibly modified or new) partition */
|
||||
- if (!add_partition (disk, part)) {
|
||||
- ok[i - 1] = 0;
|
||||
- errnums[i - 1] = errno;
|
||||
- }
|
||||
+ }
|
||||
+ for (i = 1; i <= lpn; i++) {
|
||||
+ PedPartition *part = ped_disk_get_partition (disk, i);
|
||||
+ if (!part)
|
||||
+ continue;
|
||||
+ unsigned long long length;
|
||||
+ unsigned long long start;
|
||||
+ /* get start and length of existing partition */
|
||||
+ if (get_partition_start_and_length(part,
|
||||
+ &start, &length)
|
||||
+ && start == part->geom.start
|
||||
+ && length == part->geom.length) {
|
||||
+ ok[i - 1] = 1;
|
||||
+ /* partition is unchanged, so nothing to do */
|
||||
+ continue;
|
||||
+ }
|
||||
+ /* add the (possibly modified or new) partition */
|
||||
+ if (!add_partition (disk, part)) {
|
||||
+ ok[i - 1] = 0;
|
||||
+ errnums[i - 1] = errno;
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
||||
index 9100a81..e064b8f 100644
|
||||
--- a/tests/Makefile.am
|
||||
+++ b/tests/Makefile.am
|
||||
@@ -40,6 +40,7 @@ TESTS = \
|
||||
t0501-duplicate.sh \
|
||||
t1100-busy-label.sh \
|
||||
t1101-busy-partition.sh \
|
||||
+ t1104-remove-and-add-partition.sh \
|
||||
t1700-probe-fs.sh \
|
||||
t2200-dos-label-recog.sh \
|
||||
t2201-pc98-label-recog.sh \
|
||||
diff --git a/tests/t1104-remove-and-add-partition.sh b/tests/t1104-remove-and-add-partition.sh
|
||||
new file mode 100644
|
||||
index 0000000..61cc392
|
||||
--- /dev/null
|
||||
+++ b/tests/t1104-remove-and-add-partition.sh
|
||||
@@ -0,0 +1,50 @@
|
||||
+#!/bin/sh
|
||||
+# make sure that removing a higher numbered partition and adding a lower
|
||||
+# one using that space at the same time works
|
||||
+
|
||||
+# Copyright (C) 2014 Free Software Foundation, Inc.
|
||||
+
|
||||
+# This program is free software; you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation; either version 3 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+
|
||||
+. "${srcdir=.}/init.sh"; path_prepend_ ../parted
|
||||
+path_prepend_ ../partprobe
|
||||
+require_root_
|
||||
+ss=$sector_size_
|
||||
+
|
||||
+d1= f1=
|
||||
+cleanup_fn_()
|
||||
+{
|
||||
+ test -n "$d1" && losetup -d "$d1"
|
||||
+ rm -f "$f1"
|
||||
+}
|
||||
+
|
||||
+f1=$(pwd)/1; d1=$(loop_setup_ "$f1") \
|
||||
+ || skip_ "is this partition mounted with 'nodev'?"
|
||||
+
|
||||
+require_partitionable_loop_device_ $d1
|
||||
+
|
||||
+# create one big partition
|
||||
+parted -s $d1 mklabel msdos mkpart primary ext2 1m 10m || fail=1
|
||||
+
|
||||
+# save this table
|
||||
+dd if=$d1 of=saved count=1 || fail=1
|
||||
+
|
||||
+# create two small partitions
|
||||
+parted -s $d1 mklabel msdos mkpart primary ext2 1m 5m mkpart primary ext2 5m 10m || fail=1
|
||||
+
|
||||
+# restore first table and make sure partprobe works
|
||||
+dd if=saved of=$d1 || fail=1
|
||||
+partprobe $d1 || fail=1
|
||||
+
|
||||
+Exit $fail
|
||||
--
|
||||
1.9.0
|
||||
|
@ -0,0 +1,63 @@
|
||||
From dc291e101cf20c6493c262124debab92427c83d9 Mon Sep 17 00:00:00 2001
|
||||
From: Phillip Susi <psusi@ubuntu.com>
|
||||
Date: Fri, 2 May 2014 21:50:45 -0400
|
||||
Subject: [PATCH 202/208] libparted: remove all old partitions, even if new
|
||||
label allows less
|
||||
|
||||
We were limiting partition sync operations to the lesser number allowed
|
||||
by the device, or the label. This meant that when creating a new label
|
||||
over an old label that had more partitions than the new one allows, the
|
||||
higher partitions would not be removed. Use the greater of the two values
|
||||
for the remove pass, and the lesser for the add.
|
||||
---
|
||||
NEWS | 3 +++
|
||||
libparted/arch/linux.c | 11 +++++++++--
|
||||
2 files changed, 12 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/NEWS b/NEWS
|
||||
index 0c3bad5..a81c049 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -25,6 +25,9 @@ GNU parted NEWS -*- outline -*-
|
||||
|
||||
Fix filesystem detection on non 512 byte sector sizes
|
||||
|
||||
+ libparted: remove all old partitions, even if new label does not allow
|
||||
+ as many.
|
||||
+
|
||||
libparted: fat and ntfs boot sectors were misdetected as dos
|
||||
partition tables instead of being treated as a loop label.
|
||||
|
||||
diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
|
||||
index ced06a3..4cbe49b 100644
|
||||
--- a/libparted/arch/linux.c
|
||||
+++ b/libparted/arch/linux.c
|
||||
@@ -2823,9 +2823,10 @@ _disk_sync_part_table (PedDisk* disk)
|
||||
get_partition_start_and_length = _kernel_get_partition_start_and_length;
|
||||
}
|
||||
|
||||
- /* lpn = largest partition number. */
|
||||
+ /* lpn = largest partition number.
|
||||
+ * for remove pass, use greater of device or label limit */
|
||||
if (ped_disk_get_max_supported_partition_count(disk, &lpn))
|
||||
- lpn = PED_MIN(lpn, part_range);
|
||||
+ lpn = PED_MAX(lpn, part_range);
|
||||
else
|
||||
lpn = part_range;
|
||||
|
||||
@@ -2876,6 +2877,12 @@ _disk_sync_part_table (PedDisk* disk)
|
||||
if (!ok[i - 1] && errnums[i - 1] == ENXIO)
|
||||
ok[i - 1] = 1; /* it already doesn't exist */
|
||||
}
|
||||
+ /* lpn = largest partition number.
|
||||
+ * for add pass, use lesser of device or label limit */
|
||||
+ if (ped_disk_get_max_supported_partition_count(disk, &lpn))
|
||||
+ lpn = PED_MIN(lpn, part_range);
|
||||
+ else
|
||||
+ lpn = part_range;
|
||||
for (i = 1; i <= lpn; i++) {
|
||||
PedPartition *part = ped_disk_get_partition (disk, i);
|
||||
if (!part)
|
||||
--
|
||||
1.9.0
|
||||
|
143
0107-libparted-fix-loop-labels-to-not-vanish.patch
Normal file
143
0107-libparted-fix-loop-labels-to-not-vanish.patch
Normal file
@ -0,0 +1,143 @@
|
||||
From 1707f92e281f226463c39941471e04c55078615b Mon Sep 17 00:00:00 2001
|
||||
From: Phillip Susi <psusi@ubuntu.com>
|
||||
Date: Fri, 2 May 2014 21:50:46 -0400
|
||||
Subject: [PATCH 203/208] libparted: fix loop labels to not vanish
|
||||
|
||||
The loop label type was using the existence of a partition as a proxy for
|
||||
a filesystem being detected, and loop_write() would try to write a loop
|
||||
signature if there was no filesystem, and erase it if there was. Because
|
||||
of this, creating a partition without writing a filesystem to it caused
|
||||
loop_write to erase the loop label.
|
||||
|
||||
There seems to be no reason to bother erasing the loop label if it is still
|
||||
present along with a filesystem signature, so don't bother with this, and
|
||||
actually check to see if a filesystem is detected in the partition rather
|
||||
than using the existence of a partition to decide if writing the loop
|
||||
signature is needed. Finally, since there is no way to preserve the
|
||||
existence of a partition with no filesystem in it, have loop_read() always
|
||||
create a partition, even if no filesystem is detected.
|
||||
---
|
||||
NEWS | 6 ++++++
|
||||
libparted/labels/loop.c | 53 ++++++++++++++++++++++---------------------------
|
||||
2 files changed, 30 insertions(+), 29 deletions(-)
|
||||
|
||||
diff --git a/NEWS b/NEWS
|
||||
index a81c049..3154ef5 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -25,6 +25,9 @@ GNU parted NEWS -*- outline -*-
|
||||
|
||||
Fix filesystem detection on non 512 byte sector sizes
|
||||
|
||||
+ libparted: fix loop labels to not vanish if you don't create
|
||||
+ a filesystem, and to not return an error syncing when you do.
|
||||
+
|
||||
libparted: remove all old partitions, even if new label does not allow
|
||||
as many.
|
||||
|
||||
@@ -105,6 +108,9 @@ GNU parted NEWS -*- outline -*-
|
||||
|
||||
** Changes in behavior
|
||||
|
||||
+ When creating a loop label, it automatically comes with a partition
|
||||
+ using the whole disk.
|
||||
+
|
||||
parted -l no longer lists device-mapper devices other than
|
||||
dmraid whole disks.
|
||||
|
||||
diff --git a/libparted/labels/loop.c b/libparted/labels/loop.c
|
||||
index ea8f007..8ebb1f4 100644
|
||||
--- a/libparted/labels/loop.c
|
||||
+++ b/libparted/labels/loop.c
|
||||
@@ -80,7 +80,23 @@ loop_alloc (const PedDevice* dev)
|
||||
|
||||
if (dev->length < 256)
|
||||
return NULL;
|
||||
- return _ped_disk_alloc ((PedDevice*)dev, &loop_disk_type);
|
||||
+ PedDisk *disk = _ped_disk_alloc ((PedDevice*)dev, &loop_disk_type);
|
||||
+ PED_ASSERT (disk != NULL);
|
||||
+ PedGeometry *geom = ped_geometry_new (dev, 0, dev->length);
|
||||
+ PED_ASSERT (geom != NULL);
|
||||
+ PedPartition *part = ped_partition_new (disk, PED_PARTITION_NORMAL,
|
||||
+ NULL, geom->start, geom->end);
|
||||
+ PED_ASSERT (part != NULL);
|
||||
+ ped_geometry_destroy (geom);
|
||||
+ PedConstraint *constraint_any = ped_constraint_any (dev);
|
||||
+ if (!ped_disk_add_partition (disk, part, constraint_any))
|
||||
+ goto error;
|
||||
+ ped_constraint_destroy (constraint_any);
|
||||
+ return disk;
|
||||
+ error:
|
||||
+ ped_constraint_destroy (constraint_any);
|
||||
+ ped_disk_destroy (disk);
|
||||
+ return NULL;
|
||||
}
|
||||
|
||||
static PedDisk*
|
||||
@@ -118,18 +134,12 @@ loop_read (PedDisk* disk)
|
||||
|
||||
int found_sig = !strncmp (buf, LOOP_SIGNATURE, strlen (LOOP_SIGNATURE));
|
||||
free (buf);
|
||||
-
|
||||
- if (found_sig) {
|
||||
- ped_constraint_destroy (constraint_any);
|
||||
- return 1;
|
||||
- }
|
||||
-
|
||||
geom = ped_geometry_new (dev, 0, dev->length);
|
||||
if (!geom)
|
||||
goto error;
|
||||
|
||||
fs_type = ped_file_system_probe (geom);
|
||||
- if (!fs_type)
|
||||
+ if (!fs_type && !found_sig)
|
||||
goto error_free_geom;
|
||||
|
||||
part = ped_partition_new (disk, PED_PARTITION_NORMAL,
|
||||
@@ -137,7 +147,6 @@ loop_read (PedDisk* disk)
|
||||
ped_geometry_destroy (geom);
|
||||
if (!part)
|
||||
goto error;
|
||||
- part->fs_type = fs_type;
|
||||
|
||||
if (!ped_disk_add_partition (disk, part, constraint_any))
|
||||
goto error;
|
||||
@@ -156,29 +165,15 @@ static int
|
||||
loop_write (const PedDisk* disk)
|
||||
{
|
||||
size_t buflen = disk->dev->sector_size;
|
||||
- char *buf = ped_malloc (buflen);
|
||||
- if (buf == NULL)
|
||||
- return 0;
|
||||
-
|
||||
- if (ped_disk_get_partition (disk, 1)) {
|
||||
- if (!ped_device_read (disk->dev, buf, 0, 1)) {
|
||||
- free (buf);
|
||||
- return 0;
|
||||
- }
|
||||
- if (strncmp (buf, LOOP_SIGNATURE, strlen (LOOP_SIGNATURE)) != 0) {
|
||||
- free (buf);
|
||||
- return 1;
|
||||
- }
|
||||
- memset (buf, 0, strlen (LOOP_SIGNATURE));
|
||||
- return ped_device_write (disk->dev, buf, 0, 1);
|
||||
- }
|
||||
-
|
||||
+ char *buf = alloca (buflen);
|
||||
+ PedPartition *part = ped_disk_get_partition (disk, 1);
|
||||
+ /* if there is already a filesystem on the disk, we don't need to write the signature */
|
||||
+ if (part && part->fs_type)
|
||||
+ return 1;
|
||||
memset (buf, 0, buflen);
|
||||
strcpy (buf, LOOP_SIGNATURE);
|
||||
|
||||
- int write_ok = ped_device_write (disk->dev, buf, 0, 1);
|
||||
- free (buf);
|
||||
- return write_ok;
|
||||
+ return ped_device_write (disk->dev, buf, 0, 1);
|
||||
}
|
||||
#endif /* !DISCOVER_ONLY */
|
||||
|
||||
--
|
||||
1.9.0
|
||||
|
45
0108-libparted-don-t-create-partition-on-loop-label.patch
Normal file
45
0108-libparted-don-t-create-partition-on-loop-label.patch
Normal file
@ -0,0 +1,45 @@
|
||||
From a00b5dd9e33241904b01f7b375da57ccd6e777b5 Mon Sep 17 00:00:00 2001
|
||||
From: Phillip Susi <psusi@ubuntu.com>
|
||||
Date: Fri, 2 May 2014 21:50:47 -0400
|
||||
Subject: [PATCH 204/208] libparted: don't create partition on loop label
|
||||
|
||||
The loop label represents an unpartitioned disk, but creates
|
||||
a dummy partition to represent the whole disk. This dummy partition
|
||||
was actually being loaded into the kernel. Don't do that.
|
||||
---
|
||||
NEWS | 4 ++++
|
||||
libparted/arch/linux.c | 3 +++
|
||||
2 files changed, 7 insertions(+)
|
||||
|
||||
diff --git a/NEWS b/NEWS
|
||||
index 3154ef5..77cffea 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -25,6 +25,10 @@ GNU parted NEWS -*- outline -*-
|
||||
|
||||
Fix filesystem detection on non 512 byte sector sizes
|
||||
|
||||
+ libparted: The loop label represents an unpartitioned disk, but creates
|
||||
+ a dummy partition to represent the whole disk. This dummy partition
|
||||
+ was actually being loaded into the kernel. Don't do that.
|
||||
+
|
||||
libparted: fix loop labels to not vanish if you don't create
|
||||
a filesystem, and to not return an error syncing when you do.
|
||||
|
||||
diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
|
||||
index 4cbe49b..9ae6d64 100644
|
||||
--- a/libparted/arch/linux.c
|
||||
+++ b/libparted/arch/linux.c
|
||||
@@ -2883,6 +2883,9 @@ _disk_sync_part_table (PedDisk* disk)
|
||||
lpn = PED_MIN(lpn, part_range);
|
||||
else
|
||||
lpn = part_range;
|
||||
+ /* don't actually add partitions for loop */
|
||||
+ if (strcmp (disk->type->name, "loop") == 0)
|
||||
+ lpn = 0;
|
||||
for (i = 1; i <= lpn; i++) {
|
||||
PedPartition *part = ped_disk_get_partition (disk, i);
|
||||
if (!part)
|
||||
--
|
||||
1.9.0
|
||||
|
44
0109-partprobe-do-not-skip-loop-labels.patch
Normal file
44
0109-partprobe-do-not-skip-loop-labels.patch
Normal file
@ -0,0 +1,44 @@
|
||||
From 7127a356f205af5ca97370fe6b3674f55c5ec700 Mon Sep 17 00:00:00 2001
|
||||
From: Phillip Susi <psusi@ubuntu.com>
|
||||
Date: Fri, 2 May 2014 21:50:48 -0400
|
||||
Subject: [PATCH 205/208] partprobe: do not skip loop labels
|
||||
|
||||
Partprobe was not syncing loop labels. This resulted it failing to remove
|
||||
existing partitions when switching to a loop label.
|
||||
---
|
||||
NEWS | 3 +++
|
||||
partprobe/partprobe.c | 4 +---
|
||||
2 files changed, 4 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/NEWS b/NEWS
|
||||
index 77cffea..d79292f 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -25,6 +25,9 @@ GNU parted NEWS -*- outline -*-
|
||||
|
||||
Fix filesystem detection on non 512 byte sector sizes
|
||||
|
||||
+ partprobe: when called on a disk that has become a loop label,
|
||||
+ remove any partitions left over from a previous label.
|
||||
+
|
||||
libparted: The loop label represents an unpartitioned disk, but creates
|
||||
a dummy partition to represent the whole disk. This dummy partition
|
||||
was actually being loaded into the kernel. Don't do that.
|
||||
diff --git a/partprobe/partprobe.c b/partprobe/partprobe.c
|
||||
index 4da4fb7..8b744b5 100644
|
||||
--- a/partprobe/partprobe.c
|
||||
+++ b/partprobe/partprobe.c
|
||||
@@ -106,9 +106,7 @@ process_dev (PedDevice* dev)
|
||||
PedDisk* disk;
|
||||
|
||||
disk_type = ped_disk_probe (dev);
|
||||
- if (disk_type && !strcmp (disk_type->name, "loop"))
|
||||
- return 1;
|
||||
- else if (!disk_type) {
|
||||
+ if (!disk_type) {
|
||||
/* Partition table not found, so create dummy,
|
||||
empty one */
|
||||
disk_type = ped_disk_type_get("msdos");
|
||||
--
|
||||
1.9.0
|
||||
|
@ -0,0 +1,80 @@
|
||||
From 998e09d5698777cfbb9b7aacc9059209c7816d60 Mon Sep 17 00:00:00 2001
|
||||
From: Phillip Susi <psusi@ubuntu.com>
|
||||
Date: Fri, 2 May 2014 21:50:49 -0400
|
||||
Subject: [PATCH 206/208] libparted: give correct partition device name on loop
|
||||
labels
|
||||
|
||||
ped_partition_get_path() was returning "/dev/foo1" instead of
|
||||
"/dev/foo" on loop labels. This caused gparted to run tools like mkfs on
|
||||
a device node that did not actually exist.
|
||||
---
|
||||
NEWS | 3 +++
|
||||
libparted/arch/linux.c | 10 ++++++++--
|
||||
2 files changed, 11 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/NEWS b/NEWS
|
||||
index d79292f..0a04942 100644
|
||||
--- a/NEWS
|
||||
+++ b/NEWS
|
||||
@@ -25,6 +25,9 @@ GNU parted NEWS -*- outline -*-
|
||||
|
||||
Fix filesystem detection on non 512 byte sector sizes
|
||||
|
||||
+ libparted: ped_partition_get_path() was returning "/dev/foo1" instead
|
||||
+ of "/dev/foo" for loop labels.
|
||||
+
|
||||
partprobe: when called on a disk that has become a loop label,
|
||||
remove any partitions left over from a previous label.
|
||||
|
||||
diff --git a/libparted/arch/linux.c b/libparted/arch/linux.c
|
||||
index 9ae6d64..f2e2abc 100644
|
||||
--- a/libparted/arch/linux.c
|
||||
+++ b/libparted/arch/linux.c
|
||||
@@ -48,6 +48,7 @@
|
||||
#include "../architecture.h"
|
||||
#include "dirname.h"
|
||||
#include "xstrtol.h"
|
||||
+#include "xalloc.h"
|
||||
|
||||
#if ENABLE_NLS
|
||||
# include <libintl.h>
|
||||
@@ -2356,6 +2357,9 @@ _device_get_part_path (PedDevice const *dev, int num)
|
||||
static char*
|
||||
linux_partition_get_path (const PedPartition* part)
|
||||
{
|
||||
+ /* loop label means use the whole disk */
|
||||
+ if (strcmp (part->disk->type->name, "loop") == 0)
|
||||
+ return xstrdup (part->disk->dev->path);
|
||||
return _device_get_part_path (part->disk->dev, part->num);
|
||||
}
|
||||
|
||||
@@ -2424,6 +2428,8 @@ linux_partition_is_busy (const PedPartition* part)
|
||||
|
||||
PED_ASSERT (part != NULL);
|
||||
|
||||
+ if (strcmp (part->disk->type->name, "loop") == 0)
|
||||
+ return linux_is_busy (part->disk->dev);
|
||||
if (_partition_is_mounted (part))
|
||||
return 1;
|
||||
if (part->type == PED_PARTITION_EXTENDED) {
|
||||
@@ -2546,7 +2552,7 @@ _sysfs_ull_entry_from_part(PedPartition const* part, const char *entry,
|
||||
unsigned long long *val)
|
||||
{
|
||||
char path[128];
|
||||
- char *part_name = linux_partition_get_path(part);
|
||||
+ char *part_name = _device_get_part_path (part->disk->dev, part->num);
|
||||
if (!part_name)
|
||||
return false;
|
||||
|
||||
@@ -2581,7 +2587,7 @@ _kernel_get_partition_start_and_length(PedPartition const *part,
|
||||
PED_ASSERT(start);
|
||||
PED_ASSERT(length);
|
||||
|
||||
- char *dev_name = linux_partition_get_path (part);
|
||||
+ char *dev_name = _device_get_part_path (part->disk->dev, part->num);
|
||||
if (!dev_name)
|
||||
return false;
|
||||
|
||||
--
|
||||
1.9.0
|
||||
|
@ -0,0 +1,33 @@
|
||||
From b83ac74a8b87a770bdd78c7c23731bcc252393e4 Mon Sep 17 00:00:00 2001
|
||||
From: Phillip Susi <psusi@ubuntu.com>
|
||||
Date: Fri, 2 May 2014 21:50:50 -0400
|
||||
Subject: [PATCH 207/208] libparted: don't trash filesystem when writing loop
|
||||
label
|
||||
|
||||
If you deleted the fake partition on a loop label, loop_write() would write
|
||||
the loop signature to the device, zeroing out all other bytes in the first
|
||||
sector. When the disk contained an ext[234] filesystem and was using 2k
|
||||
sectors, this would trash the super block residing in the 1-2kb part of the
|
||||
sector causing the disk to become unrecognized. Instead, read the existing
|
||||
sector and only modify the first few bytes that contain the loop label.
|
||||
---
|
||||
libparted/labels/loop.c | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/libparted/labels/loop.c b/libparted/labels/loop.c
|
||||
index 8ebb1f4..98f9f23 100644
|
||||
--- a/libparted/labels/loop.c
|
||||
+++ b/libparted/labels/loop.c
|
||||
@@ -170,7 +170,8 @@ loop_write (const PedDisk* disk)
|
||||
/* if there is already a filesystem on the disk, we don't need to write the signature */
|
||||
if (part && part->fs_type)
|
||||
return 1;
|
||||
- memset (buf, 0, buflen);
|
||||
+ if (!ped_device_read (disk->dev, buf, 0, 1))
|
||||
+ return 0;
|
||||
strcpy (buf, LOOP_SIGNATURE);
|
||||
|
||||
return ped_device_write (disk->dev, buf, 0, 1);
|
||||
--
|
||||
1.9.0
|
||||
|
137
0112-tests-test-loop-labels.patch
Normal file
137
0112-tests-test-loop-labels.patch
Normal file
@ -0,0 +1,137 @@
|
||||
From bd4574d9b49ec3e2d73c59dcab7c5f22c2e85c4a Mon Sep 17 00:00:00 2001
|
||||
From: Phillip Susi <psusi@ubuntu.com>
|
||||
Date: Fri, 2 May 2014 21:50:51 -0400
|
||||
Subject: [PATCH 208/208] tests: test loop labels
|
||||
|
||||
Verify previous fixes to loop labels.
|
||||
---
|
||||
tests/Makefile.am | 1 +
|
||||
tests/t1102-loop-label.sh | 104 ++++++++++++++++++++++++++++++++++++++++++++++
|
||||
2 files changed, 105 insertions(+)
|
||||
create mode 100644 tests/t1102-loop-label.sh
|
||||
|
||||
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
||||
index e064b8f..26226cf 100644
|
||||
--- a/tests/Makefile.am
|
||||
+++ b/tests/Makefile.am
|
||||
@@ -40,6 +40,7 @@ TESTS = \
|
||||
t0501-duplicate.sh \
|
||||
t1100-busy-label.sh \
|
||||
t1101-busy-partition.sh \
|
||||
+ t1102-loop-label.sh \
|
||||
t1104-remove-and-add-partition.sh \
|
||||
t1700-probe-fs.sh \
|
||||
t2200-dos-label-recog.sh \
|
||||
diff --git a/tests/t1102-loop-label.sh b/tests/t1102-loop-label.sh
|
||||
new file mode 100644
|
||||
index 0000000..f5701a3
|
||||
--- /dev/null
|
||||
+++ b/tests/t1102-loop-label.sh
|
||||
@@ -0,0 +1,104 @@
|
||||
+#!/bin/sh
|
||||
+# make sure that loop labels work correctly
|
||||
+# create an actual partition
|
||||
+
|
||||
+# Copyright (C) 2013 Free Software Foundation, Inc.
|
||||
+
|
||||
+# This program is free software; you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation; either version 3 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+
|
||||
+. "${srcdir=.}/init.sh"; path_prepend_ ../parted
|
||||
+path_prepend_ ../partprobe
|
||||
+require_root_
|
||||
+require_scsi_debug_module_
|
||||
+ss=$sector_size_
|
||||
+
|
||||
+scsi_debug_setup_ sector_size=$ss dev_size_mb=90 > dev-name ||
|
||||
+ skip_ 'failed to create scsi_debug device'
|
||||
+dev=$(cat dev-name)
|
||||
+
|
||||
+mke2fs -F $dev
|
||||
+parted -s "$dev" print > out 2>&1 || fail=1
|
||||
+cat <<EOF > exp
|
||||
+Model: Linux scsi_debug (scsi)
|
||||
+Disk DEVICE: 94.4MB
|
||||
+Sector size (logical/physical): ${ss}B/${ss}B
|
||||
+Partition Table: loop
|
||||
+Disk Flags:
|
||||
+
|
||||
+Number Start End Size File system Flags
|
||||
+ 1 0.00B 94.4MB 94.4MB ext2
|
||||
+
|
||||
+EOF
|
||||
+mv out o2 && sed -e "s,$dev,DEVICE,;" o2 > out
|
||||
+
|
||||
+compare exp out || fail=1
|
||||
+parted -s $dev rm 1 || fail=1
|
||||
+if [ -e ${dev}1 ]; then
|
||||
+ echo "Partition should not exist on loop device"
|
||||
+ fail=1
|
||||
+fi
|
||||
+partprobe $dev || fail=1
|
||||
+if [ -e ${dev}1 ]; then
|
||||
+ echo "Partition should not exist on loop device"
|
||||
+ fail=1
|
||||
+fi
|
||||
+
|
||||
+mount_point="`pwd`/mnt"
|
||||
+
|
||||
+# Be sure to unmount upon interrupt, failure, etc.
|
||||
+cleanup_fn_() { umount "$mount_point" > /dev/null 2>&1; }
|
||||
+
|
||||
+# create mount point dir. and mount the just-created partition on it
|
||||
+mkdir $mount_point || fail=1
|
||||
+mount -t ext2 "${dev}" $mount_point || fail=1
|
||||
+
|
||||
+# now that a partition is mounted, mklabel attempt must fail
|
||||
+parted -s "$dev" mklabel msdos > out 2>&1; test $? = 1 || fail=1
|
||||
+
|
||||
+# create expected output file
|
||||
+echo "Error: Partition(s) on $dev are being used." > exp
|
||||
+compare exp out || fail=1
|
||||
+
|
||||
+# make sure partition busy check works ( mklabel checks whole disk )
|
||||
+parted -s "$dev" rm 1 > out 2>&1; test $? = 1 || fail=1
|
||||
+# create expected output file
|
||||
+echo "Error: Partition $dev is being used. You must unmount it before you modify \
|
||||
+it with Parted." > exp
|
||||
+compare exp out || fail=1
|
||||
+
|
||||
+umount "$mount_point"
|
||||
+
|
||||
+# make sure partprobe cleans up stale partition devices
|
||||
+parted -s $dev mklabel msdos mkpart primary ext2 0% 100% || fail=1
|
||||
+if [ ! -e ${dev}1 ]; then
|
||||
+ echo "Partition doesn't exist on loop device"
|
||||
+ fail=1
|
||||
+fi
|
||||
+
|
||||
+mke2fs -F $dev
|
||||
+partprobe $dev || fail=1
|
||||
+if [ -e ${dev}1 ]; then
|
||||
+ echo "Partition should not exist on loop device"
|
||||
+ fail=1
|
||||
+fi
|
||||
+
|
||||
+# make sure new loop label removes old partitions > 1
|
||||
+parted -s $dev mklabel msdos mkpart primary ext2 0% 50% mkpart primary ext2 50% 100% || fail=1
|
||||
+parted -s $dev mklabel loop || fail=1
|
||||
+if [ -e ${dev}2 ]; then
|
||||
+ echo "Partition 2 not removed"
|
||||
+ fail=1
|
||||
+fi
|
||||
+
|
||||
+Exit $fail
|
||||
--
|
||||
1.9.0
|
||||
|
29
parted.spec
29
parted.spec
@ -4,7 +4,7 @@
|
||||
Summary: The GNU disk partition manipulation program
|
||||
Name: parted
|
||||
Version: 3.1
|
||||
Release: 23%{?dist}
|
||||
Release: 24%{?dist}
|
||||
License: GPLv3+
|
||||
Group: Applications/System
|
||||
URL: http://www.gnu.org/software/parted
|
||||
@ -123,6 +123,18 @@ Patch0097: 0097-libparted-Fix-part-dupe-with-empty-name.patch
|
||||
Patch0098: 0098-tests-check-name-when-duplicating.patch
|
||||
Patch0099: 0099-tests-Add-ntfs-vfat-hfsplus-to-t1700-probe-test.patch
|
||||
Patch0100: 0100-GPT-strings-are-UCS-2LE-not-UTF-16.patch
|
||||
Patch0101: 0101-libparted-remove-last_usable_if_grown.patch
|
||||
Patch0102: 0102-tests-fix-t2310-dos-extended-2-sector-min-offset.sh.patch
|
||||
Patch0103: 0103-Fix-filesystem-detection-on-non-512-byte-sectors.patch
|
||||
Patch0200: 0104-libparted-don-t-detect-fat-and-ntfs-boot-sectors-as-.patch
|
||||
Patch0201: 0105-libparted-remove-old-partitions-first-before-adding-.patch
|
||||
Patch0202: 0106-libparted-remove-all-old-partitions-even-if-new-labe.patch
|
||||
Patch0203: 0107-libparted-fix-loop-labels-to-not-vanish.patch
|
||||
Patch0204: 0108-libparted-don-t-create-partition-on-loop-label.patch
|
||||
Patch0205: 0109-partprobe-do-not-skip-loop-labels.patch
|
||||
Patch0206: 0110-libparted-give-correct-partition-device-name-on-loop.patch
|
||||
Patch0207: 0111-libparted-don-t-trash-filesystem-when-writing-loop-l.patch
|
||||
Patch0208: 0112-tests-test-loop-labels.patch
|
||||
|
||||
Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||
BuildRequires: e2fsprogs-devel
|
||||
@ -261,6 +273,21 @@ fi
|
||||
|
||||
|
||||
%changelog
|
||||
* Thu May 22 2014 Brian C. Lane <bcl@redhat.com> 3.1-24
|
||||
- Add some missing patches from master and the loop label fixes
|
||||
- tests: test loop labels (psusi)
|
||||
- libparted: don't trash filesystem when writing loop label (psusi)
|
||||
- libparted: give correct partition device name on loop labels (psusi)
|
||||
- partprobe: do not skip loop labels (psusi)
|
||||
- libparted: don't create partition on loop label (psusi)
|
||||
- libparted: fix loop labels to not vanish (psusi)
|
||||
- libparted: remove all old partitions, even if new label allows less (psusi)
|
||||
- libparted: remove old partitions *first* before adding new ones (psusi)
|
||||
- libparted: don't detect fat and ntfs boot sectors as dos MBR (psusi)
|
||||
- Fix filesystem detection on non 512 byte sectors (psusi)
|
||||
- tests: fix t2310-dos-extended-2-sector-min-offset.sh (psusi)
|
||||
- libparted: remove last_usable_if_grown (psusi)
|
||||
|
||||
* Fri May 16 2014 Brian C. Lane <bcl@redhat.com> 3.1-23
|
||||
- Fix partition naming patch for big endian systems.
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user