From patchwork Thu Feb 20 06:21:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Yuezhang.Mo@sony.com" X-Patchwork-Id: 13983368 Received: from mx08-001d1705.pphosted.com (mx08-001d1705.pphosted.com [185.183.30.70]) (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 09E701632DF for ; Thu, 20 Feb 2025 06:21:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=185.183.30.70 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740032513; cv=fail; b=vBe7ygPGFG6UMVBOSHPKJ0XnWpgsfcBY37j578ujD9HLGEpHW3WY5+Qgv2WsnETLGwgHKBDvkPr5FiBaqHEPZH3qUlY0rfSEhDoSwaZnDYrvm9w+srjyW3m4BNHPbsU7GNtDEBhLAxlL4y0hTUEZSSx5rq6SfiGQSUxrSrxctLw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1740032513; c=relaxed/simple; bh=TMLdnRALm7KunhM5/ypENw34IbdywnzYqy7sK72Pkoo=; h=From:To:CC:Subject:Date:Message-ID:Content-Type:MIME-Version; b=XtJ19A+sw579evsBv04K2/QntEs87MWoWtrToTt0f39xtYNZUyn2yETS02tzAkJ2HzbAJwcUbkg6Un3q7dc93lPK9Rw5iFUOHnzbwTjAHOHeq4FFF+D9zw2w1EjhYI2LocoAuNqoBxs6Rsutys6S0Tmd+P/7MeoqQTYgYSUFsRE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=sony.com; spf=pass smtp.mailfrom=sony.com; dkim=pass (2048-bit key) header.d=sony.com header.i=@sony.com header.b=OYz5tuIK; arc=fail smtp.client-ip=185.183.30.70 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=sony.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=sony.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sony.com header.i=@sony.com header.b="OYz5tuIK" Received: from pps.filterd (m0209318.ppops.net [127.0.0.1]) by mx08-001d1705.pphosted.com (8.18.1.2/8.18.1.2) with ESMTP id 51K5a9t8003723; Thu, 20 Feb 2025 06:21:34 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sony.com; h=cc :content-transfer-encoding:content-type:date:from:message-id :mime-version:subject:to; s=S1; bh=TMLdnRALm7KunhM5/ypENw34Ibdyw nzYqy7sK72Pkoo=; b=OYz5tuIKKtIaMZB63Wslui7wfLsIVHstouBcMwOxE585x Okt8QK2bRHoWbbvA6NgrxiXEfnrr4pZtkmNqzxae16kTOPp8RDLlD6CxEV1k8ZgD 3ZldRPLX4vOQsCrblf9kQ6lWDF/YinFxPU+f8OrPquboLJu1zwIMy/+CrY1jTeGL nCqW8+DQE4Y2AWR9W7USwz4ghqBVc5O9LLC0D/uhKefbNs0ra/9XjqPmqi21JsgZ +/cHMUkJlX+EGFnbMnmrSFGm9j0XrarRRtcwzjL1FcMEX6obYpgaT9cjLV8lsOZV cbjxB9BqjCb+idDRV2KVo2iTwSq3mDPGy6MR2hNig== Received: from apc01-sg2-obe.outbound.protection.outlook.com (mail-sg2apc01lp2104.outbound.protection.outlook.com [104.47.26.104]) by mx08-001d1705.pphosted.com (PPS) with ESMTPS id 44vyyk1fkn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Thu, 20 Feb 2025 06:21:34 +0000 (GMT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=PyUj6p6papOMjJgotXMRoEUPaL0vXAmZfTzUqI+5vac8vyqk8s9xbLvt1XRT+L4qrCbTqOh7uvEFzGMrVbcAVOGbzVwgc2g5G43MMZDRsjfbluSXEMxpUgyMTS6FWTydPqN0PkQRsZFKN3h2bQjI0JJ4jtK7f4m54Vp5HxtwfponMDdmB/4v1tKhrN0oDDOpkKE86VsO3sGpm1X3CoPbACuzKNL3dIGH9RqUo9zEVxkJFkBlZbNuNxnDV3aoBJrTnYfeMMYEYJougeK+cRQfTlohZsvAldxSYCjBbM25KsOtib2vc2f6yd32L2RjJlXBAnfCZcN54aXMHMmnix4AQw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=TMLdnRALm7KunhM5/ypENw34IbdywnzYqy7sK72Pkoo=; b=lDtlrBXc28NcyU63MleHRpEsV2+0aG2iAxz+XCdkoO/Aw/hPL0pXLH1VvectbvTQNbZMkDS7z08Jb+VhJftCKUXEghoipuLcuaLF9RK7r4AQX5VAUsx2XHNU2JdcKUnRPJ2E8ZJYAROdXET9Bd4CrSAPINx+4FgeGPyRxusUXLbkvoZ7jgVvLhF1AWrvAMDrY4/0DhEkCV0EtF/g9DDlj1hkZ/QFpQIeiyWJWloZaB80PH3+Ml0QeQ3RYGWmnOSHEw+7lCtg/BW0F3fkOnlLSd411sITZzGVEqdKLbvUHOuUQbGtduKlv+OXkQUjZvIvTWKFhRQFe5wL67iEm2uGVw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=sony.com; dmarc=pass action=none header.from=sony.com; dkim=pass header.d=sony.com; arc=none Received: from PUZPR04MB6316.apcprd04.prod.outlook.com (2603:1096:301:fc::7) by KL1PR04MB6782.apcprd04.prod.outlook.com (2603:1096:820:d0::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.8466.16; Thu, 20 Feb 2025 06:21:25 +0000 Received: from PUZPR04MB6316.apcprd04.prod.outlook.com ([fe80::409e:64d3:cee0:7b06]) by PUZPR04MB6316.apcprd04.prod.outlook.com ([fe80::409e:64d3:cee0:7b06%5]) with mapi id 15.20.8445.017; Thu, 20 Feb 2025 06:21:24 +0000 From: "Yuezhang.Mo@sony.com" To: "linkinjeon@kernel.org" , "sj1557.seo@samsung.com" CC: "linux-fsdevel@vger.kernel.org" Subject: [PATCH v1] exfat: support batch discard of clusters when freeing clusters Thread-Topic: [PATCH v1] exfat: support batch discard of clusters when freeing clusters Thread-Index: AduDXeUlpyGxMJJzQEyYkRvhiBs3Ng== Date: Thu, 20 Feb 2025 06:21:24 +0000 Message-ID: Accept-Language: en-US, zh-CN Content-Language: zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-publictraffictype: Email x-ms-traffictypediagnostic: PUZPR04MB6316:EE_|KL1PR04MB6782:EE_ x-ms-office365-filtering-correlation-id: 83c0500d-46c6-49d3-2296-08dd5176cd3d x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0;ARA:13230040|366016|1800799024|376014|38070700018; x-microsoft-antispam-message-info: =?utf-8?q?dx9tPfxjJ8Lr+bsM0VTivRBkVo8AfTs?= =?utf-8?q?a4WOC+cQm80T+vRYxzssVmK0N0bIeTBJnZ6HfLPCLEnc5M7qxDOvArc/Q35rBSdrX?= =?utf-8?q?HGWw3QjbT54Ymb1w6knnJEyTrhI3OrR2x7y0feMNh6JwLKknlCVn2S8pYnXFp0try?= =?utf-8?q?epShrmregqjxR3ZAIaDBUImmHpudbVE399JVEJ8TQu43ehTlyEkWI6hBAL7VSKr1+?= =?utf-8?q?jMQK1keQWHgB4yRrn7qg18FDZpfItLL80/O6LPOPDI/Qk9dGdeGkkGDnLRQOG98W3?= =?utf-8?q?RXGwp/Nxo37JK+NU24a/1RwHgmaDXLZ/ejGq34iukhD17W3nkxeSHiIRji+iigDOv?= =?utf-8?q?Dt0LRtn/KTpSRKPKUeS9VrD2xw90N3E7nNGYh7D0vVVGJsZUyd0hHKyD6NIF/iYpr?= =?utf-8?q?L4OtrWOJHGMHeaGvcHyN4oCpUUrc8sl5HA/e3KC2Si8/Gm4cIjhFedB0wjxgEdjRy?= =?utf-8?q?o82ktiMPiBU+/jcKxiQEn6yS9aNjsfizrnFeJqZgt+2pr+PZGqYLSd11sulpgeYwj?= =?utf-8?q?7/0XKnBnVV51x5jjIhfV+pzxVnS9O9SN8ESQ69EaoWH9RsU7zVuXQpuQRwIpa7D+N?= =?utf-8?q?ohKjQPbjwWjnu8k9pfSWlux8jm4ZQbCE/vLZErwrV+lAnwdlY1UUg9gP3+T42VDoB?= =?utf-8?q?g4bomqrDknBJj7FKQOASIA0O9vlZqFx8l79tL1wGTWIMPmOK0HMmonQoKXqZzMerF?= =?utf-8?q?SuPVjEYz4+BXb48InF+BXvwC92rDPRjPFWlUb1DmkuEexkcswbNTCTFF89PxZa43r?= =?utf-8?q?I8s/T1Vg68SgKcinSyjMWiQouI/JthrQTY6ZtXI2Eetg7vwmh5mdSM3fcAnEU7C96?= =?utf-8?q?4dzpiHM9V56ytYYIdKb0RsjauCm4FK49jkj39EF2tkmlh1VNyfVg7JIgspgy4PJrR?= =?utf-8?q?wiVxlyOQlAwjbtZJE+7Dr7dX0pZDWIDX7ckcC4bsHu5FUNUUSTfnmXeE7Kcb87cNn?= =?utf-8?q?3Ff+U69YR7I4Y586d81QurVVzZgMt7EpMl2MpQTVUiKjrSz63fv22RpFWyiQfiMAW?= =?utf-8?q?exlih3rJUUSiMKV16t1mKWMU3lr1JnObUnWkHuHXvMCfmxq8n0e3FdzlBkAYeh/T3?= =?utf-8?q?qO4HW0BJ3Qv///HSFo/Ty30L+mDmj8bJk7U8jjZB7xEch9O4QDdE9bejyiG2HqHTy?= =?utf-8?q?wil5t1b1mx5VsfADUhGZwd2caQQbURfj5dXPFl5qm259McCPWHYdYmAaLUahkewqi?= =?utf-8?q?hCnx5aCf4dVRk9YaGVCAXkxsMYte4bRXQpuOxJa+/VKY99ebsBHbHbSsfFk+Qxsz+?= =?utf-8?q?rncprPfc56wtMqNK0yoSSwK1XQR0Y6YByAx5XilJUXfQ4XOWOEJXT66LQ6wSTaCgk?= =?utf-8?q?SRAqZ+xG67OhaaUfeSRtDxUMJmHUxd076nnPU2QyBeRxFKp337hFjeF8FwiecVPgg?= =?utf-8?q?0XDp7K7t3Gh?= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:zh-cn;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PUZPR04MB6316.apcprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(366016)(1800799024)(376014)(38070700018);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?utf-8?q?JpSh7QcAkBL9T5epGUnZGIacSRS5?= =?utf-8?q?Uom8SfhLfcWsdesNW0BJczuphy1wPPvkQSuEbgQFYjKGq2rQOVhLelIFYxzeFURFC?= =?utf-8?q?Tck5GZYUmtWcHtQOleidyvI4Qn9tOhzph7k8X5KnSYLVa+XxGPU/IqY32NjXJBlCM?= =?utf-8?q?CfZ25M/oKr61BpRMuPRcKxt3hAFZv5A5jibEdgnaeDex+ZGKZuSNBroFgh/CFjTX0?= =?utf-8?q?HKGpwQ4OVRtjXk5+QmtZl1mI+FTkLEgKRX/E8sLkekg8b5TnA1ykXyUong5QGvrXN?= =?utf-8?q?wPbWCaaVNOp2aVvBY3Uh6B+tn7sd2UtWlnKh1aoXlgYsDhZPaQIjduPsEJcuQAVkS?= =?utf-8?q?un9F+CNbsOo6mS4P8pP9KBTtKp37QLwhA8bq1lFfMbVL3kxCmpUo8JO+knZ5M+qI3?= =?utf-8?q?EzJ2UEbdVN0h6PIib2Quhg/fKfA5MKb2oo/LOLCXQajIao7l3hqrDhUcervaYFakc?= =?utf-8?q?O7FF5hfXaHa79oiX9hNTQ4kKDYX9T3aMf9L/hJUcT4Yq6axdNkscOmBVnlJIBkVyS?= =?utf-8?q?uOQWdX2J3gYf+u/1DWlpD+0tmlDidFWeMiUU4eJhMamHVKeSz1E6/eV/JQb+fjBfB?= =?utf-8?q?tQ1bJeJeFzyl6u3EIKGvy44KlzNlC/oVfT7gC7k70xI/6kXsdN8FMBLEJOXRSxiUV?= =?utf-8?q?vhddFrw68KwqYOPCyp0v0CIpwxhkrXlazkhn+9Cg5aBSAz6iuu0j8ttKrE7Vxp8AI?= =?utf-8?q?t0BpY6Ncj/mp7EuJXTCzbATrs8XDBkd+rQU/V3fvgaaO2N94S4KfPJrBYa9SSGYR1?= =?utf-8?q?DuYuTzvi7loFEVovYwcUH1gJMr6YoEdMroNdTExG4AwzkrUVetrBxwqIfDStodH8P?= =?utf-8?q?mh7CD3LdxsxPh9qwjF4XCi/QUHgrGdjWjUfG0EU5jN32erc4qdbEU5kN2zkwFTerA?= =?utf-8?q?g9+vKwRtGGNdTdjfSrAkLfRxjkNny356x6tdzi6w3qzpWKq/PGb0KAZBksyDmb3U4?= =?utf-8?q?yW5XR4yFQpg8sMVIQtB/mtgHRkfBABXkKBgdpomlRwubwmCuu6TrXj0f75pkCQ8lA?= =?utf-8?q?kaA2BzFXXG6rR5IobiPyQUv5pBw9leIJx/x3GUuvreIxALn3O3WEdV4fnKuwamOA1?= =?utf-8?q?LntWCKiDb+8lUA5XfWmxe2X8y+FWNIBz+2ZFnwXLVU4Vbys90g9z6AgWoRnM3tgJU?= =?utf-8?q?dqCnFmsMfnE02FwdtzRULVlNrev7gNLlQXPpDP8TlnEPDxplsOVd+BORAPvVP6eo2?= =?utf-8?q?JX+8Y3ck0GXFJL1KX9WVYY+AZ8Uf2BHNZUge+N48jQCGhu5m/btQWpzA7QgATZfdr?= =?utf-8?q?5wjYWNKdhHxs6OwNWe/YhPbhct00t7GZ/AAvEVQIcImSUSMWOBAD0R4Qbe/6jE7VT?= =?utf-8?q?jJ5vE2hjutVCjFyRZ4jJDIsrqQMI2AGlimP+oaULEZOdm8wDaKvhYJWubP1GCYQOS?= =?utf-8?q?6zNJbjhZRn2fFAkimbhhheAZzyTeqc5mj9CRmD2VXYBs1QQ13CyW4mKy/WgOQnVYP?= =?utf-8?q?IgjM2mXd9p3FEQEDO9ECif/CRen7y+gAa1wkc7UIzLy7DCgVLclvjiAs=3D?= Precedence: bulk X-Mailing-List: linux-fsdevel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-ExternalHop-MessageData-0: 6xHGVVb9QOMZs3i/uT1LJ3UJw1zMzuzJa08sCxfCRvnqvnl3ZA48PTljTdtpgH6S++p6xFGBus4dixO46JkPqNVItFYNmccn5C62+zEkhZ6KtRxORX8OqtOA/BvT1oJHch6cMaFPY2KOveCn1Peg0/mjanVdYc/XV4Il0+LjShASWmfHlsjguADvpWntRpRi8vp5ttanUI2EbccMtpjKtIgXezPz9uz2Prn1U56a3CqkWVLV2N0rSFu8bZmN+V2/DZLUTXW4eUh65vF8KNl8HGyPjs9DaNaqSfdy/rsQUHTA8J1TNMi7hqOZgLMZGodpSYH+TY2Kcf4bGRcBQYkUcIvfC42L2vvZo//BWauQI2MyOvBAzBwjwEE5IiQuuEVwclrd2k/12FNFu9ryVPXml++nM5twn89mm5dXSMy1encz++Jn80UbKelUw2+lpdJ/Zc6pVeth0CZ8hRqvs//UikGfnVCxD0/AePMGHKUtvQwMp+0zrP74zF+k3yZmkgDCt0DoFFWA7ODDJsiyTOwLX22sDPvtPLWx7nEMUHBvPcZOFHat4zb6Xz9HxGYzbxIk4EfkQc68GNZWNGxM3MVMWmhsLxa9UV2NohSYpD5pZ4+kNH2MXD6KfqVuxlBqdcYd X-OriginatorOrg: sony.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: PUZPR04MB6316.apcprd04.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 83c0500d-46c6-49d3-2296-08dd5176cd3d X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Feb 2025 06:21:24.7221 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 66c65d8a-9158-4521-a2d8-664963db48e4 X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: ehs1Dq+GL7aq3LPeluw6ODMARdCaehyoMTnm06SN8iBDsiNAE9fSMwk+gYUZcGnM2pGjq7i5lgguVj7lNA2kCA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: KL1PR04MB6782 X-Proofpoint-ORIG-GUID: lZpTa4W9yfNMPnAL1gPiDRfq3z-CA94_ X-Proofpoint-GUID: lZpTa4W9yfNMPnAL1gPiDRfq3z-CA94_ X-Sony-Outbound-GUID: lZpTa4W9yfNMPnAL1gPiDRfq3z-CA94_ X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1057,Hydra:6.0.680,FMLib:17.12.68.34 definitions=2025-02-20_02,2025-02-20_02,2024-11-22_01 If the discard mount option is enabled, the file's clusters are discarded when the clusters are freed. Discarding clusters one by one will significantly reduce performance. Poor performance may cause soft lockup when lots of clusters are freed. This commit improves performance by discarding contiguous clusters in batches. Measure the performance by: # truncate -s 80G /mnt/file # time rm /mnt/file Without this commit: real 4m46.183s user 0m0.000s sys 0m12.863s With this commit: real 0m1.661s user 0m0.000s sys 0m0.017s Signed-off-by: Yuezhang Mo --- fs/exfat/balloc.c | 14 -------------- fs/exfat/fatent.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/fs/exfat/balloc.c b/fs/exfat/balloc.c index 9ff825f1502d..cc01556c9d9b 100644 --- a/fs/exfat/balloc.c +++ b/fs/exfat/balloc.c @@ -147,7 +147,6 @@ int exfat_clear_bitmap(struct inode *inode, unsigned int clu, bool sync) unsigned int ent_idx; struct super_block *sb = inode->i_sb; struct exfat_sb_info *sbi = EXFAT_SB(sb); - struct exfat_mount_options *opts = &sbi->options; if (!is_valid_cluster(sbi, clu)) return -EIO; @@ -163,19 +162,6 @@ int exfat_clear_bitmap(struct inode *inode, unsigned int clu, bool sync) exfat_update_bh(sbi->vol_amap[i], sync); - if (opts->discard) { - int ret_discard; - - ret_discard = sb_issue_discard(sb, - exfat_cluster_to_sector(sbi, clu), - (1 << sbi->sect_per_clus_bits), GFP_NOFS, 0); - - if (ret_discard == -EOPNOTSUPP) { - exfat_err(sb, "discard not supported by device, disabling"); - opts->discard = 0; - } - } - return 0; } diff --git a/fs/exfat/fatent.c b/fs/exfat/fatent.c index 6f3651c6ca91..b9473a69f104 100644 --- a/fs/exfat/fatent.c +++ b/fs/exfat/fatent.c @@ -144,6 +144,20 @@ int exfat_chain_cont_cluster(struct super_block *sb, unsigned int chain, return 0; } +static inline void exfat_discard_cluster(struct super_block *sb, + unsigned int clu, unsigned int num_clusters) +{ + int ret; + struct exfat_sb_info *sbi = EXFAT_SB(sb); + + ret = sb_issue_discard(sb, exfat_cluster_to_sector(sbi, clu), + sbi->sect_per_clus * num_clusters, GFP_NOFS, 0); + if (ret == -EOPNOTSUPP) { + exfat_err(sb, "discard not supported by device, disabling"); + sbi->options.discard = 0; + } +} + /* This function must be called with bitmap_lock held */ static int __exfat_free_cluster(struct inode *inode, struct exfat_chain *p_chain) { @@ -196,7 +210,12 @@ static int __exfat_free_cluster(struct inode *inode, struct exfat_chain *p_chain clu++; num_clusters++; } while (num_clusters < p_chain->size); + + if (sbi->options.discard) + exfat_discard_cluster(sb, p_chain->dir, p_chain->size); } else { + unsigned int nr_clu = 1; + do { bool sync = false; unsigned int n_clu = clu; @@ -215,6 +234,16 @@ static int __exfat_free_cluster(struct inode *inode, struct exfat_chain *p_chain if (exfat_clear_bitmap(inode, clu, (sync && IS_DIRSYNC(inode)))) break; + + if (sbi->options.discard) { + if (n_clu == clu + 1) + nr_clu++; + else { + exfat_discard_cluster(sb, clu - nr_clu + 1, nr_clu); + nr_clu = 1; + } + } + clu = n_clu; num_clusters++;