From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 31B197E3 for ; Sat, 9 Apr 2022 04:52:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: Content-Type:MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc: To:From:Sender:Reply-To:Content-ID:Content-Description; bh=MR1dBREWEzr7uhm77WcgVZfNn+irLPCXxWfbv0Y8Fx8=; b=g1JrWZZU7gXqi54KSSq2td5NGg JTv8uprg5injPH7nKkeNRWdn6oTNLWZZnzaHqHhPeHQKztSOiA4sj9FfMAEZJ7/a9B/nIKLTwqwGB PuDRNI4dm2AH1PLgWy6G6WT6g3S55JW0fBof3tJZn4+4Uz4tLd0IKxpSOJszbSZ5S5fhGHf6HQiq8 tfOI2qhlZHSzdLNHIOgkox+DFYK8KmZY72c/I/6yjiFdBqWpjKEKpQemLV7RLvoqpLXmpYDnm9R+M 6+YRTeKl4k0OAcFvjw1Z1NHUh/0kBaNpv9L8pEjsBLMomqJ9Ip1F1RfoaNm2SYWGY95WZH5q/4P5S xDXG8m/A==; Received: from 213-147-167-116.nat.highway.webapn.at ([213.147.167.116] helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1nd35C-0021lf-95; Sat, 09 Apr 2022 04:52:23 +0000 From: Christoph Hellwig To: Jens Axboe Cc: dm-devel@redhat.com, linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-um@lists.infradead.org, linux-block@vger.kernel.org, drbd-dev@lists.linbit.com, nbd@other.debian.org, ceph-devel@vger.kernel.org, virtualization@lists.linux-foundation.org, xen-devel@lists.xenproject.org, linux-bcache@vger.kernel.org, linux-raid@vger.kernel.org, linux-mmc@vger.kernel.org, linux-mtd@lists.infradead.org, linux-nvme@lists.infradead.org, linux-s390@vger.kernel.org, linux-scsi@vger.kernel.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, cluster-devel@redhat.com, jfs-discussion@lists.sourceforge.net, linux-nilfs@vger.kernel.org, ntfs3@lists.linux.dev, ocfs2-devel@oss.oracle.com, linux-mm@kvack.org, "Martin K . Petersen" , =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= , Ryusuke Konishi , Coly Li , David Sterba Subject: [PATCH 26/27] block: decouple REQ_OP_SECURE_ERASE from REQ_OP_DISCARD Date: Sat, 9 Apr 2022 06:50:42 +0200 Message-Id: <20220409045043.23593-27-hch@lst.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220409045043.23593-1-hch@lst.de> References: <20220409045043.23593-1-hch@lst.de> Precedence: bulk X-Mailing-List: ntfs3@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Secure erase is a very different operation from discard in that it is a data integrity operation vs hint. Fully split the limits and helper infrastructure to make the separation more clear. Signed-off-by: Christoph Hellwig Reviewed-by: Martin K. Petersen Acked-by: Christoph Böhmwalder [drbd] Acked-by: Ryusuke Konishi [nifs2] Acked-by: Coly Li [drbd] Acked-by: David Sterba [btrfs] --- block/blk-core.c | 2 +- block/blk-lib.c | 64 ++++++++++++++++++++--------- block/blk-mq-debugfs.c | 1 - block/blk-settings.c | 16 +++++++- block/fops.c | 2 +- block/ioctl.c | 43 +++++++++++++++---- drivers/block/drbd/drbd_receiver.c | 5 ++- drivers/block/rnbd/rnbd-clt.c | 4 +- drivers/block/rnbd/rnbd-srv-dev.h | 2 +- drivers/block/xen-blkback/blkback.c | 15 +++---- drivers/block/xen-blkback/xenbus.c | 5 +-- drivers/block/xen-blkfront.c | 5 ++- drivers/md/bcache/alloc.c | 2 +- drivers/md/dm-table.c | 8 ++-- drivers/md/dm-thin.c | 4 +- drivers/md/md.c | 2 +- drivers/md/raid5-cache.c | 6 +-- drivers/mmc/core/queue.c | 2 +- drivers/nvme/target/io-cmd-bdev.c | 2 +- drivers/target/target_core_file.c | 2 +- drivers/target/target_core_iblock.c | 2 +- fs/btrfs/extent-tree.c | 4 +- fs/ext4/mballoc.c | 2 +- fs/f2fs/file.c | 16 ++++---- fs/f2fs/segment.c | 2 +- fs/jbd2/journal.c | 2 +- fs/nilfs2/sufile.c | 4 +- fs/nilfs2/the_nilfs.c | 4 +- fs/ntfs3/super.c | 2 +- fs/xfs/xfs_discard.c | 2 +- fs/xfs/xfs_log_cil.c | 2 +- include/linux/blkdev.h | 27 +++++++----- mm/swapfile.c | 6 +-- 33 files changed, 168 insertions(+), 99 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index b5c3a8049134c..ee18b6a699bdf 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -824,7 +824,7 @@ void submit_bio_noacct(struct bio *bio) goto not_supported; break; case REQ_OP_SECURE_ERASE: - if (!blk_queue_secure_erase(q)) + if (!bdev_max_secure_erase_sectors(bdev)) goto not_supported; break; case REQ_OP_ZONE_APPEND: diff --git a/block/blk-lib.c b/block/blk-lib.c index 43aa4d7fe859f..09b7e1200c0f4 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -36,26 +36,15 @@ static sector_t bio_discard_limit(struct block_device *bdev, sector_t sector) } int __blkdev_issue_discard(struct block_device *bdev, sector_t sector, - sector_t nr_sects, gfp_t gfp_mask, int flags, - struct bio **biop) + sector_t nr_sects, gfp_t gfp_mask, struct bio **biop) { - struct request_queue *q = bdev_get_queue(bdev); struct bio *bio = *biop; - unsigned int op; sector_t bs_mask; if (bdev_read_only(bdev)) return -EPERM; - - if (flags & BLKDEV_DISCARD_SECURE) { - if (!blk_queue_secure_erase(q)) - return -EOPNOTSUPP; - op = REQ_OP_SECURE_ERASE; - } else { - if (!bdev_max_discard_sectors(bdev)) - return -EOPNOTSUPP; - op = REQ_OP_DISCARD; - } + if (!bdev_max_discard_sectors(bdev)) + return -EOPNOTSUPP; /* In case the discard granularity isn't set by buggy device driver */ if (WARN_ON_ONCE(!bdev_discard_granularity(bdev))) { @@ -77,7 +66,7 @@ int __blkdev_issue_discard(struct block_device *bdev, sector_t sector, sector_t req_sects = min(nr_sects, bio_discard_limit(bdev, sector)); - bio = blk_next_bio(bio, bdev, 0, op, gfp_mask); + bio = blk_next_bio(bio, bdev, 0, REQ_OP_DISCARD, gfp_mask); bio->bi_iter.bi_sector = sector; bio->bi_iter.bi_size = req_sects << 9; sector += req_sects; @@ -103,21 +92,19 @@ EXPORT_SYMBOL(__blkdev_issue_discard); * @sector: start sector * @nr_sects: number of sectors to discard * @gfp_mask: memory allocation flags (for bio_alloc) - * @flags: BLKDEV_DISCARD_* flags to control behaviour * * Description: * Issue a discard request for the sectors in question. */ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, - sector_t nr_sects, gfp_t gfp_mask, unsigned long flags) + sector_t nr_sects, gfp_t gfp_mask) { struct bio *bio = NULL; struct blk_plug plug; int ret; blk_start_plug(&plug); - ret = __blkdev_issue_discard(bdev, sector, nr_sects, gfp_mask, flags, - &bio); + ret = __blkdev_issue_discard(bdev, sector, nr_sects, gfp_mask, &bio); if (!ret && bio) { ret = submit_bio_wait(bio); if (ret == -EOPNOTSUPP) @@ -314,3 +301,42 @@ int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, return ret; } EXPORT_SYMBOL(blkdev_issue_zeroout); + +int blkdev_issue_secure_erase(struct block_device *bdev, sector_t sector, + sector_t nr_sects, gfp_t gfp) +{ + sector_t bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1; + unsigned int max_sectors = bdev_max_secure_erase_sectors(bdev); + struct bio *bio = NULL; + struct blk_plug plug; + int ret = 0; + + if (max_sectors == 0) + return -EOPNOTSUPP; + if ((sector | nr_sects) & bs_mask) + return -EINVAL; + if (bdev_read_only(bdev)) + return -EPERM; + + blk_start_plug(&plug); + for (;;) { + unsigned int len = min_t(sector_t, nr_sects, max_sectors); + + bio = blk_next_bio(bio, bdev, 0, REQ_OP_SECURE_ERASE, gfp); + bio->bi_iter.bi_sector = sector; + bio->bi_iter.bi_size = len; + + sector += len << SECTOR_SHIFT; + nr_sects -= len << SECTOR_SHIFT; + if (!nr_sects) { + ret = submit_bio_wait(bio); + bio_put(bio); + break; + } + cond_resched(); + } + blk_finish_plug(&plug); + + return ret; +} +EXPORT_SYMBOL(blkdev_issue_secure_erase); diff --git a/block/blk-mq-debugfs.c b/block/blk-mq-debugfs.c index fd111c5001256..7e4136a60e1cc 100644 --- a/block/blk-mq-debugfs.c +++ b/block/blk-mq-debugfs.c @@ -115,7 +115,6 @@ static const char *const blk_queue_flag_name[] = { QUEUE_FLAG_NAME(IO_STAT), QUEUE_FLAG_NAME(NOXMERGES), QUEUE_FLAG_NAME(ADD_RANDOM), - QUEUE_FLAG_NAME(SECERASE), QUEUE_FLAG_NAME(SAME_FORCE), QUEUE_FLAG_NAME(DEAD), QUEUE_FLAG_NAME(INIT_DONE), diff --git a/block/blk-settings.c b/block/blk-settings.c index fd83d674afd0a..6ccceb421ed2f 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c @@ -46,6 +46,7 @@ void blk_set_default_limits(struct queue_limits *lim) lim->max_zone_append_sectors = 0; lim->max_discard_sectors = 0; lim->max_hw_discard_sectors = 0; + lim->max_secure_erase_sectors = 0; lim->discard_granularity = 0; lim->discard_alignment = 0; lim->discard_misaligned = 0; @@ -176,6 +177,18 @@ void blk_queue_max_discard_sectors(struct request_queue *q, } EXPORT_SYMBOL(blk_queue_max_discard_sectors); +/** + * blk_queue_max_secure_erase_sectors - set max sectors for a secure erase + * @q: the request queue for the device + * @max_sectors: maximum number of sectors to secure_erase + **/ +void blk_queue_max_secure_erase_sectors(struct request_queue *q, + unsigned int max_sectors) +{ + q->limits.max_secure_erase_sectors = max_sectors; +} +EXPORT_SYMBOL(blk_queue_max_secure_erase_sectors); + /** * blk_queue_max_write_zeroes_sectors - set max sectors for a single * write zeroes @@ -661,7 +674,8 @@ int blk_stack_limits(struct queue_limits *t, struct queue_limits *b, t->discard_alignment = lcm_not_zero(t->discard_alignment, alignment) % t->discard_granularity; } - + t->max_secure_erase_sectors = min_not_zero(t->max_secure_erase_sectors, + b->max_secure_erase_sectors); t->zone_write_granularity = max(t->zone_write_granularity, b->zone_write_granularity); t->zoned = max(t->zoned, b->zoned); diff --git a/block/fops.c b/block/fops.c index 9f2ecec406b04..c0ca3254d38cf 100644 --- a/block/fops.c +++ b/block/fops.c @@ -672,7 +672,7 @@ static long blkdev_fallocate(struct file *file, int mode, loff_t start, break; case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE | FALLOC_FL_NO_HIDE_STALE: error = blkdev_issue_discard(bdev, start >> SECTOR_SHIFT, - len >> SECTOR_SHIFT, GFP_KERNEL, 0); + len >> SECTOR_SHIFT, GFP_KERNEL); break; default: error = -EOPNOTSUPP; diff --git a/block/ioctl.c b/block/ioctl.c index c2cd3ba5290ce..5b5027fa78f7e 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -83,7 +83,7 @@ static int compat_blkpg_ioctl(struct block_device *bdev, #endif static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode, - unsigned long arg, unsigned long flags) + unsigned long arg) { uint64_t range[2]; uint64_t start, len; @@ -114,15 +114,43 @@ static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode, err = truncate_bdev_range(bdev, mode, start, start + len - 1); if (err) goto fail; - - err = blkdev_issue_discard(bdev, start >> 9, len >> 9, - GFP_KERNEL, flags); - + err = blkdev_issue_discard(bdev, start >> 9, len >> 9, GFP_KERNEL); fail: filemap_invalidate_unlock(inode->i_mapping); return err; } +static int blk_ioctl_secure_erase(struct block_device *bdev, fmode_t mode, + void __user *argp) +{ + uint64_t start, len; + uint64_t range[2]; + int err; + + if (!(mode & FMODE_WRITE)) + return -EBADF; + if (!bdev_max_secure_erase_sectors(bdev)) + return -EOPNOTSUPP; + if (copy_from_user(range, argp, sizeof(range))) + return -EFAULT; + + start = range[0]; + len = range[1]; + if ((start & 511) || (len & 511)) + return -EINVAL; + if (start + len > bdev_nr_bytes(bdev)) + return -EINVAL; + + filemap_invalidate_lock(bdev->bd_inode->i_mapping); + err = truncate_bdev_range(bdev, mode, start, start + len - 1); + if (!err) + err = blkdev_issue_secure_erase(bdev, start >> 9, len >> 9, + GFP_KERNEL); + filemap_invalidate_unlock(bdev->bd_inode->i_mapping); + return err; +} + + static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode, unsigned long arg) { @@ -450,10 +478,9 @@ static int blkdev_common_ioctl(struct block_device *bdev, fmode_t mode, case BLKROSET: return blkdev_roset(bdev, mode, cmd, arg); case BLKDISCARD: - return blk_ioctl_discard(bdev, mode, arg, 0); + return blk_ioctl_discard(bdev, mode, arg); case BLKSECDISCARD: - return blk_ioctl_discard(bdev, mode, arg, - BLKDEV_DISCARD_SECURE); + return blk_ioctl_secure_erase(bdev, mode, argp); case BLKZEROOUT: return blk_ioctl_zeroout(bdev, mode, arg); case BLKGETDISKSEQ: diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 275c53c7b629e..2957b0b68d600 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -1547,7 +1547,8 @@ int drbd_issue_discard_or_zero_out(struct drbd_device *device, sector_t start, u start = tmp; } while (nr_sectors >= max_discard_sectors) { - err |= blkdev_issue_discard(bdev, start, max_discard_sectors, GFP_NOIO, 0); + err |= blkdev_issue_discard(bdev, start, max_discard_sectors, + GFP_NOIO); nr_sectors -= max_discard_sectors; start += max_discard_sectors; } @@ -1559,7 +1560,7 @@ int drbd_issue_discard_or_zero_out(struct drbd_device *device, sector_t start, u nr = nr_sectors; nr -= (unsigned int)nr % granularity; if (nr) { - err |= blkdev_issue_discard(bdev, start, nr, GFP_NOIO, 0); + err |= blkdev_issue_discard(bdev, start, nr, GFP_NOIO); nr_sectors -= nr; start += nr; } diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c index efa99a3884507..d178be175ad99 100644 --- a/drivers/block/rnbd/rnbd-clt.c +++ b/drivers/block/rnbd/rnbd-clt.c @@ -1365,8 +1365,8 @@ static void setup_request_queue(struct rnbd_clt_dev *dev) dev->queue->limits.discard_granularity = dev->discard_granularity; dev->queue->limits.discard_alignment = dev->discard_alignment; if (dev->secure_discard) - blk_queue_flag_set(QUEUE_FLAG_SECERASE, dev->queue); - + blk_queue_max_secure_erase_sectors(dev->queue, + dev->max_discard_sectors); blk_queue_flag_set(QUEUE_FLAG_SAME_COMP, dev->queue); blk_queue_flag_set(QUEUE_FLAG_SAME_FORCE, dev->queue); blk_queue_max_segments(dev->queue, dev->max_segments); diff --git a/drivers/block/rnbd/rnbd-srv-dev.h b/drivers/block/rnbd/rnbd-srv-dev.h index 1f7e1c8fd4d9b..d080a0de59225 100644 --- a/drivers/block/rnbd/rnbd-srv-dev.h +++ b/drivers/block/rnbd/rnbd-srv-dev.h @@ -44,7 +44,7 @@ static inline int rnbd_dev_get_max_hw_sects(const struct rnbd_dev *dev) static inline int rnbd_dev_get_secure_discard(const struct rnbd_dev *dev) { - return blk_queue_secure_erase(bdev_get_queue(dev->bdev)); + return bdev_max_secure_erase_sectors(dev->bdev); } static inline int rnbd_dev_get_max_discard_sects(const struct rnbd_dev *dev) diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index de42458195bc1..a97f2bf5b01b9 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -970,7 +970,6 @@ static int dispatch_discard_io(struct xen_blkif_ring *ring, int status = BLKIF_RSP_OKAY; struct xen_blkif *blkif = ring->blkif; struct block_device *bdev = blkif->vbd.bdev; - unsigned long secure; struct phys_req preq; xen_blkif_get(blkif); @@ -987,13 +986,15 @@ static int dispatch_discard_io(struct xen_blkif_ring *ring, } ring->st_ds_req++; - secure = (blkif->vbd.discard_secure && - (req->u.discard.flag & BLKIF_DISCARD_SECURE)) ? - BLKDEV_DISCARD_SECURE : 0; + if (blkif->vbd.discard_secure && + (req->u.discard.flag & BLKIF_DISCARD_SECURE)) + err = blkdev_issue_secure_erase(bdev, + req->u.discard.sector_number, + req->u.discard.nr_sectors, GFP_KERNEL); + else + err = blkdev_issue_discard(bdev, req->u.discard.sector_number, + req->u.discard.nr_sectors, GFP_KERNEL); - err = blkdev_issue_discard(bdev, req->u.discard.sector_number, - req->u.discard.nr_sectors, - GFP_KERNEL, secure); fail_response: if (err == -EOPNOTSUPP) { pr_debug("discard op failed, not supported\n"); diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c index 83cd08041e6b3..b21bffc9c50bc 100644 --- a/drivers/block/xen-blkback/xenbus.c +++ b/drivers/block/xen-blkback/xenbus.c @@ -484,7 +484,6 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle, { struct xen_vbd *vbd; struct block_device *bdev; - struct request_queue *q; vbd = &blkif->vbd; vbd->handle = handle; @@ -516,11 +515,9 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle, if (vbd->bdev->bd_disk->flags & GENHD_FL_REMOVABLE) vbd->type |= VDISK_REMOVABLE; - q = bdev_get_queue(bdev); if (bdev_write_cache(bdev)) vbd->flush_support = true; - - if (q && blk_queue_secure_erase(q)) + if (bdev_max_secure_erase_sectors(bdev)) vbd->discard_secure = true; vbd->feature_gnt_persistent = feature_persistent; diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 253bf835aca1f..9fb7c69f72b2d 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -949,7 +949,8 @@ static void blkif_set_queue_limits(struct blkfront_info *info) info->physical_sector_size; rq->limits.discard_alignment = info->discard_alignment; if (info->feature_secdiscard) - blk_queue_flag_set(QUEUE_FLAG_SECERASE, rq); + blk_queue_max_secure_erase_sectors(rq, + get_capacity(gd)); } /* Hard sector size and max sectors impersonate the equiv. hardware. */ @@ -1605,7 +1606,7 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) blkif_req(req)->error = BLK_STS_NOTSUPP; info->feature_discard = 0; info->feature_secdiscard = 0; - blk_queue_flag_clear(QUEUE_FLAG_SECERASE, rq); + blk_queue_max_secure_erase_sectors(rq, 0); } break; case BLKIF_OP_FLUSH_DISKCACHE: diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c index 097577ae3c471..ce13c272c3872 100644 --- a/drivers/md/bcache/alloc.c +++ b/drivers/md/bcache/alloc.c @@ -336,7 +336,7 @@ static int bch_allocator_thread(void *arg) mutex_unlock(&ca->set->bucket_lock); blkdev_issue_discard(ca->bdev, bucket_to_sector(ca->set, bucket), - ca->sb.bucket_size, GFP_KERNEL, 0); + ca->sb.bucket_size, GFP_KERNEL); mutex_lock(&ca->set->bucket_lock); } diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 0dff6907fd00d..e7d42f6335a2a 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -1920,9 +1920,7 @@ static int device_not_secure_erase_capable(struct dm_target *ti, struct dm_dev *dev, sector_t start, sector_t len, void *data) { - struct request_queue *q = bdev_get_queue(dev->bdev); - - return !blk_queue_secure_erase(q); + return !bdev_max_secure_erase_sectors(dev->bdev); } static bool dm_table_supports_secure_erase(struct dm_table *t) @@ -1975,8 +1973,8 @@ int dm_table_set_restrictions(struct dm_table *t, struct request_queue *q, q->limits.discard_misaligned = 0; } - if (dm_table_supports_secure_erase(t)) - blk_queue_flag_set(QUEUE_FLAG_SECERASE, q); + if (!dm_table_supports_secure_erase(t)) + q->limits.max_secure_erase_sectors = 0; if (dm_table_supports_flush(t, (1UL << QUEUE_FLAG_WC))) { wc = true; diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index eded4bcc4545f..84c083f766736 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -398,8 +398,8 @@ static int issue_discard(struct discard_op *op, dm_block_t data_b, dm_block_t da sector_t s = block_to_sectors(tc->pool, data_b); sector_t len = block_to_sectors(tc->pool, data_e - data_b); - return __blkdev_issue_discard(tc->pool_dev->bdev, s, len, - GFP_NOWAIT, 0, &op->bio); + return __blkdev_issue_discard(tc->pool_dev->bdev, s, len, GFP_NOWAIT, + &op->bio); } static void end_discard(struct discard_op *op, int r) diff --git a/drivers/md/md.c b/drivers/md/md.c index 19636c2f2cda4..2587f872c0884 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -8584,7 +8584,7 @@ void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev, { struct bio *discard_bio = NULL; - if (__blkdev_issue_discard(rdev->bdev, start, size, GFP_NOIO, 0, + if (__blkdev_issue_discard(rdev->bdev, start, size, GFP_NOIO, &discard_bio) || !discard_bio) return; diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index c3cbf9a574a39..094a4042589eb 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -1344,14 +1344,14 @@ static void r5l_write_super_and_discard_space(struct r5l_log *log, if (log->last_checkpoint < end) { blkdev_issue_discard(bdev, log->last_checkpoint + log->rdev->data_offset, - end - log->last_checkpoint, GFP_NOIO, 0); + end - log->last_checkpoint, GFP_NOIO); } else { blkdev_issue_discard(bdev, log->last_checkpoint + log->rdev->data_offset, log->device_size - log->last_checkpoint, - GFP_NOIO, 0); + GFP_NOIO); blkdev_issue_discard(bdev, log->rdev->data_offset, end, - GFP_NOIO, 0); + GFP_NOIO); } } diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c index cac6315010a3d..a3d4460055716 100644 --- a/drivers/mmc/core/queue.c +++ b/drivers/mmc/core/queue.c @@ -189,7 +189,7 @@ static void mmc_queue_setup_discard(struct request_queue *q, if (card->pref_erase > max_discard) q->limits.discard_granularity = SECTOR_SIZE; if (mmc_can_secure_erase_trim(card)) - blk_queue_flag_set(QUEUE_FLAG_SECERASE, q); + blk_queue_max_secure_erase_sectors(q, max_discard); } static unsigned short mmc_get_max_segments(struct mmc_host *host) diff --git a/drivers/nvme/target/io-cmd-bdev.c b/drivers/nvme/target/io-cmd-bdev.c index d886c2c59554f..27a72504d31ce 100644 --- a/drivers/nvme/target/io-cmd-bdev.c +++ b/drivers/nvme/target/io-cmd-bdev.c @@ -360,7 +360,7 @@ static u16 nvmet_bdev_discard_range(struct nvmet_req *req, ret = __blkdev_issue_discard(ns->bdev, nvmet_lba_to_sect(ns, range->slba), le32_to_cpu(range->nlb) << (ns->blksize_shift - 9), - GFP_KERNEL, 0, bio); + GFP_KERNEL, bio); if (ret && ret != -EOPNOTSUPP) { req->error_slba = le64_to_cpu(range->slba); return errno_to_nvme_status(req, ret); diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index b6ba582b06775..e68f1cc8ef98b 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c @@ -558,7 +558,7 @@ fd_execute_unmap(struct se_cmd *cmd, sector_t lba, sector_t nolb) ret = blkdev_issue_discard(bdev, target_to_linux_sector(dev, lba), target_to_linux_sector(dev, nolb), - GFP_KERNEL, 0); + GFP_KERNEL); if (ret < 0) { pr_warn("FILEIO: blkdev_issue_discard() failed: %d\n", ret); diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index c4a903b8a47fc..378c80313a0f2 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c @@ -434,7 +434,7 @@ iblock_execute_unmap(struct se_cmd *cmd, sector_t lba, sector_t nolb) ret = blkdev_issue_discard(bdev, target_to_linux_sector(dev, lba), target_to_linux_sector(dev, nolb), - GFP_KERNEL, 0); + GFP_KERNEL); if (ret < 0) { pr_err("blkdev_issue_discard() failed: %d\n", ret); return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index efd8deb3ab7e8..5c1d3a564da5a 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -1239,7 +1239,7 @@ static int btrfs_issue_discard(struct block_device *bdev, u64 start, u64 len, if (size) { ret = blkdev_issue_discard(bdev, start >> 9, size >> 9, - GFP_NOFS, 0); + GFP_NOFS); if (!ret) *discarded_bytes += size; else if (ret != -EOPNOTSUPP) @@ -1256,7 +1256,7 @@ static int btrfs_issue_discard(struct block_device *bdev, u64 start, u64 len, if (bytes_left) { ret = blkdev_issue_discard(bdev, start >> 9, bytes_left >> 9, - GFP_NOFS, 0); + GFP_NOFS); if (!ret) *discarded_bytes += bytes_left; } diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 6d1820536d88d..ea653d19f9ec7 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -3629,7 +3629,7 @@ static inline int ext4_issue_discard(struct super_block *sb, return __blkdev_issue_discard(sb->s_bdev, (sector_t)discard_block << (sb->s_blocksize_bits - 9), (sector_t)count << (sb->s_blocksize_bits - 9), - GFP_NOFS, 0, biop); + GFP_NOFS, biop); } else return sb_issue_discard(sb, discard_block, count, GFP_NOFS, 0); } diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 8053d99f3920b..35b6c720c2bc1 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -3685,18 +3685,18 @@ static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg) static int f2fs_secure_erase(struct block_device *bdev, struct inode *inode, pgoff_t off, block_t block, block_t len, u32 flags) { - struct request_queue *q = bdev_get_queue(bdev); sector_t sector = SECTOR_FROM_BLOCK(block); sector_t nr_sects = SECTOR_FROM_BLOCK(len); int ret = 0; - if (!q) - return -ENXIO; - - if (flags & F2FS_TRIM_FILE_DISCARD) - ret = blkdev_issue_discard(bdev, sector, nr_sects, GFP_NOFS, - blk_queue_secure_erase(q) ? - BLKDEV_DISCARD_SECURE : 0); + if (flags & F2FS_TRIM_FILE_DISCARD) { + if (bdev_max_secure_erase_sectors(bdev)) + ret = blkdev_issue_secure_erase(bdev, sector, nr_sects, + GFP_NOFS); + else + ret = blkdev_issue_discard(bdev, sector, nr_sects, + GFP_NOFS); + } if (!ret && (flags & F2FS_TRIM_FILE_ZEROOUT)) { if (IS_ENCRYPTED(inode)) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 71f09adbcba86..e433c61e64b93 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -1244,7 +1244,7 @@ static int __submit_discard_cmd(struct f2fs_sb_info *sbi, err = __blkdev_issue_discard(bdev, SECTOR_FROM_BLOCK(start), SECTOR_FROM_BLOCK(len), - GFP_NOFS, 0, &bio); + GFP_NOFS, &bio); submit: if (err) { spin_lock_irqsave(&dc->lock, flags); diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 19d226cd4ff4d..c0cbeeaec2d1a 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -1825,7 +1825,7 @@ static int __jbd2_journal_erase(journal_t *journal, unsigned int flags) err = blkdev_issue_discard(journal->j_dev, byte_start >> SECTOR_SHIFT, byte_count >> SECTOR_SHIFT, - GFP_NOFS, 0); + GFP_NOFS); } else if (flags & JBD2_JOURNAL_FLUSH_ZEROOUT) { err = blkdev_issue_zeroout(journal->j_dev, byte_start >> SECTOR_SHIFT, diff --git a/fs/nilfs2/sufile.c b/fs/nilfs2/sufile.c index e385cca2004a7..77ff8e95421fa 100644 --- a/fs/nilfs2/sufile.c +++ b/fs/nilfs2/sufile.c @@ -1100,7 +1100,7 @@ int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range) ret = blkdev_issue_discard(nilfs->ns_bdev, start * sects_per_block, nblocks * sects_per_block, - GFP_NOFS, 0); + GFP_NOFS); if (ret < 0) { put_bh(su_bh); goto out_sem; @@ -1134,7 +1134,7 @@ int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range) ret = blkdev_issue_discard(nilfs->ns_bdev, start * sects_per_block, nblocks * sects_per_block, - GFP_NOFS, 0); + GFP_NOFS); if (!ret) ndiscarded += nblocks; } diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c index dd48a8f74d577..3b4a079c9617c 100644 --- a/fs/nilfs2/the_nilfs.c +++ b/fs/nilfs2/the_nilfs.c @@ -672,7 +672,7 @@ int nilfs_discard_segments(struct the_nilfs *nilfs, __u64 *segnump, ret = blkdev_issue_discard(nilfs->ns_bdev, start * sects_per_block, nblocks * sects_per_block, - GFP_NOFS, 0); + GFP_NOFS); if (ret < 0) return ret; nblocks = 0; @@ -682,7 +682,7 @@ int nilfs_discard_segments(struct the_nilfs *nilfs, __u64 *segnump, ret = blkdev_issue_discard(nilfs->ns_bdev, start * sects_per_block, nblocks * sects_per_block, - GFP_NOFS, 0); + GFP_NOFS); return ret; } diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c index 5f2e414cfa79b..5781b9e8e3d85 100644 --- a/fs/ntfs3/super.c +++ b/fs/ntfs3/super.c @@ -1333,7 +1333,7 @@ int ntfs_discard(struct ntfs_sb_info *sbi, CLST lcn, CLST len) return 0; err = blkdev_issue_discard(sb->s_bdev, start >> 9, (end - start) >> 9, - GFP_NOFS, 0); + GFP_NOFS); if (err == -EOPNOTSUPP) sbi->flags |= NTFS_FLAGS_NODISCARD; diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index e2ada115c23f9..c6fe3f6ebb6b0 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c @@ -114,7 +114,7 @@ xfs_trim_extents( } trace_xfs_discard_extent(mp, agno, fbno, flen); - error = blkdev_issue_discard(bdev, dbno, dlen, GFP_NOFS, 0); + error = blkdev_issue_discard(bdev, dbno, dlen, GFP_NOFS); if (error) goto out_del_cursor; *blocks_trimmed += flen; diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index ba57323bfdcea..c9f55e4f09571 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -605,7 +605,7 @@ xlog_discard_busy_extents( error = __blkdev_issue_discard(mp->m_ddev_targp->bt_bdev, XFS_AGB_TO_DADDR(mp, busyp->agno, busyp->bno), XFS_FSB_TO_BB(mp, busyp->length), - GFP_NOFS, 0, &bio); + GFP_NOFS, &bio); if (error && error != -EOPNOTSUPP) { xfs_info(mp, "discard failed for extent [0x%llx,%u], error %d", diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index f1cf557ea20ef..c9b5925af5a3b 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -248,6 +248,7 @@ struct queue_limits { unsigned int io_opt; unsigned int max_discard_sectors; unsigned int max_hw_discard_sectors; + unsigned int max_secure_erase_sectors; unsigned int max_write_zeroes_sectors; unsigned int max_zone_append_sectors; unsigned int discard_granularity; @@ -542,7 +543,6 @@ struct request_queue { #define QUEUE_FLAG_IO_STAT 7 /* do disk/partitions IO accounting */ #define QUEUE_FLAG_NOXMERGES 9 /* No extended merges */ #define QUEUE_FLAG_ADD_RANDOM 10 /* Contributes to random pool */ -#define QUEUE_FLAG_SECERASE 11 /* supports secure erase */ #define QUEUE_FLAG_SAME_FORCE 12 /* force complete on same CPU */ #define QUEUE_FLAG_DEAD 13 /* queue tear-down finished */ #define QUEUE_FLAG_INIT_DONE 14 /* queue is initialized */ @@ -583,8 +583,6 @@ bool blk_queue_flag_test_and_set(unsigned int flag, struct request_queue *q); #define blk_queue_add_random(q) test_bit(QUEUE_FLAG_ADD_RANDOM, &(q)->queue_flags) #define blk_queue_zone_resetall(q) \ test_bit(QUEUE_FLAG_ZONE_RESETALL, &(q)->queue_flags) -#define blk_queue_secure_erase(q) \ - (test_bit(QUEUE_FLAG_SECERASE, &(q)->queue_flags)) #define blk_queue_dax(q) test_bit(QUEUE_FLAG_DAX, &(q)->queue_flags) #define blk_queue_pci_p2pdma(q) \ test_bit(QUEUE_FLAG_PCI_P2PDMA, &(q)->queue_flags) @@ -947,6 +945,8 @@ extern void blk_queue_chunk_sectors(struct request_queue *, unsigned int); extern void blk_queue_max_segments(struct request_queue *, unsigned short); extern void blk_queue_max_discard_segments(struct request_queue *, unsigned short); +void blk_queue_max_secure_erase_sectors(struct request_queue *q, + unsigned int max_sectors); extern void blk_queue_max_segment_size(struct request_queue *, unsigned int); extern void blk_queue_max_discard_sectors(struct request_queue *q, unsigned int max_discard_sectors); @@ -1087,13 +1087,12 @@ static inline long nr_blockdev_pages(void) extern void blk_io_schedule(void); -#define BLKDEV_DISCARD_SECURE (1 << 0) /* issue a secure erase */ - -extern int blkdev_issue_discard(struct block_device *bdev, sector_t sector, - sector_t nr_sects, gfp_t gfp_mask, unsigned long flags); -extern int __blkdev_issue_discard(struct block_device *bdev, sector_t sector, - sector_t nr_sects, gfp_t gfp_mask, int flags, - struct bio **biop); +int blkdev_issue_discard(struct block_device *bdev, sector_t sector, + sector_t nr_sects, gfp_t gfp_mask); +int __blkdev_issue_discard(struct block_device *bdev, sector_t sector, + sector_t nr_sects, gfp_t gfp_mask, struct bio **biop); +int blkdev_issue_secure_erase(struct block_device *bdev, sector_t sector, + sector_t nr_sects, gfp_t gfp); #define BLKDEV_ZERO_NOUNMAP (1 << 0) /* do not free blocks */ #define BLKDEV_ZERO_NOFALLBACK (1 << 1) /* don't write explicit zeroes */ @@ -1112,7 +1111,7 @@ static inline int sb_issue_discard(struct super_block *sb, sector_t block, SECTOR_SHIFT), nr_blocks << (sb->s_blocksize_bits - SECTOR_SHIFT), - gfp_mask, flags); + gfp_mask); } static inline int sb_issue_zeroout(struct super_block *sb, sector_t block, sector_t nr_blocks, gfp_t gfp_mask) @@ -1262,6 +1261,12 @@ static inline unsigned int bdev_discard_granularity(struct block_device *bdev) return bdev_get_queue(bdev)->limits.discard_granularity; } +static inline unsigned int +bdev_max_secure_erase_sectors(struct block_device *bdev) +{ + return bdev_get_queue(bdev)->limits.max_secure_erase_sectors; +} + static inline unsigned int bdev_write_zeroes_sectors(struct block_device *bdev) { struct request_queue *q = bdev_get_queue(bdev); diff --git a/mm/swapfile.c b/mm/swapfile.c index 5d9cedf9e7b84..a2b31fea0c42e 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -179,7 +179,7 @@ static int discard_swap(struct swap_info_struct *si) nr_blocks = ((sector_t)se->nr_pages - 1) << (PAGE_SHIFT - 9); if (nr_blocks) { err = blkdev_issue_discard(si->bdev, start_block, - nr_blocks, GFP_KERNEL, 0); + nr_blocks, GFP_KERNEL); if (err) return err; cond_resched(); @@ -190,7 +190,7 @@ static int discard_swap(struct swap_info_struct *si) nr_blocks = (sector_t)se->nr_pages << (PAGE_SHIFT - 9); err = blkdev_issue_discard(si->bdev, start_block, - nr_blocks, GFP_KERNEL, 0); + nr_blocks, GFP_KERNEL); if (err) break; @@ -254,7 +254,7 @@ static void discard_swap_cluster(struct swap_info_struct *si, start_block <<= PAGE_SHIFT - 9; nr_blocks <<= PAGE_SHIFT - 9; if (blkdev_issue_discard(si->bdev, start_block, - nr_blocks, GFP_NOIO, 0)) + nr_blocks, GFP_NOIO)) break; se = next_se(se); -- 2.30.2 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id BDE98C4167E for ; Sat, 9 Apr 2022 04:52:48 +0000 (UTC) Received: from [127.0.0.1] (helo=sfs-ml-4.v29.lw.sourceforge.com) by sfs-ml-4.v29.lw.sourceforge.com with esmtp (Exim 4.94.2) (envelope-from ) id 1nd35c-0000SR-Nw; Sat, 09 Apr 2022 04:52:47 +0000 Received: from [172.30.20.202] (helo=mx.sourceforge.net) by sfs-ml-4.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1nd35c-0000S0-55; Sat, 09 Apr 2022 04:52:46 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=Content-Transfer-Encoding:Content-Type:MIME-Version :References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=MR1dBREWEzr7uhm77WcgVZfNn+irLPCXxWfbv0Y8Fx8=; b=hkOIDeHUPYgA3M1LD6ejjVr0PO zvdhJIyTLGvODKW3C/ZmUjgLktdONB1sdxyQT2eYQLzohxeGdsiHTXcwcg7TiE4aUALofy1wXixhT xIqqPR9BkLvSB8dccH2YMFU0bCUB20EP8+NqIXDWFPwKD0V+OAZ0q1z4Q0C8cVi/dIGA=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References: In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=MR1dBREWEzr7uhm77WcgVZfNn+irLPCXxWfbv0Y8Fx8=; b=dyRV3ObAXYKQPJjY9cea0hwcge FoZ6q+iBO+xRySH1LQqxJf8STJ69sPHl/R/YHYaMXyX13zEH4RG+Es3Ic4jl4lQJuTOAN9jhzeIRU 7lrIRTIU7RD1kR2aYtobx9CuscRDB9qSIZjYCKZJe4R1hag905poh6oaU5GSKrc35h5U=; Received: from bombadil.infradead.org ([198.137.202.133]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.94.2) id 1nd35Y-0001Bv-SE; Sat, 09 Apr 2022 04:52:46 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: Content-Type:MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc: To:From:Sender:Reply-To:Content-ID:Content-Description; bh=MR1dBREWEzr7uhm77WcgVZfNn+irLPCXxWfbv0Y8Fx8=; b=g1JrWZZU7gXqi54KSSq2td5NGg JTv8uprg5injPH7nKkeNRWdn6oTNLWZZnzaHqHhPeHQKztSOiA4sj9FfMAEZJ7/a9B/nIKLTwqwGB PuDRNI4dm2AH1PLgWy6G6WT6g3S55JW0fBof3tJZn4+4Uz4tLd0IKxpSOJszbSZ5S5fhGHf6HQiq8 tfOI2qhlZHSzdLNHIOgkox+DFYK8KmZY72c/I/6yjiFdBqWpjKEKpQemLV7RLvoqpLXmpYDnm9R+M 6+YRTeKl4k0OAcFvjw1Z1NHUh/0kBaNpv9L8pEjsBLMomqJ9Ip1F1RfoaNm2SYWGY95WZH5q/4P5S xDXG8m/A==; Received: from 213-147-167-116.nat.highway.webapn.at ([213.147.167.116] helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1nd35C-0021lf-95; Sat, 09 Apr 2022 04:52:23 +0000 From: Christoph Hellwig To: Jens Axboe Date: Sat, 9 Apr 2022 06:50:42 +0200 Message-Id: <20220409045043.23593-27-hch@lst.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220409045043.23593-1-hch@lst.de> References: <20220409045043.23593-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Headers-End: 1nd35Y-0001Bv-SE Subject: [f2fs-dev] [PATCH 26/27] block: decouple REQ_OP_SECURE_ERASE from REQ_OP_DISCARD X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: jfs-discussion@lists.sourceforge.net, linux-nvme@lists.infradead.org, virtualization@lists.linux-foundation.org, linux-mm@kvack.org, dm-devel@redhat.com, target-devel@vger.kernel.org, linux-mtd@lists.infradead.org, drbd-dev@lists.linbit.com, linux-s390@vger.kernel.org, linux-nilfs@vger.kernel.org, linux-scsi@vger.kernel.org, cluster-devel@redhat.com, xen-devel@lists.xenproject.org, linux-ext4@vger.kernel.org, linux-um@lists.infradead.org, nbd@other.debian.org, linux-block@vger.kernel.org, linux-bcache@vger.kernel.org, David Sterba , ceph-devel@vger.kernel.org, Coly Li , Ryusuke Konishi , linux-raid@vger.kernel.org, "Martin K . Petersen" , linux-mmc@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-xfs@vger.kernel.org, =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= , ocfs2-devel@oss.oracle.com, linux-fsdevel@vger.kernel.org, ntfs3@lists.linux.dev, linux-btrfs@vger.kernel.org Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net U2VjdXJlIGVyYXNlIGlzIGEgdmVyeSBkaWZmZXJlbnQgb3BlcmF0aW9uIGZyb20gZGlzY2FyZCBp biB0aGF0IGl0IGlzCmEgZGF0YSBpbnRlZ3JpdHkgb3BlcmF0aW9uIHZzIGhpbnQuICBGdWxseSBz cGxpdCB0aGUgbGltaXRzIGFuZCBoZWxwZXIKaW5mcmFzdHJ1Y3R1cmUgdG8gbWFrZSB0aGUgc2Vw YXJhdGlvbiBtb3JlIGNsZWFyLgoKU2lnbmVkLW9mZi1ieTogQ2hyaXN0b3BoIEhlbGx3aWcgPGhj aEBsc3QuZGU+ClJldmlld2VkLWJ5OiBNYXJ0aW4gSy4gUGV0ZXJzZW4gPG1hcnRpbi5wZXRlcnNl bkBvcmFjbGUuY29tPgpBY2tlZC1ieTogQ2hyaXN0b3BoIELDtmhtd2FsZGVyIDxjaHJpc3RvcGgu Ym9laG13YWxkZXJAbGluYml0LmNvbT4gW2RyYmRdCkFja2VkLWJ5OiBSeXVzdWtlIEtvbmlzaGkg PGtvbmlzaGkucnl1c3VrZUBnbWFpbC5jb20+IFtuaWZzMl0KQWNrZWQtYnk6IENvbHkgTGkgPGNv bHlsaUBzdXNlLmRlPiBbZHJiZF0KQWNrZWQtYnk6IERhdmlkIFN0ZXJiYSA8ZHN0ZXJiYUBzdXNl LmNvbT4gW2J0cmZzXQotLS0KIGJsb2NrL2Jsay1jb3JlLmMgICAgICAgICAgICAgICAgICAgIHwg IDIgKy0KIGJsb2NrL2Jsay1saWIuYyAgICAgICAgICAgICAgICAgICAgIHwgNjQgKysrKysrKysr KysrKysrKysrKystLS0tLS0tLS0KIGJsb2NrL2Jsay1tcS1kZWJ1Z2ZzLmMgICAgICAgICAgICAg IHwgIDEgLQogYmxvY2svYmxrLXNldHRpbmdzLmMgICAgICAgICAgICAgICAgfCAxNiArKysrKysr LQogYmxvY2svZm9wcy5jICAgICAgICAgICAgICAgICAgICAgICAgfCAgMiArLQogYmxvY2svaW9j dGwuYyAgICAgICAgICAgICAgICAgICAgICAgfCA0MyArKysrKysrKysrKysrKystLS0tCiBkcml2 ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5jICB8ICA1ICsrLQogZHJpdmVycy9ibG9jay9y bmJkL3JuYmQtY2x0LmMgICAgICAgfCAgNCArLQogZHJpdmVycy9ibG9jay9ybmJkL3JuYmQtc3J2 LWRldi5oICAgfCAgMiArLQogZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGtiYWNrLmMgfCAx NSArKystLS0tCiBkcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL3hlbmJ1cy5jICB8ICA1ICstLQog ZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYyAgICAgICAgfCAgNSArKy0KIGRyaXZlcnMvbWQv YmNhY2hlL2FsbG9jLmMgICAgICAgICAgIHwgIDIgKy0KIGRyaXZlcnMvbWQvZG0tdGFibGUuYyAg ICAgICAgICAgICAgIHwgIDggKystLQogZHJpdmVycy9tZC9kbS10aGluLmMgICAgICAgICAgICAg ICAgfCAgNCArLQogZHJpdmVycy9tZC9tZC5jICAgICAgICAgICAgICAgICAgICAgfCAgMiArLQog ZHJpdmVycy9tZC9yYWlkNS1jYWNoZS5jICAgICAgICAgICAgfCAgNiArLS0KIGRyaXZlcnMvbW1j L2NvcmUvcXVldWUuYyAgICAgICAgICAgIHwgIDIgKy0KIGRyaXZlcnMvbnZtZS90YXJnZXQvaW8t Y21kLWJkZXYuYyAgIHwgIDIgKy0KIGRyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYyAg IHwgIDIgKy0KIGRyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2libG9jay5jIHwgIDIgKy0KIGZz L2J0cmZzL2V4dGVudC10cmVlLmMgICAgICAgICAgICAgIHwgIDQgKy0KIGZzL2V4dDQvbWJhbGxv Yy5jICAgICAgICAgICAgICAgICAgIHwgIDIgKy0KIGZzL2YyZnMvZmlsZS5jICAgICAgICAgICAg ICAgICAgICAgIHwgMTYgKysrKy0tLS0KIGZzL2YyZnMvc2VnbWVudC5jICAgICAgICAgICAgICAg ICAgIHwgIDIgKy0KIGZzL2piZDIvam91cm5hbC5jICAgICAgICAgICAgICAgICAgIHwgIDIgKy0K IGZzL25pbGZzMi9zdWZpbGUuYyAgICAgICAgICAgICAgICAgIHwgIDQgKy0KIGZzL25pbGZzMi90 aGVfbmlsZnMuYyAgICAgICAgICAgICAgIHwgIDQgKy0KIGZzL250ZnMzL3N1cGVyLmMgICAgICAg ICAgICAgICAgICAgIHwgIDIgKy0KIGZzL3hmcy94ZnNfZGlzY2FyZC5jICAgICAgICAgICAgICAg IHwgIDIgKy0KIGZzL3hmcy94ZnNfbG9nX2NpbC5jICAgICAgICAgICAgICAgIHwgIDIgKy0KIGlu Y2x1ZGUvbGludXgvYmxrZGV2LmggICAgICAgICAgICAgIHwgMjcgKysrKysrKy0tLS0tCiBtbS9z d2FwZmlsZS5jICAgICAgICAgICAgICAgICAgICAgICB8ICA2ICstLQogMzMgZmlsZXMgY2hhbmdl ZCwgMTY4IGluc2VydGlvbnMoKyksIDk5IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2Jsb2Nr L2Jsay1jb3JlLmMgYi9ibG9jay9ibGstY29yZS5jCmluZGV4IGI1YzNhODA0OTEzNGMuLmVlMThi NmE2OTliZGYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jb3JlLmMKKysrIGIvYmxvY2svYmxrLWNv cmUuYwpAQCAtODI0LDcgKzgyNCw3IEBAIHZvaWQgc3VibWl0X2Jpb19ub2FjY3Qoc3RydWN0IGJp byAqYmlvKQogCQkJZ290byBub3Rfc3VwcG9ydGVkOwogCQlicmVhazsKIAljYXNlIFJFUV9PUF9T RUNVUkVfRVJBU0U6Ci0JCWlmICghYmxrX3F1ZXVlX3NlY3VyZV9lcmFzZShxKSkKKwkJaWYgKCFi ZGV2X21heF9zZWN1cmVfZXJhc2Vfc2VjdG9ycyhiZGV2KSkKIAkJCWdvdG8gbm90X3N1cHBvcnRl ZDsKIAkJYnJlYWs7CiAJY2FzZSBSRVFfT1BfWk9ORV9BUFBFTkQ6CmRpZmYgLS1naXQgYS9ibG9j ay9ibGstbGliLmMgYi9ibG9jay9ibGstbGliLmMKaW5kZXggNDNhYTRkN2ZlODU5Zi4uMDliN2Ux MjAwYzBmNCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWxpYi5jCisrKyBiL2Jsb2NrL2Jsay1saWIu YwpAQCAtMzYsMjYgKzM2LDE1IEBAIHN0YXRpYyBzZWN0b3JfdCBiaW9fZGlzY2FyZF9saW1pdChz dHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBzZWN0b3IpCiB9CiAKIGludCBfX2Js a2Rldl9pc3N1ZV9kaXNjYXJkKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNl Y3RvciwKLQkJc2VjdG9yX3QgbnJfc2VjdHMsIGdmcF90IGdmcF9tYXNrLCBpbnQgZmxhZ3MsCi0J CXN0cnVjdCBiaW8gKipiaW9wKQorCQlzZWN0b3JfdCBucl9zZWN0cywgZ2ZwX3QgZ2ZwX21hc2ss IHN0cnVjdCBiaW8gKipiaW9wKQogewotCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9n ZXRfcXVldWUoYmRldik7CiAJc3RydWN0IGJpbyAqYmlvID0gKmJpb3A7Ci0JdW5zaWduZWQgaW50 IG9wOwogCXNlY3Rvcl90IGJzX21hc2s7CiAKIAlpZiAoYmRldl9yZWFkX29ubHkoYmRldikpCiAJ CXJldHVybiAtRVBFUk07Ci0KLQlpZiAoZmxhZ3MgJiBCTEtERVZfRElTQ0FSRF9TRUNVUkUpIHsK LQkJaWYgKCFibGtfcXVldWVfc2VjdXJlX2VyYXNlKHEpKQotCQkJcmV0dXJuIC1FT1BOT1RTVVBQ OwotCQlvcCA9IFJFUV9PUF9TRUNVUkVfRVJBU0U7Ci0JfSBlbHNlIHsKLQkJaWYgKCFiZGV2X21h eF9kaXNjYXJkX3NlY3RvcnMoYmRldikpCi0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCW9wID0g UkVRX09QX0RJU0NBUkQ7Ci0JfQorCWlmICghYmRldl9tYXhfZGlzY2FyZF9zZWN0b3JzKGJkZXYp KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAkvKiBJbiBjYXNlIHRoZSBkaXNjYXJkIGdyYW51 bGFyaXR5IGlzbid0IHNldCBieSBidWdneSBkZXZpY2UgZHJpdmVyICovCiAJaWYgKFdBUk5fT05f T05DRSghYmRldl9kaXNjYXJkX2dyYW51bGFyaXR5KGJkZXYpKSkgewpAQCAtNzcsNyArNjYsNyBA QCBpbnQgX19ibGtkZXZfaXNzdWVfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBz ZWN0b3JfdCBzZWN0b3IsCiAJCXNlY3Rvcl90IHJlcV9zZWN0cyA9CiAJCQltaW4obnJfc2VjdHMs IGJpb19kaXNjYXJkX2xpbWl0KGJkZXYsIHNlY3RvcikpOwogCi0JCWJpbyA9IGJsa19uZXh0X2Jp byhiaW8sIGJkZXYsIDAsIG9wLCBnZnBfbWFzayk7CisJCWJpbyA9IGJsa19uZXh0X2JpbyhiaW8s IGJkZXYsIDAsIFJFUV9PUF9ESVNDQVJELCBnZnBfbWFzayk7CiAJCWJpby0+YmlfaXRlci5iaV9z ZWN0b3IgPSBzZWN0b3I7CiAJCWJpby0+YmlfaXRlci5iaV9zaXplID0gcmVxX3NlY3RzIDw8IDk7 CiAJCXNlY3RvciArPSByZXFfc2VjdHM7CkBAIC0xMDMsMjEgKzkyLDE5IEBAIEVYUE9SVF9TWU1C T0woX19ibGtkZXZfaXNzdWVfZGlzY2FyZCk7CiAgKiBAc2VjdG9yOglzdGFydCBzZWN0b3IKICAq IEBucl9zZWN0czoJbnVtYmVyIG9mIHNlY3RvcnMgdG8gZGlzY2FyZAogICogQGdmcF9tYXNrOglt ZW1vcnkgYWxsb2NhdGlvbiBmbGFncyAoZm9yIGJpb19hbGxvYykKLSAqIEBmbGFnczoJQkxLREVW X0RJU0NBUkRfKiBmbGFncyB0byBjb250cm9sIGJlaGF2aW91cgogICoKICAqIERlc2NyaXB0aW9u OgogICogICAgSXNzdWUgYSBkaXNjYXJkIHJlcXVlc3QgZm9yIHRoZSBzZWN0b3JzIGluIHF1ZXN0 aW9uLgogICovCiBpbnQgYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc3RydWN0IGJsb2NrX2RldmljZSAq YmRldiwgc2VjdG9yX3Qgc2VjdG9yLAotCQlzZWN0b3JfdCBucl9zZWN0cywgZ2ZwX3QgZ2ZwX21h c2ssIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJCXNlY3Rvcl90IG5yX3NlY3RzLCBnZnBfdCBnZnBf bWFzaykKIHsKIAlzdHJ1Y3QgYmlvICpiaW8gPSBOVUxMOwogCXN0cnVjdCBibGtfcGx1ZyBwbHVn OwogCWludCByZXQ7CiAKIAlibGtfc3RhcnRfcGx1ZygmcGx1Zyk7Ci0JcmV0ID0gX19ibGtkZXZf aXNzdWVfZGlzY2FyZChiZGV2LCBzZWN0b3IsIG5yX3NlY3RzLCBnZnBfbWFzaywgZmxhZ3MsCi0J CQkmYmlvKTsKKwlyZXQgPSBfX2Jsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHNlY3RvciwgbnJf c2VjdHMsIGdmcF9tYXNrLCAmYmlvKTsKIAlpZiAoIXJldCAmJiBiaW8pIHsKIAkJcmV0ID0gc3Vi bWl0X2Jpb193YWl0KGJpbyk7CiAJCWlmIChyZXQgPT0gLUVPUE5PVFNVUFApCkBAIC0zMTQsMyAr MzAxLDQyIEBAIGludCBibGtkZXZfaXNzdWVfemVyb291dChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpi ZGV2LCBzZWN0b3JfdCBzZWN0b3IsCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woYmxr ZGV2X2lzc3VlX3plcm9vdXQpOworCitpbnQgYmxrZGV2X2lzc3VlX3NlY3VyZV9lcmFzZShzdHJ1 Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBzZWN0b3IsCisJCXNlY3Rvcl90IG5yX3Nl Y3RzLCBnZnBfdCBnZnApCit7CisJc2VjdG9yX3QgYnNfbWFzayA9IChiZGV2X2xvZ2ljYWxfYmxv Y2tfc2l6ZShiZGV2KSA+PiA5KSAtIDE7CisJdW5zaWduZWQgaW50IG1heF9zZWN0b3JzID0gYmRl dl9tYXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMoYmRldik7CisJc3RydWN0IGJpbyAqYmlvID0gTlVM TDsKKwlzdHJ1Y3QgYmxrX3BsdWcgcGx1ZzsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChtYXhfc2Vj dG9ycyA9PSAwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKChzZWN0b3IgfCBucl9zZWN0 cykgJiBic19tYXNrKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYmRldl9yZWFkX29ubHkoYmRl dikpCisJCXJldHVybiAtRVBFUk07CisKKwlibGtfc3RhcnRfcGx1ZygmcGx1Zyk7CisJZm9yICg7 OykgeworCQl1bnNpZ25lZCBpbnQgbGVuID0gbWluX3Qoc2VjdG9yX3QsIG5yX3NlY3RzLCBtYXhf c2VjdG9ycyk7CisKKwkJYmlvID0gYmxrX25leHRfYmlvKGJpbywgYmRldiwgMCwgUkVRX09QX1NF Q1VSRV9FUkFTRSwgZ2ZwKTsKKwkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IHNlY3RvcjsKKwkJ YmlvLT5iaV9pdGVyLmJpX3NpemUgPSBsZW47CisKKwkJc2VjdG9yICs9IGxlbiA8PCBTRUNUT1Jf U0hJRlQ7CisJCW5yX3NlY3RzIC09IGxlbiA8PCBTRUNUT1JfU0hJRlQ7CisJCWlmICghbnJfc2Vj dHMpIHsKKwkJCXJldCA9IHN1Ym1pdF9iaW9fd2FpdChiaW8pOworCQkJYmlvX3B1dChiaW8pOwor CQkJYnJlYWs7CisJCX0KKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCWJsa19maW5pc2hfcGx1Zygm cGx1Zyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChibGtkZXZfaXNzdWVfc2Vj dXJlX2VyYXNlKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS1kZWJ1Z2ZzLmMgYi9ibG9jay9i bGstbXEtZGVidWdmcy5jCmluZGV4IGZkMTExYzUwMDEyNTYuLjdlNDEzNmE2MGUxY2MgMTAwNjQ0 Ci0tLSBhL2Jsb2NrL2Jsay1tcS1kZWJ1Z2ZzLmMKKysrIGIvYmxvY2svYmxrLW1xLWRlYnVnZnMu YwpAQCAtMTE1LDcgKzExNSw2IEBAIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBibGtfcXVldWVf ZmxhZ19uYW1lW10gPSB7CiAJUVVFVUVfRkxBR19OQU1FKElPX1NUQVQpLAogCVFVRVVFX0ZMQUdf TkFNRShOT1hNRVJHRVMpLAogCVFVRVVFX0ZMQUdfTkFNRShBRERfUkFORE9NKSwKLQlRVUVVRV9G TEFHX05BTUUoU0VDRVJBU0UpLAogCVFVRVVFX0ZMQUdfTkFNRShTQU1FX0ZPUkNFKSwKIAlRVUVV RV9GTEFHX05BTUUoREVBRCksCiAJUVVFVUVfRkxBR19OQU1FKElOSVRfRE9ORSksCmRpZmYgLS1n aXQgYS9ibG9jay9ibGstc2V0dGluZ3MuYyBiL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCmluZGV4IGZk ODNkNjc0YWZkMGEuLjZjY2NlYjQyMWVkMmYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1zZXR0aW5n cy5jCisrKyBiL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCkBAIC00Niw2ICs0Niw3IEBAIHZvaWQgYmxr X3NldF9kZWZhdWx0X2xpbWl0cyhzdHJ1Y3QgcXVldWVfbGltaXRzICpsaW0pCiAJbGltLT5tYXhf em9uZV9hcHBlbmRfc2VjdG9ycyA9IDA7CiAJbGltLT5tYXhfZGlzY2FyZF9zZWN0b3JzID0gMDsK IAlsaW0tPm1heF9od19kaXNjYXJkX3NlY3RvcnMgPSAwOworCWxpbS0+bWF4X3NlY3VyZV9lcmFz ZV9zZWN0b3JzID0gMDsKIAlsaW0tPmRpc2NhcmRfZ3JhbnVsYXJpdHkgPSAwOwogCWxpbS0+ZGlz Y2FyZF9hbGlnbm1lbnQgPSAwOwogCWxpbS0+ZGlzY2FyZF9taXNhbGlnbmVkID0gMDsKQEAgLTE3 Niw2ICsxNzcsMTggQEAgdm9pZCBibGtfcXVldWVfbWF4X2Rpc2NhcmRfc2VjdG9ycyhzdHJ1Y3Qg cmVxdWVzdF9xdWV1ZSAqcSwKIH0KIEVYUE9SVF9TWU1CT0woYmxrX3F1ZXVlX21heF9kaXNjYXJk X3NlY3RvcnMpOwogCisvKioKKyAqIGJsa19xdWV1ZV9tYXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMg LSBzZXQgbWF4IHNlY3RvcnMgZm9yIGEgc2VjdXJlIGVyYXNlCisgKiBAcTogIHRoZSByZXF1ZXN0 IHF1ZXVlIGZvciB0aGUgZGV2aWNlCisgKiBAbWF4X3NlY3RvcnM6IG1heGltdW0gbnVtYmVyIG9m IHNlY3RvcnMgdG8gc2VjdXJlX2VyYXNlCisgKiovCit2b2lkIGJsa19xdWV1ZV9tYXhfc2VjdXJl X2VyYXNlX3NlY3RvcnMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCXVuc2lnbmVkIGludCBt YXhfc2VjdG9ycykKK3sKKwlxLT5saW1pdHMubWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzID0gbWF4 X3NlY3RvcnM7Cit9CitFWFBPUlRfU1lNQk9MKGJsa19xdWV1ZV9tYXhfc2VjdXJlX2VyYXNlX3Nl Y3RvcnMpOworCiAvKioKICAqIGJsa19xdWV1ZV9tYXhfd3JpdGVfemVyb2VzX3NlY3RvcnMgLSBz ZXQgbWF4IHNlY3RvcnMgZm9yIGEgc2luZ2xlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgd3JpdGUgemVyb2VzCkBAIC02NjEsNyArNjc0LDggQEAgaW50IGJsa19zdGFj a19saW1pdHMoc3RydWN0IHF1ZXVlX2xpbWl0cyAqdCwgc3RydWN0IHF1ZXVlX2xpbWl0cyAqYiwK IAkJdC0+ZGlzY2FyZF9hbGlnbm1lbnQgPSBsY21fbm90X3plcm8odC0+ZGlzY2FyZF9hbGlnbm1l bnQsIGFsaWdubWVudCkgJQogCQkJdC0+ZGlzY2FyZF9ncmFudWxhcml0eTsKIAl9Ci0KKwl0LT5t YXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMgPSBtaW5fbm90X3plcm8odC0+bWF4X3NlY3VyZV9lcmFz ZV9zZWN0b3JzLAorCQkJCQkJICAgYi0+bWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzKTsKIAl0LT56 b25lX3dyaXRlX2dyYW51bGFyaXR5ID0gbWF4KHQtPnpvbmVfd3JpdGVfZ3JhbnVsYXJpdHksCiAJ CQkJCWItPnpvbmVfd3JpdGVfZ3JhbnVsYXJpdHkpOwogCXQtPnpvbmVkID0gbWF4KHQtPnpvbmVk LCBiLT56b25lZCk7CmRpZmYgLS1naXQgYS9ibG9jay9mb3BzLmMgYi9ibG9jay9mb3BzLmMKaW5k ZXggOWYyZWNlYzQwNmIwNC4uYzBjYTMyNTRkMzhjZiAxMDA2NDQKLS0tIGEvYmxvY2svZm9wcy5j CisrKyBiL2Jsb2NrL2ZvcHMuYwpAQCAtNjcyLDcgKzY3Miw3IEBAIHN0YXRpYyBsb25nIGJsa2Rl dl9mYWxsb2NhdGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCBtb2RlLCBsb2ZmX3Qgc3RhcnQsCiAJ CWJyZWFrOwogCWNhc2UgRkFMTE9DX0ZMX1BVTkNIX0hPTEUgfCBGQUxMT0NfRkxfS0VFUF9TSVpF IHwgRkFMTE9DX0ZMX05PX0hJREVfU1RBTEU6CiAJCWVycm9yID0gYmxrZGV2X2lzc3VlX2Rpc2Nh cmQoYmRldiwgc3RhcnQgPj4gU0VDVE9SX1NISUZULAotCQkJCQkgICAgIGxlbiA+PiBTRUNUT1Jf U0hJRlQsIEdGUF9LRVJORUwsIDApOworCQkJCQkgICAgIGxlbiA+PiBTRUNUT1JfU0hJRlQsIEdG UF9LRVJORUwpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQllcnJvciA9IC1FT1BOT1RTVVBQOwpk aWZmIC0tZ2l0IGEvYmxvY2svaW9jdGwuYyBiL2Jsb2NrL2lvY3RsLmMKaW5kZXggYzJjZDNiYTUy OTBjZS4uNWI1MDI3ZmE3OGY3ZSAxMDA2NDQKLS0tIGEvYmxvY2svaW9jdGwuYworKysgYi9ibG9j ay9pb2N0bC5jCkBAIC04Myw3ICs4Myw3IEBAIHN0YXRpYyBpbnQgY29tcGF0X2Jsa3BnX2lvY3Rs KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAjZW5kaWYKIAogc3RhdGljIGludCBibGtfaW9j dGxfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUsCi0JCXVu c2lnbmVkIGxvbmcgYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCQl1bnNpZ25lZCBsb25nIGFy ZykKIHsKIAl1aW50NjRfdCByYW5nZVsyXTsKIAl1aW50NjRfdCBzdGFydCwgbGVuOwpAQCAtMTE0 LDE1ICsxMTQsNDMgQEAgc3RhdGljIGludCBibGtfaW9jdGxfZGlzY2FyZChzdHJ1Y3QgYmxvY2tf ZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUsCiAJZXJyID0gdHJ1bmNhdGVfYmRldl9yYW5nZShi ZGV2LCBtb2RlLCBzdGFydCwgc3RhcnQgKyBsZW4gLSAxKTsKIAlpZiAoZXJyKQogCQlnb3RvIGZh aWw7Ci0KLQllcnIgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LCBzdGFydCA+PiA5LCBsZW4g Pj4gOSwKLQkJCQkgICBHRlBfS0VSTkVMLCBmbGFncyk7Ci0KKwllcnIgPSBibGtkZXZfaXNzdWVf ZGlzY2FyZChiZGV2LCBzdGFydCA+PiA5LCBsZW4gPj4gOSwgR0ZQX0tFUk5FTCk7CiBmYWlsOgog CWZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtPmlfbWFwcGluZyk7CiAJcmV0dXJuIGVy cjsKIH0KIAorc3RhdGljIGludCBibGtfaW9jdGxfc2VjdXJlX2VyYXNlKHN0cnVjdCBibG9ja19k ZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSwKKwkJdm9pZCBfX3VzZXIgKmFyZ3ApCit7CisJdWlu dDY0X3Qgc3RhcnQsIGxlbjsKKwl1aW50NjRfdCByYW5nZVsyXTsKKwlpbnQgZXJyOworCisJaWYg KCEobW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJcmV0dXJuIC1FQkFERjsKKwlpZiAoIWJkZXZfbWF4 X3NlY3VyZV9lcmFzZV9zZWN0b3JzKGJkZXYpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYg KGNvcHlfZnJvbV91c2VyKHJhbmdlLCBhcmdwLCBzaXplb2YocmFuZ2UpKSkKKwkJcmV0dXJuIC1F RkFVTFQ7CisKKwlzdGFydCA9IHJhbmdlWzBdOworCWxlbiA9IHJhbmdlWzFdOworCWlmICgoc3Rh cnQgJiA1MTEpIHx8IChsZW4gJiA1MTEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RhcnQg KyBsZW4gPiBiZGV2X25yX2J5dGVzKGJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZpbGVt YXBfaW52YWxpZGF0ZV9sb2NrKGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOworCWVyciA9IHRy dW5jYXRlX2JkZXZfcmFuZ2UoYmRldiwgbW9kZSwgc3RhcnQsIHN0YXJ0ICsgbGVuIC0gMSk7CisJ aWYgKCFlcnIpCisJCWVyciA9IGJsa2Rldl9pc3N1ZV9zZWN1cmVfZXJhc2UoYmRldiwgc3RhcnQg Pj4gOSwgbGVuID4+IDksCisJCQkJCQlHRlBfS0VSTkVMKTsKKwlmaWxlbWFwX2ludmFsaWRhdGVf dW5sb2NrKGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOworCXJldHVybiBlcnI7Cit9CisKKwog c3RhdGljIGludCBibGtfaW9jdGxfemVyb291dChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBm bW9kZV90IG1vZGUsCiAJCXVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtNDUwLDEwICs0NzgsOSBA QCBzdGF0aWMgaW50IGJsa2Rldl9jb21tb25faW9jdGwoc3RydWN0IGJsb2NrX2RldmljZSAqYmRl diwgZm1vZGVfdCBtb2RlLAogCWNhc2UgQkxLUk9TRVQ6CiAJCXJldHVybiBibGtkZXZfcm9zZXQo YmRldiwgbW9kZSwgY21kLCBhcmcpOwogCWNhc2UgQkxLRElTQ0FSRDoKLQkJcmV0dXJuIGJsa19p b2N0bF9kaXNjYXJkKGJkZXYsIG1vZGUsIGFyZywgMCk7CisJCXJldHVybiBibGtfaW9jdGxfZGlz Y2FyZChiZGV2LCBtb2RlLCBhcmcpOwogCWNhc2UgQkxLU0VDRElTQ0FSRDoKLQkJcmV0dXJuIGJs a19pb2N0bF9kaXNjYXJkKGJkZXYsIG1vZGUsIGFyZywKLQkJCQlCTEtERVZfRElTQ0FSRF9TRUNV UkUpOworCQlyZXR1cm4gYmxrX2lvY3RsX3NlY3VyZV9lcmFzZShiZGV2LCBtb2RlLCBhcmdwKTsK IAljYXNlIEJMS1pFUk9PVVQ6CiAJCXJldHVybiBibGtfaW9jdGxfemVyb291dChiZGV2LCBtb2Rl LCBhcmcpOwogCWNhc2UgQkxLR0VURElTS1NFUToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sv ZHJiZC9kcmJkX3JlY2VpdmVyLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5j CmluZGV4IDI3NWM1M2M3YjYyOWUuLjI5NTdiMGI2OGQ2MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMv YmxvY2svZHJiZC9kcmJkX3JlY2VpdmVyLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRf cmVjZWl2ZXIuYwpAQCAtMTU0Nyw3ICsxNTQ3LDggQEAgaW50IGRyYmRfaXNzdWVfZGlzY2FyZF9v cl96ZXJvX291dChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc3RhcnQsIHUK IAkJc3RhcnQgPSB0bXA7CiAJfQogCXdoaWxlIChucl9zZWN0b3JzID49IG1heF9kaXNjYXJkX3Nl Y3RvcnMpIHsKLQkJZXJyIHw9IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHN0YXJ0LCBtYXhf ZGlzY2FyZF9zZWN0b3JzLCBHRlBfTk9JTywgMCk7CisJCWVyciB8PSBibGtkZXZfaXNzdWVfZGlz Y2FyZChiZGV2LCBzdGFydCwgbWF4X2Rpc2NhcmRfc2VjdG9ycywKKwkJCQkJICAgIEdGUF9OT0lP KTsKIAkJbnJfc2VjdG9ycyAtPSBtYXhfZGlzY2FyZF9zZWN0b3JzOwogCQlzdGFydCArPSBtYXhf ZGlzY2FyZF9zZWN0b3JzOwogCX0KQEAgLTE1NTksNyArMTU2MCw3IEBAIGludCBkcmJkX2lzc3Vl X2Rpc2NhcmRfb3JfemVyb19vdXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90 IHN0YXJ0LCB1CiAJCW5yID0gbnJfc2VjdG9yczsKIAkJbnIgLT0gKHVuc2lnbmVkIGludCluciAl IGdyYW51bGFyaXR5OwogCQlpZiAobnIpIHsKLQkJCWVyciB8PSBibGtkZXZfaXNzdWVfZGlzY2Fy ZChiZGV2LCBzdGFydCwgbnIsIEdGUF9OT0lPLCAwKTsKKwkJCWVyciB8PSBibGtkZXZfaXNzdWVf ZGlzY2FyZChiZGV2LCBzdGFydCwgbnIsIEdGUF9OT0lPKTsKIAkJCW5yX3NlY3RvcnMgLT0gbnI7 CiAJCQlzdGFydCArPSBucjsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9ybmJkL3Ju YmQtY2x0LmMgYi9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1jbHQuYwppbmRleCBlZmE5OWEzODg0 NTA3Li5kMTc4YmUxNzVhZDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1j bHQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1jbHQuYwpAQCAtMTM2NSw4ICsxMzY1 LDggQEAgc3RhdGljIHZvaWQgc2V0dXBfcmVxdWVzdF9xdWV1ZShzdHJ1Y3Qgcm5iZF9jbHRfZGV2 ICpkZXYpCiAJZGV2LT5xdWV1ZS0+bGltaXRzLmRpc2NhcmRfZ3JhbnVsYXJpdHkJPSBkZXYtPmRp c2NhcmRfZ3JhbnVsYXJpdHk7CiAJZGV2LT5xdWV1ZS0+bGltaXRzLmRpc2NhcmRfYWxpZ25tZW50 CT0gZGV2LT5kaXNjYXJkX2FsaWdubWVudDsKIAlpZiAoZGV2LT5zZWN1cmVfZGlzY2FyZCkKLQkJ YmxrX3F1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfU0VDRVJBU0UsIGRldi0+cXVldWUpOwotCisJ CWJsa19xdWV1ZV9tYXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMoZGV2LT5xdWV1ZSwKKwkJCQlkZXYt Pm1heF9kaXNjYXJkX3NlY3RvcnMpOwogCWJsa19xdWV1ZV9mbGFnX3NldChRVUVVRV9GTEFHX1NB TUVfQ09NUCwgZGV2LT5xdWV1ZSk7CiAJYmxrX3F1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfU0FN RV9GT1JDRSwgZGV2LT5xdWV1ZSk7CiAJYmxrX3F1ZXVlX21heF9zZWdtZW50cyhkZXYtPnF1ZXVl LCBkZXYtPm1heF9zZWdtZW50cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5i ZC1zcnYtZGV2LmggYi9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1zcnYtZGV2LmgKaW5kZXggMWY3 ZTFjOGZkNGQ5Yi4uZDA4MGEwZGU1OTIyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9ybmJk L3JuYmQtc3J2LWRldi5oCisrKyBiL2RyaXZlcnMvYmxvY2svcm5iZC9ybmJkLXNydi1kZXYuaApA QCAtNDQsNyArNDQsNyBAQCBzdGF0aWMgaW5saW5lIGludCBybmJkX2Rldl9nZXRfbWF4X2h3X3Nl Y3RzKGNvbnN0IHN0cnVjdCBybmJkX2RldiAqZGV2KQogCiBzdGF0aWMgaW5saW5lIGludCBybmJk X2Rldl9nZXRfc2VjdXJlX2Rpc2NhcmQoY29uc3Qgc3RydWN0IHJuYmRfZGV2ICpkZXYpCiB7Ci0J cmV0dXJuIGJsa19xdWV1ZV9zZWN1cmVfZXJhc2UoYmRldl9nZXRfcXVldWUoZGV2LT5iZGV2KSk7 CisJcmV0dXJuIGJkZXZfbWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzKGRldi0+YmRldik7CiB9CiAK IHN0YXRpYyBpbmxpbmUgaW50IHJuYmRfZGV2X2dldF9tYXhfZGlzY2FyZF9zZWN0cyhjb25zdCBz dHJ1Y3Qgcm5iZF9kZXYgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Jh Y2svYmxrYmFjay5jIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGtiYWNrLmMKaW5kZXgg ZGU0MjQ1ODE5NWJjMS4uYTk3ZjJiZjViMDFiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay94 ZW4tYmxrYmFjay9ibGtiYWNrLmMKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGti YWNrLmMKQEAgLTk3MCw3ICs5NzAsNiBAQCBzdGF0aWMgaW50IGRpc3BhdGNoX2Rpc2NhcmRfaW8o c3RydWN0IHhlbl9ibGtpZl9yaW5nICpyaW5nLAogCWludCBzdGF0dXMgPSBCTEtJRl9SU1BfT0tB WTsKIAlzdHJ1Y3QgeGVuX2Jsa2lmICpibGtpZiA9IHJpbmctPmJsa2lmOwogCXN0cnVjdCBibG9j a19kZXZpY2UgKmJkZXYgPSBibGtpZi0+dmJkLmJkZXY7Ci0JdW5zaWduZWQgbG9uZyBzZWN1cmU7 CiAJc3RydWN0IHBoeXNfcmVxIHByZXE7CiAKIAl4ZW5fYmxraWZfZ2V0KGJsa2lmKTsKQEAgLTk4 NywxMyArOTg2LDE1IEBAIHN0YXRpYyBpbnQgZGlzcGF0Y2hfZGlzY2FyZF9pbyhzdHJ1Y3QgeGVu X2Jsa2lmX3JpbmcgKnJpbmcsCiAJfQogCXJpbmctPnN0X2RzX3JlcSsrOwogCi0Jc2VjdXJlID0g KGJsa2lmLT52YmQuZGlzY2FyZF9zZWN1cmUgJiYKLQkJIChyZXEtPnUuZGlzY2FyZC5mbGFnICYg QkxLSUZfRElTQ0FSRF9TRUNVUkUpKSA/Ci0JCSBCTEtERVZfRElTQ0FSRF9TRUNVUkUgOiAwOwor CWlmIChibGtpZi0+dmJkLmRpc2NhcmRfc2VjdXJlICYmCisJICAgIChyZXEtPnUuZGlzY2FyZC5m bGFnICYgQkxLSUZfRElTQ0FSRF9TRUNVUkUpKQorCQllcnIgPSBibGtkZXZfaXNzdWVfc2VjdXJl X2VyYXNlKGJkZXYsCisJCQkJcmVxLT51LmRpc2NhcmQuc2VjdG9yX251bWJlciwKKwkJCQlyZXEt PnUuZGlzY2FyZC5ucl9zZWN0b3JzLCBHRlBfS0VSTkVMKTsKKwllbHNlCisJCWVyciA9IGJsa2Rl dl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHJlcS0+dS5kaXNjYXJkLnNlY3Rvcl9udW1iZXIsCisJCQkJ cmVxLT51LmRpc2NhcmQubnJfc2VjdG9ycywgR0ZQX0tFUk5FTCk7CiAKLQllcnIgPSBibGtkZXZf aXNzdWVfZGlzY2FyZChiZGV2LCByZXEtPnUuZGlzY2FyZC5zZWN0b3JfbnVtYmVyLAotCQkJCSAg IHJlcS0+dS5kaXNjYXJkLm5yX3NlY3RvcnMsCi0JCQkJICAgR0ZQX0tFUk5FTCwgc2VjdXJlKTsK IGZhaWxfcmVzcG9uc2U6CiAJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkgewogCQlwcl9kZWJ1Zygi ZGlzY2FyZCBvcCBmYWlsZWQsIG5vdCBzdXBwb3J0ZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2sv eGVuYnVzLmMKaW5kZXggODNjZDA4MDQxZTZiMy4uYjIxYmZmYzljNTBiYyAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hl bi1ibGtiYWNrL3hlbmJ1cy5jCkBAIC00ODQsNyArNDg0LDYgQEAgc3RhdGljIGludCB4ZW5fdmJk X2NyZWF0ZShzdHJ1Y3QgeGVuX2Jsa2lmICpibGtpZiwgYmxraWZfdmRldl90IGhhbmRsZSwKIHsK IAlzdHJ1Y3QgeGVuX3ZiZCAqdmJkOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7Ci0Jc3Ry dWN0IHJlcXVlc3RfcXVldWUgKnE7CiAKIAl2YmQgPSAmYmxraWYtPnZiZDsKIAl2YmQtPmhhbmRs ZSAgID0gaGFuZGxlOwpAQCAtNTE2LDExICs1MTUsOSBAQCBzdGF0aWMgaW50IHhlbl92YmRfY3Jl YXRlKHN0cnVjdCB4ZW5fYmxraWYgKmJsa2lmLCBibGtpZl92ZGV2X3QgaGFuZGxlLAogCWlmICh2 YmQtPmJkZXYtPmJkX2Rpc2stPmZsYWdzICYgR0VOSERfRkxfUkVNT1ZBQkxFKQogCQl2YmQtPnR5 cGUgfD0gVkRJU0tfUkVNT1ZBQkxFOwogCi0JcSA9IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpOwogCWlm IChiZGV2X3dyaXRlX2NhY2hlKGJkZXYpKQogCQl2YmQtPmZsdXNoX3N1cHBvcnQgPSB0cnVlOwot Ci0JaWYgKHEgJiYgYmxrX3F1ZXVlX3NlY3VyZV9lcmFzZShxKSkKKwlpZiAoYmRldl9tYXhfc2Vj dXJlX2VyYXNlX3NlY3RvcnMoYmRldikpCiAJCXZiZC0+ZGlzY2FyZF9zZWN1cmUgPSB0cnVlOwog CiAJdmJkLT5mZWF0dXJlX2dudF9wZXJzaXN0ZW50ID0gZmVhdHVyZV9wZXJzaXN0ZW50OwpkaWZm IC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYyBiL2RyaXZlcnMvYmxvY2sveGVu LWJsa2Zyb250LmMKaW5kZXggMjUzYmY4MzVhY2ExZi4uOWZiN2M2OWY3MmIyZCAxMDA2NDQKLS0t IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hlbi1i bGtmcm9udC5jCkBAIC05NDksNyArOTQ5LDggQEAgc3RhdGljIHZvaWQgYmxraWZfc2V0X3F1ZXVl X2xpbWl0cyhzdHJ1Y3QgYmxrZnJvbnRfaW5mbyAqaW5mbykKIAkJCQkJCSBpbmZvLT5waHlzaWNh bF9zZWN0b3Jfc2l6ZTsKIAkJcnEtPmxpbWl0cy5kaXNjYXJkX2FsaWdubWVudCA9IGluZm8tPmRp c2NhcmRfYWxpZ25tZW50OwogCQlpZiAoaW5mby0+ZmVhdHVyZV9zZWNkaXNjYXJkKQotCQkJYmxr X3F1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfU0VDRVJBU0UsIHJxKTsKKwkJCWJsa19xdWV1ZV9t YXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMocnEsCisJCQkJCQkJICAgZ2V0X2NhcGFjaXR5KGdkKSk7 CiAJfQogCiAJLyogSGFyZCBzZWN0b3Igc2l6ZSBhbmQgbWF4IHNlY3RvcnMgaW1wZXJzb25hdGUg dGhlIGVxdWl2LiBoYXJkd2FyZS4gKi8KQEAgLTE2MDUsNyArMTYwNiw3IEBAIHN0YXRpYyBpcnFy ZXR1cm5fdCBibGtpZl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogCQkJCWJsa2lm X3JlcShyZXEpLT5lcnJvciA9IEJMS19TVFNfTk9UU1VQUDsKIAkJCQlpbmZvLT5mZWF0dXJlX2Rp c2NhcmQgPSAwOwogCQkJCWluZm8tPmZlYXR1cmVfc2VjZGlzY2FyZCA9IDA7Ci0JCQkJYmxrX3F1 ZXVlX2ZsYWdfY2xlYXIoUVVFVUVfRkxBR19TRUNFUkFTRSwgcnEpOworCQkJCWJsa19xdWV1ZV9t YXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMocnEsIDApOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2Ug QkxLSUZfT1BfRkxVU0hfRElTS0NBQ0hFOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUv YWxsb2MuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL2FsbG9jLmMKaW5kZXggMDk3NTc3YWUzYzQ3MS4u Y2UxM2MyNzJjMzg3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvYWxsb2MuYworKysg Yi9kcml2ZXJzL21kL2JjYWNoZS9hbGxvYy5jCkBAIC0zMzYsNyArMzM2LDcgQEAgc3RhdGljIGlu dCBiY2hfYWxsb2NhdG9yX3RocmVhZCh2b2lkICphcmcpCiAJCQkJbXV0ZXhfdW5sb2NrKCZjYS0+ c2V0LT5idWNrZXRfbG9jayk7CiAJCQkJYmxrZGV2X2lzc3VlX2Rpc2NhcmQoY2EtPmJkZXYsCiAJ CQkJCWJ1Y2tldF90b19zZWN0b3IoY2EtPnNldCwgYnVja2V0KSwKLQkJCQkJY2EtPnNiLmJ1Y2tl dF9zaXplLCBHRlBfS0VSTkVMLCAwKTsKKwkJCQkJY2EtPnNiLmJ1Y2tldF9zaXplLCBHRlBfS0VS TkVMKTsKIAkJCQltdXRleF9sb2NrKCZjYS0+c2V0LT5idWNrZXRfbG9jayk7CiAJCQl9CiAKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYyBiL2RyaXZlcnMvbWQvZG0tdGFibGUuYwpp bmRleCAwZGZmNjkwN2ZkMDBkLi5lN2Q0MmY2MzM1YTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21k L2RtLXRhYmxlLmMKKysrIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCkBAIC0xOTIwLDkgKzE5MjAs NyBAQCBzdGF0aWMgaW50IGRldmljZV9ub3Rfc2VjdXJlX2VyYXNlX2NhcGFibGUoc3RydWN0IGRt X3RhcmdldCAqdGksCiAJCQkJCSAgIHN0cnVjdCBkbV9kZXYgKmRldiwgc2VjdG9yX3Qgc3RhcnQs CiAJCQkJCSAgIHNlY3Rvcl90IGxlbiwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgcmVxdWVzdF9x dWV1ZSAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGRldi0+YmRldik7Ci0KLQlyZXR1cm4gIWJsa19xdWV1 ZV9zZWN1cmVfZXJhc2UocSk7CisJcmV0dXJuICFiZGV2X21heF9zZWN1cmVfZXJhc2Vfc2VjdG9y cyhkZXYtPmJkZXYpOwogfQogCiBzdGF0aWMgYm9vbCBkbV90YWJsZV9zdXBwb3J0c19zZWN1cmVf ZXJhc2Uoc3RydWN0IGRtX3RhYmxlICp0KQpAQCAtMTk3NSw4ICsxOTczLDggQEAgaW50IGRtX3Rh YmxlX3NldF9yZXN0cmljdGlvbnMoc3RydWN0IGRtX3RhYmxlICp0LCBzdHJ1Y3QgcmVxdWVzdF9x dWV1ZSAqcSwKIAkJcS0+bGltaXRzLmRpc2NhcmRfbWlzYWxpZ25lZCA9IDA7CiAJfQogCi0JaWYg KGRtX3RhYmxlX3N1cHBvcnRzX3NlY3VyZV9lcmFzZSh0KSkKLQkJYmxrX3F1ZXVlX2ZsYWdfc2V0 KFFVRVVFX0ZMQUdfU0VDRVJBU0UsIHEpOworCWlmICghZG1fdGFibGVfc3VwcG9ydHNfc2VjdXJl X2VyYXNlKHQpKQorCQlxLT5saW1pdHMubWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzID0gMDsKIAog CWlmIChkbV90YWJsZV9zdXBwb3J0c19mbHVzaCh0LCAoMVVMIDw8IFFVRVVFX0ZMQUdfV0MpKSkg ewogCQl3YyA9IHRydWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXRoaW4uYyBiL2RyaXZl cnMvbWQvZG0tdGhpbi5jCmluZGV4IGVkZWQ0YmNjNDU0NWYuLjg0YzA4M2Y3NjY3MzYgMTAwNjQ0 Ci0tLSBhL2RyaXZlcnMvbWQvZG0tdGhpbi5jCisrKyBiL2RyaXZlcnMvbWQvZG0tdGhpbi5jCkBA IC0zOTgsOCArMzk4LDggQEAgc3RhdGljIGludCBpc3N1ZV9kaXNjYXJkKHN0cnVjdCBkaXNjYXJk X29wICpvcCwgZG1fYmxvY2tfdCBkYXRhX2IsIGRtX2Jsb2NrX3QgZGEKIAlzZWN0b3JfdCBzID0g YmxvY2tfdG9fc2VjdG9ycyh0Yy0+cG9vbCwgZGF0YV9iKTsKIAlzZWN0b3JfdCBsZW4gPSBibG9j a190b19zZWN0b3JzKHRjLT5wb29sLCBkYXRhX2UgLSBkYXRhX2IpOwogCi0JcmV0dXJuIF9fYmxr ZGV2X2lzc3VlX2Rpc2NhcmQodGMtPnBvb2xfZGV2LT5iZGV2LCBzLCBsZW4sCi0JCQkJICAgICAg R0ZQX05PV0FJVCwgMCwgJm9wLT5iaW8pOworCXJldHVybiBfX2Jsa2Rldl9pc3N1ZV9kaXNjYXJk KHRjLT5wb29sX2Rldi0+YmRldiwgcywgbGVuLCBHRlBfTk9XQUlULAorCQkJCSAgICAgICZvcC0+ YmlvKTsKIH0KIAogc3RhdGljIHZvaWQgZW5kX2Rpc2NhcmQoc3RydWN0IGRpc2NhcmRfb3AgKm9w LCBpbnQgcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwpp bmRleCAxOTYzNmMyZjJjZGE0Li4yNTg3Zjg3MmMwODg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21k L21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC04NTg0LDcgKzg1ODQsNyBAQCB2b2lkIG1k X3N1Ym1pdF9kaXNjYXJkX2JpbyhzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgbWRfcmRldiAq cmRldiwKIHsKIAlzdHJ1Y3QgYmlvICpkaXNjYXJkX2JpbyA9IE5VTEw7CiAKLQlpZiAoX19ibGtk ZXZfaXNzdWVfZGlzY2FyZChyZGV2LT5iZGV2LCBzdGFydCwgc2l6ZSwgR0ZQX05PSU8sIDAsCisJ aWYgKF9fYmxrZGV2X2lzc3VlX2Rpc2NhcmQocmRldi0+YmRldiwgc3RhcnQsIHNpemUsIEdGUF9O T0lPLAogCQkJJmRpc2NhcmRfYmlvKSB8fCAhZGlzY2FyZF9iaW8pCiAJCXJldHVybjsKIApkaWZm IC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNS1jYWNoZS5jIGIvZHJpdmVycy9tZC9yYWlkNS1jYWNo ZS5jCmluZGV4IGMzY2JmOWE1NzRhMzkuLjA5NGE0MDQyNTg5ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZl cnMvbWQvcmFpZDUtY2FjaGUuYworKysgYi9kcml2ZXJzL21kL3JhaWQ1LWNhY2hlLmMKQEAgLTEz NDQsMTQgKzEzNDQsMTQgQEAgc3RhdGljIHZvaWQgcjVsX3dyaXRlX3N1cGVyX2FuZF9kaXNjYXJk X3NwYWNlKHN0cnVjdCByNWxfbG9nICpsb2csCiAJaWYgKGxvZy0+bGFzdF9jaGVja3BvaW50IDwg ZW5kKSB7CiAJCWJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsCiAJCQkJbG9nLT5sYXN0X2NoZWNr cG9pbnQgKyBsb2ctPnJkZXYtPmRhdGFfb2Zmc2V0LAotCQkJCWVuZCAtIGxvZy0+bGFzdF9jaGVj a3BvaW50LCBHRlBfTk9JTywgMCk7CisJCQkJZW5kIC0gbG9nLT5sYXN0X2NoZWNrcG9pbnQsIEdG UF9OT0lPKTsKIAl9IGVsc2UgewogCQlibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LAogCQkJCWxv Zy0+bGFzdF9jaGVja3BvaW50ICsgbG9nLT5yZGV2LT5kYXRhX29mZnNldCwKIAkJCQlsb2ctPmRl dmljZV9zaXplIC0gbG9nLT5sYXN0X2NoZWNrcG9pbnQsCi0JCQkJR0ZQX05PSU8sIDApOworCQkJ CUdGUF9OT0lPKTsKIAkJYmxrZGV2X2lzc3VlX2Rpc2NhcmQoYmRldiwgbG9nLT5yZGV2LT5kYXRh X29mZnNldCwgZW5kLAotCQkJCUdGUF9OT0lPLCAwKTsKKwkJCQlHRlBfTk9JTyk7CiAJfQogfQog CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3F1ZXVlLmMgYi9kcml2ZXJzL21tYy9jb3Jl L3F1ZXVlLmMKaW5kZXggY2FjNjMxNTAxMGEzZC4uYTNkNDQ2MDA1NTcxNiAxMDA2NDQKLS0tIGEv ZHJpdmVycy9tbWMvY29yZS9xdWV1ZS5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvcXVldWUuYwpA QCAtMTg5LDcgKzE4OSw3IEBAIHN0YXRpYyB2b2lkIG1tY19xdWV1ZV9zZXR1cF9kaXNjYXJkKHN0 cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAogCWlmIChjYXJkLT5wcmVmX2VyYXNlID4gbWF4X2Rpc2Nh cmQpCiAJCXEtPmxpbWl0cy5kaXNjYXJkX2dyYW51bGFyaXR5ID0gU0VDVE9SX1NJWkU7CiAJaWYg KG1tY19jYW5fc2VjdXJlX2VyYXNlX3RyaW0oY2FyZCkpCi0JCWJsa19xdWV1ZV9mbGFnX3NldChR VUVVRV9GTEFHX1NFQ0VSQVNFLCBxKTsKKwkJYmxrX3F1ZXVlX21heF9zZWN1cmVfZXJhc2Vfc2Vj dG9ycyhxLCBtYXhfZGlzY2FyZCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBtbWNfZ2V0 X21heF9zZWdtZW50cyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCmRpZmYgLS1naXQgYS9kcml2ZXJz L252bWUvdGFyZ2V0L2lvLWNtZC1iZGV2LmMgYi9kcml2ZXJzL252bWUvdGFyZ2V0L2lvLWNtZC1i ZGV2LmMKaW5kZXggZDg4NmMyYzU5NTU0Zi4uMjdhNzI1MDRkMzFjZSAxMDA2NDQKLS0tIGEvZHJp dmVycy9udm1lL3RhcmdldC9pby1jbWQtYmRldi5jCisrKyBiL2RyaXZlcnMvbnZtZS90YXJnZXQv aW8tY21kLWJkZXYuYwpAQCAtMzYwLDcgKzM2MCw3IEBAIHN0YXRpYyB1MTYgbnZtZXRfYmRldl9k aXNjYXJkX3JhbmdlKHN0cnVjdCBudm1ldF9yZXEgKnJlcSwKIAlyZXQgPSBfX2Jsa2Rldl9pc3N1 ZV9kaXNjYXJkKG5zLT5iZGV2LAogCQkJbnZtZXRfbGJhX3RvX3NlY3QobnMsIHJhbmdlLT5zbGJh KSwKIAkJCWxlMzJfdG9fY3B1KHJhbmdlLT5ubGIpIDw8IChucy0+Ymxrc2l6ZV9zaGlmdCAtIDkp LAotCQkJR0ZQX0tFUk5FTCwgMCwgYmlvKTsKKwkJCUdGUF9LRVJORUwsIGJpbyk7CiAJaWYgKHJl dCAmJiByZXQgIT0gLUVPUE5PVFNVUFApIHsKIAkJcmVxLT5lcnJvcl9zbGJhID0gbGU2NF90b19j cHUocmFuZ2UtPnNsYmEpOwogCQlyZXR1cm4gZXJybm9fdG9fbnZtZV9zdGF0dXMocmVxLCByZXQp OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5jIGIvZHJpdmVy cy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5jCmluZGV4IGI2YmE1ODJiMDY3NzUuLmU2OGYxY2M4 ZWY5OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYworKysg Yi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9maWxlLmMKQEAgLTU1OCw3ICs1NTgsNyBAQCBm ZF9leGVjdXRlX3VubWFwKHN0cnVjdCBzZV9jbWQgKmNtZCwgc2VjdG9yX3QgbGJhLCBzZWN0b3Jf dCBub2xiKQogCQlyZXQgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LAogCQkJCQkgICB0YXJn ZXRfdG9fbGludXhfc2VjdG9yKGRldiwgbGJhKSwKIAkJCQkJICAgdGFyZ2V0X3RvX2xpbnV4X3Nl Y3RvcihkZXYsICBub2xiKSwKLQkJCQkJICAgR0ZQX0tFUk5FTCwgMCk7CisJCQkJCSAgIEdGUF9L RVJORUwpOwogCQlpZiAocmV0IDwgMCkgewogCQkJcHJfd2FybigiRklMRUlPOiBibGtkZXZfaXNz dWVfZGlzY2FyZCgpIGZhaWxlZDogJWRcbiIsCiAJCQkJcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZl cnMvdGFyZ2V0L3RhcmdldF9jb3JlX2libG9jay5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2Nv cmVfaWJsb2NrLmMKaW5kZXggYzRhOTAzYjhhNDdmYy4uMzc4YzgwMzEzYTBmMiAxMDA2NDQKLS0t IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKKysrIGIvZHJpdmVycy90YXJn ZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKQEAgLTQzNCw3ICs0MzQsNyBAQCBpYmxvY2tfZXhlY3V0 ZV91bm1hcChzdHJ1Y3Qgc2VfY21kICpjbWQsIHNlY3Rvcl90IGxiYSwgc2VjdG9yX3Qgbm9sYikK IAlyZXQgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LAogCQkJCSAgIHRhcmdldF90b19saW51 eF9zZWN0b3IoZGV2LCBsYmEpLAogCQkJCSAgIHRhcmdldF90b19saW51eF9zZWN0b3IoZGV2LCAg bm9sYiksCi0JCQkJICAgR0ZQX0tFUk5FTCwgMCk7CisJCQkJICAgR0ZQX0tFUk5FTCk7CiAJaWYg KHJldCA8IDApIHsKIAkJcHJfZXJyKCJibGtkZXZfaXNzdWVfZGlzY2FyZCgpIGZhaWxlZDogJWRc biIsIHJldCk7CiAJCXJldHVybiBUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVS RTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMgYi9mcy9idHJmcy9leHRlbnQt dHJlZS5jCmluZGV4IGVmZDhkZWIzYWI3ZTguLjVjMWQzYTU2NGRhNWEgMTAwNjQ0Ci0tLSBhL2Zz L2J0cmZzL2V4dGVudC10cmVlLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYwpAQCAtMTIz OSw3ICsxMjM5LDcgQEAgc3RhdGljIGludCBidHJmc19pc3N1ZV9kaXNjYXJkKHN0cnVjdCBibG9j a19kZXZpY2UgKmJkZXYsIHU2NCBzdGFydCwgdTY0IGxlbiwKIAogCQlpZiAoc2l6ZSkgewogCQkJ cmV0ID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQoYmRldiwgc3RhcnQgPj4gOSwgc2l6ZSA+PiA5LAot CQkJCQkJICAgR0ZQX05PRlMsIDApOworCQkJCQkJICAgR0ZQX05PRlMpOwogCQkJaWYgKCFyZXQp CiAJCQkJKmRpc2NhcmRlZF9ieXRlcyArPSBzaXplOwogCQkJZWxzZSBpZiAocmV0ICE9IC1FT1BO T1RTVVBQKQpAQCAtMTI1Niw3ICsxMjU2LDcgQEAgc3RhdGljIGludCBidHJmc19pc3N1ZV9kaXNj YXJkKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHU2NCBzdGFydCwgdTY0IGxlbiwKIAogCWlm IChieXRlc19sZWZ0KSB7CiAJCXJldCA9IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHN0YXJ0 ID4+IDksIGJ5dGVzX2xlZnQgPj4gOSwKLQkJCQkJICAgR0ZQX05PRlMsIDApOworCQkJCQkgICBH RlBfTk9GUyk7CiAJCWlmICghcmV0KQogCQkJKmRpc2NhcmRlZF9ieXRlcyArPSBieXRlc19sZWZ0 OwogCX0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWJhbGxvYy5jIGIvZnMvZXh0NC9tYmFsbG9jLmMK aW5kZXggNmQxODIwNTM2ZDg4ZC4uZWE2NTNkMTlmOWVjNyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9t YmFsbG9jLmMKKysrIGIvZnMvZXh0NC9tYmFsbG9jLmMKQEAgLTM2MjksNyArMzYyOSw3IEBAIHN0 YXRpYyBpbmxpbmUgaW50IGV4dDRfaXNzdWVfZGlzY2FyZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNi LAogCQlyZXR1cm4gX19ibGtkZXZfaXNzdWVfZGlzY2FyZChzYi0+c19iZGV2LAogCQkJKHNlY3Rv cl90KWRpc2NhcmRfYmxvY2sgPDwgKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSksCiAJCQkoc2Vj dG9yX3QpY291bnQgPDwgKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSksCi0JCQlHRlBfTk9GUywg MCwgYmlvcCk7CisJCQlHRlBfTk9GUywgYmlvcCk7CiAJfSBlbHNlCiAJCXJldHVybiBzYl9pc3N1 ZV9kaXNjYXJkKHNiLCBkaXNjYXJkX2Jsb2NrLCBjb3VudCwgR0ZQX05PRlMsIDApOwogfQpkaWZm IC0tZ2l0IGEvZnMvZjJmcy9maWxlLmMgYi9mcy9mMmZzL2ZpbGUuYwppbmRleCA4MDUzZDk5ZjM5 MjBiLi4zNWI2YzcyMGMyYmMxIDEwMDY0NAotLS0gYS9mcy9mMmZzL2ZpbGUuYworKysgYi9mcy9m MmZzL2ZpbGUuYwpAQCAtMzY4NSwxOCArMzY4NSwxOCBAQCBzdGF0aWMgaW50IGYyZnNfcmVzZXJ2 ZV9jb21wcmVzc19ibG9ja3Moc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGxvbmcgYXJnKQog c3RhdGljIGludCBmMmZzX3NlY3VyZV9lcmFzZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBz dHJ1Y3QgaW5vZGUgKmlub2RlLAogCQlwZ29mZl90IG9mZiwgYmxvY2tfdCBibG9jaywgYmxvY2tf dCBsZW4sIHUzMiBmbGFncykKIHsKLQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkZXZfZ2V0 X3F1ZXVlKGJkZXYpOwogCXNlY3Rvcl90IHNlY3RvciA9IFNFQ1RPUl9GUk9NX0JMT0NLKGJsb2Nr KTsKIAlzZWN0b3JfdCBucl9zZWN0cyA9IFNFQ1RPUl9GUk9NX0JMT0NLKGxlbik7CiAJaW50IHJl dCA9IDA7CiAKLQlpZiAoIXEpCi0JCXJldHVybiAtRU5YSU87Ci0KLQlpZiAoZmxhZ3MgJiBGMkZT X1RSSU1fRklMRV9ESVNDQVJEKQotCQlyZXQgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LCBz ZWN0b3IsIG5yX3NlY3RzLCBHRlBfTk9GUywKLQkJCQkJCWJsa19xdWV1ZV9zZWN1cmVfZXJhc2Uo cSkgPwotCQkJCQkJQkxLREVWX0RJU0NBUkRfU0VDVVJFIDogMCk7CisJaWYgKGZsYWdzICYgRjJG U19UUklNX0ZJTEVfRElTQ0FSRCkgeworCQlpZiAoYmRldl9tYXhfc2VjdXJlX2VyYXNlX3NlY3Rv cnMoYmRldikpCisJCQlyZXQgPSBibGtkZXZfaXNzdWVfc2VjdXJlX2VyYXNlKGJkZXYsIHNlY3Rv ciwgbnJfc2VjdHMsCisJCQkJCUdGUF9OT0ZTKTsKKwkJZWxzZQorCQkJcmV0ID0gYmxrZGV2X2lz c3VlX2Rpc2NhcmQoYmRldiwgc2VjdG9yLCBucl9zZWN0cywKKwkJCQkJR0ZQX05PRlMpOworCX0K IAogCWlmICghcmV0ICYmIChmbGFncyAmIEYyRlNfVFJJTV9GSUxFX1pFUk9PVVQpKSB7CiAJCWlm IChJU19FTkNSWVBURUQoaW5vZGUpKQpkaWZmIC0tZ2l0IGEvZnMvZjJmcy9zZWdtZW50LmMgYi9m cy9mMmZzL3NlZ21lbnQuYwppbmRleCA3MWYwOWFkYmNiYTg2Li5lNDMzYzYxZTY0YjkzIDEwMDY0 NAotLS0gYS9mcy9mMmZzL3NlZ21lbnQuYworKysgYi9mcy9mMmZzL3NlZ21lbnQuYwpAQCAtMTI0 NCw3ICsxMjQ0LDcgQEAgc3RhdGljIGludCBfX3N1Ym1pdF9kaXNjYXJkX2NtZChzdHJ1Y3QgZjJm c19zYl9pbmZvICpzYmksCiAJCWVyciA9IF9fYmxrZGV2X2lzc3VlX2Rpc2NhcmQoYmRldiwKIAkJ CQkJU0VDVE9SX0ZST01fQkxPQ0soc3RhcnQpLAogCQkJCQlTRUNUT1JfRlJPTV9CTE9DSyhsZW4p LAotCQkJCQlHRlBfTk9GUywgMCwgJmJpbyk7CisJCQkJCUdGUF9OT0ZTLCAmYmlvKTsKIHN1Ym1p dDoKIAkJaWYgKGVycikgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRjLT5sb2NrLCBmbGFncyk7 CmRpZmYgLS1naXQgYS9mcy9qYmQyL2pvdXJuYWwuYyBiL2ZzL2piZDIvam91cm5hbC5jCmluZGV4 IDE5ZDIyNmNkNGZmNGQuLmMwY2JlZWFlYzJkMWEgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvam91cm5h bC5jCisrKyBiL2ZzL2piZDIvam91cm5hbC5jCkBAIC0xODI1LDcgKzE4MjUsNyBAQCBzdGF0aWMg aW50IF9famJkMl9qb3VybmFsX2VyYXNlKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgaW50 IGZsYWdzKQogCQkJZXJyID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQoam91cm5hbC0+al9kZXYsCiAJ CQkJCWJ5dGVfc3RhcnQgPj4gU0VDVE9SX1NISUZULAogCQkJCQlieXRlX2NvdW50ID4+IFNFQ1RP Ul9TSElGVCwKLQkJCQkJR0ZQX05PRlMsIDApOworCQkJCQlHRlBfTk9GUyk7CiAJCX0gZWxzZSBp ZiAoZmxhZ3MgJiBKQkQyX0pPVVJOQUxfRkxVU0hfWkVST09VVCkgewogCQkJZXJyID0gYmxrZGV2 X2lzc3VlX3plcm9vdXQoam91cm5hbC0+al9kZXYsCiAJCQkJCWJ5dGVfc3RhcnQgPj4gU0VDVE9S X1NISUZULApkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3N1ZmlsZS5jIGIvZnMvbmlsZnMyL3N1Zmls ZS5jCmluZGV4IGUzODVjY2EyMDA0YTcuLjc3ZmY4ZTk1NDIxZmEgMTAwNjQ0Ci0tLSBhL2ZzL25p bGZzMi9zdWZpbGUuYworKysgYi9mcy9uaWxmczIvc3VmaWxlLmMKQEAgLTExMDAsNyArMTEwMCw3 IEBAIGludCBuaWxmc19zdWZpbGVfdHJpbV9mcyhzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSwgc3RydWN0 IGZzdHJpbV9yYW5nZSAqcmFuZ2UpCiAJCQkJcmV0ID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQobmls ZnMtPm5zX2JkZXYsCiAJCQkJCQlzdGFydCAqIHNlY3RzX3Blcl9ibG9jaywKIAkJCQkJCW5ibG9j a3MgKiBzZWN0c19wZXJfYmxvY2ssCi0JCQkJCQlHRlBfTk9GUywgMCk7CisJCQkJCQlHRlBfTk9G Uyk7CiAJCQkJaWYgKHJldCA8IDApIHsKIAkJCQkJcHV0X2JoKHN1X2JoKTsKIAkJCQkJZ290byBv dXRfc2VtOwpAQCAtMTEzNCw3ICsxMTM0LDcgQEAgaW50IG5pbGZzX3N1ZmlsZV90cmltX2ZzKHN0 cnVjdCBpbm9kZSAqc3VmaWxlLCBzdHJ1Y3QgZnN0cmltX3JhbmdlICpyYW5nZSkKIAkJCXJldCA9 IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKG5pbGZzLT5uc19iZGV2LAogCQkJCQlzdGFydCAqIHNlY3Rz X3Blcl9ibG9jaywKIAkJCQkJbmJsb2NrcyAqIHNlY3RzX3Blcl9ibG9jaywKLQkJCQkJR0ZQX05P RlMsIDApOworCQkJCQlHRlBfTk9GUyk7CiAJCQlpZiAoIXJldCkKIAkJCQluZGlzY2FyZGVkICs9 IG5ibG9ja3M7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi90aGVfbmlsZnMuYyBiL2ZzL25p bGZzMi90aGVfbmlsZnMuYwppbmRleCBkZDQ4YThmNzRkNTc3Li4zYjRhMDc5Yzk2MTdjIDEwMDY0 NAotLS0gYS9mcy9uaWxmczIvdGhlX25pbGZzLmMKKysrIGIvZnMvbmlsZnMyL3RoZV9uaWxmcy5j CkBAIC02NzIsNyArNjcyLDcgQEAgaW50IG5pbGZzX2Rpc2NhcmRfc2VnbWVudHMoc3RydWN0IHRo ZV9uaWxmcyAqbmlsZnMsIF9fdTY0ICpzZWdudW1wLAogCQkJcmV0ID0gYmxrZGV2X2lzc3VlX2Rp c2NhcmQobmlsZnMtPm5zX2JkZXYsCiAJCQkJCQkgICBzdGFydCAqIHNlY3RzX3Blcl9ibG9jaywK IAkJCQkJCSAgIG5ibG9ja3MgKiBzZWN0c19wZXJfYmxvY2ssCi0JCQkJCQkgICBHRlBfTk9GUywg MCk7CisJCQkJCQkgICBHRlBfTk9GUyk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlyZXR1cm4gcmV0 OwogCQkJbmJsb2NrcyA9IDA7CkBAIC02ODIsNyArNjgyLDcgQEAgaW50IG5pbGZzX2Rpc2NhcmRf c2VnbWVudHMoc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMsIF9fdTY0ICpzZWdudW1wLAogCQlyZXQg PSBibGtkZXZfaXNzdWVfZGlzY2FyZChuaWxmcy0+bnNfYmRldiwKIAkJCQkJICAgc3RhcnQgKiBz ZWN0c19wZXJfYmxvY2ssCiAJCQkJCSAgIG5ibG9ja3MgKiBzZWN0c19wZXJfYmxvY2ssCi0JCQkJ CSAgIEdGUF9OT0ZTLCAwKTsKKwkJCQkJICAgR0ZQX05PRlMpOwogCXJldHVybiByZXQ7CiB9CiAK ZGlmZiAtLWdpdCBhL2ZzL250ZnMzL3N1cGVyLmMgYi9mcy9udGZzMy9zdXBlci5jCmluZGV4IDVm MmU0MTRjZmE3OWIuLjU3ODFiOWU4ZTNkODUgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMzL3N1cGVyLmMK KysrIGIvZnMvbnRmczMvc3VwZXIuYwpAQCAtMTMzMyw3ICsxMzMzLDcgQEAgaW50IG50ZnNfZGlz Y2FyZChzdHJ1Y3QgbnRmc19zYl9pbmZvICpzYmksIENMU1QgbGNuLCBDTFNUIGxlbikKIAkJcmV0 dXJuIDA7CiAKIAllcnIgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChzYi0+c19iZGV2LCBzdGFydCA+ PiA5LCAoZW5kIC0gc3RhcnQpID4+IDksCi0JCQkJICAgR0ZQX05PRlMsIDApOworCQkJCSAgIEdG UF9OT0ZTKTsKIAogCWlmIChlcnIgPT0gLUVPUE5PVFNVUFApCiAJCXNiaS0+ZmxhZ3MgfD0gTlRG U19GTEFHU19OT0RJU0NBUkQ7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rpc2NhcmQuYyBiL2Zz L3hmcy94ZnNfZGlzY2FyZC5jCmluZGV4IGUyYWRhMTE1YzIzZjkuLmM2ZmUzZjZlYmI2YjAgMTAw NjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlzY2FyZC5jCisrKyBiL2ZzL3hmcy94ZnNfZGlzY2FyZC5j CkBAIC0xMTQsNyArMTE0LDcgQEAgeGZzX3RyaW1fZXh0ZW50cygKIAkJfQogCiAJCXRyYWNlX3hm c19kaXNjYXJkX2V4dGVudChtcCwgYWdubywgZmJubywgZmxlbik7Ci0JCWVycm9yID0gYmxrZGV2 X2lzc3VlX2Rpc2NhcmQoYmRldiwgZGJubywgZGxlbiwgR0ZQX05PRlMsIDApOworCQllcnJvciA9 IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIGRibm8sIGRsZW4sIEdGUF9OT0ZTKTsKIAkJaWYg KGVycm9yKQogCQkJZ290byBvdXRfZGVsX2N1cnNvcjsKIAkJKmJsb2Nrc190cmltbWVkICs9IGZs ZW47CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZ19jaWwuYyBiL2ZzL3hmcy94ZnNfbG9nX2Np bC5jCmluZGV4IGJhNTczMjNiZmRjZWEuLmM5ZjU1ZTRmMDk1NzEgMTAwNjQ0Ci0tLSBhL2ZzL3hm cy94ZnNfbG9nX2NpbC5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nX2NpbC5jCkBAIC02MDUsNyArNjA1 LDcgQEAgeGxvZ19kaXNjYXJkX2J1c3lfZXh0ZW50cygKIAkJZXJyb3IgPSBfX2Jsa2Rldl9pc3N1 ZV9kaXNjYXJkKG1wLT5tX2RkZXZfdGFyZ3AtPmJ0X2JkZXYsCiAJCQkJWEZTX0FHQl9UT19EQURE UihtcCwgYnVzeXAtPmFnbm8sIGJ1c3lwLT5ibm8pLAogCQkJCVhGU19GU0JfVE9fQkIobXAsIGJ1 c3lwLT5sZW5ndGgpLAotCQkJCUdGUF9OT0ZTLCAwLCAmYmlvKTsKKwkJCQlHRlBfTk9GUywgJmJp byk7CiAJCWlmIChlcnJvciAmJiBlcnJvciAhPSAtRU9QTk9UU1VQUCkgewogCQkJeGZzX2luZm8o bXAsCiAJICJkaXNjYXJkIGZhaWxlZCBmb3IgZXh0ZW50IFsweCVsbHgsJXVdLCBlcnJvciAlZCIs CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtk ZXYuaAppbmRleCBmMWNmNTU3ZWEyMGVmLi5jOWI1OTI1YWY1YTNiIDEwMDY0NAotLS0gYS9pbmNs dWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTI0OCw2 ICsyNDgsNyBAQCBzdHJ1Y3QgcXVldWVfbGltaXRzIHsKIAl1bnNpZ25lZCBpbnQJCWlvX29wdDsK IAl1bnNpZ25lZCBpbnQJCW1heF9kaXNjYXJkX3NlY3RvcnM7CiAJdW5zaWduZWQgaW50CQltYXhf aHdfZGlzY2FyZF9zZWN0b3JzOworCXVuc2lnbmVkIGludAkJbWF4X3NlY3VyZV9lcmFzZV9zZWN0 b3JzOwogCXVuc2lnbmVkIGludAkJbWF4X3dyaXRlX3plcm9lc19zZWN0b3JzOwogCXVuc2lnbmVk IGludAkJbWF4X3pvbmVfYXBwZW5kX3NlY3RvcnM7CiAJdW5zaWduZWQgaW50CQlkaXNjYXJkX2dy YW51bGFyaXR5OwpAQCAtNTQyLDcgKzU0Myw2IEBAIHN0cnVjdCByZXF1ZXN0X3F1ZXVlIHsKICNk ZWZpbmUgUVVFVUVfRkxBR19JT19TVEFUCTcJLyogZG8gZGlzay9wYXJ0aXRpb25zIElPIGFjY291 bnRpbmcgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19OT1hNRVJHRVMJOQkvKiBObyBleHRlbmRlZCBt ZXJnZXMgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19BRERfUkFORE9NCTEwCS8qIENvbnRyaWJ1dGVz IHRvIHJhbmRvbSBwb29sICovCi0jZGVmaW5lIFFVRVVFX0ZMQUdfU0VDRVJBU0UJMTEJLyogc3Vw cG9ydHMgc2VjdXJlIGVyYXNlICovCiAjZGVmaW5lIFFVRVVFX0ZMQUdfU0FNRV9GT1JDRQkxMgkv KiBmb3JjZSBjb21wbGV0ZSBvbiBzYW1lIENQVSAqLwogI2RlZmluZSBRVUVVRV9GTEFHX0RFQUQJ CTEzCS8qIHF1ZXVlIHRlYXItZG93biBmaW5pc2hlZCAqLwogI2RlZmluZSBRVUVVRV9GTEFHX0lO SVRfRE9ORQkxNAkvKiBxdWV1ZSBpcyBpbml0aWFsaXplZCAqLwpAQCAtNTgzLDggKzU4Myw2IEBA IGJvb2wgYmxrX3F1ZXVlX2ZsYWdfdGVzdF9hbmRfc2V0KHVuc2lnbmVkIGludCBmbGFnLCBzdHJ1 Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CiAjZGVmaW5lIGJsa19xdWV1ZV9hZGRfcmFuZG9tKHEpCXRl c3RfYml0KFFVRVVFX0ZMQUdfQUREX1JBTkRPTSwgJihxKS0+cXVldWVfZmxhZ3MpCiAjZGVmaW5l IGJsa19xdWV1ZV96b25lX3Jlc2V0YWxsKHEpCVwKIAl0ZXN0X2JpdChRVUVVRV9GTEFHX1pPTkVf UkVTRVRBTEwsICYocSktPnF1ZXVlX2ZsYWdzKQotI2RlZmluZSBibGtfcXVldWVfc2VjdXJlX2Vy YXNlKHEpIFwKLQkodGVzdF9iaXQoUVVFVUVfRkxBR19TRUNFUkFTRSwgJihxKS0+cXVldWVfZmxh Z3MpKQogI2RlZmluZSBibGtfcXVldWVfZGF4KHEpCXRlc3RfYml0KFFVRVVFX0ZMQUdfREFYLCAm KHEpLT5xdWV1ZV9mbGFncykKICNkZWZpbmUgYmxrX3F1ZXVlX3BjaV9wMnBkbWEocSkJXAogCXRl c3RfYml0KFFVRVVFX0ZMQUdfUENJX1AyUERNQSwgJihxKS0+cXVldWVfZmxhZ3MpCkBAIC05NDcs NiArOTQ1LDggQEAgZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2NodW5rX3NlY3RvcnMoc3RydWN0IHJl cXVlc3RfcXVldWUgKiwgdW5zaWduZWQgaW50KTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9tYXhf c2VnbWVudHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgc2hvcnQpOwogZXh0ZXJu IHZvaWQgYmxrX3F1ZXVlX21heF9kaXNjYXJkX3NlZ21lbnRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVl ICosCiAJCXVuc2lnbmVkIHNob3J0KTsKK3ZvaWQgYmxrX3F1ZXVlX21heF9zZWN1cmVfZXJhc2Vf c2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJdW5zaWduZWQgaW50IG1heF9zZWN0 b3JzKTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9tYXhfc2VnbWVudF9zaXplKHN0cnVjdCByZXF1 ZXN0X3F1ZXVlICosIHVuc2lnbmVkIGludCk7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfbWF4X2Rp c2NhcmRfc2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKIAkJdW5zaWduZWQgaW50IG1h eF9kaXNjYXJkX3NlY3RvcnMpOwpAQCAtMTA4NywxMyArMTA4NywxMiBAQCBzdGF0aWMgaW5saW5l IGxvbmcgbnJfYmxvY2tkZXZfcGFnZXModm9pZCkKIAogZXh0ZXJuIHZvaWQgYmxrX2lvX3NjaGVk dWxlKHZvaWQpOwogCi0jZGVmaW5lIEJMS0RFVl9ESVNDQVJEX1NFQ1VSRQkoMSA8PCAwKQkvKiBp c3N1ZSBhIHNlY3VyZSBlcmFzZSAqLwotCi1leHRlcm4gaW50IGJsa2Rldl9pc3N1ZV9kaXNjYXJk KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwKLQkJc2VjdG9yX3Qg bnJfc2VjdHMsIGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiBp bnQgX19ibGtkZXZfaXNzdWVfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0 b3JfdCBzZWN0b3IsCi0JCXNlY3Rvcl90IG5yX3NlY3RzLCBnZnBfdCBnZnBfbWFzaywgaW50IGZs YWdzLAotCQlzdHJ1Y3QgYmlvICoqYmlvcCk7CitpbnQgYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc3Ry dWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3Qgc2VjdG9yLAorCQlzZWN0b3JfdCBucl9z ZWN0cywgZ2ZwX3QgZ2ZwX21hc2spOworaW50IF9fYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc3RydWN0 IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3Qgc2VjdG9yLAorCQlzZWN0b3JfdCBucl9zZWN0 cywgZ2ZwX3QgZ2ZwX21hc2ssIHN0cnVjdCBiaW8gKipiaW9wKTsKK2ludCBibGtkZXZfaXNzdWVf c2VjdXJlX2VyYXNlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwK KwkJc2VjdG9yX3QgbnJfc2VjdHMsIGdmcF90IGdmcCk7CiAKICNkZWZpbmUgQkxLREVWX1pFUk9f Tk9VTk1BUAkoMSA8PCAwKSAgLyogZG8gbm90IGZyZWUgYmxvY2tzICovCiAjZGVmaW5lIEJMS0RF Vl9aRVJPX05PRkFMTEJBQ0sJKDEgPDwgMSkgIC8qIGRvbid0IHdyaXRlIGV4cGxpY2l0IHplcm9l cyAqLwpAQCAtMTExMiw3ICsxMTExLDcgQEAgc3RhdGljIGlubGluZSBpbnQgc2JfaXNzdWVfZGlz Y2FyZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzZWN0b3JfdCBibG9jaywKIAkJCQkJICAgICAg U0VDVE9SX1NISUZUKSwKIAkJCQkgICAgbnJfYmxvY2tzIDw8IChzYi0+c19ibG9ja3NpemVfYml0 cyAtCiAJCQkJCQkgIFNFQ1RPUl9TSElGVCksCi0JCQkJICAgIGdmcF9tYXNrLCBmbGFncyk7CisJ CQkJICAgIGdmcF9tYXNrKTsKIH0KIHN0YXRpYyBpbmxpbmUgaW50IHNiX2lzc3VlX3plcm9vdXQo c3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc2VjdG9yX3QgYmxvY2ssCiAJCXNlY3Rvcl90IG5yX2Js b2NrcywgZ2ZwX3QgZ2ZwX21hc2spCkBAIC0xMjYyLDYgKzEyNjEsMTIgQEAgc3RhdGljIGlubGlu ZSB1bnNpZ25lZCBpbnQgYmRldl9kaXNjYXJkX2dyYW51bGFyaXR5KHN0cnVjdCBibG9ja19kZXZp Y2UgKmJkZXYpCiAJcmV0dXJuIGJkZXZfZ2V0X3F1ZXVlKGJkZXYpLT5saW1pdHMuZGlzY2FyZF9n cmFudWxhcml0eTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2JkZXZfbWF4X3Nl Y3VyZV9lcmFzZV9zZWN0b3JzKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJcmV0dXJu IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpLT5saW1pdHMubWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzOwor fQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBiZGV2X3dyaXRlX3plcm9lc19zZWN0b3Jz KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCiB7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEg PSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9z d2FwZmlsZS5jCmluZGV4IDVkOWNlZGY5ZTdiODQuLmEyYjMxZmVhMGM0MmUgMTAwNjQ0Ci0tLSBh L21tL3N3YXBmaWxlLmMKKysrIGIvbW0vc3dhcGZpbGUuYwpAQCAtMTc5LDcgKzE3OSw3IEBAIHN0 YXRpYyBpbnQgZGlzY2FyZF9zd2FwKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKIAlucl9i bG9ja3MgPSAoKHNlY3Rvcl90KXNlLT5ucl9wYWdlcyAtIDEpIDw8IChQQUdFX1NISUZUIC0gOSk7 CiAJaWYgKG5yX2Jsb2NrcykgewogCQllcnIgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChzaS0+YmRl diwgc3RhcnRfYmxvY2ssCi0JCQkJbnJfYmxvY2tzLCBHRlBfS0VSTkVMLCAwKTsKKwkJCQlucl9i bG9ja3MsIEdGUF9LRVJORUwpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAkJY29uZF9y ZXNjaGVkKCk7CkBAIC0xOTAsNyArMTkwLDcgQEAgc3RhdGljIGludCBkaXNjYXJkX3N3YXAoc3Ry dWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQogCQlucl9ibG9ja3MgPSAoc2VjdG9yX3Qpc2UtPm5y X3BhZ2VzIDw8IChQQUdFX1NISUZUIC0gOSk7CiAKIAkJZXJyID0gYmxrZGV2X2lzc3VlX2Rpc2Nh cmQoc2ktPmJkZXYsIHN0YXJ0X2Jsb2NrLAotCQkJCW5yX2Jsb2NrcywgR0ZQX0tFUk5FTCwgMCk7 CisJCQkJbnJfYmxvY2tzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGVycikKIAkJCWJyZWFrOwogCkBA IC0yNTQsNyArMjU0LDcgQEAgc3RhdGljIHZvaWQgZGlzY2FyZF9zd2FwX2NsdXN0ZXIoc3RydWN0 IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCQlzdGFydF9ibG9jayA8PD0gUEFHRV9TSElGVCAtIDk7 CiAJCW5yX2Jsb2NrcyA8PD0gUEFHRV9TSElGVCAtIDk7CiAJCWlmIChibGtkZXZfaXNzdWVfZGlz Y2FyZChzaS0+YmRldiwgc3RhcnRfYmxvY2ssCi0JCQkJCW5yX2Jsb2NrcywgR0ZQX05PSU8sIDAp KQorCQkJCQlucl9ibG9ja3MsIEdGUF9OT0lPKSkKIAkJCWJyZWFrOwogCiAJCXNlID0gbmV4dF9z ZShzZSk7Ci0tIAoyLjMwLjIKCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX18KTGludXgtZjJmcy1kZXZlbCBtYWlsaW5nIGxpc3QKTGludXgtZjJmcy1kZXZl bEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQKaHR0cHM6Ly9saXN0cy5zb3VyY2Vmb3JnZS5uZXQvbGlz dHMvbGlzdGluZm8vbGludXgtZjJmcy1kZXZlbAo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 77A70C433EF for ; Sat, 9 Apr 2022 04:52:45 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id 233E38459F; Sat, 9 Apr 2022 04:52:45 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id hzg6DVk80iub; Sat, 9 Apr 2022 04:52:42 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp1.osuosl.org (Postfix) with ESMTPS id 26AEB84733; Sat, 9 Apr 2022 04:52:42 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 7BC14C008A; Sat, 9 Apr 2022 04:52:41 +0000 (UTC) Received: from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id 503EEC002C for ; Sat, 9 Apr 2022 04:52:40 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 3C58841116 for ; Sat, 9 Apr 2022 04:52:40 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Authentication-Results: smtp2.osuosl.org (amavisd-new); dkim=pass (2048-bit key) header.d=infradead.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id YGt0PS6USpiR for ; Sat, 9 Apr 2022 04:52:38 +0000 (UTC) X-Greylist: from auto-whitelisted by SQLgrey-1.8.0 Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) by smtp2.osuosl.org (Postfix) with ESMTPS id 51B58411B5 for ; Sat, 9 Apr 2022 04:52:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Transfer-Encoding: Content-Type:MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc: To:From:Sender:Reply-To:Content-ID:Content-Description; bh=MR1dBREWEzr7uhm77WcgVZfNn+irLPCXxWfbv0Y8Fx8=; b=g1JrWZZU7gXqi54KSSq2td5NGg JTv8uprg5injPH7nKkeNRWdn6oTNLWZZnzaHqHhPeHQKztSOiA4sj9FfMAEZJ7/a9B/nIKLTwqwGB PuDRNI4dm2AH1PLgWy6G6WT6g3S55JW0fBof3tJZn4+4Uz4tLd0IKxpSOJszbSZ5S5fhGHf6HQiq8 tfOI2qhlZHSzdLNHIOgkox+DFYK8KmZY72c/I/6yjiFdBqWpjKEKpQemLV7RLvoqpLXmpYDnm9R+M 6+YRTeKl4k0OAcFvjw1Z1NHUh/0kBaNpv9L8pEjsBLMomqJ9Ip1F1RfoaNm2SYWGY95WZH5q/4P5S xDXG8m/A==; Received: from 213-147-167-116.nat.highway.webapn.at ([213.147.167.116] helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1nd35C-0021lf-95; Sat, 09 Apr 2022 04:52:23 +0000 From: Christoph Hellwig To: Jens Axboe Subject: [PATCH 26/27] block: decouple REQ_OP_SECURE_ERASE from REQ_OP_DISCARD Date: Sat, 9 Apr 2022 06:50:42 +0200 Message-Id: <20220409045043.23593-27-hch@lst.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220409045043.23593-1-hch@lst.de> References: <20220409045043.23593-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Cc: jfs-discussion@lists.sourceforge.net, linux-nvme@lists.infradead.org, virtualization@lists.linux-foundation.org, linux-mm@kvack.org, dm-devel@redhat.com, target-devel@vger.kernel.org, linux-mtd@lists.infradead.org, drbd-dev@lists.linbit.com, linux-s390@vger.kernel.org, linux-nilfs@vger.kernel.org, linux-scsi@vger.kernel.org, cluster-devel@redhat.com, xen-devel@lists.xenproject.org, linux-ext4@vger.kernel.org, linux-um@lists.infradead.org, nbd@other.debian.org, linux-block@vger.kernel.org, linux-bcache@vger.kernel.org, David Sterba , ceph-devel@vger.kernel.org, Coly Li , Ryusuke Konishi , linux-raid@vger.kernel.org, "Martin K . Petersen" , linux-mmc@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-xfs@vger.kernel.org, =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= , ocfs2-devel@oss.oracle.com, linux-fsdevel@vger.kernel.org, ntfs3@lists.linux.dev, linux-btrfs@vger.kernel.org X-BeenThere: virtualization@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Linux virtualization List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: virtualization-bounces@lists.linux-foundation.org Sender: "Virtualization" U2VjdXJlIGVyYXNlIGlzIGEgdmVyeSBkaWZmZXJlbnQgb3BlcmF0aW9uIGZyb20gZGlzY2FyZCBp biB0aGF0IGl0IGlzCmEgZGF0YSBpbnRlZ3JpdHkgb3BlcmF0aW9uIHZzIGhpbnQuICBGdWxseSBz cGxpdCB0aGUgbGltaXRzIGFuZCBoZWxwZXIKaW5mcmFzdHJ1Y3R1cmUgdG8gbWFrZSB0aGUgc2Vw YXJhdGlvbiBtb3JlIGNsZWFyLgoKU2lnbmVkLW9mZi1ieTogQ2hyaXN0b3BoIEhlbGx3aWcgPGhj aEBsc3QuZGU+ClJldmlld2VkLWJ5OiBNYXJ0aW4gSy4gUGV0ZXJzZW4gPG1hcnRpbi5wZXRlcnNl bkBvcmFjbGUuY29tPgpBY2tlZC1ieTogQ2hyaXN0b3BoIELDtmhtd2FsZGVyIDxjaHJpc3RvcGgu Ym9laG13YWxkZXJAbGluYml0LmNvbT4gW2RyYmRdCkFja2VkLWJ5OiBSeXVzdWtlIEtvbmlzaGkg PGtvbmlzaGkucnl1c3VrZUBnbWFpbC5jb20+IFtuaWZzMl0KQWNrZWQtYnk6IENvbHkgTGkgPGNv bHlsaUBzdXNlLmRlPiBbZHJiZF0KQWNrZWQtYnk6IERhdmlkIFN0ZXJiYSA8ZHN0ZXJiYUBzdXNl LmNvbT4gW2J0cmZzXQotLS0KIGJsb2NrL2Jsay1jb3JlLmMgICAgICAgICAgICAgICAgICAgIHwg IDIgKy0KIGJsb2NrL2Jsay1saWIuYyAgICAgICAgICAgICAgICAgICAgIHwgNjQgKysrKysrKysr KysrKysrKysrKystLS0tLS0tLS0KIGJsb2NrL2Jsay1tcS1kZWJ1Z2ZzLmMgICAgICAgICAgICAg IHwgIDEgLQogYmxvY2svYmxrLXNldHRpbmdzLmMgICAgICAgICAgICAgICAgfCAxNiArKysrKysr LQogYmxvY2svZm9wcy5jICAgICAgICAgICAgICAgICAgICAgICAgfCAgMiArLQogYmxvY2svaW9j dGwuYyAgICAgICAgICAgICAgICAgICAgICAgfCA0MyArKysrKysrKysrKysrKystLS0tCiBkcml2 ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5jICB8ICA1ICsrLQogZHJpdmVycy9ibG9jay9y bmJkL3JuYmQtY2x0LmMgICAgICAgfCAgNCArLQogZHJpdmVycy9ibG9jay9ybmJkL3JuYmQtc3J2 LWRldi5oICAgfCAgMiArLQogZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGtiYWNrLmMgfCAx NSArKystLS0tCiBkcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL3hlbmJ1cy5jICB8ICA1ICstLQog ZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYyAgICAgICAgfCAgNSArKy0KIGRyaXZlcnMvbWQv YmNhY2hlL2FsbG9jLmMgICAgICAgICAgIHwgIDIgKy0KIGRyaXZlcnMvbWQvZG0tdGFibGUuYyAg ICAgICAgICAgICAgIHwgIDggKystLQogZHJpdmVycy9tZC9kbS10aGluLmMgICAgICAgICAgICAg ICAgfCAgNCArLQogZHJpdmVycy9tZC9tZC5jICAgICAgICAgICAgICAgICAgICAgfCAgMiArLQog ZHJpdmVycy9tZC9yYWlkNS1jYWNoZS5jICAgICAgICAgICAgfCAgNiArLS0KIGRyaXZlcnMvbW1j L2NvcmUvcXVldWUuYyAgICAgICAgICAgIHwgIDIgKy0KIGRyaXZlcnMvbnZtZS90YXJnZXQvaW8t Y21kLWJkZXYuYyAgIHwgIDIgKy0KIGRyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYyAg IHwgIDIgKy0KIGRyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2libG9jay5jIHwgIDIgKy0KIGZz L2J0cmZzL2V4dGVudC10cmVlLmMgICAgICAgICAgICAgIHwgIDQgKy0KIGZzL2V4dDQvbWJhbGxv Yy5jICAgICAgICAgICAgICAgICAgIHwgIDIgKy0KIGZzL2YyZnMvZmlsZS5jICAgICAgICAgICAg ICAgICAgICAgIHwgMTYgKysrKy0tLS0KIGZzL2YyZnMvc2VnbWVudC5jICAgICAgICAgICAgICAg ICAgIHwgIDIgKy0KIGZzL2piZDIvam91cm5hbC5jICAgICAgICAgICAgICAgICAgIHwgIDIgKy0K IGZzL25pbGZzMi9zdWZpbGUuYyAgICAgICAgICAgICAgICAgIHwgIDQgKy0KIGZzL25pbGZzMi90 aGVfbmlsZnMuYyAgICAgICAgICAgICAgIHwgIDQgKy0KIGZzL250ZnMzL3N1cGVyLmMgICAgICAg ICAgICAgICAgICAgIHwgIDIgKy0KIGZzL3hmcy94ZnNfZGlzY2FyZC5jICAgICAgICAgICAgICAg IHwgIDIgKy0KIGZzL3hmcy94ZnNfbG9nX2NpbC5jICAgICAgICAgICAgICAgIHwgIDIgKy0KIGlu Y2x1ZGUvbGludXgvYmxrZGV2LmggICAgICAgICAgICAgIHwgMjcgKysrKysrKy0tLS0tCiBtbS9z d2FwZmlsZS5jICAgICAgICAgICAgICAgICAgICAgICB8ICA2ICstLQogMzMgZmlsZXMgY2hhbmdl ZCwgMTY4IGluc2VydGlvbnMoKyksIDk5IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2Jsb2Nr L2Jsay1jb3JlLmMgYi9ibG9jay9ibGstY29yZS5jCmluZGV4IGI1YzNhODA0OTEzNGMuLmVlMThi NmE2OTliZGYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jb3JlLmMKKysrIGIvYmxvY2svYmxrLWNv cmUuYwpAQCAtODI0LDcgKzgyNCw3IEBAIHZvaWQgc3VibWl0X2Jpb19ub2FjY3Qoc3RydWN0IGJp byAqYmlvKQogCQkJZ290byBub3Rfc3VwcG9ydGVkOwogCQlicmVhazsKIAljYXNlIFJFUV9PUF9T RUNVUkVfRVJBU0U6Ci0JCWlmICghYmxrX3F1ZXVlX3NlY3VyZV9lcmFzZShxKSkKKwkJaWYgKCFi ZGV2X21heF9zZWN1cmVfZXJhc2Vfc2VjdG9ycyhiZGV2KSkKIAkJCWdvdG8gbm90X3N1cHBvcnRl ZDsKIAkJYnJlYWs7CiAJY2FzZSBSRVFfT1BfWk9ORV9BUFBFTkQ6CmRpZmYgLS1naXQgYS9ibG9j ay9ibGstbGliLmMgYi9ibG9jay9ibGstbGliLmMKaW5kZXggNDNhYTRkN2ZlODU5Zi4uMDliN2Ux MjAwYzBmNCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWxpYi5jCisrKyBiL2Jsb2NrL2Jsay1saWIu YwpAQCAtMzYsMjYgKzM2LDE1IEBAIHN0YXRpYyBzZWN0b3JfdCBiaW9fZGlzY2FyZF9saW1pdChz dHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBzZWN0b3IpCiB9CiAKIGludCBfX2Js a2Rldl9pc3N1ZV9kaXNjYXJkKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNl Y3RvciwKLQkJc2VjdG9yX3QgbnJfc2VjdHMsIGdmcF90IGdmcF9tYXNrLCBpbnQgZmxhZ3MsCi0J CXN0cnVjdCBiaW8gKipiaW9wKQorCQlzZWN0b3JfdCBucl9zZWN0cywgZ2ZwX3QgZ2ZwX21hc2ss IHN0cnVjdCBiaW8gKipiaW9wKQogewotCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9n ZXRfcXVldWUoYmRldik7CiAJc3RydWN0IGJpbyAqYmlvID0gKmJpb3A7Ci0JdW5zaWduZWQgaW50 IG9wOwogCXNlY3Rvcl90IGJzX21hc2s7CiAKIAlpZiAoYmRldl9yZWFkX29ubHkoYmRldikpCiAJ CXJldHVybiAtRVBFUk07Ci0KLQlpZiAoZmxhZ3MgJiBCTEtERVZfRElTQ0FSRF9TRUNVUkUpIHsK LQkJaWYgKCFibGtfcXVldWVfc2VjdXJlX2VyYXNlKHEpKQotCQkJcmV0dXJuIC1FT1BOT1RTVVBQ OwotCQlvcCA9IFJFUV9PUF9TRUNVUkVfRVJBU0U7Ci0JfSBlbHNlIHsKLQkJaWYgKCFiZGV2X21h eF9kaXNjYXJkX3NlY3RvcnMoYmRldikpCi0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCW9wID0g UkVRX09QX0RJU0NBUkQ7Ci0JfQorCWlmICghYmRldl9tYXhfZGlzY2FyZF9zZWN0b3JzKGJkZXYp KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAkvKiBJbiBjYXNlIHRoZSBkaXNjYXJkIGdyYW51 bGFyaXR5IGlzbid0IHNldCBieSBidWdneSBkZXZpY2UgZHJpdmVyICovCiAJaWYgKFdBUk5fT05f T05DRSghYmRldl9kaXNjYXJkX2dyYW51bGFyaXR5KGJkZXYpKSkgewpAQCAtNzcsNyArNjYsNyBA QCBpbnQgX19ibGtkZXZfaXNzdWVfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBz ZWN0b3JfdCBzZWN0b3IsCiAJCXNlY3Rvcl90IHJlcV9zZWN0cyA9CiAJCQltaW4obnJfc2VjdHMs IGJpb19kaXNjYXJkX2xpbWl0KGJkZXYsIHNlY3RvcikpOwogCi0JCWJpbyA9IGJsa19uZXh0X2Jp byhiaW8sIGJkZXYsIDAsIG9wLCBnZnBfbWFzayk7CisJCWJpbyA9IGJsa19uZXh0X2JpbyhiaW8s IGJkZXYsIDAsIFJFUV9PUF9ESVNDQVJELCBnZnBfbWFzayk7CiAJCWJpby0+YmlfaXRlci5iaV9z ZWN0b3IgPSBzZWN0b3I7CiAJCWJpby0+YmlfaXRlci5iaV9zaXplID0gcmVxX3NlY3RzIDw8IDk7 CiAJCXNlY3RvciArPSByZXFfc2VjdHM7CkBAIC0xMDMsMjEgKzkyLDE5IEBAIEVYUE9SVF9TWU1C T0woX19ibGtkZXZfaXNzdWVfZGlzY2FyZCk7CiAgKiBAc2VjdG9yOglzdGFydCBzZWN0b3IKICAq IEBucl9zZWN0czoJbnVtYmVyIG9mIHNlY3RvcnMgdG8gZGlzY2FyZAogICogQGdmcF9tYXNrOglt ZW1vcnkgYWxsb2NhdGlvbiBmbGFncyAoZm9yIGJpb19hbGxvYykKLSAqIEBmbGFnczoJQkxLREVW X0RJU0NBUkRfKiBmbGFncyB0byBjb250cm9sIGJlaGF2aW91cgogICoKICAqIERlc2NyaXB0aW9u OgogICogICAgSXNzdWUgYSBkaXNjYXJkIHJlcXVlc3QgZm9yIHRoZSBzZWN0b3JzIGluIHF1ZXN0 aW9uLgogICovCiBpbnQgYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc3RydWN0IGJsb2NrX2RldmljZSAq YmRldiwgc2VjdG9yX3Qgc2VjdG9yLAotCQlzZWN0b3JfdCBucl9zZWN0cywgZ2ZwX3QgZ2ZwX21h c2ssIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJCXNlY3Rvcl90IG5yX3NlY3RzLCBnZnBfdCBnZnBf bWFzaykKIHsKIAlzdHJ1Y3QgYmlvICpiaW8gPSBOVUxMOwogCXN0cnVjdCBibGtfcGx1ZyBwbHVn OwogCWludCByZXQ7CiAKIAlibGtfc3RhcnRfcGx1ZygmcGx1Zyk7Ci0JcmV0ID0gX19ibGtkZXZf aXNzdWVfZGlzY2FyZChiZGV2LCBzZWN0b3IsIG5yX3NlY3RzLCBnZnBfbWFzaywgZmxhZ3MsCi0J CQkmYmlvKTsKKwlyZXQgPSBfX2Jsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHNlY3RvciwgbnJf c2VjdHMsIGdmcF9tYXNrLCAmYmlvKTsKIAlpZiAoIXJldCAmJiBiaW8pIHsKIAkJcmV0ID0gc3Vi bWl0X2Jpb193YWl0KGJpbyk7CiAJCWlmIChyZXQgPT0gLUVPUE5PVFNVUFApCkBAIC0zMTQsMyAr MzAxLDQyIEBAIGludCBibGtkZXZfaXNzdWVfemVyb291dChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpi ZGV2LCBzZWN0b3JfdCBzZWN0b3IsCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woYmxr ZGV2X2lzc3VlX3plcm9vdXQpOworCitpbnQgYmxrZGV2X2lzc3VlX3NlY3VyZV9lcmFzZShzdHJ1 Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBzZWN0b3IsCisJCXNlY3Rvcl90IG5yX3Nl Y3RzLCBnZnBfdCBnZnApCit7CisJc2VjdG9yX3QgYnNfbWFzayA9IChiZGV2X2xvZ2ljYWxfYmxv Y2tfc2l6ZShiZGV2KSA+PiA5KSAtIDE7CisJdW5zaWduZWQgaW50IG1heF9zZWN0b3JzID0gYmRl dl9tYXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMoYmRldik7CisJc3RydWN0IGJpbyAqYmlvID0gTlVM TDsKKwlzdHJ1Y3QgYmxrX3BsdWcgcGx1ZzsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChtYXhfc2Vj dG9ycyA9PSAwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKChzZWN0b3IgfCBucl9zZWN0 cykgJiBic19tYXNrKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYmRldl9yZWFkX29ubHkoYmRl dikpCisJCXJldHVybiAtRVBFUk07CisKKwlibGtfc3RhcnRfcGx1ZygmcGx1Zyk7CisJZm9yICg7 OykgeworCQl1bnNpZ25lZCBpbnQgbGVuID0gbWluX3Qoc2VjdG9yX3QsIG5yX3NlY3RzLCBtYXhf c2VjdG9ycyk7CisKKwkJYmlvID0gYmxrX25leHRfYmlvKGJpbywgYmRldiwgMCwgUkVRX09QX1NF Q1VSRV9FUkFTRSwgZ2ZwKTsKKwkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IHNlY3RvcjsKKwkJ YmlvLT5iaV9pdGVyLmJpX3NpemUgPSBsZW47CisKKwkJc2VjdG9yICs9IGxlbiA8PCBTRUNUT1Jf U0hJRlQ7CisJCW5yX3NlY3RzIC09IGxlbiA8PCBTRUNUT1JfU0hJRlQ7CisJCWlmICghbnJfc2Vj dHMpIHsKKwkJCXJldCA9IHN1Ym1pdF9iaW9fd2FpdChiaW8pOworCQkJYmlvX3B1dChiaW8pOwor CQkJYnJlYWs7CisJCX0KKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCWJsa19maW5pc2hfcGx1Zygm cGx1Zyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChibGtkZXZfaXNzdWVfc2Vj dXJlX2VyYXNlKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS1kZWJ1Z2ZzLmMgYi9ibG9jay9i bGstbXEtZGVidWdmcy5jCmluZGV4IGZkMTExYzUwMDEyNTYuLjdlNDEzNmE2MGUxY2MgMTAwNjQ0 Ci0tLSBhL2Jsb2NrL2Jsay1tcS1kZWJ1Z2ZzLmMKKysrIGIvYmxvY2svYmxrLW1xLWRlYnVnZnMu YwpAQCAtMTE1LDcgKzExNSw2IEBAIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBibGtfcXVldWVf ZmxhZ19uYW1lW10gPSB7CiAJUVVFVUVfRkxBR19OQU1FKElPX1NUQVQpLAogCVFVRVVFX0ZMQUdf TkFNRShOT1hNRVJHRVMpLAogCVFVRVVFX0ZMQUdfTkFNRShBRERfUkFORE9NKSwKLQlRVUVVRV9G TEFHX05BTUUoU0VDRVJBU0UpLAogCVFVRVVFX0ZMQUdfTkFNRShTQU1FX0ZPUkNFKSwKIAlRVUVV RV9GTEFHX05BTUUoREVBRCksCiAJUVVFVUVfRkxBR19OQU1FKElOSVRfRE9ORSksCmRpZmYgLS1n aXQgYS9ibG9jay9ibGstc2V0dGluZ3MuYyBiL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCmluZGV4IGZk ODNkNjc0YWZkMGEuLjZjY2NlYjQyMWVkMmYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1zZXR0aW5n cy5jCisrKyBiL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCkBAIC00Niw2ICs0Niw3IEBAIHZvaWQgYmxr X3NldF9kZWZhdWx0X2xpbWl0cyhzdHJ1Y3QgcXVldWVfbGltaXRzICpsaW0pCiAJbGltLT5tYXhf em9uZV9hcHBlbmRfc2VjdG9ycyA9IDA7CiAJbGltLT5tYXhfZGlzY2FyZF9zZWN0b3JzID0gMDsK IAlsaW0tPm1heF9od19kaXNjYXJkX3NlY3RvcnMgPSAwOworCWxpbS0+bWF4X3NlY3VyZV9lcmFz ZV9zZWN0b3JzID0gMDsKIAlsaW0tPmRpc2NhcmRfZ3JhbnVsYXJpdHkgPSAwOwogCWxpbS0+ZGlz Y2FyZF9hbGlnbm1lbnQgPSAwOwogCWxpbS0+ZGlzY2FyZF9taXNhbGlnbmVkID0gMDsKQEAgLTE3 Niw2ICsxNzcsMTggQEAgdm9pZCBibGtfcXVldWVfbWF4X2Rpc2NhcmRfc2VjdG9ycyhzdHJ1Y3Qg cmVxdWVzdF9xdWV1ZSAqcSwKIH0KIEVYUE9SVF9TWU1CT0woYmxrX3F1ZXVlX21heF9kaXNjYXJk X3NlY3RvcnMpOwogCisvKioKKyAqIGJsa19xdWV1ZV9tYXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMg LSBzZXQgbWF4IHNlY3RvcnMgZm9yIGEgc2VjdXJlIGVyYXNlCisgKiBAcTogIHRoZSByZXF1ZXN0 IHF1ZXVlIGZvciB0aGUgZGV2aWNlCisgKiBAbWF4X3NlY3RvcnM6IG1heGltdW0gbnVtYmVyIG9m IHNlY3RvcnMgdG8gc2VjdXJlX2VyYXNlCisgKiovCit2b2lkIGJsa19xdWV1ZV9tYXhfc2VjdXJl X2VyYXNlX3NlY3RvcnMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCXVuc2lnbmVkIGludCBt YXhfc2VjdG9ycykKK3sKKwlxLT5saW1pdHMubWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzID0gbWF4 X3NlY3RvcnM7Cit9CitFWFBPUlRfU1lNQk9MKGJsa19xdWV1ZV9tYXhfc2VjdXJlX2VyYXNlX3Nl Y3RvcnMpOworCiAvKioKICAqIGJsa19xdWV1ZV9tYXhfd3JpdGVfemVyb2VzX3NlY3RvcnMgLSBz ZXQgbWF4IHNlY3RvcnMgZm9yIGEgc2luZ2xlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgd3JpdGUgemVyb2VzCkBAIC02NjEsNyArNjc0LDggQEAgaW50IGJsa19zdGFj a19saW1pdHMoc3RydWN0IHF1ZXVlX2xpbWl0cyAqdCwgc3RydWN0IHF1ZXVlX2xpbWl0cyAqYiwK IAkJdC0+ZGlzY2FyZF9hbGlnbm1lbnQgPSBsY21fbm90X3plcm8odC0+ZGlzY2FyZF9hbGlnbm1l bnQsIGFsaWdubWVudCkgJQogCQkJdC0+ZGlzY2FyZF9ncmFudWxhcml0eTsKIAl9Ci0KKwl0LT5t YXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMgPSBtaW5fbm90X3plcm8odC0+bWF4X3NlY3VyZV9lcmFz ZV9zZWN0b3JzLAorCQkJCQkJICAgYi0+bWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzKTsKIAl0LT56 b25lX3dyaXRlX2dyYW51bGFyaXR5ID0gbWF4KHQtPnpvbmVfd3JpdGVfZ3JhbnVsYXJpdHksCiAJ CQkJCWItPnpvbmVfd3JpdGVfZ3JhbnVsYXJpdHkpOwogCXQtPnpvbmVkID0gbWF4KHQtPnpvbmVk LCBiLT56b25lZCk7CmRpZmYgLS1naXQgYS9ibG9jay9mb3BzLmMgYi9ibG9jay9mb3BzLmMKaW5k ZXggOWYyZWNlYzQwNmIwNC4uYzBjYTMyNTRkMzhjZiAxMDA2NDQKLS0tIGEvYmxvY2svZm9wcy5j CisrKyBiL2Jsb2NrL2ZvcHMuYwpAQCAtNjcyLDcgKzY3Miw3IEBAIHN0YXRpYyBsb25nIGJsa2Rl dl9mYWxsb2NhdGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCBtb2RlLCBsb2ZmX3Qgc3RhcnQsCiAJ CWJyZWFrOwogCWNhc2UgRkFMTE9DX0ZMX1BVTkNIX0hPTEUgfCBGQUxMT0NfRkxfS0VFUF9TSVpF IHwgRkFMTE9DX0ZMX05PX0hJREVfU1RBTEU6CiAJCWVycm9yID0gYmxrZGV2X2lzc3VlX2Rpc2Nh cmQoYmRldiwgc3RhcnQgPj4gU0VDVE9SX1NISUZULAotCQkJCQkgICAgIGxlbiA+PiBTRUNUT1Jf U0hJRlQsIEdGUF9LRVJORUwsIDApOworCQkJCQkgICAgIGxlbiA+PiBTRUNUT1JfU0hJRlQsIEdG UF9LRVJORUwpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQllcnJvciA9IC1FT1BOT1RTVVBQOwpk aWZmIC0tZ2l0IGEvYmxvY2svaW9jdGwuYyBiL2Jsb2NrL2lvY3RsLmMKaW5kZXggYzJjZDNiYTUy OTBjZS4uNWI1MDI3ZmE3OGY3ZSAxMDA2NDQKLS0tIGEvYmxvY2svaW9jdGwuYworKysgYi9ibG9j ay9pb2N0bC5jCkBAIC04Myw3ICs4Myw3IEBAIHN0YXRpYyBpbnQgY29tcGF0X2Jsa3BnX2lvY3Rs KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAjZW5kaWYKIAogc3RhdGljIGludCBibGtfaW9j dGxfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUsCi0JCXVu c2lnbmVkIGxvbmcgYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCQl1bnNpZ25lZCBsb25nIGFy ZykKIHsKIAl1aW50NjRfdCByYW5nZVsyXTsKIAl1aW50NjRfdCBzdGFydCwgbGVuOwpAQCAtMTE0 LDE1ICsxMTQsNDMgQEAgc3RhdGljIGludCBibGtfaW9jdGxfZGlzY2FyZChzdHJ1Y3QgYmxvY2tf ZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUsCiAJZXJyID0gdHJ1bmNhdGVfYmRldl9yYW5nZShi ZGV2LCBtb2RlLCBzdGFydCwgc3RhcnQgKyBsZW4gLSAxKTsKIAlpZiAoZXJyKQogCQlnb3RvIGZh aWw7Ci0KLQllcnIgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LCBzdGFydCA+PiA5LCBsZW4g Pj4gOSwKLQkJCQkgICBHRlBfS0VSTkVMLCBmbGFncyk7Ci0KKwllcnIgPSBibGtkZXZfaXNzdWVf ZGlzY2FyZChiZGV2LCBzdGFydCA+PiA5LCBsZW4gPj4gOSwgR0ZQX0tFUk5FTCk7CiBmYWlsOgog CWZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtPmlfbWFwcGluZyk7CiAJcmV0dXJuIGVy cjsKIH0KIAorc3RhdGljIGludCBibGtfaW9jdGxfc2VjdXJlX2VyYXNlKHN0cnVjdCBibG9ja19k ZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSwKKwkJdm9pZCBfX3VzZXIgKmFyZ3ApCit7CisJdWlu dDY0X3Qgc3RhcnQsIGxlbjsKKwl1aW50NjRfdCByYW5nZVsyXTsKKwlpbnQgZXJyOworCisJaWYg KCEobW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJcmV0dXJuIC1FQkFERjsKKwlpZiAoIWJkZXZfbWF4 X3NlY3VyZV9lcmFzZV9zZWN0b3JzKGJkZXYpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYg KGNvcHlfZnJvbV91c2VyKHJhbmdlLCBhcmdwLCBzaXplb2YocmFuZ2UpKSkKKwkJcmV0dXJuIC1F RkFVTFQ7CisKKwlzdGFydCA9IHJhbmdlWzBdOworCWxlbiA9IHJhbmdlWzFdOworCWlmICgoc3Rh cnQgJiA1MTEpIHx8IChsZW4gJiA1MTEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RhcnQg KyBsZW4gPiBiZGV2X25yX2J5dGVzKGJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZpbGVt YXBfaW52YWxpZGF0ZV9sb2NrKGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOworCWVyciA9IHRy dW5jYXRlX2JkZXZfcmFuZ2UoYmRldiwgbW9kZSwgc3RhcnQsIHN0YXJ0ICsgbGVuIC0gMSk7CisJ aWYgKCFlcnIpCisJCWVyciA9IGJsa2Rldl9pc3N1ZV9zZWN1cmVfZXJhc2UoYmRldiwgc3RhcnQg Pj4gOSwgbGVuID4+IDksCisJCQkJCQlHRlBfS0VSTkVMKTsKKwlmaWxlbWFwX2ludmFsaWRhdGVf dW5sb2NrKGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOworCXJldHVybiBlcnI7Cit9CisKKwog c3RhdGljIGludCBibGtfaW9jdGxfemVyb291dChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBm bW9kZV90IG1vZGUsCiAJCXVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtNDUwLDEwICs0NzgsOSBA QCBzdGF0aWMgaW50IGJsa2Rldl9jb21tb25faW9jdGwoc3RydWN0IGJsb2NrX2RldmljZSAqYmRl diwgZm1vZGVfdCBtb2RlLAogCWNhc2UgQkxLUk9TRVQ6CiAJCXJldHVybiBibGtkZXZfcm9zZXQo YmRldiwgbW9kZSwgY21kLCBhcmcpOwogCWNhc2UgQkxLRElTQ0FSRDoKLQkJcmV0dXJuIGJsa19p b2N0bF9kaXNjYXJkKGJkZXYsIG1vZGUsIGFyZywgMCk7CisJCXJldHVybiBibGtfaW9jdGxfZGlz Y2FyZChiZGV2LCBtb2RlLCBhcmcpOwogCWNhc2UgQkxLU0VDRElTQ0FSRDoKLQkJcmV0dXJuIGJs a19pb2N0bF9kaXNjYXJkKGJkZXYsIG1vZGUsIGFyZywKLQkJCQlCTEtERVZfRElTQ0FSRF9TRUNV UkUpOworCQlyZXR1cm4gYmxrX2lvY3RsX3NlY3VyZV9lcmFzZShiZGV2LCBtb2RlLCBhcmdwKTsK IAljYXNlIEJMS1pFUk9PVVQ6CiAJCXJldHVybiBibGtfaW9jdGxfemVyb291dChiZGV2LCBtb2Rl LCBhcmcpOwogCWNhc2UgQkxLR0VURElTS1NFUToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sv ZHJiZC9kcmJkX3JlY2VpdmVyLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5j CmluZGV4IDI3NWM1M2M3YjYyOWUuLjI5NTdiMGI2OGQ2MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMv YmxvY2svZHJiZC9kcmJkX3JlY2VpdmVyLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRf cmVjZWl2ZXIuYwpAQCAtMTU0Nyw3ICsxNTQ3LDggQEAgaW50IGRyYmRfaXNzdWVfZGlzY2FyZF9v cl96ZXJvX291dChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc3RhcnQsIHUK IAkJc3RhcnQgPSB0bXA7CiAJfQogCXdoaWxlIChucl9zZWN0b3JzID49IG1heF9kaXNjYXJkX3Nl Y3RvcnMpIHsKLQkJZXJyIHw9IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHN0YXJ0LCBtYXhf ZGlzY2FyZF9zZWN0b3JzLCBHRlBfTk9JTywgMCk7CisJCWVyciB8PSBibGtkZXZfaXNzdWVfZGlz Y2FyZChiZGV2LCBzdGFydCwgbWF4X2Rpc2NhcmRfc2VjdG9ycywKKwkJCQkJICAgIEdGUF9OT0lP KTsKIAkJbnJfc2VjdG9ycyAtPSBtYXhfZGlzY2FyZF9zZWN0b3JzOwogCQlzdGFydCArPSBtYXhf ZGlzY2FyZF9zZWN0b3JzOwogCX0KQEAgLTE1NTksNyArMTU2MCw3IEBAIGludCBkcmJkX2lzc3Vl X2Rpc2NhcmRfb3JfemVyb19vdXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90 IHN0YXJ0LCB1CiAJCW5yID0gbnJfc2VjdG9yczsKIAkJbnIgLT0gKHVuc2lnbmVkIGludCluciAl IGdyYW51bGFyaXR5OwogCQlpZiAobnIpIHsKLQkJCWVyciB8PSBibGtkZXZfaXNzdWVfZGlzY2Fy ZChiZGV2LCBzdGFydCwgbnIsIEdGUF9OT0lPLCAwKTsKKwkJCWVyciB8PSBibGtkZXZfaXNzdWVf ZGlzY2FyZChiZGV2LCBzdGFydCwgbnIsIEdGUF9OT0lPKTsKIAkJCW5yX3NlY3RvcnMgLT0gbnI7 CiAJCQlzdGFydCArPSBucjsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9ybmJkL3Ju YmQtY2x0LmMgYi9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1jbHQuYwppbmRleCBlZmE5OWEzODg0 NTA3Li5kMTc4YmUxNzVhZDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1j bHQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1jbHQuYwpAQCAtMTM2NSw4ICsxMzY1 LDggQEAgc3RhdGljIHZvaWQgc2V0dXBfcmVxdWVzdF9xdWV1ZShzdHJ1Y3Qgcm5iZF9jbHRfZGV2 ICpkZXYpCiAJZGV2LT5xdWV1ZS0+bGltaXRzLmRpc2NhcmRfZ3JhbnVsYXJpdHkJPSBkZXYtPmRp c2NhcmRfZ3JhbnVsYXJpdHk7CiAJZGV2LT5xdWV1ZS0+bGltaXRzLmRpc2NhcmRfYWxpZ25tZW50 CT0gZGV2LT5kaXNjYXJkX2FsaWdubWVudDsKIAlpZiAoZGV2LT5zZWN1cmVfZGlzY2FyZCkKLQkJ YmxrX3F1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfU0VDRVJBU0UsIGRldi0+cXVldWUpOwotCisJ CWJsa19xdWV1ZV9tYXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMoZGV2LT5xdWV1ZSwKKwkJCQlkZXYt Pm1heF9kaXNjYXJkX3NlY3RvcnMpOwogCWJsa19xdWV1ZV9mbGFnX3NldChRVUVVRV9GTEFHX1NB TUVfQ09NUCwgZGV2LT5xdWV1ZSk7CiAJYmxrX3F1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfU0FN RV9GT1JDRSwgZGV2LT5xdWV1ZSk7CiAJYmxrX3F1ZXVlX21heF9zZWdtZW50cyhkZXYtPnF1ZXVl LCBkZXYtPm1heF9zZWdtZW50cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5i ZC1zcnYtZGV2LmggYi9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1zcnYtZGV2LmgKaW5kZXggMWY3 ZTFjOGZkNGQ5Yi4uZDA4MGEwZGU1OTIyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9ybmJk L3JuYmQtc3J2LWRldi5oCisrKyBiL2RyaXZlcnMvYmxvY2svcm5iZC9ybmJkLXNydi1kZXYuaApA QCAtNDQsNyArNDQsNyBAQCBzdGF0aWMgaW5saW5lIGludCBybmJkX2Rldl9nZXRfbWF4X2h3X3Nl Y3RzKGNvbnN0IHN0cnVjdCBybmJkX2RldiAqZGV2KQogCiBzdGF0aWMgaW5saW5lIGludCBybmJk X2Rldl9nZXRfc2VjdXJlX2Rpc2NhcmQoY29uc3Qgc3RydWN0IHJuYmRfZGV2ICpkZXYpCiB7Ci0J cmV0dXJuIGJsa19xdWV1ZV9zZWN1cmVfZXJhc2UoYmRldl9nZXRfcXVldWUoZGV2LT5iZGV2KSk7 CisJcmV0dXJuIGJkZXZfbWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzKGRldi0+YmRldik7CiB9CiAK IHN0YXRpYyBpbmxpbmUgaW50IHJuYmRfZGV2X2dldF9tYXhfZGlzY2FyZF9zZWN0cyhjb25zdCBz dHJ1Y3Qgcm5iZF9kZXYgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Jh Y2svYmxrYmFjay5jIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGtiYWNrLmMKaW5kZXgg ZGU0MjQ1ODE5NWJjMS4uYTk3ZjJiZjViMDFiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay94 ZW4tYmxrYmFjay9ibGtiYWNrLmMKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGti YWNrLmMKQEAgLTk3MCw3ICs5NzAsNiBAQCBzdGF0aWMgaW50IGRpc3BhdGNoX2Rpc2NhcmRfaW8o c3RydWN0IHhlbl9ibGtpZl9yaW5nICpyaW5nLAogCWludCBzdGF0dXMgPSBCTEtJRl9SU1BfT0tB WTsKIAlzdHJ1Y3QgeGVuX2Jsa2lmICpibGtpZiA9IHJpbmctPmJsa2lmOwogCXN0cnVjdCBibG9j a19kZXZpY2UgKmJkZXYgPSBibGtpZi0+dmJkLmJkZXY7Ci0JdW5zaWduZWQgbG9uZyBzZWN1cmU7 CiAJc3RydWN0IHBoeXNfcmVxIHByZXE7CiAKIAl4ZW5fYmxraWZfZ2V0KGJsa2lmKTsKQEAgLTk4 NywxMyArOTg2LDE1IEBAIHN0YXRpYyBpbnQgZGlzcGF0Y2hfZGlzY2FyZF9pbyhzdHJ1Y3QgeGVu X2Jsa2lmX3JpbmcgKnJpbmcsCiAJfQogCXJpbmctPnN0X2RzX3JlcSsrOwogCi0Jc2VjdXJlID0g KGJsa2lmLT52YmQuZGlzY2FyZF9zZWN1cmUgJiYKLQkJIChyZXEtPnUuZGlzY2FyZC5mbGFnICYg QkxLSUZfRElTQ0FSRF9TRUNVUkUpKSA/Ci0JCSBCTEtERVZfRElTQ0FSRF9TRUNVUkUgOiAwOwor CWlmIChibGtpZi0+dmJkLmRpc2NhcmRfc2VjdXJlICYmCisJICAgIChyZXEtPnUuZGlzY2FyZC5m bGFnICYgQkxLSUZfRElTQ0FSRF9TRUNVUkUpKQorCQllcnIgPSBibGtkZXZfaXNzdWVfc2VjdXJl X2VyYXNlKGJkZXYsCisJCQkJcmVxLT51LmRpc2NhcmQuc2VjdG9yX251bWJlciwKKwkJCQlyZXEt PnUuZGlzY2FyZC5ucl9zZWN0b3JzLCBHRlBfS0VSTkVMKTsKKwllbHNlCisJCWVyciA9IGJsa2Rl dl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHJlcS0+dS5kaXNjYXJkLnNlY3Rvcl9udW1iZXIsCisJCQkJ cmVxLT51LmRpc2NhcmQubnJfc2VjdG9ycywgR0ZQX0tFUk5FTCk7CiAKLQllcnIgPSBibGtkZXZf aXNzdWVfZGlzY2FyZChiZGV2LCByZXEtPnUuZGlzY2FyZC5zZWN0b3JfbnVtYmVyLAotCQkJCSAg IHJlcS0+dS5kaXNjYXJkLm5yX3NlY3RvcnMsCi0JCQkJICAgR0ZQX0tFUk5FTCwgc2VjdXJlKTsK IGZhaWxfcmVzcG9uc2U6CiAJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkgewogCQlwcl9kZWJ1Zygi ZGlzY2FyZCBvcCBmYWlsZWQsIG5vdCBzdXBwb3J0ZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2sv eGVuYnVzLmMKaW5kZXggODNjZDA4MDQxZTZiMy4uYjIxYmZmYzljNTBiYyAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hl bi1ibGtiYWNrL3hlbmJ1cy5jCkBAIC00ODQsNyArNDg0LDYgQEAgc3RhdGljIGludCB4ZW5fdmJk X2NyZWF0ZShzdHJ1Y3QgeGVuX2Jsa2lmICpibGtpZiwgYmxraWZfdmRldl90IGhhbmRsZSwKIHsK IAlzdHJ1Y3QgeGVuX3ZiZCAqdmJkOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7Ci0Jc3Ry dWN0IHJlcXVlc3RfcXVldWUgKnE7CiAKIAl2YmQgPSAmYmxraWYtPnZiZDsKIAl2YmQtPmhhbmRs ZSAgID0gaGFuZGxlOwpAQCAtNTE2LDExICs1MTUsOSBAQCBzdGF0aWMgaW50IHhlbl92YmRfY3Jl YXRlKHN0cnVjdCB4ZW5fYmxraWYgKmJsa2lmLCBibGtpZl92ZGV2X3QgaGFuZGxlLAogCWlmICh2 YmQtPmJkZXYtPmJkX2Rpc2stPmZsYWdzICYgR0VOSERfRkxfUkVNT1ZBQkxFKQogCQl2YmQtPnR5 cGUgfD0gVkRJU0tfUkVNT1ZBQkxFOwogCi0JcSA9IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpOwogCWlm IChiZGV2X3dyaXRlX2NhY2hlKGJkZXYpKQogCQl2YmQtPmZsdXNoX3N1cHBvcnQgPSB0cnVlOwot Ci0JaWYgKHEgJiYgYmxrX3F1ZXVlX3NlY3VyZV9lcmFzZShxKSkKKwlpZiAoYmRldl9tYXhfc2Vj dXJlX2VyYXNlX3NlY3RvcnMoYmRldikpCiAJCXZiZC0+ZGlzY2FyZF9zZWN1cmUgPSB0cnVlOwog CiAJdmJkLT5mZWF0dXJlX2dudF9wZXJzaXN0ZW50ID0gZmVhdHVyZV9wZXJzaXN0ZW50OwpkaWZm IC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYyBiL2RyaXZlcnMvYmxvY2sveGVu LWJsa2Zyb250LmMKaW5kZXggMjUzYmY4MzVhY2ExZi4uOWZiN2M2OWY3MmIyZCAxMDA2NDQKLS0t IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hlbi1i bGtmcm9udC5jCkBAIC05NDksNyArOTQ5LDggQEAgc3RhdGljIHZvaWQgYmxraWZfc2V0X3F1ZXVl X2xpbWl0cyhzdHJ1Y3QgYmxrZnJvbnRfaW5mbyAqaW5mbykKIAkJCQkJCSBpbmZvLT5waHlzaWNh bF9zZWN0b3Jfc2l6ZTsKIAkJcnEtPmxpbWl0cy5kaXNjYXJkX2FsaWdubWVudCA9IGluZm8tPmRp c2NhcmRfYWxpZ25tZW50OwogCQlpZiAoaW5mby0+ZmVhdHVyZV9zZWNkaXNjYXJkKQotCQkJYmxr X3F1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfU0VDRVJBU0UsIHJxKTsKKwkJCWJsa19xdWV1ZV9t YXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMocnEsCisJCQkJCQkJICAgZ2V0X2NhcGFjaXR5KGdkKSk7 CiAJfQogCiAJLyogSGFyZCBzZWN0b3Igc2l6ZSBhbmQgbWF4IHNlY3RvcnMgaW1wZXJzb25hdGUg dGhlIGVxdWl2LiBoYXJkd2FyZS4gKi8KQEAgLTE2MDUsNyArMTYwNiw3IEBAIHN0YXRpYyBpcnFy ZXR1cm5fdCBibGtpZl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogCQkJCWJsa2lm X3JlcShyZXEpLT5lcnJvciA9IEJMS19TVFNfTk9UU1VQUDsKIAkJCQlpbmZvLT5mZWF0dXJlX2Rp c2NhcmQgPSAwOwogCQkJCWluZm8tPmZlYXR1cmVfc2VjZGlzY2FyZCA9IDA7Ci0JCQkJYmxrX3F1 ZXVlX2ZsYWdfY2xlYXIoUVVFVUVfRkxBR19TRUNFUkFTRSwgcnEpOworCQkJCWJsa19xdWV1ZV9t YXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMocnEsIDApOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2Ug QkxLSUZfT1BfRkxVU0hfRElTS0NBQ0hFOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUv YWxsb2MuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL2FsbG9jLmMKaW5kZXggMDk3NTc3YWUzYzQ3MS4u Y2UxM2MyNzJjMzg3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvYWxsb2MuYworKysg Yi9kcml2ZXJzL21kL2JjYWNoZS9hbGxvYy5jCkBAIC0zMzYsNyArMzM2LDcgQEAgc3RhdGljIGlu dCBiY2hfYWxsb2NhdG9yX3RocmVhZCh2b2lkICphcmcpCiAJCQkJbXV0ZXhfdW5sb2NrKCZjYS0+ c2V0LT5idWNrZXRfbG9jayk7CiAJCQkJYmxrZGV2X2lzc3VlX2Rpc2NhcmQoY2EtPmJkZXYsCiAJ CQkJCWJ1Y2tldF90b19zZWN0b3IoY2EtPnNldCwgYnVja2V0KSwKLQkJCQkJY2EtPnNiLmJ1Y2tl dF9zaXplLCBHRlBfS0VSTkVMLCAwKTsKKwkJCQkJY2EtPnNiLmJ1Y2tldF9zaXplLCBHRlBfS0VS TkVMKTsKIAkJCQltdXRleF9sb2NrKCZjYS0+c2V0LT5idWNrZXRfbG9jayk7CiAJCQl9CiAKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYyBiL2RyaXZlcnMvbWQvZG0tdGFibGUuYwpp bmRleCAwZGZmNjkwN2ZkMDBkLi5lN2Q0MmY2MzM1YTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21k L2RtLXRhYmxlLmMKKysrIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCkBAIC0xOTIwLDkgKzE5MjAs NyBAQCBzdGF0aWMgaW50IGRldmljZV9ub3Rfc2VjdXJlX2VyYXNlX2NhcGFibGUoc3RydWN0IGRt X3RhcmdldCAqdGksCiAJCQkJCSAgIHN0cnVjdCBkbV9kZXYgKmRldiwgc2VjdG9yX3Qgc3RhcnQs CiAJCQkJCSAgIHNlY3Rvcl90IGxlbiwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgcmVxdWVzdF9x dWV1ZSAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGRldi0+YmRldik7Ci0KLQlyZXR1cm4gIWJsa19xdWV1 ZV9zZWN1cmVfZXJhc2UocSk7CisJcmV0dXJuICFiZGV2X21heF9zZWN1cmVfZXJhc2Vfc2VjdG9y cyhkZXYtPmJkZXYpOwogfQogCiBzdGF0aWMgYm9vbCBkbV90YWJsZV9zdXBwb3J0c19zZWN1cmVf ZXJhc2Uoc3RydWN0IGRtX3RhYmxlICp0KQpAQCAtMTk3NSw4ICsxOTczLDggQEAgaW50IGRtX3Rh YmxlX3NldF9yZXN0cmljdGlvbnMoc3RydWN0IGRtX3RhYmxlICp0LCBzdHJ1Y3QgcmVxdWVzdF9x dWV1ZSAqcSwKIAkJcS0+bGltaXRzLmRpc2NhcmRfbWlzYWxpZ25lZCA9IDA7CiAJfQogCi0JaWYg KGRtX3RhYmxlX3N1cHBvcnRzX3NlY3VyZV9lcmFzZSh0KSkKLQkJYmxrX3F1ZXVlX2ZsYWdfc2V0 KFFVRVVFX0ZMQUdfU0VDRVJBU0UsIHEpOworCWlmICghZG1fdGFibGVfc3VwcG9ydHNfc2VjdXJl X2VyYXNlKHQpKQorCQlxLT5saW1pdHMubWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzID0gMDsKIAog CWlmIChkbV90YWJsZV9zdXBwb3J0c19mbHVzaCh0LCAoMVVMIDw8IFFVRVVFX0ZMQUdfV0MpKSkg ewogCQl3YyA9IHRydWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXRoaW4uYyBiL2RyaXZl cnMvbWQvZG0tdGhpbi5jCmluZGV4IGVkZWQ0YmNjNDU0NWYuLjg0YzA4M2Y3NjY3MzYgMTAwNjQ0 Ci0tLSBhL2RyaXZlcnMvbWQvZG0tdGhpbi5jCisrKyBiL2RyaXZlcnMvbWQvZG0tdGhpbi5jCkBA IC0zOTgsOCArMzk4LDggQEAgc3RhdGljIGludCBpc3N1ZV9kaXNjYXJkKHN0cnVjdCBkaXNjYXJk X29wICpvcCwgZG1fYmxvY2tfdCBkYXRhX2IsIGRtX2Jsb2NrX3QgZGEKIAlzZWN0b3JfdCBzID0g YmxvY2tfdG9fc2VjdG9ycyh0Yy0+cG9vbCwgZGF0YV9iKTsKIAlzZWN0b3JfdCBsZW4gPSBibG9j a190b19zZWN0b3JzKHRjLT5wb29sLCBkYXRhX2UgLSBkYXRhX2IpOwogCi0JcmV0dXJuIF9fYmxr ZGV2X2lzc3VlX2Rpc2NhcmQodGMtPnBvb2xfZGV2LT5iZGV2LCBzLCBsZW4sCi0JCQkJICAgICAg R0ZQX05PV0FJVCwgMCwgJm9wLT5iaW8pOworCXJldHVybiBfX2Jsa2Rldl9pc3N1ZV9kaXNjYXJk KHRjLT5wb29sX2Rldi0+YmRldiwgcywgbGVuLCBHRlBfTk9XQUlULAorCQkJCSAgICAgICZvcC0+ YmlvKTsKIH0KIAogc3RhdGljIHZvaWQgZW5kX2Rpc2NhcmQoc3RydWN0IGRpc2NhcmRfb3AgKm9w LCBpbnQgcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwpp bmRleCAxOTYzNmMyZjJjZGE0Li4yNTg3Zjg3MmMwODg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21k L21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC04NTg0LDcgKzg1ODQsNyBAQCB2b2lkIG1k X3N1Ym1pdF9kaXNjYXJkX2JpbyhzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgbWRfcmRldiAq cmRldiwKIHsKIAlzdHJ1Y3QgYmlvICpkaXNjYXJkX2JpbyA9IE5VTEw7CiAKLQlpZiAoX19ibGtk ZXZfaXNzdWVfZGlzY2FyZChyZGV2LT5iZGV2LCBzdGFydCwgc2l6ZSwgR0ZQX05PSU8sIDAsCisJ aWYgKF9fYmxrZGV2X2lzc3VlX2Rpc2NhcmQocmRldi0+YmRldiwgc3RhcnQsIHNpemUsIEdGUF9O T0lPLAogCQkJJmRpc2NhcmRfYmlvKSB8fCAhZGlzY2FyZF9iaW8pCiAJCXJldHVybjsKIApkaWZm IC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNS1jYWNoZS5jIGIvZHJpdmVycy9tZC9yYWlkNS1jYWNo ZS5jCmluZGV4IGMzY2JmOWE1NzRhMzkuLjA5NGE0MDQyNTg5ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZl cnMvbWQvcmFpZDUtY2FjaGUuYworKysgYi9kcml2ZXJzL21kL3JhaWQ1LWNhY2hlLmMKQEAgLTEz NDQsMTQgKzEzNDQsMTQgQEAgc3RhdGljIHZvaWQgcjVsX3dyaXRlX3N1cGVyX2FuZF9kaXNjYXJk X3NwYWNlKHN0cnVjdCByNWxfbG9nICpsb2csCiAJaWYgKGxvZy0+bGFzdF9jaGVja3BvaW50IDwg ZW5kKSB7CiAJCWJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsCiAJCQkJbG9nLT5sYXN0X2NoZWNr cG9pbnQgKyBsb2ctPnJkZXYtPmRhdGFfb2Zmc2V0LAotCQkJCWVuZCAtIGxvZy0+bGFzdF9jaGVj a3BvaW50LCBHRlBfTk9JTywgMCk7CisJCQkJZW5kIC0gbG9nLT5sYXN0X2NoZWNrcG9pbnQsIEdG UF9OT0lPKTsKIAl9IGVsc2UgewogCQlibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LAogCQkJCWxv Zy0+bGFzdF9jaGVja3BvaW50ICsgbG9nLT5yZGV2LT5kYXRhX29mZnNldCwKIAkJCQlsb2ctPmRl dmljZV9zaXplIC0gbG9nLT5sYXN0X2NoZWNrcG9pbnQsCi0JCQkJR0ZQX05PSU8sIDApOworCQkJ CUdGUF9OT0lPKTsKIAkJYmxrZGV2X2lzc3VlX2Rpc2NhcmQoYmRldiwgbG9nLT5yZGV2LT5kYXRh X29mZnNldCwgZW5kLAotCQkJCUdGUF9OT0lPLCAwKTsKKwkJCQlHRlBfTk9JTyk7CiAJfQogfQog CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3F1ZXVlLmMgYi9kcml2ZXJzL21tYy9jb3Jl L3F1ZXVlLmMKaW5kZXggY2FjNjMxNTAxMGEzZC4uYTNkNDQ2MDA1NTcxNiAxMDA2NDQKLS0tIGEv ZHJpdmVycy9tbWMvY29yZS9xdWV1ZS5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvcXVldWUuYwpA QCAtMTg5LDcgKzE4OSw3IEBAIHN0YXRpYyB2b2lkIG1tY19xdWV1ZV9zZXR1cF9kaXNjYXJkKHN0 cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAogCWlmIChjYXJkLT5wcmVmX2VyYXNlID4gbWF4X2Rpc2Nh cmQpCiAJCXEtPmxpbWl0cy5kaXNjYXJkX2dyYW51bGFyaXR5ID0gU0VDVE9SX1NJWkU7CiAJaWYg KG1tY19jYW5fc2VjdXJlX2VyYXNlX3RyaW0oY2FyZCkpCi0JCWJsa19xdWV1ZV9mbGFnX3NldChR VUVVRV9GTEFHX1NFQ0VSQVNFLCBxKTsKKwkJYmxrX3F1ZXVlX21heF9zZWN1cmVfZXJhc2Vfc2Vj dG9ycyhxLCBtYXhfZGlzY2FyZCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBtbWNfZ2V0 X21heF9zZWdtZW50cyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCmRpZmYgLS1naXQgYS9kcml2ZXJz L252bWUvdGFyZ2V0L2lvLWNtZC1iZGV2LmMgYi9kcml2ZXJzL252bWUvdGFyZ2V0L2lvLWNtZC1i ZGV2LmMKaW5kZXggZDg4NmMyYzU5NTU0Zi4uMjdhNzI1MDRkMzFjZSAxMDA2NDQKLS0tIGEvZHJp dmVycy9udm1lL3RhcmdldC9pby1jbWQtYmRldi5jCisrKyBiL2RyaXZlcnMvbnZtZS90YXJnZXQv aW8tY21kLWJkZXYuYwpAQCAtMzYwLDcgKzM2MCw3IEBAIHN0YXRpYyB1MTYgbnZtZXRfYmRldl9k aXNjYXJkX3JhbmdlKHN0cnVjdCBudm1ldF9yZXEgKnJlcSwKIAlyZXQgPSBfX2Jsa2Rldl9pc3N1 ZV9kaXNjYXJkKG5zLT5iZGV2LAogCQkJbnZtZXRfbGJhX3RvX3NlY3QobnMsIHJhbmdlLT5zbGJh KSwKIAkJCWxlMzJfdG9fY3B1KHJhbmdlLT5ubGIpIDw8IChucy0+Ymxrc2l6ZV9zaGlmdCAtIDkp LAotCQkJR0ZQX0tFUk5FTCwgMCwgYmlvKTsKKwkJCUdGUF9LRVJORUwsIGJpbyk7CiAJaWYgKHJl dCAmJiByZXQgIT0gLUVPUE5PVFNVUFApIHsKIAkJcmVxLT5lcnJvcl9zbGJhID0gbGU2NF90b19j cHUocmFuZ2UtPnNsYmEpOwogCQlyZXR1cm4gZXJybm9fdG9fbnZtZV9zdGF0dXMocmVxLCByZXQp OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5jIGIvZHJpdmVy cy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5jCmluZGV4IGI2YmE1ODJiMDY3NzUuLmU2OGYxY2M4 ZWY5OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYworKysg Yi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9maWxlLmMKQEAgLTU1OCw3ICs1NTgsNyBAQCBm ZF9leGVjdXRlX3VubWFwKHN0cnVjdCBzZV9jbWQgKmNtZCwgc2VjdG9yX3QgbGJhLCBzZWN0b3Jf dCBub2xiKQogCQlyZXQgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LAogCQkJCQkgICB0YXJn ZXRfdG9fbGludXhfc2VjdG9yKGRldiwgbGJhKSwKIAkJCQkJICAgdGFyZ2V0X3RvX2xpbnV4X3Nl Y3RvcihkZXYsICBub2xiKSwKLQkJCQkJICAgR0ZQX0tFUk5FTCwgMCk7CisJCQkJCSAgIEdGUF9L RVJORUwpOwogCQlpZiAocmV0IDwgMCkgewogCQkJcHJfd2FybigiRklMRUlPOiBibGtkZXZfaXNz dWVfZGlzY2FyZCgpIGZhaWxlZDogJWRcbiIsCiAJCQkJcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZl cnMvdGFyZ2V0L3RhcmdldF9jb3JlX2libG9jay5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2Nv cmVfaWJsb2NrLmMKaW5kZXggYzRhOTAzYjhhNDdmYy4uMzc4YzgwMzEzYTBmMiAxMDA2NDQKLS0t IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKKysrIGIvZHJpdmVycy90YXJn ZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKQEAgLTQzNCw3ICs0MzQsNyBAQCBpYmxvY2tfZXhlY3V0 ZV91bm1hcChzdHJ1Y3Qgc2VfY21kICpjbWQsIHNlY3Rvcl90IGxiYSwgc2VjdG9yX3Qgbm9sYikK IAlyZXQgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LAogCQkJCSAgIHRhcmdldF90b19saW51 eF9zZWN0b3IoZGV2LCBsYmEpLAogCQkJCSAgIHRhcmdldF90b19saW51eF9zZWN0b3IoZGV2LCAg bm9sYiksCi0JCQkJICAgR0ZQX0tFUk5FTCwgMCk7CisJCQkJICAgR0ZQX0tFUk5FTCk7CiAJaWYg KHJldCA8IDApIHsKIAkJcHJfZXJyKCJibGtkZXZfaXNzdWVfZGlzY2FyZCgpIGZhaWxlZDogJWRc biIsIHJldCk7CiAJCXJldHVybiBUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVS RTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMgYi9mcy9idHJmcy9leHRlbnQt dHJlZS5jCmluZGV4IGVmZDhkZWIzYWI3ZTguLjVjMWQzYTU2NGRhNWEgMTAwNjQ0Ci0tLSBhL2Zz L2J0cmZzL2V4dGVudC10cmVlLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYwpAQCAtMTIz OSw3ICsxMjM5LDcgQEAgc3RhdGljIGludCBidHJmc19pc3N1ZV9kaXNjYXJkKHN0cnVjdCBibG9j a19kZXZpY2UgKmJkZXYsIHU2NCBzdGFydCwgdTY0IGxlbiwKIAogCQlpZiAoc2l6ZSkgewogCQkJ cmV0ID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQoYmRldiwgc3RhcnQgPj4gOSwgc2l6ZSA+PiA5LAot CQkJCQkJICAgR0ZQX05PRlMsIDApOworCQkJCQkJICAgR0ZQX05PRlMpOwogCQkJaWYgKCFyZXQp CiAJCQkJKmRpc2NhcmRlZF9ieXRlcyArPSBzaXplOwogCQkJZWxzZSBpZiAocmV0ICE9IC1FT1BO T1RTVVBQKQpAQCAtMTI1Niw3ICsxMjU2LDcgQEAgc3RhdGljIGludCBidHJmc19pc3N1ZV9kaXNj YXJkKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHU2NCBzdGFydCwgdTY0IGxlbiwKIAogCWlm IChieXRlc19sZWZ0KSB7CiAJCXJldCA9IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHN0YXJ0 ID4+IDksIGJ5dGVzX2xlZnQgPj4gOSwKLQkJCQkJICAgR0ZQX05PRlMsIDApOworCQkJCQkgICBH RlBfTk9GUyk7CiAJCWlmICghcmV0KQogCQkJKmRpc2NhcmRlZF9ieXRlcyArPSBieXRlc19sZWZ0 OwogCX0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWJhbGxvYy5jIGIvZnMvZXh0NC9tYmFsbG9jLmMK aW5kZXggNmQxODIwNTM2ZDg4ZC4uZWE2NTNkMTlmOWVjNyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9t YmFsbG9jLmMKKysrIGIvZnMvZXh0NC9tYmFsbG9jLmMKQEAgLTM2MjksNyArMzYyOSw3IEBAIHN0 YXRpYyBpbmxpbmUgaW50IGV4dDRfaXNzdWVfZGlzY2FyZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNi LAogCQlyZXR1cm4gX19ibGtkZXZfaXNzdWVfZGlzY2FyZChzYi0+c19iZGV2LAogCQkJKHNlY3Rv cl90KWRpc2NhcmRfYmxvY2sgPDwgKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSksCiAJCQkoc2Vj dG9yX3QpY291bnQgPDwgKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSksCi0JCQlHRlBfTk9GUywg MCwgYmlvcCk7CisJCQlHRlBfTk9GUywgYmlvcCk7CiAJfSBlbHNlCiAJCXJldHVybiBzYl9pc3N1 ZV9kaXNjYXJkKHNiLCBkaXNjYXJkX2Jsb2NrLCBjb3VudCwgR0ZQX05PRlMsIDApOwogfQpkaWZm IC0tZ2l0IGEvZnMvZjJmcy9maWxlLmMgYi9mcy9mMmZzL2ZpbGUuYwppbmRleCA4MDUzZDk5ZjM5 MjBiLi4zNWI2YzcyMGMyYmMxIDEwMDY0NAotLS0gYS9mcy9mMmZzL2ZpbGUuYworKysgYi9mcy9m MmZzL2ZpbGUuYwpAQCAtMzY4NSwxOCArMzY4NSwxOCBAQCBzdGF0aWMgaW50IGYyZnNfcmVzZXJ2 ZV9jb21wcmVzc19ibG9ja3Moc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGxvbmcgYXJnKQog c3RhdGljIGludCBmMmZzX3NlY3VyZV9lcmFzZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBz dHJ1Y3QgaW5vZGUgKmlub2RlLAogCQlwZ29mZl90IG9mZiwgYmxvY2tfdCBibG9jaywgYmxvY2tf dCBsZW4sIHUzMiBmbGFncykKIHsKLQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkZXZfZ2V0 X3F1ZXVlKGJkZXYpOwogCXNlY3Rvcl90IHNlY3RvciA9IFNFQ1RPUl9GUk9NX0JMT0NLKGJsb2Nr KTsKIAlzZWN0b3JfdCBucl9zZWN0cyA9IFNFQ1RPUl9GUk9NX0JMT0NLKGxlbik7CiAJaW50IHJl dCA9IDA7CiAKLQlpZiAoIXEpCi0JCXJldHVybiAtRU5YSU87Ci0KLQlpZiAoZmxhZ3MgJiBGMkZT X1RSSU1fRklMRV9ESVNDQVJEKQotCQlyZXQgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LCBz ZWN0b3IsIG5yX3NlY3RzLCBHRlBfTk9GUywKLQkJCQkJCWJsa19xdWV1ZV9zZWN1cmVfZXJhc2Uo cSkgPwotCQkJCQkJQkxLREVWX0RJU0NBUkRfU0VDVVJFIDogMCk7CisJaWYgKGZsYWdzICYgRjJG U19UUklNX0ZJTEVfRElTQ0FSRCkgeworCQlpZiAoYmRldl9tYXhfc2VjdXJlX2VyYXNlX3NlY3Rv cnMoYmRldikpCisJCQlyZXQgPSBibGtkZXZfaXNzdWVfc2VjdXJlX2VyYXNlKGJkZXYsIHNlY3Rv ciwgbnJfc2VjdHMsCisJCQkJCUdGUF9OT0ZTKTsKKwkJZWxzZQorCQkJcmV0ID0gYmxrZGV2X2lz c3VlX2Rpc2NhcmQoYmRldiwgc2VjdG9yLCBucl9zZWN0cywKKwkJCQkJR0ZQX05PRlMpOworCX0K IAogCWlmICghcmV0ICYmIChmbGFncyAmIEYyRlNfVFJJTV9GSUxFX1pFUk9PVVQpKSB7CiAJCWlm IChJU19FTkNSWVBURUQoaW5vZGUpKQpkaWZmIC0tZ2l0IGEvZnMvZjJmcy9zZWdtZW50LmMgYi9m cy9mMmZzL3NlZ21lbnQuYwppbmRleCA3MWYwOWFkYmNiYTg2Li5lNDMzYzYxZTY0YjkzIDEwMDY0 NAotLS0gYS9mcy9mMmZzL3NlZ21lbnQuYworKysgYi9mcy9mMmZzL3NlZ21lbnQuYwpAQCAtMTI0 NCw3ICsxMjQ0LDcgQEAgc3RhdGljIGludCBfX3N1Ym1pdF9kaXNjYXJkX2NtZChzdHJ1Y3QgZjJm c19zYl9pbmZvICpzYmksCiAJCWVyciA9IF9fYmxrZGV2X2lzc3VlX2Rpc2NhcmQoYmRldiwKIAkJ CQkJU0VDVE9SX0ZST01fQkxPQ0soc3RhcnQpLAogCQkJCQlTRUNUT1JfRlJPTV9CTE9DSyhsZW4p LAotCQkJCQlHRlBfTk9GUywgMCwgJmJpbyk7CisJCQkJCUdGUF9OT0ZTLCAmYmlvKTsKIHN1Ym1p dDoKIAkJaWYgKGVycikgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRjLT5sb2NrLCBmbGFncyk7 CmRpZmYgLS1naXQgYS9mcy9qYmQyL2pvdXJuYWwuYyBiL2ZzL2piZDIvam91cm5hbC5jCmluZGV4 IDE5ZDIyNmNkNGZmNGQuLmMwY2JlZWFlYzJkMWEgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvam91cm5h bC5jCisrKyBiL2ZzL2piZDIvam91cm5hbC5jCkBAIC0xODI1LDcgKzE4MjUsNyBAQCBzdGF0aWMg aW50IF9famJkMl9qb3VybmFsX2VyYXNlKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgaW50 IGZsYWdzKQogCQkJZXJyID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQoam91cm5hbC0+al9kZXYsCiAJ CQkJCWJ5dGVfc3RhcnQgPj4gU0VDVE9SX1NISUZULAogCQkJCQlieXRlX2NvdW50ID4+IFNFQ1RP Ul9TSElGVCwKLQkJCQkJR0ZQX05PRlMsIDApOworCQkJCQlHRlBfTk9GUyk7CiAJCX0gZWxzZSBp ZiAoZmxhZ3MgJiBKQkQyX0pPVVJOQUxfRkxVU0hfWkVST09VVCkgewogCQkJZXJyID0gYmxrZGV2 X2lzc3VlX3plcm9vdXQoam91cm5hbC0+al9kZXYsCiAJCQkJCWJ5dGVfc3RhcnQgPj4gU0VDVE9S X1NISUZULApkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3N1ZmlsZS5jIGIvZnMvbmlsZnMyL3N1Zmls ZS5jCmluZGV4IGUzODVjY2EyMDA0YTcuLjc3ZmY4ZTk1NDIxZmEgMTAwNjQ0Ci0tLSBhL2ZzL25p bGZzMi9zdWZpbGUuYworKysgYi9mcy9uaWxmczIvc3VmaWxlLmMKQEAgLTExMDAsNyArMTEwMCw3 IEBAIGludCBuaWxmc19zdWZpbGVfdHJpbV9mcyhzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSwgc3RydWN0 IGZzdHJpbV9yYW5nZSAqcmFuZ2UpCiAJCQkJcmV0ID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQobmls ZnMtPm5zX2JkZXYsCiAJCQkJCQlzdGFydCAqIHNlY3RzX3Blcl9ibG9jaywKIAkJCQkJCW5ibG9j a3MgKiBzZWN0c19wZXJfYmxvY2ssCi0JCQkJCQlHRlBfTk9GUywgMCk7CisJCQkJCQlHRlBfTk9G Uyk7CiAJCQkJaWYgKHJldCA8IDApIHsKIAkJCQkJcHV0X2JoKHN1X2JoKTsKIAkJCQkJZ290byBv dXRfc2VtOwpAQCAtMTEzNCw3ICsxMTM0LDcgQEAgaW50IG5pbGZzX3N1ZmlsZV90cmltX2ZzKHN0 cnVjdCBpbm9kZSAqc3VmaWxlLCBzdHJ1Y3QgZnN0cmltX3JhbmdlICpyYW5nZSkKIAkJCXJldCA9 IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKG5pbGZzLT5uc19iZGV2LAogCQkJCQlzdGFydCAqIHNlY3Rz X3Blcl9ibG9jaywKIAkJCQkJbmJsb2NrcyAqIHNlY3RzX3Blcl9ibG9jaywKLQkJCQkJR0ZQX05P RlMsIDApOworCQkJCQlHRlBfTk9GUyk7CiAJCQlpZiAoIXJldCkKIAkJCQluZGlzY2FyZGVkICs9 IG5ibG9ja3M7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi90aGVfbmlsZnMuYyBiL2ZzL25p bGZzMi90aGVfbmlsZnMuYwppbmRleCBkZDQ4YThmNzRkNTc3Li4zYjRhMDc5Yzk2MTdjIDEwMDY0 NAotLS0gYS9mcy9uaWxmczIvdGhlX25pbGZzLmMKKysrIGIvZnMvbmlsZnMyL3RoZV9uaWxmcy5j CkBAIC02NzIsNyArNjcyLDcgQEAgaW50IG5pbGZzX2Rpc2NhcmRfc2VnbWVudHMoc3RydWN0IHRo ZV9uaWxmcyAqbmlsZnMsIF9fdTY0ICpzZWdudW1wLAogCQkJcmV0ID0gYmxrZGV2X2lzc3VlX2Rp c2NhcmQobmlsZnMtPm5zX2JkZXYsCiAJCQkJCQkgICBzdGFydCAqIHNlY3RzX3Blcl9ibG9jaywK IAkJCQkJCSAgIG5ibG9ja3MgKiBzZWN0c19wZXJfYmxvY2ssCi0JCQkJCQkgICBHRlBfTk9GUywg MCk7CisJCQkJCQkgICBHRlBfTk9GUyk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlyZXR1cm4gcmV0 OwogCQkJbmJsb2NrcyA9IDA7CkBAIC02ODIsNyArNjgyLDcgQEAgaW50IG5pbGZzX2Rpc2NhcmRf c2VnbWVudHMoc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMsIF9fdTY0ICpzZWdudW1wLAogCQlyZXQg PSBibGtkZXZfaXNzdWVfZGlzY2FyZChuaWxmcy0+bnNfYmRldiwKIAkJCQkJICAgc3RhcnQgKiBz ZWN0c19wZXJfYmxvY2ssCiAJCQkJCSAgIG5ibG9ja3MgKiBzZWN0c19wZXJfYmxvY2ssCi0JCQkJ CSAgIEdGUF9OT0ZTLCAwKTsKKwkJCQkJICAgR0ZQX05PRlMpOwogCXJldHVybiByZXQ7CiB9CiAK ZGlmZiAtLWdpdCBhL2ZzL250ZnMzL3N1cGVyLmMgYi9mcy9udGZzMy9zdXBlci5jCmluZGV4IDVm MmU0MTRjZmE3OWIuLjU3ODFiOWU4ZTNkODUgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMzL3N1cGVyLmMK KysrIGIvZnMvbnRmczMvc3VwZXIuYwpAQCAtMTMzMyw3ICsxMzMzLDcgQEAgaW50IG50ZnNfZGlz Y2FyZChzdHJ1Y3QgbnRmc19zYl9pbmZvICpzYmksIENMU1QgbGNuLCBDTFNUIGxlbikKIAkJcmV0 dXJuIDA7CiAKIAllcnIgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChzYi0+c19iZGV2LCBzdGFydCA+ PiA5LCAoZW5kIC0gc3RhcnQpID4+IDksCi0JCQkJICAgR0ZQX05PRlMsIDApOworCQkJCSAgIEdG UF9OT0ZTKTsKIAogCWlmIChlcnIgPT0gLUVPUE5PVFNVUFApCiAJCXNiaS0+ZmxhZ3MgfD0gTlRG U19GTEFHU19OT0RJU0NBUkQ7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rpc2NhcmQuYyBiL2Zz L3hmcy94ZnNfZGlzY2FyZC5jCmluZGV4IGUyYWRhMTE1YzIzZjkuLmM2ZmUzZjZlYmI2YjAgMTAw NjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlzY2FyZC5jCisrKyBiL2ZzL3hmcy94ZnNfZGlzY2FyZC5j CkBAIC0xMTQsNyArMTE0LDcgQEAgeGZzX3RyaW1fZXh0ZW50cygKIAkJfQogCiAJCXRyYWNlX3hm c19kaXNjYXJkX2V4dGVudChtcCwgYWdubywgZmJubywgZmxlbik7Ci0JCWVycm9yID0gYmxrZGV2 X2lzc3VlX2Rpc2NhcmQoYmRldiwgZGJubywgZGxlbiwgR0ZQX05PRlMsIDApOworCQllcnJvciA9 IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIGRibm8sIGRsZW4sIEdGUF9OT0ZTKTsKIAkJaWYg KGVycm9yKQogCQkJZ290byBvdXRfZGVsX2N1cnNvcjsKIAkJKmJsb2Nrc190cmltbWVkICs9IGZs ZW47CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZ19jaWwuYyBiL2ZzL3hmcy94ZnNfbG9nX2Np bC5jCmluZGV4IGJhNTczMjNiZmRjZWEuLmM5ZjU1ZTRmMDk1NzEgMTAwNjQ0Ci0tLSBhL2ZzL3hm cy94ZnNfbG9nX2NpbC5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nX2NpbC5jCkBAIC02MDUsNyArNjA1 LDcgQEAgeGxvZ19kaXNjYXJkX2J1c3lfZXh0ZW50cygKIAkJZXJyb3IgPSBfX2Jsa2Rldl9pc3N1 ZV9kaXNjYXJkKG1wLT5tX2RkZXZfdGFyZ3AtPmJ0X2JkZXYsCiAJCQkJWEZTX0FHQl9UT19EQURE UihtcCwgYnVzeXAtPmFnbm8sIGJ1c3lwLT5ibm8pLAogCQkJCVhGU19GU0JfVE9fQkIobXAsIGJ1 c3lwLT5sZW5ndGgpLAotCQkJCUdGUF9OT0ZTLCAwLCAmYmlvKTsKKwkJCQlHRlBfTk9GUywgJmJp byk7CiAJCWlmIChlcnJvciAmJiBlcnJvciAhPSAtRU9QTk9UU1VQUCkgewogCQkJeGZzX2luZm8o bXAsCiAJICJkaXNjYXJkIGZhaWxlZCBmb3IgZXh0ZW50IFsweCVsbHgsJXVdLCBlcnJvciAlZCIs CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtk ZXYuaAppbmRleCBmMWNmNTU3ZWEyMGVmLi5jOWI1OTI1YWY1YTNiIDEwMDY0NAotLS0gYS9pbmNs dWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTI0OCw2 ICsyNDgsNyBAQCBzdHJ1Y3QgcXVldWVfbGltaXRzIHsKIAl1bnNpZ25lZCBpbnQJCWlvX29wdDsK IAl1bnNpZ25lZCBpbnQJCW1heF9kaXNjYXJkX3NlY3RvcnM7CiAJdW5zaWduZWQgaW50CQltYXhf aHdfZGlzY2FyZF9zZWN0b3JzOworCXVuc2lnbmVkIGludAkJbWF4X3NlY3VyZV9lcmFzZV9zZWN0 b3JzOwogCXVuc2lnbmVkIGludAkJbWF4X3dyaXRlX3plcm9lc19zZWN0b3JzOwogCXVuc2lnbmVk IGludAkJbWF4X3pvbmVfYXBwZW5kX3NlY3RvcnM7CiAJdW5zaWduZWQgaW50CQlkaXNjYXJkX2dy YW51bGFyaXR5OwpAQCAtNTQyLDcgKzU0Myw2IEBAIHN0cnVjdCByZXF1ZXN0X3F1ZXVlIHsKICNk ZWZpbmUgUVVFVUVfRkxBR19JT19TVEFUCTcJLyogZG8gZGlzay9wYXJ0aXRpb25zIElPIGFjY291 bnRpbmcgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19OT1hNRVJHRVMJOQkvKiBObyBleHRlbmRlZCBt ZXJnZXMgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19BRERfUkFORE9NCTEwCS8qIENvbnRyaWJ1dGVz IHRvIHJhbmRvbSBwb29sICovCi0jZGVmaW5lIFFVRVVFX0ZMQUdfU0VDRVJBU0UJMTEJLyogc3Vw cG9ydHMgc2VjdXJlIGVyYXNlICovCiAjZGVmaW5lIFFVRVVFX0ZMQUdfU0FNRV9GT1JDRQkxMgkv KiBmb3JjZSBjb21wbGV0ZSBvbiBzYW1lIENQVSAqLwogI2RlZmluZSBRVUVVRV9GTEFHX0RFQUQJ CTEzCS8qIHF1ZXVlIHRlYXItZG93biBmaW5pc2hlZCAqLwogI2RlZmluZSBRVUVVRV9GTEFHX0lO SVRfRE9ORQkxNAkvKiBxdWV1ZSBpcyBpbml0aWFsaXplZCAqLwpAQCAtNTgzLDggKzU4Myw2IEBA IGJvb2wgYmxrX3F1ZXVlX2ZsYWdfdGVzdF9hbmRfc2V0KHVuc2lnbmVkIGludCBmbGFnLCBzdHJ1 Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CiAjZGVmaW5lIGJsa19xdWV1ZV9hZGRfcmFuZG9tKHEpCXRl c3RfYml0KFFVRVVFX0ZMQUdfQUREX1JBTkRPTSwgJihxKS0+cXVldWVfZmxhZ3MpCiAjZGVmaW5l IGJsa19xdWV1ZV96b25lX3Jlc2V0YWxsKHEpCVwKIAl0ZXN0X2JpdChRVUVVRV9GTEFHX1pPTkVf UkVTRVRBTEwsICYocSktPnF1ZXVlX2ZsYWdzKQotI2RlZmluZSBibGtfcXVldWVfc2VjdXJlX2Vy YXNlKHEpIFwKLQkodGVzdF9iaXQoUVVFVUVfRkxBR19TRUNFUkFTRSwgJihxKS0+cXVldWVfZmxh Z3MpKQogI2RlZmluZSBibGtfcXVldWVfZGF4KHEpCXRlc3RfYml0KFFVRVVFX0ZMQUdfREFYLCAm KHEpLT5xdWV1ZV9mbGFncykKICNkZWZpbmUgYmxrX3F1ZXVlX3BjaV9wMnBkbWEocSkJXAogCXRl c3RfYml0KFFVRVVFX0ZMQUdfUENJX1AyUERNQSwgJihxKS0+cXVldWVfZmxhZ3MpCkBAIC05NDcs NiArOTQ1LDggQEAgZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2NodW5rX3NlY3RvcnMoc3RydWN0IHJl cXVlc3RfcXVldWUgKiwgdW5zaWduZWQgaW50KTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9tYXhf c2VnbWVudHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgc2hvcnQpOwogZXh0ZXJu IHZvaWQgYmxrX3F1ZXVlX21heF9kaXNjYXJkX3NlZ21lbnRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVl ICosCiAJCXVuc2lnbmVkIHNob3J0KTsKK3ZvaWQgYmxrX3F1ZXVlX21heF9zZWN1cmVfZXJhc2Vf c2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJdW5zaWduZWQgaW50IG1heF9zZWN0 b3JzKTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9tYXhfc2VnbWVudF9zaXplKHN0cnVjdCByZXF1 ZXN0X3F1ZXVlICosIHVuc2lnbmVkIGludCk7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfbWF4X2Rp c2NhcmRfc2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKIAkJdW5zaWduZWQgaW50IG1h eF9kaXNjYXJkX3NlY3RvcnMpOwpAQCAtMTA4NywxMyArMTA4NywxMiBAQCBzdGF0aWMgaW5saW5l IGxvbmcgbnJfYmxvY2tkZXZfcGFnZXModm9pZCkKIAogZXh0ZXJuIHZvaWQgYmxrX2lvX3NjaGVk dWxlKHZvaWQpOwogCi0jZGVmaW5lIEJMS0RFVl9ESVNDQVJEX1NFQ1VSRQkoMSA8PCAwKQkvKiBp c3N1ZSBhIHNlY3VyZSBlcmFzZSAqLwotCi1leHRlcm4gaW50IGJsa2Rldl9pc3N1ZV9kaXNjYXJk KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwKLQkJc2VjdG9yX3Qg bnJfc2VjdHMsIGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiBp bnQgX19ibGtkZXZfaXNzdWVfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0 b3JfdCBzZWN0b3IsCi0JCXNlY3Rvcl90IG5yX3NlY3RzLCBnZnBfdCBnZnBfbWFzaywgaW50IGZs YWdzLAotCQlzdHJ1Y3QgYmlvICoqYmlvcCk7CitpbnQgYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc3Ry dWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3Qgc2VjdG9yLAorCQlzZWN0b3JfdCBucl9z ZWN0cywgZ2ZwX3QgZ2ZwX21hc2spOworaW50IF9fYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc3RydWN0 IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3Qgc2VjdG9yLAorCQlzZWN0b3JfdCBucl9zZWN0 cywgZ2ZwX3QgZ2ZwX21hc2ssIHN0cnVjdCBiaW8gKipiaW9wKTsKK2ludCBibGtkZXZfaXNzdWVf c2VjdXJlX2VyYXNlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwK KwkJc2VjdG9yX3QgbnJfc2VjdHMsIGdmcF90IGdmcCk7CiAKICNkZWZpbmUgQkxLREVWX1pFUk9f Tk9VTk1BUAkoMSA8PCAwKSAgLyogZG8gbm90IGZyZWUgYmxvY2tzICovCiAjZGVmaW5lIEJMS0RF Vl9aRVJPX05PRkFMTEJBQ0sJKDEgPDwgMSkgIC8qIGRvbid0IHdyaXRlIGV4cGxpY2l0IHplcm9l cyAqLwpAQCAtMTExMiw3ICsxMTExLDcgQEAgc3RhdGljIGlubGluZSBpbnQgc2JfaXNzdWVfZGlz Y2FyZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzZWN0b3JfdCBibG9jaywKIAkJCQkJICAgICAg U0VDVE9SX1NISUZUKSwKIAkJCQkgICAgbnJfYmxvY2tzIDw8IChzYi0+c19ibG9ja3NpemVfYml0 cyAtCiAJCQkJCQkgIFNFQ1RPUl9TSElGVCksCi0JCQkJICAgIGdmcF9tYXNrLCBmbGFncyk7CisJ CQkJICAgIGdmcF9tYXNrKTsKIH0KIHN0YXRpYyBpbmxpbmUgaW50IHNiX2lzc3VlX3plcm9vdXQo c3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc2VjdG9yX3QgYmxvY2ssCiAJCXNlY3Rvcl90IG5yX2Js b2NrcywgZ2ZwX3QgZ2ZwX21hc2spCkBAIC0xMjYyLDYgKzEyNjEsMTIgQEAgc3RhdGljIGlubGlu ZSB1bnNpZ25lZCBpbnQgYmRldl9kaXNjYXJkX2dyYW51bGFyaXR5KHN0cnVjdCBibG9ja19kZXZp Y2UgKmJkZXYpCiAJcmV0dXJuIGJkZXZfZ2V0X3F1ZXVlKGJkZXYpLT5saW1pdHMuZGlzY2FyZF9n cmFudWxhcml0eTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2JkZXZfbWF4X3Nl Y3VyZV9lcmFzZV9zZWN0b3JzKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJcmV0dXJu IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpLT5saW1pdHMubWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzOwor fQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBiZGV2X3dyaXRlX3plcm9lc19zZWN0b3Jz KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCiB7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEg PSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9z d2FwZmlsZS5jCmluZGV4IDVkOWNlZGY5ZTdiODQuLmEyYjMxZmVhMGM0MmUgMTAwNjQ0Ci0tLSBh L21tL3N3YXBmaWxlLmMKKysrIGIvbW0vc3dhcGZpbGUuYwpAQCAtMTc5LDcgKzE3OSw3IEBAIHN0 YXRpYyBpbnQgZGlzY2FyZF9zd2FwKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKIAlucl9i bG9ja3MgPSAoKHNlY3Rvcl90KXNlLT5ucl9wYWdlcyAtIDEpIDw8IChQQUdFX1NISUZUIC0gOSk7 CiAJaWYgKG5yX2Jsb2NrcykgewogCQllcnIgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChzaS0+YmRl diwgc3RhcnRfYmxvY2ssCi0JCQkJbnJfYmxvY2tzLCBHRlBfS0VSTkVMLCAwKTsKKwkJCQlucl9i bG9ja3MsIEdGUF9LRVJORUwpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAkJY29uZF9y ZXNjaGVkKCk7CkBAIC0xOTAsNyArMTkwLDcgQEAgc3RhdGljIGludCBkaXNjYXJkX3N3YXAoc3Ry dWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQogCQlucl9ibG9ja3MgPSAoc2VjdG9yX3Qpc2UtPm5y X3BhZ2VzIDw8IChQQUdFX1NISUZUIC0gOSk7CiAKIAkJZXJyID0gYmxrZGV2X2lzc3VlX2Rpc2Nh cmQoc2ktPmJkZXYsIHN0YXJ0X2Jsb2NrLAotCQkJCW5yX2Jsb2NrcywgR0ZQX0tFUk5FTCwgMCk7 CisJCQkJbnJfYmxvY2tzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGVycikKIAkJCWJyZWFrOwogCkBA IC0yNTQsNyArMjU0LDcgQEAgc3RhdGljIHZvaWQgZGlzY2FyZF9zd2FwX2NsdXN0ZXIoc3RydWN0 IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCQlzdGFydF9ibG9jayA8PD0gUEFHRV9TSElGVCAtIDk7 CiAJCW5yX2Jsb2NrcyA8PD0gUEFHRV9TSElGVCAtIDk7CiAJCWlmIChibGtkZXZfaXNzdWVfZGlz Y2FyZChzaS0+YmRldiwgc3RhcnRfYmxvY2ssCi0JCQkJCW5yX2Jsb2NrcywgR0ZQX05PSU8sIDAp KQorCQkJCQlucl9ibG9ja3MsIEdGUF9OT0lPKSkKIAkJCWJyZWFrOwogCiAJCXNlID0gbmV4dF9z ZShzZSk7Ci0tIAoyLjMwLjIKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fClZpcnR1YWxpemF0aW9uIG1haWxpbmcgbGlzdApWaXJ0dWFsaXphdGlvbkBsaXN0 cy5saW51eC1mb3VuZGF0aW9uLm9yZwpodHRwczovL2xpc3RzLmxpbnV4Zm91bmRhdGlvbi5vcmcv bWFpbG1hbi9saXN0aW5mby92aXJ0dWFsaXphdGlvbg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 5761EC4707A for ; Sat, 9 Apr 2022 04:52:44 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-278-0g4MMozyMTKxh_pKwJBUpQ-1; Sat, 09 Apr 2022 00:52:40 -0400 X-MC-Unique: 0g4MMozyMTKxh_pKwJBUpQ-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 9A7EA3804522; Sat, 9 Apr 2022 04:52:38 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com [10.30.29.100]) by smtp.corp.redhat.com (Postfix) with ESMTP id 813D440CFD0B; Sat, 9 Apr 2022 04:52:38 +0000 (UTC) Received: from mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (localhost [IPv6:::1]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 4D4C01940349; Sat, 9 Apr 2022 04:52:38 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx09.intmail.prod.int.rdu2.redhat.com [10.11.54.9]) by mm-prod-listman-01.mail-001.prod.us-east-1.aws.redhat.com (Postfix) with ESMTP id 91F881940349 for ; Sat, 9 Apr 2022 04:52:36 +0000 (UTC) Received: by smtp.corp.redhat.com (Postfix) id 72D6843E38B; Sat, 9 Apr 2022 04:52:36 +0000 (UTC) Received: from mimecast-mx02.redhat.com (mimecast08.extmail.prod.ext.rdu2.redhat.com [10.11.55.24]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 6E01E43E390 for ; Sat, 9 Apr 2022 04:52:36 +0000 (UTC) Received: from us-smtp-1.mimecast.com (us-smtp-2.mimecast.com [205.139.110.61]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 4FD603806736 for ; Sat, 9 Apr 2022 04:52:36 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-608-q4-ZhrYtNaiiNtJvC8BjRw-1; Sat, 09 Apr 2022 00:52:32 -0400 X-MC-Unique: q4-ZhrYtNaiiNtJvC8BjRw-1 Received: from 213-147-167-116.nat.highway.webapn.at ([213.147.167.116] helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1nd35C-0021lf-95; Sat, 09 Apr 2022 04:52:23 +0000 From: Christoph Hellwig To: Jens Axboe Date: Sat, 9 Apr 2022 06:50:42 +0200 Message-Id: <20220409045043.23593-27-hch@lst.de> In-Reply-To: <20220409045043.23593-1-hch@lst.de> References: <20220409045043.23593-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html X-Mimecast-Impersonation-Protect: Policy=CLT - Impersonation Protection Definition; Similar Internal Domain=false; Similar Monitored External Domain=false; Custom External Domain=false; Mimecast External Domain=false; Newly Observed Domain=false; Internal User Name=false; Custom Display Name List=false; Reply-to Address Mismatch=false; Targeted Threat Dictionary=false; Mimecast Threat Dictionary=false; Custom Threat Dictionary=false X-Scanned-By: MIMEDefang 2.85 on 10.11.54.9 Subject: [dm-devel] [PATCH 26/27] block: decouple REQ_OP_SECURE_ERASE from REQ_OP_DISCARD X-BeenThere: dm-devel@redhat.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: device-mapper development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: jfs-discussion@lists.sourceforge.net, linux-nvme@lists.infradead.org, virtualization@lists.linux-foundation.org, linux-mm@kvack.org, dm-devel@redhat.com, target-devel@vger.kernel.org, linux-mtd@lists.infradead.org, drbd-dev@lists.linbit.com, linux-s390@vger.kernel.org, linux-nilfs@vger.kernel.org, linux-scsi@vger.kernel.org, cluster-devel@redhat.com, xen-devel@lists.xenproject.org, linux-ext4@vger.kernel.org, linux-um@lists.infradead.org, nbd@other.debian.org, linux-block@vger.kernel.org, linux-bcache@vger.kernel.org, David Sterba , ceph-devel@vger.kernel.org, Coly Li , Ryusuke Konishi , linux-raid@vger.kernel.org, "Martin K . Petersen" , linux-mmc@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-xfs@vger.kernel.org, =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= , ocfs2-devel@oss.oracle.com, linux-fsdevel@vger.kernel.org, ntfs3@lists.linux.dev, linux-btrfs@vger.kernel.org Errors-To: dm-devel-bounces@redhat.com Sender: "dm-devel" X-Scanned-By: MIMEDefang 2.84 on 10.11.54.1 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=dm-devel-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 U2VjdXJlIGVyYXNlIGlzIGEgdmVyeSBkaWZmZXJlbnQgb3BlcmF0aW9uIGZyb20gZGlzY2FyZCBp biB0aGF0IGl0IGlzCmEgZGF0YSBpbnRlZ3JpdHkgb3BlcmF0aW9uIHZzIGhpbnQuICBGdWxseSBz cGxpdCB0aGUgbGltaXRzIGFuZCBoZWxwZXIKaW5mcmFzdHJ1Y3R1cmUgdG8gbWFrZSB0aGUgc2Vw YXJhdGlvbiBtb3JlIGNsZWFyLgoKU2lnbmVkLW9mZi1ieTogQ2hyaXN0b3BoIEhlbGx3aWcgPGhj aEBsc3QuZGU+ClJldmlld2VkLWJ5OiBNYXJ0aW4gSy4gUGV0ZXJzZW4gPG1hcnRpbi5wZXRlcnNl bkBvcmFjbGUuY29tPgpBY2tlZC1ieTogQ2hyaXN0b3BoIELDtmhtd2FsZGVyIDxjaHJpc3RvcGgu Ym9laG13YWxkZXJAbGluYml0LmNvbT4gW2RyYmRdCkFja2VkLWJ5OiBSeXVzdWtlIEtvbmlzaGkg PGtvbmlzaGkucnl1c3VrZUBnbWFpbC5jb20+IFtuaWZzMl0KQWNrZWQtYnk6IENvbHkgTGkgPGNv bHlsaUBzdXNlLmRlPiBbZHJiZF0KQWNrZWQtYnk6IERhdmlkIFN0ZXJiYSA8ZHN0ZXJiYUBzdXNl LmNvbT4gW2J0cmZzXQotLS0KIGJsb2NrL2Jsay1jb3JlLmMgICAgICAgICAgICAgICAgICAgIHwg IDIgKy0KIGJsb2NrL2Jsay1saWIuYyAgICAgICAgICAgICAgICAgICAgIHwgNjQgKysrKysrKysr KysrKysrKysrKystLS0tLS0tLS0KIGJsb2NrL2Jsay1tcS1kZWJ1Z2ZzLmMgICAgICAgICAgICAg IHwgIDEgLQogYmxvY2svYmxrLXNldHRpbmdzLmMgICAgICAgICAgICAgICAgfCAxNiArKysrKysr LQogYmxvY2svZm9wcy5jICAgICAgICAgICAgICAgICAgICAgICAgfCAgMiArLQogYmxvY2svaW9j dGwuYyAgICAgICAgICAgICAgICAgICAgICAgfCA0MyArKysrKysrKysrKysrKystLS0tCiBkcml2 ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5jICB8ICA1ICsrLQogZHJpdmVycy9ibG9jay9y bmJkL3JuYmQtY2x0LmMgICAgICAgfCAgNCArLQogZHJpdmVycy9ibG9jay9ybmJkL3JuYmQtc3J2 LWRldi5oICAgfCAgMiArLQogZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGtiYWNrLmMgfCAx NSArKystLS0tCiBkcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL3hlbmJ1cy5jICB8ICA1ICstLQog ZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYyAgICAgICAgfCAgNSArKy0KIGRyaXZlcnMvbWQv YmNhY2hlL2FsbG9jLmMgICAgICAgICAgIHwgIDIgKy0KIGRyaXZlcnMvbWQvZG0tdGFibGUuYyAg ICAgICAgICAgICAgIHwgIDggKystLQogZHJpdmVycy9tZC9kbS10aGluLmMgICAgICAgICAgICAg ICAgfCAgNCArLQogZHJpdmVycy9tZC9tZC5jICAgICAgICAgICAgICAgICAgICAgfCAgMiArLQog ZHJpdmVycy9tZC9yYWlkNS1jYWNoZS5jICAgICAgICAgICAgfCAgNiArLS0KIGRyaXZlcnMvbW1j L2NvcmUvcXVldWUuYyAgICAgICAgICAgIHwgIDIgKy0KIGRyaXZlcnMvbnZtZS90YXJnZXQvaW8t Y21kLWJkZXYuYyAgIHwgIDIgKy0KIGRyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYyAg IHwgIDIgKy0KIGRyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2libG9jay5jIHwgIDIgKy0KIGZz L2J0cmZzL2V4dGVudC10cmVlLmMgICAgICAgICAgICAgIHwgIDQgKy0KIGZzL2V4dDQvbWJhbGxv Yy5jICAgICAgICAgICAgICAgICAgIHwgIDIgKy0KIGZzL2YyZnMvZmlsZS5jICAgICAgICAgICAg ICAgICAgICAgIHwgMTYgKysrKy0tLS0KIGZzL2YyZnMvc2VnbWVudC5jICAgICAgICAgICAgICAg ICAgIHwgIDIgKy0KIGZzL2piZDIvam91cm5hbC5jICAgICAgICAgICAgICAgICAgIHwgIDIgKy0K IGZzL25pbGZzMi9zdWZpbGUuYyAgICAgICAgICAgICAgICAgIHwgIDQgKy0KIGZzL25pbGZzMi90 aGVfbmlsZnMuYyAgICAgICAgICAgICAgIHwgIDQgKy0KIGZzL250ZnMzL3N1cGVyLmMgICAgICAg ICAgICAgICAgICAgIHwgIDIgKy0KIGZzL3hmcy94ZnNfZGlzY2FyZC5jICAgICAgICAgICAgICAg IHwgIDIgKy0KIGZzL3hmcy94ZnNfbG9nX2NpbC5jICAgICAgICAgICAgICAgIHwgIDIgKy0KIGlu Y2x1ZGUvbGludXgvYmxrZGV2LmggICAgICAgICAgICAgIHwgMjcgKysrKysrKy0tLS0tCiBtbS9z d2FwZmlsZS5jICAgICAgICAgICAgICAgICAgICAgICB8ICA2ICstLQogMzMgZmlsZXMgY2hhbmdl ZCwgMTY4IGluc2VydGlvbnMoKyksIDk5IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2Jsb2Nr L2Jsay1jb3JlLmMgYi9ibG9jay9ibGstY29yZS5jCmluZGV4IGI1YzNhODA0OTEzNGMuLmVlMThi NmE2OTliZGYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jb3JlLmMKKysrIGIvYmxvY2svYmxrLWNv cmUuYwpAQCAtODI0LDcgKzgyNCw3IEBAIHZvaWQgc3VibWl0X2Jpb19ub2FjY3Qoc3RydWN0IGJp byAqYmlvKQogCQkJZ290byBub3Rfc3VwcG9ydGVkOwogCQlicmVhazsKIAljYXNlIFJFUV9PUF9T RUNVUkVfRVJBU0U6Ci0JCWlmICghYmxrX3F1ZXVlX3NlY3VyZV9lcmFzZShxKSkKKwkJaWYgKCFi ZGV2X21heF9zZWN1cmVfZXJhc2Vfc2VjdG9ycyhiZGV2KSkKIAkJCWdvdG8gbm90X3N1cHBvcnRl ZDsKIAkJYnJlYWs7CiAJY2FzZSBSRVFfT1BfWk9ORV9BUFBFTkQ6CmRpZmYgLS1naXQgYS9ibG9j ay9ibGstbGliLmMgYi9ibG9jay9ibGstbGliLmMKaW5kZXggNDNhYTRkN2ZlODU5Zi4uMDliN2Ux MjAwYzBmNCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWxpYi5jCisrKyBiL2Jsb2NrL2Jsay1saWIu YwpAQCAtMzYsMjYgKzM2LDE1IEBAIHN0YXRpYyBzZWN0b3JfdCBiaW9fZGlzY2FyZF9saW1pdChz dHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBzZWN0b3IpCiB9CiAKIGludCBfX2Js a2Rldl9pc3N1ZV9kaXNjYXJkKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNl Y3RvciwKLQkJc2VjdG9yX3QgbnJfc2VjdHMsIGdmcF90IGdmcF9tYXNrLCBpbnQgZmxhZ3MsCi0J CXN0cnVjdCBiaW8gKipiaW9wKQorCQlzZWN0b3JfdCBucl9zZWN0cywgZ2ZwX3QgZ2ZwX21hc2ss IHN0cnVjdCBiaW8gKipiaW9wKQogewotCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9n ZXRfcXVldWUoYmRldik7CiAJc3RydWN0IGJpbyAqYmlvID0gKmJpb3A7Ci0JdW5zaWduZWQgaW50 IG9wOwogCXNlY3Rvcl90IGJzX21hc2s7CiAKIAlpZiAoYmRldl9yZWFkX29ubHkoYmRldikpCiAJ CXJldHVybiAtRVBFUk07Ci0KLQlpZiAoZmxhZ3MgJiBCTEtERVZfRElTQ0FSRF9TRUNVUkUpIHsK LQkJaWYgKCFibGtfcXVldWVfc2VjdXJlX2VyYXNlKHEpKQotCQkJcmV0dXJuIC1FT1BOT1RTVVBQ OwotCQlvcCA9IFJFUV9PUF9TRUNVUkVfRVJBU0U7Ci0JfSBlbHNlIHsKLQkJaWYgKCFiZGV2X21h eF9kaXNjYXJkX3NlY3RvcnMoYmRldikpCi0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCW9wID0g UkVRX09QX0RJU0NBUkQ7Ci0JfQorCWlmICghYmRldl9tYXhfZGlzY2FyZF9zZWN0b3JzKGJkZXYp KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAkvKiBJbiBjYXNlIHRoZSBkaXNjYXJkIGdyYW51 bGFyaXR5IGlzbid0IHNldCBieSBidWdneSBkZXZpY2UgZHJpdmVyICovCiAJaWYgKFdBUk5fT05f T05DRSghYmRldl9kaXNjYXJkX2dyYW51bGFyaXR5KGJkZXYpKSkgewpAQCAtNzcsNyArNjYsNyBA QCBpbnQgX19ibGtkZXZfaXNzdWVfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBz ZWN0b3JfdCBzZWN0b3IsCiAJCXNlY3Rvcl90IHJlcV9zZWN0cyA9CiAJCQltaW4obnJfc2VjdHMs IGJpb19kaXNjYXJkX2xpbWl0KGJkZXYsIHNlY3RvcikpOwogCi0JCWJpbyA9IGJsa19uZXh0X2Jp byhiaW8sIGJkZXYsIDAsIG9wLCBnZnBfbWFzayk7CisJCWJpbyA9IGJsa19uZXh0X2JpbyhiaW8s IGJkZXYsIDAsIFJFUV9PUF9ESVNDQVJELCBnZnBfbWFzayk7CiAJCWJpby0+YmlfaXRlci5iaV9z ZWN0b3IgPSBzZWN0b3I7CiAJCWJpby0+YmlfaXRlci5iaV9zaXplID0gcmVxX3NlY3RzIDw8IDk7 CiAJCXNlY3RvciArPSByZXFfc2VjdHM7CkBAIC0xMDMsMjEgKzkyLDE5IEBAIEVYUE9SVF9TWU1C T0woX19ibGtkZXZfaXNzdWVfZGlzY2FyZCk7CiAgKiBAc2VjdG9yOglzdGFydCBzZWN0b3IKICAq IEBucl9zZWN0czoJbnVtYmVyIG9mIHNlY3RvcnMgdG8gZGlzY2FyZAogICogQGdmcF9tYXNrOglt ZW1vcnkgYWxsb2NhdGlvbiBmbGFncyAoZm9yIGJpb19hbGxvYykKLSAqIEBmbGFnczoJQkxLREVW X0RJU0NBUkRfKiBmbGFncyB0byBjb250cm9sIGJlaGF2aW91cgogICoKICAqIERlc2NyaXB0aW9u OgogICogICAgSXNzdWUgYSBkaXNjYXJkIHJlcXVlc3QgZm9yIHRoZSBzZWN0b3JzIGluIHF1ZXN0 aW9uLgogICovCiBpbnQgYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc3RydWN0IGJsb2NrX2RldmljZSAq YmRldiwgc2VjdG9yX3Qgc2VjdG9yLAotCQlzZWN0b3JfdCBucl9zZWN0cywgZ2ZwX3QgZ2ZwX21h c2ssIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJCXNlY3Rvcl90IG5yX3NlY3RzLCBnZnBfdCBnZnBf bWFzaykKIHsKIAlzdHJ1Y3QgYmlvICpiaW8gPSBOVUxMOwogCXN0cnVjdCBibGtfcGx1ZyBwbHVn OwogCWludCByZXQ7CiAKIAlibGtfc3RhcnRfcGx1ZygmcGx1Zyk7Ci0JcmV0ID0gX19ibGtkZXZf aXNzdWVfZGlzY2FyZChiZGV2LCBzZWN0b3IsIG5yX3NlY3RzLCBnZnBfbWFzaywgZmxhZ3MsCi0J CQkmYmlvKTsKKwlyZXQgPSBfX2Jsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHNlY3RvciwgbnJf c2VjdHMsIGdmcF9tYXNrLCAmYmlvKTsKIAlpZiAoIXJldCAmJiBiaW8pIHsKIAkJcmV0ID0gc3Vi bWl0X2Jpb193YWl0KGJpbyk7CiAJCWlmIChyZXQgPT0gLUVPUE5PVFNVUFApCkBAIC0zMTQsMyAr MzAxLDQyIEBAIGludCBibGtkZXZfaXNzdWVfemVyb291dChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpi ZGV2LCBzZWN0b3JfdCBzZWN0b3IsCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woYmxr ZGV2X2lzc3VlX3plcm9vdXQpOworCitpbnQgYmxrZGV2X2lzc3VlX3NlY3VyZV9lcmFzZShzdHJ1 Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBzZWN0b3IsCisJCXNlY3Rvcl90IG5yX3Nl Y3RzLCBnZnBfdCBnZnApCit7CisJc2VjdG9yX3QgYnNfbWFzayA9IChiZGV2X2xvZ2ljYWxfYmxv Y2tfc2l6ZShiZGV2KSA+PiA5KSAtIDE7CisJdW5zaWduZWQgaW50IG1heF9zZWN0b3JzID0gYmRl dl9tYXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMoYmRldik7CisJc3RydWN0IGJpbyAqYmlvID0gTlVM TDsKKwlzdHJ1Y3QgYmxrX3BsdWcgcGx1ZzsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChtYXhfc2Vj dG9ycyA9PSAwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKChzZWN0b3IgfCBucl9zZWN0 cykgJiBic19tYXNrKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYmRldl9yZWFkX29ubHkoYmRl dikpCisJCXJldHVybiAtRVBFUk07CisKKwlibGtfc3RhcnRfcGx1ZygmcGx1Zyk7CisJZm9yICg7 OykgeworCQl1bnNpZ25lZCBpbnQgbGVuID0gbWluX3Qoc2VjdG9yX3QsIG5yX3NlY3RzLCBtYXhf c2VjdG9ycyk7CisKKwkJYmlvID0gYmxrX25leHRfYmlvKGJpbywgYmRldiwgMCwgUkVRX09QX1NF Q1VSRV9FUkFTRSwgZ2ZwKTsKKwkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IHNlY3RvcjsKKwkJ YmlvLT5iaV9pdGVyLmJpX3NpemUgPSBsZW47CisKKwkJc2VjdG9yICs9IGxlbiA8PCBTRUNUT1Jf U0hJRlQ7CisJCW5yX3NlY3RzIC09IGxlbiA8PCBTRUNUT1JfU0hJRlQ7CisJCWlmICghbnJfc2Vj dHMpIHsKKwkJCXJldCA9IHN1Ym1pdF9iaW9fd2FpdChiaW8pOworCQkJYmlvX3B1dChiaW8pOwor CQkJYnJlYWs7CisJCX0KKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCWJsa19maW5pc2hfcGx1Zygm cGx1Zyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChibGtkZXZfaXNzdWVfc2Vj dXJlX2VyYXNlKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS1kZWJ1Z2ZzLmMgYi9ibG9jay9i bGstbXEtZGVidWdmcy5jCmluZGV4IGZkMTExYzUwMDEyNTYuLjdlNDEzNmE2MGUxY2MgMTAwNjQ0 Ci0tLSBhL2Jsb2NrL2Jsay1tcS1kZWJ1Z2ZzLmMKKysrIGIvYmxvY2svYmxrLW1xLWRlYnVnZnMu YwpAQCAtMTE1LDcgKzExNSw2IEBAIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBibGtfcXVldWVf ZmxhZ19uYW1lW10gPSB7CiAJUVVFVUVfRkxBR19OQU1FKElPX1NUQVQpLAogCVFVRVVFX0ZMQUdf TkFNRShOT1hNRVJHRVMpLAogCVFVRVVFX0ZMQUdfTkFNRShBRERfUkFORE9NKSwKLQlRVUVVRV9G TEFHX05BTUUoU0VDRVJBU0UpLAogCVFVRVVFX0ZMQUdfTkFNRShTQU1FX0ZPUkNFKSwKIAlRVUVV RV9GTEFHX05BTUUoREVBRCksCiAJUVVFVUVfRkxBR19OQU1FKElOSVRfRE9ORSksCmRpZmYgLS1n aXQgYS9ibG9jay9ibGstc2V0dGluZ3MuYyBiL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCmluZGV4IGZk ODNkNjc0YWZkMGEuLjZjY2NlYjQyMWVkMmYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1zZXR0aW5n cy5jCisrKyBiL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCkBAIC00Niw2ICs0Niw3IEBAIHZvaWQgYmxr X3NldF9kZWZhdWx0X2xpbWl0cyhzdHJ1Y3QgcXVldWVfbGltaXRzICpsaW0pCiAJbGltLT5tYXhf em9uZV9hcHBlbmRfc2VjdG9ycyA9IDA7CiAJbGltLT5tYXhfZGlzY2FyZF9zZWN0b3JzID0gMDsK IAlsaW0tPm1heF9od19kaXNjYXJkX3NlY3RvcnMgPSAwOworCWxpbS0+bWF4X3NlY3VyZV9lcmFz ZV9zZWN0b3JzID0gMDsKIAlsaW0tPmRpc2NhcmRfZ3JhbnVsYXJpdHkgPSAwOwogCWxpbS0+ZGlz Y2FyZF9hbGlnbm1lbnQgPSAwOwogCWxpbS0+ZGlzY2FyZF9taXNhbGlnbmVkID0gMDsKQEAgLTE3 Niw2ICsxNzcsMTggQEAgdm9pZCBibGtfcXVldWVfbWF4X2Rpc2NhcmRfc2VjdG9ycyhzdHJ1Y3Qg cmVxdWVzdF9xdWV1ZSAqcSwKIH0KIEVYUE9SVF9TWU1CT0woYmxrX3F1ZXVlX21heF9kaXNjYXJk X3NlY3RvcnMpOwogCisvKioKKyAqIGJsa19xdWV1ZV9tYXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMg LSBzZXQgbWF4IHNlY3RvcnMgZm9yIGEgc2VjdXJlIGVyYXNlCisgKiBAcTogIHRoZSByZXF1ZXN0 IHF1ZXVlIGZvciB0aGUgZGV2aWNlCisgKiBAbWF4X3NlY3RvcnM6IG1heGltdW0gbnVtYmVyIG9m IHNlY3RvcnMgdG8gc2VjdXJlX2VyYXNlCisgKiovCit2b2lkIGJsa19xdWV1ZV9tYXhfc2VjdXJl X2VyYXNlX3NlY3RvcnMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCXVuc2lnbmVkIGludCBt YXhfc2VjdG9ycykKK3sKKwlxLT5saW1pdHMubWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzID0gbWF4 X3NlY3RvcnM7Cit9CitFWFBPUlRfU1lNQk9MKGJsa19xdWV1ZV9tYXhfc2VjdXJlX2VyYXNlX3Nl Y3RvcnMpOworCiAvKioKICAqIGJsa19xdWV1ZV9tYXhfd3JpdGVfemVyb2VzX3NlY3RvcnMgLSBz ZXQgbWF4IHNlY3RvcnMgZm9yIGEgc2luZ2xlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgd3JpdGUgemVyb2VzCkBAIC02NjEsNyArNjc0LDggQEAgaW50IGJsa19zdGFj a19saW1pdHMoc3RydWN0IHF1ZXVlX2xpbWl0cyAqdCwgc3RydWN0IHF1ZXVlX2xpbWl0cyAqYiwK IAkJdC0+ZGlzY2FyZF9hbGlnbm1lbnQgPSBsY21fbm90X3plcm8odC0+ZGlzY2FyZF9hbGlnbm1l bnQsIGFsaWdubWVudCkgJQogCQkJdC0+ZGlzY2FyZF9ncmFudWxhcml0eTsKIAl9Ci0KKwl0LT5t YXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMgPSBtaW5fbm90X3plcm8odC0+bWF4X3NlY3VyZV9lcmFz ZV9zZWN0b3JzLAorCQkJCQkJICAgYi0+bWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzKTsKIAl0LT56 b25lX3dyaXRlX2dyYW51bGFyaXR5ID0gbWF4KHQtPnpvbmVfd3JpdGVfZ3JhbnVsYXJpdHksCiAJ CQkJCWItPnpvbmVfd3JpdGVfZ3JhbnVsYXJpdHkpOwogCXQtPnpvbmVkID0gbWF4KHQtPnpvbmVk LCBiLT56b25lZCk7CmRpZmYgLS1naXQgYS9ibG9jay9mb3BzLmMgYi9ibG9jay9mb3BzLmMKaW5k ZXggOWYyZWNlYzQwNmIwNC4uYzBjYTMyNTRkMzhjZiAxMDA2NDQKLS0tIGEvYmxvY2svZm9wcy5j CisrKyBiL2Jsb2NrL2ZvcHMuYwpAQCAtNjcyLDcgKzY3Miw3IEBAIHN0YXRpYyBsb25nIGJsa2Rl dl9mYWxsb2NhdGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCBtb2RlLCBsb2ZmX3Qgc3RhcnQsCiAJ CWJyZWFrOwogCWNhc2UgRkFMTE9DX0ZMX1BVTkNIX0hPTEUgfCBGQUxMT0NfRkxfS0VFUF9TSVpF IHwgRkFMTE9DX0ZMX05PX0hJREVfU1RBTEU6CiAJCWVycm9yID0gYmxrZGV2X2lzc3VlX2Rpc2Nh cmQoYmRldiwgc3RhcnQgPj4gU0VDVE9SX1NISUZULAotCQkJCQkgICAgIGxlbiA+PiBTRUNUT1Jf U0hJRlQsIEdGUF9LRVJORUwsIDApOworCQkJCQkgICAgIGxlbiA+PiBTRUNUT1JfU0hJRlQsIEdG UF9LRVJORUwpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQllcnJvciA9IC1FT1BOT1RTVVBQOwpk aWZmIC0tZ2l0IGEvYmxvY2svaW9jdGwuYyBiL2Jsb2NrL2lvY3RsLmMKaW5kZXggYzJjZDNiYTUy OTBjZS4uNWI1MDI3ZmE3OGY3ZSAxMDA2NDQKLS0tIGEvYmxvY2svaW9jdGwuYworKysgYi9ibG9j ay9pb2N0bC5jCkBAIC04Myw3ICs4Myw3IEBAIHN0YXRpYyBpbnQgY29tcGF0X2Jsa3BnX2lvY3Rs KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAjZW5kaWYKIAogc3RhdGljIGludCBibGtfaW9j dGxfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUsCi0JCXVu c2lnbmVkIGxvbmcgYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCQl1bnNpZ25lZCBsb25nIGFy ZykKIHsKIAl1aW50NjRfdCByYW5nZVsyXTsKIAl1aW50NjRfdCBzdGFydCwgbGVuOwpAQCAtMTE0 LDE1ICsxMTQsNDMgQEAgc3RhdGljIGludCBibGtfaW9jdGxfZGlzY2FyZChzdHJ1Y3QgYmxvY2tf ZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUsCiAJZXJyID0gdHJ1bmNhdGVfYmRldl9yYW5nZShi ZGV2LCBtb2RlLCBzdGFydCwgc3RhcnQgKyBsZW4gLSAxKTsKIAlpZiAoZXJyKQogCQlnb3RvIGZh aWw7Ci0KLQllcnIgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LCBzdGFydCA+PiA5LCBsZW4g Pj4gOSwKLQkJCQkgICBHRlBfS0VSTkVMLCBmbGFncyk7Ci0KKwllcnIgPSBibGtkZXZfaXNzdWVf ZGlzY2FyZChiZGV2LCBzdGFydCA+PiA5LCBsZW4gPj4gOSwgR0ZQX0tFUk5FTCk7CiBmYWlsOgog CWZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtPmlfbWFwcGluZyk7CiAJcmV0dXJuIGVy cjsKIH0KIAorc3RhdGljIGludCBibGtfaW9jdGxfc2VjdXJlX2VyYXNlKHN0cnVjdCBibG9ja19k ZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSwKKwkJdm9pZCBfX3VzZXIgKmFyZ3ApCit7CisJdWlu dDY0X3Qgc3RhcnQsIGxlbjsKKwl1aW50NjRfdCByYW5nZVsyXTsKKwlpbnQgZXJyOworCisJaWYg KCEobW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJcmV0dXJuIC1FQkFERjsKKwlpZiAoIWJkZXZfbWF4 X3NlY3VyZV9lcmFzZV9zZWN0b3JzKGJkZXYpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYg KGNvcHlfZnJvbV91c2VyKHJhbmdlLCBhcmdwLCBzaXplb2YocmFuZ2UpKSkKKwkJcmV0dXJuIC1F RkFVTFQ7CisKKwlzdGFydCA9IHJhbmdlWzBdOworCWxlbiA9IHJhbmdlWzFdOworCWlmICgoc3Rh cnQgJiA1MTEpIHx8IChsZW4gJiA1MTEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RhcnQg KyBsZW4gPiBiZGV2X25yX2J5dGVzKGJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZpbGVt YXBfaW52YWxpZGF0ZV9sb2NrKGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOworCWVyciA9IHRy dW5jYXRlX2JkZXZfcmFuZ2UoYmRldiwgbW9kZSwgc3RhcnQsIHN0YXJ0ICsgbGVuIC0gMSk7CisJ aWYgKCFlcnIpCisJCWVyciA9IGJsa2Rldl9pc3N1ZV9zZWN1cmVfZXJhc2UoYmRldiwgc3RhcnQg Pj4gOSwgbGVuID4+IDksCisJCQkJCQlHRlBfS0VSTkVMKTsKKwlmaWxlbWFwX2ludmFsaWRhdGVf dW5sb2NrKGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOworCXJldHVybiBlcnI7Cit9CisKKwog c3RhdGljIGludCBibGtfaW9jdGxfemVyb291dChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBm bW9kZV90IG1vZGUsCiAJCXVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtNDUwLDEwICs0NzgsOSBA QCBzdGF0aWMgaW50IGJsa2Rldl9jb21tb25faW9jdGwoc3RydWN0IGJsb2NrX2RldmljZSAqYmRl diwgZm1vZGVfdCBtb2RlLAogCWNhc2UgQkxLUk9TRVQ6CiAJCXJldHVybiBibGtkZXZfcm9zZXQo YmRldiwgbW9kZSwgY21kLCBhcmcpOwogCWNhc2UgQkxLRElTQ0FSRDoKLQkJcmV0dXJuIGJsa19p b2N0bF9kaXNjYXJkKGJkZXYsIG1vZGUsIGFyZywgMCk7CisJCXJldHVybiBibGtfaW9jdGxfZGlz Y2FyZChiZGV2LCBtb2RlLCBhcmcpOwogCWNhc2UgQkxLU0VDRElTQ0FSRDoKLQkJcmV0dXJuIGJs a19pb2N0bF9kaXNjYXJkKGJkZXYsIG1vZGUsIGFyZywKLQkJCQlCTEtERVZfRElTQ0FSRF9TRUNV UkUpOworCQlyZXR1cm4gYmxrX2lvY3RsX3NlY3VyZV9lcmFzZShiZGV2LCBtb2RlLCBhcmdwKTsK IAljYXNlIEJMS1pFUk9PVVQ6CiAJCXJldHVybiBibGtfaW9jdGxfemVyb291dChiZGV2LCBtb2Rl LCBhcmcpOwogCWNhc2UgQkxLR0VURElTS1NFUToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sv ZHJiZC9kcmJkX3JlY2VpdmVyLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5j CmluZGV4IDI3NWM1M2M3YjYyOWUuLjI5NTdiMGI2OGQ2MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMv YmxvY2svZHJiZC9kcmJkX3JlY2VpdmVyLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRf cmVjZWl2ZXIuYwpAQCAtMTU0Nyw3ICsxNTQ3LDggQEAgaW50IGRyYmRfaXNzdWVfZGlzY2FyZF9v cl96ZXJvX291dChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc3RhcnQsIHUK IAkJc3RhcnQgPSB0bXA7CiAJfQogCXdoaWxlIChucl9zZWN0b3JzID49IG1heF9kaXNjYXJkX3Nl Y3RvcnMpIHsKLQkJZXJyIHw9IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHN0YXJ0LCBtYXhf ZGlzY2FyZF9zZWN0b3JzLCBHRlBfTk9JTywgMCk7CisJCWVyciB8PSBibGtkZXZfaXNzdWVfZGlz Y2FyZChiZGV2LCBzdGFydCwgbWF4X2Rpc2NhcmRfc2VjdG9ycywKKwkJCQkJICAgIEdGUF9OT0lP KTsKIAkJbnJfc2VjdG9ycyAtPSBtYXhfZGlzY2FyZF9zZWN0b3JzOwogCQlzdGFydCArPSBtYXhf ZGlzY2FyZF9zZWN0b3JzOwogCX0KQEAgLTE1NTksNyArMTU2MCw3IEBAIGludCBkcmJkX2lzc3Vl X2Rpc2NhcmRfb3JfemVyb19vdXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90 IHN0YXJ0LCB1CiAJCW5yID0gbnJfc2VjdG9yczsKIAkJbnIgLT0gKHVuc2lnbmVkIGludCluciAl IGdyYW51bGFyaXR5OwogCQlpZiAobnIpIHsKLQkJCWVyciB8PSBibGtkZXZfaXNzdWVfZGlzY2Fy ZChiZGV2LCBzdGFydCwgbnIsIEdGUF9OT0lPLCAwKTsKKwkJCWVyciB8PSBibGtkZXZfaXNzdWVf ZGlzY2FyZChiZGV2LCBzdGFydCwgbnIsIEdGUF9OT0lPKTsKIAkJCW5yX3NlY3RvcnMgLT0gbnI7 CiAJCQlzdGFydCArPSBucjsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9ybmJkL3Ju YmQtY2x0LmMgYi9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1jbHQuYwppbmRleCBlZmE5OWEzODg0 NTA3Li5kMTc4YmUxNzVhZDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1j bHQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1jbHQuYwpAQCAtMTM2NSw4ICsxMzY1 LDggQEAgc3RhdGljIHZvaWQgc2V0dXBfcmVxdWVzdF9xdWV1ZShzdHJ1Y3Qgcm5iZF9jbHRfZGV2 ICpkZXYpCiAJZGV2LT5xdWV1ZS0+bGltaXRzLmRpc2NhcmRfZ3JhbnVsYXJpdHkJPSBkZXYtPmRp c2NhcmRfZ3JhbnVsYXJpdHk7CiAJZGV2LT5xdWV1ZS0+bGltaXRzLmRpc2NhcmRfYWxpZ25tZW50 CT0gZGV2LT5kaXNjYXJkX2FsaWdubWVudDsKIAlpZiAoZGV2LT5zZWN1cmVfZGlzY2FyZCkKLQkJ YmxrX3F1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfU0VDRVJBU0UsIGRldi0+cXVldWUpOwotCisJ CWJsa19xdWV1ZV9tYXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMoZGV2LT5xdWV1ZSwKKwkJCQlkZXYt Pm1heF9kaXNjYXJkX3NlY3RvcnMpOwogCWJsa19xdWV1ZV9mbGFnX3NldChRVUVVRV9GTEFHX1NB TUVfQ09NUCwgZGV2LT5xdWV1ZSk7CiAJYmxrX3F1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfU0FN RV9GT1JDRSwgZGV2LT5xdWV1ZSk7CiAJYmxrX3F1ZXVlX21heF9zZWdtZW50cyhkZXYtPnF1ZXVl LCBkZXYtPm1heF9zZWdtZW50cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5i ZC1zcnYtZGV2LmggYi9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1zcnYtZGV2LmgKaW5kZXggMWY3 ZTFjOGZkNGQ5Yi4uZDA4MGEwZGU1OTIyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9ybmJk L3JuYmQtc3J2LWRldi5oCisrKyBiL2RyaXZlcnMvYmxvY2svcm5iZC9ybmJkLXNydi1kZXYuaApA QCAtNDQsNyArNDQsNyBAQCBzdGF0aWMgaW5saW5lIGludCBybmJkX2Rldl9nZXRfbWF4X2h3X3Nl Y3RzKGNvbnN0IHN0cnVjdCBybmJkX2RldiAqZGV2KQogCiBzdGF0aWMgaW5saW5lIGludCBybmJk X2Rldl9nZXRfc2VjdXJlX2Rpc2NhcmQoY29uc3Qgc3RydWN0IHJuYmRfZGV2ICpkZXYpCiB7Ci0J cmV0dXJuIGJsa19xdWV1ZV9zZWN1cmVfZXJhc2UoYmRldl9nZXRfcXVldWUoZGV2LT5iZGV2KSk7 CisJcmV0dXJuIGJkZXZfbWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzKGRldi0+YmRldik7CiB9CiAK IHN0YXRpYyBpbmxpbmUgaW50IHJuYmRfZGV2X2dldF9tYXhfZGlzY2FyZF9zZWN0cyhjb25zdCBz dHJ1Y3Qgcm5iZF9kZXYgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Jh Y2svYmxrYmFjay5jIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGtiYWNrLmMKaW5kZXgg ZGU0MjQ1ODE5NWJjMS4uYTk3ZjJiZjViMDFiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay94 ZW4tYmxrYmFjay9ibGtiYWNrLmMKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGti YWNrLmMKQEAgLTk3MCw3ICs5NzAsNiBAQCBzdGF0aWMgaW50IGRpc3BhdGNoX2Rpc2NhcmRfaW8o c3RydWN0IHhlbl9ibGtpZl9yaW5nICpyaW5nLAogCWludCBzdGF0dXMgPSBCTEtJRl9SU1BfT0tB WTsKIAlzdHJ1Y3QgeGVuX2Jsa2lmICpibGtpZiA9IHJpbmctPmJsa2lmOwogCXN0cnVjdCBibG9j a19kZXZpY2UgKmJkZXYgPSBibGtpZi0+dmJkLmJkZXY7Ci0JdW5zaWduZWQgbG9uZyBzZWN1cmU7 CiAJc3RydWN0IHBoeXNfcmVxIHByZXE7CiAKIAl4ZW5fYmxraWZfZ2V0KGJsa2lmKTsKQEAgLTk4 NywxMyArOTg2LDE1IEBAIHN0YXRpYyBpbnQgZGlzcGF0Y2hfZGlzY2FyZF9pbyhzdHJ1Y3QgeGVu X2Jsa2lmX3JpbmcgKnJpbmcsCiAJfQogCXJpbmctPnN0X2RzX3JlcSsrOwogCi0Jc2VjdXJlID0g KGJsa2lmLT52YmQuZGlzY2FyZF9zZWN1cmUgJiYKLQkJIChyZXEtPnUuZGlzY2FyZC5mbGFnICYg QkxLSUZfRElTQ0FSRF9TRUNVUkUpKSA/Ci0JCSBCTEtERVZfRElTQ0FSRF9TRUNVUkUgOiAwOwor CWlmIChibGtpZi0+dmJkLmRpc2NhcmRfc2VjdXJlICYmCisJICAgIChyZXEtPnUuZGlzY2FyZC5m bGFnICYgQkxLSUZfRElTQ0FSRF9TRUNVUkUpKQorCQllcnIgPSBibGtkZXZfaXNzdWVfc2VjdXJl X2VyYXNlKGJkZXYsCisJCQkJcmVxLT51LmRpc2NhcmQuc2VjdG9yX251bWJlciwKKwkJCQlyZXEt PnUuZGlzY2FyZC5ucl9zZWN0b3JzLCBHRlBfS0VSTkVMKTsKKwllbHNlCisJCWVyciA9IGJsa2Rl dl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHJlcS0+dS5kaXNjYXJkLnNlY3Rvcl9udW1iZXIsCisJCQkJ cmVxLT51LmRpc2NhcmQubnJfc2VjdG9ycywgR0ZQX0tFUk5FTCk7CiAKLQllcnIgPSBibGtkZXZf aXNzdWVfZGlzY2FyZChiZGV2LCByZXEtPnUuZGlzY2FyZC5zZWN0b3JfbnVtYmVyLAotCQkJCSAg IHJlcS0+dS5kaXNjYXJkLm5yX3NlY3RvcnMsCi0JCQkJICAgR0ZQX0tFUk5FTCwgc2VjdXJlKTsK IGZhaWxfcmVzcG9uc2U6CiAJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkgewogCQlwcl9kZWJ1Zygi ZGlzY2FyZCBvcCBmYWlsZWQsIG5vdCBzdXBwb3J0ZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2sv eGVuYnVzLmMKaW5kZXggODNjZDA4MDQxZTZiMy4uYjIxYmZmYzljNTBiYyAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hl bi1ibGtiYWNrL3hlbmJ1cy5jCkBAIC00ODQsNyArNDg0LDYgQEAgc3RhdGljIGludCB4ZW5fdmJk X2NyZWF0ZShzdHJ1Y3QgeGVuX2Jsa2lmICpibGtpZiwgYmxraWZfdmRldl90IGhhbmRsZSwKIHsK IAlzdHJ1Y3QgeGVuX3ZiZCAqdmJkOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7Ci0Jc3Ry dWN0IHJlcXVlc3RfcXVldWUgKnE7CiAKIAl2YmQgPSAmYmxraWYtPnZiZDsKIAl2YmQtPmhhbmRs ZSAgID0gaGFuZGxlOwpAQCAtNTE2LDExICs1MTUsOSBAQCBzdGF0aWMgaW50IHhlbl92YmRfY3Jl YXRlKHN0cnVjdCB4ZW5fYmxraWYgKmJsa2lmLCBibGtpZl92ZGV2X3QgaGFuZGxlLAogCWlmICh2 YmQtPmJkZXYtPmJkX2Rpc2stPmZsYWdzICYgR0VOSERfRkxfUkVNT1ZBQkxFKQogCQl2YmQtPnR5 cGUgfD0gVkRJU0tfUkVNT1ZBQkxFOwogCi0JcSA9IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpOwogCWlm IChiZGV2X3dyaXRlX2NhY2hlKGJkZXYpKQogCQl2YmQtPmZsdXNoX3N1cHBvcnQgPSB0cnVlOwot Ci0JaWYgKHEgJiYgYmxrX3F1ZXVlX3NlY3VyZV9lcmFzZShxKSkKKwlpZiAoYmRldl9tYXhfc2Vj dXJlX2VyYXNlX3NlY3RvcnMoYmRldikpCiAJCXZiZC0+ZGlzY2FyZF9zZWN1cmUgPSB0cnVlOwog CiAJdmJkLT5mZWF0dXJlX2dudF9wZXJzaXN0ZW50ID0gZmVhdHVyZV9wZXJzaXN0ZW50OwpkaWZm IC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYyBiL2RyaXZlcnMvYmxvY2sveGVu LWJsa2Zyb250LmMKaW5kZXggMjUzYmY4MzVhY2ExZi4uOWZiN2M2OWY3MmIyZCAxMDA2NDQKLS0t IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hlbi1i bGtmcm9udC5jCkBAIC05NDksNyArOTQ5LDggQEAgc3RhdGljIHZvaWQgYmxraWZfc2V0X3F1ZXVl X2xpbWl0cyhzdHJ1Y3QgYmxrZnJvbnRfaW5mbyAqaW5mbykKIAkJCQkJCSBpbmZvLT5waHlzaWNh bF9zZWN0b3Jfc2l6ZTsKIAkJcnEtPmxpbWl0cy5kaXNjYXJkX2FsaWdubWVudCA9IGluZm8tPmRp c2NhcmRfYWxpZ25tZW50OwogCQlpZiAoaW5mby0+ZmVhdHVyZV9zZWNkaXNjYXJkKQotCQkJYmxr X3F1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfU0VDRVJBU0UsIHJxKTsKKwkJCWJsa19xdWV1ZV9t YXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMocnEsCisJCQkJCQkJICAgZ2V0X2NhcGFjaXR5KGdkKSk7 CiAJfQogCiAJLyogSGFyZCBzZWN0b3Igc2l6ZSBhbmQgbWF4IHNlY3RvcnMgaW1wZXJzb25hdGUg dGhlIGVxdWl2LiBoYXJkd2FyZS4gKi8KQEAgLTE2MDUsNyArMTYwNiw3IEBAIHN0YXRpYyBpcnFy ZXR1cm5fdCBibGtpZl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogCQkJCWJsa2lm X3JlcShyZXEpLT5lcnJvciA9IEJMS19TVFNfTk9UU1VQUDsKIAkJCQlpbmZvLT5mZWF0dXJlX2Rp c2NhcmQgPSAwOwogCQkJCWluZm8tPmZlYXR1cmVfc2VjZGlzY2FyZCA9IDA7Ci0JCQkJYmxrX3F1 ZXVlX2ZsYWdfY2xlYXIoUVVFVUVfRkxBR19TRUNFUkFTRSwgcnEpOworCQkJCWJsa19xdWV1ZV9t YXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMocnEsIDApOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2Ug QkxLSUZfT1BfRkxVU0hfRElTS0NBQ0hFOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUv YWxsb2MuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL2FsbG9jLmMKaW5kZXggMDk3NTc3YWUzYzQ3MS4u Y2UxM2MyNzJjMzg3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvYWxsb2MuYworKysg Yi9kcml2ZXJzL21kL2JjYWNoZS9hbGxvYy5jCkBAIC0zMzYsNyArMzM2LDcgQEAgc3RhdGljIGlu dCBiY2hfYWxsb2NhdG9yX3RocmVhZCh2b2lkICphcmcpCiAJCQkJbXV0ZXhfdW5sb2NrKCZjYS0+ c2V0LT5idWNrZXRfbG9jayk7CiAJCQkJYmxrZGV2X2lzc3VlX2Rpc2NhcmQoY2EtPmJkZXYsCiAJ CQkJCWJ1Y2tldF90b19zZWN0b3IoY2EtPnNldCwgYnVja2V0KSwKLQkJCQkJY2EtPnNiLmJ1Y2tl dF9zaXplLCBHRlBfS0VSTkVMLCAwKTsKKwkJCQkJY2EtPnNiLmJ1Y2tldF9zaXplLCBHRlBfS0VS TkVMKTsKIAkJCQltdXRleF9sb2NrKCZjYS0+c2V0LT5idWNrZXRfbG9jayk7CiAJCQl9CiAKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYyBiL2RyaXZlcnMvbWQvZG0tdGFibGUuYwpp bmRleCAwZGZmNjkwN2ZkMDBkLi5lN2Q0MmY2MzM1YTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21k L2RtLXRhYmxlLmMKKysrIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCkBAIC0xOTIwLDkgKzE5MjAs NyBAQCBzdGF0aWMgaW50IGRldmljZV9ub3Rfc2VjdXJlX2VyYXNlX2NhcGFibGUoc3RydWN0IGRt X3RhcmdldCAqdGksCiAJCQkJCSAgIHN0cnVjdCBkbV9kZXYgKmRldiwgc2VjdG9yX3Qgc3RhcnQs CiAJCQkJCSAgIHNlY3Rvcl90IGxlbiwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgcmVxdWVzdF9x dWV1ZSAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGRldi0+YmRldik7Ci0KLQlyZXR1cm4gIWJsa19xdWV1 ZV9zZWN1cmVfZXJhc2UocSk7CisJcmV0dXJuICFiZGV2X21heF9zZWN1cmVfZXJhc2Vfc2VjdG9y cyhkZXYtPmJkZXYpOwogfQogCiBzdGF0aWMgYm9vbCBkbV90YWJsZV9zdXBwb3J0c19zZWN1cmVf ZXJhc2Uoc3RydWN0IGRtX3RhYmxlICp0KQpAQCAtMTk3NSw4ICsxOTczLDggQEAgaW50IGRtX3Rh YmxlX3NldF9yZXN0cmljdGlvbnMoc3RydWN0IGRtX3RhYmxlICp0LCBzdHJ1Y3QgcmVxdWVzdF9x dWV1ZSAqcSwKIAkJcS0+bGltaXRzLmRpc2NhcmRfbWlzYWxpZ25lZCA9IDA7CiAJfQogCi0JaWYg KGRtX3RhYmxlX3N1cHBvcnRzX3NlY3VyZV9lcmFzZSh0KSkKLQkJYmxrX3F1ZXVlX2ZsYWdfc2V0 KFFVRVVFX0ZMQUdfU0VDRVJBU0UsIHEpOworCWlmICghZG1fdGFibGVfc3VwcG9ydHNfc2VjdXJl X2VyYXNlKHQpKQorCQlxLT5saW1pdHMubWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzID0gMDsKIAog CWlmIChkbV90YWJsZV9zdXBwb3J0c19mbHVzaCh0LCAoMVVMIDw8IFFVRVVFX0ZMQUdfV0MpKSkg ewogCQl3YyA9IHRydWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXRoaW4uYyBiL2RyaXZl cnMvbWQvZG0tdGhpbi5jCmluZGV4IGVkZWQ0YmNjNDU0NWYuLjg0YzA4M2Y3NjY3MzYgMTAwNjQ0 Ci0tLSBhL2RyaXZlcnMvbWQvZG0tdGhpbi5jCisrKyBiL2RyaXZlcnMvbWQvZG0tdGhpbi5jCkBA IC0zOTgsOCArMzk4LDggQEAgc3RhdGljIGludCBpc3N1ZV9kaXNjYXJkKHN0cnVjdCBkaXNjYXJk X29wICpvcCwgZG1fYmxvY2tfdCBkYXRhX2IsIGRtX2Jsb2NrX3QgZGEKIAlzZWN0b3JfdCBzID0g YmxvY2tfdG9fc2VjdG9ycyh0Yy0+cG9vbCwgZGF0YV9iKTsKIAlzZWN0b3JfdCBsZW4gPSBibG9j a190b19zZWN0b3JzKHRjLT5wb29sLCBkYXRhX2UgLSBkYXRhX2IpOwogCi0JcmV0dXJuIF9fYmxr ZGV2X2lzc3VlX2Rpc2NhcmQodGMtPnBvb2xfZGV2LT5iZGV2LCBzLCBsZW4sCi0JCQkJICAgICAg R0ZQX05PV0FJVCwgMCwgJm9wLT5iaW8pOworCXJldHVybiBfX2Jsa2Rldl9pc3N1ZV9kaXNjYXJk KHRjLT5wb29sX2Rldi0+YmRldiwgcywgbGVuLCBHRlBfTk9XQUlULAorCQkJCSAgICAgICZvcC0+ YmlvKTsKIH0KIAogc3RhdGljIHZvaWQgZW5kX2Rpc2NhcmQoc3RydWN0IGRpc2NhcmRfb3AgKm9w LCBpbnQgcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwpp bmRleCAxOTYzNmMyZjJjZGE0Li4yNTg3Zjg3MmMwODg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21k L21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC04NTg0LDcgKzg1ODQsNyBAQCB2b2lkIG1k X3N1Ym1pdF9kaXNjYXJkX2JpbyhzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgbWRfcmRldiAq cmRldiwKIHsKIAlzdHJ1Y3QgYmlvICpkaXNjYXJkX2JpbyA9IE5VTEw7CiAKLQlpZiAoX19ibGtk ZXZfaXNzdWVfZGlzY2FyZChyZGV2LT5iZGV2LCBzdGFydCwgc2l6ZSwgR0ZQX05PSU8sIDAsCisJ aWYgKF9fYmxrZGV2X2lzc3VlX2Rpc2NhcmQocmRldi0+YmRldiwgc3RhcnQsIHNpemUsIEdGUF9O T0lPLAogCQkJJmRpc2NhcmRfYmlvKSB8fCAhZGlzY2FyZF9iaW8pCiAJCXJldHVybjsKIApkaWZm IC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNS1jYWNoZS5jIGIvZHJpdmVycy9tZC9yYWlkNS1jYWNo ZS5jCmluZGV4IGMzY2JmOWE1NzRhMzkuLjA5NGE0MDQyNTg5ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZl cnMvbWQvcmFpZDUtY2FjaGUuYworKysgYi9kcml2ZXJzL21kL3JhaWQ1LWNhY2hlLmMKQEAgLTEz NDQsMTQgKzEzNDQsMTQgQEAgc3RhdGljIHZvaWQgcjVsX3dyaXRlX3N1cGVyX2FuZF9kaXNjYXJk X3NwYWNlKHN0cnVjdCByNWxfbG9nICpsb2csCiAJaWYgKGxvZy0+bGFzdF9jaGVja3BvaW50IDwg ZW5kKSB7CiAJCWJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsCiAJCQkJbG9nLT5sYXN0X2NoZWNr cG9pbnQgKyBsb2ctPnJkZXYtPmRhdGFfb2Zmc2V0LAotCQkJCWVuZCAtIGxvZy0+bGFzdF9jaGVj a3BvaW50LCBHRlBfTk9JTywgMCk7CisJCQkJZW5kIC0gbG9nLT5sYXN0X2NoZWNrcG9pbnQsIEdG UF9OT0lPKTsKIAl9IGVsc2UgewogCQlibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LAogCQkJCWxv Zy0+bGFzdF9jaGVja3BvaW50ICsgbG9nLT5yZGV2LT5kYXRhX29mZnNldCwKIAkJCQlsb2ctPmRl dmljZV9zaXplIC0gbG9nLT5sYXN0X2NoZWNrcG9pbnQsCi0JCQkJR0ZQX05PSU8sIDApOworCQkJ CUdGUF9OT0lPKTsKIAkJYmxrZGV2X2lzc3VlX2Rpc2NhcmQoYmRldiwgbG9nLT5yZGV2LT5kYXRh X29mZnNldCwgZW5kLAotCQkJCUdGUF9OT0lPLCAwKTsKKwkJCQlHRlBfTk9JTyk7CiAJfQogfQog CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3F1ZXVlLmMgYi9kcml2ZXJzL21tYy9jb3Jl L3F1ZXVlLmMKaW5kZXggY2FjNjMxNTAxMGEzZC4uYTNkNDQ2MDA1NTcxNiAxMDA2NDQKLS0tIGEv ZHJpdmVycy9tbWMvY29yZS9xdWV1ZS5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvcXVldWUuYwpA QCAtMTg5LDcgKzE4OSw3IEBAIHN0YXRpYyB2b2lkIG1tY19xdWV1ZV9zZXR1cF9kaXNjYXJkKHN0 cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAogCWlmIChjYXJkLT5wcmVmX2VyYXNlID4gbWF4X2Rpc2Nh cmQpCiAJCXEtPmxpbWl0cy5kaXNjYXJkX2dyYW51bGFyaXR5ID0gU0VDVE9SX1NJWkU7CiAJaWYg KG1tY19jYW5fc2VjdXJlX2VyYXNlX3RyaW0oY2FyZCkpCi0JCWJsa19xdWV1ZV9mbGFnX3NldChR VUVVRV9GTEFHX1NFQ0VSQVNFLCBxKTsKKwkJYmxrX3F1ZXVlX21heF9zZWN1cmVfZXJhc2Vfc2Vj dG9ycyhxLCBtYXhfZGlzY2FyZCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBtbWNfZ2V0 X21heF9zZWdtZW50cyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCmRpZmYgLS1naXQgYS9kcml2ZXJz L252bWUvdGFyZ2V0L2lvLWNtZC1iZGV2LmMgYi9kcml2ZXJzL252bWUvdGFyZ2V0L2lvLWNtZC1i ZGV2LmMKaW5kZXggZDg4NmMyYzU5NTU0Zi4uMjdhNzI1MDRkMzFjZSAxMDA2NDQKLS0tIGEvZHJp dmVycy9udm1lL3RhcmdldC9pby1jbWQtYmRldi5jCisrKyBiL2RyaXZlcnMvbnZtZS90YXJnZXQv aW8tY21kLWJkZXYuYwpAQCAtMzYwLDcgKzM2MCw3IEBAIHN0YXRpYyB1MTYgbnZtZXRfYmRldl9k aXNjYXJkX3JhbmdlKHN0cnVjdCBudm1ldF9yZXEgKnJlcSwKIAlyZXQgPSBfX2Jsa2Rldl9pc3N1 ZV9kaXNjYXJkKG5zLT5iZGV2LAogCQkJbnZtZXRfbGJhX3RvX3NlY3QobnMsIHJhbmdlLT5zbGJh KSwKIAkJCWxlMzJfdG9fY3B1KHJhbmdlLT5ubGIpIDw8IChucy0+Ymxrc2l6ZV9zaGlmdCAtIDkp LAotCQkJR0ZQX0tFUk5FTCwgMCwgYmlvKTsKKwkJCUdGUF9LRVJORUwsIGJpbyk7CiAJaWYgKHJl dCAmJiByZXQgIT0gLUVPUE5PVFNVUFApIHsKIAkJcmVxLT5lcnJvcl9zbGJhID0gbGU2NF90b19j cHUocmFuZ2UtPnNsYmEpOwogCQlyZXR1cm4gZXJybm9fdG9fbnZtZV9zdGF0dXMocmVxLCByZXQp OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5jIGIvZHJpdmVy cy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5jCmluZGV4IGI2YmE1ODJiMDY3NzUuLmU2OGYxY2M4 ZWY5OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYworKysg Yi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9maWxlLmMKQEAgLTU1OCw3ICs1NTgsNyBAQCBm ZF9leGVjdXRlX3VubWFwKHN0cnVjdCBzZV9jbWQgKmNtZCwgc2VjdG9yX3QgbGJhLCBzZWN0b3Jf dCBub2xiKQogCQlyZXQgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LAogCQkJCQkgICB0YXJn ZXRfdG9fbGludXhfc2VjdG9yKGRldiwgbGJhKSwKIAkJCQkJICAgdGFyZ2V0X3RvX2xpbnV4X3Nl Y3RvcihkZXYsICBub2xiKSwKLQkJCQkJICAgR0ZQX0tFUk5FTCwgMCk7CisJCQkJCSAgIEdGUF9L RVJORUwpOwogCQlpZiAocmV0IDwgMCkgewogCQkJcHJfd2FybigiRklMRUlPOiBibGtkZXZfaXNz dWVfZGlzY2FyZCgpIGZhaWxlZDogJWRcbiIsCiAJCQkJcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZl cnMvdGFyZ2V0L3RhcmdldF9jb3JlX2libG9jay5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2Nv cmVfaWJsb2NrLmMKaW5kZXggYzRhOTAzYjhhNDdmYy4uMzc4YzgwMzEzYTBmMiAxMDA2NDQKLS0t IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKKysrIGIvZHJpdmVycy90YXJn ZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKQEAgLTQzNCw3ICs0MzQsNyBAQCBpYmxvY2tfZXhlY3V0 ZV91bm1hcChzdHJ1Y3Qgc2VfY21kICpjbWQsIHNlY3Rvcl90IGxiYSwgc2VjdG9yX3Qgbm9sYikK IAlyZXQgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LAogCQkJCSAgIHRhcmdldF90b19saW51 eF9zZWN0b3IoZGV2LCBsYmEpLAogCQkJCSAgIHRhcmdldF90b19saW51eF9zZWN0b3IoZGV2LCAg bm9sYiksCi0JCQkJICAgR0ZQX0tFUk5FTCwgMCk7CisJCQkJICAgR0ZQX0tFUk5FTCk7CiAJaWYg KHJldCA8IDApIHsKIAkJcHJfZXJyKCJibGtkZXZfaXNzdWVfZGlzY2FyZCgpIGZhaWxlZDogJWRc biIsIHJldCk7CiAJCXJldHVybiBUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVS RTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMgYi9mcy9idHJmcy9leHRlbnQt dHJlZS5jCmluZGV4IGVmZDhkZWIzYWI3ZTguLjVjMWQzYTU2NGRhNWEgMTAwNjQ0Ci0tLSBhL2Zz L2J0cmZzL2V4dGVudC10cmVlLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYwpAQCAtMTIz OSw3ICsxMjM5LDcgQEAgc3RhdGljIGludCBidHJmc19pc3N1ZV9kaXNjYXJkKHN0cnVjdCBibG9j a19kZXZpY2UgKmJkZXYsIHU2NCBzdGFydCwgdTY0IGxlbiwKIAogCQlpZiAoc2l6ZSkgewogCQkJ cmV0ID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQoYmRldiwgc3RhcnQgPj4gOSwgc2l6ZSA+PiA5LAot CQkJCQkJICAgR0ZQX05PRlMsIDApOworCQkJCQkJICAgR0ZQX05PRlMpOwogCQkJaWYgKCFyZXQp CiAJCQkJKmRpc2NhcmRlZF9ieXRlcyArPSBzaXplOwogCQkJZWxzZSBpZiAocmV0ICE9IC1FT1BO T1RTVVBQKQpAQCAtMTI1Niw3ICsxMjU2LDcgQEAgc3RhdGljIGludCBidHJmc19pc3N1ZV9kaXNj YXJkKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHU2NCBzdGFydCwgdTY0IGxlbiwKIAogCWlm IChieXRlc19sZWZ0KSB7CiAJCXJldCA9IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHN0YXJ0 ID4+IDksIGJ5dGVzX2xlZnQgPj4gOSwKLQkJCQkJICAgR0ZQX05PRlMsIDApOworCQkJCQkgICBH RlBfTk9GUyk7CiAJCWlmICghcmV0KQogCQkJKmRpc2NhcmRlZF9ieXRlcyArPSBieXRlc19sZWZ0 OwogCX0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWJhbGxvYy5jIGIvZnMvZXh0NC9tYmFsbG9jLmMK aW5kZXggNmQxODIwNTM2ZDg4ZC4uZWE2NTNkMTlmOWVjNyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9t YmFsbG9jLmMKKysrIGIvZnMvZXh0NC9tYmFsbG9jLmMKQEAgLTM2MjksNyArMzYyOSw3IEBAIHN0 YXRpYyBpbmxpbmUgaW50IGV4dDRfaXNzdWVfZGlzY2FyZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNi LAogCQlyZXR1cm4gX19ibGtkZXZfaXNzdWVfZGlzY2FyZChzYi0+c19iZGV2LAogCQkJKHNlY3Rv cl90KWRpc2NhcmRfYmxvY2sgPDwgKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSksCiAJCQkoc2Vj dG9yX3QpY291bnQgPDwgKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSksCi0JCQlHRlBfTk9GUywg MCwgYmlvcCk7CisJCQlHRlBfTk9GUywgYmlvcCk7CiAJfSBlbHNlCiAJCXJldHVybiBzYl9pc3N1 ZV9kaXNjYXJkKHNiLCBkaXNjYXJkX2Jsb2NrLCBjb3VudCwgR0ZQX05PRlMsIDApOwogfQpkaWZm IC0tZ2l0IGEvZnMvZjJmcy9maWxlLmMgYi9mcy9mMmZzL2ZpbGUuYwppbmRleCA4MDUzZDk5ZjM5 MjBiLi4zNWI2YzcyMGMyYmMxIDEwMDY0NAotLS0gYS9mcy9mMmZzL2ZpbGUuYworKysgYi9mcy9m MmZzL2ZpbGUuYwpAQCAtMzY4NSwxOCArMzY4NSwxOCBAQCBzdGF0aWMgaW50IGYyZnNfcmVzZXJ2 ZV9jb21wcmVzc19ibG9ja3Moc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGxvbmcgYXJnKQog c3RhdGljIGludCBmMmZzX3NlY3VyZV9lcmFzZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBz dHJ1Y3QgaW5vZGUgKmlub2RlLAogCQlwZ29mZl90IG9mZiwgYmxvY2tfdCBibG9jaywgYmxvY2tf dCBsZW4sIHUzMiBmbGFncykKIHsKLQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkZXZfZ2V0 X3F1ZXVlKGJkZXYpOwogCXNlY3Rvcl90IHNlY3RvciA9IFNFQ1RPUl9GUk9NX0JMT0NLKGJsb2Nr KTsKIAlzZWN0b3JfdCBucl9zZWN0cyA9IFNFQ1RPUl9GUk9NX0JMT0NLKGxlbik7CiAJaW50IHJl dCA9IDA7CiAKLQlpZiAoIXEpCi0JCXJldHVybiAtRU5YSU87Ci0KLQlpZiAoZmxhZ3MgJiBGMkZT X1RSSU1fRklMRV9ESVNDQVJEKQotCQlyZXQgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LCBz ZWN0b3IsIG5yX3NlY3RzLCBHRlBfTk9GUywKLQkJCQkJCWJsa19xdWV1ZV9zZWN1cmVfZXJhc2Uo cSkgPwotCQkJCQkJQkxLREVWX0RJU0NBUkRfU0VDVVJFIDogMCk7CisJaWYgKGZsYWdzICYgRjJG U19UUklNX0ZJTEVfRElTQ0FSRCkgeworCQlpZiAoYmRldl9tYXhfc2VjdXJlX2VyYXNlX3NlY3Rv cnMoYmRldikpCisJCQlyZXQgPSBibGtkZXZfaXNzdWVfc2VjdXJlX2VyYXNlKGJkZXYsIHNlY3Rv ciwgbnJfc2VjdHMsCisJCQkJCUdGUF9OT0ZTKTsKKwkJZWxzZQorCQkJcmV0ID0gYmxrZGV2X2lz c3VlX2Rpc2NhcmQoYmRldiwgc2VjdG9yLCBucl9zZWN0cywKKwkJCQkJR0ZQX05PRlMpOworCX0K IAogCWlmICghcmV0ICYmIChmbGFncyAmIEYyRlNfVFJJTV9GSUxFX1pFUk9PVVQpKSB7CiAJCWlm IChJU19FTkNSWVBURUQoaW5vZGUpKQpkaWZmIC0tZ2l0IGEvZnMvZjJmcy9zZWdtZW50LmMgYi9m cy9mMmZzL3NlZ21lbnQuYwppbmRleCA3MWYwOWFkYmNiYTg2Li5lNDMzYzYxZTY0YjkzIDEwMDY0 NAotLS0gYS9mcy9mMmZzL3NlZ21lbnQuYworKysgYi9mcy9mMmZzL3NlZ21lbnQuYwpAQCAtMTI0 NCw3ICsxMjQ0LDcgQEAgc3RhdGljIGludCBfX3N1Ym1pdF9kaXNjYXJkX2NtZChzdHJ1Y3QgZjJm c19zYl9pbmZvICpzYmksCiAJCWVyciA9IF9fYmxrZGV2X2lzc3VlX2Rpc2NhcmQoYmRldiwKIAkJ CQkJU0VDVE9SX0ZST01fQkxPQ0soc3RhcnQpLAogCQkJCQlTRUNUT1JfRlJPTV9CTE9DSyhsZW4p LAotCQkJCQlHRlBfTk9GUywgMCwgJmJpbyk7CisJCQkJCUdGUF9OT0ZTLCAmYmlvKTsKIHN1Ym1p dDoKIAkJaWYgKGVycikgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRjLT5sb2NrLCBmbGFncyk7 CmRpZmYgLS1naXQgYS9mcy9qYmQyL2pvdXJuYWwuYyBiL2ZzL2piZDIvam91cm5hbC5jCmluZGV4 IDE5ZDIyNmNkNGZmNGQuLmMwY2JlZWFlYzJkMWEgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvam91cm5h bC5jCisrKyBiL2ZzL2piZDIvam91cm5hbC5jCkBAIC0xODI1LDcgKzE4MjUsNyBAQCBzdGF0aWMg aW50IF9famJkMl9qb3VybmFsX2VyYXNlKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgaW50 IGZsYWdzKQogCQkJZXJyID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQoam91cm5hbC0+al9kZXYsCiAJ CQkJCWJ5dGVfc3RhcnQgPj4gU0VDVE9SX1NISUZULAogCQkJCQlieXRlX2NvdW50ID4+IFNFQ1RP Ul9TSElGVCwKLQkJCQkJR0ZQX05PRlMsIDApOworCQkJCQlHRlBfTk9GUyk7CiAJCX0gZWxzZSBp ZiAoZmxhZ3MgJiBKQkQyX0pPVVJOQUxfRkxVU0hfWkVST09VVCkgewogCQkJZXJyID0gYmxrZGV2 X2lzc3VlX3plcm9vdXQoam91cm5hbC0+al9kZXYsCiAJCQkJCWJ5dGVfc3RhcnQgPj4gU0VDVE9S X1NISUZULApkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3N1ZmlsZS5jIGIvZnMvbmlsZnMyL3N1Zmls ZS5jCmluZGV4IGUzODVjY2EyMDA0YTcuLjc3ZmY4ZTk1NDIxZmEgMTAwNjQ0Ci0tLSBhL2ZzL25p bGZzMi9zdWZpbGUuYworKysgYi9mcy9uaWxmczIvc3VmaWxlLmMKQEAgLTExMDAsNyArMTEwMCw3 IEBAIGludCBuaWxmc19zdWZpbGVfdHJpbV9mcyhzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSwgc3RydWN0 IGZzdHJpbV9yYW5nZSAqcmFuZ2UpCiAJCQkJcmV0ID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQobmls ZnMtPm5zX2JkZXYsCiAJCQkJCQlzdGFydCAqIHNlY3RzX3Blcl9ibG9jaywKIAkJCQkJCW5ibG9j a3MgKiBzZWN0c19wZXJfYmxvY2ssCi0JCQkJCQlHRlBfTk9GUywgMCk7CisJCQkJCQlHRlBfTk9G Uyk7CiAJCQkJaWYgKHJldCA8IDApIHsKIAkJCQkJcHV0X2JoKHN1X2JoKTsKIAkJCQkJZ290byBv dXRfc2VtOwpAQCAtMTEzNCw3ICsxMTM0LDcgQEAgaW50IG5pbGZzX3N1ZmlsZV90cmltX2ZzKHN0 cnVjdCBpbm9kZSAqc3VmaWxlLCBzdHJ1Y3QgZnN0cmltX3JhbmdlICpyYW5nZSkKIAkJCXJldCA9 IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKG5pbGZzLT5uc19iZGV2LAogCQkJCQlzdGFydCAqIHNlY3Rz X3Blcl9ibG9jaywKIAkJCQkJbmJsb2NrcyAqIHNlY3RzX3Blcl9ibG9jaywKLQkJCQkJR0ZQX05P RlMsIDApOworCQkJCQlHRlBfTk9GUyk7CiAJCQlpZiAoIXJldCkKIAkJCQluZGlzY2FyZGVkICs9 IG5ibG9ja3M7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi90aGVfbmlsZnMuYyBiL2ZzL25p bGZzMi90aGVfbmlsZnMuYwppbmRleCBkZDQ4YThmNzRkNTc3Li4zYjRhMDc5Yzk2MTdjIDEwMDY0 NAotLS0gYS9mcy9uaWxmczIvdGhlX25pbGZzLmMKKysrIGIvZnMvbmlsZnMyL3RoZV9uaWxmcy5j CkBAIC02NzIsNyArNjcyLDcgQEAgaW50IG5pbGZzX2Rpc2NhcmRfc2VnbWVudHMoc3RydWN0IHRo ZV9uaWxmcyAqbmlsZnMsIF9fdTY0ICpzZWdudW1wLAogCQkJcmV0ID0gYmxrZGV2X2lzc3VlX2Rp c2NhcmQobmlsZnMtPm5zX2JkZXYsCiAJCQkJCQkgICBzdGFydCAqIHNlY3RzX3Blcl9ibG9jaywK IAkJCQkJCSAgIG5ibG9ja3MgKiBzZWN0c19wZXJfYmxvY2ssCi0JCQkJCQkgICBHRlBfTk9GUywg MCk7CisJCQkJCQkgICBHRlBfTk9GUyk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlyZXR1cm4gcmV0 OwogCQkJbmJsb2NrcyA9IDA7CkBAIC02ODIsNyArNjgyLDcgQEAgaW50IG5pbGZzX2Rpc2NhcmRf c2VnbWVudHMoc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMsIF9fdTY0ICpzZWdudW1wLAogCQlyZXQg PSBibGtkZXZfaXNzdWVfZGlzY2FyZChuaWxmcy0+bnNfYmRldiwKIAkJCQkJICAgc3RhcnQgKiBz ZWN0c19wZXJfYmxvY2ssCiAJCQkJCSAgIG5ibG9ja3MgKiBzZWN0c19wZXJfYmxvY2ssCi0JCQkJ CSAgIEdGUF9OT0ZTLCAwKTsKKwkJCQkJICAgR0ZQX05PRlMpOwogCXJldHVybiByZXQ7CiB9CiAK ZGlmZiAtLWdpdCBhL2ZzL250ZnMzL3N1cGVyLmMgYi9mcy9udGZzMy9zdXBlci5jCmluZGV4IDVm MmU0MTRjZmE3OWIuLjU3ODFiOWU4ZTNkODUgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMzL3N1cGVyLmMK KysrIGIvZnMvbnRmczMvc3VwZXIuYwpAQCAtMTMzMyw3ICsxMzMzLDcgQEAgaW50IG50ZnNfZGlz Y2FyZChzdHJ1Y3QgbnRmc19zYl9pbmZvICpzYmksIENMU1QgbGNuLCBDTFNUIGxlbikKIAkJcmV0 dXJuIDA7CiAKIAllcnIgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChzYi0+c19iZGV2LCBzdGFydCA+ PiA5LCAoZW5kIC0gc3RhcnQpID4+IDksCi0JCQkJICAgR0ZQX05PRlMsIDApOworCQkJCSAgIEdG UF9OT0ZTKTsKIAogCWlmIChlcnIgPT0gLUVPUE5PVFNVUFApCiAJCXNiaS0+ZmxhZ3MgfD0gTlRG U19GTEFHU19OT0RJU0NBUkQ7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rpc2NhcmQuYyBiL2Zz L3hmcy94ZnNfZGlzY2FyZC5jCmluZGV4IGUyYWRhMTE1YzIzZjkuLmM2ZmUzZjZlYmI2YjAgMTAw NjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlzY2FyZC5jCisrKyBiL2ZzL3hmcy94ZnNfZGlzY2FyZC5j CkBAIC0xMTQsNyArMTE0LDcgQEAgeGZzX3RyaW1fZXh0ZW50cygKIAkJfQogCiAJCXRyYWNlX3hm c19kaXNjYXJkX2V4dGVudChtcCwgYWdubywgZmJubywgZmxlbik7Ci0JCWVycm9yID0gYmxrZGV2 X2lzc3VlX2Rpc2NhcmQoYmRldiwgZGJubywgZGxlbiwgR0ZQX05PRlMsIDApOworCQllcnJvciA9 IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIGRibm8sIGRsZW4sIEdGUF9OT0ZTKTsKIAkJaWYg KGVycm9yKQogCQkJZ290byBvdXRfZGVsX2N1cnNvcjsKIAkJKmJsb2Nrc190cmltbWVkICs9IGZs ZW47CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZ19jaWwuYyBiL2ZzL3hmcy94ZnNfbG9nX2Np bC5jCmluZGV4IGJhNTczMjNiZmRjZWEuLmM5ZjU1ZTRmMDk1NzEgMTAwNjQ0Ci0tLSBhL2ZzL3hm cy94ZnNfbG9nX2NpbC5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nX2NpbC5jCkBAIC02MDUsNyArNjA1 LDcgQEAgeGxvZ19kaXNjYXJkX2J1c3lfZXh0ZW50cygKIAkJZXJyb3IgPSBfX2Jsa2Rldl9pc3N1 ZV9kaXNjYXJkKG1wLT5tX2RkZXZfdGFyZ3AtPmJ0X2JkZXYsCiAJCQkJWEZTX0FHQl9UT19EQURE UihtcCwgYnVzeXAtPmFnbm8sIGJ1c3lwLT5ibm8pLAogCQkJCVhGU19GU0JfVE9fQkIobXAsIGJ1 c3lwLT5sZW5ndGgpLAotCQkJCUdGUF9OT0ZTLCAwLCAmYmlvKTsKKwkJCQlHRlBfTk9GUywgJmJp byk7CiAJCWlmIChlcnJvciAmJiBlcnJvciAhPSAtRU9QTk9UU1VQUCkgewogCQkJeGZzX2luZm8o bXAsCiAJICJkaXNjYXJkIGZhaWxlZCBmb3IgZXh0ZW50IFsweCVsbHgsJXVdLCBlcnJvciAlZCIs CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtk ZXYuaAppbmRleCBmMWNmNTU3ZWEyMGVmLi5jOWI1OTI1YWY1YTNiIDEwMDY0NAotLS0gYS9pbmNs dWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTI0OCw2 ICsyNDgsNyBAQCBzdHJ1Y3QgcXVldWVfbGltaXRzIHsKIAl1bnNpZ25lZCBpbnQJCWlvX29wdDsK IAl1bnNpZ25lZCBpbnQJCW1heF9kaXNjYXJkX3NlY3RvcnM7CiAJdW5zaWduZWQgaW50CQltYXhf aHdfZGlzY2FyZF9zZWN0b3JzOworCXVuc2lnbmVkIGludAkJbWF4X3NlY3VyZV9lcmFzZV9zZWN0 b3JzOwogCXVuc2lnbmVkIGludAkJbWF4X3dyaXRlX3plcm9lc19zZWN0b3JzOwogCXVuc2lnbmVk IGludAkJbWF4X3pvbmVfYXBwZW5kX3NlY3RvcnM7CiAJdW5zaWduZWQgaW50CQlkaXNjYXJkX2dy YW51bGFyaXR5OwpAQCAtNTQyLDcgKzU0Myw2IEBAIHN0cnVjdCByZXF1ZXN0X3F1ZXVlIHsKICNk ZWZpbmUgUVVFVUVfRkxBR19JT19TVEFUCTcJLyogZG8gZGlzay9wYXJ0aXRpb25zIElPIGFjY291 bnRpbmcgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19OT1hNRVJHRVMJOQkvKiBObyBleHRlbmRlZCBt ZXJnZXMgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19BRERfUkFORE9NCTEwCS8qIENvbnRyaWJ1dGVz IHRvIHJhbmRvbSBwb29sICovCi0jZGVmaW5lIFFVRVVFX0ZMQUdfU0VDRVJBU0UJMTEJLyogc3Vw cG9ydHMgc2VjdXJlIGVyYXNlICovCiAjZGVmaW5lIFFVRVVFX0ZMQUdfU0FNRV9GT1JDRQkxMgkv KiBmb3JjZSBjb21wbGV0ZSBvbiBzYW1lIENQVSAqLwogI2RlZmluZSBRVUVVRV9GTEFHX0RFQUQJ CTEzCS8qIHF1ZXVlIHRlYXItZG93biBmaW5pc2hlZCAqLwogI2RlZmluZSBRVUVVRV9GTEFHX0lO SVRfRE9ORQkxNAkvKiBxdWV1ZSBpcyBpbml0aWFsaXplZCAqLwpAQCAtNTgzLDggKzU4Myw2IEBA IGJvb2wgYmxrX3F1ZXVlX2ZsYWdfdGVzdF9hbmRfc2V0KHVuc2lnbmVkIGludCBmbGFnLCBzdHJ1 Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CiAjZGVmaW5lIGJsa19xdWV1ZV9hZGRfcmFuZG9tKHEpCXRl c3RfYml0KFFVRVVFX0ZMQUdfQUREX1JBTkRPTSwgJihxKS0+cXVldWVfZmxhZ3MpCiAjZGVmaW5l IGJsa19xdWV1ZV96b25lX3Jlc2V0YWxsKHEpCVwKIAl0ZXN0X2JpdChRVUVVRV9GTEFHX1pPTkVf UkVTRVRBTEwsICYocSktPnF1ZXVlX2ZsYWdzKQotI2RlZmluZSBibGtfcXVldWVfc2VjdXJlX2Vy YXNlKHEpIFwKLQkodGVzdF9iaXQoUVVFVUVfRkxBR19TRUNFUkFTRSwgJihxKS0+cXVldWVfZmxh Z3MpKQogI2RlZmluZSBibGtfcXVldWVfZGF4KHEpCXRlc3RfYml0KFFVRVVFX0ZMQUdfREFYLCAm KHEpLT5xdWV1ZV9mbGFncykKICNkZWZpbmUgYmxrX3F1ZXVlX3BjaV9wMnBkbWEocSkJXAogCXRl c3RfYml0KFFVRVVFX0ZMQUdfUENJX1AyUERNQSwgJihxKS0+cXVldWVfZmxhZ3MpCkBAIC05NDcs NiArOTQ1LDggQEAgZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2NodW5rX3NlY3RvcnMoc3RydWN0IHJl cXVlc3RfcXVldWUgKiwgdW5zaWduZWQgaW50KTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9tYXhf c2VnbWVudHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgc2hvcnQpOwogZXh0ZXJu IHZvaWQgYmxrX3F1ZXVlX21heF9kaXNjYXJkX3NlZ21lbnRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVl ICosCiAJCXVuc2lnbmVkIHNob3J0KTsKK3ZvaWQgYmxrX3F1ZXVlX21heF9zZWN1cmVfZXJhc2Vf c2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJdW5zaWduZWQgaW50IG1heF9zZWN0 b3JzKTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9tYXhfc2VnbWVudF9zaXplKHN0cnVjdCByZXF1 ZXN0X3F1ZXVlICosIHVuc2lnbmVkIGludCk7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfbWF4X2Rp c2NhcmRfc2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKIAkJdW5zaWduZWQgaW50IG1h eF9kaXNjYXJkX3NlY3RvcnMpOwpAQCAtMTA4NywxMyArMTA4NywxMiBAQCBzdGF0aWMgaW5saW5l IGxvbmcgbnJfYmxvY2tkZXZfcGFnZXModm9pZCkKIAogZXh0ZXJuIHZvaWQgYmxrX2lvX3NjaGVk dWxlKHZvaWQpOwogCi0jZGVmaW5lIEJMS0RFVl9ESVNDQVJEX1NFQ1VSRQkoMSA8PCAwKQkvKiBp c3N1ZSBhIHNlY3VyZSBlcmFzZSAqLwotCi1leHRlcm4gaW50IGJsa2Rldl9pc3N1ZV9kaXNjYXJk KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwKLQkJc2VjdG9yX3Qg bnJfc2VjdHMsIGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiBp bnQgX19ibGtkZXZfaXNzdWVfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0 b3JfdCBzZWN0b3IsCi0JCXNlY3Rvcl90IG5yX3NlY3RzLCBnZnBfdCBnZnBfbWFzaywgaW50IGZs YWdzLAotCQlzdHJ1Y3QgYmlvICoqYmlvcCk7CitpbnQgYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc3Ry dWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3Qgc2VjdG9yLAorCQlzZWN0b3JfdCBucl9z ZWN0cywgZ2ZwX3QgZ2ZwX21hc2spOworaW50IF9fYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc3RydWN0 IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3Qgc2VjdG9yLAorCQlzZWN0b3JfdCBucl9zZWN0 cywgZ2ZwX3QgZ2ZwX21hc2ssIHN0cnVjdCBiaW8gKipiaW9wKTsKK2ludCBibGtkZXZfaXNzdWVf c2VjdXJlX2VyYXNlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwK KwkJc2VjdG9yX3QgbnJfc2VjdHMsIGdmcF90IGdmcCk7CiAKICNkZWZpbmUgQkxLREVWX1pFUk9f Tk9VTk1BUAkoMSA8PCAwKSAgLyogZG8gbm90IGZyZWUgYmxvY2tzICovCiAjZGVmaW5lIEJMS0RF Vl9aRVJPX05PRkFMTEJBQ0sJKDEgPDwgMSkgIC8qIGRvbid0IHdyaXRlIGV4cGxpY2l0IHplcm9l cyAqLwpAQCAtMTExMiw3ICsxMTExLDcgQEAgc3RhdGljIGlubGluZSBpbnQgc2JfaXNzdWVfZGlz Y2FyZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzZWN0b3JfdCBibG9jaywKIAkJCQkJICAgICAg U0VDVE9SX1NISUZUKSwKIAkJCQkgICAgbnJfYmxvY2tzIDw8IChzYi0+c19ibG9ja3NpemVfYml0 cyAtCiAJCQkJCQkgIFNFQ1RPUl9TSElGVCksCi0JCQkJICAgIGdmcF9tYXNrLCBmbGFncyk7CisJ CQkJICAgIGdmcF9tYXNrKTsKIH0KIHN0YXRpYyBpbmxpbmUgaW50IHNiX2lzc3VlX3plcm9vdXQo c3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc2VjdG9yX3QgYmxvY2ssCiAJCXNlY3Rvcl90IG5yX2Js b2NrcywgZ2ZwX3QgZ2ZwX21hc2spCkBAIC0xMjYyLDYgKzEyNjEsMTIgQEAgc3RhdGljIGlubGlu ZSB1bnNpZ25lZCBpbnQgYmRldl9kaXNjYXJkX2dyYW51bGFyaXR5KHN0cnVjdCBibG9ja19kZXZp Y2UgKmJkZXYpCiAJcmV0dXJuIGJkZXZfZ2V0X3F1ZXVlKGJkZXYpLT5saW1pdHMuZGlzY2FyZF9n cmFudWxhcml0eTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2JkZXZfbWF4X3Nl Y3VyZV9lcmFzZV9zZWN0b3JzKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJcmV0dXJu IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpLT5saW1pdHMubWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzOwor fQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBiZGV2X3dyaXRlX3plcm9lc19zZWN0b3Jz KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCiB7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEg PSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9z d2FwZmlsZS5jCmluZGV4IDVkOWNlZGY5ZTdiODQuLmEyYjMxZmVhMGM0MmUgMTAwNjQ0Ci0tLSBh L21tL3N3YXBmaWxlLmMKKysrIGIvbW0vc3dhcGZpbGUuYwpAQCAtMTc5LDcgKzE3OSw3IEBAIHN0 YXRpYyBpbnQgZGlzY2FyZF9zd2FwKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKIAlucl9i bG9ja3MgPSAoKHNlY3Rvcl90KXNlLT5ucl9wYWdlcyAtIDEpIDw8IChQQUdFX1NISUZUIC0gOSk7 CiAJaWYgKG5yX2Jsb2NrcykgewogCQllcnIgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChzaS0+YmRl diwgc3RhcnRfYmxvY2ssCi0JCQkJbnJfYmxvY2tzLCBHRlBfS0VSTkVMLCAwKTsKKwkJCQlucl9i bG9ja3MsIEdGUF9LRVJORUwpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAkJY29uZF9y ZXNjaGVkKCk7CkBAIC0xOTAsNyArMTkwLDcgQEAgc3RhdGljIGludCBkaXNjYXJkX3N3YXAoc3Ry dWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQogCQlucl9ibG9ja3MgPSAoc2VjdG9yX3Qpc2UtPm5y X3BhZ2VzIDw8IChQQUdFX1NISUZUIC0gOSk7CiAKIAkJZXJyID0gYmxrZGV2X2lzc3VlX2Rpc2Nh cmQoc2ktPmJkZXYsIHN0YXJ0X2Jsb2NrLAotCQkJCW5yX2Jsb2NrcywgR0ZQX0tFUk5FTCwgMCk7 CisJCQkJbnJfYmxvY2tzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGVycikKIAkJCWJyZWFrOwogCkBA IC0yNTQsNyArMjU0LDcgQEAgc3RhdGljIHZvaWQgZGlzY2FyZF9zd2FwX2NsdXN0ZXIoc3RydWN0 IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCQlzdGFydF9ibG9jayA8PD0gUEFHRV9TSElGVCAtIDk7 CiAJCW5yX2Jsb2NrcyA8PD0gUEFHRV9TSElGVCAtIDk7CiAJCWlmIChibGtkZXZfaXNzdWVfZGlz Y2FyZChzaS0+YmRldiwgc3RhcnRfYmxvY2ssCi0JCQkJCW5yX2Jsb2NrcywgR0ZQX05PSU8sIDAp KQorCQkJCQlucl9ibG9ja3MsIEdGUF9OT0lPKSkKIAkJCWJyZWFrOwogCiAJCXNlID0gbmV4dF9z ZShzZSk7Ci0tIAoyLjMwLjIKCi0tCmRtLWRldmVsIG1haWxpbmcgbGlzdApkbS1kZXZlbEByZWRo YXQuY29tCmh0dHBzOi8vbGlzdG1hbi5yZWRoYXQuY29tL21haWxtYW4vbGlzdGluZm8vZG0tZGV2 ZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 3F98DC433EF for ; Sat, 9 Apr 2022 05:18:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=DbRi5fdi0ldX7IGZzajC0c/VzD1gOevYbh83MoOvZ3E=; b=aJUQd1/F4dnf4U nfCOgH6w0S7c4k9Bj2JAS4zrUbsMbt98LF018oJif1O35FqDUbyAJUQEjKnBIwCLIIi3qKzkCn0mT 1XyV3ieffhj1Iw6gRKW4Vw/Y8YvZdAH1MKtZcD/Z7zcAu4ywcYgppWbPYJsrQi2+nPYO6FCdGG3ga aw5miASzB+mPBCU8AerJnrQiZZFdurbT4iJUuksf+pucebvx+3WPS/morAYZCxHgnc5m+uGVmachm TISBPkDeJQudR9zyhO0QuHX0oSgel2NZfafuxYIlinAcJxOoinUYsePAUPpwJDx8dUiQXyzwQ4XLp Hrp3QBtxP0jSm32+ZbLA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nd3Tf-002DxS-2t; Sat, 09 Apr 2022 05:17:39 +0000 Received: from 213-147-167-116.nat.highway.webapn.at ([213.147.167.116] helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.94.2 #2 (Red Hat Linux)) id 1nd35C-0021lf-95; Sat, 09 Apr 2022 04:52:23 +0000 From: Christoph Hellwig To: Jens Axboe Cc: dm-devel@redhat.com, linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-um@lists.infradead.org, linux-block@vger.kernel.org, drbd-dev@lists.linbit.com, nbd@other.debian.org, ceph-devel@vger.kernel.org, virtualization@lists.linux-foundation.org, xen-devel@lists.xenproject.org, linux-bcache@vger.kernel.org, linux-raid@vger.kernel.org, linux-mmc@vger.kernel.org, linux-mtd@lists.infradead.org, linux-nvme@lists.infradead.org, linux-s390@vger.kernel.org, linux-scsi@vger.kernel.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, cluster-devel@redhat.com, jfs-discussion@lists.sourceforge.net, linux-nilfs@vger.kernel.org, ntfs3@lists.linux.dev, ocfs2-devel@oss.oracle.com, linux-mm@kvack.org, "Martin K . Petersen" , =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= , Ryusuke Konishi , Coly Li , David Sterba Subject: [PATCH 26/27] block: decouple REQ_OP_SECURE_ERASE from REQ_OP_DISCARD Date: Sat, 9 Apr 2022 06:50:42 +0200 Message-Id: <20220409045043.23593-27-hch@lst.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220409045043.23593-1-hch@lst.de> References: <20220409045043.23593-1-hch@lst.de> MIME-Version: 1.0 X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-mtd" Errors-To: linux-mtd-bounces+linux-mtd=archiver.kernel.org@lists.infradead.org U2VjdXJlIGVyYXNlIGlzIGEgdmVyeSBkaWZmZXJlbnQgb3BlcmF0aW9uIGZyb20gZGlzY2FyZCBp biB0aGF0IGl0IGlzCmEgZGF0YSBpbnRlZ3JpdHkgb3BlcmF0aW9uIHZzIGhpbnQuICBGdWxseSBz cGxpdCB0aGUgbGltaXRzIGFuZCBoZWxwZXIKaW5mcmFzdHJ1Y3R1cmUgdG8gbWFrZSB0aGUgc2Vw YXJhdGlvbiBtb3JlIGNsZWFyLgoKU2lnbmVkLW9mZi1ieTogQ2hyaXN0b3BoIEhlbGx3aWcgPGhj aEBsc3QuZGU+ClJldmlld2VkLWJ5OiBNYXJ0aW4gSy4gUGV0ZXJzZW4gPG1hcnRpbi5wZXRlcnNl bkBvcmFjbGUuY29tPgpBY2tlZC1ieTogQ2hyaXN0b3BoIELDtmhtd2FsZGVyIDxjaHJpc3RvcGgu Ym9laG13YWxkZXJAbGluYml0LmNvbT4gW2RyYmRdCkFja2VkLWJ5OiBSeXVzdWtlIEtvbmlzaGkg PGtvbmlzaGkucnl1c3VrZUBnbWFpbC5jb20+IFtuaWZzMl0KQWNrZWQtYnk6IENvbHkgTGkgPGNv bHlsaUBzdXNlLmRlPiBbZHJiZF0KQWNrZWQtYnk6IERhdmlkIFN0ZXJiYSA8ZHN0ZXJiYUBzdXNl LmNvbT4gW2J0cmZzXQotLS0KIGJsb2NrL2Jsay1jb3JlLmMgICAgICAgICAgICAgICAgICAgIHwg IDIgKy0KIGJsb2NrL2Jsay1saWIuYyAgICAgICAgICAgICAgICAgICAgIHwgNjQgKysrKysrKysr KysrKysrKysrKystLS0tLS0tLS0KIGJsb2NrL2Jsay1tcS1kZWJ1Z2ZzLmMgICAgICAgICAgICAg IHwgIDEgLQogYmxvY2svYmxrLXNldHRpbmdzLmMgICAgICAgICAgICAgICAgfCAxNiArKysrKysr LQogYmxvY2svZm9wcy5jICAgICAgICAgICAgICAgICAgICAgICAgfCAgMiArLQogYmxvY2svaW9j dGwuYyAgICAgICAgICAgICAgICAgICAgICAgfCA0MyArKysrKysrKysrKysrKystLS0tCiBkcml2 ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5jICB8ICA1ICsrLQogZHJpdmVycy9ibG9jay9y bmJkL3JuYmQtY2x0LmMgICAgICAgfCAgNCArLQogZHJpdmVycy9ibG9jay9ybmJkL3JuYmQtc3J2 LWRldi5oICAgfCAgMiArLQogZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGtiYWNrLmMgfCAx NSArKystLS0tCiBkcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL3hlbmJ1cy5jICB8ICA1ICstLQog ZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYyAgICAgICAgfCAgNSArKy0KIGRyaXZlcnMvbWQv YmNhY2hlL2FsbG9jLmMgICAgICAgICAgIHwgIDIgKy0KIGRyaXZlcnMvbWQvZG0tdGFibGUuYyAg ICAgICAgICAgICAgIHwgIDggKystLQogZHJpdmVycy9tZC9kbS10aGluLmMgICAgICAgICAgICAg ICAgfCAgNCArLQogZHJpdmVycy9tZC9tZC5jICAgICAgICAgICAgICAgICAgICAgfCAgMiArLQog ZHJpdmVycy9tZC9yYWlkNS1jYWNoZS5jICAgICAgICAgICAgfCAgNiArLS0KIGRyaXZlcnMvbW1j L2NvcmUvcXVldWUuYyAgICAgICAgICAgIHwgIDIgKy0KIGRyaXZlcnMvbnZtZS90YXJnZXQvaW8t Y21kLWJkZXYuYyAgIHwgIDIgKy0KIGRyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYyAg IHwgIDIgKy0KIGRyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2libG9jay5jIHwgIDIgKy0KIGZz L2J0cmZzL2V4dGVudC10cmVlLmMgICAgICAgICAgICAgIHwgIDQgKy0KIGZzL2V4dDQvbWJhbGxv Yy5jICAgICAgICAgICAgICAgICAgIHwgIDIgKy0KIGZzL2YyZnMvZmlsZS5jICAgICAgICAgICAg ICAgICAgICAgIHwgMTYgKysrKy0tLS0KIGZzL2YyZnMvc2VnbWVudC5jICAgICAgICAgICAgICAg ICAgIHwgIDIgKy0KIGZzL2piZDIvam91cm5hbC5jICAgICAgICAgICAgICAgICAgIHwgIDIgKy0K IGZzL25pbGZzMi9zdWZpbGUuYyAgICAgICAgICAgICAgICAgIHwgIDQgKy0KIGZzL25pbGZzMi90 aGVfbmlsZnMuYyAgICAgICAgICAgICAgIHwgIDQgKy0KIGZzL250ZnMzL3N1cGVyLmMgICAgICAg ICAgICAgICAgICAgIHwgIDIgKy0KIGZzL3hmcy94ZnNfZGlzY2FyZC5jICAgICAgICAgICAgICAg IHwgIDIgKy0KIGZzL3hmcy94ZnNfbG9nX2NpbC5jICAgICAgICAgICAgICAgIHwgIDIgKy0KIGlu Y2x1ZGUvbGludXgvYmxrZGV2LmggICAgICAgICAgICAgIHwgMjcgKysrKysrKy0tLS0tCiBtbS9z d2FwZmlsZS5jICAgICAgICAgICAgICAgICAgICAgICB8ICA2ICstLQogMzMgZmlsZXMgY2hhbmdl ZCwgMTY4IGluc2VydGlvbnMoKyksIDk5IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2Jsb2Nr L2Jsay1jb3JlLmMgYi9ibG9jay9ibGstY29yZS5jCmluZGV4IGI1YzNhODA0OTEzNGMuLmVlMThi NmE2OTliZGYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jb3JlLmMKKysrIGIvYmxvY2svYmxrLWNv cmUuYwpAQCAtODI0LDcgKzgyNCw3IEBAIHZvaWQgc3VibWl0X2Jpb19ub2FjY3Qoc3RydWN0IGJp byAqYmlvKQogCQkJZ290byBub3Rfc3VwcG9ydGVkOwogCQlicmVhazsKIAljYXNlIFJFUV9PUF9T RUNVUkVfRVJBU0U6Ci0JCWlmICghYmxrX3F1ZXVlX3NlY3VyZV9lcmFzZShxKSkKKwkJaWYgKCFi ZGV2X21heF9zZWN1cmVfZXJhc2Vfc2VjdG9ycyhiZGV2KSkKIAkJCWdvdG8gbm90X3N1cHBvcnRl ZDsKIAkJYnJlYWs7CiAJY2FzZSBSRVFfT1BfWk9ORV9BUFBFTkQ6CmRpZmYgLS1naXQgYS9ibG9j ay9ibGstbGliLmMgYi9ibG9jay9ibGstbGliLmMKaW5kZXggNDNhYTRkN2ZlODU5Zi4uMDliN2Ux MjAwYzBmNCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWxpYi5jCisrKyBiL2Jsb2NrL2Jsay1saWIu YwpAQCAtMzYsMjYgKzM2LDE1IEBAIHN0YXRpYyBzZWN0b3JfdCBiaW9fZGlzY2FyZF9saW1pdChz dHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBzZWN0b3IpCiB9CiAKIGludCBfX2Js a2Rldl9pc3N1ZV9kaXNjYXJkKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNl Y3RvciwKLQkJc2VjdG9yX3QgbnJfc2VjdHMsIGdmcF90IGdmcF9tYXNrLCBpbnQgZmxhZ3MsCi0J CXN0cnVjdCBiaW8gKipiaW9wKQorCQlzZWN0b3JfdCBucl9zZWN0cywgZ2ZwX3QgZ2ZwX21hc2ss IHN0cnVjdCBiaW8gKipiaW9wKQogewotCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9n ZXRfcXVldWUoYmRldik7CiAJc3RydWN0IGJpbyAqYmlvID0gKmJpb3A7Ci0JdW5zaWduZWQgaW50 IG9wOwogCXNlY3Rvcl90IGJzX21hc2s7CiAKIAlpZiAoYmRldl9yZWFkX29ubHkoYmRldikpCiAJ CXJldHVybiAtRVBFUk07Ci0KLQlpZiAoZmxhZ3MgJiBCTEtERVZfRElTQ0FSRF9TRUNVUkUpIHsK LQkJaWYgKCFibGtfcXVldWVfc2VjdXJlX2VyYXNlKHEpKQotCQkJcmV0dXJuIC1FT1BOT1RTVVBQ OwotCQlvcCA9IFJFUV9PUF9TRUNVUkVfRVJBU0U7Ci0JfSBlbHNlIHsKLQkJaWYgKCFiZGV2X21h eF9kaXNjYXJkX3NlY3RvcnMoYmRldikpCi0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCW9wID0g UkVRX09QX0RJU0NBUkQ7Ci0JfQorCWlmICghYmRldl9tYXhfZGlzY2FyZF9zZWN0b3JzKGJkZXYp KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAkvKiBJbiBjYXNlIHRoZSBkaXNjYXJkIGdyYW51 bGFyaXR5IGlzbid0IHNldCBieSBidWdneSBkZXZpY2UgZHJpdmVyICovCiAJaWYgKFdBUk5fT05f T05DRSghYmRldl9kaXNjYXJkX2dyYW51bGFyaXR5KGJkZXYpKSkgewpAQCAtNzcsNyArNjYsNyBA QCBpbnQgX19ibGtkZXZfaXNzdWVfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBz ZWN0b3JfdCBzZWN0b3IsCiAJCXNlY3Rvcl90IHJlcV9zZWN0cyA9CiAJCQltaW4obnJfc2VjdHMs IGJpb19kaXNjYXJkX2xpbWl0KGJkZXYsIHNlY3RvcikpOwogCi0JCWJpbyA9IGJsa19uZXh0X2Jp byhiaW8sIGJkZXYsIDAsIG9wLCBnZnBfbWFzayk7CisJCWJpbyA9IGJsa19uZXh0X2JpbyhiaW8s IGJkZXYsIDAsIFJFUV9PUF9ESVNDQVJELCBnZnBfbWFzayk7CiAJCWJpby0+YmlfaXRlci5iaV9z ZWN0b3IgPSBzZWN0b3I7CiAJCWJpby0+YmlfaXRlci5iaV9zaXplID0gcmVxX3NlY3RzIDw8IDk7 CiAJCXNlY3RvciArPSByZXFfc2VjdHM7CkBAIC0xMDMsMjEgKzkyLDE5IEBAIEVYUE9SVF9TWU1C T0woX19ibGtkZXZfaXNzdWVfZGlzY2FyZCk7CiAgKiBAc2VjdG9yOglzdGFydCBzZWN0b3IKICAq IEBucl9zZWN0czoJbnVtYmVyIG9mIHNlY3RvcnMgdG8gZGlzY2FyZAogICogQGdmcF9tYXNrOglt ZW1vcnkgYWxsb2NhdGlvbiBmbGFncyAoZm9yIGJpb19hbGxvYykKLSAqIEBmbGFnczoJQkxLREVW X0RJU0NBUkRfKiBmbGFncyB0byBjb250cm9sIGJlaGF2aW91cgogICoKICAqIERlc2NyaXB0aW9u OgogICogICAgSXNzdWUgYSBkaXNjYXJkIHJlcXVlc3QgZm9yIHRoZSBzZWN0b3JzIGluIHF1ZXN0 aW9uLgogICovCiBpbnQgYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc3RydWN0IGJsb2NrX2RldmljZSAq YmRldiwgc2VjdG9yX3Qgc2VjdG9yLAotCQlzZWN0b3JfdCBucl9zZWN0cywgZ2ZwX3QgZ2ZwX21h c2ssIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJCXNlY3Rvcl90IG5yX3NlY3RzLCBnZnBfdCBnZnBf bWFzaykKIHsKIAlzdHJ1Y3QgYmlvICpiaW8gPSBOVUxMOwogCXN0cnVjdCBibGtfcGx1ZyBwbHVn OwogCWludCByZXQ7CiAKIAlibGtfc3RhcnRfcGx1ZygmcGx1Zyk7Ci0JcmV0ID0gX19ibGtkZXZf aXNzdWVfZGlzY2FyZChiZGV2LCBzZWN0b3IsIG5yX3NlY3RzLCBnZnBfbWFzaywgZmxhZ3MsCi0J CQkmYmlvKTsKKwlyZXQgPSBfX2Jsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHNlY3RvciwgbnJf c2VjdHMsIGdmcF9tYXNrLCAmYmlvKTsKIAlpZiAoIXJldCAmJiBiaW8pIHsKIAkJcmV0ID0gc3Vi bWl0X2Jpb193YWl0KGJpbyk7CiAJCWlmIChyZXQgPT0gLUVPUE5PVFNVUFApCkBAIC0zMTQsMyAr MzAxLDQyIEBAIGludCBibGtkZXZfaXNzdWVfemVyb291dChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpi ZGV2LCBzZWN0b3JfdCBzZWN0b3IsCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woYmxr ZGV2X2lzc3VlX3plcm9vdXQpOworCitpbnQgYmxrZGV2X2lzc3VlX3NlY3VyZV9lcmFzZShzdHJ1 Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBzZWN0b3IsCisJCXNlY3Rvcl90IG5yX3Nl Y3RzLCBnZnBfdCBnZnApCit7CisJc2VjdG9yX3QgYnNfbWFzayA9IChiZGV2X2xvZ2ljYWxfYmxv Y2tfc2l6ZShiZGV2KSA+PiA5KSAtIDE7CisJdW5zaWduZWQgaW50IG1heF9zZWN0b3JzID0gYmRl dl9tYXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMoYmRldik7CisJc3RydWN0IGJpbyAqYmlvID0gTlVM TDsKKwlzdHJ1Y3QgYmxrX3BsdWcgcGx1ZzsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChtYXhfc2Vj dG9ycyA9PSAwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKChzZWN0b3IgfCBucl9zZWN0 cykgJiBic19tYXNrKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYmRldl9yZWFkX29ubHkoYmRl dikpCisJCXJldHVybiAtRVBFUk07CisKKwlibGtfc3RhcnRfcGx1ZygmcGx1Zyk7CisJZm9yICg7 OykgeworCQl1bnNpZ25lZCBpbnQgbGVuID0gbWluX3Qoc2VjdG9yX3QsIG5yX3NlY3RzLCBtYXhf c2VjdG9ycyk7CisKKwkJYmlvID0gYmxrX25leHRfYmlvKGJpbywgYmRldiwgMCwgUkVRX09QX1NF Q1VSRV9FUkFTRSwgZ2ZwKTsKKwkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IHNlY3RvcjsKKwkJ YmlvLT5iaV9pdGVyLmJpX3NpemUgPSBsZW47CisKKwkJc2VjdG9yICs9IGxlbiA8PCBTRUNUT1Jf U0hJRlQ7CisJCW5yX3NlY3RzIC09IGxlbiA8PCBTRUNUT1JfU0hJRlQ7CisJCWlmICghbnJfc2Vj dHMpIHsKKwkJCXJldCA9IHN1Ym1pdF9iaW9fd2FpdChiaW8pOworCQkJYmlvX3B1dChiaW8pOwor CQkJYnJlYWs7CisJCX0KKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCWJsa19maW5pc2hfcGx1Zygm cGx1Zyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChibGtkZXZfaXNzdWVfc2Vj dXJlX2VyYXNlKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS1kZWJ1Z2ZzLmMgYi9ibG9jay9i bGstbXEtZGVidWdmcy5jCmluZGV4IGZkMTExYzUwMDEyNTYuLjdlNDEzNmE2MGUxY2MgMTAwNjQ0 Ci0tLSBhL2Jsb2NrL2Jsay1tcS1kZWJ1Z2ZzLmMKKysrIGIvYmxvY2svYmxrLW1xLWRlYnVnZnMu YwpAQCAtMTE1LDcgKzExNSw2IEBAIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBibGtfcXVldWVf ZmxhZ19uYW1lW10gPSB7CiAJUVVFVUVfRkxBR19OQU1FKElPX1NUQVQpLAogCVFVRVVFX0ZMQUdf TkFNRShOT1hNRVJHRVMpLAogCVFVRVVFX0ZMQUdfTkFNRShBRERfUkFORE9NKSwKLQlRVUVVRV9G TEFHX05BTUUoU0VDRVJBU0UpLAogCVFVRVVFX0ZMQUdfTkFNRShTQU1FX0ZPUkNFKSwKIAlRVUVV RV9GTEFHX05BTUUoREVBRCksCiAJUVVFVUVfRkxBR19OQU1FKElOSVRfRE9ORSksCmRpZmYgLS1n aXQgYS9ibG9jay9ibGstc2V0dGluZ3MuYyBiL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCmluZGV4IGZk ODNkNjc0YWZkMGEuLjZjY2NlYjQyMWVkMmYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1zZXR0aW5n cy5jCisrKyBiL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCkBAIC00Niw2ICs0Niw3IEBAIHZvaWQgYmxr X3NldF9kZWZhdWx0X2xpbWl0cyhzdHJ1Y3QgcXVldWVfbGltaXRzICpsaW0pCiAJbGltLT5tYXhf em9uZV9hcHBlbmRfc2VjdG9ycyA9IDA7CiAJbGltLT5tYXhfZGlzY2FyZF9zZWN0b3JzID0gMDsK IAlsaW0tPm1heF9od19kaXNjYXJkX3NlY3RvcnMgPSAwOworCWxpbS0+bWF4X3NlY3VyZV9lcmFz ZV9zZWN0b3JzID0gMDsKIAlsaW0tPmRpc2NhcmRfZ3JhbnVsYXJpdHkgPSAwOwogCWxpbS0+ZGlz Y2FyZF9hbGlnbm1lbnQgPSAwOwogCWxpbS0+ZGlzY2FyZF9taXNhbGlnbmVkID0gMDsKQEAgLTE3 Niw2ICsxNzcsMTggQEAgdm9pZCBibGtfcXVldWVfbWF4X2Rpc2NhcmRfc2VjdG9ycyhzdHJ1Y3Qg cmVxdWVzdF9xdWV1ZSAqcSwKIH0KIEVYUE9SVF9TWU1CT0woYmxrX3F1ZXVlX21heF9kaXNjYXJk X3NlY3RvcnMpOwogCisvKioKKyAqIGJsa19xdWV1ZV9tYXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMg LSBzZXQgbWF4IHNlY3RvcnMgZm9yIGEgc2VjdXJlIGVyYXNlCisgKiBAcTogIHRoZSByZXF1ZXN0 IHF1ZXVlIGZvciB0aGUgZGV2aWNlCisgKiBAbWF4X3NlY3RvcnM6IG1heGltdW0gbnVtYmVyIG9m IHNlY3RvcnMgdG8gc2VjdXJlX2VyYXNlCisgKiovCit2b2lkIGJsa19xdWV1ZV9tYXhfc2VjdXJl X2VyYXNlX3NlY3RvcnMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCXVuc2lnbmVkIGludCBt YXhfc2VjdG9ycykKK3sKKwlxLT5saW1pdHMubWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzID0gbWF4 X3NlY3RvcnM7Cit9CitFWFBPUlRfU1lNQk9MKGJsa19xdWV1ZV9tYXhfc2VjdXJlX2VyYXNlX3Nl Y3RvcnMpOworCiAvKioKICAqIGJsa19xdWV1ZV9tYXhfd3JpdGVfemVyb2VzX3NlY3RvcnMgLSBz ZXQgbWF4IHNlY3RvcnMgZm9yIGEgc2luZ2xlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgd3JpdGUgemVyb2VzCkBAIC02NjEsNyArNjc0LDggQEAgaW50IGJsa19zdGFj a19saW1pdHMoc3RydWN0IHF1ZXVlX2xpbWl0cyAqdCwgc3RydWN0IHF1ZXVlX2xpbWl0cyAqYiwK IAkJdC0+ZGlzY2FyZF9hbGlnbm1lbnQgPSBsY21fbm90X3plcm8odC0+ZGlzY2FyZF9hbGlnbm1l bnQsIGFsaWdubWVudCkgJQogCQkJdC0+ZGlzY2FyZF9ncmFudWxhcml0eTsKIAl9Ci0KKwl0LT5t YXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMgPSBtaW5fbm90X3plcm8odC0+bWF4X3NlY3VyZV9lcmFz ZV9zZWN0b3JzLAorCQkJCQkJICAgYi0+bWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzKTsKIAl0LT56 b25lX3dyaXRlX2dyYW51bGFyaXR5ID0gbWF4KHQtPnpvbmVfd3JpdGVfZ3JhbnVsYXJpdHksCiAJ CQkJCWItPnpvbmVfd3JpdGVfZ3JhbnVsYXJpdHkpOwogCXQtPnpvbmVkID0gbWF4KHQtPnpvbmVk LCBiLT56b25lZCk7CmRpZmYgLS1naXQgYS9ibG9jay9mb3BzLmMgYi9ibG9jay9mb3BzLmMKaW5k ZXggOWYyZWNlYzQwNmIwNC4uYzBjYTMyNTRkMzhjZiAxMDA2NDQKLS0tIGEvYmxvY2svZm9wcy5j CisrKyBiL2Jsb2NrL2ZvcHMuYwpAQCAtNjcyLDcgKzY3Miw3IEBAIHN0YXRpYyBsb25nIGJsa2Rl dl9mYWxsb2NhdGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCBtb2RlLCBsb2ZmX3Qgc3RhcnQsCiAJ CWJyZWFrOwogCWNhc2UgRkFMTE9DX0ZMX1BVTkNIX0hPTEUgfCBGQUxMT0NfRkxfS0VFUF9TSVpF IHwgRkFMTE9DX0ZMX05PX0hJREVfU1RBTEU6CiAJCWVycm9yID0gYmxrZGV2X2lzc3VlX2Rpc2Nh cmQoYmRldiwgc3RhcnQgPj4gU0VDVE9SX1NISUZULAotCQkJCQkgICAgIGxlbiA+PiBTRUNUT1Jf U0hJRlQsIEdGUF9LRVJORUwsIDApOworCQkJCQkgICAgIGxlbiA+PiBTRUNUT1JfU0hJRlQsIEdG UF9LRVJORUwpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQllcnJvciA9IC1FT1BOT1RTVVBQOwpk aWZmIC0tZ2l0IGEvYmxvY2svaW9jdGwuYyBiL2Jsb2NrL2lvY3RsLmMKaW5kZXggYzJjZDNiYTUy OTBjZS4uNWI1MDI3ZmE3OGY3ZSAxMDA2NDQKLS0tIGEvYmxvY2svaW9jdGwuYworKysgYi9ibG9j ay9pb2N0bC5jCkBAIC04Myw3ICs4Myw3IEBAIHN0YXRpYyBpbnQgY29tcGF0X2Jsa3BnX2lvY3Rs KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAjZW5kaWYKIAogc3RhdGljIGludCBibGtfaW9j dGxfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUsCi0JCXVu c2lnbmVkIGxvbmcgYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCQl1bnNpZ25lZCBsb25nIGFy ZykKIHsKIAl1aW50NjRfdCByYW5nZVsyXTsKIAl1aW50NjRfdCBzdGFydCwgbGVuOwpAQCAtMTE0 LDE1ICsxMTQsNDMgQEAgc3RhdGljIGludCBibGtfaW9jdGxfZGlzY2FyZChzdHJ1Y3QgYmxvY2tf ZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUsCiAJZXJyID0gdHJ1bmNhdGVfYmRldl9yYW5nZShi ZGV2LCBtb2RlLCBzdGFydCwgc3RhcnQgKyBsZW4gLSAxKTsKIAlpZiAoZXJyKQogCQlnb3RvIGZh aWw7Ci0KLQllcnIgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LCBzdGFydCA+PiA5LCBsZW4g Pj4gOSwKLQkJCQkgICBHRlBfS0VSTkVMLCBmbGFncyk7Ci0KKwllcnIgPSBibGtkZXZfaXNzdWVf ZGlzY2FyZChiZGV2LCBzdGFydCA+PiA5LCBsZW4gPj4gOSwgR0ZQX0tFUk5FTCk7CiBmYWlsOgog CWZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtPmlfbWFwcGluZyk7CiAJcmV0dXJuIGVy cjsKIH0KIAorc3RhdGljIGludCBibGtfaW9jdGxfc2VjdXJlX2VyYXNlKHN0cnVjdCBibG9ja19k ZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSwKKwkJdm9pZCBfX3VzZXIgKmFyZ3ApCit7CisJdWlu dDY0X3Qgc3RhcnQsIGxlbjsKKwl1aW50NjRfdCByYW5nZVsyXTsKKwlpbnQgZXJyOworCisJaWYg KCEobW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJcmV0dXJuIC1FQkFERjsKKwlpZiAoIWJkZXZfbWF4 X3NlY3VyZV9lcmFzZV9zZWN0b3JzKGJkZXYpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYg KGNvcHlfZnJvbV91c2VyKHJhbmdlLCBhcmdwLCBzaXplb2YocmFuZ2UpKSkKKwkJcmV0dXJuIC1F RkFVTFQ7CisKKwlzdGFydCA9IHJhbmdlWzBdOworCWxlbiA9IHJhbmdlWzFdOworCWlmICgoc3Rh cnQgJiA1MTEpIHx8IChsZW4gJiA1MTEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RhcnQg KyBsZW4gPiBiZGV2X25yX2J5dGVzKGJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZpbGVt YXBfaW52YWxpZGF0ZV9sb2NrKGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOworCWVyciA9IHRy dW5jYXRlX2JkZXZfcmFuZ2UoYmRldiwgbW9kZSwgc3RhcnQsIHN0YXJ0ICsgbGVuIC0gMSk7CisJ aWYgKCFlcnIpCisJCWVyciA9IGJsa2Rldl9pc3N1ZV9zZWN1cmVfZXJhc2UoYmRldiwgc3RhcnQg Pj4gOSwgbGVuID4+IDksCisJCQkJCQlHRlBfS0VSTkVMKTsKKwlmaWxlbWFwX2ludmFsaWRhdGVf dW5sb2NrKGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOworCXJldHVybiBlcnI7Cit9CisKKwog c3RhdGljIGludCBibGtfaW9jdGxfemVyb291dChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBm bW9kZV90IG1vZGUsCiAJCXVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtNDUwLDEwICs0NzgsOSBA QCBzdGF0aWMgaW50IGJsa2Rldl9jb21tb25faW9jdGwoc3RydWN0IGJsb2NrX2RldmljZSAqYmRl diwgZm1vZGVfdCBtb2RlLAogCWNhc2UgQkxLUk9TRVQ6CiAJCXJldHVybiBibGtkZXZfcm9zZXQo YmRldiwgbW9kZSwgY21kLCBhcmcpOwogCWNhc2UgQkxLRElTQ0FSRDoKLQkJcmV0dXJuIGJsa19p b2N0bF9kaXNjYXJkKGJkZXYsIG1vZGUsIGFyZywgMCk7CisJCXJldHVybiBibGtfaW9jdGxfZGlz Y2FyZChiZGV2LCBtb2RlLCBhcmcpOwogCWNhc2UgQkxLU0VDRElTQ0FSRDoKLQkJcmV0dXJuIGJs a19pb2N0bF9kaXNjYXJkKGJkZXYsIG1vZGUsIGFyZywKLQkJCQlCTEtERVZfRElTQ0FSRF9TRUNV UkUpOworCQlyZXR1cm4gYmxrX2lvY3RsX3NlY3VyZV9lcmFzZShiZGV2LCBtb2RlLCBhcmdwKTsK IAljYXNlIEJMS1pFUk9PVVQ6CiAJCXJldHVybiBibGtfaW9jdGxfemVyb291dChiZGV2LCBtb2Rl LCBhcmcpOwogCWNhc2UgQkxLR0VURElTS1NFUToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sv ZHJiZC9kcmJkX3JlY2VpdmVyLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5j CmluZGV4IDI3NWM1M2M3YjYyOWUuLjI5NTdiMGI2OGQ2MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMv YmxvY2svZHJiZC9kcmJkX3JlY2VpdmVyLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRf cmVjZWl2ZXIuYwpAQCAtMTU0Nyw3ICsxNTQ3LDggQEAgaW50IGRyYmRfaXNzdWVfZGlzY2FyZF9v cl96ZXJvX291dChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc3RhcnQsIHUK IAkJc3RhcnQgPSB0bXA7CiAJfQogCXdoaWxlIChucl9zZWN0b3JzID49IG1heF9kaXNjYXJkX3Nl Y3RvcnMpIHsKLQkJZXJyIHw9IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHN0YXJ0LCBtYXhf ZGlzY2FyZF9zZWN0b3JzLCBHRlBfTk9JTywgMCk7CisJCWVyciB8PSBibGtkZXZfaXNzdWVfZGlz Y2FyZChiZGV2LCBzdGFydCwgbWF4X2Rpc2NhcmRfc2VjdG9ycywKKwkJCQkJICAgIEdGUF9OT0lP KTsKIAkJbnJfc2VjdG9ycyAtPSBtYXhfZGlzY2FyZF9zZWN0b3JzOwogCQlzdGFydCArPSBtYXhf ZGlzY2FyZF9zZWN0b3JzOwogCX0KQEAgLTE1NTksNyArMTU2MCw3IEBAIGludCBkcmJkX2lzc3Vl X2Rpc2NhcmRfb3JfemVyb19vdXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90 IHN0YXJ0LCB1CiAJCW5yID0gbnJfc2VjdG9yczsKIAkJbnIgLT0gKHVuc2lnbmVkIGludCluciAl IGdyYW51bGFyaXR5OwogCQlpZiAobnIpIHsKLQkJCWVyciB8PSBibGtkZXZfaXNzdWVfZGlzY2Fy ZChiZGV2LCBzdGFydCwgbnIsIEdGUF9OT0lPLCAwKTsKKwkJCWVyciB8PSBibGtkZXZfaXNzdWVf ZGlzY2FyZChiZGV2LCBzdGFydCwgbnIsIEdGUF9OT0lPKTsKIAkJCW5yX3NlY3RvcnMgLT0gbnI7 CiAJCQlzdGFydCArPSBucjsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9ybmJkL3Ju YmQtY2x0LmMgYi9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1jbHQuYwppbmRleCBlZmE5OWEzODg0 NTA3Li5kMTc4YmUxNzVhZDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1j bHQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1jbHQuYwpAQCAtMTM2NSw4ICsxMzY1 LDggQEAgc3RhdGljIHZvaWQgc2V0dXBfcmVxdWVzdF9xdWV1ZShzdHJ1Y3Qgcm5iZF9jbHRfZGV2 ICpkZXYpCiAJZGV2LT5xdWV1ZS0+bGltaXRzLmRpc2NhcmRfZ3JhbnVsYXJpdHkJPSBkZXYtPmRp c2NhcmRfZ3JhbnVsYXJpdHk7CiAJZGV2LT5xdWV1ZS0+bGltaXRzLmRpc2NhcmRfYWxpZ25tZW50 CT0gZGV2LT5kaXNjYXJkX2FsaWdubWVudDsKIAlpZiAoZGV2LT5zZWN1cmVfZGlzY2FyZCkKLQkJ YmxrX3F1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfU0VDRVJBU0UsIGRldi0+cXVldWUpOwotCisJ CWJsa19xdWV1ZV9tYXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMoZGV2LT5xdWV1ZSwKKwkJCQlkZXYt Pm1heF9kaXNjYXJkX3NlY3RvcnMpOwogCWJsa19xdWV1ZV9mbGFnX3NldChRVUVVRV9GTEFHX1NB TUVfQ09NUCwgZGV2LT5xdWV1ZSk7CiAJYmxrX3F1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfU0FN RV9GT1JDRSwgZGV2LT5xdWV1ZSk7CiAJYmxrX3F1ZXVlX21heF9zZWdtZW50cyhkZXYtPnF1ZXVl LCBkZXYtPm1heF9zZWdtZW50cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5i ZC1zcnYtZGV2LmggYi9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1zcnYtZGV2LmgKaW5kZXggMWY3 ZTFjOGZkNGQ5Yi4uZDA4MGEwZGU1OTIyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9ybmJk L3JuYmQtc3J2LWRldi5oCisrKyBiL2RyaXZlcnMvYmxvY2svcm5iZC9ybmJkLXNydi1kZXYuaApA QCAtNDQsNyArNDQsNyBAQCBzdGF0aWMgaW5saW5lIGludCBybmJkX2Rldl9nZXRfbWF4X2h3X3Nl Y3RzKGNvbnN0IHN0cnVjdCBybmJkX2RldiAqZGV2KQogCiBzdGF0aWMgaW5saW5lIGludCBybmJk X2Rldl9nZXRfc2VjdXJlX2Rpc2NhcmQoY29uc3Qgc3RydWN0IHJuYmRfZGV2ICpkZXYpCiB7Ci0J cmV0dXJuIGJsa19xdWV1ZV9zZWN1cmVfZXJhc2UoYmRldl9nZXRfcXVldWUoZGV2LT5iZGV2KSk7 CisJcmV0dXJuIGJkZXZfbWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzKGRldi0+YmRldik7CiB9CiAK IHN0YXRpYyBpbmxpbmUgaW50IHJuYmRfZGV2X2dldF9tYXhfZGlzY2FyZF9zZWN0cyhjb25zdCBz dHJ1Y3Qgcm5iZF9kZXYgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Jh Y2svYmxrYmFjay5jIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGtiYWNrLmMKaW5kZXgg ZGU0MjQ1ODE5NWJjMS4uYTk3ZjJiZjViMDFiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay94 ZW4tYmxrYmFjay9ibGtiYWNrLmMKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGti YWNrLmMKQEAgLTk3MCw3ICs5NzAsNiBAQCBzdGF0aWMgaW50IGRpc3BhdGNoX2Rpc2NhcmRfaW8o c3RydWN0IHhlbl9ibGtpZl9yaW5nICpyaW5nLAogCWludCBzdGF0dXMgPSBCTEtJRl9SU1BfT0tB WTsKIAlzdHJ1Y3QgeGVuX2Jsa2lmICpibGtpZiA9IHJpbmctPmJsa2lmOwogCXN0cnVjdCBibG9j a19kZXZpY2UgKmJkZXYgPSBibGtpZi0+dmJkLmJkZXY7Ci0JdW5zaWduZWQgbG9uZyBzZWN1cmU7 CiAJc3RydWN0IHBoeXNfcmVxIHByZXE7CiAKIAl4ZW5fYmxraWZfZ2V0KGJsa2lmKTsKQEAgLTk4 NywxMyArOTg2LDE1IEBAIHN0YXRpYyBpbnQgZGlzcGF0Y2hfZGlzY2FyZF9pbyhzdHJ1Y3QgeGVu X2Jsa2lmX3JpbmcgKnJpbmcsCiAJfQogCXJpbmctPnN0X2RzX3JlcSsrOwogCi0Jc2VjdXJlID0g KGJsa2lmLT52YmQuZGlzY2FyZF9zZWN1cmUgJiYKLQkJIChyZXEtPnUuZGlzY2FyZC5mbGFnICYg QkxLSUZfRElTQ0FSRF9TRUNVUkUpKSA/Ci0JCSBCTEtERVZfRElTQ0FSRF9TRUNVUkUgOiAwOwor CWlmIChibGtpZi0+dmJkLmRpc2NhcmRfc2VjdXJlICYmCisJICAgIChyZXEtPnUuZGlzY2FyZC5m bGFnICYgQkxLSUZfRElTQ0FSRF9TRUNVUkUpKQorCQllcnIgPSBibGtkZXZfaXNzdWVfc2VjdXJl X2VyYXNlKGJkZXYsCisJCQkJcmVxLT51LmRpc2NhcmQuc2VjdG9yX251bWJlciwKKwkJCQlyZXEt PnUuZGlzY2FyZC5ucl9zZWN0b3JzLCBHRlBfS0VSTkVMKTsKKwllbHNlCisJCWVyciA9IGJsa2Rl dl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHJlcS0+dS5kaXNjYXJkLnNlY3Rvcl9udW1iZXIsCisJCQkJ cmVxLT51LmRpc2NhcmQubnJfc2VjdG9ycywgR0ZQX0tFUk5FTCk7CiAKLQllcnIgPSBibGtkZXZf aXNzdWVfZGlzY2FyZChiZGV2LCByZXEtPnUuZGlzY2FyZC5zZWN0b3JfbnVtYmVyLAotCQkJCSAg IHJlcS0+dS5kaXNjYXJkLm5yX3NlY3RvcnMsCi0JCQkJICAgR0ZQX0tFUk5FTCwgc2VjdXJlKTsK IGZhaWxfcmVzcG9uc2U6CiAJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkgewogCQlwcl9kZWJ1Zygi ZGlzY2FyZCBvcCBmYWlsZWQsIG5vdCBzdXBwb3J0ZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2sv eGVuYnVzLmMKaW5kZXggODNjZDA4MDQxZTZiMy4uYjIxYmZmYzljNTBiYyAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hl bi1ibGtiYWNrL3hlbmJ1cy5jCkBAIC00ODQsNyArNDg0LDYgQEAgc3RhdGljIGludCB4ZW5fdmJk X2NyZWF0ZShzdHJ1Y3QgeGVuX2Jsa2lmICpibGtpZiwgYmxraWZfdmRldl90IGhhbmRsZSwKIHsK IAlzdHJ1Y3QgeGVuX3ZiZCAqdmJkOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7Ci0Jc3Ry dWN0IHJlcXVlc3RfcXVldWUgKnE7CiAKIAl2YmQgPSAmYmxraWYtPnZiZDsKIAl2YmQtPmhhbmRs ZSAgID0gaGFuZGxlOwpAQCAtNTE2LDExICs1MTUsOSBAQCBzdGF0aWMgaW50IHhlbl92YmRfY3Jl YXRlKHN0cnVjdCB4ZW5fYmxraWYgKmJsa2lmLCBibGtpZl92ZGV2X3QgaGFuZGxlLAogCWlmICh2 YmQtPmJkZXYtPmJkX2Rpc2stPmZsYWdzICYgR0VOSERfRkxfUkVNT1ZBQkxFKQogCQl2YmQtPnR5 cGUgfD0gVkRJU0tfUkVNT1ZBQkxFOwogCi0JcSA9IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpOwogCWlm IChiZGV2X3dyaXRlX2NhY2hlKGJkZXYpKQogCQl2YmQtPmZsdXNoX3N1cHBvcnQgPSB0cnVlOwot Ci0JaWYgKHEgJiYgYmxrX3F1ZXVlX3NlY3VyZV9lcmFzZShxKSkKKwlpZiAoYmRldl9tYXhfc2Vj dXJlX2VyYXNlX3NlY3RvcnMoYmRldikpCiAJCXZiZC0+ZGlzY2FyZF9zZWN1cmUgPSB0cnVlOwog CiAJdmJkLT5mZWF0dXJlX2dudF9wZXJzaXN0ZW50ID0gZmVhdHVyZV9wZXJzaXN0ZW50OwpkaWZm IC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYyBiL2RyaXZlcnMvYmxvY2sveGVu LWJsa2Zyb250LmMKaW5kZXggMjUzYmY4MzVhY2ExZi4uOWZiN2M2OWY3MmIyZCAxMDA2NDQKLS0t IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hlbi1i bGtmcm9udC5jCkBAIC05NDksNyArOTQ5LDggQEAgc3RhdGljIHZvaWQgYmxraWZfc2V0X3F1ZXVl X2xpbWl0cyhzdHJ1Y3QgYmxrZnJvbnRfaW5mbyAqaW5mbykKIAkJCQkJCSBpbmZvLT5waHlzaWNh bF9zZWN0b3Jfc2l6ZTsKIAkJcnEtPmxpbWl0cy5kaXNjYXJkX2FsaWdubWVudCA9IGluZm8tPmRp c2NhcmRfYWxpZ25tZW50OwogCQlpZiAoaW5mby0+ZmVhdHVyZV9zZWNkaXNjYXJkKQotCQkJYmxr X3F1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfU0VDRVJBU0UsIHJxKTsKKwkJCWJsa19xdWV1ZV9t YXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMocnEsCisJCQkJCQkJICAgZ2V0X2NhcGFjaXR5KGdkKSk7 CiAJfQogCiAJLyogSGFyZCBzZWN0b3Igc2l6ZSBhbmQgbWF4IHNlY3RvcnMgaW1wZXJzb25hdGUg dGhlIGVxdWl2LiBoYXJkd2FyZS4gKi8KQEAgLTE2MDUsNyArMTYwNiw3IEBAIHN0YXRpYyBpcnFy ZXR1cm5fdCBibGtpZl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogCQkJCWJsa2lm X3JlcShyZXEpLT5lcnJvciA9IEJMS19TVFNfTk9UU1VQUDsKIAkJCQlpbmZvLT5mZWF0dXJlX2Rp c2NhcmQgPSAwOwogCQkJCWluZm8tPmZlYXR1cmVfc2VjZGlzY2FyZCA9IDA7Ci0JCQkJYmxrX3F1 ZXVlX2ZsYWdfY2xlYXIoUVVFVUVfRkxBR19TRUNFUkFTRSwgcnEpOworCQkJCWJsa19xdWV1ZV9t YXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMocnEsIDApOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2Ug QkxLSUZfT1BfRkxVU0hfRElTS0NBQ0hFOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUv YWxsb2MuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL2FsbG9jLmMKaW5kZXggMDk3NTc3YWUzYzQ3MS4u Y2UxM2MyNzJjMzg3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvYWxsb2MuYworKysg Yi9kcml2ZXJzL21kL2JjYWNoZS9hbGxvYy5jCkBAIC0zMzYsNyArMzM2LDcgQEAgc3RhdGljIGlu dCBiY2hfYWxsb2NhdG9yX3RocmVhZCh2b2lkICphcmcpCiAJCQkJbXV0ZXhfdW5sb2NrKCZjYS0+ c2V0LT5idWNrZXRfbG9jayk7CiAJCQkJYmxrZGV2X2lzc3VlX2Rpc2NhcmQoY2EtPmJkZXYsCiAJ CQkJCWJ1Y2tldF90b19zZWN0b3IoY2EtPnNldCwgYnVja2V0KSwKLQkJCQkJY2EtPnNiLmJ1Y2tl dF9zaXplLCBHRlBfS0VSTkVMLCAwKTsKKwkJCQkJY2EtPnNiLmJ1Y2tldF9zaXplLCBHRlBfS0VS TkVMKTsKIAkJCQltdXRleF9sb2NrKCZjYS0+c2V0LT5idWNrZXRfbG9jayk7CiAJCQl9CiAKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYyBiL2RyaXZlcnMvbWQvZG0tdGFibGUuYwpp bmRleCAwZGZmNjkwN2ZkMDBkLi5lN2Q0MmY2MzM1YTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21k L2RtLXRhYmxlLmMKKysrIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCkBAIC0xOTIwLDkgKzE5MjAs NyBAQCBzdGF0aWMgaW50IGRldmljZV9ub3Rfc2VjdXJlX2VyYXNlX2NhcGFibGUoc3RydWN0IGRt X3RhcmdldCAqdGksCiAJCQkJCSAgIHN0cnVjdCBkbV9kZXYgKmRldiwgc2VjdG9yX3Qgc3RhcnQs CiAJCQkJCSAgIHNlY3Rvcl90IGxlbiwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgcmVxdWVzdF9x dWV1ZSAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGRldi0+YmRldik7Ci0KLQlyZXR1cm4gIWJsa19xdWV1 ZV9zZWN1cmVfZXJhc2UocSk7CisJcmV0dXJuICFiZGV2X21heF9zZWN1cmVfZXJhc2Vfc2VjdG9y cyhkZXYtPmJkZXYpOwogfQogCiBzdGF0aWMgYm9vbCBkbV90YWJsZV9zdXBwb3J0c19zZWN1cmVf ZXJhc2Uoc3RydWN0IGRtX3RhYmxlICp0KQpAQCAtMTk3NSw4ICsxOTczLDggQEAgaW50IGRtX3Rh YmxlX3NldF9yZXN0cmljdGlvbnMoc3RydWN0IGRtX3RhYmxlICp0LCBzdHJ1Y3QgcmVxdWVzdF9x dWV1ZSAqcSwKIAkJcS0+bGltaXRzLmRpc2NhcmRfbWlzYWxpZ25lZCA9IDA7CiAJfQogCi0JaWYg KGRtX3RhYmxlX3N1cHBvcnRzX3NlY3VyZV9lcmFzZSh0KSkKLQkJYmxrX3F1ZXVlX2ZsYWdfc2V0 KFFVRVVFX0ZMQUdfU0VDRVJBU0UsIHEpOworCWlmICghZG1fdGFibGVfc3VwcG9ydHNfc2VjdXJl X2VyYXNlKHQpKQorCQlxLT5saW1pdHMubWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzID0gMDsKIAog CWlmIChkbV90YWJsZV9zdXBwb3J0c19mbHVzaCh0LCAoMVVMIDw8IFFVRVVFX0ZMQUdfV0MpKSkg ewogCQl3YyA9IHRydWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXRoaW4uYyBiL2RyaXZl cnMvbWQvZG0tdGhpbi5jCmluZGV4IGVkZWQ0YmNjNDU0NWYuLjg0YzA4M2Y3NjY3MzYgMTAwNjQ0 Ci0tLSBhL2RyaXZlcnMvbWQvZG0tdGhpbi5jCisrKyBiL2RyaXZlcnMvbWQvZG0tdGhpbi5jCkBA IC0zOTgsOCArMzk4LDggQEAgc3RhdGljIGludCBpc3N1ZV9kaXNjYXJkKHN0cnVjdCBkaXNjYXJk X29wICpvcCwgZG1fYmxvY2tfdCBkYXRhX2IsIGRtX2Jsb2NrX3QgZGEKIAlzZWN0b3JfdCBzID0g YmxvY2tfdG9fc2VjdG9ycyh0Yy0+cG9vbCwgZGF0YV9iKTsKIAlzZWN0b3JfdCBsZW4gPSBibG9j a190b19zZWN0b3JzKHRjLT5wb29sLCBkYXRhX2UgLSBkYXRhX2IpOwogCi0JcmV0dXJuIF9fYmxr ZGV2X2lzc3VlX2Rpc2NhcmQodGMtPnBvb2xfZGV2LT5iZGV2LCBzLCBsZW4sCi0JCQkJICAgICAg R0ZQX05PV0FJVCwgMCwgJm9wLT5iaW8pOworCXJldHVybiBfX2Jsa2Rldl9pc3N1ZV9kaXNjYXJk KHRjLT5wb29sX2Rldi0+YmRldiwgcywgbGVuLCBHRlBfTk9XQUlULAorCQkJCSAgICAgICZvcC0+ YmlvKTsKIH0KIAogc3RhdGljIHZvaWQgZW5kX2Rpc2NhcmQoc3RydWN0IGRpc2NhcmRfb3AgKm9w LCBpbnQgcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwpp bmRleCAxOTYzNmMyZjJjZGE0Li4yNTg3Zjg3MmMwODg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21k L21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC04NTg0LDcgKzg1ODQsNyBAQCB2b2lkIG1k X3N1Ym1pdF9kaXNjYXJkX2JpbyhzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgbWRfcmRldiAq cmRldiwKIHsKIAlzdHJ1Y3QgYmlvICpkaXNjYXJkX2JpbyA9IE5VTEw7CiAKLQlpZiAoX19ibGtk ZXZfaXNzdWVfZGlzY2FyZChyZGV2LT5iZGV2LCBzdGFydCwgc2l6ZSwgR0ZQX05PSU8sIDAsCisJ aWYgKF9fYmxrZGV2X2lzc3VlX2Rpc2NhcmQocmRldi0+YmRldiwgc3RhcnQsIHNpemUsIEdGUF9O T0lPLAogCQkJJmRpc2NhcmRfYmlvKSB8fCAhZGlzY2FyZF9iaW8pCiAJCXJldHVybjsKIApkaWZm IC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNS1jYWNoZS5jIGIvZHJpdmVycy9tZC9yYWlkNS1jYWNo ZS5jCmluZGV4IGMzY2JmOWE1NzRhMzkuLjA5NGE0MDQyNTg5ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZl cnMvbWQvcmFpZDUtY2FjaGUuYworKysgYi9kcml2ZXJzL21kL3JhaWQ1LWNhY2hlLmMKQEAgLTEz NDQsMTQgKzEzNDQsMTQgQEAgc3RhdGljIHZvaWQgcjVsX3dyaXRlX3N1cGVyX2FuZF9kaXNjYXJk X3NwYWNlKHN0cnVjdCByNWxfbG9nICpsb2csCiAJaWYgKGxvZy0+bGFzdF9jaGVja3BvaW50IDwg ZW5kKSB7CiAJCWJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsCiAJCQkJbG9nLT5sYXN0X2NoZWNr cG9pbnQgKyBsb2ctPnJkZXYtPmRhdGFfb2Zmc2V0LAotCQkJCWVuZCAtIGxvZy0+bGFzdF9jaGVj a3BvaW50LCBHRlBfTk9JTywgMCk7CisJCQkJZW5kIC0gbG9nLT5sYXN0X2NoZWNrcG9pbnQsIEdG UF9OT0lPKTsKIAl9IGVsc2UgewogCQlibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LAogCQkJCWxv Zy0+bGFzdF9jaGVja3BvaW50ICsgbG9nLT5yZGV2LT5kYXRhX29mZnNldCwKIAkJCQlsb2ctPmRl dmljZV9zaXplIC0gbG9nLT5sYXN0X2NoZWNrcG9pbnQsCi0JCQkJR0ZQX05PSU8sIDApOworCQkJ CUdGUF9OT0lPKTsKIAkJYmxrZGV2X2lzc3VlX2Rpc2NhcmQoYmRldiwgbG9nLT5yZGV2LT5kYXRh X29mZnNldCwgZW5kLAotCQkJCUdGUF9OT0lPLCAwKTsKKwkJCQlHRlBfTk9JTyk7CiAJfQogfQog CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3F1ZXVlLmMgYi9kcml2ZXJzL21tYy9jb3Jl L3F1ZXVlLmMKaW5kZXggY2FjNjMxNTAxMGEzZC4uYTNkNDQ2MDA1NTcxNiAxMDA2NDQKLS0tIGEv ZHJpdmVycy9tbWMvY29yZS9xdWV1ZS5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvcXVldWUuYwpA QCAtMTg5LDcgKzE4OSw3IEBAIHN0YXRpYyB2b2lkIG1tY19xdWV1ZV9zZXR1cF9kaXNjYXJkKHN0 cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAogCWlmIChjYXJkLT5wcmVmX2VyYXNlID4gbWF4X2Rpc2Nh cmQpCiAJCXEtPmxpbWl0cy5kaXNjYXJkX2dyYW51bGFyaXR5ID0gU0VDVE9SX1NJWkU7CiAJaWYg KG1tY19jYW5fc2VjdXJlX2VyYXNlX3RyaW0oY2FyZCkpCi0JCWJsa19xdWV1ZV9mbGFnX3NldChR VUVVRV9GTEFHX1NFQ0VSQVNFLCBxKTsKKwkJYmxrX3F1ZXVlX21heF9zZWN1cmVfZXJhc2Vfc2Vj dG9ycyhxLCBtYXhfZGlzY2FyZCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBtbWNfZ2V0 X21heF9zZWdtZW50cyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCmRpZmYgLS1naXQgYS9kcml2ZXJz L252bWUvdGFyZ2V0L2lvLWNtZC1iZGV2LmMgYi9kcml2ZXJzL252bWUvdGFyZ2V0L2lvLWNtZC1i ZGV2LmMKaW5kZXggZDg4NmMyYzU5NTU0Zi4uMjdhNzI1MDRkMzFjZSAxMDA2NDQKLS0tIGEvZHJp dmVycy9udm1lL3RhcmdldC9pby1jbWQtYmRldi5jCisrKyBiL2RyaXZlcnMvbnZtZS90YXJnZXQv aW8tY21kLWJkZXYuYwpAQCAtMzYwLDcgKzM2MCw3IEBAIHN0YXRpYyB1MTYgbnZtZXRfYmRldl9k aXNjYXJkX3JhbmdlKHN0cnVjdCBudm1ldF9yZXEgKnJlcSwKIAlyZXQgPSBfX2Jsa2Rldl9pc3N1 ZV9kaXNjYXJkKG5zLT5iZGV2LAogCQkJbnZtZXRfbGJhX3RvX3NlY3QobnMsIHJhbmdlLT5zbGJh KSwKIAkJCWxlMzJfdG9fY3B1KHJhbmdlLT5ubGIpIDw8IChucy0+Ymxrc2l6ZV9zaGlmdCAtIDkp LAotCQkJR0ZQX0tFUk5FTCwgMCwgYmlvKTsKKwkJCUdGUF9LRVJORUwsIGJpbyk7CiAJaWYgKHJl dCAmJiByZXQgIT0gLUVPUE5PVFNVUFApIHsKIAkJcmVxLT5lcnJvcl9zbGJhID0gbGU2NF90b19j cHUocmFuZ2UtPnNsYmEpOwogCQlyZXR1cm4gZXJybm9fdG9fbnZtZV9zdGF0dXMocmVxLCByZXQp OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5jIGIvZHJpdmVy cy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5jCmluZGV4IGI2YmE1ODJiMDY3NzUuLmU2OGYxY2M4 ZWY5OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYworKysg Yi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9maWxlLmMKQEAgLTU1OCw3ICs1NTgsNyBAQCBm ZF9leGVjdXRlX3VubWFwKHN0cnVjdCBzZV9jbWQgKmNtZCwgc2VjdG9yX3QgbGJhLCBzZWN0b3Jf dCBub2xiKQogCQlyZXQgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LAogCQkJCQkgICB0YXJn ZXRfdG9fbGludXhfc2VjdG9yKGRldiwgbGJhKSwKIAkJCQkJICAgdGFyZ2V0X3RvX2xpbnV4X3Nl Y3RvcihkZXYsICBub2xiKSwKLQkJCQkJICAgR0ZQX0tFUk5FTCwgMCk7CisJCQkJCSAgIEdGUF9L RVJORUwpOwogCQlpZiAocmV0IDwgMCkgewogCQkJcHJfd2FybigiRklMRUlPOiBibGtkZXZfaXNz dWVfZGlzY2FyZCgpIGZhaWxlZDogJWRcbiIsCiAJCQkJcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZl cnMvdGFyZ2V0L3RhcmdldF9jb3JlX2libG9jay5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2Nv cmVfaWJsb2NrLmMKaW5kZXggYzRhOTAzYjhhNDdmYy4uMzc4YzgwMzEzYTBmMiAxMDA2NDQKLS0t IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKKysrIGIvZHJpdmVycy90YXJn ZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKQEAgLTQzNCw3ICs0MzQsNyBAQCBpYmxvY2tfZXhlY3V0 ZV91bm1hcChzdHJ1Y3Qgc2VfY21kICpjbWQsIHNlY3Rvcl90IGxiYSwgc2VjdG9yX3Qgbm9sYikK IAlyZXQgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LAogCQkJCSAgIHRhcmdldF90b19saW51 eF9zZWN0b3IoZGV2LCBsYmEpLAogCQkJCSAgIHRhcmdldF90b19saW51eF9zZWN0b3IoZGV2LCAg bm9sYiksCi0JCQkJICAgR0ZQX0tFUk5FTCwgMCk7CisJCQkJICAgR0ZQX0tFUk5FTCk7CiAJaWYg KHJldCA8IDApIHsKIAkJcHJfZXJyKCJibGtkZXZfaXNzdWVfZGlzY2FyZCgpIGZhaWxlZDogJWRc biIsIHJldCk7CiAJCXJldHVybiBUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVS RTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMgYi9mcy9idHJmcy9leHRlbnQt dHJlZS5jCmluZGV4IGVmZDhkZWIzYWI3ZTguLjVjMWQzYTU2NGRhNWEgMTAwNjQ0Ci0tLSBhL2Zz L2J0cmZzL2V4dGVudC10cmVlLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYwpAQCAtMTIz OSw3ICsxMjM5LDcgQEAgc3RhdGljIGludCBidHJmc19pc3N1ZV9kaXNjYXJkKHN0cnVjdCBibG9j a19kZXZpY2UgKmJkZXYsIHU2NCBzdGFydCwgdTY0IGxlbiwKIAogCQlpZiAoc2l6ZSkgewogCQkJ cmV0ID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQoYmRldiwgc3RhcnQgPj4gOSwgc2l6ZSA+PiA5LAot CQkJCQkJICAgR0ZQX05PRlMsIDApOworCQkJCQkJICAgR0ZQX05PRlMpOwogCQkJaWYgKCFyZXQp CiAJCQkJKmRpc2NhcmRlZF9ieXRlcyArPSBzaXplOwogCQkJZWxzZSBpZiAocmV0ICE9IC1FT1BO T1RTVVBQKQpAQCAtMTI1Niw3ICsxMjU2LDcgQEAgc3RhdGljIGludCBidHJmc19pc3N1ZV9kaXNj YXJkKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHU2NCBzdGFydCwgdTY0IGxlbiwKIAogCWlm IChieXRlc19sZWZ0KSB7CiAJCXJldCA9IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHN0YXJ0 ID4+IDksIGJ5dGVzX2xlZnQgPj4gOSwKLQkJCQkJICAgR0ZQX05PRlMsIDApOworCQkJCQkgICBH RlBfTk9GUyk7CiAJCWlmICghcmV0KQogCQkJKmRpc2NhcmRlZF9ieXRlcyArPSBieXRlc19sZWZ0 OwogCX0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWJhbGxvYy5jIGIvZnMvZXh0NC9tYmFsbG9jLmMK aW5kZXggNmQxODIwNTM2ZDg4ZC4uZWE2NTNkMTlmOWVjNyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9t YmFsbG9jLmMKKysrIGIvZnMvZXh0NC9tYmFsbG9jLmMKQEAgLTM2MjksNyArMzYyOSw3IEBAIHN0 YXRpYyBpbmxpbmUgaW50IGV4dDRfaXNzdWVfZGlzY2FyZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNi LAogCQlyZXR1cm4gX19ibGtkZXZfaXNzdWVfZGlzY2FyZChzYi0+c19iZGV2LAogCQkJKHNlY3Rv cl90KWRpc2NhcmRfYmxvY2sgPDwgKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSksCiAJCQkoc2Vj dG9yX3QpY291bnQgPDwgKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSksCi0JCQlHRlBfTk9GUywg MCwgYmlvcCk7CisJCQlHRlBfTk9GUywgYmlvcCk7CiAJfSBlbHNlCiAJCXJldHVybiBzYl9pc3N1 ZV9kaXNjYXJkKHNiLCBkaXNjYXJkX2Jsb2NrLCBjb3VudCwgR0ZQX05PRlMsIDApOwogfQpkaWZm IC0tZ2l0IGEvZnMvZjJmcy9maWxlLmMgYi9mcy9mMmZzL2ZpbGUuYwppbmRleCA4MDUzZDk5ZjM5 MjBiLi4zNWI2YzcyMGMyYmMxIDEwMDY0NAotLS0gYS9mcy9mMmZzL2ZpbGUuYworKysgYi9mcy9m MmZzL2ZpbGUuYwpAQCAtMzY4NSwxOCArMzY4NSwxOCBAQCBzdGF0aWMgaW50IGYyZnNfcmVzZXJ2 ZV9jb21wcmVzc19ibG9ja3Moc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGxvbmcgYXJnKQog c3RhdGljIGludCBmMmZzX3NlY3VyZV9lcmFzZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBz dHJ1Y3QgaW5vZGUgKmlub2RlLAogCQlwZ29mZl90IG9mZiwgYmxvY2tfdCBibG9jaywgYmxvY2tf dCBsZW4sIHUzMiBmbGFncykKIHsKLQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkZXZfZ2V0 X3F1ZXVlKGJkZXYpOwogCXNlY3Rvcl90IHNlY3RvciA9IFNFQ1RPUl9GUk9NX0JMT0NLKGJsb2Nr KTsKIAlzZWN0b3JfdCBucl9zZWN0cyA9IFNFQ1RPUl9GUk9NX0JMT0NLKGxlbik7CiAJaW50IHJl dCA9IDA7CiAKLQlpZiAoIXEpCi0JCXJldHVybiAtRU5YSU87Ci0KLQlpZiAoZmxhZ3MgJiBGMkZT X1RSSU1fRklMRV9ESVNDQVJEKQotCQlyZXQgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LCBz ZWN0b3IsIG5yX3NlY3RzLCBHRlBfTk9GUywKLQkJCQkJCWJsa19xdWV1ZV9zZWN1cmVfZXJhc2Uo cSkgPwotCQkJCQkJQkxLREVWX0RJU0NBUkRfU0VDVVJFIDogMCk7CisJaWYgKGZsYWdzICYgRjJG U19UUklNX0ZJTEVfRElTQ0FSRCkgeworCQlpZiAoYmRldl9tYXhfc2VjdXJlX2VyYXNlX3NlY3Rv cnMoYmRldikpCisJCQlyZXQgPSBibGtkZXZfaXNzdWVfc2VjdXJlX2VyYXNlKGJkZXYsIHNlY3Rv ciwgbnJfc2VjdHMsCisJCQkJCUdGUF9OT0ZTKTsKKwkJZWxzZQorCQkJcmV0ID0gYmxrZGV2X2lz c3VlX2Rpc2NhcmQoYmRldiwgc2VjdG9yLCBucl9zZWN0cywKKwkJCQkJR0ZQX05PRlMpOworCX0K IAogCWlmICghcmV0ICYmIChmbGFncyAmIEYyRlNfVFJJTV9GSUxFX1pFUk9PVVQpKSB7CiAJCWlm IChJU19FTkNSWVBURUQoaW5vZGUpKQpkaWZmIC0tZ2l0IGEvZnMvZjJmcy9zZWdtZW50LmMgYi9m cy9mMmZzL3NlZ21lbnQuYwppbmRleCA3MWYwOWFkYmNiYTg2Li5lNDMzYzYxZTY0YjkzIDEwMDY0 NAotLS0gYS9mcy9mMmZzL3NlZ21lbnQuYworKysgYi9mcy9mMmZzL3NlZ21lbnQuYwpAQCAtMTI0 NCw3ICsxMjQ0LDcgQEAgc3RhdGljIGludCBfX3N1Ym1pdF9kaXNjYXJkX2NtZChzdHJ1Y3QgZjJm c19zYl9pbmZvICpzYmksCiAJCWVyciA9IF9fYmxrZGV2X2lzc3VlX2Rpc2NhcmQoYmRldiwKIAkJ CQkJU0VDVE9SX0ZST01fQkxPQ0soc3RhcnQpLAogCQkJCQlTRUNUT1JfRlJPTV9CTE9DSyhsZW4p LAotCQkJCQlHRlBfTk9GUywgMCwgJmJpbyk7CisJCQkJCUdGUF9OT0ZTLCAmYmlvKTsKIHN1Ym1p dDoKIAkJaWYgKGVycikgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRjLT5sb2NrLCBmbGFncyk7 CmRpZmYgLS1naXQgYS9mcy9qYmQyL2pvdXJuYWwuYyBiL2ZzL2piZDIvam91cm5hbC5jCmluZGV4 IDE5ZDIyNmNkNGZmNGQuLmMwY2JlZWFlYzJkMWEgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvam91cm5h bC5jCisrKyBiL2ZzL2piZDIvam91cm5hbC5jCkBAIC0xODI1LDcgKzE4MjUsNyBAQCBzdGF0aWMg aW50IF9famJkMl9qb3VybmFsX2VyYXNlKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgaW50 IGZsYWdzKQogCQkJZXJyID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQoam91cm5hbC0+al9kZXYsCiAJ CQkJCWJ5dGVfc3RhcnQgPj4gU0VDVE9SX1NISUZULAogCQkJCQlieXRlX2NvdW50ID4+IFNFQ1RP Ul9TSElGVCwKLQkJCQkJR0ZQX05PRlMsIDApOworCQkJCQlHRlBfTk9GUyk7CiAJCX0gZWxzZSBp ZiAoZmxhZ3MgJiBKQkQyX0pPVVJOQUxfRkxVU0hfWkVST09VVCkgewogCQkJZXJyID0gYmxrZGV2 X2lzc3VlX3plcm9vdXQoam91cm5hbC0+al9kZXYsCiAJCQkJCWJ5dGVfc3RhcnQgPj4gU0VDVE9S X1NISUZULApkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3N1ZmlsZS5jIGIvZnMvbmlsZnMyL3N1Zmls ZS5jCmluZGV4IGUzODVjY2EyMDA0YTcuLjc3ZmY4ZTk1NDIxZmEgMTAwNjQ0Ci0tLSBhL2ZzL25p bGZzMi9zdWZpbGUuYworKysgYi9mcy9uaWxmczIvc3VmaWxlLmMKQEAgLTExMDAsNyArMTEwMCw3 IEBAIGludCBuaWxmc19zdWZpbGVfdHJpbV9mcyhzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSwgc3RydWN0 IGZzdHJpbV9yYW5nZSAqcmFuZ2UpCiAJCQkJcmV0ID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQobmls ZnMtPm5zX2JkZXYsCiAJCQkJCQlzdGFydCAqIHNlY3RzX3Blcl9ibG9jaywKIAkJCQkJCW5ibG9j a3MgKiBzZWN0c19wZXJfYmxvY2ssCi0JCQkJCQlHRlBfTk9GUywgMCk7CisJCQkJCQlHRlBfTk9G Uyk7CiAJCQkJaWYgKHJldCA8IDApIHsKIAkJCQkJcHV0X2JoKHN1X2JoKTsKIAkJCQkJZ290byBv dXRfc2VtOwpAQCAtMTEzNCw3ICsxMTM0LDcgQEAgaW50IG5pbGZzX3N1ZmlsZV90cmltX2ZzKHN0 cnVjdCBpbm9kZSAqc3VmaWxlLCBzdHJ1Y3QgZnN0cmltX3JhbmdlICpyYW5nZSkKIAkJCXJldCA9 IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKG5pbGZzLT5uc19iZGV2LAogCQkJCQlzdGFydCAqIHNlY3Rz X3Blcl9ibG9jaywKIAkJCQkJbmJsb2NrcyAqIHNlY3RzX3Blcl9ibG9jaywKLQkJCQkJR0ZQX05P RlMsIDApOworCQkJCQlHRlBfTk9GUyk7CiAJCQlpZiAoIXJldCkKIAkJCQluZGlzY2FyZGVkICs9 IG5ibG9ja3M7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi90aGVfbmlsZnMuYyBiL2ZzL25p bGZzMi90aGVfbmlsZnMuYwppbmRleCBkZDQ4YThmNzRkNTc3Li4zYjRhMDc5Yzk2MTdjIDEwMDY0 NAotLS0gYS9mcy9uaWxmczIvdGhlX25pbGZzLmMKKysrIGIvZnMvbmlsZnMyL3RoZV9uaWxmcy5j CkBAIC02NzIsNyArNjcyLDcgQEAgaW50IG5pbGZzX2Rpc2NhcmRfc2VnbWVudHMoc3RydWN0IHRo ZV9uaWxmcyAqbmlsZnMsIF9fdTY0ICpzZWdudW1wLAogCQkJcmV0ID0gYmxrZGV2X2lzc3VlX2Rp c2NhcmQobmlsZnMtPm5zX2JkZXYsCiAJCQkJCQkgICBzdGFydCAqIHNlY3RzX3Blcl9ibG9jaywK IAkJCQkJCSAgIG5ibG9ja3MgKiBzZWN0c19wZXJfYmxvY2ssCi0JCQkJCQkgICBHRlBfTk9GUywg MCk7CisJCQkJCQkgICBHRlBfTk9GUyk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlyZXR1cm4gcmV0 OwogCQkJbmJsb2NrcyA9IDA7CkBAIC02ODIsNyArNjgyLDcgQEAgaW50IG5pbGZzX2Rpc2NhcmRf c2VnbWVudHMoc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMsIF9fdTY0ICpzZWdudW1wLAogCQlyZXQg PSBibGtkZXZfaXNzdWVfZGlzY2FyZChuaWxmcy0+bnNfYmRldiwKIAkJCQkJICAgc3RhcnQgKiBz ZWN0c19wZXJfYmxvY2ssCiAJCQkJCSAgIG5ibG9ja3MgKiBzZWN0c19wZXJfYmxvY2ssCi0JCQkJ CSAgIEdGUF9OT0ZTLCAwKTsKKwkJCQkJICAgR0ZQX05PRlMpOwogCXJldHVybiByZXQ7CiB9CiAK ZGlmZiAtLWdpdCBhL2ZzL250ZnMzL3N1cGVyLmMgYi9mcy9udGZzMy9zdXBlci5jCmluZGV4IDVm MmU0MTRjZmE3OWIuLjU3ODFiOWU4ZTNkODUgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMzL3N1cGVyLmMK KysrIGIvZnMvbnRmczMvc3VwZXIuYwpAQCAtMTMzMyw3ICsxMzMzLDcgQEAgaW50IG50ZnNfZGlz Y2FyZChzdHJ1Y3QgbnRmc19zYl9pbmZvICpzYmksIENMU1QgbGNuLCBDTFNUIGxlbikKIAkJcmV0 dXJuIDA7CiAKIAllcnIgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChzYi0+c19iZGV2LCBzdGFydCA+ PiA5LCAoZW5kIC0gc3RhcnQpID4+IDksCi0JCQkJICAgR0ZQX05PRlMsIDApOworCQkJCSAgIEdG UF9OT0ZTKTsKIAogCWlmIChlcnIgPT0gLUVPUE5PVFNVUFApCiAJCXNiaS0+ZmxhZ3MgfD0gTlRG U19GTEFHU19OT0RJU0NBUkQ7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rpc2NhcmQuYyBiL2Zz L3hmcy94ZnNfZGlzY2FyZC5jCmluZGV4IGUyYWRhMTE1YzIzZjkuLmM2ZmUzZjZlYmI2YjAgMTAw NjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlzY2FyZC5jCisrKyBiL2ZzL3hmcy94ZnNfZGlzY2FyZC5j CkBAIC0xMTQsNyArMTE0LDcgQEAgeGZzX3RyaW1fZXh0ZW50cygKIAkJfQogCiAJCXRyYWNlX3hm c19kaXNjYXJkX2V4dGVudChtcCwgYWdubywgZmJubywgZmxlbik7Ci0JCWVycm9yID0gYmxrZGV2 X2lzc3VlX2Rpc2NhcmQoYmRldiwgZGJubywgZGxlbiwgR0ZQX05PRlMsIDApOworCQllcnJvciA9 IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIGRibm8sIGRsZW4sIEdGUF9OT0ZTKTsKIAkJaWYg KGVycm9yKQogCQkJZ290byBvdXRfZGVsX2N1cnNvcjsKIAkJKmJsb2Nrc190cmltbWVkICs9IGZs ZW47CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZ19jaWwuYyBiL2ZzL3hmcy94ZnNfbG9nX2Np bC5jCmluZGV4IGJhNTczMjNiZmRjZWEuLmM5ZjU1ZTRmMDk1NzEgMTAwNjQ0Ci0tLSBhL2ZzL3hm cy94ZnNfbG9nX2NpbC5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nX2NpbC5jCkBAIC02MDUsNyArNjA1 LDcgQEAgeGxvZ19kaXNjYXJkX2J1c3lfZXh0ZW50cygKIAkJZXJyb3IgPSBfX2Jsa2Rldl9pc3N1 ZV9kaXNjYXJkKG1wLT5tX2RkZXZfdGFyZ3AtPmJ0X2JkZXYsCiAJCQkJWEZTX0FHQl9UT19EQURE UihtcCwgYnVzeXAtPmFnbm8sIGJ1c3lwLT5ibm8pLAogCQkJCVhGU19GU0JfVE9fQkIobXAsIGJ1 c3lwLT5sZW5ndGgpLAotCQkJCUdGUF9OT0ZTLCAwLCAmYmlvKTsKKwkJCQlHRlBfTk9GUywgJmJp byk7CiAJCWlmIChlcnJvciAmJiBlcnJvciAhPSAtRU9QTk9UU1VQUCkgewogCQkJeGZzX2luZm8o bXAsCiAJICJkaXNjYXJkIGZhaWxlZCBmb3IgZXh0ZW50IFsweCVsbHgsJXVdLCBlcnJvciAlZCIs CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtk ZXYuaAppbmRleCBmMWNmNTU3ZWEyMGVmLi5jOWI1OTI1YWY1YTNiIDEwMDY0NAotLS0gYS9pbmNs dWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTI0OCw2 ICsyNDgsNyBAQCBzdHJ1Y3QgcXVldWVfbGltaXRzIHsKIAl1bnNpZ25lZCBpbnQJCWlvX29wdDsK IAl1bnNpZ25lZCBpbnQJCW1heF9kaXNjYXJkX3NlY3RvcnM7CiAJdW5zaWduZWQgaW50CQltYXhf aHdfZGlzY2FyZF9zZWN0b3JzOworCXVuc2lnbmVkIGludAkJbWF4X3NlY3VyZV9lcmFzZV9zZWN0 b3JzOwogCXVuc2lnbmVkIGludAkJbWF4X3dyaXRlX3plcm9lc19zZWN0b3JzOwogCXVuc2lnbmVk IGludAkJbWF4X3pvbmVfYXBwZW5kX3NlY3RvcnM7CiAJdW5zaWduZWQgaW50CQlkaXNjYXJkX2dy YW51bGFyaXR5OwpAQCAtNTQyLDcgKzU0Myw2IEBAIHN0cnVjdCByZXF1ZXN0X3F1ZXVlIHsKICNk ZWZpbmUgUVVFVUVfRkxBR19JT19TVEFUCTcJLyogZG8gZGlzay9wYXJ0aXRpb25zIElPIGFjY291 bnRpbmcgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19OT1hNRVJHRVMJOQkvKiBObyBleHRlbmRlZCBt ZXJnZXMgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19BRERfUkFORE9NCTEwCS8qIENvbnRyaWJ1dGVz IHRvIHJhbmRvbSBwb29sICovCi0jZGVmaW5lIFFVRVVFX0ZMQUdfU0VDRVJBU0UJMTEJLyogc3Vw cG9ydHMgc2VjdXJlIGVyYXNlICovCiAjZGVmaW5lIFFVRVVFX0ZMQUdfU0FNRV9GT1JDRQkxMgkv KiBmb3JjZSBjb21wbGV0ZSBvbiBzYW1lIENQVSAqLwogI2RlZmluZSBRVUVVRV9GTEFHX0RFQUQJ CTEzCS8qIHF1ZXVlIHRlYXItZG93biBmaW5pc2hlZCAqLwogI2RlZmluZSBRVUVVRV9GTEFHX0lO SVRfRE9ORQkxNAkvKiBxdWV1ZSBpcyBpbml0aWFsaXplZCAqLwpAQCAtNTgzLDggKzU4Myw2IEBA IGJvb2wgYmxrX3F1ZXVlX2ZsYWdfdGVzdF9hbmRfc2V0KHVuc2lnbmVkIGludCBmbGFnLCBzdHJ1 Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CiAjZGVmaW5lIGJsa19xdWV1ZV9hZGRfcmFuZG9tKHEpCXRl c3RfYml0KFFVRVVFX0ZMQUdfQUREX1JBTkRPTSwgJihxKS0+cXVldWVfZmxhZ3MpCiAjZGVmaW5l IGJsa19xdWV1ZV96b25lX3Jlc2V0YWxsKHEpCVwKIAl0ZXN0X2JpdChRVUVVRV9GTEFHX1pPTkVf UkVTRVRBTEwsICYocSktPnF1ZXVlX2ZsYWdzKQotI2RlZmluZSBibGtfcXVldWVfc2VjdXJlX2Vy YXNlKHEpIFwKLQkodGVzdF9iaXQoUVVFVUVfRkxBR19TRUNFUkFTRSwgJihxKS0+cXVldWVfZmxh Z3MpKQogI2RlZmluZSBibGtfcXVldWVfZGF4KHEpCXRlc3RfYml0KFFVRVVFX0ZMQUdfREFYLCAm KHEpLT5xdWV1ZV9mbGFncykKICNkZWZpbmUgYmxrX3F1ZXVlX3BjaV9wMnBkbWEocSkJXAogCXRl c3RfYml0KFFVRVVFX0ZMQUdfUENJX1AyUERNQSwgJihxKS0+cXVldWVfZmxhZ3MpCkBAIC05NDcs NiArOTQ1LDggQEAgZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2NodW5rX3NlY3RvcnMoc3RydWN0IHJl cXVlc3RfcXVldWUgKiwgdW5zaWduZWQgaW50KTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9tYXhf c2VnbWVudHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgc2hvcnQpOwogZXh0ZXJu IHZvaWQgYmxrX3F1ZXVlX21heF9kaXNjYXJkX3NlZ21lbnRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVl ICosCiAJCXVuc2lnbmVkIHNob3J0KTsKK3ZvaWQgYmxrX3F1ZXVlX21heF9zZWN1cmVfZXJhc2Vf c2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJdW5zaWduZWQgaW50IG1heF9zZWN0 b3JzKTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9tYXhfc2VnbWVudF9zaXplKHN0cnVjdCByZXF1 ZXN0X3F1ZXVlICosIHVuc2lnbmVkIGludCk7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfbWF4X2Rp c2NhcmRfc2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKIAkJdW5zaWduZWQgaW50IG1h eF9kaXNjYXJkX3NlY3RvcnMpOwpAQCAtMTA4NywxMyArMTA4NywxMiBAQCBzdGF0aWMgaW5saW5l IGxvbmcgbnJfYmxvY2tkZXZfcGFnZXModm9pZCkKIAogZXh0ZXJuIHZvaWQgYmxrX2lvX3NjaGVk dWxlKHZvaWQpOwogCi0jZGVmaW5lIEJMS0RFVl9ESVNDQVJEX1NFQ1VSRQkoMSA8PCAwKQkvKiBp c3N1ZSBhIHNlY3VyZSBlcmFzZSAqLwotCi1leHRlcm4gaW50IGJsa2Rldl9pc3N1ZV9kaXNjYXJk KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwKLQkJc2VjdG9yX3Qg bnJfc2VjdHMsIGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiBp bnQgX19ibGtkZXZfaXNzdWVfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0 b3JfdCBzZWN0b3IsCi0JCXNlY3Rvcl90IG5yX3NlY3RzLCBnZnBfdCBnZnBfbWFzaywgaW50IGZs YWdzLAotCQlzdHJ1Y3QgYmlvICoqYmlvcCk7CitpbnQgYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc3Ry dWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3Qgc2VjdG9yLAorCQlzZWN0b3JfdCBucl9z ZWN0cywgZ2ZwX3QgZ2ZwX21hc2spOworaW50IF9fYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc3RydWN0 IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3Qgc2VjdG9yLAorCQlzZWN0b3JfdCBucl9zZWN0 cywgZ2ZwX3QgZ2ZwX21hc2ssIHN0cnVjdCBiaW8gKipiaW9wKTsKK2ludCBibGtkZXZfaXNzdWVf c2VjdXJlX2VyYXNlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwK KwkJc2VjdG9yX3QgbnJfc2VjdHMsIGdmcF90IGdmcCk7CiAKICNkZWZpbmUgQkxLREVWX1pFUk9f Tk9VTk1BUAkoMSA8PCAwKSAgLyogZG8gbm90IGZyZWUgYmxvY2tzICovCiAjZGVmaW5lIEJMS0RF Vl9aRVJPX05PRkFMTEJBQ0sJKDEgPDwgMSkgIC8qIGRvbid0IHdyaXRlIGV4cGxpY2l0IHplcm9l cyAqLwpAQCAtMTExMiw3ICsxMTExLDcgQEAgc3RhdGljIGlubGluZSBpbnQgc2JfaXNzdWVfZGlz Y2FyZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzZWN0b3JfdCBibG9jaywKIAkJCQkJICAgICAg U0VDVE9SX1NISUZUKSwKIAkJCQkgICAgbnJfYmxvY2tzIDw8IChzYi0+c19ibG9ja3NpemVfYml0 cyAtCiAJCQkJCQkgIFNFQ1RPUl9TSElGVCksCi0JCQkJICAgIGdmcF9tYXNrLCBmbGFncyk7CisJ CQkJICAgIGdmcF9tYXNrKTsKIH0KIHN0YXRpYyBpbmxpbmUgaW50IHNiX2lzc3VlX3plcm9vdXQo c3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc2VjdG9yX3QgYmxvY2ssCiAJCXNlY3Rvcl90IG5yX2Js b2NrcywgZ2ZwX3QgZ2ZwX21hc2spCkBAIC0xMjYyLDYgKzEyNjEsMTIgQEAgc3RhdGljIGlubGlu ZSB1bnNpZ25lZCBpbnQgYmRldl9kaXNjYXJkX2dyYW51bGFyaXR5KHN0cnVjdCBibG9ja19kZXZp Y2UgKmJkZXYpCiAJcmV0dXJuIGJkZXZfZ2V0X3F1ZXVlKGJkZXYpLT5saW1pdHMuZGlzY2FyZF9n cmFudWxhcml0eTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2JkZXZfbWF4X3Nl Y3VyZV9lcmFzZV9zZWN0b3JzKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJcmV0dXJu IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpLT5saW1pdHMubWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzOwor fQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBiZGV2X3dyaXRlX3plcm9lc19zZWN0b3Jz KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCiB7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEg PSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9z d2FwZmlsZS5jCmluZGV4IDVkOWNlZGY5ZTdiODQuLmEyYjMxZmVhMGM0MmUgMTAwNjQ0Ci0tLSBh L21tL3N3YXBmaWxlLmMKKysrIGIvbW0vc3dhcGZpbGUuYwpAQCAtMTc5LDcgKzE3OSw3IEBAIHN0 YXRpYyBpbnQgZGlzY2FyZF9zd2FwKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKIAlucl9i bG9ja3MgPSAoKHNlY3Rvcl90KXNlLT5ucl9wYWdlcyAtIDEpIDw8IChQQUdFX1NISUZUIC0gOSk7 CiAJaWYgKG5yX2Jsb2NrcykgewogCQllcnIgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChzaS0+YmRl diwgc3RhcnRfYmxvY2ssCi0JCQkJbnJfYmxvY2tzLCBHRlBfS0VSTkVMLCAwKTsKKwkJCQlucl9i bG9ja3MsIEdGUF9LRVJORUwpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAkJY29uZF9y ZXNjaGVkKCk7CkBAIC0xOTAsNyArMTkwLDcgQEAgc3RhdGljIGludCBkaXNjYXJkX3N3YXAoc3Ry dWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQogCQlucl9ibG9ja3MgPSAoc2VjdG9yX3Qpc2UtPm5y X3BhZ2VzIDw8IChQQUdFX1NISUZUIC0gOSk7CiAKIAkJZXJyID0gYmxrZGV2X2lzc3VlX2Rpc2Nh cmQoc2ktPmJkZXYsIHN0YXJ0X2Jsb2NrLAotCQkJCW5yX2Jsb2NrcywgR0ZQX0tFUk5FTCwgMCk7 CisJCQkJbnJfYmxvY2tzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGVycikKIAkJCWJyZWFrOwogCkBA IC0yNTQsNyArMjU0LDcgQEAgc3RhdGljIHZvaWQgZGlzY2FyZF9zd2FwX2NsdXN0ZXIoc3RydWN0 IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCQlzdGFydF9ibG9jayA8PD0gUEFHRV9TSElGVCAtIDk7 CiAJCW5yX2Jsb2NrcyA8PD0gUEFHRV9TSElGVCAtIDk7CiAJCWlmIChibGtkZXZfaXNzdWVfZGlz Y2FyZChzaS0+YmRldiwgc3RhcnRfYmxvY2ssCi0JCQkJCW5yX2Jsb2NrcywgR0ZQX05PSU8sIDAp KQorCQkJCQlucl9ibG9ja3MsIEdGUF9OT0lPKSkKIAkJCWJyZWFrOwogCiAJCXNlID0gbmV4dF9z ZShzZSk7Ci0tIAoyLjMwLjIKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX18KTGludXggTVREIGRpc2N1c3Npb24gbWFpbGluZyBsaXN0Cmh0dHA6 Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtbXRkLwo= From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Christoph Hellwig Subject: [PATCH 26/27] block: decouple REQ_OP_SECURE_ERASE from REQ_OP_DISCARD Date: Sat, 9 Apr 2022 06:50:42 +0200 Message-Id: <20220409045043.23593-27-hch@lst.de> In-Reply-To: <20220409045043.23593-1-hch@lst.de> References: <20220409045043.23593-1-hch@lst.de> MIME-Version: 1.0 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-um" Errors-To: linux-um-bounces+geert=linux-m68k.org@lists.infradead.org To: Jens Axboe Cc: dm-devel@redhat.com, linux-xfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-um@lists.infradead.org, linux-block@vger.kernel.org, drbd-dev@lists.linbit.com, nbd@other.debian.org, ceph-devel@vger.kernel.org, virtualization@lists.linux-foundation.org, xen-devel@lists.xenproject.org, linux-bcache@vger.kernel.org, linux-raid@vger.kernel.org, linux-mmc@vger.kernel.org, linux-mtd@lists.infradead.org, linux-nvme@lists.infradead.org, linux-s390@vger.kernel.org, linux-scsi@vger.kernel.org, target-devel@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, cluster-devel@redhat.com, jfs-discussion@lists.sourceforge.net, linux-nilfs@vger.kernel.org, ntfs3@lists.linux.dev, ocfs2-devel@oss.oracle.com, linux-mm@kvack.org, "Martin K . Petersen" , =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= , Ryusuke Konishi , Coly Li , David Sterba U2VjdXJlIGVyYXNlIGlzIGEgdmVyeSBkaWZmZXJlbnQgb3BlcmF0aW9uIGZyb20gZGlzY2FyZCBp biB0aGF0IGl0IGlzCmEgZGF0YSBpbnRlZ3JpdHkgb3BlcmF0aW9uIHZzIGhpbnQuICBGdWxseSBz cGxpdCB0aGUgbGltaXRzIGFuZCBoZWxwZXIKaW5mcmFzdHJ1Y3R1cmUgdG8gbWFrZSB0aGUgc2Vw YXJhdGlvbiBtb3JlIGNsZWFyLgoKU2lnbmVkLW9mZi1ieTogQ2hyaXN0b3BoIEhlbGx3aWcgPGhj aEBsc3QuZGU+ClJldmlld2VkLWJ5OiBNYXJ0aW4gSy4gUGV0ZXJzZW4gPG1hcnRpbi5wZXRlcnNl bkBvcmFjbGUuY29tPgpBY2tlZC1ieTogQ2hyaXN0b3BoIELDtmhtd2FsZGVyIDxjaHJpc3RvcGgu Ym9laG13YWxkZXJAbGluYml0LmNvbT4gW2RyYmRdCkFja2VkLWJ5OiBSeXVzdWtlIEtvbmlzaGkg PGtvbmlzaGkucnl1c3VrZUBnbWFpbC5jb20+IFtuaWZzMl0KQWNrZWQtYnk6IENvbHkgTGkgPGNv bHlsaUBzdXNlLmRlPiBbZHJiZF0KQWNrZWQtYnk6IERhdmlkIFN0ZXJiYSA8ZHN0ZXJiYUBzdXNl LmNvbT4gW2J0cmZzXQotLS0KIGJsb2NrL2Jsay1jb3JlLmMgICAgICAgICAgICAgICAgICAgIHwg IDIgKy0KIGJsb2NrL2Jsay1saWIuYyAgICAgICAgICAgICAgICAgICAgIHwgNjQgKysrKysrKysr KysrKysrKysrKystLS0tLS0tLS0KIGJsb2NrL2Jsay1tcS1kZWJ1Z2ZzLmMgICAgICAgICAgICAg IHwgIDEgLQogYmxvY2svYmxrLXNldHRpbmdzLmMgICAgICAgICAgICAgICAgfCAxNiArKysrKysr LQogYmxvY2svZm9wcy5jICAgICAgICAgICAgICAgICAgICAgICAgfCAgMiArLQogYmxvY2svaW9j dGwuYyAgICAgICAgICAgICAgICAgICAgICAgfCA0MyArKysrKysrKysrKysrKystLS0tCiBkcml2 ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5jICB8ICA1ICsrLQogZHJpdmVycy9ibG9jay9y bmJkL3JuYmQtY2x0LmMgICAgICAgfCAgNCArLQogZHJpdmVycy9ibG9jay9ybmJkL3JuYmQtc3J2 LWRldi5oICAgfCAgMiArLQogZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGtiYWNrLmMgfCAx NSArKystLS0tCiBkcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL3hlbmJ1cy5jICB8ICA1ICstLQog ZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYyAgICAgICAgfCAgNSArKy0KIGRyaXZlcnMvbWQv YmNhY2hlL2FsbG9jLmMgICAgICAgICAgIHwgIDIgKy0KIGRyaXZlcnMvbWQvZG0tdGFibGUuYyAg ICAgICAgICAgICAgIHwgIDggKystLQogZHJpdmVycy9tZC9kbS10aGluLmMgICAgICAgICAgICAg ICAgfCAgNCArLQogZHJpdmVycy9tZC9tZC5jICAgICAgICAgICAgICAgICAgICAgfCAgMiArLQog ZHJpdmVycy9tZC9yYWlkNS1jYWNoZS5jICAgICAgICAgICAgfCAgNiArLS0KIGRyaXZlcnMvbW1j L2NvcmUvcXVldWUuYyAgICAgICAgICAgIHwgIDIgKy0KIGRyaXZlcnMvbnZtZS90YXJnZXQvaW8t Y21kLWJkZXYuYyAgIHwgIDIgKy0KIGRyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYyAg IHwgIDIgKy0KIGRyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2libG9jay5jIHwgIDIgKy0KIGZz L2J0cmZzL2V4dGVudC10cmVlLmMgICAgICAgICAgICAgIHwgIDQgKy0KIGZzL2V4dDQvbWJhbGxv Yy5jICAgICAgICAgICAgICAgICAgIHwgIDIgKy0KIGZzL2YyZnMvZmlsZS5jICAgICAgICAgICAg ICAgICAgICAgIHwgMTYgKysrKy0tLS0KIGZzL2YyZnMvc2VnbWVudC5jICAgICAgICAgICAgICAg ICAgIHwgIDIgKy0KIGZzL2piZDIvam91cm5hbC5jICAgICAgICAgICAgICAgICAgIHwgIDIgKy0K IGZzL25pbGZzMi9zdWZpbGUuYyAgICAgICAgICAgICAgICAgIHwgIDQgKy0KIGZzL25pbGZzMi90 aGVfbmlsZnMuYyAgICAgICAgICAgICAgIHwgIDQgKy0KIGZzL250ZnMzL3N1cGVyLmMgICAgICAg ICAgICAgICAgICAgIHwgIDIgKy0KIGZzL3hmcy94ZnNfZGlzY2FyZC5jICAgICAgICAgICAgICAg IHwgIDIgKy0KIGZzL3hmcy94ZnNfbG9nX2NpbC5jICAgICAgICAgICAgICAgIHwgIDIgKy0KIGlu Y2x1ZGUvbGludXgvYmxrZGV2LmggICAgICAgICAgICAgIHwgMjcgKysrKysrKy0tLS0tCiBtbS9z d2FwZmlsZS5jICAgICAgICAgICAgICAgICAgICAgICB8ICA2ICstLQogMzMgZmlsZXMgY2hhbmdl ZCwgMTY4IGluc2VydGlvbnMoKyksIDk5IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2Jsb2Nr L2Jsay1jb3JlLmMgYi9ibG9jay9ibGstY29yZS5jCmluZGV4IGI1YzNhODA0OTEzNGMuLmVlMThi NmE2OTliZGYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jb3JlLmMKKysrIGIvYmxvY2svYmxrLWNv cmUuYwpAQCAtODI0LDcgKzgyNCw3IEBAIHZvaWQgc3VibWl0X2Jpb19ub2FjY3Qoc3RydWN0IGJp byAqYmlvKQogCQkJZ290byBub3Rfc3VwcG9ydGVkOwogCQlicmVhazsKIAljYXNlIFJFUV9PUF9T RUNVUkVfRVJBU0U6Ci0JCWlmICghYmxrX3F1ZXVlX3NlY3VyZV9lcmFzZShxKSkKKwkJaWYgKCFi ZGV2X21heF9zZWN1cmVfZXJhc2Vfc2VjdG9ycyhiZGV2KSkKIAkJCWdvdG8gbm90X3N1cHBvcnRl ZDsKIAkJYnJlYWs7CiAJY2FzZSBSRVFfT1BfWk9ORV9BUFBFTkQ6CmRpZmYgLS1naXQgYS9ibG9j ay9ibGstbGliLmMgYi9ibG9jay9ibGstbGliLmMKaW5kZXggNDNhYTRkN2ZlODU5Zi4uMDliN2Ux MjAwYzBmNCAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLWxpYi5jCisrKyBiL2Jsb2NrL2Jsay1saWIu YwpAQCAtMzYsMjYgKzM2LDE1IEBAIHN0YXRpYyBzZWN0b3JfdCBiaW9fZGlzY2FyZF9saW1pdChz dHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBzZWN0b3IpCiB9CiAKIGludCBfX2Js a2Rldl9pc3N1ZV9kaXNjYXJkKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNl Y3RvciwKLQkJc2VjdG9yX3QgbnJfc2VjdHMsIGdmcF90IGdmcF9tYXNrLCBpbnQgZmxhZ3MsCi0J CXN0cnVjdCBiaW8gKipiaW9wKQorCQlzZWN0b3JfdCBucl9zZWN0cywgZ2ZwX3QgZ2ZwX21hc2ss IHN0cnVjdCBiaW8gKipiaW9wKQogewotCXN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxID0gYmRldl9n ZXRfcXVldWUoYmRldik7CiAJc3RydWN0IGJpbyAqYmlvID0gKmJpb3A7Ci0JdW5zaWduZWQgaW50 IG9wOwogCXNlY3Rvcl90IGJzX21hc2s7CiAKIAlpZiAoYmRldl9yZWFkX29ubHkoYmRldikpCiAJ CXJldHVybiAtRVBFUk07Ci0KLQlpZiAoZmxhZ3MgJiBCTEtERVZfRElTQ0FSRF9TRUNVUkUpIHsK LQkJaWYgKCFibGtfcXVldWVfc2VjdXJlX2VyYXNlKHEpKQotCQkJcmV0dXJuIC1FT1BOT1RTVVBQ OwotCQlvcCA9IFJFUV9PUF9TRUNVUkVfRVJBU0U7Ci0JfSBlbHNlIHsKLQkJaWYgKCFiZGV2X21h eF9kaXNjYXJkX3NlY3RvcnMoYmRldikpCi0JCQlyZXR1cm4gLUVPUE5PVFNVUFA7Ci0JCW9wID0g UkVRX09QX0RJU0NBUkQ7Ci0JfQorCWlmICghYmRldl9tYXhfZGlzY2FyZF9zZWN0b3JzKGJkZXYp KQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CiAKIAkvKiBJbiBjYXNlIHRoZSBkaXNjYXJkIGdyYW51 bGFyaXR5IGlzbid0IHNldCBieSBidWdneSBkZXZpY2UgZHJpdmVyICovCiAJaWYgKFdBUk5fT05f T05DRSghYmRldl9kaXNjYXJkX2dyYW51bGFyaXR5KGJkZXYpKSkgewpAQCAtNzcsNyArNjYsNyBA QCBpbnQgX19ibGtkZXZfaXNzdWVfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBz ZWN0b3JfdCBzZWN0b3IsCiAJCXNlY3Rvcl90IHJlcV9zZWN0cyA9CiAJCQltaW4obnJfc2VjdHMs IGJpb19kaXNjYXJkX2xpbWl0KGJkZXYsIHNlY3RvcikpOwogCi0JCWJpbyA9IGJsa19uZXh0X2Jp byhiaW8sIGJkZXYsIDAsIG9wLCBnZnBfbWFzayk7CisJCWJpbyA9IGJsa19uZXh0X2JpbyhiaW8s IGJkZXYsIDAsIFJFUV9PUF9ESVNDQVJELCBnZnBfbWFzayk7CiAJCWJpby0+YmlfaXRlci5iaV9z ZWN0b3IgPSBzZWN0b3I7CiAJCWJpby0+YmlfaXRlci5iaV9zaXplID0gcmVxX3NlY3RzIDw8IDk7 CiAJCXNlY3RvciArPSByZXFfc2VjdHM7CkBAIC0xMDMsMjEgKzkyLDE5IEBAIEVYUE9SVF9TWU1C T0woX19ibGtkZXZfaXNzdWVfZGlzY2FyZCk7CiAgKiBAc2VjdG9yOglzdGFydCBzZWN0b3IKICAq IEBucl9zZWN0czoJbnVtYmVyIG9mIHNlY3RvcnMgdG8gZGlzY2FyZAogICogQGdmcF9tYXNrOglt ZW1vcnkgYWxsb2NhdGlvbiBmbGFncyAoZm9yIGJpb19hbGxvYykKLSAqIEBmbGFnczoJQkxLREVW X0RJU0NBUkRfKiBmbGFncyB0byBjb250cm9sIGJlaGF2aW91cgogICoKICAqIERlc2NyaXB0aW9u OgogICogICAgSXNzdWUgYSBkaXNjYXJkIHJlcXVlc3QgZm9yIHRoZSBzZWN0b3JzIGluIHF1ZXN0 aW9uLgogICovCiBpbnQgYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc3RydWN0IGJsb2NrX2RldmljZSAq YmRldiwgc2VjdG9yX3Qgc2VjdG9yLAotCQlzZWN0b3JfdCBucl9zZWN0cywgZ2ZwX3QgZ2ZwX21h c2ssIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJCXNlY3Rvcl90IG5yX3NlY3RzLCBnZnBfdCBnZnBf bWFzaykKIHsKIAlzdHJ1Y3QgYmlvICpiaW8gPSBOVUxMOwogCXN0cnVjdCBibGtfcGx1ZyBwbHVn OwogCWludCByZXQ7CiAKIAlibGtfc3RhcnRfcGx1ZygmcGx1Zyk7Ci0JcmV0ID0gX19ibGtkZXZf aXNzdWVfZGlzY2FyZChiZGV2LCBzZWN0b3IsIG5yX3NlY3RzLCBnZnBfbWFzaywgZmxhZ3MsCi0J CQkmYmlvKTsKKwlyZXQgPSBfX2Jsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHNlY3RvciwgbnJf c2VjdHMsIGdmcF9tYXNrLCAmYmlvKTsKIAlpZiAoIXJldCAmJiBiaW8pIHsKIAkJcmV0ID0gc3Vi bWl0X2Jpb193YWl0KGJpbyk7CiAJCWlmIChyZXQgPT0gLUVPUE5PVFNVUFApCkBAIC0zMTQsMyAr MzAxLDQyIEBAIGludCBibGtkZXZfaXNzdWVfemVyb291dChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpi ZGV2LCBzZWN0b3JfdCBzZWN0b3IsCiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0woYmxr ZGV2X2lzc3VlX3plcm9vdXQpOworCitpbnQgYmxrZGV2X2lzc3VlX3NlY3VyZV9lcmFzZShzdHJ1 Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBzZWN0b3IsCisJCXNlY3Rvcl90IG5yX3Nl Y3RzLCBnZnBfdCBnZnApCit7CisJc2VjdG9yX3QgYnNfbWFzayA9IChiZGV2X2xvZ2ljYWxfYmxv Y2tfc2l6ZShiZGV2KSA+PiA5KSAtIDE7CisJdW5zaWduZWQgaW50IG1heF9zZWN0b3JzID0gYmRl dl9tYXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMoYmRldik7CisJc3RydWN0IGJpbyAqYmlvID0gTlVM TDsKKwlzdHJ1Y3QgYmxrX3BsdWcgcGx1ZzsKKwlpbnQgcmV0ID0gMDsKKworCWlmIChtYXhfc2Vj dG9ycyA9PSAwKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYgKChzZWN0b3IgfCBucl9zZWN0 cykgJiBic19tYXNrKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoYmRldl9yZWFkX29ubHkoYmRl dikpCisJCXJldHVybiAtRVBFUk07CisKKwlibGtfc3RhcnRfcGx1ZygmcGx1Zyk7CisJZm9yICg7 OykgeworCQl1bnNpZ25lZCBpbnQgbGVuID0gbWluX3Qoc2VjdG9yX3QsIG5yX3NlY3RzLCBtYXhf c2VjdG9ycyk7CisKKwkJYmlvID0gYmxrX25leHRfYmlvKGJpbywgYmRldiwgMCwgUkVRX09QX1NF Q1VSRV9FUkFTRSwgZ2ZwKTsKKwkJYmlvLT5iaV9pdGVyLmJpX3NlY3RvciA9IHNlY3RvcjsKKwkJ YmlvLT5iaV9pdGVyLmJpX3NpemUgPSBsZW47CisKKwkJc2VjdG9yICs9IGxlbiA8PCBTRUNUT1Jf U0hJRlQ7CisJCW5yX3NlY3RzIC09IGxlbiA8PCBTRUNUT1JfU0hJRlQ7CisJCWlmICghbnJfc2Vj dHMpIHsKKwkJCXJldCA9IHN1Ym1pdF9iaW9fd2FpdChiaW8pOworCQkJYmlvX3B1dChiaW8pOwor CQkJYnJlYWs7CisJCX0KKwkJY29uZF9yZXNjaGVkKCk7CisJfQorCWJsa19maW5pc2hfcGx1Zygm cGx1Zyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChibGtkZXZfaXNzdWVfc2Vj dXJlX2VyYXNlKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1tcS1kZWJ1Z2ZzLmMgYi9ibG9jay9i bGstbXEtZGVidWdmcy5jCmluZGV4IGZkMTExYzUwMDEyNTYuLjdlNDEzNmE2MGUxY2MgMTAwNjQ0 Ci0tLSBhL2Jsb2NrL2Jsay1tcS1kZWJ1Z2ZzLmMKKysrIGIvYmxvY2svYmxrLW1xLWRlYnVnZnMu YwpAQCAtMTE1LDcgKzExNSw2IEBAIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBibGtfcXVldWVf ZmxhZ19uYW1lW10gPSB7CiAJUVVFVUVfRkxBR19OQU1FKElPX1NUQVQpLAogCVFVRVVFX0ZMQUdf TkFNRShOT1hNRVJHRVMpLAogCVFVRVVFX0ZMQUdfTkFNRShBRERfUkFORE9NKSwKLQlRVUVVRV9G TEFHX05BTUUoU0VDRVJBU0UpLAogCVFVRVVFX0ZMQUdfTkFNRShTQU1FX0ZPUkNFKSwKIAlRVUVV RV9GTEFHX05BTUUoREVBRCksCiAJUVVFVUVfRkxBR19OQU1FKElOSVRfRE9ORSksCmRpZmYgLS1n aXQgYS9ibG9jay9ibGstc2V0dGluZ3MuYyBiL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCmluZGV4IGZk ODNkNjc0YWZkMGEuLjZjY2NlYjQyMWVkMmYgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1zZXR0aW5n cy5jCisrKyBiL2Jsb2NrL2Jsay1zZXR0aW5ncy5jCkBAIC00Niw2ICs0Niw3IEBAIHZvaWQgYmxr X3NldF9kZWZhdWx0X2xpbWl0cyhzdHJ1Y3QgcXVldWVfbGltaXRzICpsaW0pCiAJbGltLT5tYXhf em9uZV9hcHBlbmRfc2VjdG9ycyA9IDA7CiAJbGltLT5tYXhfZGlzY2FyZF9zZWN0b3JzID0gMDsK IAlsaW0tPm1heF9od19kaXNjYXJkX3NlY3RvcnMgPSAwOworCWxpbS0+bWF4X3NlY3VyZV9lcmFz ZV9zZWN0b3JzID0gMDsKIAlsaW0tPmRpc2NhcmRfZ3JhbnVsYXJpdHkgPSAwOwogCWxpbS0+ZGlz Y2FyZF9hbGlnbm1lbnQgPSAwOwogCWxpbS0+ZGlzY2FyZF9taXNhbGlnbmVkID0gMDsKQEAgLTE3 Niw2ICsxNzcsMTggQEAgdm9pZCBibGtfcXVldWVfbWF4X2Rpc2NhcmRfc2VjdG9ycyhzdHJ1Y3Qg cmVxdWVzdF9xdWV1ZSAqcSwKIH0KIEVYUE9SVF9TWU1CT0woYmxrX3F1ZXVlX21heF9kaXNjYXJk X3NlY3RvcnMpOwogCisvKioKKyAqIGJsa19xdWV1ZV9tYXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMg LSBzZXQgbWF4IHNlY3RvcnMgZm9yIGEgc2VjdXJlIGVyYXNlCisgKiBAcTogIHRoZSByZXF1ZXN0 IHF1ZXVlIGZvciB0aGUgZGV2aWNlCisgKiBAbWF4X3NlY3RvcnM6IG1heGltdW0gbnVtYmVyIG9m IHNlY3RvcnMgdG8gc2VjdXJlX2VyYXNlCisgKiovCit2b2lkIGJsa19xdWV1ZV9tYXhfc2VjdXJl X2VyYXNlX3NlY3RvcnMoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCisJCXVuc2lnbmVkIGludCBt YXhfc2VjdG9ycykKK3sKKwlxLT5saW1pdHMubWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzID0gbWF4 X3NlY3RvcnM7Cit9CitFWFBPUlRfU1lNQk9MKGJsa19xdWV1ZV9tYXhfc2VjdXJlX2VyYXNlX3Nl Y3RvcnMpOworCiAvKioKICAqIGJsa19xdWV1ZV9tYXhfd3JpdGVfemVyb2VzX3NlY3RvcnMgLSBz ZXQgbWF4IHNlY3RvcnMgZm9yIGEgc2luZ2xlCiAgKiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgd3JpdGUgemVyb2VzCkBAIC02NjEsNyArNjc0LDggQEAgaW50IGJsa19zdGFj a19saW1pdHMoc3RydWN0IHF1ZXVlX2xpbWl0cyAqdCwgc3RydWN0IHF1ZXVlX2xpbWl0cyAqYiwK IAkJdC0+ZGlzY2FyZF9hbGlnbm1lbnQgPSBsY21fbm90X3plcm8odC0+ZGlzY2FyZF9hbGlnbm1l bnQsIGFsaWdubWVudCkgJQogCQkJdC0+ZGlzY2FyZF9ncmFudWxhcml0eTsKIAl9Ci0KKwl0LT5t YXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMgPSBtaW5fbm90X3plcm8odC0+bWF4X3NlY3VyZV9lcmFz ZV9zZWN0b3JzLAorCQkJCQkJICAgYi0+bWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzKTsKIAl0LT56 b25lX3dyaXRlX2dyYW51bGFyaXR5ID0gbWF4KHQtPnpvbmVfd3JpdGVfZ3JhbnVsYXJpdHksCiAJ CQkJCWItPnpvbmVfd3JpdGVfZ3JhbnVsYXJpdHkpOwogCXQtPnpvbmVkID0gbWF4KHQtPnpvbmVk LCBiLT56b25lZCk7CmRpZmYgLS1naXQgYS9ibG9jay9mb3BzLmMgYi9ibG9jay9mb3BzLmMKaW5k ZXggOWYyZWNlYzQwNmIwNC4uYzBjYTMyNTRkMzhjZiAxMDA2NDQKLS0tIGEvYmxvY2svZm9wcy5j CisrKyBiL2Jsb2NrL2ZvcHMuYwpAQCAtNjcyLDcgKzY3Miw3IEBAIHN0YXRpYyBsb25nIGJsa2Rl dl9mYWxsb2NhdGUoc3RydWN0IGZpbGUgKmZpbGUsIGludCBtb2RlLCBsb2ZmX3Qgc3RhcnQsCiAJ CWJyZWFrOwogCWNhc2UgRkFMTE9DX0ZMX1BVTkNIX0hPTEUgfCBGQUxMT0NfRkxfS0VFUF9TSVpF IHwgRkFMTE9DX0ZMX05PX0hJREVfU1RBTEU6CiAJCWVycm9yID0gYmxrZGV2X2lzc3VlX2Rpc2Nh cmQoYmRldiwgc3RhcnQgPj4gU0VDVE9SX1NISUZULAotCQkJCQkgICAgIGxlbiA+PiBTRUNUT1Jf U0hJRlQsIEdGUF9LRVJORUwsIDApOworCQkJCQkgICAgIGxlbiA+PiBTRUNUT1JfU0hJRlQsIEdG UF9LRVJORUwpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQllcnJvciA9IC1FT1BOT1RTVVBQOwpk aWZmIC0tZ2l0IGEvYmxvY2svaW9jdGwuYyBiL2Jsb2NrL2lvY3RsLmMKaW5kZXggYzJjZDNiYTUy OTBjZS4uNWI1MDI3ZmE3OGY3ZSAxMDA2NDQKLS0tIGEvYmxvY2svaW9jdGwuYworKysgYi9ibG9j ay9pb2N0bC5jCkBAIC04Myw3ICs4Myw3IEBAIHN0YXRpYyBpbnQgY29tcGF0X2Jsa3BnX2lvY3Rs KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAjZW5kaWYKIAogc3RhdGljIGludCBibGtfaW9j dGxfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUsCi0JCXVu c2lnbmVkIGxvbmcgYXJnLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCQl1bnNpZ25lZCBsb25nIGFy ZykKIHsKIAl1aW50NjRfdCByYW5nZVsyXTsKIAl1aW50NjRfdCBzdGFydCwgbGVuOwpAQCAtMTE0 LDE1ICsxMTQsNDMgQEAgc3RhdGljIGludCBibGtfaW9jdGxfZGlzY2FyZChzdHJ1Y3QgYmxvY2tf ZGV2aWNlICpiZGV2LCBmbW9kZV90IG1vZGUsCiAJZXJyID0gdHJ1bmNhdGVfYmRldl9yYW5nZShi ZGV2LCBtb2RlLCBzdGFydCwgc3RhcnQgKyBsZW4gLSAxKTsKIAlpZiAoZXJyKQogCQlnb3RvIGZh aWw7Ci0KLQllcnIgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LCBzdGFydCA+PiA5LCBsZW4g Pj4gOSwKLQkJCQkgICBHRlBfS0VSTkVMLCBmbGFncyk7Ci0KKwllcnIgPSBibGtkZXZfaXNzdWVf ZGlzY2FyZChiZGV2LCBzdGFydCA+PiA5LCBsZW4gPj4gOSwgR0ZQX0tFUk5FTCk7CiBmYWlsOgog CWZpbGVtYXBfaW52YWxpZGF0ZV91bmxvY2soaW5vZGUtPmlfbWFwcGluZyk7CiAJcmV0dXJuIGVy cjsKIH0KIAorc3RhdGljIGludCBibGtfaW9jdGxfc2VjdXJlX2VyYXNlKHN0cnVjdCBibG9ja19k ZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSwKKwkJdm9pZCBfX3VzZXIgKmFyZ3ApCit7CisJdWlu dDY0X3Qgc3RhcnQsIGxlbjsKKwl1aW50NjRfdCByYW5nZVsyXTsKKwlpbnQgZXJyOworCisJaWYg KCEobW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJcmV0dXJuIC1FQkFERjsKKwlpZiAoIWJkZXZfbWF4 X3NlY3VyZV9lcmFzZV9zZWN0b3JzKGJkZXYpKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisJaWYg KGNvcHlfZnJvbV91c2VyKHJhbmdlLCBhcmdwLCBzaXplb2YocmFuZ2UpKSkKKwkJcmV0dXJuIC1F RkFVTFQ7CisKKwlzdGFydCA9IHJhbmdlWzBdOworCWxlbiA9IHJhbmdlWzFdOworCWlmICgoc3Rh cnQgJiA1MTEpIHx8IChsZW4gJiA1MTEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc3RhcnQg KyBsZW4gPiBiZGV2X25yX2J5dGVzKGJkZXYpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZpbGVt YXBfaW52YWxpZGF0ZV9sb2NrKGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOworCWVyciA9IHRy dW5jYXRlX2JkZXZfcmFuZ2UoYmRldiwgbW9kZSwgc3RhcnQsIHN0YXJ0ICsgbGVuIC0gMSk7CisJ aWYgKCFlcnIpCisJCWVyciA9IGJsa2Rldl9pc3N1ZV9zZWN1cmVfZXJhc2UoYmRldiwgc3RhcnQg Pj4gOSwgbGVuID4+IDksCisJCQkJCQlHRlBfS0VSTkVMKTsKKwlmaWxlbWFwX2ludmFsaWRhdGVf dW5sb2NrKGJkZXYtPmJkX2lub2RlLT5pX21hcHBpbmcpOworCXJldHVybiBlcnI7Cit9CisKKwog c3RhdGljIGludCBibGtfaW9jdGxfemVyb291dChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBm bW9kZV90IG1vZGUsCiAJCXVuc2lnbmVkIGxvbmcgYXJnKQogewpAQCAtNDUwLDEwICs0NzgsOSBA QCBzdGF0aWMgaW50IGJsa2Rldl9jb21tb25faW9jdGwoc3RydWN0IGJsb2NrX2RldmljZSAqYmRl diwgZm1vZGVfdCBtb2RlLAogCWNhc2UgQkxLUk9TRVQ6CiAJCXJldHVybiBibGtkZXZfcm9zZXQo YmRldiwgbW9kZSwgY21kLCBhcmcpOwogCWNhc2UgQkxLRElTQ0FSRDoKLQkJcmV0dXJuIGJsa19p b2N0bF9kaXNjYXJkKGJkZXYsIG1vZGUsIGFyZywgMCk7CisJCXJldHVybiBibGtfaW9jdGxfZGlz Y2FyZChiZGV2LCBtb2RlLCBhcmcpOwogCWNhc2UgQkxLU0VDRElTQ0FSRDoKLQkJcmV0dXJuIGJs a19pb2N0bF9kaXNjYXJkKGJkZXYsIG1vZGUsIGFyZywKLQkJCQlCTEtERVZfRElTQ0FSRF9TRUNV UkUpOworCQlyZXR1cm4gYmxrX2lvY3RsX3NlY3VyZV9lcmFzZShiZGV2LCBtb2RlLCBhcmdwKTsK IAljYXNlIEJMS1pFUk9PVVQ6CiAJCXJldHVybiBibGtfaW9jdGxfemVyb291dChiZGV2LCBtb2Rl LCBhcmcpOwogCWNhc2UgQkxLR0VURElTS1NFUToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sv ZHJiZC9kcmJkX3JlY2VpdmVyLmMgYi9kcml2ZXJzL2Jsb2NrL2RyYmQvZHJiZF9yZWNlaXZlci5j CmluZGV4IDI3NWM1M2M3YjYyOWUuLjI5NTdiMGI2OGQ2MDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMv YmxvY2svZHJiZC9kcmJkX3JlY2VpdmVyLmMKKysrIGIvZHJpdmVycy9ibG9jay9kcmJkL2RyYmRf cmVjZWl2ZXIuYwpAQCAtMTU0Nyw3ICsxNTQ3LDggQEAgaW50IGRyYmRfaXNzdWVfZGlzY2FyZF9v cl96ZXJvX291dChzdHJ1Y3QgZHJiZF9kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc3RhcnQsIHUK IAkJc3RhcnQgPSB0bXA7CiAJfQogCXdoaWxlIChucl9zZWN0b3JzID49IG1heF9kaXNjYXJkX3Nl Y3RvcnMpIHsKLQkJZXJyIHw9IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHN0YXJ0LCBtYXhf ZGlzY2FyZF9zZWN0b3JzLCBHRlBfTk9JTywgMCk7CisJCWVyciB8PSBibGtkZXZfaXNzdWVfZGlz Y2FyZChiZGV2LCBzdGFydCwgbWF4X2Rpc2NhcmRfc2VjdG9ycywKKwkJCQkJICAgIEdGUF9OT0lP KTsKIAkJbnJfc2VjdG9ycyAtPSBtYXhfZGlzY2FyZF9zZWN0b3JzOwogCQlzdGFydCArPSBtYXhf ZGlzY2FyZF9zZWN0b3JzOwogCX0KQEAgLTE1NTksNyArMTU2MCw3IEBAIGludCBkcmJkX2lzc3Vl X2Rpc2NhcmRfb3JfemVyb19vdXQoc3RydWN0IGRyYmRfZGV2aWNlICpkZXZpY2UsIHNlY3Rvcl90 IHN0YXJ0LCB1CiAJCW5yID0gbnJfc2VjdG9yczsKIAkJbnIgLT0gKHVuc2lnbmVkIGludCluciAl IGdyYW51bGFyaXR5OwogCQlpZiAobnIpIHsKLQkJCWVyciB8PSBibGtkZXZfaXNzdWVfZGlzY2Fy ZChiZGV2LCBzdGFydCwgbnIsIEdGUF9OT0lPLCAwKTsKKwkJCWVyciB8PSBibGtkZXZfaXNzdWVf ZGlzY2FyZChiZGV2LCBzdGFydCwgbnIsIEdGUF9OT0lPKTsKIAkJCW5yX3NlY3RvcnMgLT0gbnI7 CiAJCQlzdGFydCArPSBucjsKIAkJfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay9ybmJkL3Ju YmQtY2x0LmMgYi9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1jbHQuYwppbmRleCBlZmE5OWEzODg0 NTA3Li5kMTc4YmUxNzVhZDk5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1j bHQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1jbHQuYwpAQCAtMTM2NSw4ICsxMzY1 LDggQEAgc3RhdGljIHZvaWQgc2V0dXBfcmVxdWVzdF9xdWV1ZShzdHJ1Y3Qgcm5iZF9jbHRfZGV2 ICpkZXYpCiAJZGV2LT5xdWV1ZS0+bGltaXRzLmRpc2NhcmRfZ3JhbnVsYXJpdHkJPSBkZXYtPmRp c2NhcmRfZ3JhbnVsYXJpdHk7CiAJZGV2LT5xdWV1ZS0+bGltaXRzLmRpc2NhcmRfYWxpZ25tZW50 CT0gZGV2LT5kaXNjYXJkX2FsaWdubWVudDsKIAlpZiAoZGV2LT5zZWN1cmVfZGlzY2FyZCkKLQkJ YmxrX3F1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfU0VDRVJBU0UsIGRldi0+cXVldWUpOwotCisJ CWJsa19xdWV1ZV9tYXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMoZGV2LT5xdWV1ZSwKKwkJCQlkZXYt Pm1heF9kaXNjYXJkX3NlY3RvcnMpOwogCWJsa19xdWV1ZV9mbGFnX3NldChRVUVVRV9GTEFHX1NB TUVfQ09NUCwgZGV2LT5xdWV1ZSk7CiAJYmxrX3F1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfU0FN RV9GT1JDRSwgZGV2LT5xdWV1ZSk7CiAJYmxrX3F1ZXVlX21heF9zZWdtZW50cyhkZXYtPnF1ZXVl LCBkZXYtPm1heF9zZWdtZW50cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5i ZC1zcnYtZGV2LmggYi9kcml2ZXJzL2Jsb2NrL3JuYmQvcm5iZC1zcnYtZGV2LmgKaW5kZXggMWY3 ZTFjOGZkNGQ5Yi4uZDA4MGEwZGU1OTIyNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay9ybmJk L3JuYmQtc3J2LWRldi5oCisrKyBiL2RyaXZlcnMvYmxvY2svcm5iZC9ybmJkLXNydi1kZXYuaApA QCAtNDQsNyArNDQsNyBAQCBzdGF0aWMgaW5saW5lIGludCBybmJkX2Rldl9nZXRfbWF4X2h3X3Nl Y3RzKGNvbnN0IHN0cnVjdCBybmJkX2RldiAqZGV2KQogCiBzdGF0aWMgaW5saW5lIGludCBybmJk X2Rldl9nZXRfc2VjdXJlX2Rpc2NhcmQoY29uc3Qgc3RydWN0IHJuYmRfZGV2ICpkZXYpCiB7Ci0J cmV0dXJuIGJsa19xdWV1ZV9zZWN1cmVfZXJhc2UoYmRldl9nZXRfcXVldWUoZGV2LT5iZGV2KSk7 CisJcmV0dXJuIGJkZXZfbWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzKGRldi0+YmRldik7CiB9CiAK IHN0YXRpYyBpbmxpbmUgaW50IHJuYmRfZGV2X2dldF9tYXhfZGlzY2FyZF9zZWN0cyhjb25zdCBz dHJ1Y3Qgcm5iZF9kZXYgKmRldikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2Jh Y2svYmxrYmFjay5jIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGtiYWNrLmMKaW5kZXgg ZGU0MjQ1ODE5NWJjMS4uYTk3ZjJiZjViMDFiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ibG9jay94 ZW4tYmxrYmFjay9ibGtiYWNrLmMKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9ibGti YWNrLmMKQEAgLTk3MCw3ICs5NzAsNiBAQCBzdGF0aWMgaW50IGRpc3BhdGNoX2Rpc2NhcmRfaW8o c3RydWN0IHhlbl9ibGtpZl9yaW5nICpyaW5nLAogCWludCBzdGF0dXMgPSBCTEtJRl9SU1BfT0tB WTsKIAlzdHJ1Y3QgeGVuX2Jsa2lmICpibGtpZiA9IHJpbmctPmJsa2lmOwogCXN0cnVjdCBibG9j a19kZXZpY2UgKmJkZXYgPSBibGtpZi0+dmJkLmJkZXY7Ci0JdW5zaWduZWQgbG9uZyBzZWN1cmU7 CiAJc3RydWN0IHBoeXNfcmVxIHByZXE7CiAKIAl4ZW5fYmxraWZfZ2V0KGJsa2lmKTsKQEAgLTk4 NywxMyArOTg2LDE1IEBAIHN0YXRpYyBpbnQgZGlzcGF0Y2hfZGlzY2FyZF9pbyhzdHJ1Y3QgeGVu X2Jsa2lmX3JpbmcgKnJpbmcsCiAJfQogCXJpbmctPnN0X2RzX3JlcSsrOwogCi0Jc2VjdXJlID0g KGJsa2lmLT52YmQuZGlzY2FyZF9zZWN1cmUgJiYKLQkJIChyZXEtPnUuZGlzY2FyZC5mbGFnICYg QkxLSUZfRElTQ0FSRF9TRUNVUkUpKSA/Ci0JCSBCTEtERVZfRElTQ0FSRF9TRUNVUkUgOiAwOwor CWlmIChibGtpZi0+dmJkLmRpc2NhcmRfc2VjdXJlICYmCisJICAgIChyZXEtPnUuZGlzY2FyZC5m bGFnICYgQkxLSUZfRElTQ0FSRF9TRUNVUkUpKQorCQllcnIgPSBibGtkZXZfaXNzdWVfc2VjdXJl X2VyYXNlKGJkZXYsCisJCQkJcmVxLT51LmRpc2NhcmQuc2VjdG9yX251bWJlciwKKwkJCQlyZXEt PnUuZGlzY2FyZC5ucl9zZWN0b3JzLCBHRlBfS0VSTkVMKTsKKwllbHNlCisJCWVyciA9IGJsa2Rl dl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHJlcS0+dS5kaXNjYXJkLnNlY3Rvcl9udW1iZXIsCisJCQkJ cmVxLT51LmRpc2NhcmQubnJfc2VjdG9ycywgR0ZQX0tFUk5FTCk7CiAKLQllcnIgPSBibGtkZXZf aXNzdWVfZGlzY2FyZChiZGV2LCByZXEtPnUuZGlzY2FyZC5zZWN0b3JfbnVtYmVyLAotCQkJCSAg IHJlcS0+dS5kaXNjYXJkLm5yX3NlY3RvcnMsCi0JCQkJICAgR0ZQX0tFUk5FTCwgc2VjdXJlKTsK IGZhaWxfcmVzcG9uc2U6CiAJaWYgKGVyciA9PSAtRU9QTk9UU1VQUCkgewogCQlwcl9kZWJ1Zygi ZGlzY2FyZCBvcCBmYWlsZWQsIG5vdCBzdXBwb3J0ZWRcbiIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYyBiL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2sv eGVuYnVzLmMKaW5kZXggODNjZDA4MDQxZTZiMy4uYjIxYmZmYzljNTBiYyAxMDA2NDQKLS0tIGEv ZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hl bi1ibGtiYWNrL3hlbmJ1cy5jCkBAIC00ODQsNyArNDg0LDYgQEAgc3RhdGljIGludCB4ZW5fdmJk X2NyZWF0ZShzdHJ1Y3QgeGVuX2Jsa2lmICpibGtpZiwgYmxraWZfdmRldl90IGhhbmRsZSwKIHsK IAlzdHJ1Y3QgeGVuX3ZiZCAqdmJkOwogCXN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXY7Ci0Jc3Ry dWN0IHJlcXVlc3RfcXVldWUgKnE7CiAKIAl2YmQgPSAmYmxraWYtPnZiZDsKIAl2YmQtPmhhbmRs ZSAgID0gaGFuZGxlOwpAQCAtNTE2LDExICs1MTUsOSBAQCBzdGF0aWMgaW50IHhlbl92YmRfY3Jl YXRlKHN0cnVjdCB4ZW5fYmxraWYgKmJsa2lmLCBibGtpZl92ZGV2X3QgaGFuZGxlLAogCWlmICh2 YmQtPmJkZXYtPmJkX2Rpc2stPmZsYWdzICYgR0VOSERfRkxfUkVNT1ZBQkxFKQogCQl2YmQtPnR5 cGUgfD0gVkRJU0tfUkVNT1ZBQkxFOwogCi0JcSA9IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpOwogCWlm IChiZGV2X3dyaXRlX2NhY2hlKGJkZXYpKQogCQl2YmQtPmZsdXNoX3N1cHBvcnQgPSB0cnVlOwot Ci0JaWYgKHEgJiYgYmxrX3F1ZXVlX3NlY3VyZV9lcmFzZShxKSkKKwlpZiAoYmRldl9tYXhfc2Vj dXJlX2VyYXNlX3NlY3RvcnMoYmRldikpCiAJCXZiZC0+ZGlzY2FyZF9zZWN1cmUgPSB0cnVlOwog CiAJdmJkLT5mZWF0dXJlX2dudF9wZXJzaXN0ZW50ID0gZmVhdHVyZV9wZXJzaXN0ZW50OwpkaWZm IC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYyBiL2RyaXZlcnMvYmxvY2sveGVu LWJsa2Zyb250LmMKaW5kZXggMjUzYmY4MzVhY2ExZi4uOWZiN2M2OWY3MmIyZCAxMDA2NDQKLS0t IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrZnJvbnQuYworKysgYi9kcml2ZXJzL2Jsb2NrL3hlbi1i bGtmcm9udC5jCkBAIC05NDksNyArOTQ5LDggQEAgc3RhdGljIHZvaWQgYmxraWZfc2V0X3F1ZXVl X2xpbWl0cyhzdHJ1Y3QgYmxrZnJvbnRfaW5mbyAqaW5mbykKIAkJCQkJCSBpbmZvLT5waHlzaWNh bF9zZWN0b3Jfc2l6ZTsKIAkJcnEtPmxpbWl0cy5kaXNjYXJkX2FsaWdubWVudCA9IGluZm8tPmRp c2NhcmRfYWxpZ25tZW50OwogCQlpZiAoaW5mby0+ZmVhdHVyZV9zZWNkaXNjYXJkKQotCQkJYmxr X3F1ZXVlX2ZsYWdfc2V0KFFVRVVFX0ZMQUdfU0VDRVJBU0UsIHJxKTsKKwkJCWJsa19xdWV1ZV9t YXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMocnEsCisJCQkJCQkJICAgZ2V0X2NhcGFjaXR5KGdkKSk7 CiAJfQogCiAJLyogSGFyZCBzZWN0b3Igc2l6ZSBhbmQgbWF4IHNlY3RvcnMgaW1wZXJzb25hdGUg dGhlIGVxdWl2LiBoYXJkd2FyZS4gKi8KQEAgLTE2MDUsNyArMTYwNiw3IEBAIHN0YXRpYyBpcnFy ZXR1cm5fdCBibGtpZl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkKQogCQkJCWJsa2lm X3JlcShyZXEpLT5lcnJvciA9IEJMS19TVFNfTk9UU1VQUDsKIAkJCQlpbmZvLT5mZWF0dXJlX2Rp c2NhcmQgPSAwOwogCQkJCWluZm8tPmZlYXR1cmVfc2VjZGlzY2FyZCA9IDA7Ci0JCQkJYmxrX3F1 ZXVlX2ZsYWdfY2xlYXIoUVVFVUVfRkxBR19TRUNFUkFTRSwgcnEpOworCQkJCWJsa19xdWV1ZV9t YXhfc2VjdXJlX2VyYXNlX3NlY3RvcnMocnEsIDApOwogCQkJfQogCQkJYnJlYWs7CiAJCWNhc2Ug QkxLSUZfT1BfRkxVU0hfRElTS0NBQ0hFOgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9tZC9iY2FjaGUv YWxsb2MuYyBiL2RyaXZlcnMvbWQvYmNhY2hlL2FsbG9jLmMKaW5kZXggMDk3NTc3YWUzYzQ3MS4u Y2UxM2MyNzJjMzg3MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9iY2FjaGUvYWxsb2MuYworKysg Yi9kcml2ZXJzL21kL2JjYWNoZS9hbGxvYy5jCkBAIC0zMzYsNyArMzM2LDcgQEAgc3RhdGljIGlu dCBiY2hfYWxsb2NhdG9yX3RocmVhZCh2b2lkICphcmcpCiAJCQkJbXV0ZXhfdW5sb2NrKCZjYS0+ c2V0LT5idWNrZXRfbG9jayk7CiAJCQkJYmxrZGV2X2lzc3VlX2Rpc2NhcmQoY2EtPmJkZXYsCiAJ CQkJCWJ1Y2tldF90b19zZWN0b3IoY2EtPnNldCwgYnVja2V0KSwKLQkJCQkJY2EtPnNiLmJ1Y2tl dF9zaXplLCBHRlBfS0VSTkVMLCAwKTsKKwkJCQkJY2EtPnNiLmJ1Y2tldF9zaXplLCBHRlBfS0VS TkVMKTsKIAkJCQltdXRleF9sb2NrKCZjYS0+c2V0LT5idWNrZXRfbG9jayk7CiAJCQl9CiAKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvbWQvZG0tdGFibGUuYyBiL2RyaXZlcnMvbWQvZG0tdGFibGUuYwpp bmRleCAwZGZmNjkwN2ZkMDBkLi5lN2Q0MmY2MzM1YTJhIDEwMDY0NAotLS0gYS9kcml2ZXJzL21k L2RtLXRhYmxlLmMKKysrIGIvZHJpdmVycy9tZC9kbS10YWJsZS5jCkBAIC0xOTIwLDkgKzE5MjAs NyBAQCBzdGF0aWMgaW50IGRldmljZV9ub3Rfc2VjdXJlX2VyYXNlX2NhcGFibGUoc3RydWN0IGRt X3RhcmdldCAqdGksCiAJCQkJCSAgIHN0cnVjdCBkbV9kZXYgKmRldiwgc2VjdG9yX3Qgc3RhcnQs CiAJCQkJCSAgIHNlY3Rvcl90IGxlbiwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgcmVxdWVzdF9x dWV1ZSAqcSA9IGJkZXZfZ2V0X3F1ZXVlKGRldi0+YmRldik7Ci0KLQlyZXR1cm4gIWJsa19xdWV1 ZV9zZWN1cmVfZXJhc2UocSk7CisJcmV0dXJuICFiZGV2X21heF9zZWN1cmVfZXJhc2Vfc2VjdG9y cyhkZXYtPmJkZXYpOwogfQogCiBzdGF0aWMgYm9vbCBkbV90YWJsZV9zdXBwb3J0c19zZWN1cmVf ZXJhc2Uoc3RydWN0IGRtX3RhYmxlICp0KQpAQCAtMTk3NSw4ICsxOTczLDggQEAgaW50IGRtX3Rh YmxlX3NldF9yZXN0cmljdGlvbnMoc3RydWN0IGRtX3RhYmxlICp0LCBzdHJ1Y3QgcmVxdWVzdF9x dWV1ZSAqcSwKIAkJcS0+bGltaXRzLmRpc2NhcmRfbWlzYWxpZ25lZCA9IDA7CiAJfQogCi0JaWYg KGRtX3RhYmxlX3N1cHBvcnRzX3NlY3VyZV9lcmFzZSh0KSkKLQkJYmxrX3F1ZXVlX2ZsYWdfc2V0 KFFVRVVFX0ZMQUdfU0VDRVJBU0UsIHEpOworCWlmICghZG1fdGFibGVfc3VwcG9ydHNfc2VjdXJl X2VyYXNlKHQpKQorCQlxLT5saW1pdHMubWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzID0gMDsKIAog CWlmIChkbV90YWJsZV9zdXBwb3J0c19mbHVzaCh0LCAoMVVMIDw8IFFVRVVFX0ZMQUdfV0MpKSkg ewogCQl3YyA9IHRydWU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLXRoaW4uYyBiL2RyaXZl cnMvbWQvZG0tdGhpbi5jCmluZGV4IGVkZWQ0YmNjNDU0NWYuLjg0YzA4M2Y3NjY3MzYgMTAwNjQ0 Ci0tLSBhL2RyaXZlcnMvbWQvZG0tdGhpbi5jCisrKyBiL2RyaXZlcnMvbWQvZG0tdGhpbi5jCkBA IC0zOTgsOCArMzk4LDggQEAgc3RhdGljIGludCBpc3N1ZV9kaXNjYXJkKHN0cnVjdCBkaXNjYXJk X29wICpvcCwgZG1fYmxvY2tfdCBkYXRhX2IsIGRtX2Jsb2NrX3QgZGEKIAlzZWN0b3JfdCBzID0g YmxvY2tfdG9fc2VjdG9ycyh0Yy0+cG9vbCwgZGF0YV9iKTsKIAlzZWN0b3JfdCBsZW4gPSBibG9j a190b19zZWN0b3JzKHRjLT5wb29sLCBkYXRhX2UgLSBkYXRhX2IpOwogCi0JcmV0dXJuIF9fYmxr ZGV2X2lzc3VlX2Rpc2NhcmQodGMtPnBvb2xfZGV2LT5iZGV2LCBzLCBsZW4sCi0JCQkJICAgICAg R0ZQX05PV0FJVCwgMCwgJm9wLT5iaW8pOworCXJldHVybiBfX2Jsa2Rldl9pc3N1ZV9kaXNjYXJk KHRjLT5wb29sX2Rldi0+YmRldiwgcywgbGVuLCBHRlBfTk9XQUlULAorCQkJCSAgICAgICZvcC0+ YmlvKTsKIH0KIAogc3RhdGljIHZvaWQgZW5kX2Rpc2NhcmQoc3RydWN0IGRpc2NhcmRfb3AgKm9w LCBpbnQgcikKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWQvbWQuYyBiL2RyaXZlcnMvbWQvbWQuYwpp bmRleCAxOTYzNmMyZjJjZGE0Li4yNTg3Zjg3MmMwODg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL21k L21kLmMKKysrIGIvZHJpdmVycy9tZC9tZC5jCkBAIC04NTg0LDcgKzg1ODQsNyBAQCB2b2lkIG1k X3N1Ym1pdF9kaXNjYXJkX2JpbyhzdHJ1Y3QgbWRkZXYgKm1kZGV2LCBzdHJ1Y3QgbWRfcmRldiAq cmRldiwKIHsKIAlzdHJ1Y3QgYmlvICpkaXNjYXJkX2JpbyA9IE5VTEw7CiAKLQlpZiAoX19ibGtk ZXZfaXNzdWVfZGlzY2FyZChyZGV2LT5iZGV2LCBzdGFydCwgc2l6ZSwgR0ZQX05PSU8sIDAsCisJ aWYgKF9fYmxrZGV2X2lzc3VlX2Rpc2NhcmQocmRldi0+YmRldiwgc3RhcnQsIHNpemUsIEdGUF9O T0lPLAogCQkJJmRpc2NhcmRfYmlvKSB8fCAhZGlzY2FyZF9iaW8pCiAJCXJldHVybjsKIApkaWZm IC0tZ2l0IGEvZHJpdmVycy9tZC9yYWlkNS1jYWNoZS5jIGIvZHJpdmVycy9tZC9yYWlkNS1jYWNo ZS5jCmluZGV4IGMzY2JmOWE1NzRhMzkuLjA5NGE0MDQyNTg5ZWIgMTAwNjQ0Ci0tLSBhL2RyaXZl cnMvbWQvcmFpZDUtY2FjaGUuYworKysgYi9kcml2ZXJzL21kL3JhaWQ1LWNhY2hlLmMKQEAgLTEz NDQsMTQgKzEzNDQsMTQgQEAgc3RhdGljIHZvaWQgcjVsX3dyaXRlX3N1cGVyX2FuZF9kaXNjYXJk X3NwYWNlKHN0cnVjdCByNWxfbG9nICpsb2csCiAJaWYgKGxvZy0+bGFzdF9jaGVja3BvaW50IDwg ZW5kKSB7CiAJCWJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsCiAJCQkJbG9nLT5sYXN0X2NoZWNr cG9pbnQgKyBsb2ctPnJkZXYtPmRhdGFfb2Zmc2V0LAotCQkJCWVuZCAtIGxvZy0+bGFzdF9jaGVj a3BvaW50LCBHRlBfTk9JTywgMCk7CisJCQkJZW5kIC0gbG9nLT5sYXN0X2NoZWNrcG9pbnQsIEdG UF9OT0lPKTsKIAl9IGVsc2UgewogCQlibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LAogCQkJCWxv Zy0+bGFzdF9jaGVja3BvaW50ICsgbG9nLT5yZGV2LT5kYXRhX29mZnNldCwKIAkJCQlsb2ctPmRl dmljZV9zaXplIC0gbG9nLT5sYXN0X2NoZWNrcG9pbnQsCi0JCQkJR0ZQX05PSU8sIDApOworCQkJ CUdGUF9OT0lPKTsKIAkJYmxrZGV2X2lzc3VlX2Rpc2NhcmQoYmRldiwgbG9nLT5yZGV2LT5kYXRh X29mZnNldCwgZW5kLAotCQkJCUdGUF9OT0lPLCAwKTsKKwkJCQlHRlBfTk9JTyk7CiAJfQogfQog CmRpZmYgLS1naXQgYS9kcml2ZXJzL21tYy9jb3JlL3F1ZXVlLmMgYi9kcml2ZXJzL21tYy9jb3Jl L3F1ZXVlLmMKaW5kZXggY2FjNjMxNTAxMGEzZC4uYTNkNDQ2MDA1NTcxNiAxMDA2NDQKLS0tIGEv ZHJpdmVycy9tbWMvY29yZS9xdWV1ZS5jCisrKyBiL2RyaXZlcnMvbW1jL2NvcmUvcXVldWUuYwpA QCAtMTg5LDcgKzE4OSw3IEBAIHN0YXRpYyB2b2lkIG1tY19xdWV1ZV9zZXR1cF9kaXNjYXJkKHN0 cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAogCWlmIChjYXJkLT5wcmVmX2VyYXNlID4gbWF4X2Rpc2Nh cmQpCiAJCXEtPmxpbWl0cy5kaXNjYXJkX2dyYW51bGFyaXR5ID0gU0VDVE9SX1NJWkU7CiAJaWYg KG1tY19jYW5fc2VjdXJlX2VyYXNlX3RyaW0oY2FyZCkpCi0JCWJsa19xdWV1ZV9mbGFnX3NldChR VUVVRV9GTEFHX1NFQ0VSQVNFLCBxKTsKKwkJYmxrX3F1ZXVlX21heF9zZWN1cmVfZXJhc2Vfc2Vj dG9ycyhxLCBtYXhfZGlzY2FyZCk7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBzaG9ydCBtbWNfZ2V0 X21heF9zZWdtZW50cyhzdHJ1Y3QgbW1jX2hvc3QgKmhvc3QpCmRpZmYgLS1naXQgYS9kcml2ZXJz L252bWUvdGFyZ2V0L2lvLWNtZC1iZGV2LmMgYi9kcml2ZXJzL252bWUvdGFyZ2V0L2lvLWNtZC1i ZGV2LmMKaW5kZXggZDg4NmMyYzU5NTU0Zi4uMjdhNzI1MDRkMzFjZSAxMDA2NDQKLS0tIGEvZHJp dmVycy9udm1lL3RhcmdldC9pby1jbWQtYmRldi5jCisrKyBiL2RyaXZlcnMvbnZtZS90YXJnZXQv aW8tY21kLWJkZXYuYwpAQCAtMzYwLDcgKzM2MCw3IEBAIHN0YXRpYyB1MTYgbnZtZXRfYmRldl9k aXNjYXJkX3JhbmdlKHN0cnVjdCBudm1ldF9yZXEgKnJlcSwKIAlyZXQgPSBfX2Jsa2Rldl9pc3N1 ZV9kaXNjYXJkKG5zLT5iZGV2LAogCQkJbnZtZXRfbGJhX3RvX3NlY3QobnMsIHJhbmdlLT5zbGJh KSwKIAkJCWxlMzJfdG9fY3B1KHJhbmdlLT5ubGIpIDw8IChucy0+Ymxrc2l6ZV9zaGlmdCAtIDkp LAotCQkJR0ZQX0tFUk5FTCwgMCwgYmlvKTsKKwkJCUdGUF9LRVJORUwsIGJpbyk7CiAJaWYgKHJl dCAmJiByZXQgIT0gLUVPUE5PVFNVUFApIHsKIAkJcmVxLT5lcnJvcl9zbGJhID0gbGU2NF90b19j cHUocmFuZ2UtPnNsYmEpOwogCQlyZXR1cm4gZXJybm9fdG9fbnZtZV9zdGF0dXMocmVxLCByZXQp OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5jIGIvZHJpdmVy cy90YXJnZXQvdGFyZ2V0X2NvcmVfZmlsZS5jCmluZGV4IGI2YmE1ODJiMDY3NzUuLmU2OGYxY2M4 ZWY5OGIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdGFyZ2V0L3RhcmdldF9jb3JlX2ZpbGUuYworKysg Yi9kcml2ZXJzL3RhcmdldC90YXJnZXRfY29yZV9maWxlLmMKQEAgLTU1OCw3ICs1NTgsNyBAQCBm ZF9leGVjdXRlX3VubWFwKHN0cnVjdCBzZV9jbWQgKmNtZCwgc2VjdG9yX3QgbGJhLCBzZWN0b3Jf dCBub2xiKQogCQlyZXQgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LAogCQkJCQkgICB0YXJn ZXRfdG9fbGludXhfc2VjdG9yKGRldiwgbGJhKSwKIAkJCQkJICAgdGFyZ2V0X3RvX2xpbnV4X3Nl Y3RvcihkZXYsICBub2xiKSwKLQkJCQkJICAgR0ZQX0tFUk5FTCwgMCk7CisJCQkJCSAgIEdGUF9L RVJORUwpOwogCQlpZiAocmV0IDwgMCkgewogCQkJcHJfd2FybigiRklMRUlPOiBibGtkZXZfaXNz dWVfZGlzY2FyZCgpIGZhaWxlZDogJWRcbiIsCiAJCQkJcmV0KTsKZGlmZiAtLWdpdCBhL2RyaXZl cnMvdGFyZ2V0L3RhcmdldF9jb3JlX2libG9jay5jIGIvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2Nv cmVfaWJsb2NrLmMKaW5kZXggYzRhOTAzYjhhNDdmYy4uMzc4YzgwMzEzYTBmMiAxMDA2NDQKLS0t IGEvZHJpdmVycy90YXJnZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKKysrIGIvZHJpdmVycy90YXJn ZXQvdGFyZ2V0X2NvcmVfaWJsb2NrLmMKQEAgLTQzNCw3ICs0MzQsNyBAQCBpYmxvY2tfZXhlY3V0 ZV91bm1hcChzdHJ1Y3Qgc2VfY21kICpjbWQsIHNlY3Rvcl90IGxiYSwgc2VjdG9yX3Qgbm9sYikK IAlyZXQgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LAogCQkJCSAgIHRhcmdldF90b19saW51 eF9zZWN0b3IoZGV2LCBsYmEpLAogCQkJCSAgIHRhcmdldF90b19saW51eF9zZWN0b3IoZGV2LCAg bm9sYiksCi0JCQkJICAgR0ZQX0tFUk5FTCwgMCk7CisJCQkJICAgR0ZQX0tFUk5FTCk7CiAJaWYg KHJldCA8IDApIHsKIAkJcHJfZXJyKCJibGtkZXZfaXNzdWVfZGlzY2FyZCgpIGZhaWxlZDogJWRc biIsIHJldCk7CiAJCXJldHVybiBUQ01fTE9HSUNBTF9VTklUX0NPTU1VTklDQVRJT05fRkFJTFVS RTsKZGlmZiAtLWdpdCBhL2ZzL2J0cmZzL2V4dGVudC10cmVlLmMgYi9mcy9idHJmcy9leHRlbnQt dHJlZS5jCmluZGV4IGVmZDhkZWIzYWI3ZTguLjVjMWQzYTU2NGRhNWEgMTAwNjQ0Ci0tLSBhL2Zz L2J0cmZzL2V4dGVudC10cmVlLmMKKysrIGIvZnMvYnRyZnMvZXh0ZW50LXRyZWUuYwpAQCAtMTIz OSw3ICsxMjM5LDcgQEAgc3RhdGljIGludCBidHJmc19pc3N1ZV9kaXNjYXJkKHN0cnVjdCBibG9j a19kZXZpY2UgKmJkZXYsIHU2NCBzdGFydCwgdTY0IGxlbiwKIAogCQlpZiAoc2l6ZSkgewogCQkJ cmV0ID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQoYmRldiwgc3RhcnQgPj4gOSwgc2l6ZSA+PiA5LAot CQkJCQkJICAgR0ZQX05PRlMsIDApOworCQkJCQkJICAgR0ZQX05PRlMpOwogCQkJaWYgKCFyZXQp CiAJCQkJKmRpc2NhcmRlZF9ieXRlcyArPSBzaXplOwogCQkJZWxzZSBpZiAocmV0ICE9IC1FT1BO T1RTVVBQKQpAQCAtMTI1Niw3ICsxMjU2LDcgQEAgc3RhdGljIGludCBidHJmc19pc3N1ZV9kaXNj YXJkKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHU2NCBzdGFydCwgdTY0IGxlbiwKIAogCWlm IChieXRlc19sZWZ0KSB7CiAJCXJldCA9IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIHN0YXJ0 ID4+IDksIGJ5dGVzX2xlZnQgPj4gOSwKLQkJCQkJICAgR0ZQX05PRlMsIDApOworCQkJCQkgICBH RlBfTk9GUyk7CiAJCWlmICghcmV0KQogCQkJKmRpc2NhcmRlZF9ieXRlcyArPSBieXRlc19sZWZ0 OwogCX0KZGlmZiAtLWdpdCBhL2ZzL2V4dDQvbWJhbGxvYy5jIGIvZnMvZXh0NC9tYmFsbG9jLmMK aW5kZXggNmQxODIwNTM2ZDg4ZC4uZWE2NTNkMTlmOWVjNyAxMDA2NDQKLS0tIGEvZnMvZXh0NC9t YmFsbG9jLmMKKysrIGIvZnMvZXh0NC9tYmFsbG9jLmMKQEAgLTM2MjksNyArMzYyOSw3IEBAIHN0 YXRpYyBpbmxpbmUgaW50IGV4dDRfaXNzdWVfZGlzY2FyZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNi LAogCQlyZXR1cm4gX19ibGtkZXZfaXNzdWVfZGlzY2FyZChzYi0+c19iZGV2LAogCQkJKHNlY3Rv cl90KWRpc2NhcmRfYmxvY2sgPDwgKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSksCiAJCQkoc2Vj dG9yX3QpY291bnQgPDwgKHNiLT5zX2Jsb2Nrc2l6ZV9iaXRzIC0gOSksCi0JCQlHRlBfTk9GUywg MCwgYmlvcCk7CisJCQlHRlBfTk9GUywgYmlvcCk7CiAJfSBlbHNlCiAJCXJldHVybiBzYl9pc3N1 ZV9kaXNjYXJkKHNiLCBkaXNjYXJkX2Jsb2NrLCBjb3VudCwgR0ZQX05PRlMsIDApOwogfQpkaWZm IC0tZ2l0IGEvZnMvZjJmcy9maWxlLmMgYi9mcy9mMmZzL2ZpbGUuYwppbmRleCA4MDUzZDk5ZjM5 MjBiLi4zNWI2YzcyMGMyYmMxIDEwMDY0NAotLS0gYS9mcy9mMmZzL2ZpbGUuYworKysgYi9mcy9m MmZzL2ZpbGUuYwpAQCAtMzY4NSwxOCArMzY4NSwxOCBAQCBzdGF0aWMgaW50IGYyZnNfcmVzZXJ2 ZV9jb21wcmVzc19ibG9ja3Moc3RydWN0IGZpbGUgKmZpbHAsIHVuc2lnbmVkIGxvbmcgYXJnKQog c3RhdGljIGludCBmMmZzX3NlY3VyZV9lcmFzZShzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBz dHJ1Y3QgaW5vZGUgKmlub2RlLAogCQlwZ29mZl90IG9mZiwgYmxvY2tfdCBibG9jaywgYmxvY2tf dCBsZW4sIHUzMiBmbGFncykKIHsKLQlzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSA9IGJkZXZfZ2V0 X3F1ZXVlKGJkZXYpOwogCXNlY3Rvcl90IHNlY3RvciA9IFNFQ1RPUl9GUk9NX0JMT0NLKGJsb2Nr KTsKIAlzZWN0b3JfdCBucl9zZWN0cyA9IFNFQ1RPUl9GUk9NX0JMT0NLKGxlbik7CiAJaW50IHJl dCA9IDA7CiAKLQlpZiAoIXEpCi0JCXJldHVybiAtRU5YSU87Ci0KLQlpZiAoZmxhZ3MgJiBGMkZT X1RSSU1fRklMRV9ESVNDQVJEKQotCQlyZXQgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChiZGV2LCBz ZWN0b3IsIG5yX3NlY3RzLCBHRlBfTk9GUywKLQkJCQkJCWJsa19xdWV1ZV9zZWN1cmVfZXJhc2Uo cSkgPwotCQkJCQkJQkxLREVWX0RJU0NBUkRfU0VDVVJFIDogMCk7CisJaWYgKGZsYWdzICYgRjJG U19UUklNX0ZJTEVfRElTQ0FSRCkgeworCQlpZiAoYmRldl9tYXhfc2VjdXJlX2VyYXNlX3NlY3Rv cnMoYmRldikpCisJCQlyZXQgPSBibGtkZXZfaXNzdWVfc2VjdXJlX2VyYXNlKGJkZXYsIHNlY3Rv ciwgbnJfc2VjdHMsCisJCQkJCUdGUF9OT0ZTKTsKKwkJZWxzZQorCQkJcmV0ID0gYmxrZGV2X2lz c3VlX2Rpc2NhcmQoYmRldiwgc2VjdG9yLCBucl9zZWN0cywKKwkJCQkJR0ZQX05PRlMpOworCX0K IAogCWlmICghcmV0ICYmIChmbGFncyAmIEYyRlNfVFJJTV9GSUxFX1pFUk9PVVQpKSB7CiAJCWlm IChJU19FTkNSWVBURUQoaW5vZGUpKQpkaWZmIC0tZ2l0IGEvZnMvZjJmcy9zZWdtZW50LmMgYi9m cy9mMmZzL3NlZ21lbnQuYwppbmRleCA3MWYwOWFkYmNiYTg2Li5lNDMzYzYxZTY0YjkzIDEwMDY0 NAotLS0gYS9mcy9mMmZzL3NlZ21lbnQuYworKysgYi9mcy9mMmZzL3NlZ21lbnQuYwpAQCAtMTI0 NCw3ICsxMjQ0LDcgQEAgc3RhdGljIGludCBfX3N1Ym1pdF9kaXNjYXJkX2NtZChzdHJ1Y3QgZjJm c19zYl9pbmZvICpzYmksCiAJCWVyciA9IF9fYmxrZGV2X2lzc3VlX2Rpc2NhcmQoYmRldiwKIAkJ CQkJU0VDVE9SX0ZST01fQkxPQ0soc3RhcnQpLAogCQkJCQlTRUNUT1JfRlJPTV9CTE9DSyhsZW4p LAotCQkJCQlHRlBfTk9GUywgMCwgJmJpbyk7CisJCQkJCUdGUF9OT0ZTLCAmYmlvKTsKIHN1Ym1p dDoKIAkJaWYgKGVycikgewogCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRjLT5sb2NrLCBmbGFncyk7 CmRpZmYgLS1naXQgYS9mcy9qYmQyL2pvdXJuYWwuYyBiL2ZzL2piZDIvam91cm5hbC5jCmluZGV4 IDE5ZDIyNmNkNGZmNGQuLmMwY2JlZWFlYzJkMWEgMTAwNjQ0Ci0tLSBhL2ZzL2piZDIvam91cm5h bC5jCisrKyBiL2ZzL2piZDIvam91cm5hbC5jCkBAIC0xODI1LDcgKzE4MjUsNyBAQCBzdGF0aWMg aW50IF9famJkMl9qb3VybmFsX2VyYXNlKGpvdXJuYWxfdCAqam91cm5hbCwgdW5zaWduZWQgaW50 IGZsYWdzKQogCQkJZXJyID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQoam91cm5hbC0+al9kZXYsCiAJ CQkJCWJ5dGVfc3RhcnQgPj4gU0VDVE9SX1NISUZULAogCQkJCQlieXRlX2NvdW50ID4+IFNFQ1RP Ul9TSElGVCwKLQkJCQkJR0ZQX05PRlMsIDApOworCQkJCQlHRlBfTk9GUyk7CiAJCX0gZWxzZSBp ZiAoZmxhZ3MgJiBKQkQyX0pPVVJOQUxfRkxVU0hfWkVST09VVCkgewogCQkJZXJyID0gYmxrZGV2 X2lzc3VlX3plcm9vdXQoam91cm5hbC0+al9kZXYsCiAJCQkJCWJ5dGVfc3RhcnQgPj4gU0VDVE9S X1NISUZULApkaWZmIC0tZ2l0IGEvZnMvbmlsZnMyL3N1ZmlsZS5jIGIvZnMvbmlsZnMyL3N1Zmls ZS5jCmluZGV4IGUzODVjY2EyMDA0YTcuLjc3ZmY4ZTk1NDIxZmEgMTAwNjQ0Ci0tLSBhL2ZzL25p bGZzMi9zdWZpbGUuYworKysgYi9mcy9uaWxmczIvc3VmaWxlLmMKQEAgLTExMDAsNyArMTEwMCw3 IEBAIGludCBuaWxmc19zdWZpbGVfdHJpbV9mcyhzdHJ1Y3QgaW5vZGUgKnN1ZmlsZSwgc3RydWN0 IGZzdHJpbV9yYW5nZSAqcmFuZ2UpCiAJCQkJcmV0ID0gYmxrZGV2X2lzc3VlX2Rpc2NhcmQobmls ZnMtPm5zX2JkZXYsCiAJCQkJCQlzdGFydCAqIHNlY3RzX3Blcl9ibG9jaywKIAkJCQkJCW5ibG9j a3MgKiBzZWN0c19wZXJfYmxvY2ssCi0JCQkJCQlHRlBfTk9GUywgMCk7CisJCQkJCQlHRlBfTk9G Uyk7CiAJCQkJaWYgKHJldCA8IDApIHsKIAkJCQkJcHV0X2JoKHN1X2JoKTsKIAkJCQkJZ290byBv dXRfc2VtOwpAQCAtMTEzNCw3ICsxMTM0LDcgQEAgaW50IG5pbGZzX3N1ZmlsZV90cmltX2ZzKHN0 cnVjdCBpbm9kZSAqc3VmaWxlLCBzdHJ1Y3QgZnN0cmltX3JhbmdlICpyYW5nZSkKIAkJCXJldCA9 IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKG5pbGZzLT5uc19iZGV2LAogCQkJCQlzdGFydCAqIHNlY3Rz X3Blcl9ibG9jaywKIAkJCQkJbmJsb2NrcyAqIHNlY3RzX3Blcl9ibG9jaywKLQkJCQkJR0ZQX05P RlMsIDApOworCQkJCQlHRlBfTk9GUyk7CiAJCQlpZiAoIXJldCkKIAkJCQluZGlzY2FyZGVkICs9 IG5ibG9ja3M7CiAJCX0KZGlmZiAtLWdpdCBhL2ZzL25pbGZzMi90aGVfbmlsZnMuYyBiL2ZzL25p bGZzMi90aGVfbmlsZnMuYwppbmRleCBkZDQ4YThmNzRkNTc3Li4zYjRhMDc5Yzk2MTdjIDEwMDY0 NAotLS0gYS9mcy9uaWxmczIvdGhlX25pbGZzLmMKKysrIGIvZnMvbmlsZnMyL3RoZV9uaWxmcy5j CkBAIC02NzIsNyArNjcyLDcgQEAgaW50IG5pbGZzX2Rpc2NhcmRfc2VnbWVudHMoc3RydWN0IHRo ZV9uaWxmcyAqbmlsZnMsIF9fdTY0ICpzZWdudW1wLAogCQkJcmV0ID0gYmxrZGV2X2lzc3VlX2Rp c2NhcmQobmlsZnMtPm5zX2JkZXYsCiAJCQkJCQkgICBzdGFydCAqIHNlY3RzX3Blcl9ibG9jaywK IAkJCQkJCSAgIG5ibG9ja3MgKiBzZWN0c19wZXJfYmxvY2ssCi0JCQkJCQkgICBHRlBfTk9GUywg MCk7CisJCQkJCQkgICBHRlBfTk9GUyk7CiAJCQlpZiAocmV0IDwgMCkKIAkJCQlyZXR1cm4gcmV0 OwogCQkJbmJsb2NrcyA9IDA7CkBAIC02ODIsNyArNjgyLDcgQEAgaW50IG5pbGZzX2Rpc2NhcmRf c2VnbWVudHMoc3RydWN0IHRoZV9uaWxmcyAqbmlsZnMsIF9fdTY0ICpzZWdudW1wLAogCQlyZXQg PSBibGtkZXZfaXNzdWVfZGlzY2FyZChuaWxmcy0+bnNfYmRldiwKIAkJCQkJICAgc3RhcnQgKiBz ZWN0c19wZXJfYmxvY2ssCiAJCQkJCSAgIG5ibG9ja3MgKiBzZWN0c19wZXJfYmxvY2ssCi0JCQkJ CSAgIEdGUF9OT0ZTLCAwKTsKKwkJCQkJICAgR0ZQX05PRlMpOwogCXJldHVybiByZXQ7CiB9CiAK ZGlmZiAtLWdpdCBhL2ZzL250ZnMzL3N1cGVyLmMgYi9mcy9udGZzMy9zdXBlci5jCmluZGV4IDVm MmU0MTRjZmE3OWIuLjU3ODFiOWU4ZTNkODUgMTAwNjQ0Ci0tLSBhL2ZzL250ZnMzL3N1cGVyLmMK KysrIGIvZnMvbnRmczMvc3VwZXIuYwpAQCAtMTMzMyw3ICsxMzMzLDcgQEAgaW50IG50ZnNfZGlz Y2FyZChzdHJ1Y3QgbnRmc19zYl9pbmZvICpzYmksIENMU1QgbGNuLCBDTFNUIGxlbikKIAkJcmV0 dXJuIDA7CiAKIAllcnIgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChzYi0+c19iZGV2LCBzdGFydCA+ PiA5LCAoZW5kIC0gc3RhcnQpID4+IDksCi0JCQkJICAgR0ZQX05PRlMsIDApOworCQkJCSAgIEdG UF9OT0ZTKTsKIAogCWlmIChlcnIgPT0gLUVPUE5PVFNVUFApCiAJCXNiaS0+ZmxhZ3MgfD0gTlRG U19GTEFHU19OT0RJU0NBUkQ7CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2Rpc2NhcmQuYyBiL2Zz L3hmcy94ZnNfZGlzY2FyZC5jCmluZGV4IGUyYWRhMTE1YzIzZjkuLmM2ZmUzZjZlYmI2YjAgMTAw NjQ0Ci0tLSBhL2ZzL3hmcy94ZnNfZGlzY2FyZC5jCisrKyBiL2ZzL3hmcy94ZnNfZGlzY2FyZC5j CkBAIC0xMTQsNyArMTE0LDcgQEAgeGZzX3RyaW1fZXh0ZW50cygKIAkJfQogCiAJCXRyYWNlX3hm c19kaXNjYXJkX2V4dGVudChtcCwgYWdubywgZmJubywgZmxlbik7Ci0JCWVycm9yID0gYmxrZGV2 X2lzc3VlX2Rpc2NhcmQoYmRldiwgZGJubywgZGxlbiwgR0ZQX05PRlMsIDApOworCQllcnJvciA9 IGJsa2Rldl9pc3N1ZV9kaXNjYXJkKGJkZXYsIGRibm8sIGRsZW4sIEdGUF9OT0ZTKTsKIAkJaWYg KGVycm9yKQogCQkJZ290byBvdXRfZGVsX2N1cnNvcjsKIAkJKmJsb2Nrc190cmltbWVkICs9IGZs ZW47CmRpZmYgLS1naXQgYS9mcy94ZnMveGZzX2xvZ19jaWwuYyBiL2ZzL3hmcy94ZnNfbG9nX2Np bC5jCmluZGV4IGJhNTczMjNiZmRjZWEuLmM5ZjU1ZTRmMDk1NzEgMTAwNjQ0Ci0tLSBhL2ZzL3hm cy94ZnNfbG9nX2NpbC5jCisrKyBiL2ZzL3hmcy94ZnNfbG9nX2NpbC5jCkBAIC02MDUsNyArNjA1 LDcgQEAgeGxvZ19kaXNjYXJkX2J1c3lfZXh0ZW50cygKIAkJZXJyb3IgPSBfX2Jsa2Rldl9pc3N1 ZV9kaXNjYXJkKG1wLT5tX2RkZXZfdGFyZ3AtPmJ0X2JkZXYsCiAJCQkJWEZTX0FHQl9UT19EQURE UihtcCwgYnVzeXAtPmFnbm8sIGJ1c3lwLT5ibm8pLAogCQkJCVhGU19GU0JfVE9fQkIobXAsIGJ1 c3lwLT5sZW5ndGgpLAotCQkJCUdGUF9OT0ZTLCAwLCAmYmlvKTsKKwkJCQlHRlBfTk9GUywgJmJp byk7CiAJCWlmIChlcnJvciAmJiBlcnJvciAhPSAtRU9QTk9UU1VQUCkgewogCQkJeGZzX2luZm8o bXAsCiAJICJkaXNjYXJkIGZhaWxlZCBmb3IgZXh0ZW50IFsweCVsbHgsJXVdLCBlcnJvciAlZCIs CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa2Rldi5oIGIvaW5jbHVkZS9saW51eC9ibGtk ZXYuaAppbmRleCBmMWNmNTU3ZWEyMGVmLi5jOWI1OTI1YWY1YTNiIDEwMDY0NAotLS0gYS9pbmNs dWRlL2xpbnV4L2Jsa2Rldi5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgKQEAgLTI0OCw2 ICsyNDgsNyBAQCBzdHJ1Y3QgcXVldWVfbGltaXRzIHsKIAl1bnNpZ25lZCBpbnQJCWlvX29wdDsK IAl1bnNpZ25lZCBpbnQJCW1heF9kaXNjYXJkX3NlY3RvcnM7CiAJdW5zaWduZWQgaW50CQltYXhf aHdfZGlzY2FyZF9zZWN0b3JzOworCXVuc2lnbmVkIGludAkJbWF4X3NlY3VyZV9lcmFzZV9zZWN0 b3JzOwogCXVuc2lnbmVkIGludAkJbWF4X3dyaXRlX3plcm9lc19zZWN0b3JzOwogCXVuc2lnbmVk IGludAkJbWF4X3pvbmVfYXBwZW5kX3NlY3RvcnM7CiAJdW5zaWduZWQgaW50CQlkaXNjYXJkX2dy YW51bGFyaXR5OwpAQCAtNTQyLDcgKzU0Myw2IEBAIHN0cnVjdCByZXF1ZXN0X3F1ZXVlIHsKICNk ZWZpbmUgUVVFVUVfRkxBR19JT19TVEFUCTcJLyogZG8gZGlzay9wYXJ0aXRpb25zIElPIGFjY291 bnRpbmcgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19OT1hNRVJHRVMJOQkvKiBObyBleHRlbmRlZCBt ZXJnZXMgKi8KICNkZWZpbmUgUVVFVUVfRkxBR19BRERfUkFORE9NCTEwCS8qIENvbnRyaWJ1dGVz IHRvIHJhbmRvbSBwb29sICovCi0jZGVmaW5lIFFVRVVFX0ZMQUdfU0VDRVJBU0UJMTEJLyogc3Vw cG9ydHMgc2VjdXJlIGVyYXNlICovCiAjZGVmaW5lIFFVRVVFX0ZMQUdfU0FNRV9GT1JDRQkxMgkv KiBmb3JjZSBjb21wbGV0ZSBvbiBzYW1lIENQVSAqLwogI2RlZmluZSBRVUVVRV9GTEFHX0RFQUQJ CTEzCS8qIHF1ZXVlIHRlYXItZG93biBmaW5pc2hlZCAqLwogI2RlZmluZSBRVUVVRV9GTEFHX0lO SVRfRE9ORQkxNAkvKiBxdWV1ZSBpcyBpbml0aWFsaXplZCAqLwpAQCAtNTgzLDggKzU4Myw2IEBA IGJvb2wgYmxrX3F1ZXVlX2ZsYWdfdGVzdF9hbmRfc2V0KHVuc2lnbmVkIGludCBmbGFnLCBzdHJ1 Y3QgcmVxdWVzdF9xdWV1ZSAqcSk7CiAjZGVmaW5lIGJsa19xdWV1ZV9hZGRfcmFuZG9tKHEpCXRl c3RfYml0KFFVRVVFX0ZMQUdfQUREX1JBTkRPTSwgJihxKS0+cXVldWVfZmxhZ3MpCiAjZGVmaW5l IGJsa19xdWV1ZV96b25lX3Jlc2V0YWxsKHEpCVwKIAl0ZXN0X2JpdChRVUVVRV9GTEFHX1pPTkVf UkVTRVRBTEwsICYocSktPnF1ZXVlX2ZsYWdzKQotI2RlZmluZSBibGtfcXVldWVfc2VjdXJlX2Vy YXNlKHEpIFwKLQkodGVzdF9iaXQoUVVFVUVfRkxBR19TRUNFUkFTRSwgJihxKS0+cXVldWVfZmxh Z3MpKQogI2RlZmluZSBibGtfcXVldWVfZGF4KHEpCXRlc3RfYml0KFFVRVVFX0ZMQUdfREFYLCAm KHEpLT5xdWV1ZV9mbGFncykKICNkZWZpbmUgYmxrX3F1ZXVlX3BjaV9wMnBkbWEocSkJXAogCXRl c3RfYml0KFFVRVVFX0ZMQUdfUENJX1AyUERNQSwgJihxKS0+cXVldWVfZmxhZ3MpCkBAIC05NDcs NiArOTQ1LDggQEAgZXh0ZXJuIHZvaWQgYmxrX3F1ZXVlX2NodW5rX3NlY3RvcnMoc3RydWN0IHJl cXVlc3RfcXVldWUgKiwgdW5zaWduZWQgaW50KTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9tYXhf c2VnbWVudHMoc3RydWN0IHJlcXVlc3RfcXVldWUgKiwgdW5zaWduZWQgc2hvcnQpOwogZXh0ZXJu IHZvaWQgYmxrX3F1ZXVlX21heF9kaXNjYXJkX3NlZ21lbnRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVl ICosCiAJCXVuc2lnbmVkIHNob3J0KTsKK3ZvaWQgYmxrX3F1ZXVlX21heF9zZWN1cmVfZXJhc2Vf c2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJdW5zaWduZWQgaW50IG1heF9zZWN0 b3JzKTsKIGV4dGVybiB2b2lkIGJsa19xdWV1ZV9tYXhfc2VnbWVudF9zaXplKHN0cnVjdCByZXF1 ZXN0X3F1ZXVlICosIHVuc2lnbmVkIGludCk7CiBleHRlcm4gdm9pZCBibGtfcXVldWVfbWF4X2Rp c2NhcmRfc2VjdG9ycyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKIAkJdW5zaWduZWQgaW50IG1h eF9kaXNjYXJkX3NlY3RvcnMpOwpAQCAtMTA4NywxMyArMTA4NywxMiBAQCBzdGF0aWMgaW5saW5l IGxvbmcgbnJfYmxvY2tkZXZfcGFnZXModm9pZCkKIAogZXh0ZXJuIHZvaWQgYmxrX2lvX3NjaGVk dWxlKHZvaWQpOwogCi0jZGVmaW5lIEJMS0RFVl9ESVNDQVJEX1NFQ1VSRQkoMSA8PCAwKQkvKiBp c3N1ZSBhIHNlY3VyZSBlcmFzZSAqLwotCi1leHRlcm4gaW50IGJsa2Rldl9pc3N1ZV9kaXNjYXJk KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwKLQkJc2VjdG9yX3Qg bnJfc2VjdHMsIGdmcF90IGdmcF9tYXNrLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKLWV4dGVybiBp bnQgX19ibGtkZXZfaXNzdWVfZGlzY2FyZChzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0 b3JfdCBzZWN0b3IsCi0JCXNlY3Rvcl90IG5yX3NlY3RzLCBnZnBfdCBnZnBfbWFzaywgaW50IGZs YWdzLAotCQlzdHJ1Y3QgYmlvICoqYmlvcCk7CitpbnQgYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc3Ry dWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3Qgc2VjdG9yLAorCQlzZWN0b3JfdCBucl9z ZWN0cywgZ2ZwX3QgZ2ZwX21hc2spOworaW50IF9fYmxrZGV2X2lzc3VlX2Rpc2NhcmQoc3RydWN0 IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3Qgc2VjdG9yLAorCQlzZWN0b3JfdCBucl9zZWN0 cywgZ2ZwX3QgZ2ZwX21hc2ssIHN0cnVjdCBiaW8gKipiaW9wKTsKK2ludCBibGtkZXZfaXNzdWVf c2VjdXJlX2VyYXNlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwK KwkJc2VjdG9yX3QgbnJfc2VjdHMsIGdmcF90IGdmcCk7CiAKICNkZWZpbmUgQkxLREVWX1pFUk9f Tk9VTk1BUAkoMSA8PCAwKSAgLyogZG8gbm90IGZyZWUgYmxvY2tzICovCiAjZGVmaW5lIEJMS0RF Vl9aRVJPX05PRkFMTEJBQ0sJKDEgPDwgMSkgIC8qIGRvbid0IHdyaXRlIGV4cGxpY2l0IHplcm9l cyAqLwpAQCAtMTExMiw3ICsxMTExLDcgQEAgc3RhdGljIGlubGluZSBpbnQgc2JfaXNzdWVfZGlz Y2FyZChzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBzZWN0b3JfdCBibG9jaywKIAkJCQkJICAgICAg U0VDVE9SX1NISUZUKSwKIAkJCQkgICAgbnJfYmxvY2tzIDw8IChzYi0+c19ibG9ja3NpemVfYml0 cyAtCiAJCQkJCQkgIFNFQ1RPUl9TSElGVCksCi0JCQkJICAgIGdmcF9tYXNrLCBmbGFncyk7CisJ CQkJICAgIGdmcF9tYXNrKTsKIH0KIHN0YXRpYyBpbmxpbmUgaW50IHNiX2lzc3VlX3plcm9vdXQo c3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgc2VjdG9yX3QgYmxvY2ssCiAJCXNlY3Rvcl90IG5yX2Js b2NrcywgZ2ZwX3QgZ2ZwX21hc2spCkBAIC0xMjYyLDYgKzEyNjEsMTIgQEAgc3RhdGljIGlubGlu ZSB1bnNpZ25lZCBpbnQgYmRldl9kaXNjYXJkX2dyYW51bGFyaXR5KHN0cnVjdCBibG9ja19kZXZp Y2UgKmJkZXYpCiAJcmV0dXJuIGJkZXZfZ2V0X3F1ZXVlKGJkZXYpLT5saW1pdHMuZGlzY2FyZF9n cmFudWxhcml0eTsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQKK2JkZXZfbWF4X3Nl Y3VyZV9lcmFzZV9zZWN0b3JzKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCit7CisJcmV0dXJu IGJkZXZfZ2V0X3F1ZXVlKGJkZXYpLT5saW1pdHMubWF4X3NlY3VyZV9lcmFzZV9zZWN0b3JzOwor fQorCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBiZGV2X3dyaXRlX3plcm9lc19zZWN0b3Jz KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYpCiB7CiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEg PSBiZGV2X2dldF9xdWV1ZShiZGV2KTsKZGlmZiAtLWdpdCBhL21tL3N3YXBmaWxlLmMgYi9tbS9z d2FwZmlsZS5jCmluZGV4IDVkOWNlZGY5ZTdiODQuLmEyYjMxZmVhMGM0MmUgMTAwNjQ0Ci0tLSBh L21tL3N3YXBmaWxlLmMKKysrIGIvbW0vc3dhcGZpbGUuYwpAQCAtMTc5LDcgKzE3OSw3IEBAIHN0 YXRpYyBpbnQgZGlzY2FyZF9zd2FwKHN0cnVjdCBzd2FwX2luZm9fc3RydWN0ICpzaSkKIAlucl9i bG9ja3MgPSAoKHNlY3Rvcl90KXNlLT5ucl9wYWdlcyAtIDEpIDw8IChQQUdFX1NISUZUIC0gOSk7 CiAJaWYgKG5yX2Jsb2NrcykgewogCQllcnIgPSBibGtkZXZfaXNzdWVfZGlzY2FyZChzaS0+YmRl diwgc3RhcnRfYmxvY2ssCi0JCQkJbnJfYmxvY2tzLCBHRlBfS0VSTkVMLCAwKTsKKwkJCQlucl9i bG9ja3MsIEdGUF9LRVJORUwpOwogCQlpZiAoZXJyKQogCQkJcmV0dXJuIGVycjsKIAkJY29uZF9y ZXNjaGVkKCk7CkBAIC0xOTAsNyArMTkwLDcgQEAgc3RhdGljIGludCBkaXNjYXJkX3N3YXAoc3Ry dWN0IHN3YXBfaW5mb19zdHJ1Y3QgKnNpKQogCQlucl9ibG9ja3MgPSAoc2VjdG9yX3Qpc2UtPm5y X3BhZ2VzIDw8IChQQUdFX1NISUZUIC0gOSk7CiAKIAkJZXJyID0gYmxrZGV2X2lzc3VlX2Rpc2Nh cmQoc2ktPmJkZXYsIHN0YXJ0X2Jsb2NrLAotCQkJCW5yX2Jsb2NrcywgR0ZQX0tFUk5FTCwgMCk7 CisJCQkJbnJfYmxvY2tzLCBHRlBfS0VSTkVMKTsKIAkJaWYgKGVycikKIAkJCWJyZWFrOwogCkBA IC0yNTQsNyArMjU0LDcgQEAgc3RhdGljIHZvaWQgZGlzY2FyZF9zd2FwX2NsdXN0ZXIoc3RydWN0 IHN3YXBfaW5mb19zdHJ1Y3QgKnNpLAogCQlzdGFydF9ibG9jayA8PD0gUEFHRV9TSElGVCAtIDk7 CiAJCW5yX2Jsb2NrcyA8PD0gUEFHRV9TSElGVCAtIDk7CiAJCWlmIChibGtkZXZfaXNzdWVfZGlz Y2FyZChzaS0+YmRldiwgc3RhcnRfYmxvY2ssCi0JCQkJCW5yX2Jsb2NrcywgR0ZQX05PSU8sIDAp KQorCQkJCQlucl9ibG9ja3MsIEdGUF9OT0lPKSkKIAkJCWJyZWFrOwogCiAJCXNlID0gbmV4dF9z ZShzZSk7Ci0tIAoyLjMwLjIKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpsaW51eC11bSBtYWlsaW5nIGxpc3QKbGludXgtdW1AbGlzdHMuaW5mcmFkZWFk Lm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXVt Cg== From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Hellwig Date: Sat, 9 Apr 2022 06:50:42 +0200 Subject: [Cluster-devel] [PATCH 26/27] block: decouple REQ_OP_SECURE_ERASE from REQ_OP_DISCARD In-Reply-To: <20220409045043.23593-1-hch@lst.de> References: <20220409045043.23593-1-hch@lst.de> Message-ID: <20220409045043.23593-27-hch@lst.de> List-Id: To: cluster-devel.redhat.com MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Secure erase is a very different operation from discard in that it is a data integrity operation vs hint. Fully split the limits and helper infrastructure to make the separation more clear. Signed-off-by: Christoph Hellwig Reviewed-by: Martin K. Petersen Acked-by: Christoph B?hmwalder [drbd] Acked-by: Ryusuke Konishi [nifs2] Acked-by: Coly Li [drbd] Acked-by: David Sterba [btrfs] --- block/blk-core.c | 2 +- block/blk-lib.c | 64 ++++++++++++++++++++--------- block/blk-mq-debugfs.c | 1 - block/blk-settings.c | 16 +++++++- block/fops.c | 2 +- block/ioctl.c | 43 +++++++++++++++---- drivers/block/drbd/drbd_receiver.c | 5 ++- drivers/block/rnbd/rnbd-clt.c | 4 +- drivers/block/rnbd/rnbd-srv-dev.h | 2 +- drivers/block/xen-blkback/blkback.c | 15 +++---- drivers/block/xen-blkback/xenbus.c | 5 +-- drivers/block/xen-blkfront.c | 5 ++- drivers/md/bcache/alloc.c | 2 +- drivers/md/dm-table.c | 8 ++-- drivers/md/dm-thin.c | 4 +- drivers/md/md.c | 2 +- drivers/md/raid5-cache.c | 6 +-- drivers/mmc/core/queue.c | 2 +- drivers/nvme/target/io-cmd-bdev.c | 2 +- drivers/target/target_core_file.c | 2 +- drivers/target/target_core_iblock.c | 2 +- fs/btrfs/extent-tree.c | 4 +- fs/ext4/mballoc.c | 2 +- fs/f2fs/file.c | 16 ++++---- fs/f2fs/segment.c | 2 +- fs/jbd2/journal.c | 2 +- fs/nilfs2/sufile.c | 4 +- fs/nilfs2/the_nilfs.c | 4 +- fs/ntfs3/super.c | 2 +- fs/xfs/xfs_discard.c | 2 +- fs/xfs/xfs_log_cil.c | 2 +- include/linux/blkdev.h | 27 +++++++----- mm/swapfile.c | 6 +-- 33 files changed, 168 insertions(+), 99 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index b5c3a8049134c..ee18b6a699bdf 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -824,7 +824,7 @@ void submit_bio_noacct(struct bio *bio) goto not_supported; break; case REQ_OP_SECURE_ERASE: - if (!blk_queue_secure_erase(q)) + if (!bdev_max_secure_erase_sectors(bdev)) goto not_supported; break; case REQ_OP_ZONE_APPEND: diff --git a/block/blk-lib.c b/block/blk-lib.c index 43aa4d7fe859f..09b7e1200c0f4 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -36,26 +36,15 @@ static sector_t bio_discard_limit(struct block_device *bdev, sector_t sector) } int __blkdev_issue_discard(struct block_device *bdev, sector_t sector, - sector_t nr_sects, gfp_t gfp_mask, int flags, - struct bio **biop) + sector_t nr_sects, gfp_t gfp_mask, struct bio **biop) { - struct request_queue *q = bdev_get_queue(bdev); struct bio *bio = *biop; - unsigned int op; sector_t bs_mask; if (bdev_read_only(bdev)) return -EPERM; - - if (flags & BLKDEV_DISCARD_SECURE) { - if (!blk_queue_secure_erase(q)) - return -EOPNOTSUPP; - op = REQ_OP_SECURE_ERASE; - } else { - if (!bdev_max_discard_sectors(bdev)) - return -EOPNOTSUPP; - op = REQ_OP_DISCARD; - } + if (!bdev_max_discard_sectors(bdev)) + return -EOPNOTSUPP; /* In case the discard granularity isn't set by buggy device driver */ if (WARN_ON_ONCE(!bdev_discard_granularity(bdev))) { @@ -77,7 +66,7 @@ int __blkdev_issue_discard(struct block_device *bdev, sector_t sector, sector_t req_sects = min(nr_sects, bio_discard_limit(bdev, sector)); - bio = blk_next_bio(bio, bdev, 0, op, gfp_mask); + bio = blk_next_bio(bio, bdev, 0, REQ_OP_DISCARD, gfp_mask); bio->bi_iter.bi_sector = sector; bio->bi_iter.bi_size = req_sects << 9; sector += req_sects; @@ -103,21 +92,19 @@ EXPORT_SYMBOL(__blkdev_issue_discard); * @sector: start sector * @nr_sects: number of sectors to discard * @gfp_mask: memory allocation flags (for bio_alloc) - * @flags: BLKDEV_DISCARD_* flags to control behaviour * * Description: * Issue a discard request for the sectors in question. */ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, - sector_t nr_sects, gfp_t gfp_mask, unsigned long flags) + sector_t nr_sects, gfp_t gfp_mask) { struct bio *bio = NULL; struct blk_plug plug; int ret; blk_start_plug(&plug); - ret = __blkdev_issue_discard(bdev, sector, nr_sects, gfp_mask, flags, - &bio); + ret = __blkdev_issue_discard(bdev, sector, nr_sects, gfp_mask, &bio); if (!ret && bio) { ret = submit_bio_wait(bio); if (ret == -EOPNOTSUPP) @@ -314,3 +301,42 @@ int blkdev_issue_zeroout(struct block_device *bdev, sector_t sector, return ret; } EXPORT_SYMBOL(blkdev_issue_zeroout); + +int blkdev_issue_secure_erase(struct block_device *bdev, sector_t sector, + sector_t nr_sects, gfp_t gfp) +{ + sector_t bs_mask = (bdev_logical_block_size(bdev) >> 9) - 1; + unsigned int max_sectors = bdev_max_secure_erase_sectors(bdev); + struct bio *bio = NULL; + struct blk_plug plug; + int ret = 0; + + if (max_sectors == 0) + return -EOPNOTSUPP; + if ((sector | nr_sects) & bs_mask) + return -EINVAL; + if (bdev_read_only(bdev)) + return -EPERM; + + blk_start_plug(&plug); + for (;;) { + unsigned int len = min_t(sector_t, nr_sects, max_sectors); + + bio = blk_next_bio(bio, bdev, 0, REQ_OP_SECURE_ERASE, gfp); + bio->bi_iter.bi_sector = sector; + bio->bi_iter.bi_size = len; + + sector += len << SECTOR_SHIFT; + nr_sects -= len << SECTOR_SHIFT; + if (!nr_sects) { + ret = submit_bio_wait(bio); + bio_put(bio); + break; + } + cond_resched(); + } + blk_finish_plug(&plug); + + return ret; +} +EXPORT_SYMBOL(blkdev_issue_secure_erase); diff --git a/block/blk-mq-debugfs.c b/block/blk-mq-debugfs.c index fd111c5001256..7e4136a60e1cc 100644 --- a/block/blk-mq-debugfs.c +++ b/block/blk-mq-debugfs.c @@ -115,7 +115,6 @@ static const char *const blk_queue_flag_name[] = { QUEUE_FLAG_NAME(IO_STAT), QUEUE_FLAG_NAME(NOXMERGES), QUEUE_FLAG_NAME(ADD_RANDOM), - QUEUE_FLAG_NAME(SECERASE), QUEUE_FLAG_NAME(SAME_FORCE), QUEUE_FLAG_NAME(DEAD), QUEUE_FLAG_NAME(INIT_DONE), diff --git a/block/blk-settings.c b/block/blk-settings.c index fd83d674afd0a..6ccceb421ed2f 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c @@ -46,6 +46,7 @@ void blk_set_default_limits(struct queue_limits *lim) lim->max_zone_append_sectors = 0; lim->max_discard_sectors = 0; lim->max_hw_discard_sectors = 0; + lim->max_secure_erase_sectors = 0; lim->discard_granularity = 0; lim->discard_alignment = 0; lim->discard_misaligned = 0; @@ -176,6 +177,18 @@ void blk_queue_max_discard_sectors(struct request_queue *q, } EXPORT_SYMBOL(blk_queue_max_discard_sectors); +/** + * blk_queue_max_secure_erase_sectors - set max sectors for a secure erase + * @q: the request queue for the device + * @max_sectors: maximum number of sectors to secure_erase + **/ +void blk_queue_max_secure_erase_sectors(struct request_queue *q, + unsigned int max_sectors) +{ + q->limits.max_secure_erase_sectors = max_sectors; +} +EXPORT_SYMBOL(blk_queue_max_secure_erase_sectors); + /** * blk_queue_max_write_zeroes_sectors - set max sectors for a single * write zeroes @@ -661,7 +674,8 @@ int blk_stack_limits(struct queue_limits *t, struct queue_limits *b, t->discard_alignment = lcm_not_zero(t->discard_alignment, alignment) % t->discard_granularity; } - + t->max_secure_erase_sectors = min_not_zero(t->max_secure_erase_sectors, + b->max_secure_erase_sectors); t->zone_write_granularity = max(t->zone_write_granularity, b->zone_write_granularity); t->zoned = max(t->zoned, b->zoned); diff --git a/block/fops.c b/block/fops.c index 9f2ecec406b04..c0ca3254d38cf 100644 --- a/block/fops.c +++ b/block/fops.c @@ -672,7 +672,7 @@ static long blkdev_fallocate(struct file *file, int mode, loff_t start, break; case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE | FALLOC_FL_NO_HIDE_STALE: error = blkdev_issue_discard(bdev, start >> SECTOR_SHIFT, - len >> SECTOR_SHIFT, GFP_KERNEL, 0); + len >> SECTOR_SHIFT, GFP_KERNEL); break; default: error = -EOPNOTSUPP; diff --git a/block/ioctl.c b/block/ioctl.c index c2cd3ba5290ce..5b5027fa78f7e 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -83,7 +83,7 @@ static int compat_blkpg_ioctl(struct block_device *bdev, #endif static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode, - unsigned long arg, unsigned long flags) + unsigned long arg) { uint64_t range[2]; uint64_t start, len; @@ -114,15 +114,43 @@ static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode, err = truncate_bdev_range(bdev, mode, start, start + len - 1); if (err) goto fail; - - err = blkdev_issue_discard(bdev, start >> 9, len >> 9, - GFP_KERNEL, flags); - + err = blkdev_issue_discard(bdev, start >> 9, len >> 9, GFP_KERNEL); fail: filemap_invalidate_unlock(inode->i_mapping); return err; } +static int blk_ioctl_secure_erase(struct block_device *bdev, fmode_t mode, + void __user *argp) +{ + uint64_t start, len; + uint64_t range[2]; + int err; + + if (!(mode & FMODE_WRITE)) + return -EBADF; + if (!bdev_max_secure_erase_sectors(bdev)) + return -EOPNOTSUPP; + if (copy_from_user(range, argp, sizeof(range))) + return -EFAULT; + + start = range[0]; + len = range[1]; + if ((start & 511) || (len & 511)) + return -EINVAL; + if (start + len > bdev_nr_bytes(bdev)) + return -EINVAL; + + filemap_invalidate_lock(bdev->bd_inode->i_mapping); + err = truncate_bdev_range(bdev, mode, start, start + len - 1); + if (!err) + err = blkdev_issue_secure_erase(bdev, start >> 9, len >> 9, + GFP_KERNEL); + filemap_invalidate_unlock(bdev->bd_inode->i_mapping); + return err; +} + + static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode, unsigned long arg) { @@ -450,10 +478,9 @@ static int blkdev_common_ioctl(struct block_device *bdev, fmode_t mode, case BLKROSET: return blkdev_roset(bdev, mode, cmd, arg); case BLKDISCARD: - return blk_ioctl_discard(bdev, mode, arg, 0); + return blk_ioctl_discard(bdev, mode, arg); case BLKSECDISCARD: - return blk_ioctl_discard(bdev, mode, arg, - BLKDEV_DISCARD_SECURE); + return blk_ioctl_secure_erase(bdev, mode, argp); case BLKZEROOUT: return blk_ioctl_zeroout(bdev, mode, arg); case BLKGETDISKSEQ: diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c index 275c53c7b629e..2957b0b68d600 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -1547,7 +1547,8 @@ int drbd_issue_discard_or_zero_out(struct drbd_device *device, sector_t start, u start = tmp; } while (nr_sectors >= max_discard_sectors) { - err |= blkdev_issue_discard(bdev, start, max_discard_sectors, GFP_NOIO, 0); + err |= blkdev_issue_discard(bdev, start, max_discard_sectors, + GFP_NOIO); nr_sectors -= max_discard_sectors; start += max_discard_sectors; } @@ -1559,7 +1560,7 @@ int drbd_issue_discard_or_zero_out(struct drbd_device *device, sector_t start, u nr = nr_sectors; nr -= (unsigned int)nr % granularity; if (nr) { - err |= blkdev_issue_discard(bdev, start, nr, GFP_NOIO, 0); + err |= blkdev_issue_discard(bdev, start, nr, GFP_NOIO); nr_sectors -= nr; start += nr; } diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c index efa99a3884507..d178be175ad99 100644 --- a/drivers/block/rnbd/rnbd-clt.c +++ b/drivers/block/rnbd/rnbd-clt.c @@ -1365,8 +1365,8 @@ static void setup_request_queue(struct rnbd_clt_dev *dev) dev->queue->limits.discard_granularity = dev->discard_granularity; dev->queue->limits.discard_alignment = dev->discard_alignment; if (dev->secure_discard) - blk_queue_flag_set(QUEUE_FLAG_SECERASE, dev->queue); - + blk_queue_max_secure_erase_sectors(dev->queue, + dev->max_discard_sectors); blk_queue_flag_set(QUEUE_FLAG_SAME_COMP, dev->queue); blk_queue_flag_set(QUEUE_FLAG_SAME_FORCE, dev->queue); blk_queue_max_segments(dev->queue, dev->max_segments); diff --git a/drivers/block/rnbd/rnbd-srv-dev.h b/drivers/block/rnbd/rnbd-srv-dev.h index 1f7e1c8fd4d9b..d080a0de59225 100644 --- a/drivers/block/rnbd/rnbd-srv-dev.h +++ b/drivers/block/rnbd/rnbd-srv-dev.h @@ -44,7 +44,7 @@ static inline int rnbd_dev_get_max_hw_sects(const struct rnbd_dev *dev) static inline int rnbd_dev_get_secure_discard(const struct rnbd_dev *dev) { - return blk_queue_secure_erase(bdev_get_queue(dev->bdev)); + return bdev_max_secure_erase_sectors(dev->bdev); } static inline int rnbd_dev_get_max_discard_sects(const struct rnbd_dev *dev) diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index de42458195bc1..a97f2bf5b01b9 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -970,7 +970,6 @@ static int dispatch_discard_io(struct xen_blkif_ring *ring, int status = BLKIF_RSP_OKAY; struct xen_blkif *blkif = ring->blkif; struct block_device *bdev = blkif->vbd.bdev; - unsigned long secure; struct phys_req preq; xen_blkif_get(blkif); @@ -987,13 +986,15 @@ static int dispatch_discard_io(struct xen_blkif_ring *ring, } ring->st_ds_req++; - secure = (blkif->vbd.discard_secure && - (req->u.discard.flag & BLKIF_DISCARD_SECURE)) ? - BLKDEV_DISCARD_SECURE : 0; + if (blkif->vbd.discard_secure && + (req->u.discard.flag & BLKIF_DISCARD_SECURE)) + err = blkdev_issue_secure_erase(bdev, + req->u.discard.sector_number, + req->u.discard.nr_sectors, GFP_KERNEL); + else + err = blkdev_issue_discard(bdev, req->u.discard.sector_number, + req->u.discard.nr_sectors, GFP_KERNEL); - err = blkdev_issue_discard(bdev, req->u.discard.sector_number, - req->u.discard.nr_sectors, - GFP_KERNEL, secure); fail_response: if (err == -EOPNOTSUPP) { pr_debug("discard op failed, not supported\n"); diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c index 83cd08041e6b3..b21bffc9c50bc 100644 --- a/drivers/block/xen-blkback/xenbus.c +++ b/drivers/block/xen-blkback/xenbus.c @@ -484,7 +484,6 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle, { struct xen_vbd *vbd; struct block_device *bdev; - struct request_queue *q; vbd = &blkif->vbd; vbd->handle = handle; @@ -516,11 +515,9 @@ static int xen_vbd_create(struct xen_blkif *blkif, blkif_vdev_t handle, if (vbd->bdev->bd_disk->flags & GENHD_FL_REMOVABLE) vbd->type |= VDISK_REMOVABLE; - q = bdev_get_queue(bdev); if (bdev_write_cache(bdev)) vbd->flush_support = true; - - if (q && blk_queue_secure_erase(q)) + if (bdev_max_secure_erase_sectors(bdev)) vbd->discard_secure = true; vbd->feature_gnt_persistent = feature_persistent; diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 253bf835aca1f..9fb7c69f72b2d 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -949,7 +949,8 @@ static void blkif_set_queue_limits(struct blkfront_info *info) info->physical_sector_size; rq->limits.discard_alignment = info->discard_alignment; if (info->feature_secdiscard) - blk_queue_flag_set(QUEUE_FLAG_SECERASE, rq); + blk_queue_max_secure_erase_sectors(rq, + get_capacity(gd)); } /* Hard sector size and max sectors impersonate the equiv. hardware. */ @@ -1605,7 +1606,7 @@ static irqreturn_t blkif_interrupt(int irq, void *dev_id) blkif_req(req)->error = BLK_STS_NOTSUPP; info->feature_discard = 0; info->feature_secdiscard = 0; - blk_queue_flag_clear(QUEUE_FLAG_SECERASE, rq); + blk_queue_max_secure_erase_sectors(rq, 0); } break; case BLKIF_OP_FLUSH_DISKCACHE: diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c index 097577ae3c471..ce13c272c3872 100644 --- a/drivers/md/bcache/alloc.c +++ b/drivers/md/bcache/alloc.c @@ -336,7 +336,7 @@ static int bch_allocator_thread(void *arg) mutex_unlock(&ca->set->bucket_lock); blkdev_issue_discard(ca->bdev, bucket_to_sector(ca->set, bucket), - ca->sb.bucket_size, GFP_KERNEL, 0); + ca->sb.bucket_size, GFP_KERNEL); mutex_lock(&ca->set->bucket_lock); } diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 0dff6907fd00d..e7d42f6335a2a 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -1920,9 +1920,7 @@ static int device_not_secure_erase_capable(struct dm_target *ti, struct dm_dev *dev, sector_t start, sector_t len, void *data) { - struct request_queue *q = bdev_get_queue(dev->bdev); - - return !blk_queue_secure_erase(q); + return !bdev_max_secure_erase_sectors(dev->bdev); } static bool dm_table_supports_secure_erase(struct dm_table *t) @@ -1975,8 +1973,8 @@ int dm_table_set_restrictions(struct dm_table *t, struct request_queue *q, q->limits.discard_misaligned = 0; } - if (dm_table_supports_secure_erase(t)) - blk_queue_flag_set(QUEUE_FLAG_SECERASE, q); + if (!dm_table_supports_secure_erase(t)) + q->limits.max_secure_erase_sectors = 0; if (dm_table_supports_flush(t, (1UL << QUEUE_FLAG_WC))) { wc = true; diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index eded4bcc4545f..84c083f766736 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -398,8 +398,8 @@ static int issue_discard(struct discard_op *op, dm_block_t data_b, dm_block_t da sector_t s = block_to_sectors(tc->pool, data_b); sector_t len = block_to_sectors(tc->pool, data_e - data_b); - return __blkdev_issue_discard(tc->pool_dev->bdev, s, len, - GFP_NOWAIT, 0, &op->bio); + return __blkdev_issue_discard(tc->pool_dev->bdev, s, len, GFP_NOWAIT, + &op->bio); } static void end_discard(struct discard_op *op, int r) diff --git a/drivers/md/md.c b/drivers/md/md.c index 19636c2f2cda4..2587f872c0884 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -8584,7 +8584,7 @@ void md_submit_discard_bio(struct mddev *mddev, struct md_rdev *rdev, { struct bio *discard_bio = NULL; - if (__blkdev_issue_discard(rdev->bdev, start, size, GFP_NOIO, 0, + if (__blkdev_issue_discard(rdev->bdev, start, size, GFP_NOIO, &discard_bio) || !discard_bio) return; diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index c3cbf9a574a39..094a4042589eb 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -1344,14 +1344,14 @@ static void r5l_write_super_and_discard_space(struct r5l_log *log, if (log->last_checkpoint < end) { blkdev_issue_discard(bdev, log->last_checkpoint + log->rdev->data_offset, - end - log->last_checkpoint, GFP_NOIO, 0); + end - log->last_checkpoint, GFP_NOIO); } else { blkdev_issue_discard(bdev, log->last_checkpoint + log->rdev->data_offset, log->device_size - log->last_checkpoint, - GFP_NOIO, 0); + GFP_NOIO); blkdev_issue_discard(bdev, log->rdev->data_offset, end, - GFP_NOIO, 0); + GFP_NOIO); } } diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c index cac6315010a3d..a3d4460055716 100644 --- a/drivers/mmc/core/queue.c +++ b/drivers/mmc/core/queue.c @@ -189,7 +189,7 @@ static void mmc_queue_setup_discard(struct request_queue *q, if (card->pref_erase > max_discard) q->limits.discard_granularity = SECTOR_SIZE; if (mmc_can_secure_erase_trim(card)) - blk_queue_flag_set(QUEUE_FLAG_SECERASE, q); + blk_queue_max_secure_erase_sectors(q, max_discard); } static unsigned short mmc_get_max_segments(struct mmc_host *host) diff --git a/drivers/nvme/target/io-cmd-bdev.c b/drivers/nvme/target/io-cmd-bdev.c index d886c2c59554f..27a72504d31ce 100644 --- a/drivers/nvme/target/io-cmd-bdev.c +++ b/drivers/nvme/target/io-cmd-bdev.c @@ -360,7 +360,7 @@ static u16 nvmet_bdev_discard_range(struct nvmet_req *req, ret = __blkdev_issue_discard(ns->bdev, nvmet_lba_to_sect(ns, range->slba), le32_to_cpu(range->nlb) << (ns->blksize_shift - 9), - GFP_KERNEL, 0, bio); + GFP_KERNEL, bio); if (ret && ret != -EOPNOTSUPP) { req->error_slba = le64_to_cpu(range->slba); return errno_to_nvme_status(req, ret); diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c index b6ba582b06775..e68f1cc8ef98b 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c @@ -558,7 +558,7 @@ fd_execute_unmap(struct se_cmd *cmd, sector_t lba, sector_t nolb) ret = blkdev_issue_discard(bdev, target_to_linux_sector(dev, lba), target_to_linux_sector(dev, nolb), - GFP_KERNEL, 0); + GFP_KERNEL); if (ret < 0) { pr_warn("FILEIO: blkdev_issue_discard() failed: %d\n", ret); diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_core_iblock.c index c4a903b8a47fc..378c80313a0f2 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c @@ -434,7 +434,7 @@ iblock_execute_unmap(struct se_cmd *cmd, sector_t lba, sector_t nolb) ret = blkdev_issue_discard(bdev, target_to_linux_sector(dev, lba), target_to_linux_sector(dev, nolb), - GFP_KERNEL, 0); + GFP_KERNEL); if (ret < 0) { pr_err("blkdev_issue_discard() failed: %d\n", ret); return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index efd8deb3ab7e8..5c1d3a564da5a 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -1239,7 +1239,7 @@ static int btrfs_issue_discard(struct block_device *bdev, u64 start, u64 len, if (size) { ret = blkdev_issue_discard(bdev, start >> 9, size >> 9, - GFP_NOFS, 0); + GFP_NOFS); if (!ret) *discarded_bytes += size; else if (ret != -EOPNOTSUPP) @@ -1256,7 +1256,7 @@ static int btrfs_issue_discard(struct block_device *bdev, u64 start, u64 len, if (bytes_left) { ret = blkdev_issue_discard(bdev, start >> 9, bytes_left >> 9, - GFP_NOFS, 0); + GFP_NOFS); if (!ret) *discarded_bytes += bytes_left; } diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 6d1820536d88d..ea653d19f9ec7 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -3629,7 +3629,7 @@ static inline int ext4_issue_discard(struct super_block *sb, return __blkdev_issue_discard(sb->s_bdev, (sector_t)discard_block << (sb->s_blocksize_bits - 9), (sector_t)count << (sb->s_blocksize_bits - 9), - GFP_NOFS, 0, biop); + GFP_NOFS, biop); } else return sb_issue_discard(sb, discard_block, count, GFP_NOFS, 0); } diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 8053d99f3920b..35b6c720c2bc1 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -3685,18 +3685,18 @@ static int f2fs_reserve_compress_blocks(struct file *filp, unsigned long arg) static int f2fs_secure_erase(struct block_device *bdev, struct inode *inode, pgoff_t off, block_t block, block_t len, u32 flags) { - struct request_queue *q = bdev_get_queue(bdev); sector_t sector = SECTOR_FROM_BLOCK(block); sector_t nr_sects = SECTOR_FROM_BLOCK(len); int ret = 0; - if (!q) - return -ENXIO; - - if (flags & F2FS_TRIM_FILE_DISCARD) - ret = blkdev_issue_discard(bdev, sector, nr_sects, GFP_NOFS, - blk_queue_secure_erase(q) ? - BLKDEV_DISCARD_SECURE : 0); + if (flags & F2FS_TRIM_FILE_DISCARD) { + if (bdev_max_secure_erase_sectors(bdev)) + ret = blkdev_issue_secure_erase(bdev, sector, nr_sects, + GFP_NOFS); + else + ret = blkdev_issue_discard(bdev, sector, nr_sects, + GFP_NOFS); + } if (!ret && (flags & F2FS_TRIM_FILE_ZEROOUT)) { if (IS_ENCRYPTED(inode)) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 71f09adbcba86..e433c61e64b93 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -1244,7 +1244,7 @@ static int __submit_discard_cmd(struct f2fs_sb_info *sbi, err = __blkdev_issue_discard(bdev, SECTOR_FROM_BLOCK(start), SECTOR_FROM_BLOCK(len), - GFP_NOFS, 0, &bio); + GFP_NOFS, &bio); submit: if (err) { spin_lock_irqsave(&dc->lock, flags); diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 19d226cd4ff4d..c0cbeeaec2d1a 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -1825,7 +1825,7 @@ static int __jbd2_journal_erase(journal_t *journal, unsigned int flags) err = blkdev_issue_discard(journal->j_dev, byte_start >> SECTOR_SHIFT, byte_count >> SECTOR_SHIFT, - GFP_NOFS, 0); + GFP_NOFS); } else if (flags & JBD2_JOURNAL_FLUSH_ZEROOUT) { err = blkdev_issue_zeroout(journal->j_dev, byte_start >> SECTOR_SHIFT, diff --git a/fs/nilfs2/sufile.c b/fs/nilfs2/sufile.c index e385cca2004a7..77ff8e95421fa 100644 --- a/fs/nilfs2/sufile.c +++ b/fs/nilfs2/sufile.c @@ -1100,7 +1100,7 @@ int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range) ret = blkdev_issue_discard(nilfs->ns_bdev, start * sects_per_block, nblocks * sects_per_block, - GFP_NOFS, 0); + GFP_NOFS); if (ret < 0) { put_bh(su_bh); goto out_sem; @@ -1134,7 +1134,7 @@ int nilfs_sufile_trim_fs(struct inode *sufile, struct fstrim_range *range) ret = blkdev_issue_discard(nilfs->ns_bdev, start * sects_per_block, nblocks * sects_per_block, - GFP_NOFS, 0); + GFP_NOFS); if (!ret) ndiscarded += nblocks; } diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c index dd48a8f74d577..3b4a079c9617c 100644 --- a/fs/nilfs2/the_nilfs.c +++ b/fs/nilfs2/the_nilfs.c @@ -672,7 +672,7 @@ int nilfs_discard_segments(struct the_nilfs *nilfs, __u64 *segnump, ret = blkdev_issue_discard(nilfs->ns_bdev, start * sects_per_block, nblocks * sects_per_block, - GFP_NOFS, 0); + GFP_NOFS); if (ret < 0) return ret; nblocks = 0; @@ -682,7 +682,7 @@ int nilfs_discard_segments(struct the_nilfs *nilfs, __u64 *segnump, ret = blkdev_issue_discard(nilfs->ns_bdev, start * sects_per_block, nblocks * sects_per_block, - GFP_NOFS, 0); + GFP_NOFS); return ret; } diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c index 5f2e414cfa79b..5781b9e8e3d85 100644 --- a/fs/ntfs3/super.c +++ b/fs/ntfs3/super.c @@ -1333,7 +1333,7 @@ int ntfs_discard(struct ntfs_sb_info *sbi, CLST lcn, CLST len) return 0; err = blkdev_issue_discard(sb->s_bdev, start >> 9, (end - start) >> 9, - GFP_NOFS, 0); + GFP_NOFS); if (err == -EOPNOTSUPP) sbi->flags |= NTFS_FLAGS_NODISCARD; diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index e2ada115c23f9..c6fe3f6ebb6b0 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c @@ -114,7 +114,7 @@ xfs_trim_extents( } trace_xfs_discard_extent(mp, agno, fbno, flen); - error = blkdev_issue_discard(bdev, dbno, dlen, GFP_NOFS, 0); + error = blkdev_issue_discard(bdev, dbno, dlen, GFP_NOFS); if (error) goto out_del_cursor; *blocks_trimmed += flen; diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index ba57323bfdcea..c9f55e4f09571 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -605,7 +605,7 @@ xlog_discard_busy_extents( error = __blkdev_issue_discard(mp->m_ddev_targp->bt_bdev, XFS_AGB_TO_DADDR(mp, busyp->agno, busyp->bno), XFS_FSB_TO_BB(mp, busyp->length), - GFP_NOFS, 0, &bio); + GFP_NOFS, &bio); if (error && error != -EOPNOTSUPP) { xfs_info(mp, "discard failed for extent [0x%llx,%u], error %d", diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index f1cf557ea20ef..c9b5925af5a3b 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -248,6 +248,7 @@ struct queue_limits { unsigned int io_opt; unsigned int max_discard_sectors; unsigned int max_hw_discard_sectors; + unsigned int max_secure_erase_sectors; unsigned int max_write_zeroes_sectors; unsigned int max_zone_append_sectors; unsigned int discard_granularity; @@ -542,7 +543,6 @@ struct request_queue { #define QUEUE_FLAG_IO_STAT 7 /* do disk/partitions IO accounting */ #define QUEUE_FLAG_NOXMERGES 9 /* No extended merges */ #define QUEUE_FLAG_ADD_RANDOM 10 /* Contributes to random pool */ -#define QUEUE_FLAG_SECERASE 11 /* supports secure erase */ #define QUEUE_FLAG_SAME_FORCE 12 /* force complete on same CPU */ #define QUEUE_FLAG_DEAD 13 /* queue tear-down finished */ #define QUEUE_FLAG_INIT_DONE 14 /* queue is initialized */ @@ -583,8 +583,6 @@ bool blk_queue_flag_test_and_set(unsigned int flag, struct request_queue *q); #define blk_queue_add_random(q) test_bit(QUEUE_FLAG_ADD_RANDOM, &(q)->queue_flags) #define blk_queue_zone_resetall(q) \ test_bit(QUEUE_FLAG_ZONE_RESETALL, &(q)->queue_flags) -#define blk_queue_secure_erase(q) \ - (test_bit(QUEUE_FLAG_SECERASE, &(q)->queue_flags)) #define blk_queue_dax(q) test_bit(QUEUE_FLAG_DAX, &(q)->queue_flags) #define blk_queue_pci_p2pdma(q) \ test_bit(QUEUE_FLAG_PCI_P2PDMA, &(q)->queue_flags) @@ -947,6 +945,8 @@ extern void blk_queue_chunk_sectors(struct request_queue *, unsigned int); extern void blk_queue_max_segments(struct request_queue *, unsigned short); extern void blk_queue_max_discard_segments(struct request_queue *, unsigned short); +void blk_queue_max_secure_erase_sectors(struct request_queue *q, + unsigned int max_sectors); extern void blk_queue_max_segment_size(struct request_queue *, unsigned int); extern void blk_queue_max_discard_sectors(struct request_queue *q, unsigned int max_discard_sectors); @@ -1087,13 +1087,12 @@ static inline long nr_blockdev_pages(void) extern void blk_io_schedule(void); -#define BLKDEV_DISCARD_SECURE (1 << 0) /* issue a secure erase */ - -extern int blkdev_issue_discard(struct block_device *bdev, sector_t sector, - sector_t nr_sects, gfp_t gfp_mask, unsigned long flags); -extern int __blkdev_issue_discard(struct block_device *bdev, sector_t sector, - sector_t nr_sects, gfp_t gfp_mask, int flags, - struct bio **biop); +int blkdev_issue_discard(struct block_device *bdev, sector_t sector, + sector_t nr_sects, gfp_t gfp_mask); +int __blkdev_issue_discard(struct block_device *bdev, sector_t sector, + sector_t nr_sects, gfp_t gfp_mask, struct bio **biop); +int blkdev_issue_secure_erase(struct block_device *bdev, sector_t sector, + sector_t nr_sects, gfp_t gfp); #define BLKDEV_ZERO_NOUNMAP (1 << 0) /* do not free blocks */ #define BLKDEV_ZERO_NOFALLBACK (1 << 1) /* don't write explicit zeroes */ @@ -1112,7 +1111,7 @@ static inline int sb_issue_discard(struct super_block *sb, sector_t block, SECTOR_SHIFT), nr_blocks << (sb->s_blocksize_bits - SECTOR_SHIFT), - gfp_mask, flags); + gfp_mask); } static inline int sb_issue_zeroout(struct super_block *sb, sector_t block, sector_t nr_blocks, gfp_t gfp_mask) @@ -1262,6 +1261,12 @@ static inline unsigned int bdev_discard_granularity(struct block_device *bdev) return bdev_get_queue(bdev)->limits.discard_granularity; } +static inline unsigned int +bdev_max_secure_erase_sectors(struct block_device *bdev) +{ + return bdev_get_queue(bdev)->limits.max_secure_erase_sectors; +} + static inline unsigned int bdev_write_zeroes_sectors(struct block_device *bdev) { struct request_queue *q = bdev_get_queue(bdev); diff --git a/mm/swapfile.c b/mm/swapfile.c index 5d9cedf9e7b84..a2b31fea0c42e 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -179,7 +179,7 @@ static int discard_swap(struct swap_info_struct *si) nr_blocks = ((sector_t)se->nr_pages - 1) << (PAGE_SHIFT - 9); if (nr_blocks) { err = blkdev_issue_discard(si->bdev, start_block, - nr_blocks, GFP_KERNEL, 0); + nr_blocks, GFP_KERNEL); if (err) return err; cond_resched(); @@ -190,7 +190,7 @@ static int discard_swap(struct swap_info_struct *si) nr_blocks = (sector_t)se->nr_pages << (PAGE_SHIFT - 9); err = blkdev_issue_discard(si->bdev, start_block, - nr_blocks, GFP_KERNEL, 0); + nr_blocks, GFP_KERNEL); if (err) break; @@ -254,7 +254,7 @@ static void discard_swap_cluster(struct swap_info_struct *si, start_block <<= PAGE_SHIFT - 9; nr_blocks <<= PAGE_SHIFT - 9; if (blkdev_issue_discard(si->bdev, start_block, - nr_blocks, GFP_NOIO, 0)) + nr_blocks, GFP_NOIO)) break; se = next_se(se); -- 2.30.2 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Hellwig Subject: [PATCH 26/27] block: decouple REQ_OP_SECURE_ERASE from REQ_OP_DISCARD Date: Sat, 9 Apr 2022 06:50:42 +0200 Message-ID: <20220409045043.23593-27-hch@lst.de> References: <20220409045043.23593-1-hch@lst.de> Mime-Version: 1.0 Content-Transfer-Encoding: quoted-printable Return-path: In-Reply-To: <20220409045043.23593-1-hch@lst.de> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: cluster-devel-bounces@redhat.com Sender: "Cluster-devel" Content-Type: text/plain; charset="iso-8859-1" To: Jens Axboe Cc: jfs-discussion@lists.sourceforge.net, linux-nvme@lists.infradead.org, virtualization@lists.linux-foundation.org, linux-mm@kvack.org, dm-devel@redhat.com, target-devel@vger.kernel.org, linux-mtd@lists.infradead.org, drbd-dev@lists.linbit.com, linux-s390@vger.kernel.org, linux-nilfs@vger.kernel.org, linux-scsi@vger.kernel.org, cluster-devel@redhat.com, xen-devel@lists.xenproject.org, linux-ext4@vger.kernel.org, linux-um@lists.infradead.org, nbd@other.debian.org, linux-block@vger.kernel.org, linux-bcache@vger.kernel.org, David Sterba , ceph-devel@vger.kernel.org, Coly Li , Ryusuke Konishi , linux-raid@vger.kernel.org, "Martin K . Petersen" , linux-mmc@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, linux-xfs@vger.kernel.org, =?UTF-8?q?Christoph=20B=C3=B6hmwalder?= Secure erase is a very different operation from discard in that it is a data integrity operation vs hint. Fully split the limits and helper infrastructure to make the separation more clear. Signed-off-by: Christoph Hellwig Reviewed-by: Martin K. Petersen Acked-by: Christoph B=C3=B6hmwalder [drb= d] Acked-by: Ryusuke Konishi [nifs2] Acked-by: Coly Li [drbd] Acked-by: David Sterba [btrfs] --- block/blk-core.c | 2 +- block/blk-lib.c | 64 ++++++++++++++++++++--------- block/blk-mq-debugfs.c | 1 - block/blk-settings.c | 16 +++++++- block/fops.c | 2 +- block/ioctl.c | 43 +++++++++++++++---- drivers/block/drbd/drbd_receiver.c | 5 ++- drivers/block/rnbd/rnbd-clt.c | 4 +- drivers/block/rnbd/rnbd-srv-dev.h | 2 +- drivers/block/xen-blkback/blkback.c | 15 +++---- drivers/block/xen-blkback/xenbus.c | 5 +-- drivers/block/xen-blkfront.c | 5 ++- drivers/md/bcache/alloc.c | 2 +- drivers/md/dm-table.c | 8 ++-- drivers/md/dm-thin.c | 4 +- drivers/md/md.c | 2 +- drivers/md/raid5-cache.c | 6 +-- drivers/mmc/core/queue.c | 2 +- drivers/nvme/target/io-cmd-bdev.c | 2 +- drivers/target/target_core_file.c | 2 +- drivers/target/target_core_iblock.c | 2 +- fs/btrfs/extent-tree.c | 4 +- fs/ext4/mballoc.c | 2 +- fs/f2fs/file.c | 16 ++++---- fs/f2fs/segment.c | 2 +- fs/jbd2/journal.c | 2 +- fs/nilfs2/sufile.c | 4 +- fs/nilfs2/the_nilfs.c | 4 +- fs/ntfs3/super.c | 2 +- fs/xfs/xfs_discard.c | 2 +- fs/xfs/xfs_log_cil.c | 2 +- include/linux/blkdev.h | 27 +++++++----- mm/swapfile.c | 6 +-- 33 files changed, 168 insertions(+), 99 deletions(-) diff --git a/block/blk-core.c b/block/blk-core.c index b5c3a8049134c..ee18b6a699bdf 100644 --- a/block/blk-core.c +++ b/block/blk-core.c @@ -824,7 +824,7 @@ void submit_bio_noacct(struct bio *bio) goto not_supported; break; case REQ_OP_SECURE_ERASE: - if (!blk_queue_secure_erase(q)) + if (!bdev_max_secure_erase_sectors(bdev)) goto not_supported; break; case REQ_OP_ZONE_APPEND: diff --git a/block/blk-lib.c b/block/blk-lib.c index 43aa4d7fe859f..09b7e1200c0f4 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -36,26 +36,15 @@ static sector_t bio_discard_limit(struct block_device *= bdev, sector_t sector) } =20 int __blkdev_issue_discard(struct block_device *bdev, sector_t sector, - sector_t nr_sects, gfp_t gfp_mask, int flags, - struct bio **biop) + sector_t nr_sects, gfp_t gfp_mask, struct bio **biop) { - struct request_queue *q =3D bdev_get_queue(bdev); struct bio *bio =3D *biop; - unsigned int op; sector_t bs_mask; =20 if (bdev_read_only(bdev)) return -EPERM; - - if (flags & BLKDEV_DISCARD_SECURE) { - if (!blk_queue_secure_erase(q)) - return -EOPNOTSUPP; - op =3D REQ_OP_SECURE_ERASE; - } else { - if (!bdev_max_discard_sectors(bdev)) - return -EOPNOTSUPP; - op =3D REQ_OP_DISCARD; - } + if (!bdev_max_discard_sectors(bdev)) + return -EOPNOTSUPP; =20 /* In case the discard granularity isn't set by buggy device driver */ if (WARN_ON_ONCE(!bdev_discard_granularity(bdev))) { @@ -77,7 +66,7 @@ int __blkdev_issue_discard(struct block_device *bdev, sec= tor_t sector, sector_t req_sects =3D min(nr_sects, bio_discard_limit(bdev, sector)); =20 - bio =3D blk_next_bio(bio, bdev, 0, op, gfp_mask); + bio =3D blk_next_bio(bio, bdev, 0, REQ_OP_DISCARD, gfp_mask); bio->bi_iter.bi_sector =3D sector; bio->bi_iter.bi_size =3D req_sects << 9; sector +=3D req_sects; @@ -103,21 +92,19 @@ EXPORT_SYMBOL(__blkdev_issue_discard); * @sector: start sector * @nr_sects: number of sectors to discard * @gfp_mask: memory allocation flags (for bio_alloc) - * @flags: BLKDEV_DISCARD_* flags to control behaviour * * Description: * Issue a discard request for the sectors in question. */ int blkdev_issue_discard(struct block_device *bdev, sector_t sector, - sector_t nr_sects, gfp_t gfp_mask, unsigned long flags) + sector_t nr_sects, gfp_t gfp_mask) { struct bio *bio =3D NULL; struct blk_plug plug; int ret; =20 blk_start_plug(&plug); - ret =3D __blkdev_issue_discard(bdev, sector, nr_sects, gfp_mask, flags, - &bio); + ret =3D __blkdev_issue_discard(bdev, sector, nr_sects, gfp_mask, &bio); if (!ret && bio) { ret =3D submit_bio_wait(bio); if (ret =3D=3D -EOPNOTSUPP) @@ -314,3 +301,42 @@ int blkdev_issue_zeroout(struct block_device *bdev, se= ctor_t sector, return ret; } EXPORT_SYMBOL(blkdev_issue_zeroout); + +int blkdev_issue_secure_erase(struct block_device *bdev, sector_t sector, + sector_t nr_sects, gfp_t gfp) +{ + sector_t bs_mask =3D (bdev_logical_block_size(bdev) >> 9) - 1; + unsigned int max_sectors =3D bdev_max_secure_erase_sectors(bdev); + struct bio *bio =3D NULL; + struct blk_plug plug; + int ret =3D 0; + + if (max_sectors =3D=3D 0) + return -EOPNOTSUPP; + if ((sector | nr_sects) & bs_mask) + return -EINVAL; + if (bdev_read_only(bdev)) + return -EPERM; + + blk_start_plug(&plug); + for (;;) { + unsigned int len =3D min_t(sector_t, nr_sects, max_sectors); + + bio =3D blk_next_bio(bio, bdev, 0, REQ_OP_SECURE_ERASE, gfp); + bio->bi_iter.bi_sector =3D sector; + bio->bi_iter.bi_size =3D len; + + sector +=3D len << SECTOR_SHIFT; + nr_sects -=3D len << SECTOR_SHIFT; + if (!nr_sects) { + ret =3D submit_bio_wait(bio); + bio_put(bio); + break; + } + cond_resched(); + } + blk_finish_plug(&plug); + + return ret; +} +EXPORT_SYMBOL(blkdev_issue_secure_erase); diff --git a/block/blk-mq-debugfs.c b/block/blk-mq-debugfs.c index fd111c5001256..7e4136a60e1cc 100644 --- a/block/blk-mq-debugfs.c +++ b/block/blk-mq-debugfs.c @@ -115,7 +115,6 @@ static const char *const blk_queue_flag_name[] =3D { QUEUE_FLAG_NAME(IO_STAT), QUEUE_FLAG_NAME(NOXMERGES), QUEUE_FLAG_NAME(ADD_RANDOM), - QUEUE_FLAG_NAME(SECERASE), QUEUE_FLAG_NAME(SAME_FORCE), QUEUE_FLAG_NAME(DEAD), QUEUE_FLAG_NAME(INIT_DONE), diff --git a/block/blk-settings.c b/block/blk-settings.c index fd83d674afd0a..6ccceb421ed2f 100644 --- a/block/blk-settings.c +++ b/block/blk-settings.c @@ -46,6 +46,7 @@ void blk_set_default_limits(struct queue_limits *lim) lim->max_zone_append_sectors =3D 0; lim->max_discard_sectors =3D 0; lim->max_hw_discard_sectors =3D 0; + lim->max_secure_erase_sectors =3D 0; lim->discard_granularity =3D 0; lim->discard_alignment =3D 0; lim->discard_misaligned =3D 0; @@ -176,6 +177,18 @@ void blk_queue_max_discard_sectors(struct request_queu= e *q, } EXPORT_SYMBOL(blk_queue_max_discard_sectors); =20 +/** + * blk_queue_max_secure_erase_sectors - set max sectors for a secure erase + * @q: the request queue for the device + * @max_sectors: maximum number of sectors to secure_erase + **/ +void blk_queue_max_secure_erase_sectors(struct request_queue *q, + unsigned int max_sectors) +{ + q->limits.max_secure_erase_sectors =3D max_sectors; +} +EXPORT_SYMBOL(blk_queue_max_secure_erase_sectors); + /** * blk_queue_max_write_zeroes_sectors - set max sectors for a single * write zeroes @@ -661,7 +674,8 @@ int blk_stack_limits(struct queue_limits *t, struct que= ue_limits *b, t->discard_alignment =3D lcm_not_zero(t->discard_alignment, alignment) % t->discard_granularity; } - + t->max_secure_erase_sectors =3D min_not_zero(t->max_secure_erase_sectors, + b->max_secure_erase_sectors); t->zone_write_granularity =3D max(t->zone_write_granularity, b->zone_write_granularity); t->zoned =3D max(t->zoned, b->zoned); diff --git a/block/fops.c b/block/fops.c index 9f2ecec406b04..c0ca3254d38cf 100644 --- a/block/fops.c +++ b/block/fops.c @@ -672,7 +672,7 @@ static long blkdev_fallocate(struct file *file, int mod= e, loff_t start, break; case FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE | FALLOC_FL_NO_HIDE_STALE: error =3D blkdev_issue_discard(bdev, start >> SECTOR_SHIFT, - len >> SECTOR_SHIFT, GFP_KERNEL, 0); + len >> SECTOR_SHIFT, GFP_KERNEL); break; default: error =3D -EOPNOTSUPP; diff --git a/block/ioctl.c b/block/ioctl.c index c2cd3ba5290ce..5b5027fa78f7e 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -83,7 +83,7 @@ static int compat_blkpg_ioctl(struct block_device *bdev, #endif =20 static int blk_ioctl_discard(struct block_device *bdev, fmode_t mode, - unsigned long arg, unsigned long flags) + unsigned long arg) { uint64_t range[2]; uint64_t start, len; @@ -114,15 +114,43 @@ static int blk_ioctl_discard(struct block_device *bde= v, fmode_t mode, err =3D truncate_bdev_range(bdev, mode, start, start + len - 1); if (err) goto fail; - - err =3D blkdev_issue_discard(bdev, start >> 9, len >> 9, - GFP_KERNEL, flags); - + err =3D blkdev_issue_discard(bdev, start >> 9, len >> 9, GFP_KERNEL); fail: filemap_invalidate_unlock(inode->i_mapping); return err; } =20 +static int blk_ioctl_secure_erase(struct block_device *bdev, fmode_t mode, + void __user *argp) +{ + uint64_t start, len; + uint64_t range[2]; + int err; + + if (!(mode & FMODE_WRITE)) + return -EBADF; + if (!bdev_max_secure_erase_sectors(bdev)) + return -EOPNOTSUPP; + if (copy_from_user(range, argp, sizeof(range))) + return -EFAULT; + + start =3D range[0]; + len =3D range[1]; + if ((start & 511) || (len & 511)) + return -EINVAL; + if (start + len > bdev_nr_bytes(bdev)) + return -EINVAL; + + filemap_invalidate_lock(bdev->bd_inode->i_mapping); + err =3D truncate_bdev_range(bdev, mode, start, start + len - 1); + if (!err) + err =3D blkdev_issue_secure_erase(bdev, start >> 9, len >> 9, + GFP_KERNEL); + filemap_invalidate_unlock(bdev->bd_inode->i_mapping); + return err; +} + + static int blk_ioctl_zeroout(struct block_device *bdev, fmode_t mode, unsigned long arg) { @@ -450,10 +478,9 @@ static int blkdev_common_ioctl(struct block_device *bd= ev, fmode_t mode, case BLKROSET: return blkdev_roset(bdev, mode, cmd, arg); case BLKDISCARD: - return blk_ioctl_discard(bdev, mode, arg, 0); + return blk_ioctl_discard(bdev, mode, arg); case BLKSECDISCARD: - return blk_ioctl_discard(bdev, mode, arg, - BLKDEV_DISCARD_SECURE); + return blk_ioctl_secure_erase(bdev, mode, argp); case BLKZEROOUT: return blk_ioctl_zeroout(bdev, mode, arg); case BLKGETDISKSEQ: diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_r= eceiver.c index 275c53c7b629e..2957b0b68d600 100644 --- a/drivers/block/drbd/drbd_receiver.c +++ b/drivers/block/drbd/drbd_receiver.c @@ -1547,7 +1547,8 @@ int drbd_issue_discard_or_zero_out(struct drbd_device= *device, sector_t start, u start =3D tmp; } while (nr_sectors >=3D max_discard_sectors) { - err |=3D blkdev_issue_discard(bdev, start, max_discard_sectors, GFP_NOIO= , 0); + err |=3D blkdev_issue_discard(bdev, start, max_discard_sectors, + GFP_NOIO); nr_sectors -=3D max_discard_sectors; start +=3D max_discard_sectors; } @@ -1559,7 +1560,7 @@ int drbd_issue_discard_or_zero_out(struct drbd_device= *device, sector_t start, u nr =3D nr_sectors; nr -=3D (unsigned int)nr % granularity; if (nr) { - err |=3D blkdev_issue_discard(bdev, start, nr, GFP_NOIO, 0); + err |=3D blkdev_issue_discard(bdev, start, nr, GFP_NOIO); nr_sectors -=3D nr; start +=3D nr; } diff --git a/drivers/block/rnbd/rnbd-clt.c b/drivers/block/rnbd/rnbd-clt.c index efa99a3884507..d178be175ad99 100644 --- a/drivers/block/rnbd/rnbd-clt.c +++ b/drivers/block/rnbd/rnbd-clt.c @@ -1365,8 +1365,8 @@ static void setup_request_queue(struct rnbd_clt_dev *= dev) dev->queue->limits.discard_granularity =3D dev->discard_granularity; dev->queue->limits.discard_alignment =3D dev->discard_alignment; if (dev->secure_discard) - blk_queue_flag_set(QUEUE_FLAG_SECERASE, dev->queue); - + blk_queue_max_secure_erase_sectors(dev->queue, + dev->max_discard_sectors); blk_queue_flag_set(QUEUE_FLAG_SAME_COMP, dev->queue); blk_queue_flag_set(QUEUE_FLAG_SAME_FORCE, dev->queue); blk_queue_max_segments(dev->queue, dev->max_segments); diff --git a/drivers/block/rnbd/rnbd-srv-dev.h b/drivers/block/rnbd/rnbd-sr= v-dev.h index 1f7e1c8fd4d9b..d080a0de59225 100644 --- a/drivers/block/rnbd/rnbd-srv-dev.h +++ b/drivers/block/rnbd/rnbd-srv-dev.h @@ -44,7 +44,7 @@ static inline int rnbd_dev_get_max_hw_sects(const struct = rnbd_dev *dev) =20 static inline int rnbd_dev_get_secure_discard(const struct rnbd_dev *dev) { - return blk_queue_secure_erase(bdev_get_queue(dev->bdev)); + return bdev_max_secure_erase_sectors(dev->bdev); } =20 static inline int rnbd_dev_get_max_discard_sects(const struct rnbd_dev *de= v) diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkbac= k/blkback.c index de42458195bc1..a97f2bf5b01b9 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -970,7 +970,6 @@ static int dispatch_discard_io(struct xen_blkif_ring *r= ing, int status =3D BLKIF_RSP_OKAY; struct xen_blkif *blkif =3D ring->blkif; struct block_device *bdev =3D blkif->vbd.bdev; - unsigned long secure; struct phys_req preq; =20 xen_blkif_get(blkif); @@ -987,13 +986,15 @@ static int dispatch_discard_io(struct xen_blkif_ring = *ring, } ring->st_ds_req++; =20 - secure =3D (blkif->vbd.discard_secure && - (req->u.discard.flag & BLKIF_DISCARD_SECURE)) ? - BLKDEV_DISCARD_SECURE : 0; + if (blkif->vbd.discard_secure && + (req->u.discard.flag & BLKIF_DISCARD_SECURE)) + err =3D blkdev_issue_secure_erase(bdev, + req->u.discard.sector_number, + req->u.discard.nr_sectors, GFP_KERNEL); + else + err =3D blkdev_issue_discard(bdev, req->u.discard.sector_number, + req->u.discard.nr_sectors, GFP_KERNEL); =20 - err =3D blkdev_issue_discard(bdev, req->u.discard.sector_number, - req->u.discard.nr_sectors, - GFP_KERNEL, secure); fail_response: if (err =3D=3D -EOPNOTSUPP) { pr_debug("discard op failed, not supported\n"); diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback= /xenbus.c index 83cd08041e6b3..b21bffc9c50bc 100644 --- a/drivers/block/xen-blkback/xenbus.c +++ b/drivers/block/xen-blkback/xenbus.c @@ -484,7 +484,6 @@ static int xen_vbd_create(struct xen_blkif *blkif, blki= f_vdev_t handle, { struct xen_vbd *vbd; struct block_device *bdev; - struct request_queue *q; =20 vbd =3D &blkif->vbd; vbd->handle =3D handle; @@ -516,11 +515,9 @@ static int xen_vbd_create(struct xen_blkif *blkif, blk= if_vdev_t handle, if (vbd->bdev->bd_disk->flags & GENHD_FL_REMOVABLE) vbd->type |=3D VDISK_REMOVABLE; =20 - q =3D bdev_get_queue(bdev); if (bdev_write_cache(bdev)) vbd->flush_support =3D true; - - if (q && blk_queue_secure_erase(q)) + if (bdev_max_secure_erase_sectors(bdev)) vbd->discard_secure =3D true; =20 vbd->feature_gnt_persistent =3D feature_persistent; diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 253bf835aca1f..9fb7c69f72b2d 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -949,7 +949,8 @@ static void blkif_set_queue_limits(struct blkfront_info= *info) info->physical_sector_size; rq->limits.discard_alignment =3D info->discard_alignment; if (info->feature_secdiscard) - blk_queue_flag_set(QUEUE_FLAG_SECERASE, rq); + blk_queue_max_secure_erase_sectors(rq, + get_capacity(gd)); } =20 /* Hard sector size and max sectors impersonate the equiv. hardware. */ @@ -1605,7 +1606,7 @@ static irqreturn_t blkif_interrupt(int irq, void *dev= _id) blkif_req(req)->error =3D BLK_STS_NOTSUPP; info->feature_discard =3D 0; info->feature_secdiscard =3D 0; - blk_queue_flag_clear(QUEUE_FLAG_SECERASE, rq); + blk_queue_max_secure_erase_sectors(rq, 0); } break; case BLKIF_OP_FLUSH_DISKCACHE: diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c index 097577ae3c471..ce13c272c3872 100644 --- a/drivers/md/bcache/alloc.c +++ b/drivers/md/bcache/alloc.c @@ -336,7 +336,7 @@ static int bch_allocator_thread(void *arg) mutex_unlock(&ca->set->bucket_lock); blkdev_issue_discard(ca->bdev, bucket_to_sector(ca->set, bucket), - ca->sb.bucket_size, GFP_KERNEL, 0); + ca->sb.bucket_size, GFP_KERNEL); mutex_lock(&ca->set->bucket_lock); } =20 diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index 0dff6907fd00d..e7d42f6335a2a 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -1920,9 +1920,7 @@ static int device_not_secure_erase_capable(struct dm_= target *ti, struct dm_dev *dev, sector_t start, sector_t len, void *data) { - struct request_queue *q =3D bdev_get_queue(dev->bdev); - - return !blk_queue_secure_erase(q); + return !bdev_max_secure_erase_sectors(dev->bdev); } =20 static bool dm_table_supports_secure_erase(struct dm_table *t) @@ -1975,8 +1973,8 @@ int dm_table_set_restrictions(struct dm_table *t, str= uct request_queue *q, q->limits.discard_misaligned =3D 0; } =20 - if (dm_table_supports_secure_erase(t)) - blk_queue_flag_set(QUEUE_FLAG_SECERASE, q); + if (!dm_table_supports_secure_erase(t)) + q->limits.max_secure_erase_sectors =3D 0; =20 if (dm_table_supports_flush(t, (1UL << QUEUE_FLAG_WC))) { wc =3D true; diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c index eded4bcc4545f..84c083f766736 100644 --- a/drivers/md/dm-thin.c +++ b/drivers/md/dm-thin.c @@ -398,8 +398,8 @@ static int issue_discard(struct discard_op *op, dm_bloc= k_t data_b, dm_block_t da sector_t s =3D block_to_sectors(tc->pool, data_b); sector_t len =3D block_to_sectors(tc->pool, data_e - data_b); =20 - return __blkdev_issue_discard(tc->pool_dev->bdev, s, len, - GFP_NOWAIT, 0, &op->bio); + return __blkdev_issue_discard(tc->pool_dev->bdev, s, len, GFP_NOWAIT, + &op->bio); } =20 static void end_discard(struct discard_op *op, int r) diff --git a/drivers/md/md.c b/drivers/md/md.c index 19636c2f2cda4..2587f872c0884 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c @@ -8584,7 +8584,7 @@ void md_submit_discard_bio(struct mddev *mddev, struc= t md_rdev *rdev, { struct bio *discard_bio =3D NULL; =20 - if (__blkdev_issue_discard(rdev->bdev, start, size, GFP_NOIO, 0, + if (__blkdev_issue_discard(rdev->bdev, start, size, GFP_NOIO, &discard_bio) || !discard_bio) return; =20 diff --git a/drivers/md/raid5-cache.c b/drivers/md/raid5-cache.c index c3cbf9a574a39..094a4042589eb 100644 --- a/drivers/md/raid5-cache.c +++ b/drivers/md/raid5-cache.c @@ -1344,14 +1344,14 @@ static void r5l_write_super_and_discard_space(struc= t r5l_log *log, if (log->last_checkpoint < end) { blkdev_issue_discard(bdev, log->last_checkpoint + log->rdev->data_offset, - end - log->last_checkpoint, GFP_NOIO, 0); + end - log->last_checkpoint, GFP_NOIO); } else { blkdev_issue_discard(bdev, log->last_checkpoint + log->rdev->data_offset, log->device_size - log->last_checkpoint, - GFP_NOIO, 0); + GFP_NOIO); blkdev_issue_discard(bdev, log->rdev->data_offset, end, - GFP_NOIO, 0); + GFP_NOIO); } } =20 diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c index cac6315010a3d..a3d4460055716 100644 --- a/drivers/mmc/core/queue.c +++ b/drivers/mmc/core/queue.c @@ -189,7 +189,7 @@ static void mmc_queue_setup_discard(struct request_queu= e *q, if (card->pref_erase > max_discard) q->limits.discard_granularity =3D SECTOR_SIZE; if (mmc_can_secure_erase_trim(card)) - blk_queue_flag_set(QUEUE_FLAG_SECERASE, q); + blk_queue_max_secure_erase_sectors(q, max_discard); } =20 static unsigned short mmc_get_max_segments(struct mmc_host *host) diff --git a/drivers/nvme/target/io-cmd-bdev.c b/drivers/nvme/target/io-cmd= -bdev.c index d886c2c59554f..27a72504d31ce 100644 --- a/drivers/nvme/target/io-cmd-bdev.c +++ b/drivers/nvme/target/io-cmd-bdev.c @@ -360,7 +360,7 @@ static u16 nvmet_bdev_discard_range(struct nvmet_req *r= eq, ret =3D __blkdev_issue_discard(ns->bdev, nvmet_lba_to_sect(ns, range->slba), le32_to_cpu(range->nlb) << (ns->blksize_shift - 9), - GFP_KERNEL, 0, bio); + GFP_KERNEL, bio); if (ret && ret !=3D -EOPNOTSUPP) { req->error_slba =3D le64_to_cpu(range->slba); return errno_to_nvme_status(req, ret); diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core= _file.c index b6ba582b06775..e68f1cc8ef98b 100644 --- a/drivers/target/target_core_file.c +++ b/drivers/target/target_core_file.c @@ -558,7 +558,7 @@ fd_execute_unmap(struct se_cmd *cmd, sector_t lba, sect= or_t nolb) ret =3D blkdev_issue_discard(bdev, target_to_linux_sector(dev, lba), target_to_linux_sector(dev, nolb), - GFP_KERNEL, 0); + GFP_KERNEL); if (ret < 0) { pr_warn("FILEIO: blkdev_issue_discard() failed: %d\n", ret); diff --git a/drivers/target/target_core_iblock.c b/drivers/target/target_co= re_iblock.c index c4a903b8a47fc..378c80313a0f2 100644 --- a/drivers/target/target_core_iblock.c +++ b/drivers/target/target_core_iblock.c @@ -434,7 +434,7 @@ iblock_execute_unmap(struct se_cmd *cmd, sector_t lba, = sector_t nolb) ret =3D blkdev_issue_discard(bdev, target_to_linux_sector(dev, lba), target_to_linux_sector(dev, nolb), - GFP_KERNEL, 0); + GFP_KERNEL); if (ret < 0) { pr_err("blkdev_issue_discard() failed: %d\n", ret); return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE; diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index efd8deb3ab7e8..5c1d3a564da5a 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -1239,7 +1239,7 @@ static int btrfs_issue_discard(struct block_device *b= dev, u64 start, u64 len, =20 if (size) { ret =3D blkdev_issue_discard(bdev, start >> 9, size >> 9, - GFP_NOFS, 0); + GFP_NOFS); if (!ret) *discarded_bytes +=3D size; else if (ret !=3D -EOPNOTSUPP) @@ -1256,7 +1256,7 @@ static int btrfs_issue_discard(struct block_device *b= dev, u64 start, u64 len, =20 if (bytes_left) { ret =3D blkdev_issue_discard(bdev, start >> 9, bytes_left >> 9, - GFP_NOFS, 0); + GFP_NOFS); if (!ret) *discarded_bytes +=3D bytes_left; } diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c index 6d1820536d88d..ea653d19f9ec7 100644 --- a/fs/ext4/mballoc.c +++ b/fs/ext4/mballoc.c @@ -3629,7 +3629,7 @@ static inline int ext4_issue_discard(struct super_blo= ck *sb, return __blkdev_issue_discard(sb->s_bdev, (sector_t)discard_block << (sb->s_blocksize_bits - 9), (sector_t)count << (sb->s_blocksize_bits - 9), - GFP_NOFS, 0, biop); + GFP_NOFS, biop); } else return sb_issue_discard(sb, discard_block, count, GFP_NOFS, 0); } diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index 8053d99f3920b..35b6c720c2bc1 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -3685,18 +3685,18 @@ static int f2fs_reserve_compress_blocks(struct file= *filp, unsigned long arg) static int f2fs_secure_erase(struct block_device *bdev, struct inode *inod= e, pgoff_t off, block_t block, block_t len, u32 flags) { - struct request_queue *q =3D bdev_get_queue(bdev); sector_t sector =3D SECTOR_FROM_BLOCK(block); sector_t nr_sects =3D SECTOR_FROM_BLOCK(len); int ret =3D 0; =20 - if (!q) - return -ENXIO; - - if (flags & F2FS_TRIM_FILE_DISCARD) - ret =3D blkdev_issue_discard(bdev, sector, nr_sects, GFP_NOFS, - blk_queue_secure_erase(q) ? - BLKDEV_DISCARD_SECURE : 0); + if (flags & F2FS_TRIM_FILE_DISCARD) { + if (bdev_max_secure_erase_sectors(bdev)) + ret =3D blkdev_issue_secure_erase(bdev, sector, nr_sects, + GFP_NOFS); + else + ret =3D blkdev_issue_discard(bdev, sector, nr_sects, + GFP_NOFS); + } =20 if (!ret && (flags & F2FS_TRIM_FILE_ZEROOUT)) { if (IS_ENCRYPTED(inode)) diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c index 71f09adbcba86..e433c61e64b93 100644 --- a/fs/f2fs/segment.c +++ b/fs/f2fs/segment.c @@ -1244,7 +1244,7 @@ static int __submit_discard_cmd(struct f2fs_sb_info *= sbi, err =3D __blkdev_issue_discard(bdev, SECTOR_FROM_BLOCK(start), SECTOR_FROM_BLOCK(len), - GFP_NOFS, 0, &bio); + GFP_NOFS, &bio); submit: if (err) { spin_lock_irqsave(&dc->lock, flags); diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c index 19d226cd4ff4d..c0cbeeaec2d1a 100644 --- a/fs/jbd2/journal.c +++ b/fs/jbd2/journal.c @@ -1825,7 +1825,7 @@ static int __jbd2_journal_erase(journal_t *journal, u= nsigned int flags) err =3D blkdev_issue_discard(journal->j_dev, byte_start >> SECTOR_SHIFT, byte_count >> SECTOR_SHIFT, - GFP_NOFS, 0); + GFP_NOFS); } else if (flags & JBD2_JOURNAL_FLUSH_ZEROOUT) { err =3D blkdev_issue_zeroout(journal->j_dev, byte_start >> SECTOR_SHIFT, diff --git a/fs/nilfs2/sufile.c b/fs/nilfs2/sufile.c index e385cca2004a7..77ff8e95421fa 100644 --- a/fs/nilfs2/sufile.c +++ b/fs/nilfs2/sufile.c @@ -1100,7 +1100,7 @@ int nilfs_sufile_trim_fs(struct inode *sufile, struct= fstrim_range *range) ret =3D blkdev_issue_discard(nilfs->ns_bdev, start * sects_per_block, nblocks * sects_per_block, - GFP_NOFS, 0); + GFP_NOFS); if (ret < 0) { put_bh(su_bh); goto out_sem; @@ -1134,7 +1134,7 @@ int nilfs_sufile_trim_fs(struct inode *sufile, struct= fstrim_range *range) ret =3D blkdev_issue_discard(nilfs->ns_bdev, start * sects_per_block, nblocks * sects_per_block, - GFP_NOFS, 0); + GFP_NOFS); if (!ret) ndiscarded +=3D nblocks; } diff --git a/fs/nilfs2/the_nilfs.c b/fs/nilfs2/the_nilfs.c index dd48a8f74d577..3b4a079c9617c 100644 --- a/fs/nilfs2/the_nilfs.c +++ b/fs/nilfs2/the_nilfs.c @@ -672,7 +672,7 @@ int nilfs_discard_segments(struct the_nilfs *nilfs, __u= 64 *segnump, ret =3D blkdev_issue_discard(nilfs->ns_bdev, start * sects_per_block, nblocks * sects_per_block, - GFP_NOFS, 0); + GFP_NOFS); if (ret < 0) return ret; nblocks =3D 0; @@ -682,7 +682,7 @@ int nilfs_discard_segments(struct the_nilfs *nilfs, __u= 64 *segnump, ret =3D blkdev_issue_discard(nilfs->ns_bdev, start * sects_per_block, nblocks * sects_per_block, - GFP_NOFS, 0); + GFP_NOFS); return ret; } =20 diff --git a/fs/ntfs3/super.c b/fs/ntfs3/super.c index 5f2e414cfa79b..5781b9e8e3d85 100644 --- a/fs/ntfs3/super.c +++ b/fs/ntfs3/super.c @@ -1333,7 +1333,7 @@ int ntfs_discard(struct ntfs_sb_info *sbi, CLST lcn, = CLST len) return 0; =20 err =3D blkdev_issue_discard(sb->s_bdev, start >> 9, (end - start) >> 9, - GFP_NOFS, 0); + GFP_NOFS); =20 if (err =3D=3D -EOPNOTSUPP) sbi->flags |=3D NTFS_FLAGS_NODISCARD; diff --git a/fs/xfs/xfs_discard.c b/fs/xfs/xfs_discard.c index e2ada115c23f9..c6fe3f6ebb6b0 100644 --- a/fs/xfs/xfs_discard.c +++ b/fs/xfs/xfs_discard.c @@ -114,7 +114,7 @@ xfs_trim_extents( } =20 trace_xfs_discard_extent(mp, agno, fbno, flen); - error =3D blkdev_issue_discard(bdev, dbno, dlen, GFP_NOFS, 0); + error =3D blkdev_issue_discard(bdev, dbno, dlen, GFP_NOFS); if (error) goto out_del_cursor; *blocks_trimmed +=3D flen; diff --git a/fs/xfs/xfs_log_cil.c b/fs/xfs/xfs_log_cil.c index ba57323bfdcea..c9f55e4f09571 100644 --- a/fs/xfs/xfs_log_cil.c +++ b/fs/xfs/xfs_log_cil.c @@ -605,7 +605,7 @@ xlog_discard_busy_extents( error =3D __blkdev_issue_discard(mp->m_ddev_targp->bt_bdev, XFS_AGB_TO_DADDR(mp, busyp->agno, busyp->bno), XFS_FSB_TO_BB(mp, busyp->length), - GFP_NOFS, 0, &bio); + GFP_NOFS, &bio); if (error && error !=3D -EOPNOTSUPP) { xfs_info(mp, "discard failed for extent [0x%llx,%u], error %d", diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index f1cf557ea20ef..c9b5925af5a3b 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -248,6 +248,7 @@ struct queue_limits { unsigned int io_opt; unsigned int max_discard_sectors; unsigned int max_hw_discard_sectors; + unsigned int max_secure_erase_sectors; unsigned int max_write_zeroes_sectors; unsigned int max_zone_append_sectors; unsigned int discard_granularity; @@ -542,7 +543,6 @@ struct request_queue { #define QUEUE_FLAG_IO_STAT 7 /* do disk/partitions IO accounting */ #define QUEUE_FLAG_NOXMERGES 9 /* No extended merges */ #define QUEUE_FLAG_ADD_RANDOM 10 /* Contributes to random pool */ -#define QUEUE_FLAG_SECERASE 11 /* supports secure erase */ #define QUEUE_FLAG_SAME_FORCE 12 /* force complete on same CPU */ #define QUEUE_FLAG_DEAD 13 /* queue tear-down finished */ #define QUEUE_FLAG_INIT_DONE 14 /* queue is initialized */ @@ -583,8 +583,6 @@ bool blk_queue_flag_test_and_set(unsigned int flag, str= uct request_queue *q); #define blk_queue_add_random(q) test_bit(QUEUE_FLAG_ADD_RANDOM, &(q)->queu= e_flags) #define blk_queue_zone_resetall(q) \ test_bit(QUEUE_FLAG_ZONE_RESETALL, &(q)->queue_flags) -#define blk_queue_secure_erase(q) \ - (test_bit(QUEUE_FLAG_SECERASE, &(q)->queue_flags)) #define blk_queue_dax(q) test_bit(QUEUE_FLAG_DAX, &(q)->queue_flags) #define blk_queue_pci_p2pdma(q) \ test_bit(QUEUE_FLAG_PCI_P2PDMA, &(q)->queue_flags) @@ -947,6 +945,8 @@ extern void blk_queue_chunk_sectors(struct request_queu= e *, unsigned int); extern void blk_queue_max_segments(struct request_queue *, unsigned short); extern void blk_queue_max_discard_segments(struct request_queue *, unsigned short); +void blk_queue_max_secure_erase_sectors(struct request_queue *q, + unsigned int max_sectors); extern void blk_queue_max_segment_size(struct request_queue *, unsigned in= t); extern void blk_queue_max_discard_sectors(struct request_queue *q, unsigned int max_discard_sectors); @@ -1087,13 +1087,12 @@ static inline long nr_blockdev_pages(void) =20 extern void blk_io_schedule(void); =20 -#define BLKDEV_DISCARD_SECURE (1 << 0) /* issue a secure erase */ - -extern int blkdev_issue_discard(struct block_device *bdev, sector_t sector, - sector_t nr_sects, gfp_t gfp_mask, unsigned long flags); -extern int __blkdev_issue_discard(struct block_device *bdev, sector_t sect= or, - sector_t nr_sects, gfp_t gfp_mask, int flags, - struct bio **biop); +int blkdev_issue_discard(struct block_device *bdev, sector_t sector, + sector_t nr_sects, gfp_t gfp_mask); +int __blkdev_issue_discard(struct block_device *bdev, sector_t sector, + sector_t nr_sects, gfp_t gfp_mask, struct bio **biop); +int blkdev_issue_secure_erase(struct block_device *bdev, sector_t sector, + sector_t nr_sects, gfp_t gfp); =20 #define BLKDEV_ZERO_NOUNMAP (1 << 0) /* do not free blocks */ #define BLKDEV_ZERO_NOFALLBACK (1 << 1) /* don't write explicit zeroes */ @@ -1112,7 +1111,7 @@ static inline int sb_issue_discard(struct super_block= *sb, sector_t block, SECTOR_SHIFT), nr_blocks << (sb->s_blocksize_bits - SECTOR_SHIFT), - gfp_mask, flags); + gfp_mask); } static inline int sb_issue_zeroout(struct super_block *sb, sector_t block, sector_t nr_blocks, gfp_t gfp_mask) @@ -1262,6 +1261,12 @@ static inline unsigned int bdev_discard_granularity(= struct block_device *bdev) return bdev_get_queue(bdev)->limits.discard_granularity; } =20 +static inline unsigned int +bdev_max_secure_erase_sectors(struct block_device *bdev) +{ + return bdev_get_queue(bdev)->limits.max_secure_erase_sectors; +} + static inline unsigned int bdev_write_zeroes_sectors(struct block_device *= bdev) { struct request_queue *q =3D bdev_get_queue(bdev); diff --git a/mm/swapfile.c b/mm/swapfile.c index 5d9cedf9e7b84..a2b31fea0c42e 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -179,7 +179,7 @@ static int discard_swap(struct swap_info_struct *si) nr_blocks =3D ((sector_t)se->nr_pages - 1) << (PAGE_SHIFT - 9); if (nr_blocks) { err =3D blkdev_issue_discard(si->bdev, start_block, - nr_blocks, GFP_KERNEL, 0); + nr_blocks, GFP_KERNEL); if (err) return err; cond_resched(); @@ -190,7 +190,7 @@ static int discard_swap(struct swap_info_struct *si) nr_blocks =3D (sector_t)se->nr_pages << (PAGE_SHIFT - 9); =20 err =3D blkdev_issue_discard(si->bdev, start_block, - nr_blocks, GFP_KERNEL, 0); + nr_blocks, GFP_KERNEL); if (err) break; =20 @@ -254,7 +254,7 @@ static void discard_swap_cluster(struct swap_info_struc= t *si, start_block <<=3D PAGE_SHIFT - 9; nr_blocks <<=3D PAGE_SHIFT - 9; if (blkdev_issue_discard(si->bdev, start_block, - nr_blocks, GFP_NOIO, 0)) + nr_blocks, GFP_NOIO)) break; =20 se =3D next_se(se); --=20 2.30.2