From patchwork Thu Dec 10 17:30:49 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mikulas Patocka X-Patchwork-Id: 7820801 Return-Path: X-Original-To: patchwork-linux-block@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 778B69F3E6 for ; Thu, 10 Dec 2015 17:33:41 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 8A61A20524 for ; Thu, 10 Dec 2015 17:33:40 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 966BE20592 for ; Thu, 10 Dec 2015 17:33:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752916AbbLJRc7 (ORCPT ); Thu, 10 Dec 2015 12:32:59 -0500 Received: from mx1.redhat.com ([209.132.183.28]:43173 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755118AbbLJRau (ORCPT ); Thu, 10 Dec 2015 12:30:50 -0500 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (Postfix) with ESMTPS id 0477B8E3E7; Thu, 10 Dec 2015 17:30:50 +0000 (UTC) Received: from file01.intranet.prod.int.rdu2.redhat.com (file01.intranet.prod.int.rdu2.redhat.com [10.11.5.7]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id tBAHUnAl021243 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=NO); Thu, 10 Dec 2015 12:30:49 -0500 Received: from file01.intranet.prod.int.rdu2.redhat.com (localhost [127.0.0.1]) by file01.intranet.prod.int.rdu2.redhat.com (8.14.4/8.14.4) with ESMTP id tBAHUnvY001173; Thu, 10 Dec 2015 12:30:49 -0500 Received: from localhost (mpatocka@localhost) by file01.intranet.prod.int.rdu2.redhat.com (8.14.4/8.14.4/Submit) with ESMTP id tBAHUn6x001169; Thu, 10 Dec 2015 12:30:49 -0500 X-Authentication-Warning: file01.intranet.prod.int.rdu2.redhat.com: mpatocka owned process doing -bs Date: Thu, 10 Dec 2015 12:30:49 -0500 (EST) From: Mikulas Patocka X-X-Sender: mpatocka@file01.intranet.prod.int.rdu2.redhat.com To: "James E.J. Bottomley" , "Martin K. Petersen" , Jens Axboe , Mike Snitzer , Jonathan Brassow cc: dm-devel@redhat.com, linux-scsi@vger.kernel.org, linux-kernel@vger.kernel.org, linux-block@vger.kernel.org Subject: [PATCH 9/15] dm: implement copy In-Reply-To: Message-ID: References: User-Agent: Alpine 2.02 (LRH 1266 2009-07-14) MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch implements basic copy support for device mapper core. Individual targets can enable copy support by setting ti->copy_supported. Device mapper device advertises copy support if at least one target supports copy and for this target, at least one underlying device supports copy. Signed-off-by: Mikulas Patocka --- drivers/md/dm-table.c | 16 ++++++++++++++++ drivers/md/dm.c | 27 +++++++++++++++++++++++++++ include/linux/device-mapper.h | 5 +++++ 3 files changed, 48 insertions(+) -- To unsubscribe from this list: send the line "unsubscribe linux-block" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Index: linux-4.4-rc4/drivers/md/dm.c =================================================================== --- linux-4.4-rc4.orig/drivers/md/dm.c 2015-12-10 17:04:05.000000000 +0100 +++ linux-4.4-rc4/drivers/md/dm.c 2015-12-10 17:05:48.000000000 +0100 @@ -1679,6 +1679,31 @@ static int __send_write_same(struct clon return __send_changing_extent_only(ci, get_num_write_same_bios, NULL); } +static int __send_copy(struct clone_info *ci) +{ + struct dm_target *ti; + sector_t bound; + + ti = dm_table_find_target(ci->map, ci->sector); + if (!dm_target_is_valid(ti)) + return -EIO; + + if (!ti->copy_supported) + return -EOPNOTSUPP; + + bound = max_io_len(ci->sector, ti); + + if (unlikely(ci->sector_count > bound)) + return -EOPNOTSUPP; + + __clone_and_map_simple_bio(ci, ti, 0, NULL); + + ci->sector += ci->sector_count; + ci->sector_count = 0; + + return 0; +} + /* * Select the correct strategy for processing a non-flush bio. */ @@ -1692,6 +1717,8 @@ static int __split_and_process_non_flush return __send_discard(ci); else if (unlikely(bio->bi_rw & REQ_WRITE_SAME)) return __send_write_same(ci); + else if (unlikely(bio->bi_rw & REQ_COPY)) + return __send_copy(ci); ti = dm_table_find_target(ci->map, ci->sector); if (!dm_target_is_valid(ti)) Index: linux-4.4-rc4/include/linux/device-mapper.h =================================================================== --- linux-4.4-rc4.orig/include/linux/device-mapper.h 2015-12-10 17:04:05.000000000 +0100 +++ linux-4.4-rc4/include/linux/device-mapper.h 2015-12-10 17:04:59.000000000 +0100 @@ -271,6 +271,11 @@ struct dm_target { * Set if this target does not return zeroes on discarded blocks. */ bool discard_zeroes_data_unsupported:1; + + /* + * Set if the target supports XCOPY. + */ + bool copy_supported:1; }; /* Each target can link one of these into the table */ Index: linux-4.4-rc4/drivers/md/dm-table.c =================================================================== --- linux-4.4-rc4.orig/drivers/md/dm-table.c 2015-12-10 17:03:51.000000000 +0100 +++ linux-4.4-rc4/drivers/md/dm-table.c 2015-12-10 17:04:59.000000000 +0100 @@ -286,6 +286,11 @@ static int device_area_is_invalid(struct limits->logical_block_size >> SECTOR_SHIFT; char b[BDEVNAME_SIZE]; + if (ti->copy_supported) + limits->max_copy_sectors = + min_not_zero(limits->max_copy_sectors, + bdev_get_queue(bdev)->limits.max_copy_sectors); + /* * Some devices exist without request functions, * such as loop devices not yet bound to backing files. @@ -1256,6 +1261,13 @@ int dm_calculate_queue_limits(struct dm_ ti = dm_table_get_target(table, i++); + if (ti->begin) + ti_limits.copy_boundary = min(ti_limits.copy_boundary, + (unsigned char)__ffs64(ti->begin)); + if (ti->max_io_len) + ti_limits.copy_boundary = min(ti_limits.copy_boundary, + (unsigned char)__ffs(ti->max_io_len)); + if (!ti->type->iterate_devices) goto combine_limits; @@ -1289,6 +1301,10 @@ combine_limits: dm_device_name(table->md), (unsigned long long) ti->begin, (unsigned long long) ti->len); + + limits->max_copy_sectors = + min_not_zero(limits->max_copy_sectors, + ti_limits.max_copy_sectors); } return validate_hardware_logical_block_alignment(table, limits);