unsigned int intensity;
 } format_data_t;
 
+/*
+ * struct dasd_copypair_swap_data_t
+ * represents all data necessary to issue a swap of the copy pair relation
+ */
+struct dasd_copypair_swap_data_t {
+       char primary[20]; /* BUSID of primary */
+       char secondary[20]; /* BUSID of secondary */
+
+       /* Reserved for future updates. */
+       __u8 reserved[64];
+};
+
 /*
  * values to be used for format_data_t.intensity
  * 0/8: normal format
 #define BIODASDSATTR   _IOW(DASD_IOCTL_LETTER,2,attrib_data_t)
 /* Release Allocated Space */
 #define BIODASDRAS     _IOW(DASD_IOCTL_LETTER, 3, format_data_t)
+/* Swap copy pair relation */
+#define BIODASDCOPYPAIRSWAP _IOW(DASD_IOCTL_LETTER, 4, struct dasd_copypair_swap_data_t)
 
 /* Get Sense Path Group ID (SNID) data */
 #define BIODASDSNID    _IOWR(DASD_IOCTL_LETTER, 1, struct dasd_snid_ioctl_data)
 
        return rc;
 }
 
+/*
+ * Swap driver iternal copy relation.
+ */
+static int
+dasd_ioctl_copy_pair_swap(struct block_device *bdev, void __user *argp)
+{
+       struct dasd_copypair_swap_data_t data;
+       struct dasd_device *device;
+       int rc;
+
+       if (!capable(CAP_SYS_ADMIN))
+               return -EACCES;
+
+       device = dasd_device_from_gendisk(bdev->bd_disk);
+       if (!device)
+               return -ENODEV;
+
+       if (copy_from_user(&data, argp, sizeof(struct dasd_copypair_swap_data_t))) {
+               dasd_put_device(device);
+               return -EFAULT;
+       }
+       if (memchr_inv(data.reserved, 0, sizeof(data.reserved))) {
+               pr_warn("%s: Ivalid swap data specified.\n",
+                       dev_name(&device->cdev->dev));
+               dasd_put_device(device);
+               return DASD_COPYPAIRSWAP_INVALID;
+       }
+       if (bdev_is_partition(bdev)) {
+               pr_warn("%s: The specified DASD is a partition and cannot be swapped\n",
+                       dev_name(&device->cdev->dev));
+               dasd_put_device(device);
+               return DASD_COPYPAIRSWAP_INVALID;
+       }
+       if (!device->copy) {
+               pr_warn("%s: The specified DASD has no copy pair set up\n",
+                       dev_name(&device->cdev->dev));
+               dasd_put_device(device);
+               return -ENODEV;
+       }
+       if (!device->discipline->copy_pair_swap) {
+               dasd_put_device(device);
+               return -EOPNOTSUPP;
+       }
+       rc = device->discipline->copy_pair_swap(device, data.primary,
+                                               data.secondary);
+       dasd_put_device(device);
+
+       return rc;
+}
+
 #ifdef CONFIG_DASD_PROFILE
 /*
  * Reset device profile information
        case BIODASDRAS:
                rc = dasd_ioctl_release_space(bdev, argp);
                break;
+       case BIODASDCOPYPAIRSWAP:
+               rc = dasd_ioctl_copy_pair_swap(bdev, argp);
+               break;
        default:
                /* if the discipline has an ioctl method try it. */
                rc = -ENOTTY;