File libparted-Add-support-for-RAM-drives.patch of Package parted.15765

From: Sebastian Parschauer <sparschauer@suse.de>
Date: Tue, 14 Mar 2017 16:40:00 +0100
Subject: Add support for RAM drives
References: bsc#1006834
Patch-mainline: v3.3
Git-commit: 21131f62c6f508a5d0c080e025cf7db5df43fc7d

Recognize RAM drives, so "parted -s /dev/ram0 p" now prints
"RAM Drive (brd)" instead of "Model: Unknown (unknown)".

In order for a device to be recognized as RAM drive, it has to
have major number 1. Also the BLKFLSBUF ioctl shouldn't be used
on RAM drives as it is used to zero the device.

* NEWS: Mention the change
* include/parted/device.h.in(PedDeviceType): Add PED_DEVICE_RAM.
* libparted/arch/linux.c(RAM_MAJOR): New define.
* libparted/arch/linux.c(_device_probe_type): Recognize RAM drives.
* libparted/arch/linux.c(linux_new): Handle RAM drives.
* libparted/arch/linux.c(_flush_cache): Skip RAM drives.
* parted/parted.c(do_print): Add "brd" to list of transports.

Signed-off-by: Sebastian Parschauer <sparschauer@suse.de>
---
 include/parted/device.in.h |  3 ++-
 libparted/arch/linux.c     | 12 ++++++++++--
 parted/parted.c            |  2 +-
 3 files changed, 13 insertions(+), 4 deletions(-)

--- a/include/parted/device.in.h
+++ b/include/parted/device.in.h
@@ -50,7 +50,8 @@ typedef enum {
         PED_DEVICE_AOE          = 16,
         PED_DEVICE_MD           = 17,
         PED_DEVICE_LOOP         = 18,
-        PED_DEVICE_NVME         = 19
+        PED_DEVICE_NVME         = 19,
+        PED_DEVICE_RAM          = 20
 } PedDeviceType;
 
 typedef struct _PedDevice PedDevice;
--- a/libparted/arch/linux.c
+++ b/libparted/arch/linux.c
@@ -280,6 +280,7 @@ struct blkdev_ioctl_param {
 #define LOOP_MAJOR              7
 #define MD_MAJOR                9
 #define BLKEXT_MAJOR            259
+#define RAM_MAJOR               1
 
 #define SCSI_BLK_MAJOR(M) (                                             \
                 (M) == SCSI_DISK0_MAJOR                                 \
@@ -721,6 +722,8 @@ _device_probe_type (PedDevice* dev)
                 dev->type = PED_DEVICE_MD;
         } else if (_is_blkext_major(dev_major) && dev->path && strstr(dev->path, "nvme")) {
                 dev->type = PED_DEVICE_NVME;
+        } else if (dev_major == RAM_MAJOR) {
+                dev->type = PED_DEVICE_RAM;
         } else {
                 dev->type = PED_DEVICE_UNKNOWN;
         }
@@ -1553,6 +1556,11 @@ linux_new (const char* path)
                         goto error_free_arch_specific;
                 break;
 
+        case PED_DEVICE_RAM:
+                if (!init_generic (dev, _("RAM Drive")))
+                        goto error_free_arch_specific;
+                break;
+
         default:
                 ped_exception_throw (PED_EXCEPTION_NO_FEATURE,
                                 PED_EXCEPTION_CANCEL,
@@ -1625,9 +1633,9 @@ _flush_cache (PedDevice* dev)
 {
         LinuxSpecific*  arch_specific = LINUX_SPECIFIC (dev);
         int             i;
-	int             lpn = _device_get_partition_range(dev);
+        int             lpn = _device_get_partition_range(dev);
 
-        if (dev->read_only)
+        if (dev->read_only || dev->type == PED_DEVICE_RAM)
                 return;
         dev->dirty = 0;
 
--- a/parted/parted.c
+++ b/parted/parted.c
@@ -1035,7 +1035,7 @@ _print_disk_info (const PedDevice *dev,
                                          "cpqarray", "file", "ataraid", "i2o",
                                          "ubd", "dasd", "viodasd", "sx8", "dm",
                                          "xvd", "sd/mmc", "virtblk", "aoe",
-                                         "md", "loopback", "nvme"};
+                                         "md", "loopback", "nvme", "brd"};
 
         char* start = ped_unit_format (dev, 0);
         PedUnit default_unit = ped_unit_get_default ();
openSUSE Build Service is sponsored by