From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pj1-f46.google.com (mail-pj1-f46.google.com [209.85.216.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E202938D688 for ; Wed, 15 Jul 2026 03:35:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.46 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784086555; cv=none; b=Jb5IYf15blZ2wngb8uNKRitA0yoeWL55TAiSkF51PImTOsDfTelAgGtimCvwZFGp5JIAPFuztLNqCXkK/6q8Ta25rryB569uMcIWnXIEG26IRgT1dg7wEwKGDhkv9ouGRgx9YMciUMpzcW3GcKwh+MqYST6WIUa75fsmzCFXABc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784086555; c=relaxed/simple; bh=y8oeVdkrPSaCxMgvhmqr3ItAyR9+rT2BNaX3IZBK0cc=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=PeGb7vK9xXQFV4FZgW4vLVwklYotODR0veRL79uIUGyUBkiOcRr9W4qynwr0BTDUf8yJ5mcv6t1gdWeVt++V26fke9CHVRe2rn0Zm6WrlEMlOeBV91H6pTueg+dqHADjeMnzI7CdVD7OV0BLIakux06ri7FyVuWl26fMydoTNB0= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=QvApA4QU; arc=none smtp.client-ip=209.85.216.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="QvApA4QU" Received: by mail-pj1-f46.google.com with SMTP id 98e67ed59e1d1-38dc69c74b8so3249467a91.0 for ; Tue, 14 Jul 2026 20:35:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784086536; x=1784691336; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to:content-type; bh=MooPe2m60nY/UfQ0cAm3E3HG16yigXKlWgLFH1SifDA=; b=QvApA4QUSc265vDnrQ/QSWwoEJhgLoKSiaXV42vLxbdjWc1imRcsaSHeKCngcI3+NF 8E2trCSpeTnYJ3mykKZvq0O9Oz6VtQYqcRXAaQvglSVhvfffCceBDgV/dzdNHr3n3bk4 wuCF3QkJLMCGSO+rXGv3fodV3mNtM82RPaoN+SprN1AWx8lyOIIhZTxvJYtd2r3hheua geVpCqBdXcHvYQbc/4d5bhd74GsOMM0W26o5y4XHUbocb9vYFryBnICamv3IqTMaQbr+ n1NtfqVKjkC+UFXtHSMcaBNJg4Ps73MzXhwV/wwg1JTESRMauyV6H8A5lQ/m+mlFbHPJ aKLQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784086536; x=1784691336; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to:content-type; bh=MooPe2m60nY/UfQ0cAm3E3HG16yigXKlWgLFH1SifDA=; b=fZrzo82snmR3G7batHKv3fCnpSkWKEcxawugmQHi8wshrMrpBRb8GlV5oRg6qLwoKB SqoNVl2liqxujM5FLzCG4NWAg/A7reZ6DgRXIxEwSRAsec7XmdyzgI9oM8zjVfnd22Wk PcpQ0u7emVGpzjWu7L/5pRnHep507O4yIumIUJdj/32MKB8vE9Dpk2l8Qc8GrPuS6ANk s2UDK0n8l81Zln7A65C7VvHvIbKmumHXwd218bX/E40zgTgiH/39omkkldWotZ+n0QrH Wjqrr3qaOCvd+ON7JSEChiOaivkXRRiOpZ0/GLnWuCA1xHdOMv2K639w3yhVn4RQeIU4 gTjA== X-Forwarded-Encrypted: i=1; AHgh+Rq8vARutFBSYeCcBUYS0XyDj9ND5Zyu4knvNBDBYZlzJ1At+QJ2Phoy8LcGXdA7I2rqiOJ4Q36f6bm7nrc=@vger.kernel.org X-Gm-Message-State: AOJu0Ywfrhk/ogY/CQP3E1ukhKuvbPCE67UE7rODxUSiBorkhmy11ENx yIVh+TeWGMaiHp2/oArtLhDddZ7FqSFQVu8fJa31P4mY6IhjzvxEXUNP X-Gm-Gg: AfdE7ckAO72ZcD3DWHpyVj5GsTmIzq+z/DYBnBJfANYFIHQuDNfMt4EvDk3R5gdgkO6 /V8veuaqQ4rWH6xUABRbHxiPguXWhfqb1jC6UWsjmd8B6iz5U4ZAflArjDE2qqLFv/kPo9cpBbC bphlIu53Ai/yUatQRKkFokSQgI9zafRyfJLxeaSSac32cW7F47RAwvkOOQuqmywf1onY1oFYhAX /AGfB+UAMRaXRKNw8b7uDofs22Jd+59H1kSI7UW9ZfaLgtBaMNLk22pN34ToW8Ui29z5EGziRJ/ l7+xVWlycdddctEmG8ZE/KH5tLVbghyILqiqwmuiA5KTrmqtDNyS1lYv3qOkQsO/EEc4FOl8Szg 3XIRfr72TCYW5T24Q+67IZyCjjRMMFikeQOj9TrEaouQOKcqYFxJHG/9qXS2+zI/R/enEtLVGvr /YVcRYh5nBqmXYDDKC90Z6KUxkD/nysjcpt8I3n+S6IDAlzzdjmiKxUpA3QR79Y+Z778YhF0OMb g4RZ6mPe4Z0KMlkU1XASenugU6JLVp9CaLUpL0/VgGUh64fWPIfhu5D0/fS5jXD9HowjFtjE2Qh ijmTLmjV6gujErtk28kzFGf/1A== X-Received: by 2002:a17:90b:55cc:b0:381:22d6:f7a3 with SMTP id 98e67ed59e1d1-38e2a030362mr1122604a91.18.1784086535924; Tue, 14 Jul 2026 20:35:35 -0700 (PDT) Received: from cs-1047136853211-default.asia-southeast1-a.c.z168d0f9edf9bc766-tp.internal (19.141.142.34.bc.googleusercontent.com. [34.142.141.19]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-38e172cba1fsm2303382a91.5.2026.07.14.20.35.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jul 2026 20:35:35 -0700 (PDT) From: Aditya Prakash Srivastava To: Gao Xiang , Chao Yu Cc: Yue Hu , Jeffle Xu , Sandeep Dhavale , Hongbo Li , Chunhai Guo , linux-erofs@lists.ozlabs.org, linux-kernel@vger.kernel.org, Aditya Prakash Srivastava Subject: [PATCH] erofs: modernize device IDR to XArray Date: Wed, 15 Jul 2026 03:35:07 +0000 Message-ID: <20260715033507.1666-1-aditya.ansh182@gmail.com> X-Mailer: git-send-email 2.43.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Currently, EROFS maintains a list of extra devices using a legacy IDR structure (`sbi->devs->tree`). Modernize this to use a standard, more efficient XArray instead. This migration simplifies device management, removes legacy boilerplate, and aligns EROFS device tracking with modern Linux kernel storage subsystem conventions: 1. Convert `sbi->devs->tree` from a legacy IDR to an XArray initialized with `XA_FLAGS_ALLOC` flags. 2. Use `xa_alloc()` to safely register devices under `xa_limit_32b` limits. 3. Use `xa_load()` for direct, fast lookups. 4. Replace custom IDR traversal wrappers with modern `xa_for_each()` iterators. 5. Replace custom IDR releasing callback helpers with a clean `xa_for_each()` loop and clean up the tree with `xa_destroy()`. Signed-off-by: Aditya Prakash Srivastava --- fs/erofs/data.c | 6 +++--- fs/erofs/internal.h | 2 +- fs/erofs/super.c | 43 +++++++++++++++++++++++-------------------- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/fs/erofs/data.c b/fs/erofs/data.c index 9aa48c8d67d1..34a1a7d71559 100644 --- a/fs/erofs/data.c +++ b/fs/erofs/data.c @@ -211,13 +211,13 @@ int erofs_map_dev(struct super_block *sb, struct erofs_map_dev *map) struct erofs_dev_context *devs = EROFS_SB(sb)->devs; struct erofs_device_info *dif; erofs_off_t startoff; - int id; + unsigned long id; erofs_fill_from_devinfo(map, sb, &EROFS_SB(sb)->dif0); map->m_bdev = sb->s_bdev; /* use s_bdev for the primary device */ if (map->m_deviceid) { down_read(&devs->rwsem); - dif = idr_find(&devs->tree, map->m_deviceid - 1); + dif = xa_load(&devs->tree, map->m_deviceid - 1); if (!dif) { up_read(&devs->rwsem); return -ENODEV; @@ -231,7 +231,7 @@ int erofs_map_dev(struct super_block *sb, struct erofs_map_dev *map) up_read(&devs->rwsem); } else if (devs->extra_devices && !devs->flatdev) { down_read(&devs->rwsem); - idr_for_each_entry(&devs->tree, dif, id) { + xa_for_each(&devs->tree, id, dif) { if (!dif->uniaddr) continue; diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h index 580f8d9f14e7..f6126a7bfbc7 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -64,7 +64,7 @@ struct erofs_mount_opts { }; struct erofs_dev_context { - struct idr tree; + struct xarray tree; struct rw_semaphore rwsem; unsigned int extra_devices; diff --git a/fs/erofs/super.c b/fs/erofs/super.c index 86fa5c6a0c70..08e6a9c57d59 100644 --- a/fs/erofs/super.c +++ b/fs/erofs/super.c @@ -188,7 +188,8 @@ static int erofs_scan_devices(struct super_block *sb, erofs_off_t pos; struct erofs_buf buf = __EROFS_BUF_INITIALIZER; struct erofs_device_info *dif; - int id, err = 0; + int err = 0; + unsigned long id; sbi->total_blocks = sbi->dif0.blocks; if (!erofs_sb_has_device_table(sbi)) @@ -217,20 +218,22 @@ static int erofs_scan_devices(struct super_block *sb, pos = le16_to_cpu(dsb->devt_slotoff) * EROFS_DEVT_SLOT_SIZE; down_read(&sbi->devs->rwsem); if (sbi->devs->extra_devices) { - idr_for_each_entry(&sbi->devs->tree, dif, id) { + xa_for_each(&sbi->devs->tree, id, dif) { err = erofs_init_device(&buf, sb, dif, &pos); if (err) break; } } else { for (id = 0; id < ondisk_extradevs; id++) { + u32 id_val; + dif = kzalloc_obj(*dif); if (!dif) { err = -ENOMEM; break; } - err = idr_alloc(&sbi->devs->tree, dif, 0, 0, GFP_KERNEL); + err = xa_alloc(&sbi->devs->tree, &id_val, dif, xa_limit_32b, GFP_KERNEL); if (err < 0) { kfree(dif); break; @@ -480,7 +483,9 @@ static int erofs_fc_parse_param(struct fs_context *fc, if (!erofs_fc_set_dax_mode(fc, result.uint_32)) return -EINVAL; break; - case Opt_device: + case Opt_device: { + u32 id; + dif = kzalloc_obj(*dif); if (!dif) return -ENOMEM; @@ -490,7 +495,7 @@ static int erofs_fc_parse_param(struct fs_context *fc, return -ENOMEM; } down_write(&sbi->devs->rwsem); - ret = idr_alloc(&sbi->devs->tree, dif, 0, 0, GFP_KERNEL); + ret = xa_alloc(&sbi->devs->tree, &id, dif, xa_limit_32b, GFP_KERNEL); up_write(&sbi->devs->rwsem); if (ret < 0) { kfree(dif->path); @@ -499,6 +504,7 @@ static int erofs_fc_parse_param(struct fs_context *fc, } ++sbi->devs->extra_devices; break; + } case Opt_domain_id: if (!IS_ENABLED(CONFIG_EROFS_FS_PAGE_CACHE_SHARE)) { errorfc(fc, "%s option not supported", erofs_fs_parameters[opt].name); @@ -797,24 +803,21 @@ static int erofs_fc_reconfigure(struct fs_context *fc) return 0; } -static int erofs_release_device_info(int id, void *ptr, void *data) -{ - struct erofs_device_info *dif = ptr; - - fs_put_dax(dif->dax_dev, NULL); - if (dif->file) - fput(dif->file); - kfree(dif->path); - kfree(dif); - return 0; -} - static void erofs_free_dev_context(struct erofs_dev_context *devs) { + struct erofs_device_info *dif; + unsigned long index; + if (!devs) return; - idr_for_each(&devs->tree, &erofs_release_device_info, NULL); - idr_destroy(&devs->tree); + xa_for_each(&devs->tree, index, dif) { + fs_put_dax(dif->dax_dev, NULL); + if (dif->file) + fput(dif->file); + kfree(dif->path); + kfree(dif); + } + xa_destroy(&devs->tree); kfree(devs); } @@ -858,7 +861,7 @@ static int erofs_init_fs_context(struct fs_context *fc) } fc->s_fs_info = sbi; - idr_init(&sbi->devs->tree); + xa_init_flags(&sbi->devs->tree, XA_FLAGS_ALLOC); init_rwsem(&sbi->devs->rwsem); erofs_default_options(sbi); fc->ops = &erofs_context_ops; -- 2.47.3