Skip to content
Gerrit Dashboard
updated 2026-11-05 09:30:43 UTC

Zhenyu Xu bobijam · review.whamcloud.com

Needs your action

1 new · 42 longstanding
57083 master J !B ✓T ✗2R -1/2−
LU-18466 lod: make sure layout gen changed under lock
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase 1 unresolved L +231 −136
4d
needs rebase — checkpatch: cannot be cherry-picked
enforced failed: review-dne-part-7, review-dne-zfs-part-7
1 thread(s) waiting on others
janitor run: 2 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-part-7 RHEL 9.5 / x86_64 ran 5 tests. 1 tests failed: sanity-pcc. session
review-dne-zfs-part-7 RHEL 8.10 / x86_64 ran 5 tests. 1 tests failed: sanity-scrub. session
build #116939 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Lai Siyao, Andreas Dilger, Alex Zhuravlev, Oleg Drokin
patchsets:
+23 earlier PS1 11-20 PS2 11-21 PS3 11-28 PS4 11-28 PS5 11-29 PS6 11-30 PS7 12-05 PS8 12-18 PS9 01-11 PS10 01-11 PS11 03-12 Andreas Dilger PS12 03-13 PS13 03-17 PS14 03-28 PS15 03-29 PS16 04-03 PS17 04-03 PS18 04-09 PS19 04-10 PS20 04-23 PS21 05-09 PS22 05-21 PS23 06-17
PS24 06-30 PS25 07-03 PS26 09-19 PS27 09-19 Janitor Bot PS28 09-25 Janitor Bot
threads: 0 need your reply · 1 waiting on others · 0 own notes · 0 bot
owner Zhenyu Xu · uploader Janitor Bot · PS28 uploaded 405d ago · NEW · open in Gerrit ↗
commit message
LU-18466 lod: make sure layout gen changed under lock

In transaction declaration phase, LOD layer should not change
lod_layout_gen as there is no object lock protecting it so that
its layout gen can be changed by another transaction.

This patch adds lti_layout_gen_save/lti_layout_gen_dst array to save
the layout gen before/after values, and during the transaction
execution phase with the lod object been protected with
lod_write_lock(), we would check the lod_object's layout gen, if
it keeps its value equals to lti_layout_gen_save, we'd update it to
lti_layout_gen_dst of the lod_object; if it has been changed by
others, we'd return -EAGAIN, so that MDD can retry the transaction.

This patch also fixes a glitch in mdd_xattr_set(), it needs to check
the return code for retry.

Fixes: d5ab62af24 ("LU-17048 mdd: protect layout change in MDD layer")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I6e7edabaac8f1d43d799b5ab3e2ec527d152fa55
▶

Longstanding (signal older than a week)

(42)
69675 master J –B ✓T ✗1R 0/2
LU-19344 llite: report EOF for read racing local append
mine enforced failed: review-dne-selinux-ssk-part-2
pw_haltpw_shepherd 16 unresolved M +117 −0
1d
enforced failed: review-dne-selinux-ssk-part-2
12 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
failed enforced testplatformdetail
review-dne-selinux-ssk-part-2 failed 4× RHEL 8.10 / x86_64 ran 7 tests. 1 tests failed: sanity-sec. session
build #134364 SUCCESS · tests all Maloo sessions
no vote yet: Alexey Lyashkov, Vitaly Fertman
patchsets: PS1 10-14 PS2 10-23 Alexey Lyashkov PS3 10-23 Alexey Lyashkov PS4 10-23 Alexey Lyashkov
threads: 12 need your reply · 0 waiting on others · 4 own notes · 0 bot
reply PS1 2026-10-16 16:02 Gerrit AI review for Lustre COMMIT_MSG:36 — (suggestion) LU-19344 is about the cached-read cost of file_read_confine_iter(), and 240cad9a0a quoted a 20-30% regression on 8k cached read
Gerrit AI review for Lustre PS1 · 2026-10-16 16:02
(suggestion) LU-19344 is about the cached-read cost of file_read_confine_iter(), and 240cad9a0a quoted a 20-30% regression on 8k cached reads. Since this patch brings the confinement back, and also moves cl_env_get() back in front of the cache read path, could the message include before/after numbers for that workload?
reply PS1 2026-10-16 16:02 Gerrit AI review for Lustre COMMIT_MSG:43 — (minor) This list of what the CIT_MISC cl_io_init()/cl_io_fini() pair adds seems incomplete. For a CIT_MISC io without ci_ignore_layout, lov
Gerrit AI review for Lustre PS1 · 2026-10-16 16:02
(minor) This list of what the CIT_MISC cl_io_init()/cl_io_fini() pair adds seems incomplete. For a CIT_MISC io without ci_ignore_layout, lov_io_init_composite()/lov_io_init_empty() also do atomic_inc(&lov->lo_active_ios), and lov_io_fini() drops it. That pin is what keeps lov_conf_set() from running lov_layout_change() while the attributes are being read (see the inline comment in file_read_confine_iter()). Could the message mention this?
reply PS1 2026-10-16 16:02 Gerrit AI review for Lustre COMMIT_MSG:56 — (minor) vvp_env_new_attr() already does memset(attr, 0, sizeof(*attr)) on the thread's shared cl_attr, so cat_kms is already 0 before the lo
Gerrit AI review for Lustre PS1 · 2026-10-16 16:02
(minor) vvp_env_new_attr() already does memset(attr, 0, sizeof(*attr)) on the thread's shared cl_attr, so cat_kms is already 0 before the lookup. This rationale doesn't seem to hold. If the patch is refreshed, the bullet (and the explicit assignment) could be dropped.
reply PS4 2026-10-26 13:27 Gerrit AI review for Lustre COMMIT_MSG:16 — (minor) "bumped around a write by this client that publishes a larger size" doesn't seem to cover every such write. O_DIRECT writes never qu
Gerrit AI review for Lustre PS4 · 2026-10-26 13:27
(minor) "bumped around a write by this client that publishes a larger size" doesn't seem to cover every such write. O_DIRECT writes never queue pages, so vvp_io_write_commit() returns at `npages == 0` before either bump. Large buffered writes that do_file_write_iter() switches to DIO via ll_hybrid_bio_dio_switch_check() take the same path. So whether a racing reader at EOF gets EOF or the appended data depends on the write size. fallocate() and truncate-up don't bump either. If that's intended, could the message say which writes are covered?

The counter also moves on every buffered commit, including overwrites that don't change the size, not only on writes that publish a larger size.
reply PS4 2026-10-26 13:27 Gerrit AI review for Lustre COMMIT_MSG:32 — (minor) If this is a fix, the behaviour it restores was removed by 240cad9a0a, which also dropped the original 251b with the rationale that
Gerrit AI review for Lustre PS4 · 2026-10-26 13:27
(minor) If this is a fix, the behaviour it restores was removed by 240cad9a0a, which also dropped the original 251b with the rationale that "The read after the write should never return an end-of-file (EOF)". Should the message carry

    Fixes: 240cad9a0a ("LU-19344 llite: set read size correctly")

and explain why that rationale no longer holds?
reply PS1 2026-10-16 16:02 Gerrit AI review for Lustre file.c:2537 — (minor) attr comes from vvp_env_new_attr(), which already zeroes the whole struct, so this assignment is redundant.
Gerrit AI review for Lustre PS1 · 2026-10-16 16:02
(minor) attr comes from vvp_env_new_attr(), which already zeroes the whole struct, so this assignment is redundant.
reply PS1 2026-10-16 16:02 Gerrit AI review for Lustre file.c:2539 — (defect) Without the CIT_MISC io, what keeps the layout stable while this runs? lov_attr_get() uses LOV_2DISPATCH_NOLOCK and says "Layout is
Gerrit AI review for Lustre PS1 · 2026-10-16 16:02
(defect) Without the CIT_MISC io, what keeps the layout stable while this runs? lov_attr_get() uses LOV_2DISPATCH_NOLOCK and says "Layout is protected from changing by ongoing IO". Nothing on this path holds lo_type_guard or raises lo_active_ios, and the ll_layout_version_get() check above is only a snapshot.

A possible race on one client:

    T1: read() -> file_read_confine_iter() -> cl_object_attr_get()
        -> lov_attr_get_composite() walking lo_entries / lo_lsm
    T2: layout lock revoked (e.g. PFL instantiation from another node),
        then stat/write -> ll_layout_refresh() -> lov_conf_set():
        lo_active_ios == 0 -> lov_layout_change()
        -> lov_fini_composite() frees lo_entries and lo_lsm

lov_layout_change() doesn't take coh_attr_guard, so the spinlock held here doesn't exclude it either. Some existing callers have the same pattern (ll_readahead_handle_work(), ll_merge_attr() on the append path), but the old file_read_confine_iter() was pinned by its CIT_MISC io. This patch puts the unpinned lookup on every read() syscall. Would taking lov_conf_freeze()-style protection, or a lightweight lo_active_ios reference, avoid the race without the full cl_io_init() cost?
note PS4 2026-11-04 03:37 Zhenyu Xu file.c:2347 — The new size becomes visible to a reader here, need to bump the lli_size_gen here. With the ll_file_io_generic() bump in place, the secon
Zhenyu Xu PS4 · 2026-11-04 03:37
The new size becomes visible to a reader here, need to bump the lli_size_gen here.  With the  ll_file_io_generic()  bump in place, the second bump in  vvp_io_write_commit()  (after  cl_io_commit_async() ) becomes redundant — the window now closes at  ll_merge_attr() .
reply PS4 2026-10-26 13:27 Gerrit AI review for Lustre file.c:2662 — (defect) Can this report EOF for data that was in the file before the read started?
Gerrit AI review for Lustre PS4 · 2026-10-26 13:27
(defect) Can this report EOF for data that was in the file before the read started?

`orig_size` is the client's cached i_size, not EOF. Since 240cad9a0a, vvp_prep_size() does `i_size_write(inode, kms)`, and kms can be lower than the real size. lli_size_gen also moves on any buffered commit on this client, including an overwrite that doesn't extend the file. Example:

    node B: appends, file grows 1M -> 2M
    node A, P1: cat reaches offset 1M (i_size == kms == 1M)
                orig_ki_pos >= orig_size, gen == G
                vvp_prep_size(): pos > kms -> glimpse -> 2M
                copies 1M of node B's data
    node A, P2: overwrites offset 0 -> vvp_io_write_commit() -> gen G+2
    node A, P1: gen changed -> revert, return 0

cat stops at 1M even though node B's data was there before the read was issued. That contradicts the comment above, which says "A larger size discovered from another node during the read ... is returned normally" (commit message lines 30-31 say the same). Would it be safer to take the EOF baseline from a validated size (a glimpse, or kms under the lock), and to bump the counter only when a commit actually raises kms?
note PS4 2026-11-04 03:51 Zhenyu Xu file.c:2668 — iov_iter_revert(to, result) assumes result is exactly the amount the iter was advanced. For the fast-read path that holds; for ll_file_io
Zhenyu Xu PS4 · 2026-11-04 03:51
iov_iter_revert(to, result)  assumes  result  is exactly the amount the iter was advanced. For the fast-read path that holds; for ll_file_io_generic()  (which can restart and internally rewind/reexpand the iter) it's less obvious. The code this replaced used the more forgiving  iov_iter_truncate(to, 0) , which doesn't need to know the consumed count.
reply PS4 2026-10-26 13:27 Gerrit AI review for Lustre file.c:2742 — (minor) This is bumped only before the write, but the tiny-write size reaches the inode after __generic_file_write_iter(), through ll_merge_
Gerrit AI review for Lustre PS4 · 2026-10-26 13:27
(minor) This is bumped only before the write, but the tiny-write size reaches the inode after __generic_file_write_iter(), through ll_merge_attr() below. A reader whose snapshot falls between this increment and ll_merge_attr() sees the new generation with the old i_size, and can then return the appended bytes. vvp_io_write_commit() bumps after the commit to avoid exactly this. Should there be a matching increment after ll_merge_attr() here?
reply PS4 2026-10-26 13:27 Gerrit AI review for Lustre llite_internal.h:256 — (minor) If the patch is refreshed: "similar as i_version" reads oddly ("similar to i_version"?). Also, the counter is bumped on every buffer
Gerrit AI review for Lustre PS4 · 2026-10-26 13:27
(minor) If the patch is refreshed: "similar as i_version" reads oddly ("similar to i_version"?). Also, the counter is bumped on every buffered write commit and tiny write, not only on writes that make a larger size visible, so "Bumped around a write ... that makes a larger file size visible" overstates it.
tags: pw_halt pw_shepherd
owner Zhenyu Xu · uploader Alexey Lyashkov · PS4 uploaded 13d ago · NEW · open in Gerrit ↗
commit message
LU-19344 llite: report EOF for read racing local append

A read issued at EOF must report EOF even if the file grows while it
is in flight.  i_size cannot express this: osc_page_touch_at() raises
kms and the inode size as soon as the pages enter the cache, so a
paused reader resumes with the appended data already visible.  A
glimpse cannot help either, since the client holding the extent lock
owns the kms.

Add a per inode counter, lli_size_gen, bumped around a write by this
client that publishes a larger size: in vvp_io_write_commit() on both
sides of cl_io_commit_async(), which raises kms page by page, and in
ll_do_tiny_write(), which can extend the file inside an already dirty
page.  do_file_read_iter() snapshots i_size and the counter on entry
and rechecks at the end; if the read started at or beyond the
snapshotted EOF and the counter moved, ki_pos is restored, the iter
reverted and 0 returned.

The counter is advisory.  It is not ordered against the size store and
is per inode rather than per range, so it can move for an unrelated
local write and a reader can still miss a write committing in the
window between the two bumps.

The counter moves only for local writes, so a size learned from
another node is still returned normally.

Signed-off-by: Alexey Lyashkov <alexey.lyashkov@hpe.com>
Change-Id: I2f30aa9317dfe6e3f57d3b4a21537217921d9a82
50622 master J !B ✓T ✗9R +1/2
LU-15834 lfs: mirror extend take current OSTs into account
mine enforced failed: review-dne-part-4, review-dne-subtest-change, review-dne-zfs-part-4, review-dne-zfs-part-5, review-dne-zfs-subtest-change, review-ldiskfs, review-ldiskfs-ubuntu
pw_shepherd 2 unresolved L +538 −63
1d
enforced failed: review-dne-part-4, review-dne-subtest-change, review-dne-zfs-part-4, review-dne-zfs-part-5, review-dne-zfs-subtest-change, review-ldiskfs, review-ldiskfs-ubuntu
2 unresolved thread(s) await your reply — last from Ronnie Sahlberg
janitor run: 2 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-part-4 RHEL 8.10 / x86_64 ran 9 tests. 1 tests failed: sanity-quota. session
review-dne-part-4 RHEL 9.4 / x86_64 ran 9 tests. 1 tests failed: sanity-quota. session
review-dne-subtest-change RHEL 8.10 / x86_64 ran 3 tests. 1 tests failed: sanity-flr. session
review-dne-zfs-part-4 RHEL 8.10 / x86_64 ran 9 tests. 1 tests failed: sanity-flr. session
review-dne-zfs-part-5 RHEL 8.10 / x86_64 ran 6 tests. 2 tests failed: sanityn, lustre-rsync-test. session
review-dne-zfs-subtest-change RHEL 8.10 / x86_64 ran 3 tests. 1 tests failed: sanity-flr. session
review-ldiskfs RHEL 9.4 / x86_64 ran 5 tests. 1 tests failed: sanity-lnet. session
review-ldiskfs RHEL 8.10 / x86_64, SLES 15.5 / x86_64 ran 5 tests. 1 tests failed: sanity-lnet. session
review-ldiskfs-ubuntu RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 ran 6 tests. 1 tests failed: sanity-sec. session
4 optional test failure(s) — informational
build #112602 SUCCESS · tests all Maloo sessions
reviews: Ronnie Sahlberg +1 2026-04-09 02:01
no vote yet: Qian Yingjin, Andreas Dilger, Alex Zhuravlev
patchsets:
+16 earlier PS1 04-13 PS2 06-02 PS3 06-02 PS4 05-20 PS5 06-26 PS6 06-26 PS7 10-10 PS8 10-11 PS9 10-11 PS10 10-11 PS11 10-25 PS12 10-25 PS13 10-25 PS14 10-25 PS15 10-28 PS16 10-28
PS17 11-01 PS18 12-18 PS19 02-10 PS20 03-25 PS21 04-17
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS21 2026-04-08 22:55 Ronnie Sahlberg lod_qos.c:540 — These changes are unrelated to the intent of the commit and should probably be part of a separate "cleanup" patch.
Ronnie Sahlberg PS21 · 2026-04-08 22:55
These changes are unrelated to the intent of the commit and should probably be part of a separate "cleanup" patch.
This and all other instances of the same change.
reply PS21 2026-04-09 02:01 Ronnie Sahlberg liblustreapi_layout.c:914 — Obj_count is only modified for the call to compute blob_size so this conditional to decrement it back to the original value should be move
Ronnie Sahlberg PS21 · 2026-04-09 02:01
Obj_count is only modified for the call to compute blob_size   so this conditional to decrement it back to the original value should be moved to to line 857   just after blob_size = ...
So the increment and decrement are close together.

Even better would be to skip the conditional increment/decrement and do : 

blob_size = lov_user_md_size(obj_count + (comp->llc_flags & LCME_FL_FOR_MERGE) ? 1 : 0, magic);

and thus avoid temporarily modifying obj_count.
tags: pw_shepherd
owner Zhenyu Xu · uploader Zhenyu Xu · PS21 uploaded 567d ago · NEW · open in Gerrit ↗
commit message
LU-15834 lfs: mirror extend take current OSTs into account

Makes mirror extend try to allocate different OSTs from existing
mirrors.

When extending a mirror, the source file FID is stored in the victim
layout's first component's object l_ost_oi::oi_fid, also set a
special flag LCME_FL_FOR_MERGE in the component.

As LOD parses this merge victim layout, it extracts the source file
FID in lod_object::ldo_merge_src_fid, and as LOD is trying to
allocate OST objects, it would try to avoid those OST indices already
used in the overlapping components from the source file.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I8bcb0411ed64447c34fa8c1443c45a3888d73842
58291 master J –B ✓T ✗7R -1/2−
LU-18771 flr: allow merge mirrored layout
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase pw_smallfix 5 unresolved L +196 −72
1d
needs rebase — checkpatch: cannot be cherry-picked
enforced failed: custom-1001, review-dne-part-4, review-dne-zfs-part-4, review-dne-zfs-part-5, review-zfs
5 unresolved thread(s) await your reply — last from patrick bot
failed enforced testplatformdetail
custom-1001 RHEL 9.7 / x86_64 ran 4 tests. 1 tests failed: sanity-flr. session
review-dne-part-4 RHEL 9.7 / x86_64 ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. session
review-dne-part-4 RHEL 10.1 / x86_64 ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. session
review-dne-zfs-part-4 RHEL 9.8 / x86_64 ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. session
review-dne-zfs-part-4 RHEL 10.1 / x86_64 ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. session
review-dne-zfs-part-5 RHEL 9.7 / x86_64 ran 5 tests. 1 tests failed: sanityn. session
review-zfs RHEL 8.10 / x86_64 ran 8 tests. 2 tests failed: sanity-flr, sanity-quota. session
build #134321 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets:
+8 earlier PS1 03-04 PS2 03-05 PS3 03-06 PS4 03-25 PS5 04-17 PS6 05-05 Andreas Dilger PS7 06-01 PS8 08-12
PS9 10-14 patrick bot PS10 10-14 patrick bot PS11 10-21 patrick bot PS12 10-21 patrick bot PS13 10-23 patrick bot
threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS10 2026-10-14 04:31 patrick bot lod_qos.c:806 — Patrick-Bot: Not changed. Whether the extra retry should apply only to the first component of mirrored layouts, or move to its own change, i
Gerrit AI review for Lustre PS8 · 2026-08-13 08:50
(minor) The new clause fires for the first component of every layout, not just mirrors - a plain or default-striped file also has `llc_extent.e_start == 0`.

The practical effect shows up with default striping (LOD_USES_DEFAULT_STRIPE), where stripe_count_min is 3/4 of stripe_count: the allocator now escalates to speed 1 and 2 to fill the remaining quarter. At speed 2 lod_check_and_reserve_ost() stops honouring OS_STATFS_DEGRADED and stops calling lod_should_avoid_ost(), so first components can land on degraded OSTs and on OSTs already used by a conflicting mirror component.

For an FLR patch that last one seems to work against the goal. Was the intent to limit this to mirrored layouts?
patrick bot PS10 · 2026-10-14 04:31
Patrick-Bot: Not changed. Whether the extra retry should apply only to the first component of mirrored layouts, or move to its own change, is a design decision for the patch owner.
reply PS10 2026-10-14 04:31 patrick bot lfs.c:2286 — Patrick-Bot: Done in patchset 10: a failure to get the mirror count now fails the extend. Leaving this thread open for a related problem in
Gerrit AI review for Lustre PS8 · 2026-08-13 08:50
(minor) The return value is not checked, and `rc` is overwritten by the migrate_open_files() call below. If llapi_layout_mirror_count_get() ever fails, `mirror_cnt` stays 0 and the multi-mirror handling is silently skipped.
patrick bot PS10 · 2026-10-14 04:31
Patrick-Bot: Done in patchset 10: a failure to get the mirror count now fails the extend. Leaving this thread open for a related problem in the same hunk. Clearing resync for a multi-mirror merge makes lfs set LL_LEASE_ALLOW_STALE, and since LU-18746 llite refuses that with EOPNOTSUPP unless the client has llite_enable_flr_ec=1. That parameter defaults to 0. So every extend that adds more than one mirror fails on a default client, as in sanity-flr 0d, 0e, 0f, 0m and 44d on rocky9 ldiskfs. With llite_enable_flr_ec=1 those tests pass. test-framework does not set it either: it sets MODOPTS_LLITE, but load_module reads MODOPTS_LUSTRE for the llite module. How the merge should mark the new mirrors stale without needing FLR EC is for the patch owner to decide.
reply PS10 2026-10-14 04:31 patrick bot lfs.c:2453 — Patrick-Bot: Not changed. Rejecting a mixed list would break sanity-flr test_0d, which runs 'lfs mirror extend -N -S 4M -N -f $tf-2 $tf-1' a
Gerrit AI review for Lustre PS8 · 2026-08-13 08:50
(minor) This picks the whole strategy from the first list entry only. Previously each entry was dispatched on its own `m_file`.

With `lfs mirror extend -N -f victim -N2 -c1 FILE` the loop now calls mirror_extend_file() for the second entry too, with `victim_file == NULL`, which turns into `open(NULL, ...)` and an EFAULT.

The man page does say -f cannot be combined with SETSTRIPE_OPTIONS, but nothing enforces it for extend (mirror_create_sanity_check() is only called from mirror_create()). Should mirror_extend() reject a mixed list up front?
patrick bot PS10 · 2026-10-14 04:31
Patrick-Bot: Not changed. Rejecting a mixed list would break sanity-flr test_0d, which runs 'lfs mirror extend -N -S 4M -N -f $tf-2 $tf-1' and expects it to succeed. Handling the -f entries one by one and merging the rest changes the order mirrors are added in, so this is left for the patch owner.
reply PS13 2026-10-26 15:32 Gerrit AI review for Lustre lfs.c:2368 — (minor) When more than one mirror is added, the data is now copied by lfs_mirror_resync_file(). That function always opens the file with O_D
Gerrit AI review for Lustre PS13 · 2026-10-26 15:32
(minor) When more than one mirror is added, the data is now copied by lfs_mirror_resync_file(). That function always opens the file with O_DIRECT, so 'lfs mirror extend -D|--non-direct -N2 FILE' silently ignores -D. Before this change, each mirror was copied by migrate_nonblock() on descriptors that migrate_open_files() opened according to LLAPI_MIGRATION_NONDIRECT. The single-mirror path still honours -D, so the option now behaves differently depending on how many mirrors are added. If the patch is refreshed, could migration_flags be passed down to the resync, or could the man page say that -D only applies to single-mirror extends?
reply PS10 2026-10-14 04:31 patrick bot liblustreapi.c:2451 — Patrick-Bot: Not changed. Keeping, splitting out or dropping the hex lcme_id output is for the patch owner to decide. If it stays, the examp
Gerrit AI review for Lustre PS8 · 2026-08-13 08:50
(minor) This changes `lfs getstripe` output for every composite file, and it looks unrelated to the mirror-merge work.

A couple of things go stale with it: the worked example in the comment above this function still shows `- lcme_id:             1`, and Documentation/ec.txt shows decimal ids too. Test suites also scrape this field (`awk '/lcme_id/{print $2}'` in sanity-flr.sh and sanity-ec.sh).

If the hex form is wanted, could it go in its own patch together with the doc updates?
patrick bot PS10 · 2026-10-14 04:31
Patrick-Bot: Not changed. Keeping, splitting out or dropping the hex lcme_id output is for the patch owner to decide. If it stays, the example in the comment above and Documentation/ec.txt need updating too.
tags: pw_smallfix
owner Zhenyu Xu · uploader patrick bot · PS13 uploaded 13d ago · NEW · open in Gerrit ↗
commit message
LU-18771 flr: allow merge mirrored layout

This patch prepares a merge victim llapi_layout to contain all
mirrors, and mark them as stale mirrors. On MDS, LOD accepts it for
merge. After the stale mirrors have been merged, a resync will
update the content into the newly merged mirrors.

A victim holding its own EC data/parity pair is refused for now,
as renumbering its mirrors would break the links between them.

The layout check on the merged victim accepts the nocompr
mirror flag, so 'lfs mirror extend -N --flags=nocompr' works.

The DoM first component of each merged victim mirror is
marked stale, as its data is only in the victim MDT object.

Test-Parameters: testlist=sanity-flr,sanity-ec
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I37b8eb18c5b8d3f099bc3d76ed0e4215790f61f0
56847 master J –B ✓T ✗7R 0/2
LU-18332 lfs: migrate to mirrored file
mine enforced failed: review-dne-part-3, review-dne-part-4, review-dne-zfs-part-1, review-dne-zfs-part-4, review-zfs
pw_smallfixpw_halt 8 unresolved M +221 −6
6d
enforced failed: review-dne-part-3, review-dne-part-4, review-dne-zfs-part-1, review-dne-zfs-part-4, review-zfs
8 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
failed enforced testplatformdetail
review-dne-part-3 RHEL 9.8 / x86_64 ran 3 tests. 1 tests failed: conf-sanity. session
review-dne-part-4 RHEL 9.7 / x86_64 ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. session
review-dne-part-4 RHEL 10.1 / x86_64 ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. session
review-dne-zfs-part-1 RHEL 9.8 / x86_64 ran 3 tests. 1 tests failed: sanity. session
review-dne-zfs-part-4 RHEL 9.8 / x86_64 ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. session
review-dne-zfs-part-4 RHEL 10.1 / x86_64 ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. session
review-zfs RHEL 8.10 / x86_64 ran 8 tests. 2 tests failed: sanity-flr, sanity-quota. session
build #133892 SUCCESS · tests all Maloo sessions
no vote yet: Patrick Farrell
patchsets:
+14 earlier PS1 11-01 PS2 11-02 PS3 11-02 PS4 02-10 PS5 02-26 PS6 02-26 PS7 02-27 PS8 02-27 PS9 02-28 PS10 03-03 PS11 03-03 PS12 03-04 PS13 03-05 PS14 03-06
PS15 04-17 PS16 08-12 PS17 10-14 patrick bot PS18 10-16 patrick bot PS19 10-17 patrick bot
threads: 8 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS19 2026-10-18 19:30 Gerrit AI review for Lustre sanity-flr.sh:3434 — (style) Carrying this forward from patchset 6, where it was asked whether these cases should be split into separate 63a/b/c/d subtests. test
Gerrit AI review for Lustre PS19 · 2026-10-18 19:30
(style) Carrying this forward from patchset 6, where it was asked whether these cases should be split into separate 63a/b/c/d subtests. test_63 still runs all four migrations in one subtest, so a failure in one hides the others and the cases can't be run on their own.
reply PS19 2026-10-18 19:30 Gerrit AI review for Lustre sanity-flr.sh:3435 — (defect) The test needs two things on the MDS: the mdt_enable_flr_ec module parameter, which came with LU-12187 in 2.17.51, and the stale-mi
Gerrit AI review for Lustre PS19 · 2026-10-18 19:30
(defect) The test needs two things on the MDS: the mdt_enable_flr_ec module parameter, which came with LU-12187 in 2.17.51, and the stale-mirror merge support from LU-18771. A 2.16.52-70 gate lets in a released 2.17.0 MDS, which has neither. On that MDS, `cat /sys/module/mdt/parameters/mdt_enable_flr_ec` fails and the test errors out with "cannot read FLR_EC setting" instead of skipping. Should the gate use the 3-component version that includes LU-18771? The skip message should then say why the version is needed, e.g. "need MDS with stale mirror merge support".
reply PS19 2026-10-18 19:30 Gerrit AI review for Lustre lfs.c:3392 — (style) This isn't a bug, but several err_str values here end in "\n" (this one, plus "cannot get layout\n", "cannot get mirror count\n", th
Gerrit AI review for Lustre PS19 · 2026-10-18 19:30
(style) This isn't a bug, but several err_str values here end in "\n" (this one, plus "cannot get layout\n", "cannot get mirror count\n", the comp_use/mirror id ones and "cannot delete mirror\n"). The final fprintf() appends ": %s\n", so the strerror text ends up on its own line. Also, mirror_merge(), mirror_extend_layout(), lfs_mirror_resync_file() and mirror_split() already print their own errors, so every failure is reported twice. If the patch is refreshed, consider dropping the newlines and the duplicate messages.
reply PS19 2026-10-18 19:30 Gerrit AI review for Lustre lfs.c:3457 — (defect) Can this destroy the only up-to-date copy of the data? lfs_mirror_resync_file() releases its lease before the purge loop starts, an
Gerrit AI review for Lustre PS19 · 2026-10-18 19:30
(defect) Can this destroy the only up-to-date copy of the data? lfs_mirror_resync_file() releases its lease before the purge loop starts, and nothing (group lock or lease) stops writers from that point until mirror_split() runs. If the file is written in that window, the MDS picks a primary mirror (possibly an original one) and marks the new mirrors stale. mirror_split(MF_DESTROY) then removes the original. mdd_split_ea() only refuses when no *data* mirror would remain, and stale data mirrors still count. So the file ends up with only stale mirrors, and the write is lost.

The `lfs mirror delete` path checks last_non_stale_mirror() and resyncs before splitting. Should each split here do the same check, or should the whole extend/resync/purge sequence run under a lease or group lock like lfs_migrate() does in its default blocking mode?
reply PS19 2026-10-18 19:30 Gerrit AI review for Lustre lfs.c:3474 — (style) This isn't a bug, but free() and llapi_layout_free() both accept NULL, so the `if (ioc)` / `if (m_layout)` / `if (f_layout)` checks
Gerrit AI review for Lustre PS19 · 2026-10-18 19:30
(style) This isn't a bug, but free() and llapi_layout_free() both accept NULL, so the `if (ioc)` / `if (m_layout)` / `if (f_layout)` checks can go if the patch is refreshed.
reply PS19 2026-10-18 19:30 Gerrit AI review for Lustre lfs.c:5592 — (defect) Now that migrate goes through the mirror path, how is `-N=COUNT` (mirror_total_mode) meant to work? The block below subtracts the f
Gerrit AI review for Lustre PS19 · 2026-10-18 19:30
(defect) Now that migrate goes through the mirror path, how is `-N=COUNT` (mirror_total_mode) meant to work? The block below subtracts the file's existing mirror count, but lfs_migrate_to_mirror() then purges all of those original mirrors. For a file with 2 mirrors:

- `lfs migrate -N=4` creates 2 new mirrors and deletes the old 2, leaving 2 mirrors instead of 4.
- `-N=3` gives mirror_count 1, so it falls back to plain lfs_migrate().
- `-N=2` prints "no new mirrors will be created" and then runs lfs_migrate() anyway.

Should `=COUNT` be rejected for migrate, or treated as the absolute target count?
reply PS19 2026-10-18 19:30 Gerrit AI review for Lustre lfs.c:6473 — (style) This isn't a bug, but this block-local `int mirror_count` shadows the function-scope `mirror_count` that the -N parsing sets just ab
Gerrit AI review for Lustre PS19 · 2026-10-18 19:30
(style) This isn't a bug, but this block-local `int mirror_count` shadows the function-scope `mirror_count` that the -N parsing sets just above. If the patch is refreshed, a distinct name such as `total_mirrors` would make it clear which count the `> 1` check uses.
reply PS19 2026-10-18 19:30 Gerrit AI review for Lustre lfs.c:6540 — (defect) With a single mirror (`-N` or `-N1`), mirror_count is 1, so this falls through to lfs_migrate() with `param`/`layout`. With -N, tho
Gerrit AI review for Lustre PS19 · 2026-10-18 19:30
(defect) With a single mirror (`-N` or `-N1`), mirror_count is 1, so this falls through to lfs_migrate() with `param`/`layout`. With -N, though, every -E component was built into `mirror_list->m_layout` (lpp points there), and `layout` is still NULL. So `lfs migrate -N -E2M -Eeof -c-1 file` builds `param` from the last component's args and migrates to a plain, non-composite layout. The [0,2M) component and any --flags are dropped without a warning.

The new test step "migrate to 1 mirror w/ 2 components" only compares checksums, so it passes even though no component layout is created. Should the single-mirror case also go through lfs_migrate_to_mirror(), or pass `mirror_list->m_layout` to lfs_migrate()? And should the test check verify_comp_count for that step?
tags: pw_smallfix pw_halt
owner Zhenyu Xu · uploader patrick bot · PS19 uploaded 18d ago · NEW · open in Gerrit ↗
commit message
LU-18332 lfs: migrate to mirrored file

This patch makes "lfs migrate" accept -N options to migrate to a
mirrored layout.

It first merges new mirrors to the original file, then resync the
contents to all the new mirrors, and last purges the original mirrors
from the file.

The migration test enables FLR_EC on the client and every
MDT while it runs, as stale mirror merging requires both.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ie81e6120260a7406b8f8c8e57ba085666c25587a
Assisted-by: Codex:gpt-6.1-sol
Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com>
65737 master J –B ✓T ✗2R -1/2−
LU-10026 csdc: set compress component for file
cc Marc Vef · needs rebase — checkpatch: cannot be cherry-picked
needs rebase csdc 14 unresolved XL +1163 −16
14d
needs rebase — checkpatch: cannot be cherry-picked
enforced failed: custom-1001, review-dne-part-7
14 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
failed enforced testplatformdetail
custom-1001 RHEL 9.7 / x86_64 ran 3 tests. 1 tests failed: sanity-pfl. session
review-dne-part-7 RHEL 9.8 / x86_64 ran 6 tests. 1 tests failed: sanity-pcc. session
build #132858 SUCCESS · tests all Maloo sessions
no vote yet: James Simmons, Roman Bolshakov, Andreas Dilger, Artem Blagodarenko
patchsets:
+10 earlier PS1 05-07 PS2 05-07 PS3 05-28 PS4 05-28 PS5 06-11 PS6 06-11 PS7 06-16 Artem Blagodarenko PS8 06-16 Artem Blagodarenko PS9 07-24 Artem Blagodarenko PS10 08-19 Artem Blagodarenko
PS11 08-19 Artem Blagodarenko PS12 08-20 Artem Blagodarenko PS13 08-20 Artem Blagodarenko PS14 08-21 Artem Blagodarenko PS15 10-05 Roman Bolshakov
threads: 14 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS15 2026-10-06 08:14 Gerrit AI review for Lustre COMMIT_MSG:56 — (minor) The body doesn't mention the client-side gate added by squashing Ib1e2123ff: the new lustre_check_lov_user_md() and lustre_check_lov
Gerrit AI review for Lustre PS15 · 2026-10-06 08:14
(minor) The body doesn't mention the client-side gate added by squashing Ib1e2123ff: the new lustre_check_lov_user_md() and lustre_check_lov_comp_md_v1() in ptlrpc/pack_generic.c, and their calls from ll_lov_setstripe_ea_info() and ll_xattr_set(). These reject a compress layout when `llite.*.enable_compression=0`, which is a user-visible behaviour change. Could a short paragraph describing them be added?
reply PS11 2026-08-20 12:36 Artem Blagodarenko patchset comment — Hi Andreas. Thanks for poining to this. I have reverted all fixed by Patchset 11 pushing wrong branch. I have reverted to Patchset 10 where
Andreas Dilger PS11 · 2026-08-19 23:52
@ablagodarenko@thelustrecollective.com it looks like the patches were rebased, but did not address any of the AI review comments?  While we can't go overboard changing every detail of the patches, I think it does make sense to fix the code where possible so that we don't carry technical debt later.
Artem Blagodarenko PS11 · 2026-08-20 12:36
Hi Andreas. Thanks for poining to this. I have reverted all fixed by Patchset 11 pushing wrong branch. I have reverted to Patchset 10 where I addressed AI bot comments and fixed build.
reply PS14 2026-10-05 17:51 Roman Bolshakov patchset comment — Squashed Ib1e2123ffdb239c3e1401d682ae9c2c49e3f4a6f into the change. I'll address a couple more comments in another push.
Roman Bolshakov PS14 · 2026-10-05 17:51
Squashed Ib1e2123ffdb239c3e1401d682ae9c2c49e3f4a6f into the change. I'll address a couple more comments in another push.
reply PS9 2026-08-19 23:52 Andreas Dilger lfs-getstripe.1:331 — Should be fixed if patch is refreshed.
Gerrit AI review for Lustre PS9 · 2026-07-28 09:23
(minor) There is no `.TP` before this entry, so `--compress-type|--compr-type` and its description get folded into the `-z, --extension-size` paragraph above instead of starting their own tagged item. The two entries below it do have theirs.
Oleg Drokin PS9 · 2026-08-12 02:29
weird but in my man output it looks ok.
Artem Blagodarenko PS10 · 2026-08-19 19:47
The entry was missing its .TP in the troff source. Some man implementations are lenient and reflow correctly, but others fold the entry into the previous paragraph. Added .TP for correctness.
Artem Blagodarenko PS10 · 2026-08-19 19:47
Done. Added the missing .TP before the --compress-type|--compr-type entry.
Andreas Dilger PS9 · 2026-08-19 23:52
Should be fixed if patch is refreshed.
reply PS14 2026-08-22 12:47 Gerrit AI review for Lustre llapi_layout_compress_set.3:105 — (minor) Neither of the two new man3 pages has an EXAMPLES section. Lustre llapi pages are expected to carry a short usage example showing th
Gerrit AI review for Lustre PS14 · 2026-08-22 12:47
(minor) Neither of the two new man3 pages has an EXAMPLES section. Lustre llapi pages are expected to carry a short usage example showing the required header and a realistic call.
reply PS15 2026-10-06 08:14 Gerrit AI review for Lustre llapi_layout_compress_set.3:71 — (minor) This, and the matching EINVAL entry under ERRORS, says a `stripe_size` that is not a multiple of `chunk_size` is an error. llapi_lay
Gerrit AI review for Lustre PS15 · 2026-10-06 08:14
(minor) This, and the matching EINVAL entry under ERRORS, says a `stripe_size` that is not a multiple of `chunk_size` is an error. llapi_layout_compress_set() never fails for that: it decrements `log_bits` until the chunk divides the stripe and stores the smaller chunk (sanity-pfl test_100c expects 3*64KiB to become 128KiB). Similarly, gzip/lz4/lz4fast levels outside the listed ranges are clamped by their from_*_level() helpers, not rejected with EINVAL as the text above says (test_100c expects gzip:15 to read back as 9). If the patch is refreshed, could the page describe the rounding and clamping instead?
reply PS14 2026-08-22 12:47 Gerrit AI review for Lustre llapi_parse_compress_type.3:62 — (minor) llapi_parse_compress_type() also returns -EINVAL - for a level that isn't a valid number or falls outside +/-COMPR_LEVEL_MAX - which
Gerrit AI review for Lustre PS14 · 2026-08-22 12:47
(minor) llapi_parse_compress_type() also returns -EINVAL - for a level that isn't a valid number or falls outside +/-COMPR_LEVEL_MAX - which neither RETURN VALUES nor ERRORS mentions. Mixing -1 with -Exxx returns in one function is also awkward for callers; would returning -EINVAL for the unknown-type case be more consistent?
reply PS14 2026-08-22 12:47 Gerrit AI review for Lustre lustreapi.h:1457 — (minor) The 9 used as the lz4 default collides with a real level. from_lz4_level(10) returns 9, and to_lz4_level(9) returns 9 because 9 == L
Gerrit AI review for Lustre PS14 · 2026-08-22 12:47
(minor) The 9 used as the lz4 default collides with a real level. from_lz4_level(10) returns 9, and to_lz4_level(9) returns 9 because 9 == LZ4HC_DEFAULT_CLEVEL, so 'lfs setstripe -Z lz4:10' reports back as lz4:9 and level 10 can never be displayed - even though lfs-setstripe.1 documents 1-16 as the valid lz4 range.
reply PS15 2026-10-06 08:14 Gerrit AI review for Lustre file.c:2838 — (defect) This gate runs only for regular files: ll_lov_setstripe_ea_info(), and the `lov.` branch in ll_xattr_set(). A directory default goe
Gerrit AI review for Lustre PS15 · 2026-10-06 08:14
(defect) This gate runs only for regular files: ll_lov_setstripe_ea_info(), and the `lov.` branch in ll_xattr_set(). A directory default goes through ll_setstripe_ea() -> ll_dir_setstripe() (and the LL_IOC_LOV_SETSTRIPE case in ll_dir_ioctl()), which never calls lustre_check_lov_user_md(). So on a client with `enable_compression=0`:

    lfs setstripe -E eof -Z lz4 $dir    # accepted
    touch $dir/f                        # MDS instantiates a compress layout

This still produces a file the client can't handle. lsm_lmm_verify_v1v3() rejects it with "file compression not enabled", and the PS14 report shows a later unlink or stripe change hitting the lov_io_layout_at() LBUG. Should ll_dir_setstripe() apply the same check? Or, if allowing compressed defaults on a disabled client is intended, should the client reject the layout cleanly instead of asserting?
reply PS15 2026-10-06 08:14 Gerrit AI review for Lustre xattr.c:425 — (defect) On this `lov.` path nothing validates `size` before lustre_check_lov_user_md() walks the entries. lustre_check_lov_comp_md_v1() rea
Gerrit AI review for Lustre PS15 · 2026-10-06 08:14
(defect) On this `lov.` path nothing validates `size` before lustre_check_lov_user_md() walks the entries. lustre_check_lov_comp_md_v1() reads `lcm_entry_count` and then up to 65535 `lcm_entries[]`, but the buffer here is only the `size` bytes copied in by the VFS.

The `lustre.` xattr namespace needs only write permission on the inode, so any file owner can trigger it:

    setxattr(f, "lustre.lov.add", buf, 8, 0);  /* buf starts with LOV_USER_MAGIC_COMP_V1 */

That reads lcm_entry_count past the end of an 8-byte allocation and keeps reading for up to ~3MB. KASAN reports it as slab-out-of-bounds. Before this patch, little-endian clients only read `lmm_magic` here.

The next change in the series ("utils: add 'lfs find' support for compressed file") adds a `size < need` check just above this call. Since this patch introduces the read, should that check move here? Passing `size` into lustre_check_lov_user_md(), the way lustre_swab_lov_user_md() takes one, would also let it validate the buffer itself.
reply PS14 2026-08-22 12:47 Gerrit AI review for Lustre lod_qos.c:3191 — (minor) This applies the chunk adjustment to every component including extension ones, where llc_stripe_size holds the extension size rather
Gerrit AI review for Lustre PS14 · 2026-08-22 12:47
(minor) This applies the chunk adjustment to every component including extension ones, where llc_stripe_size holds the extension size rather than a real stripe size. lod_declare_layout_add() deliberately skips LCME_FL_EXTENSION components for exactly that reason, so the same input layout gets different chunk_lum_bits depending on whether it arrives via create or via --component-add. Should this site skip extension components as well?

While there: the comment added in lod_declare_layout_add() says chunk adjustment is deferred until instantiation, but nothing calls lod_adjust_compr_chunk_size() on the instantiation path - the only three callers are here, lod_declare_layout_add() and lod_striping_from_default().
reply PS15 2026-10-06 08:14 Gerrit AI review for Lustre pack_generic.c:2672 — (defect) -ENOTSUPP (524) is kernel-internal and has no userspace errno, so this reaches `lfs setstripe` through ioctl()/setxattr() as "Unkno
Gerrit AI review for Lustre PS15 · 2026-10-06 08:14
(defect) -ENOTSUPP (524) is kernel-internal and has no userspace errno, so this reaches `lfs setstripe` through ioctl()/setxattr() as "Unknown error 524". The erasure-coding check just above it in ll_lov_setstripe_ea_info() returns -EOPNOTSUPP for the same kind of rejection. Should this be -EOPNOTSUPP too?

While here, a couple of nits: `rc` is never changed from 0, there's a double blank line after the EXPORT_SYMBOL(), and the default case in lustre_check_lov_user_md() logs "Invalid LOV magic" but still returns 0.
tags: csdc
owner Marc Vef · uploader Roman Bolshakov · PS15 uploaded 30d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: set compress component for file

Introduce per-component compression support for composite LOV layouts.
A new LCME_FL_COMPRESS component flag marks entries that carry
compress fields; the flag is set when the user supplies a compression
type via 'lfs setstripe -Z' and is propagated through the LOD and LOV
layers so that compressed components are distinguished from plain
ones.

LOD layer:
- lod_parse_striping(): read lcme_compr_type/lvl/chunk_lum_bits from
  the user-supplied lov_comp_md_v1 when LOV_PATTERN_COMPRESS is set.
- lod_use_defined_striping(): likewise for pre-defined layouts.
- lod_get_default_lov_striping(): carry compress fields into the LOD
  component when inheriting a default layout that includes
  compression.
- lod_generate_lovea(): serialise llc_compr_* fields into the on-wire
  lcm entry when LOV_PATTERN_COMPRESS is set.
- lod_adjust_compr_chunk_size(): new helper that rounds down the
  requested chunk-size exponent so the chunk fits evenly within one
  stripe and within one RPC (clamped to COMPR_CHUNK_MAX_BITS in the
  following changes).

API / utils layer:
- 'lfs setstripe' gains --compress|-Z <type>[:<level>] and
  --compress-chunk=<size> options to set the compression type, level,
  and chunk size on a new component.  Like -S and -c, -Z is inherited
  by subsequent -E components unless overridden by another -Z.

  Example:
	$ lfs setstripe -Eeof -Z lz4:5 --compress-chunk=512 <file>

- 'lfs getstripe' gains --compress-type, --compress-level, and
  --compress-chunk options to print individual compress parameters:

  Example:
	$ lfs getstripe <file>
    lcme_compr_type:     lz4
    lcme_compr_lvl:      5
    lcme_compr_chunk_kb: 512
      lmm_pattern:       raid0,compress

- llapi_layout_merge(): copy compress fields when merging layouts.
- Two new man3 pages: llapi_layout_compress_set.3 and
  llapi_parse_compress_type.3.

Misc:
- dump_lsm() in lov_ea.c prints compress fields for debugging.
- compr_name_from_type() helper added in lov_internal.h and wired up
  in dump_lsm() to print compression type names in debug output.

Test-Parameters: testlist=sanity-pfl serverversion=2.17
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Signed-off-by: Roman Bolshakov <rbolshakov@ddn.com>
Change-Id: Ife0382469cbc5099e0c6dc96534bb169ddeff61e
Was-Change-Id: Ib1e2123ffdb239c3e1401d682ae9c2c49e3f4a6f
68778 master J !B ✓T ✓R +1/2
LU-20703 llite: limit readahead window by the readahead budget
mine 3 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
3 unresolved M +84 −5
43d
3 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
no vote yet from Qian Yingjin, Li Dongyang
janitor run: 4 failing config(s), none unique to this patch — janitor results
build #131763 SUCCESS · tests all Maloo sessions
reviews: Xiyang Wang +1 2026-09-22 11:49
no vote yet: Qian Yingjin, Li Dongyang
patchsets: PS1 09-10 PS2 09-15
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS2 2026-09-16 07:36 Gerrit AI review for Lustre rw.c:1288 — (minor) The comment above the block still says the readahead goes "up to ra_max_pages_per_file", and the CDEBUG below prints ra_max_read_ahe
Gerrit AI review for Lustre PS2 · 2026-09-16 07:36
(minor) The comment above the block still says the readahead goes "up to ra_max_pages_per_file", and the CDEBUG below prints ra_max_read_ahead_whole_pages and ra_max_pages_per_file.  Neither is the limit any more.  If the patch is refreshed, could the comment name the effective limit and the trace print ra_max_window_pages(ra) (or ra_max_pages) so the dump matches what the window is actually clamped to?
reply PS2 2026-09-16 07:36 Gerrit AI review for Lustre rw.c:1309 — (defect) Capping this window makes it possible for ras_whole_file_read to be true while the window no longer covers the file, and nothing re
Gerrit AI review for Lustre PS2 · 2026-09-16 07:36
(defect) Capping this window makes it possible for ras_whole_file_read to be true while the window no longer covers the file, and nothing recovers from that.

The entry test is kms_pages <= ra_max_read_ahead_whole_pages, but the window is now min(ra_max_window_pages(ra), ra_max_read_ahead_whole_pages).  max_read_ahead_whole_mb is only clamped against ra_max_pages_per_file and max_read_ahead_mb is not clamped against it at all, so ra_max_pages < kms_pages <= ra_max_read_ahead_whole_pages is reachable: with brw_size=16M (whole = 16M) and max_read_ahead_mb=8, a 12M file on its second read gets ras_whole_file_read = true and a 8M window.

From there ll_readahead() takes end_idx = ras_window_start_idx + ras_window_pages - 1 and only stretches it far enough to cover the current read, ras_update() returns early on ras_whole_file_read so the window is never grown or moved, and this function resets ras_next_readahead_idx to 0 on every read() while the whole-file test keeps matching.  The readahead frontier can never pass ra_max_pages, and the tail of the file is read a page per RPC for the life of the fd.

Before the patch the window was ra_max_read_ahead_whole_pages >= kms_pages, so the frontier walked to EOF: ll_ra_count_get() clamped each reservation to the remaining budget, and cached pages return 1 from ll_read_ahead_page() without consuming any reservation.

Would folding the budget into the entry test fix it, so the normal detector keeps running when the budget cannot cover the file?

    if (kms_pages && kms_pages <= min(ra->ra_max_read_ahead_whole_pages,
                                      ra_max_window_pages(ra))) {
reply PS2 2026-09-16 07:36 Gerrit AI review for Lustre sanity.sh:13358 — (suggestion) This was raised on patchset 1 and the pass criterion is unchanged: 101d still passes or fails on two dd wall-clock numbers, whi
Gerrit AI review for Lustre PS2 · 2026-09-16 07:36
(suggestion) This was raised on patchset 1 and the pass criterion is unchanged: 101d still passes or fails on two dd wall-clock numbers, which is what makes it flaky in the first place.

Now that the patch makes the async gate reachable, the new instrumentation already reads the values that would make this deterministic.  Could the test also assert on them unconditionally, e.g. llite.*.read_ahead_stats async_readahead > 0, or that the osc.*.rpc_stats read histogram is not dominated by 1-page RPCs?  That would fail for the LU-20703 reason rather than for timing noise.
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 51d ago · NEW · open in Gerrit ↗
commit message
LU-20703 llite: limit readahead window by the readahead budget

The per-file readahead window is capped by ra_max_pages_per_file,
independently of the global readahead budget ra_max_pages
(llite.*.max_read_ahead_mb).  When the budget is set below the
per-file window (e.g. sanity/101d sets max_read_ahead_mb=40 while
max_read_ahead_per_file_mb=64 on a 64K-page client), the readahead
window target exceeds the whole readahead budget, and then:

* the async readahead gate in kickoff_async_readahead() is never
  satisfied: the throttle defaults to ra_max_pages_per_file, so
  the gate only opens at the maximal window, but a cache miss
  runs ras_reset() and drops the window back to 0, and it takes
  ra_max_pages_per_file / ras_rpc_pages growth steps to climb
  back;
* every cache miss runs a synchronous readahead walk that reserves
  the whole remaining budget and holds it until its read RPCs
  complete;
* while the budget is in flight the reader catches up with the
  readahead frontier, and further misses can only reserve one page
  via the pages_min override, degenerating into a storm of one-page
  (64KB) read RPCs plus per-miss readahead state and lock-match
  overhead, making the readahead-enabled read slower than the
  readahead-disabled one: "readahead 22.8092s > no-readahead
  10.3606s (80M)".

Limit the effective per-file readahead window by the readahead
budget with a new helper ra_max_window_pages(), and use it where
the window growth is capped (ras_stride_increase_window(),
ras_increase_window()), where the whole-file-read window is
initialized (ll_ras_enter()) and in the async readahead gate
(kickoff_async_readahead()).  The stored tunables are unchanged,
so raising max_read_ahead_mb again restores the original behavior.

The window grows in ras_rpc_pages steps once it reaches one RPC
(ras_increase_window() aligns every step), so it tops out at
ra_max_window_pages() rounded down to the RPC size.  Round the
async readahead throttle down to the same granularity, otherwise
it can exceed every value the window can take and async readahead
never fires (e.g. brw_size=16 on a 64K-page client with
max_read_ahead_mb=40: window tops out at 512 pages, throttle is
640).  Throttles below one RPC are left unaligned, since such
windows are still reachable via the sub-RPC window in
ras_increase_window().

Also add opt-in (DEBUG_101D=1, or DEBUG_101D=trace to also capture
the D_READA trace) instrumentation to sanity/101d, which dumps the
readahead parameters, readahead stats and read RPC size histogram
around the measured reads, and restores the debug mask via
debugsave()/debugrestore() when tracing.

Assisted-by: Augment Agent:GLM 5.3 Flash
Test-Parameters: testlist=sanity.sh env=ONLY=101d,ONLY_REPEAT=50 clientdistro=rocky9.5 clientarch=aarch64
Fixes: c2791674260b ("LU-12043 llite: improve single-thread read performance")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I01818568c4cba4ff40bee0b725f7e7dcf0bc9063
68788 master J ✓B ✗T –R 0/2
LU-10026 tests: compression component via --component-add
reviewing Marc Vef · build failure (#131544)
csdc 1 unresolved S +15 −0
55d
build failure (#131544)
1 unresolved thread(s) await your reply — last from Marc Vef
build #131544 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-09-10 19:52 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-09-10 19:52
[Marc Bot] upstream remarks for reference:

The lod fix this test was written for is already on master (90c093b7850, LU-17468); only the sanity-compr test_1a part was unlanded - ported under a new Change-Id with the original as Was-Change-Id.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 55d ago · NEW · open in Gerrit ↗
commit message
LU-10026 tests: compression component via --component-add

Add sanity-compr test_1a: create a file with a plain first component,
append a compressed component with "lfs setstripe --component-add
-Z gzip" and verify the added component carries the compression
type. This covers the compression branch of the component-add path
in lod_declare_layout_add().

The lod fix this test was written for is already on master as
commit 90c093b7850 ("LU-17468 lod: component add missed pattern
info"); only the test part is new here.

Test-Parameters: forjanitoronly
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Was-Change-Id: I7ad746a550f1afea54a6f5b68823a79a85a44082
Change-Id: I0624bf3f5f9c965f826e72656a8cd8198c5624fd
68389 master J !B ✗T –R 0/2
LU-10026 csdc: inherit CSDC params unless overriden
reviewing Marc Vef · build failure (#130361)
csdc 1 unresolved L +258 −25
68d
build failure (#130361)
1 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 7 failing config(s), none unique to this patch — janitor results
build #130361 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 12:50 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 12:50
[Marc Bot] upstream remarks for reference:

- Rewritten onto the current naming: LL_COMPR_TYPE_SPEC_NONE = 9 added (MAX moves to 10); wire asserts extended accordingly (this tree carries LL_COMPR_TYPE_MAX asserts the original did not have).
- compr_type_table: the NONE row loses its name, SPEC_NONE row ("none") added before the MAX sentinel - the compress_type_2str()/parse helpers were already in the matching form.
- The inheritance-hint struct uses cd_compr_chunk_lum_bits with this series' lum-bits semantics (offset above COMPR_CHUNK_MIN_BITS - no +16 at use sites), and lod_adjust_compr_chunk_size() is called in its take-by-value/return-by-value form.
- lod_qos_parse_config: the convert_plain arm skips all lcme-derived assignments including fields this tree has that the original context did not (llc_mirror_link_id, llc_dstripe_count, llc_cstripe_count).
- SPEC_NONE clearing blocks in lod_parse_striping/lsm_unpackmd applied at the current field naming.
- test_1000d version gate converted to compression_supported.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: inherit CSDC params unless overriden

If a parent directory has been set CSDC parameters, the file created
under it needs to inherit the CSDC parameters unless another CSDC
parameters or an empty CDSC has been specified for a component of the
file. The file create method includes touch, setstripe a plain layout
file, or setstripe a composite layout file.

As "-Z none" would be used to set compression type to 0 and server
would treat it as no CSDC parameters has been set, so "-Z none"
can not be used to stop inherit parent directory's CSDC inheritance,
so this patch introduces another compression type
LL_COMPR_TYPE_SPEC_NONE to associate with "none" compresstion type,
and it can be used to stop the CSDC inheritance from parent
directories, when user uses "-Z none" to reset compression type,
this patch would set the compression type to LL_COMPR_TYPE_SPEC_NONE.

If we use patched new client to create a file with "-Z none" upon old
servers, the old servers cannot recognize this new
LL_COMPR_TYPE_SPEC_NONE compression type, and it just records the
type as is in the layout.

On old clients "lfs getstripe" will show "unknown" to the component's
lcme_compr_type, and on new clients, "lfs getstripe" will show "none"
to the lcme_compr_type.

When we write data to this file, both clients work but with different
behavior. On old client, with "unknown" compression type, it chooses
a fallback algorithm to compress the data, twisting the original
intention not to compress the component; while on new client, it will
treat "none" component as uncompressed one as intended.

Test-Parameters: forjanitoronly
DDN-bug-id: EX-10201
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Ibbdb3f6489cf7e19bfebe075bf88580f39ed79e4
68410 master J !B ✗T –R 0/2
LU-10026 llite: issue compressiblity change in workqueue
reviewing Marc Vef · build failure (#130382)
csdc 3 unresolved M +118 −56
68d
build failure (#130382)
3 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 7 failing config(s), none unique to this patch — janitor results
build #130382 FAILURE
no vote yet: Artem Blagodarenko
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 12:51 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 12:51
[Marc Bot] upstream remarks for reference:

The test_1021 tweaks (sleeps, echo moves) re-applied against the unwrapped assertion blocks; ci_need_change_layout renamed as in the original.
reply PS1 2026-08-26 13:39 Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:292 — warn: vvp_layout_minor_change():passing zero to 'ERR_CAST'
Misc Code Checks Robot (Gatekeeper helper) PS1 · 2026-08-26 13:39
warn: vvp_layout_minor_change():passing zero to 'ERR_CAST'
reply PS1 2026-08-26 13:39 Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:294 — error: vvp_layout_minor_change():'vlcw' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper) PS1 · 2026-08-26 13:39
error: vvp_layout_minor_change():'vlcw' dereferencing possible ERR_PTR()
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 llite: issue compressiblity change in workqueue

This patch uses kernel-global workqueue to handle the file's minor
layout change RPC equest. At vvp_io_fini() when it find that the
file's compressibility should be changed, it creates a work and
insert the request to the kernel workqueue.

This would prevent the layout minor change RPC issued from within an
IO, and it could avoid the possible double lock the LOV conf lock.

lov: replace switch compressibility

The switch compressibility flag results in weird behavior -
it tells us we are to flip what's there, but results in some
very hard to read code.

I *think* the existing code is probably correct in absence
of race conditions, but an instruction to "flip" rather than
set is very confusing and could easily do the wrong thing
if there's a race which changes the compressibility value.

Replace it with two explicit bit flags.

DDN-bug-id: EX-10857
Was-Change-Id: I3b1d9f8d635e0bdbe67d5806127727a7264d26be

Singed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com>

Test-Parameters: forjanitoronly
DDN-bug-id: EX-10857
Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Ic4345b1387288ab11ce9061f40b056b07cb976bf
68368 master J !B ✗T –R 0/2
LU-10026 csdc: tune allowed compression type on server
reviewing Marc Vef · build failure (#130343)
csdc 1 unresolved L +258 −18
68d
build failure (#130343)
1 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 8 failing config(s), none unique to this patch — janitor results
build #130343 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 10:37 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 10:37
[Marc Bot] upstream remarks for reference:

- The patch re-created a libcfs_string.h/.c pair to host string-mask helpers; master already provides cfs_str2mask()/cfs_mask2str() with u64 masks (lnet/libcfs/debug.c), so both files were dropped and the new compress_types stores call the existing helper (~0ULL masks). A hunk that narrowed the existing capability-mask store from ~0ULL to ~0 was dropped for the same reason.
- mdt.*.compress_types and obdfilter.*.compress_types are implemented as sysfs attributes (the target-side procfs vars tables the original patch extended no longer exist on master).
- The obd_compress_types mask enum / COMPRESS_NAMES use the series' type naming (lz4 for the HC type) and already include zstd, which is a valid layout type at this point in the series.
- OST-side only, as in the original: OBD_CONNECT2_COMPRESS is advertised in OST_CONNECT_SUPPORTED2 and requested by the OSC; MDT enabling remains pending (test_1013b keeps its unconditional skip; its old-version negative-check block, meaningless on master, was dropped).
- compression_supported() in test-framework.sh now probes the OSC import for the compressed_file connect flag instead of comparing versions. (The OSC import, not the MDC one, because MDT support is not enabled.)
- test_1013a/b were placed before test_1015 (the tests they were anchored to arrive later in the series).
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: tune allowed compression type on server

Use lctl get_param {mdt|obdfiler}.*.compress_types to list supported
compression types on server.

Use lctl set_param {mdt|obdfilter}.*.compress_types="+gzip-lzo" to
add gzip to and delete lzo from existing compression types on server.

Server will negotiate supported compression types with client in
ocd_compress_types and client import stats could show the negotiated
supported compression types in "lctl get_param {mdc|odc}.*.import"
connect_data section:

import:
  ....
  connect_data:
     ....
     compress_types: [ fast,best,gzip,lz4fast,lz4hc,lzo ]

The OST support for the connect flags is enabled in this patch, but
MDT enabling is pending unaligned compression support for DoM files.

test: refine sanity-compr.sh/test_0a

Only change and verify compression types negotiation between client
and OST0000.

DDN-bug-id: EX-9802
Was-Change-Id: I307f3826973f48791b7fbf4cdfa121401b059b0e
Was-Change-Id: Ic22685d2b21e872c01d90f2c3062b5d0d9b92ec2

test: sanity-compr.sh/test_0a failure

* move sanity-compr.sh test_0a/test_0b to test_1013a/test_1013b
* explicitly specify client's hostname to get client's negotiated
  compression types, as test environtment could mount several clients

DDN-bug-id: EX-9802
Was-Change-Id: Ic091f55a59ad9cfdaf3a94a58d44b372070c7875

Test-Parameters: forjanitoronly
DDN-bug-id: EX-6269
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I18943352e25ed9d5fe82442df9f00a7ef388f242
68374 master J ✗2B ✗T –R 0/2
LU-10026 csdc: store compression info in FID EA
reviewing Marc Vef · build failure (#130348)
2 unique failures csdc 1 unresolved M +37 −65
68d
build failure (#130348)
janitor: 2 test failures unique to this patch — sanity-pfl@ldiskfs+DNE:test_100b, sanity-quota@ldiskfs+DNE:test_80
1 unresolved thread(s) await your reply — last from Marc Vef
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
sanity-pfl@ldiskfs+DNE:test_100bseen in 4 other reviews
sanity-quota@ldiskfs+DNE:test_80seen in 73 other reviews
build #130348 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 10:37 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 10:37
[Marc Bot] upstream remarks for reference:

Applied cleanly. Note for reviewers: this changes where the PFID EA is stored for small inodes (no longer embedded in LMA for <=256-byte inodes) - needs interop/lfsck review on master.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: store compression info in FID EA

Store compression information in OST-object's FID EA, and lfsck could
use it to recover the MDT-object layout EA from orphan OST-object(s).

2.15 Lustre may embed PFID and layout stripe info in LMA EA, this
patch would clear them from LMA EA and store them with compression
info directly into FID EA thereafter.

Test-Parameters: forjanitoronly
DDN-bug-id: EX-8038
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Iacac04601b73f85d9bc057b8dd34a5004248dac4
66612 master J !B ✗T –R 0/2
LU-10026 csdc: sending compression info to server
reviewing Marc Vef · build failure (#130320)
csdc 4 unresolved M +100 −13
68d
build failure (#130320)
4 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor run: 11 failing config(s), none unique to this patch — janitor results
build #130320 FAILURE
patchsets: PS1 06-11 PS2 08-25 PS3 08-26
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-07-15 00:58 Gerrit AI review for Lustre COMMIT_MSG:12 — (minor) This is an on-wire change: the client now fills bytes in the obdo (formerly o_padding_4) that are sent to the OST/MDS. Test-Paramete
Gerrit AI review for Lustre PS1 · 2026-07-15 00:58
(minor) This is an on-wire change: the client now fills bytes in the obdo (formerly o_padding_4) that are sent to the OST/MDS. Test-Parameters: forjanitoronly doesn't exercise interoperability. Consider requesting old-server/new-client and new-server/old-client runs with serverjob/serverbuildno and clientjob/clientbuildno so the padding-reuse stays wire-compatible with unpatched peers.
reply PS2 2026-08-25 21:23 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS2 · 2026-08-25 21:23
[Marc Bot] upstream remarks for reference:

Rebase notes: kept the base's comment wording for the chunk-bits field
(2^(16+chunk_lum_bits)); the lov_lsm2layout() wrapper is added alongside
the base's compr_name_from_type() helper in lov_internal.h.
reply PS1 2026-07-15 00:58 Gerrit AI review for Lustre lustre_user.h:1128 — (minor) This comment reword looks unrelated to sending compression info to the server; is it meant to be in this patch? Also the code comput
Gerrit AI review for Lustre PS1 · 2026-07-15 00:58
(minor) This comment reword looks unrelated to sending compression info to the server; is it meant to be in this patch? Also the code computes the chunk size with COMPR_CHUNK_MIN_BITS (COMPR_GET_CHUNK_SIZE()), not LOV_MIN_STRIPE_BITS; they happen to both be 16, but referencing the constant the code actually uses would be clearer.
reply PS1 2026-07-15 00:58 Gerrit AI review for Lustre lov_internal.h:408 — This isn't a bug, but after this patch lov_lsm2layout() has no remaining callers (both lov_io.c and lovsub_object.c now call lov_lsm2layout2
Gerrit AI review for Lustre PS1 · 2026-07-15 00:58
This isn't a bug, but after this patch lov_lsm2layout() has no remaining callers (both lov_io.c and lovsub_object.c now call lov_lsm2layout2()). Folding the olc parameter into lov_lsm2layout() and updating those two call sites would avoid the version-suffixed name and the now-dead wrapper.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS3 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: sending compression info to server

Client fills in layout compression info into obdo and passes it
to server.

Test-Parameters: forjanitoronly
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Ieb5d7b3609da41f35f8622ed6116f19ce7567ddb
68380 master J !B ✗T –R 0/2
LU-10026 csdc: exponential backoff of incompressiblity check
reviewing Marc Vef · build failure (#130354)
csdc 1 unresolved M +144 −90
69d
build failure (#130354)
1 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 8 failing config(s), none unique to this patch — janitor results
build #130354 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 10:38 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 10:38
[Marc Bot] upstream remarks for reference:

Chunk-bits field naming follows the series (llc_compr_chunk_lum_bits).
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: exponential backoff of incompressiblity check

If a file is incompressible and after a round of compressibility
check, if it remains incompressible, this patch would doubles the
skip bytes before running into another round of compressiblity
check.

This patch adds a state machine for update_compression_info(), the
states could be CS_INCOMPR, CS_COMPR, CS_CHECK, CS_CHECK_INC.

CS_INCOMPR    --  file is not compressible
CS_COMPR      --  file is  compressible
CS_CHECK      --  was in CS_COMPR, is now under check phase
CS_CHECK_INC  --  was in CS_INCOMPR, is now under check phase

state transition:
INCOMPR --> INCOMPR   : skip bytes has not been passed
INCOMPR --> CHECK_INC : skip bytes has been reached, in check phase
COMPR   --> CHECK     : in check phase, checked bytes has not been
                        reached
CHECK*  --> CHECK*    : in check phase, checked bytes has not been
                        reached
CHECK*/COMPR
          --> COMPR   : file is determined to be compressible
CHECK/COMPR
          --> INCOMPR : file is determined to be incompressible, reset
                        the skip bytes check length
CHECK_INC --> INCOMPR : file is determined to be incompressible,
                        double the skip bytes check length

====

Test with 4 OSTs system, target file layout is set as:
lfs setstripe -Eeof -c-1 -Z lz4 --compress-chunk=64 $tf

and src file is 336M bz2 file, using "dd if=$src of=$tf bs=4M" copy
this bz2 file to target file.

w/o the patch, copy uses about 7 seconds
** start 1724216088 **
84+1 records in
84+1 records out
352625400 bytes (353 MB, 336 MiB) copied, 3.76366 s, 93.7 MB/s
** end 1724216095 **
...7 seconds

w/ the patch, copy uses about 4 seconds
** start 1724215237 **
84+1 records in
84+1 records out
352625400 bytes (353 MB, 336 MiB) copied, 2.07946 s, 170 MB/s
** end 1724215241 **
...4 seconds

Test-Parameters: forjanitoronly
DDN-bug-id: EX-8355
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I42105d3e137bf50897ff5c67654ca33552b23102
68379 master J !B ✗T –R 0/2
LU-10026 utils: return error on invalid compress level setting
reviewing Marc Vef · build failure (#130353)
csdc 1 unresolved S +11 −4
69d
build failure (#130353)
1 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 7 failing config(s), none unique to this patch — janitor results
build #130353 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 10:38 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 10:38
[Marc Bot] upstream remarks for reference:

- The strtoul/end-pointer validation this patch adds was already carried (in stricter form) by the earlier level-handling patches of this series; those hunks were dropped.
- The parse-time rewrite of low lz4 levels to the lz4fast default was removed here (matching the original series' final behaviour): the stored level is kept and the compression engine falls back to lz4fast when allocating the compressor. This also makes the negotiated-type test lists in sanity-pfl roundtrip correctly.
- The new negative test was renamed test_1013a -> test_1013c: 1013a already exists (type negotiation test); the duplicate name would have silently shadowed it (latent issue in the original series).
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 utils: return error on invalid compress level setting

lfs setstripe -Z <compress_type>:<compress_level> does not report
error on invalid <compress_level>.
An explicit low level for the lz4 type (below the lz4hc minimum) is
no longer silently rewritten to the lz4fast default at parse time;
the stored level is kept and the compression engine falls back to
lz4fast for such levels when allocating the compressor.

Test-Parameters: forjanitoronly
DDN-bug-id: EX-10186
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Ie794a6d4cf208a9c66d1d179c157fee756477aee
66611 master J !B ✗T –R 0/2
LU-10026 lfs: migrate compressed file without stripe info
reviewing Marc Vef · build failure (#130319)
csdc 2 unresolved M +76 −14
69d
build failure (#130319)
2 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor run: 4 failing config(s), none unique to this patch — janitor results
build #130319 FAILURE
patchsets: PS1 06-11 PS2 08-25 PS3 08-26
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-07-15 00:58 Gerrit AI review for Lustre COMMIT_MSG — (minor) The diff also touches Documentation/man1/lfs-mirror-extend.1 (documenting compression options for SETSTRIPE_OPTIONS), which the mess
Gerrit AI review for Lustre PS1 · 2026-07-15 00:58
(minor) The diff also touches Documentation/man1/lfs-mirror-extend.1 (documenting compression options for SETSTRIPE_OPTIONS), which the message doesn't mention and which is unrelated to the migrate fix. Is that hunk meant to be part of this patch, or should it be split out / called out in the body?
reply PS1 2026-07-15 00:58 Gerrit AI review for Lustre liblustreapi_layout.c:2166 — (minor) This prints `fd`, which is always -1 on this path, so the message reads "Cannot open file X: -1" with no useful detail. The error is
Gerrit AI review for Lustre PS1 · 2026-07-15 00:58
(minor) This prints `fd`, which is always -1 on this path, so the message reads "Cannot open file X: -1" with no useful detail. The error is in errno from open() – strerror(errno) would be the informative value.

Also note the caller (lfs_migrate/lfs.c) already emits its own llapi_error() when this returns < 0, so this adds a duplicate line. Using llapi_error(LLAPI_MSG_ERROR, errno, ...) here (as the ENOSPC path below does) would decode errno and respect the message level instead of writing to stderr unconditionally.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS3 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 lfs: migrate compressed file without stripe info

lfs migrate file without specifying stripe info will get layout info
from the file as the target layout template, and
llapi_layout_get_by_xattr() tries to convert LOV_PATTERN_* values
to user scope LLAPI_LAYOUT_* values, while LOV_PATTERN_COMPRESS
is missed in this conversion.

This patch add a function llapi_pattern_from_lov() to handle this
conversion specifically.

This patch also add more error messages for llapi_layout_file_open().

Test-Parameters: forjanitoronly
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I49a43cc7761cd2baed7a5da7d4e7cff2152ff9bb
66615 master J ✗1B ✗T –R 0/2
LU-10026 csdc: prohibit set compression upon encrypted file
reviewing Marc Vef · build failure (#130322)
1 unique failure csdc 1 unresolved L +247 −35
69d
build failure (#130322)
janitor: 1 test failure unique to this patch — conf-sanity4@zfs:test_123aj
1 unresolved thread(s) await your reply — last from Marc Vef
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
conf-sanity4@zfs:test_123ajNEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews
build #130322 FAILURE
patchsets: PS1 06-11 PS2 08-25 PS3 08-26
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS2 2026-08-25 21:23 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS2 · 2026-08-25 21:23
[Marc Bot] upstream remarks for reference:

Rebase note: kept the base's newer compression-parameter assignment block
in lod_use_defined_striping() (gated on LOV_PATTERN_COMPRESS, with the
extension-component chunk-adjustment deferral); this patch's encryption
checks and attr threading apply on top unchanged.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS3 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: prohibit set compression upon encrypted file

Setting compression layout component upon encrypted file is not
allowed for now.

This patch add this check on MDS in creating file with layout,
adding/merging new mirror to existing file.

Test-Parameters: forjanitoronly
Test-Parameters: testlist=sanity-sec env=ONLY=67,PTLDEBUG=-1
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I60d9f4bfce3a498f1eb3994c6276afb9d89c99a7
66266 master J !B ✗T –R 0/2
LU-10026 osc: clear oi_write_osclock in lock fini func
cc Marc Vef · build failure (#130263)
csdc S +12 −4
69d
janitor run: 3 failing config(s), none unique to this patch — janitor results
build #130263 FAILURE
patchsets: PS1 05-28 PS2 06-11 PS3 06-11 PS4 08-25
tags: csdc
owner Marc Vef · uploader Marc Vef · PS4 uploaded 71d ago · NEW · open in Gerrit ↗
commit message
LU-10026 osc: clear oi_write_osclock in lock fini func

Move osc_io::oi_write_osclock clearance in osc_lock_fini() as
it's set in osc_lock_init().

Compression IO could possibly expand lock region and
osc_lock_set_writer() could access a osc_io that is not accessed
in osc_io_iter_init(), so that osc_io_rw_iter_fini() miss clearing
osc_io's oi_writer_osclock.

This patch moves the oi_write_osclock clearance in lock fini function
to match its creation in osc_lock_init().

Test-Parameters: forjanitoronly
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Ied42f5befc1abd76aa10a7666eadb9a58e1f1783
68351 master J ✗2B ✗T –R 0/2
LU-10026 llite: don't queue async IO page for inode in freeing
cc Marc Vef · build failure (#130329)
2 unique failures csdc 1 unresolved S +19 −0
70d
build failure (#130329)
janitor: 2 test failures unique to this patch — runtests@ldiskfs+DNE:test_1, runtests-ssk@ldiskfs+SharedKey:test_1
1 unresolved thread(s) await your reply — last from Marc Vef
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
runtests@ldiskfs+DNE:test_1seen in 5 other reviews
runtests-ssk@ldiskfs+SharedKey:test_1seen in 8 other reviews
build #130329 FAILURE
patchsets: PS1 08-25 PS2 08-26
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-25 21:24 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-25 21:24
[Marc Bot] upstream remarks for reference:

Port notes:

- Registered as .cio_commit_async with the current signature (the
  enum cl_io_priority argument was added upstream), next to master's
  renamed .cio_read_ahead_prep hook.
- Reviewer note: master meanwhile carries LU-17364 ("discard un-flushable
  pages on evicted inode teardown"), which addresses the same teardown
  crash from another angle; this patch is kept as an additional guard and
  may be droppable after evaluation.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS2 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 llite: don't queue async IO page for inode in freeing

When inode is being freed, do not try to queue async IO pages as
there is a race window between ll_delete_inode() and
ll_truncate_inode_pages_final(), and the queued async IO pages
cannot be teardown.

(osc_page.c:182:osc_page_delete()) Trying to teardown failed: -16
(osc_page.c:184:osc_page_delete()) ASSERTION( 0 ) failed:
(osc_page.c:184:osc_page_delete()) LBUG

    lbug_with_loc+0x64/0xb0 [libcfs]
    osc_page_delete+0x290/0x574 [osc]
    cl_page_delete0+0xb8/0x404 [obdclass]
    cl_page_delete+0x64/0x22c [obdclass]
    ll_invalidate_folio+0x114/0x2a0 [lustre]
    truncate_cleanup_folio+0x6c/0xf0
    truncate_inode_pages_range+0xf8/0x4e0
    truncate_inode_pages_final+0x54/0x80
    ll_truncate_inode_pages_final+0x40/0x520 [lustre]
    ll_delete_inode+0x68/0x25c [lustre]
    evict+0xb8/0x1a0

Test-Parameters: forjanitoronly
DDN-bug-id: EX-11006
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: If655a89faf6f979167c05c91c7b52a6c49a7884b
68399 master J –B ✗T –R -1/2−
LU-10026 tests: sanity-compr/1000d failure for ARM client
reviewing Marc Vef · build failure (#130371)
csdc S +9 −7
70d
build #130371 FAILURE
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 tests: sanity-compr/1000d failure for ARM client

aarch64 has 64K page size and compression chunk size could be adjusted
upward if it's original setting value is equal to page size, so
the test should be refined to get the actual chunk size be set.

Test-Parameters: forjanitoronly
DDN-bug-id: EX-7536
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Ide2f91e255ba886f9c1e18d1e1fe89c589f3bca1
68373 master J –B ✗T –R +0/2−
LU-10026 csdc: stop compressing incompressible file data
reviewing Marc Vef · build failure (#130347)
csdc 2 unresolved L +413 −17
70d
build failure (#130347)
2 unresolved thread(s) await your reply — last from Marc Vef
build #130347 FAILURE
reviews: Alex Zhuravlev +1 2026-08-26 12:21
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 10:37 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 10:37
[Marc Bot] upstream remarks for reference:

ci_incompressible placed in the relocated cl_io bitfield next to ci_size_extend_compression; test_1021 gate converted to compression_supported.
reply PS1 2026-08-26 11:09 Misc Code Checks Robot (Gatekeeper helper) osc_io.c:566 — error: osc_io_iter_init():'osc' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper) PS1 · 2026-08-26 11:09
error: osc_io_iter_init():'osc' dereferencing possible ERR_PTR()
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: stop compressing incompressible file data

The reduced_ratio (original_size/compress_reduced_size) represents
the minimum fraction of pages that are compressed out of each chunk,
namely the compressed chunk needs to shrink by at least
1/reduced_ratio blocks for it to be "compressible".

Let size compression_ratio be defined as
original_size/after_compression_size, so

reduced_ratio = compression_ratio / (compression_ratio - 1)

and we set its default value to 16, equivalent to 1.07 of compression
ratio (i.e. needs to shrink at least one 4KB block out of each 64KB
chunk).

After every compress_check_bytes of data being compressed, file's
compressibility would be re-calculated based on average
compress_reduced and average compress_orig data size.

Stop compressing file data if it is deemed to be incompressible, and
after compress_skip_bytes data have been written uncompressed , retry
the file compressibility check.

compress_reduced_ratio, compress_check_bytes, compress_skip_bytes
are tunable parameters:
	osc.*.compress_reduced_ratio
	osc.*.compress_check_bytes
	osc.*.compress_skip_bytes
their default values are 16, 1M and 32M respectively.

tests: use /dev/zero as compressible source

in test 1021 as hdf file has few incompressible chunks and this
breaks the test infrequently.

DDN-bug-id: EX-10857
Was-Change-Id: Iba29d9e654a245d3c0cbb14a8b7dbb9f847f52d5

Test-Parameters: forjanitoronly
DDN-bug-id: EX-8355
Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I4ce3d752c67f18ba7b100c72a2bb61a91258c6e8
68405 master J !B ✗T –R 0/2
LU-10026 cdsc: update layout compressibility
reviewing Marc Vef · build failure (#130377)
csdc 4 unresolved L +335 −54
70d
build failure (#130377)
4 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 3 failing config(s), none unique to this patch — janitor results
build #130377 FAILURE
no vote yet: Alex Zhuravlev
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 12:51 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 12:51
[Marc Bot] upstream remarks for reference:

- OBD_CONNECT2_UPDATE_LAYOUT was already reserved on master at the same bit; only the MDT_CONNECT_SUPPORTED2 and client connect lists needed the addition.
- ci_need_change_layout added to the current cl_io bitfield; CAT_COMPRESSIBLE handling merged into the current vvp_attr_update().
- mdd_layout_update_pccro was renamed/extended per the patch on the current (retry-aware) master form.
- FORMATTED_BUF_LEN (used by the new getstripe formatting) is defined locally - the source branch carries it from an unrelated change.
- test_1021 layout-flag assertions applied unconditionally (the original wrapped them in version gates).
reply PS1 2026-08-26 13:38 Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:297 — error: vvp_layout_minor_change():'vob' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper) PS1 · 2026-08-26 13:38
error: vvp_layout_minor_change():'vob' dereferencing possible ERR_PTR()
reply PS1 2026-08-26 13:38 Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:429 — error: vvp_io_fini():'vob' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper) PS1 · 2026-08-26 13:38
error: vvp_io_fini():'vob' dereferencing possible ERR_PTR()
reply PS1 2026-08-26 13:38 Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:1973 — error: vvp_io_init():'vob' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper) PS1 · 2026-08-26 13:38
error: vvp_io_init():'vob' dereferencing possible ERR_PTR()
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 cdsc: update layout compressibility

When compressing write changes the file's compressibility, it updates
the file layout flags so that its compressibility persists.

lod: reset la_attr at declare

to avoid unplanned local attributes update during minor layout change.

DDN-bug-id: EX-10786
Was-Change-Id: I093efeb9cf110adfe6a7590091e60b1e9f1eb9ed

Test-Parameters: forjanitoronly
DDN-bug-id: EX-8355
Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Ia2964817d1b5fee2d84ef15e9f1036882d70adb2
66284 master J –B ✗T –R -1/2−
LU-10026 csdc: handle data compression on MDT
reviewing Marc Vef · build failure (#130318)
csdc 4 unresolved S +39 −1
70d
build failure (#130318)
4 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
build #130318 FAILURE
patchsets:
+2 earlier PS1 05-28 PS2 06-11
PS3 06-11 PS4 06-11 PS5 06-11 PS6 08-25 PS7 08-26
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS5 2026-07-15 00:57 Gerrit AI review for Lustre COMMIT_MSG:9 — (minor) The body explains the DoM+compress block, but two hunks pull the other way and aren't mentioned: lov_pattern_available() gains LOV_P
Gerrit AI review for Lustre PS5 · 2026-07-15 00:57
(minor) The body explains the DoM+compress block, but two hunks pull the other way and aren't mentioned: lov_pattern_available() gains LOV_PATTERN_MDT | LOV_PATTERN_COMPRESS, and llapi_pattern_to_lov() gains MDT|COMPRESS and RAID0|COMPRESS cases. Both make the combination more acceptable, not less. Could the message cover why they belong in a patch whose stated purpose is to disallow it?
reply PS5 2026-07-15 00:57 Gerrit AI review for Lustre lustre_user.h:837 — (defect) This makes the server accept an MDT|COMPRESS component (lod_lov.c / lov_ea.c call lov_pattern_available()), yet lov_pattern_support
Gerrit AI review for Lustre PS5 · 2026-07-15 00:57
(defect) This makes the server accept an MDT|COMPRESS component (lod_lov.c / lov_ea.c call lov_pattern_available()), yet lov_pattern_supported() still excludes it, so client IO marks such an entry invalid (lov_object.c sets lle_valid = 0). The only guard against creating it lives in lfs.c; a liblustreapi caller doing llapi_layout_pattern_set(MDT) + llapi_layout_compress_set() bypasses that and produces a layout the server stores but IO cannot use. If DoM+compress is unsupported, should the block live in the library/server rather than only the CLI?
reply PS5 2026-07-15 00:57 Gerrit AI review for Lustre lfs.c:3459 — (defect) errno is set to a negative value here; every other error path in comp_args_to_layout() uses errno = EINVAL. A negative errno breaks
Gerrit AI review for Lustre PS5 · 2026-07-15 00:57
(defect) errno is set to a negative value here; every other error path in comp_args_to_layout() uses errno = EINVAL. A negative errno breaks strerror(errno)/perror on this -1 return. Should be errno = EINVAL.
reply PS5 2026-07-15 00:57 Gerrit AI review for Lustre liblustreapi_layout.c:831 — (minor) These two cases look unreachable. The COMPRESS bit never reaches llc_pattern: llapi_layout_pattern_set() rejects any pattern carryin
Gerrit AI review for Lustre PS5 · 2026-07-15 00:57
(minor) These two cases look unreachable. The COMPRESS bit never reaches llc_pattern: llapi_layout_pattern_set() rejects any pattern carrying it, and llapi_layout_from_lum() stores compression in llc_compr_type, not the pattern. The bit is OR'd into lmm_pattern separately in llapi_layout_to_lum() (blob->lmm_pattern |= LOV_PATTERN_COMPRESS). Was a real caller intended, or can these be dropped?
tags: csdc
owner Marc Vef · uploader Marc Vef · PS7 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: handle data compression on MDT

Do not support setting data compression component on DoM until
data compression on MDT implemented.

DDN-bug-id: EX-7806
Was-Change-Id: I3794460140f08a073377c418dd56e7dda907d96d

Test-Parameters: forjanitoronly
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I8b5c4d5fd18033e796b1c7555c37251e4f7f9a49
65762 master J ✗1B ✓T ✗1R 0/2
LU-10026 csdc: prefer uncompressed mirror for read and write
reviewing Marc Vef · janitor: 1 test failure unique to this patch — sanity3@zfs:test_907
1 unique failure csdc 4 unresolved L +213 −47
74d
janitor: 1 test failure unique to this patch — sanity3@zfs:test_907
enforced failed: review-dne-selinux-ssk-part-2
4 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
sanity3@zfs:test_907seen in 57 other reviews
failed enforced testplatformdetail
review-dne-selinux-ssk-part-2 RHEL 8.10 / x86_64 ran 7 tests. 1 tests failed: sanity-sec. session
build #129912 SUCCESS · tests all Maloo sessions
no vote yet: James Simmons, Andreas Dilger, Artem Blagodarenko
patchsets:
+7 earlier PS1 05-08 PS2 05-28 PS3 05-28 PS4 06-11 PS5 06-11 PS6 07-27 Artem Blagodarenko PS7 07-28 Artem Blagodarenko
PS8 08-19 Artem Blagodarenko PS9 08-19 Artem Blagodarenko PS10 08-20 Artem Blagodarenko PS11 08-20 Artem Blagodarenko PS12 08-21 Artem Blagodarenko
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS12 2026-08-22 12:56 Gerrit AI review for Lustre lod_lov.c:622 — This bonus is added once per allocated stripe, which is exactly the weight the OS_STATFS_NONROT bonus a few lines above uses, so the two can
Gerrit AI review for Lustre PS12 · 2026-08-22 12:56
This bonus is added once per allocated stripe, which is exactly the weight the OS_STATFS_NONROT bonus a few lines above uses, so the two can cancel out.

Two mirrors, no LCME_FL_PREF_WR anywhere, one stripe each:

    mirror 0: compressed,   stripe on a NONROT OST -> pref = 1
    mirror 1: uncompressed, stripe on a rotating OST -> pref = 1

lme_preference ties, so the `!found_preferred` fallback below keeps the lower index (`>` is strict) and sets lme_prefer on mirror 0. lod_primary_pick() then classifies mirror 0 as case B (preferred + compressed) and mirror 1 as case C, and B outranks C, so the write goes to the compressed mirror.

A wider compressed mirror wins outright rather than tying: 4 NONROT stripes compressed = 4 vs 1 NONROT stripe uncompressed = 2.

Mixed flash/disk mirrors are the case the non-rotational preference was added for, so this is not an exotic layout. Should the uncompressed bonus be on a different scale than the per-stripe NONROT count (or applied once per mirror) so it can't be traded away against OST speed?

The comment also says "mirror", but this sits in the per-stripe loop of one component.
reply PS12 2026-08-22 12:56 Gerrit AI review for Lustre lod_object.c:8060 — (style) Not a bug, but this comment has a UTF-8 em dash in it; the rest of the tree is plain ASCII. A plain '-' would do.
Gerrit AI review for Lustre PS12 · 2026-08-22 12:56
(style) Not a bug, but this comment has a UTF-8 em dash in it; the rest of the tree is plain ASCII. A plain '-' would do.
reply PS12 2026-08-22 12:56 Gerrit AI review for Lustre lod_object.c:8088 — Ranking B (preferred + compressed) above C (uncompressed) reads as "an explicit `lfs setstripe --flags=prefer` beats the compression heurist
Gerrit AI review for Lustre PS12 · 2026-08-22 12:56
Ranking B (preferred + compressed) above C (uncompressed) reads as "an explicit `lfs setstripe --flags=prefer` beats the compression heuristic". But lme_prefer is not only user intent: when no component carries LCME_FL_PREF_WR, lod_fill_mirrors() picks the highest lme_preference non-stale mirror and sets lme_prefer = 1 on it.

So tier B is reachable on a file the user never flagged, and the heuristic ends up overriding its own compression preference. Should case B be restricted to mirrors that actually carry LCME_FL_PREF_WR, or should the synthesized preference be tracked separately from the user flag?
reply PS12 2026-08-22 12:56 Gerrit AI review for Lustre lov_io.c:662 — (minor) ci_ndelay_tried > 0 means "not the first lov_io_mirror_init() for this env", which is broader than "this is an FLR error retry".
Gerrit AI review for Lustre PS12 · 2026-08-22 12:56
(minor) ci_ndelay_tried > 0 means "not the first lov_io_mirror_init() for this env", which is broader than "this is an FLR error retry".

ll_file_io_generic() restarts the io for reasons unrelated to mirror failure and preserves the counter:

    partial_io -> io->ci_need_restart = 1   (file.c)
    retried = io->ci_ndelay_tried; goto restart;

A single buffered read larger than max_io_bytes therefore takes the uncompressed mirror for the first chunk only; from the second chunk on ci_ndelay_tried is non-zero, lis_mirror_index has been advanced by one, and the first in-range mirror is accepted even when it is compressed. The layout-change restart in vvp_io_iter_init() has the same shape.

Would gating on something that only the -EAGAIN mirror-failover path sets (io->ci_tried_all_mirrors, or a dedicated flag set where cl_io_loop() retries) keep the failover fix without giving up the preference on ordinary io continuation?
tags: csdc
owner Marc Vef · uploader Artem Blagodarenko · PS12 uploaded 76d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: prefer uncompressed mirror for read and write

When accessing a mirrored file with both compressed and uncompressed
components, choose uncompressed components for read (lov_io.c).

When writing to mirrored files with both compressed and uncompressed
mirrors, prefer the uncompressed components to write; this is better
for performance, more compatible with older clients, and better fits
the model of compressing files after initial write. The write-side
preference is implemented via lod_fill_mirrors() and lod_primary_pick()
using a new lme_compressed flag.

Note: the changes to lod_fill_mirrors() and lod_primary_pick() affect
all FLR files, not only those with compressed mirrors. Plain FLR writes
will also use the updated preferred-mirror selection logic.

DDN-bug-id: EX-6510
Was-Change-Id: I62a117d5cc3d34e2c0c96d1a9ade8eef0a2d1291

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Artem Blagodarenko <ablagodarenko@gmail.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I043b27bd891c039901075a08c76630f8f0f9f182
65761 master J !B ✓T ✗1R 0/2
LU-10026 utils: add 'lfs find' support for compressed file
reviewing Marc Vef · enforced failed: review-dne-selinux-ssk-part-2
csdc 9 unresolved L +715 −67
74d
enforced failed: review-dne-selinux-ssk-part-2
9 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor run: 4 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-selinux-ssk-part-2 RHEL 8.10 / x86_64 ran 7 tests. 1 tests failed: sanity-sec. session
build #129911 SUCCESS · tests all Maloo sessions
no vote yet: James Simmons, Andreas Dilger, Artem Blagodarenko
patchsets:
+12 earlier PS1 05-08 PS2 05-28 PS3 05-28 PS4 06-11 PS5 06-11 PS6 06-17 Artem Blagodarenko PS7 06-18 Artem Blagodarenko PS8 07-24 Artem Blagodarenko PS9 07-27 Artem Blagodarenko PS10 07-27 Andreas Dilger PS11 07-27 Andreas Dilger PS12 07-27 Andreas Dilger
PS13 08-19 Artem Blagodarenko PS14 08-19 Artem Blagodarenko PS15 08-20 Artem Blagodarenko PS16 08-20 Artem Blagodarenko PS17 08-21 Artem Blagodarenko
threads: 9 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre COMMIT_MSG:9 — (minor) The first three bullets read as new functionality, but `--comp-flags=[^]compress` and `--comp-flags=[^]nocompr` already work (LCME_F
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(minor) The first three bullets read as new functionality, but `--comp-flags=[^]compress` and `--comp-flags=[^]nocompr` already work (LCME_FL_COMPRESS/LCME_FL_NOCOMPR are in comp_flags_table[]), and so does `-L compress` (LOV_PATTERN_COMPRESS is in lov_pattern_names[]). This patch documents them and adds test coverage rather than adding them. Could the wording say "document" for those three, so the message matches the diff?
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre lustre_user.h:3278 — (style) COMPR_LEVEL_MAX is already defined with the same value earlier in this header, just after `enum ll_compr_type`, with a comment expla
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(style) COMPR_LEVEL_MAX is already defined with the same value earlier in this header, just after `enum ll_compr_type`, with a comment explaining it. Two definitions can drift apart later; can this one be dropped?
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre sanity-pfl.sh:3078 — (style) extra blank line. Also z1..z4 here, and `expect` in test_100d, are not declared `local`.
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(style) extra blank line. Also z1..z4 here, and `expect` in test_100d, are not declared `local`.
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre lfs.c:4637 — (style) not a bug, but `compress-chunk` already appears in this long_opts[] further down, so it is listed twice now. getopt_long takes the f
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(style) not a bug, but `compress-chunk` already appears in this long_opts[] further down, so it is listed twice now. getopt_long takes the first match so it still works; `compr-chunk` looks like the only new alias actually needed here.
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre lfs.c:8226 — (typo) this comment uses a UTF-8 em dash; the tree is otherwise plain ASCII. Same in the `%LZ` directory-branch comment in liblustreapi_pfin
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(typo) this comment uses a UTF-8 em dash; the tree is otherwise plain ASCII. Same in the `%LZ` directory-branch comment in liblustreapi_pfind.c.
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre lfs.c:8248 — (defect) atoi() cannot report a parse failure, so `--compr-level=abc` silently becomes level 0, and `--compr-level=+abc` becomes "level > 0"
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(defect) atoi() cannot report a parse failure, so `--compr-level=abc` silently becomes level 0, and `--compr-level=+abc` becomes "level > 0", i.e. every compressed component. The unsigned range check above cannot catch it.

`-Z gzip:abc` is rejected by llapi_parse_compress_type(), and the setstripe `--compress-level` path uses strtol() with an end-pointer check, so the three spellings of the same thing disagree. strtol() plus `*end != '\0'` here would line them up.
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre liblustreapi_pfind.c:509 — (minor) This helper backs every numeric `lfs find` predicate, and the new exact-match branch only changes behaviour when `margin == 0`. `lfs
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(minor) This helper backs every numeric `lfs find` predicate, and the new exact-match branch only changes behaviour when `margin == 0`. `lfs find -z N` with a plain number is such a caller: lfs.c does `fp_ext_size_units /= SEL_UNIT_SIZE`, so 1/1024 becomes 0, and an exact `-z` match that previously reported "no match" now matches. That may well be desirable, but it is a silent change to an unrelated option.

The new compression predicates are the only callers passing margin 0; the rest pass 1 or a unit size, and with margin 1 this function already returns 1 on an exact match. Passing 1 there would avoid touching the shared helper, and would also make `--compr-level=-N` / `--compr-chunk=-N` mean "< N" like `-c -N`, `--size -N` and friends, rather than "<= N".

The table above the function (rows 5 and 6, and the note about the interval `(limit - margin, limit]`) no longer describes the code either.
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre liblustreapi_pfind.c:975 — (defect) Negation is handled differently for level/chunk than for type. `fp_exclude_compr_lvl` is passed into find_value_cmp() as `negopt`,
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(defect) Negation is handled differently for level/chunk than for type. `fp_exclude_compr_lvl` is passed into find_value_cmp() as `negopt`, so `found_lvl` ends up meaning "some component does not match" instead of "no component matches", and the aggregation here then ignores the exclude flag entirely - unlike the fp_check_compr_type block just above.

For a file with two compressed components, level 3 and level 5:

    lfs find ! --compr-level=3 dir

entry(lvl 5) makes find_value_cmp() return -1, negopt flips it to 1, found_lvl is set, and the file is reported - even though it does have a level-3 component. The equivalent `! --compr-type=gzip` on a gzip+lz4 file correctly does not match.

Should the level and chunk comparisons drop the negopt argument and be inverted here the same way type is?
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre liblustreapi_pfind.c:1771 — (defect) `fp_lum_size` is the size common_param_init() allocated for the lmd buffer (>= XATTR_SIZE_MAX, 64KiB), not the length of the layout
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(defect) `fp_lum_size` is the size common_param_init() allocated for the lmd buffer (>= XATTR_SIZE_MAX, 64KiB), not the length of the layout stored in it.

For a non-composite lum, llapi_layout_get_by_xattr() never narrows that value, so llapi_layout_objects_in_lum() computes (65536 - 32) / 24 = 2729 objects and __llapi_comp_alloc() rejects it with EINVAL because 2729 > LOV_MAX_STRIPE_COUNT (2000).

So this call fails for every plain V1/V3 file and always falls through to llapi_layout_get_by_path(); only composite layouts reach the new path, because the entry loop resets the size to `ent->lcme_size`. Passing the actual layout length instead would make the fast path work for non-PFL files too.
tags: csdc
owner Marc Vef · uploader Artem Blagodarenko · PS17 uploaded 76d ago · NEW · open in Gerrit ↗
commit message
LU-10026 utils: add 'lfs find' support for compressed file

* Add "--comp-flags=[^]compress" to locate file with/without
  compressed components.
* Add "--comp-flags=[^]nocompr" to locate file with/without setting
  component compress preference.
* Add "[!] --layout=compress" to locate file with/without compressed
  components.
* Add "[!] --compress-type=<compress-type>" to locate compressed file
  with/without specified compress algorithm.
* Add "[!] --compress-level=[+-]<compress-level>" to locate compressed
  file with/without specified compress level.
* Add "[!] --compress-chunk=[+-]<compress-chunk>" to locate compressed
  file with/without specified compress chunk in KiB.

utils: add -Z option for 'lfs getstripe/find'

Add support for "lfs getstripe -Z" to get the last instantiated
component compression information.

Add support for "lfs find -Z <type>[:[+-]<level>]" to keep consistent
options with "lfs setstripe -Z".
DDN-bug-id: EX-6856
Was-Change-Id: Ia5e2a2ea6937dc2b46e224cec808504a196b974c

utils: logical AND for 'lfs find' compression exprs

All search expressions provided to 'lfs find' must be combined as a
logical AND. Fix newly added options for compression support, so that
they comply with this logical AND.
DDN-bug-id: EX-7714
Was-Change-Id: I3b28cd87c1d304df6d04753b413d46f5abcfe16e

csdc: don't set compression layout when disabled

When llite_enable_compression is disabled
(lfs set_param llite.*.enable_compression=0), we should check
it before sending it to MDS lest we get a file with compressed
component which we cannot handle.
DDN-bug-id: EX-7593
Was-Change-Id: Ib1e2123ffdb239c3e1401d682ae9c2c49e3f4a6f

utils: support 'lfs find --printf %LZ'

Add support for "lfs find --printf %LZ" to print the compression
type:level of the last instantiated component of a file.
DDN-bug-id: EX-6856
Was-Change-Id: Iaf1b6c031b06c70e7b5be51354697aa6bdcc9850

csdc: right error code in case compression is disabled

Currently, if compression is disabled on a client the error
message is confusing "Cannot set layout EA: Unknown error 524"

Let's replace the error code from  ENOTSUPP to EOPNOTSUPP,
so error messages become more informative

ctl get_param -n llite.*.enable_compression
0
lfs setstripe -i 0 -c 1 -E -1 -Z lz4 /mnt/lustre/foo.txt
Cannot set layout EA: Operation not supported
lfs setstripe: cannot create composite file
'/mnt/lustre/foo.txt': Inappropriate ioctl for device

This message could be even more informative, but this version
is already much better.
DDN-bug-id: EX-10577
Was-Change-Id: I7fd67d5d3d20bc7de169f35f6fa63b53f2bfe718

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Ic36946738c3463fd862aeca4ee2e2c2ed85eff84
57572 master J !B ✓T ✓R -1/2−
LU-18592 lod: protect lod in-memory layout's change
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase 9 unresolved M +80 −31
78d
needs rebase — checkpatch: cannot be cherry-picked
9 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
CI green — no vote yet from Qian Yingjin, Andreas Dilger, Lai Siyao, Patrick Farrell
janitor run: 1 failing config(s), none unique to this patch — janitor results
11 optional test failure(s) — informational
build #127622 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Andreas Dilger, Lai Siyao, Patrick Farrell
patchsets:
+7 earlier PS1 12-23 PS2 12-23 PS3 01-03 PS4 01-10 PS5 02-14 Peter Jones PS6 02-28 PS7 08-22
PS8 09-04 PS9 09-05 PS10 09-10 PS11 09-24 PS12 07-15
threads: 9 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre COMMIT_MSG:9 — The body explains why lod_layout_mutex is needed, but two hunks aren't accounted for:
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
The body explains why lod_layout_mutex is needed, but two hunks aren't accounted for:

- `lo->ldo_flr_state = 0;` added to the plain-layout branch of lod_parse_striping()
- the extra `!lo->ldo_is_composite ||` term in the lod_declare_update_extents() assertion

Could the body say what each of those is for? As written the text reads as if the assertion should stop firing for plain layouts, but the code makes it fire more often (see the inline comment).
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre COMMIT_MSG:18 — This fixes an LBUG, so it would help to carry a Fixes: tag. The assertion being hit was added by:
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
This fixes an LBUG, so it would help to carry a Fixes: tag. The assertion being hit was added by:

    Fixes: ff5eb304fa37 ("LU-10070 lod: SEL: Implement basic spillover space")

That commit introduced lod_declare_update_extents() together with `if (lo->ldo_flr_state == LCM_FL_NONE) LASSERT(start_index == 0 && max_comp == lo->ldo_comp_cnt);` and the unlocked access to ldo_mirrors[]/ldo_comp_cnt that this change now serializes.
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre lod_lov.c:1362 — The same reset looks missing in the other two places that build a plain in-core layout after freeing the old one:
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
The same reset looks missing in the other two places that build a plain in-core layout after freeing the old one:

- lod_use_defined_striping() (lod_qos.c:2217) sets `mo->ldo_is_composite = 0` for LOV_MAGIC_V1/V3 with no ldo_flr_state reset
- lod_qos_parse_config() (lod_qos.c:2557) does the same after lod_free_comp_entries()

lod_free_comp_entries() clears ldo_mirrors, ldo_mirror_count and ldo_is_composite but not ldo_flr_state, so a composite-to-plain transition through either of those still leaves a stale value. lod_declare_layout_change() then dispatches on it, e.g. into lod_declare_update_rdonly() whose `LASSERT(lo->ldo_mirror_count > 0)` cannot hold for a plain layout. Should those get the same fix?
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre lod_object.c:7591 — Adding `!lo->ldo_is_composite ||` widens the guard rather than narrowing it: `A || B` is true whenever `B` is true, so the LASSERT is now ev
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
Adding `!lo->ldo_is_composite ||` widens the guard rather than narrowing it: `A || B` is true whenever `B` is true, so the LASSERT is now evaluated in strictly more cases than before, and the plain-layout case (`ldo_is_composite == 0`) now always evaluates it.

The commit message says ldo_flr_state is only meaningful for a composite layout and that a plain file "could get into lod_declare_update_plain()->lod_declare_update_extents() and bump into this assertion", which reads like the intent was to exempt plain layouts:

    if (lo->ldo_is_composite && lo->ldo_flr_state == LCM_FL_NONE)

With `||`, a plain file in the state that produced the LU-18592 LBUG (flr_state == LCM_FL_NONE, stale ldo_mirrors) still hits the same assertion. Which of the two is intended?
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre lod_object.c:7785 — Changing `RETURN(-EALREADY)` into `GOTO(out_unlock, rc = -EALREADY)` also routes this through `out:`, so the -EALREADY case now calls lod_st
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
Changing `RETURN(-EALREADY)` into `GOTO(out_unlock, rc = -EALREADY)` also routes this through `out:`, so the -EALREADY case now calls lod_striping_free() and drops the cached layout. Previously it returned with the cache intact.

mdd_layout_instantiate_component() turns -EALREADY into success, so every layout-write intent on an already-instantiated component now throws away the in-memory striping and forces a re-read of the LOV EA. Is that intended, or should this path skip the free?
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre lod_object.c:8613 — This isn't a bug today, but making the unlock conditional on `rc` is fragile: `out:` is reached both by fall-through with the mutex already
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
This isn't a bug today, but making the unlock conditional on `rc` is fragile: `out:` is reached both by fall-through with the mutex already released (rc == 0) and by `GOTO(out, ...)` with it still held. It only works because every goto to `out:` happens to set rc != 0 -- a future `GOTO(out, rc = 0)`, or a `lod_declare_update_extents()` return of 0 being propagated, silently leaks the mutex.

A dedicated `out_unlock:` label above `out_free:` (as was done in lod_declare_update_plain()) would make the lock state structural instead of value-dependent. Same shape in lod_declare_update_write_pending() and lod_declare_update_sync_pending().
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre lod_object.c:8825 — This assignment to ldo_flr_state is still outside ldo_layout_mutex, but lod_declare_update_write_pending() now takes the mutex and then asse
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
This assignment to ldo_flr_state is still outside ldo_layout_mutex, but lod_declare_update_write_pending() now takes the mutex and then asserts on the value:

    lod_declare_update_sync_pending()      lod_striping_reload()
      lo->ldo_flr_state = WRITE_PENDING      mutex_lock(ldo_layout_mutex)
                                             lod_parse_striping()
                                               lo->ldo_flr_state = <from disk>
                                             mutex_unlock()
      lod_declare_update_write_pending()
        mutex_lock(ldo_layout_mutex)
        LASSERT(ldo_flr_state == LCM_FL_WRITE_PENDING)  <- fires

Since this is the same class of problem the patch is fixing, should the state transition move inside the mutex (or the mutex be taken here and passed down)?
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre lod_qos.c:1582 — This isn't a bug, but `layout_lcked` is spelled `layout_locked` in every sibling function (lod_check_and_reserve_ost(), lod_ost_alloc_rr(),
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
This isn't a bug, but `layout_lcked` is spelled `layout_locked` in every sibling function (lod_check_and_reserve_ost(), lod_ost_alloc_rr(), lod_ost_alloc_specific(), lod_qos_prep_create()). Worth making it consistent if the patch is refreshed.
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre lod_qos.c:3138 — This is the one remaining caller passing `false`, and it leaves the two lock orders divergent:
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
This is the one remaining caller passing `false`, and it leaves the two lock orders divergent:

    lod_prepare_create()                    -> lod_ost_alloc_{qos,rr}()
                                               lq_rw_sem / ltd_rw_sem held
                                               -> lod_comp_is_ost_used(..., false)
                                                  -> mutex_lock(ldo_layout_mutex)

    lod_declare_update_plain()  mutex_lock(ldo_layout_mutex)
                                -> lod_declare_instantiate_components()
                                   -> lod_qos_prep_create(..., true)
                                      -> lod_ost_alloc_qos() down_write(lq_rw_sem)

So ldo_layout_mutex is now above lq_rw_sem on the new paths and below it here. This isn't reachable as a hang today (the MDT holds the layout LDLM lock EX for both entry points on a given object), but it makes the ordering depend on an unrelated lock. Would it be cleaner to have lod_prepare_create() take ldo_layout_mutex too and pass `true` everywhere, so lod_obj_for_each_stripe() never has to acquire it as an inner lock?

Related: the new critical section now spans OST allocation, which includes a `down_write_killable()` with a 2s timer in lod_ost_alloc_qos() and lod_sub_declare_create() on OSP objects, so the per-object layout mutex is held far longer than before.
owner Zhenyu Xu · uploader Zhenyu Xu · PS12 uploaded 112d ago · NEW · open in Gerrit ↗
commit message
LU-18592 lod: protect lod in-memory layout's change

The lod::ldo_flr_state is only meaningful for composite layout, while
a plain file could get into lod_declare_update_plain()->
lod_declare_update_extents() and bump into this assertion.

lod_declare_update_extents() ) ASSERTION(start_index == 0 &&
	max_comp == lo->ldo_comp_cnt)

And lod_declare_update_extents() would modify lod's layout, it needs
lod_layout_mutex's protection for consistence.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I2b3d32b32efb88317c124a7975dfd9889333bc8a
59350 master J !B ✓T ✗1R -1/1−
LU-19037 osc: initialize osc_object::oo_tree
mine enforced failed: review-dne-part-5
1 unresolved XS +1 −0
89d
enforced failed: review-dne-part-5
Timothy Day voted -1
1 thread(s) waiting on others
janitor run: 1 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-part-5 failed 2× RHEL 9.5 / x86_64 ran 5 tests. 1 tests failed: sanityn. session
1 optional test failure(s) — informational
build #114129 SUCCESS · tests all Maloo sessions
reviews: Timothy Day -1 2026-08-07 15:40
no vote yet: Qian Yingjin, Andreas Dilger, Patrick Farrell
patchsets:
+4 earlier PS1 05-21 PS2 05-22 PS3 05-22 PS4 05-22
PS5 05-27 PS6 05-27 PS7 06-03 PS8 06-06 PS9 06-10
threads: 0 need your reply · 1 waiting on others · 0 own notes · 0 bot
owner Zhenyu Xu · uploader Zhenyu Xu · PS9 uploaded 513d ago · NEW · backport · open in Gerrit ↗
commit message
LU-19037 osc: initialize osc_object::oo_tree

Initialize the radix tree of osc_object::oo_tree.

Lustre-change: https://review.whamcloud.com/59340
Lustre-commit: 1f4d2013929bd61f775e6c98a4122fe143b4242b

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Change-Id: I77a19cb08ccc52f4eb3457cd3367884b84624054
65013 master J !B ✓T ✓R -1/2−
LU-20066 obdclass: cache obd_name in client_obd
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase 2 unresolved S +15 −1
94d
needs rebase — checkpatch: cannot be cherry-picked
2 unresolved thread(s) await your reply — last from Andreas Dilger
CI green, no reviews yet — add reviewers
janitor run: 4 failing config(s), none unique to this patch — janitor results
6 optional test failure(s) — informational
build #123263 SUCCESS · tests all Maloo sessions
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-04-07 10:36 Andreas Dilger lustre_osc.h:738 — This could also crash if `cl_obd_name` is not allocated? It would be better to make this a static `char cl_obd_name[OBD_NAME_MAX]` buffer t
Andreas Dilger PS1 · 2026-04-07 10:36
This could also crash if `cl_obd_name` is not allocated?  It would be better to make this a static `char cl_obd_name[OBD_NAME_MAX]` buffer to avoid that.

There are 34 bytes of holes in `struct client_obd` that could be packed a bit better, and this struct is already 3640 bytes in size, so adding a bit more is not _quite_ going to push it over the 4096-byte size.
reply PS1 2026-04-07 10:36 Andreas Dilger ldlm_lib.c:579 — (style) `obd_name` is a fixed-size buffer, why not use the same instead of allocating a separate buffer? Otherwise, it seems possible that
Andreas Dilger PS1 · 2026-04-07 10:36
(style) `obd_name` is a fixed-size buffer, why not use the same instead of allocating a separate buffer?  Otherwise, it seems possible that the import is accessed without `cl_obd_name` being allocated and *that* will crash...
owner Zhenyu Xu · uploader Zhenyu Xu · PS1 uploaded 218d ago · NEW · open in Gerrit ↗
commit message
LU-20066 obdclass: cache obd_name in client_obd

client_obd's cli_import could be freed when the obd is being cleaned
up, while in shrinker, we need to print the obd_name, which could
cause use after free. This patch adds a new field cli_obd_name to
cache the obd_name to avoid use after free.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ic0434b9facd5eb2ef4f5df56c871ea6c4d0d8dc1
58276 master J ✓B ✓T ✓R -1/2−
LU-17771 debug: getstripe -r to recursively getstripe
mine needs rebase — checkpatch: cannot be cherry-picked
needs rebase stalled 372d 2 unresolved S +13 −12
372d
needs rebase — checkpatch: cannot be cherry-picked
2 unresolved thread(s) await your reply — last from Arshad Hussain
CI green — no vote yet from Andreas Dilger
1 optional test failure(s) — informational
build #116925 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets: PS1 03-03 PS2 09-24 Arshad Hussain PS3 09-24 Arshad Hussain PS4 09-25 Arshad Hussain
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2025-03-08 19:55 Arshad Hussain sanity.sh:7759 — We should check for error here '... || error "nnn"'
Arshad Hussain PS1 · 2025-03-08 19:55
We should check for error here '... || error "nnn"'
reply PS1 2025-03-08 19:55 Arshad Hussain sanity.sh:7767 — This change is correct.
Arshad Hussain PS1 · 2025-03-08 19:55
This change is correct.
owner Zhenyu Xu · uploader Arshad Hussain · PS4 uploaded 406d ago · NEW · open in Gerrit ↗
commit message
LU-17771 debug: getstripe -r to recursively getstripe

'-r' is the correct option to recursively get the stripe information
under a directory.

'-R' is for printing layout information without substituting the
filesystem's default values for unspecified fields.

Test-Parameters: trivial testlist=sanity env=ONLY=56s, ONLY_REPEAT=100
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ib6ef3ddb431e5f33a070c6ea435b7821b8fabb9d
55547 master J ✓B ✓T ✓R 0/2
LU-17981 test: replay-single/test_46 ineffective
mine 1 unresolved thread(s) await your reply — last from Andreas Dilger
stalled 384d 1 unresolved XS +1 −1
384d
1 unresolved thread(s) await your reply — last from Andreas Dilger
CI green — no vote yet from Andreas Dilger
build #108438 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets: PS1 06-27 PS2 09-11 PS3 10-22 Andreas Dilger
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS3 2025-10-17 00:32 Andreas Dilger replay-single.sh:1083 — (minor) it would be better to confirm that "FID" had something in it? Otherwise the "grep didn't find anything" is too easily broken.
Andreas Dilger PS3 · 2025-10-17 00:32
(minor) it would be better to confirm that "FID" had something in it?  Otherwise the "grep didn't find anything" is too easily broken.

Also, add a comment in the code where this "force closing file handle" message is printed to ensure it is not changed.
owner Zhenyu Xu · uploader Andreas Dilger · PS3 uploaded 743d ago · NEW · open in Gerrit ↗
commit message
LU-17981 test: replay-single/test_46 ineffective

Should pass path of the test file to "lfs path2fid" to make it
an effective test.

Fixes: c0fa0ba4a8 ("LU-12368 ptlrpc: make DEBUG_REQ messages consistent")
Test-Parameters: trivial testlist=replay-single env=ONLY=46
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I8f7de367aee356e3d7db97f57a130c9b004f2942
54528 master J !B ✓T ✗2R -1/2−
LU-17663 osc: extent find only care for write
mine enforced failed: review-ldiskfs
stalled 457d S +4 −29
457d
enforced failed: review-ldiskfs
Alexey Lyashkov voted -1
janitor run: 1 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-ldiskfs RHEL 8.9 / x86_64, RHEL 9.3 / x86_64 ran 5 tests. 1 tests failed: sanity. session
review-ldiskfs RHEL 9.3 / x86_64 ran 5 tests. 1 tests failed: sanity. session
2 optional test failure(s) — informational
build #108831 SUCCESS · tests all Maloo sessions
reviews: Alexey Lyashkov -1 2024-11-05 18:38
no vote yet: Qian Yingjin, Andreas Dilger, Patrick Farrell
patchsets: PS1 03-22 PS2 07-31 PS3 09-18 PS4 11-05
owner Zhenyu Xu · uploader Zhenyu Xu · PS4 uploaded 729d ago · NEW · open in Gerrit ↗
commit message
LU-17663 osc: extent find only care for write

Don't use read lock in extent, read with different regions have
different compatible read locks.

Fixes: 67aca1fcc6 ("LU-16160 osc: take ldlm lock when queue sync pages")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Iceb05eb22744debc2e8122ef3ee451d149d79195
55918 master J ✗1B ✓T …R 0/2
LU-17993 debug: to reveal page count issue
mine janitor: 1 test failure unique to this patch — sanity2@ldiskfs+DNE:test_398c
1 unique failure stalled 457d 8 unresolved M +79 −3
457d
janitor: 1 test failure unique to this patch — sanity2@ldiskfs+DNE:test_398c
5 unresolved thread(s) await your reply — last from Oleg Drokin
build OK — testing in progress (typically 6–14h)
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
sanity2@ldiskfs+DNE:test_398cseen in 1 other review
build #107556 SUCCESS · tests all Maloo sessions · test queue
no vote yet: Qian Yingjin, Shaun Tancheff, Hongchao Zhang, Patrick Farrell
patchsets:
+17 earlier PS1 08-02 PS2 08-05 PS3 08-07 PS4 08-08 PS5 08-29 Hongchao Zhang PS6 08-30 Hongchao Zhang PS7 08-30 Hongchao Zhang PS8 09-01 Hongchao Zhang PS9 09-02 Hongchao Zhang PS10 09-03 Hongchao Zhang PS11 09-03 Hongchao Zhang PS12 09-04 Hongchao Zhang PS13 09-04 Hongchao Zhang PS14 09-05 Hongchao Zhang PS15 09-05 Hongchao Zhang PS16 09-05 Hongchao Zhang PS17 09-09 Hongchao Zhang
PS18 09-09 Hongchao Zhang PS19 09-10 Hongchao Zhang PS20 09-10 Hongchao Zhang PS21 09-11 Hongchao Zhang PS22 09-12 Hongchao Zhang
threads: 5 need your reply · 0 waiting on others · 3 own notes · 0 bot
reply PS2 2024-08-05 23:05 Oleg Drokin COMMIT_MSG:12 — since it looks like this patch will get refreshed eventually, please also fix this typo -> divide.
Oleg Drokin PS2 · 2024-08-05 23:05
since it looks like this patch will get refreshed eventually, please also fix this typo -> divide.
reply PS1 2024-08-03 06:05 Shaun Tancheff file.c:2184 — truncate
Shaun Tancheff PS1 · 2024-08-03 06:05
truncate
note PS1 2024-08-05 04:51 Zhenyu Xu rw26.c:387 — I have a doubt here, if the start of the 1st page is not page aligned, since @to most of time is PAGE_SIZE, so at each loop, the page is alw
Zhenyu Xu PS1 · 2024-08-05 04:51
I have a doubt here, if the start of the 1st page is not page aligned, since @to most of time is PAGE_SIZE, so at each loop, the page is always not page aligned as well, is it a glitch here?

Should @to be like this:
       if (from != 0)
              to = min(PAGE_SIZE - from, from + size);
       else
              to = min(PAGE, from + size);
and except the 1st/last page, all pages in the middle should always be aligned full page.
reply PS2 2024-08-27 06:27 Shaun Tancheff rw26.c:386 — No changes here, code is correct as is.
Shaun Tancheff PS2 · 2024-08-27 06:27
No changes here, code is correct as is.
reply PS2 2024-08-06 14:45 Patrick Farrell rw26.c:388 — Thanks, I can't reproduce that bug locally...
Patrick Farrell PS2 · 2024-08-05 14:55
Hmm, this looks correct - good catch...  But it's blowing up, so probably something wrong I don't see.
Patrick Farrell PS2 · 2024-08-05 21:20
Wait, no.  If from != 0, to is still "from + size".  To is always from + size, except when it's outside of the page, in which case it's end-of-page/PAGE_SIZE.
Zhenyu Xu PS2 · 2024-08-06 10:43
right, I was wrong here.
Zhenyu Xu PS2 · 2024-08-06 14:43
I'm still investigating why visited page count does not match pv->ldp_count
Patrick Farrell PS2 · 2024-08-06 14:45
Thanks, I can't reproduce that bug locally...
note PS1 2024-08-05 04:51 Zhenyu Xu cl_io.c:1383 — from here we can see that the end of the 1st page is page aligned.
Zhenyu Xu PS1 · 2024-08-05 04:51
from here we can see that the end of the 1st page is page aligned.
note PS1 2024-08-05 04:51 Zhenyu Xu cl_io.c:1387 — and the end of the last page could be page unaligned.
Zhenyu Xu PS1 · 2024-08-05 04:51
and the end of the last page could be page unaligned.
reply PS1 2024-08-03 07:16 Andreas Dilger sanity.sh:14393 — More importantly, for older servers the unaligned DIO should be handled gracefully in some manner, since applications running on newer clien
Shaun Tancheff PS1 · 2024-08-03 06:05
Can we do:

unaligned_dio || skip "Need unaligned dio support"

Instead of server version check?
Andreas Dilger PS1 · 2024-08-03 07:16
More importantly, for older servers the unaligned DIO should be handled gracefully in some manner, since applications running on newer clients will try this and we shouldn't allow them to crash the servers. Just skipping the test doesn't solve the interop problem.

One option for UDIO is to expose the DIO alignment via statx, as XFS does. That will allow userspace applications to know what the DIO alignment requirements are, and applications that don't follow them can return EIO or other error directly (as they did befoer UDIO existed, instead of trying to emulate their way through the issues.
owner Zhenyu Xu · uploader Hongchao Zhang · PS22 uploaded 784d ago · NEW · open in Gerrit ↗
commit message
LU-17993 debug: to reveal page count issue

as title

Test-Parameters: fortestonly
Test-Parameters: testlist=sanity env=ONLY=119h,ONLY_REPEAT=500 clientdistro=el8.8 serverdistro=el8.8
Signed-off-by: Hongchao Zhang <hongchao@whamcloud.com>
Change-Id: Ia502400fb20603c369c34a3fb397a472cc3403c3
4954 master J –B ✓T ✓R +1/2−
LU-2468 ldlm: shrinker path should not allocate memory
mine Oleg Drokin voted -1
stalled 457d XS +1 −1
457d
build #11747 SUCCESS
reviews: Niu Yawei +1 2013-12-21 01:06 · Oleg Drokin -1 2013-12-21 01:06 · Fan Yong +1 2013-12-21 01:06
no vote yet: Commit Reviewer
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 5051d ago · NEW · open in Gerrit ↗
commit message
LU-2468 ldlm: shrinker path should not allocate memory

Found a glitch along the ldlm_shrink path,
ldlm_pool_shrink()-> ldlm_cli_pool_shrink()->
ldlm_cancel_lru(ns, nr, LDLM_ASYNC, LDLM_CANCEL_SHRINK)->
ldlm_bl_to_thread_list(ns, NULL, &cancels, nr, LDLM_ASYNC)->
ldlm_bl_to_thread(ns, NULL, cancels, nr, LDLM_ASYNC)->
OBD_ALLOC(blwi, sizeof(*blwi))

Shrinker path should not allocate memory again.

Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
Change-Id: I91a451303e636b94e74829a97e8c8305a95cfc9b
13042 master J –B ✓T ✗0R +1/2
LU-5869 osc: handle ldlm_handle2lock() static analysis issue
mine Maloo voted -1 — tests failed (details on the change)
stalled 457d XS +7 −0
457d
reviews: Dmitry Eremin +1 2015-07-20 21:36
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 4133d ago · NEW · open in Gerrit ↗
commit message
LU-5869 osc: handle ldlm_handle2lock() static analysis issue

Even though ldlm_handle2lock() may return NULL, but ldlm_lock_match()
will add a reference on the matched lock, we add an error path to
handle this case.

Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
Change-Id: I56c72129a2414468ee59320cfc1c29b5a72ce0c3
15390 master J –B ✓T ✗0R 0/2
LU-4388 test: add sanity test case 118o
mine Maloo voted -1 — tests failed (details on the change)
stalled 457d S +22 −2
457d
build #57410 SUCCESS
no vote yet: Jinshan Xiong
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 3025d ago · NEW · open in Gerrit ↗
commit message
LU-4388 test: add sanity test case 118o

Add a sanity test case 118o to verify fsync issues OST_SYNC.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I4f40f0853934fd0b3e105efd76f0deeaddecb1af
15856 master J –B ✓T ✗0R 0/2
LU-6960 utils: erase mgsnode param with tunefs.lustre
mine Maloo voted -1 — tests failed (details on the change)
stalled 457d M +71 −1
457d
owner Zhenyu Xu · uploader Zhenyu Xu · PS8 uploaded 3809d ago · NEW · open in Gerrit ↗
commit message
LU-6960 utils: erase mgsnode param with tunefs.lustre

When we need to change MGS node, "tunefs.lustre --mgsnode" would only
append to existing mgsnode params.

This patch add a "--erase-mgsnode" parameter to wipe existing mgsnode
and append mgsnode parameters afterwards.

Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
Change-Id: I90799a0338e9f4a5f2a606388ea3dd0384ae703f
30928 master J –B ✓T ✓R +0/2−
LU-10502 utils: redefine progname in lfs.c
reviewing Jian Yu · John Hammond voted -1
stalled 457d L +353 −343
457d
reviews: Andreas Dilger +1 2018-05-11 15:53 · John Hammond -1 2022-04-06 14:52
no vote yet: Jinshan Xiong
owner Jian Yu · uploader Jian Yu · PS13 uploaded 3106d ago · NEW · open in Gerrit ↗
commit message
LU-10502 utils: redefine progname in lfs.c

This patch redefines progname in lfs.c to fix the issue of
address of a local variable is returned through global variable.

The patch also standardizes some error messages in lfs.c to
remove argv[0] because progname already contains the sub-command
name.

Change-Id: I3adf824dc3b27fbc7e90e94b5163137017baae31
Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
Signed-off-by: Jian Yu <jian.yu@intel.com>
32789 master J –B ✗T –R +0/2−
LU-11118 llite: restrain initial read-ahead window length
mine build failure (#57148)
stalled 457d S +11 −9
457d
build failure (#57148)
Andreas Dilger voted -1
build #57148 FAILURE
reviews: Patrick Farrell +1 2019-01-09 22:01 · Andreas Dilger -1 2019-01-09 22:12
no vote yet: Rahul Deshmukh
owner Zhenyu Xu · uploader Zhenyu Xu · PS3 uploaded 3038d ago · NEW · open in Gerrit ↗
commit message
LU-11118 llite: restrain initial read-ahead window length

Restrain the initial read-ahead window length to a reasonable value,
no more than the file's size.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ib0b5d62e57d847f36912020c8089b7b53ab7d618
33556 master J !B ✓T ✗1R +1/2
LU-11600 obd: refactor cl_loi_list_lock
mine enforced failed: review-dne-zfs-part-1
stalled 457d M +114 −105
457d
janitor run: 1 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-zfs-part-1 RHEL 8.7/x86_64 ran 4 tests. 1 tests failed: sanity. session
1 optional test failure(s) — informational
build #96060 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger +1 2023-07-06 19:32
no vote yet: Qian Yingjin, Shuichi Ihara, Neil Brown, Li Dongyang, Patrick Farrell, Sergey Cheremencev
patchsets: PS4 11-15 PS5 11-16 PS6 11-30 PS7 07-04
owner Zhenyu Xu · uploader Zhenyu Xu · PS7 uploaded 1219d ago · NEW · open in Gerrit ↗
commit message
LU-11600 obd: refactor cl_loi_list_lock

client_obd::cl_loi_list_lock is likely getting quite hot in the IO
path. This patch split it into another client_obd::cl_grant_lock to
protect the OSC grant counters for the small window where they are
modified.

Change-Id: I05573baeeaa9e400963ffd528df118bb67ae381c
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
49164 master J !B ✓T ✗1R -1/2−
LU-16315 llite: invoke sync after write for synchorous write
mine enforced failed: review-zfs
stalled 457d 3 unresolved M +89 −10
457d
enforced failed: review-zfs
Li Xi voted -1
2 unresolved thread(s) await your reply — last from Li Xi
1 thread(s) waiting on others
janitor run: 3 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-zfs CentOS 8.5/x86_64 ran 10 tests. 1 tests failed: replay-single. session
2 optional test failure(s) — informational
build #90835 SUCCESS · tests all Maloo sessions
reviews: Li Xi -1 2022-12-20 13:04
no vote yet: Qian Yingjin
patchsets:
+3 earlier PS1 11-15 PS2 11-16 PS3 11-16
PS4 11-17 PS5 11-17 PS6 11-17 PS7 11-17 PS8 11-24
threads: 2 need your reply · 1 waiting on others · 0 own notes · 0 bot
reply PS8 2023-05-08 02:51 Li Xi COMMIT_MSG:9 — typo: write -> write
Li Xi PS8 · 2023-05-08 02:51
typo: write -> write
reply PS3 2022-11-16 11:20 Li Xi sanity-pfl.sh:2518 — Will this "wait" for all dd to finish?
Li Xi PS3 · 2022-11-16 11:20
Will this "wait" for all dd to finish?
As far as I tested, even dd blocked, wait will return without any problem.
I think checking "ps aux | grep dd | grep oflag=sync | wc -l" would be better. And it is necessary to repeat this test for several times. This test can pass for several times (~3) sometimes, but repeating will always hit the stuck.
owner Zhenyu Xu · uploader Zhenyu Xu · PS8 uploaded 1442d ago · NEW · open in Gerrit ↗
commit message
LU-16315 llite: invoke sync after write for synchorous write

A sync write need perform sync after the wrile, while we shouldn't
start an nested clio in another one (they share the same clio
environment while the nested clio would be reset). And a deadlock
could be ensued as following call traces show:

thread1:
======================================================================
ll_layout_refresh+0x1b2/0x9c0 [lustre]  // waiting for the update of
                                        // the layout after ll_fsync
vvp_io_init+0x23f/0x3a0 [lustre]
cl_io_init0.isra.13+0xa8/0x170 [obdclass]
cl_sync_file_range+0x206/0x340 [lustre]
ll_fsync+0x57c/0x5e0 [lustre]
generic_write_sync+0x4f/0x70
vvp_io_write_start+0x8a6/0x1000 [lustre]
cl_io_start+0x75/0x130 [obdclass]
cl_io_loop+0xd4/0x1f0 [obdclass]
ll_file_io_generic+0x685/0xc70 [lustre]
ll_file_aio_write+0x308/0x470 [lustre]
ll_file_write+0xe3/0x1d0 [lustre]
vfs_write+0xc0/0x1f0
SyS_pwrite64+0x92/0xc0
system_call_fastpath+0x25/0x2a
======================================================================

thread2:
======================================================================
lov_layout_wait.isra.35+0x14a/0x260 [lov] // waiting for thread2 to be
                                          // the only active IO upon
                                          // the file, while thread1
                                          // is working on the file
                                          // at the same time
lov_conf_set+0x1b0/0xb30 [lov]
cl_conf_set+0x7c/0x150 [obdclass]
ll_layout_conf+0x82/0x420 [lustre]
ll_layout_refresh+0x7bf/0x9c0 [lustre]
vvp_io_init+0x23f/0x3a0 [lustre]
cl_io_init0.isra.13+0xa8/0x170 [obdclass]
cl_io_init+0x41/0x90 [obdclass]
cl_io_rw_init+0x113/0x220 [obdclass]
ll_file_io_generic+0x2e5/0xc70 [lustre]
ll_file_aio_write+0x308/0x470 [lustre]
ll_file_write+0xe3/0x1d0 [lustre]
vfs_write+0xc0/0x1f0
SyS_pwrite64+0x92/0xc0
system_call_fastpath+0x25/0x2a
======================================================================

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Icac5296a269d7e428d2b934973ac2b80651e20fc
50310 master J !B ✓T ✗2R 0/2
LU-14765 llite: update inode's block numbers in mirror split
mine enforced failed: review-dne-selinux-ssk-part-1, review-dne-selinux-ssk-part-2
stalled 457d S +16 −8
457d
janitor run: 2 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-selinux-ssk-part-1 RHEL 8.8/x86_64 ran 3 tests. 1 tests failed: sanity. session
review-dne-selinux-ssk-part-2 RHEL 8.8/x86_64 ran 5 tests. 1 tests failed: sanity-sec. session
build #100507 SUCCESS · tests all Maloo sessions
no vote yet: Etienne AUJAMES, Andreas Dilger, Alex Zhuravlev
patchsets:
+5 earlier PS1 03-16 PS2 03-16 PS3 03-16 PS4 03-16 PS5 03-31
PS6 04-13 PS7 04-14 PS8 06-02 PS9 06-13 Andreas Dilger PS10 11-26 Andreas Dilger
owner Zhenyu Xu · uploader Andreas Dilger · PS10 uploaded 1075d ago · NEW · open in Gerrit ↗
commit message
LU-14765 llite: update inode's block numbers in mirror split

In mirror split, MDT cannot know the exact number of blocks to be
freed, so it changes the SOM flag as SOM_FL_LAZY (0x4), this patch
adds a stat operation in llite when MDT has finished the mirror split
to fetch the inode's correct block numbers from all of its stripes.
This is sent to the MDS later on close and stored in LSOM xattr.

Fixes: a30750ad2c ("LU-14526 flr: mirror split downgrade SOM")
Test-Parameters: testlist=sanity-flr env=ONLY=44c,ONLY_REPEAT=100
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Id9c0108e2cd230f3e68f97f06f3c08579930fd3c
39411 master J !B ✓T ✗6R +2/2
LU-13794 util: changing comp-flags get stuck when OST is down
mine enforced failed: review-dne-part-1, review-dne-part-4, review-dne-zfs-part-1, review-dne-zfs-part-2, review-dne-zfs-part-4, review-zfs
stalled 464d XS +0 −8
464d
failed enforced testplatformdetail
review-dne-part-1 CentOS 7.0/x86_64 ran 6 tests. 1 tests failed: sanityn. session
review-dne-part-4 RHEL 7.8/x86_64 ran 10 tests. 1 tests failed: replay-single. session
review-dne-zfs-part-1 CentOS 7.0/x86_64 ran 8 tests. 2 tests failed: sanityn, sanity. session
review-dne-zfs-part-2 CentOS 7.0/x86_64 ran 11 tests. 1 tests failed: sanity-hsm. session
review-dne-zfs-part-4 RHEL 7.8/x86_64 ran 10 tests. 1 tests failed: replay-single. session
review-zfs crashed RHEL 7.8/x86_64 ran 10 tests. 1 tests failed: sanity-quota. %% THIS TEST SESSION CRASHED %% session
2 optional test failure(s) — informational
build #15730 SUCCESS
reviews: Andreas Dilger +1 2020-07-17 09:13 · Li Dongyang +1 2020-07-19 23:45
owner Zhenyu Xu · uploader Zhenyu Xu · PS1 uploaded 2302d ago · NEW · open in Gerrit ↗
commit message
LU-13794 util: changing comp-flags get stuck when OST is down

In scenario of trying to write a FLR file when a mirror is
unavailable because some OST(s) serving the mirror is unavailable
at the time, admin could set preferred mirror for the write
choosing another healthy mirror. While the preference setting
api llapi_layout_file_comp_set() is trying to flush data before
setting the preference flag of the file's layout, the flush
would trip over the unavailable OST(s) and hung the setting.

Flushing data is not a necessary procedure in the component flag
setting.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Id20a21dc693b6662df7773158c76f093f36ef9aa
40483 master J ✗4B ✓T ✗6R +1/2
LU-14096 llog: proper release dt_object in llog_open_create()
mine janitor: 4 test failures unique to this patch — ost-pools@ldiskfs+DNE:test_15, ost-pools@ldiskfs+DNE:test_20, recovery-small@ldiskfs+DNE:test_18c +1 more
4 unique failures stalled 464d XS +1 −1
464d
janitor: 4 test failures unique to this patch — ost-pools@ldiskfs+DNE:test_15, ost-pools@ldiskfs+DNE:test_20, recovery-small@ldiskfs+DNE:test_18c +1 more
enforced failed: review-dne-part-2, review-dne-part-3, review-dne-zfs-part-1, review-dne-zfs-part-2, review-dne-zfs-part-5, review-ldiskfs-arm
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
ost-pools@ldiskfs+DNE:test_15seen in 11 other reviews
ost-pools@ldiskfs+DNE:test_20seen in 13 other reviews
recovery-small@ldiskfs+DNE:test_18cseen in 4 other reviews
sanity2@zfs:test_398gseen in 29 other reviews
failed enforced testplatformdetail
review-dne-part-2 RHEL 8.6/x86_64 ran 9 tests. 1 tests failed: replay-dual. session
review-dne-part-3 RHEL 8.6/x86_64 ran 3 tests. 1 tests failed: conf-sanity. session
review-dne-zfs-part-1 CentOS 8.5/x86_64 ran 6 tests. 1 tests failed: sanity. session
review-dne-zfs-part-2 CentOS 8.5/x86_64 ran 7 tests. 1 tests failed: replay-dual. session
review-dne-zfs-part-5 CentOS 8.5/x86_64 ran 6 tests. 2 tests failed: sanityn, recovery-small. session
review-ldiskfs-arm RHEL 8.6/aarch64, RHEL 8.6/x86_64 ran 6 tests. 1 tests failed: sanity-lnet. session
3 optional test failure(s) — informational
build #89881 SUCCESS · tests all Maloo sessions
reviews: Arshad Hussain +1 2022-10-10 11:12
no vote yet: Andreas Dilger
owner Zhenyu Xu · uploader Andreas Dilger · PS2 uploaded 1489d ago · NEW · open in Gerrit ↗
commit message
LU-14096 llog: proper release dt_object in llog_open_create()

In the rare case when the device is set rdonly, llog_open_create()
need to release the just opened llog_handle.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I3fe61a2ab0cc50f5336d04d8ee00d5280315aa7c

Mentions

0 waiting on you · 0 open

Unresolved threads where someone @-mentioned you (username, email or full name) — the pings that drown in Gerrit's email. Red: you have not replied since the ping. Muted: you replied, but the thread is still open, so it stays on the list until someone resolves it. Both clear on the refresh after the thread is resolved.

No unanswered pings — nobody is waiting on a mention.
1 watched
69675 master J –B ✓T ✗1R 0/2
LU-19344 llite: report EOF for read racing local append
mine enforced failed: review-dne-selinux-ssk-part-2
pw_haltpw_shepherd 16 unresolved M +117 −0
1d
enforced failed: review-dne-selinux-ssk-part-2
12 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
failed enforced testplatformdetail
review-dne-selinux-ssk-part-2 failed 4× RHEL 8.10 / x86_64 ran 7 tests. 1 tests failed: sanity-sec. session
build #134364 SUCCESS · tests all Maloo sessions
no vote yet: Alexey Lyashkov, Vitaly Fertman
patchsets: PS1 10-14 PS2 10-23 Alexey Lyashkov PS3 10-23 Alexey Lyashkov PS4 10-23 Alexey Lyashkov
threads: 12 need your reply · 0 waiting on others · 4 own notes · 0 bot
reply PS1 2026-10-16 16:02 Gerrit AI review for Lustre COMMIT_MSG:36 — (suggestion) LU-19344 is about the cached-read cost of file_read_confine_iter(), and 240cad9a0a quoted a 20-30% regression on 8k cached read
Gerrit AI review for Lustre PS1 · 2026-10-16 16:02
(suggestion) LU-19344 is about the cached-read cost of file_read_confine_iter(), and 240cad9a0a quoted a 20-30% regression on 8k cached reads. Since this patch brings the confinement back, and also moves cl_env_get() back in front of the cache read path, could the message include before/after numbers for that workload?
reply PS1 2026-10-16 16:02 Gerrit AI review for Lustre COMMIT_MSG:43 — (minor) This list of what the CIT_MISC cl_io_init()/cl_io_fini() pair adds seems incomplete. For a CIT_MISC io without ci_ignore_layout, lov
Gerrit AI review for Lustre PS1 · 2026-10-16 16:02
(minor) This list of what the CIT_MISC cl_io_init()/cl_io_fini() pair adds seems incomplete. For a CIT_MISC io without ci_ignore_layout, lov_io_init_composite()/lov_io_init_empty() also do atomic_inc(&lov->lo_active_ios), and lov_io_fini() drops it. That pin is what keeps lov_conf_set() from running lov_layout_change() while the attributes are being read (see the inline comment in file_read_confine_iter()). Could the message mention this?
reply PS1 2026-10-16 16:02 Gerrit AI review for Lustre COMMIT_MSG:56 — (minor) vvp_env_new_attr() already does memset(attr, 0, sizeof(*attr)) on the thread's shared cl_attr, so cat_kms is already 0 before the lo
Gerrit AI review for Lustre PS1 · 2026-10-16 16:02
(minor) vvp_env_new_attr() already does memset(attr, 0, sizeof(*attr)) on the thread's shared cl_attr, so cat_kms is already 0 before the lookup. This rationale doesn't seem to hold. If the patch is refreshed, the bullet (and the explicit assignment) could be dropped.
reply PS4 2026-10-26 13:27 Gerrit AI review for Lustre COMMIT_MSG:16 — (minor) "bumped around a write by this client that publishes a larger size" doesn't seem to cover every such write. O_DIRECT writes never qu
Gerrit AI review for Lustre PS4 · 2026-10-26 13:27
(minor) "bumped around a write by this client that publishes a larger size" doesn't seem to cover every such write. O_DIRECT writes never queue pages, so vvp_io_write_commit() returns at `npages == 0` before either bump. Large buffered writes that do_file_write_iter() switches to DIO via ll_hybrid_bio_dio_switch_check() take the same path. So whether a racing reader at EOF gets EOF or the appended data depends on the write size. fallocate() and truncate-up don't bump either. If that's intended, could the message say which writes are covered?

The counter also moves on every buffered commit, including overwrites that don't change the size, not only on writes that publish a larger size.
reply PS4 2026-10-26 13:27 Gerrit AI review for Lustre COMMIT_MSG:32 — (minor) If this is a fix, the behaviour it restores was removed by 240cad9a0a, which also dropped the original 251b with the rationale that
Gerrit AI review for Lustre PS4 · 2026-10-26 13:27
(minor) If this is a fix, the behaviour it restores was removed by 240cad9a0a, which also dropped the original 251b with the rationale that "The read after the write should never return an end-of-file (EOF)". Should the message carry

    Fixes: 240cad9a0a ("LU-19344 llite: set read size correctly")

and explain why that rationale no longer holds?
reply PS1 2026-10-16 16:02 Gerrit AI review for Lustre file.c:2537 — (minor) attr comes from vvp_env_new_attr(), which already zeroes the whole struct, so this assignment is redundant.
Gerrit AI review for Lustre PS1 · 2026-10-16 16:02
(minor) attr comes from vvp_env_new_attr(), which already zeroes the whole struct, so this assignment is redundant.
reply PS1 2026-10-16 16:02 Gerrit AI review for Lustre file.c:2539 — (defect) Without the CIT_MISC io, what keeps the layout stable while this runs? lov_attr_get() uses LOV_2DISPATCH_NOLOCK and says "Layout is
Gerrit AI review for Lustre PS1 · 2026-10-16 16:02
(defect) Without the CIT_MISC io, what keeps the layout stable while this runs? lov_attr_get() uses LOV_2DISPATCH_NOLOCK and says "Layout is protected from changing by ongoing IO". Nothing on this path holds lo_type_guard or raises lo_active_ios, and the ll_layout_version_get() check above is only a snapshot.

A possible race on one client:

    T1: read() -> file_read_confine_iter() -> cl_object_attr_get()
        -> lov_attr_get_composite() walking lo_entries / lo_lsm
    T2: layout lock revoked (e.g. PFL instantiation from another node),
        then stat/write -> ll_layout_refresh() -> lov_conf_set():
        lo_active_ios == 0 -> lov_layout_change()
        -> lov_fini_composite() frees lo_entries and lo_lsm

lov_layout_change() doesn't take coh_attr_guard, so the spinlock held here doesn't exclude it either. Some existing callers have the same pattern (ll_readahead_handle_work(), ll_merge_attr() on the append path), but the old file_read_confine_iter() was pinned by its CIT_MISC io. This patch puts the unpinned lookup on every read() syscall. Would taking lov_conf_freeze()-style protection, or a lightweight lo_active_ios reference, avoid the race without the full cl_io_init() cost?
note PS4 2026-11-04 03:37 Zhenyu Xu file.c:2347 — The new size becomes visible to a reader here, need to bump the lli_size_gen here. With the ll_file_io_generic() bump in place, the secon
Zhenyu Xu PS4 · 2026-11-04 03:37
The new size becomes visible to a reader here, need to bump the lli_size_gen here.  With the  ll_file_io_generic()  bump in place, the second bump in  vvp_io_write_commit()  (after  cl_io_commit_async() ) becomes redundant — the window now closes at  ll_merge_attr() .
reply PS4 2026-10-26 13:27 Gerrit AI review for Lustre file.c:2662 — (defect) Can this report EOF for data that was in the file before the read started?
Gerrit AI review for Lustre PS4 · 2026-10-26 13:27
(defect) Can this report EOF for data that was in the file before the read started?

`orig_size` is the client's cached i_size, not EOF. Since 240cad9a0a, vvp_prep_size() does `i_size_write(inode, kms)`, and kms can be lower than the real size. lli_size_gen also moves on any buffered commit on this client, including an overwrite that doesn't extend the file. Example:

    node B: appends, file grows 1M -> 2M
    node A, P1: cat reaches offset 1M (i_size == kms == 1M)
                orig_ki_pos >= orig_size, gen == G
                vvp_prep_size(): pos > kms -> glimpse -> 2M
                copies 1M of node B's data
    node A, P2: overwrites offset 0 -> vvp_io_write_commit() -> gen G+2
    node A, P1: gen changed -> revert, return 0

cat stops at 1M even though node B's data was there before the read was issued. That contradicts the comment above, which says "A larger size discovered from another node during the read ... is returned normally" (commit message lines 30-31 say the same). Would it be safer to take the EOF baseline from a validated size (a glimpse, or kms under the lock), and to bump the counter only when a commit actually raises kms?
note PS4 2026-11-04 03:51 Zhenyu Xu file.c:2668 — iov_iter_revert(to, result) assumes result is exactly the amount the iter was advanced. For the fast-read path that holds; for ll_file_io
Zhenyu Xu PS4 · 2026-11-04 03:51
iov_iter_revert(to, result)  assumes  result  is exactly the amount the iter was advanced. For the fast-read path that holds; for ll_file_io_generic()  (which can restart and internally rewind/reexpand the iter) it's less obvious. The code this replaced used the more forgiving  iov_iter_truncate(to, 0) , which doesn't need to know the consumed count.
reply PS4 2026-10-26 13:27 Gerrit AI review for Lustre file.c:2742 — (minor) This is bumped only before the write, but the tiny-write size reaches the inode after __generic_file_write_iter(), through ll_merge_
Gerrit AI review for Lustre PS4 · 2026-10-26 13:27
(minor) This is bumped only before the write, but the tiny-write size reaches the inode after __generic_file_write_iter(), through ll_merge_attr() below. A reader whose snapshot falls between this increment and ll_merge_attr() sees the new generation with the old i_size, and can then return the appended bytes. vvp_io_write_commit() bumps after the commit to avoid exactly this. Should there be a matching increment after ll_merge_attr() here?
reply PS4 2026-10-26 13:27 Gerrit AI review for Lustre llite_internal.h:256 — (minor) If the patch is refreshed: "similar as i_version" reads oddly ("similar to i_version"?). Also, the counter is bumped on every buffer
Gerrit AI review for Lustre PS4 · 2026-10-26 13:27
(minor) If the patch is refreshed: "similar as i_version" reads oddly ("similar to i_version"?). Also, the counter is bumped on every buffered write commit and tiny write, not only on writes that make a larger size visible, so "Bumped around a write ... that makes a larger file size visible" overstates it.
tags: pw_halt pw_shepherd
owner Zhenyu Xu · uploader Alexey Lyashkov · PS4 uploaded 13d ago · NEW · open in Gerrit ↗
commit message
LU-19344 llite: report EOF for read racing local append

A read issued at EOF must report EOF even if the file grows while it
is in flight.  i_size cannot express this: osc_page_touch_at() raises
kms and the inode size as soon as the pages enter the cache, so a
paused reader resumes with the appended data already visible.  A
glimpse cannot help either, since the client holding the extent lock
owns the kms.

Add a per inode counter, lli_size_gen, bumped around a write by this
client that publishes a larger size: in vvp_io_write_commit() on both
sides of cl_io_commit_async(), which raises kms page by page, and in
ll_do_tiny_write(), which can extend the file inside an already dirty
page.  do_file_read_iter() snapshots i_size and the counter on entry
and rechecks at the end; if the read started at or beyond the
snapshotted EOF and the counter moved, ki_pos is restored, the iter
reverted and 0 returned.

The counter is advisory.  It is not ordered against the size store and
is per inode rather than per range, so it can move for an unrelated
local write and a reader can still miss a write committing in the
window between the two bumps.

The counter moves only for local writes, so a size learned from
another node is still returned normally.

Signed-off-by: Alexey Lyashkov <alexey.lyashkov@hpe.com>
Change-Id: I2f30aa9317dfe6e3f57d3b4a21537217921d9a82
35 open
▶

Failed / broken

(20)
69675 master J –B ✓T ✗1R 0/2
LU-19344 llite: report EOF for read racing local append
enforced failed: review-dne-selinux-ssk-part-2
pw_haltpw_shepherd 16 unresolved M +117 −0
1d
enforced failed: review-dne-selinux-ssk-part-2
12 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
failed enforced testplatformdetail
review-dne-selinux-ssk-part-2 failed 4× RHEL 8.10 / x86_64 ran 7 tests. 1 tests failed: sanity-sec. session
build #134364 SUCCESS · tests all Maloo sessions
no vote yet: Alexey Lyashkov, Vitaly Fertman
patchsets: PS1 10-14 PS2 10-23 Alexey Lyashkov PS3 10-23 Alexey Lyashkov PS4 10-23 Alexey Lyashkov
threads: 12 need your reply · 0 waiting on others · 4 own notes · 0 bot
reply PS1 2026-10-16 16:02 Gerrit AI review for Lustre COMMIT_MSG:36 — (suggestion) LU-19344 is about the cached-read cost of file_read_confine_iter(), and 240cad9a0a quoted a 20-30% regression on 8k cached read
Gerrit AI review for Lustre PS1 · 2026-10-16 16:02
(suggestion) LU-19344 is about the cached-read cost of file_read_confine_iter(), and 240cad9a0a quoted a 20-30% regression on 8k cached reads. Since this patch brings the confinement back, and also moves cl_env_get() back in front of the cache read path, could the message include before/after numbers for that workload?
reply PS1 2026-10-16 16:02 Gerrit AI review for Lustre COMMIT_MSG:43 — (minor) This list of what the CIT_MISC cl_io_init()/cl_io_fini() pair adds seems incomplete. For a CIT_MISC io without ci_ignore_layout, lov
Gerrit AI review for Lustre PS1 · 2026-10-16 16:02
(minor) This list of what the CIT_MISC cl_io_init()/cl_io_fini() pair adds seems incomplete. For a CIT_MISC io without ci_ignore_layout, lov_io_init_composite()/lov_io_init_empty() also do atomic_inc(&lov->lo_active_ios), and lov_io_fini() drops it. That pin is what keeps lov_conf_set() from running lov_layout_change() while the attributes are being read (see the inline comment in file_read_confine_iter()). Could the message mention this?
reply PS1 2026-10-16 16:02 Gerrit AI review for Lustre COMMIT_MSG:56 — (minor) vvp_env_new_attr() already does memset(attr, 0, sizeof(*attr)) on the thread's shared cl_attr, so cat_kms is already 0 before the lo
Gerrit AI review for Lustre PS1 · 2026-10-16 16:02
(minor) vvp_env_new_attr() already does memset(attr, 0, sizeof(*attr)) on the thread's shared cl_attr, so cat_kms is already 0 before the lookup. This rationale doesn't seem to hold. If the patch is refreshed, the bullet (and the explicit assignment) could be dropped.
reply PS4 2026-10-26 13:27 Gerrit AI review for Lustre COMMIT_MSG:16 — (minor) "bumped around a write by this client that publishes a larger size" doesn't seem to cover every such write. O_DIRECT writes never qu
Gerrit AI review for Lustre PS4 · 2026-10-26 13:27
(minor) "bumped around a write by this client that publishes a larger size" doesn't seem to cover every such write. O_DIRECT writes never queue pages, so vvp_io_write_commit() returns at `npages == 0` before either bump. Large buffered writes that do_file_write_iter() switches to DIO via ll_hybrid_bio_dio_switch_check() take the same path. So whether a racing reader at EOF gets EOF or the appended data depends on the write size. fallocate() and truncate-up don't bump either. If that's intended, could the message say which writes are covered?

The counter also moves on every buffered commit, including overwrites that don't change the size, not only on writes that publish a larger size.
reply PS4 2026-10-26 13:27 Gerrit AI review for Lustre COMMIT_MSG:32 — (minor) If this is a fix, the behaviour it restores was removed by 240cad9a0a, which also dropped the original 251b with the rationale that
Gerrit AI review for Lustre PS4 · 2026-10-26 13:27
(minor) If this is a fix, the behaviour it restores was removed by 240cad9a0a, which also dropped the original 251b with the rationale that "The read after the write should never return an end-of-file (EOF)". Should the message carry

    Fixes: 240cad9a0a ("LU-19344 llite: set read size correctly")

and explain why that rationale no longer holds?
reply PS1 2026-10-16 16:02 Gerrit AI review for Lustre file.c:2537 — (minor) attr comes from vvp_env_new_attr(), which already zeroes the whole struct, so this assignment is redundant.
Gerrit AI review for Lustre PS1 · 2026-10-16 16:02
(minor) attr comes from vvp_env_new_attr(), which already zeroes the whole struct, so this assignment is redundant.
reply PS1 2026-10-16 16:02 Gerrit AI review for Lustre file.c:2539 — (defect) Without the CIT_MISC io, what keeps the layout stable while this runs? lov_attr_get() uses LOV_2DISPATCH_NOLOCK and says "Layout is
Gerrit AI review for Lustre PS1 · 2026-10-16 16:02
(defect) Without the CIT_MISC io, what keeps the layout stable while this runs? lov_attr_get() uses LOV_2DISPATCH_NOLOCK and says "Layout is protected from changing by ongoing IO". Nothing on this path holds lo_type_guard or raises lo_active_ios, and the ll_layout_version_get() check above is only a snapshot.

A possible race on one client:

    T1: read() -> file_read_confine_iter() -> cl_object_attr_get()
        -> lov_attr_get_composite() walking lo_entries / lo_lsm
    T2: layout lock revoked (e.g. PFL instantiation from another node),
        then stat/write -> ll_layout_refresh() -> lov_conf_set():
        lo_active_ios == 0 -> lov_layout_change()
        -> lov_fini_composite() frees lo_entries and lo_lsm

lov_layout_change() doesn't take coh_attr_guard, so the spinlock held here doesn't exclude it either. Some existing callers have the same pattern (ll_readahead_handle_work(), ll_merge_attr() on the append path), but the old file_read_confine_iter() was pinned by its CIT_MISC io. This patch puts the unpinned lookup on every read() syscall. Would taking lov_conf_freeze()-style protection, or a lightweight lo_active_ios reference, avoid the race without the full cl_io_init() cost?
note PS4 2026-11-04 03:37 Zhenyu Xu file.c:2347 — The new size becomes visible to a reader here, need to bump the lli_size_gen here. With the ll_file_io_generic() bump in place, the secon
Zhenyu Xu PS4 · 2026-11-04 03:37
The new size becomes visible to a reader here, need to bump the lli_size_gen here.  With the  ll_file_io_generic()  bump in place, the second bump in  vvp_io_write_commit()  (after  cl_io_commit_async() ) becomes redundant — the window now closes at  ll_merge_attr() .
reply PS4 2026-10-26 13:27 Gerrit AI review for Lustre file.c:2662 — (defect) Can this report EOF for data that was in the file before the read started?
Gerrit AI review for Lustre PS4 · 2026-10-26 13:27
(defect) Can this report EOF for data that was in the file before the read started?

`orig_size` is the client's cached i_size, not EOF. Since 240cad9a0a, vvp_prep_size() does `i_size_write(inode, kms)`, and kms can be lower than the real size. lli_size_gen also moves on any buffered commit on this client, including an overwrite that doesn't extend the file. Example:

    node B: appends, file grows 1M -> 2M
    node A, P1: cat reaches offset 1M (i_size == kms == 1M)
                orig_ki_pos >= orig_size, gen == G
                vvp_prep_size(): pos > kms -> glimpse -> 2M
                copies 1M of node B's data
    node A, P2: overwrites offset 0 -> vvp_io_write_commit() -> gen G+2
    node A, P1: gen changed -> revert, return 0

cat stops at 1M even though node B's data was there before the read was issued. That contradicts the comment above, which says "A larger size discovered from another node during the read ... is returned normally" (commit message lines 30-31 say the same). Would it be safer to take the EOF baseline from a validated size (a glimpse, or kms under the lock), and to bump the counter only when a commit actually raises kms?
note PS4 2026-11-04 03:51 Zhenyu Xu file.c:2668 — iov_iter_revert(to, result) assumes result is exactly the amount the iter was advanced. For the fast-read path that holds; for ll_file_io
Zhenyu Xu PS4 · 2026-11-04 03:51
iov_iter_revert(to, result)  assumes  result  is exactly the amount the iter was advanced. For the fast-read path that holds; for ll_file_io_generic()  (which can restart and internally rewind/reexpand the iter) it's less obvious. The code this replaced used the more forgiving  iov_iter_truncate(to, 0) , which doesn't need to know the consumed count.
reply PS4 2026-10-26 13:27 Gerrit AI review for Lustre file.c:2742 — (minor) This is bumped only before the write, but the tiny-write size reaches the inode after __generic_file_write_iter(), through ll_merge_
Gerrit AI review for Lustre PS4 · 2026-10-26 13:27
(minor) This is bumped only before the write, but the tiny-write size reaches the inode after __generic_file_write_iter(), through ll_merge_attr() below. A reader whose snapshot falls between this increment and ll_merge_attr() sees the new generation with the old i_size, and can then return the appended bytes. vvp_io_write_commit() bumps after the commit to avoid exactly this. Should there be a matching increment after ll_merge_attr() here?
reply PS4 2026-10-26 13:27 Gerrit AI review for Lustre llite_internal.h:256 — (minor) If the patch is refreshed: "similar as i_version" reads oddly ("similar to i_version"?). Also, the counter is bumped on every buffer
Gerrit AI review for Lustre PS4 · 2026-10-26 13:27
(minor) If the patch is refreshed: "similar as i_version" reads oddly ("similar to i_version"?). Also, the counter is bumped on every buffered write commit and tiny write, not only on writes that make a larger size visible, so "Bumped around a write ... that makes a larger file size visible" overstates it.
tags: pw_halt pw_shepherd
owner Zhenyu Xu · uploader Alexey Lyashkov · PS4 uploaded 13d ago · NEW · open in Gerrit ↗
commit message
LU-19344 llite: report EOF for read racing local append

A read issued at EOF must report EOF even if the file grows while it
is in flight.  i_size cannot express this: osc_page_touch_at() raises
kms and the inode size as soon as the pages enter the cache, so a
paused reader resumes with the appended data already visible.  A
glimpse cannot help either, since the client holding the extent lock
owns the kms.

Add a per inode counter, lli_size_gen, bumped around a write by this
client that publishes a larger size: in vvp_io_write_commit() on both
sides of cl_io_commit_async(), which raises kms page by page, and in
ll_do_tiny_write(), which can extend the file inside an already dirty
page.  do_file_read_iter() snapshots i_size and the counter on entry
and rechecks at the end; if the read started at or beyond the
snapshotted EOF and the counter moved, ki_pos is restored, the iter
reverted and 0 returned.

The counter is advisory.  It is not ordered against the size store and
is per inode rather than per range, so it can move for an unrelated
local write and a reader can still miss a write committing in the
window between the two bumps.

The counter moves only for local writes, so a size learned from
another node is still returned normally.

Signed-off-by: Alexey Lyashkov <alexey.lyashkov@hpe.com>
Change-Id: I2f30aa9317dfe6e3f57d3b4a21537217921d9a82
50622 master J !B ✓T ✗9R +1/2
LU-15834 lfs: mirror extend take current OSTs into account
enforced failed: review-dne-part-4, review-dne-subtest-change, review-dne-zfs-part-4, review-dne-zfs-part-5, review-dne-zfs-subtest-change, review-ldiskfs, review-ldiskfs-ubuntu
pw_shepherd 2 unresolved L +538 −63
1d
enforced failed: review-dne-part-4, review-dne-subtest-change, review-dne-zfs-part-4, review-dne-zfs-part-5, review-dne-zfs-subtest-change, review-ldiskfs, review-ldiskfs-ubuntu
2 unresolved thread(s) await your reply — last from Ronnie Sahlberg
janitor run: 2 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-part-4 RHEL 8.10 / x86_64 ran 9 tests. 1 tests failed: sanity-quota. session
review-dne-part-4 RHEL 9.4 / x86_64 ran 9 tests. 1 tests failed: sanity-quota. session
review-dne-subtest-change RHEL 8.10 / x86_64 ran 3 tests. 1 tests failed: sanity-flr. session
review-dne-zfs-part-4 RHEL 8.10 / x86_64 ran 9 tests. 1 tests failed: sanity-flr. session
review-dne-zfs-part-5 RHEL 8.10 / x86_64 ran 6 tests. 2 tests failed: sanityn, lustre-rsync-test. session
review-dne-zfs-subtest-change RHEL 8.10 / x86_64 ran 3 tests. 1 tests failed: sanity-flr. session
review-ldiskfs RHEL 9.4 / x86_64 ran 5 tests. 1 tests failed: sanity-lnet. session
review-ldiskfs RHEL 8.10 / x86_64, SLES 15.5 / x86_64 ran 5 tests. 1 tests failed: sanity-lnet. session
review-ldiskfs-ubuntu RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 ran 6 tests. 1 tests failed: sanity-sec. session
4 optional test failure(s) — informational
build #112602 SUCCESS · tests all Maloo sessions
reviews: Ronnie Sahlberg +1 2026-04-09 02:01
no vote yet: Qian Yingjin, Andreas Dilger, Alex Zhuravlev
patchsets:
+16 earlier PS1 04-13 PS2 06-02 PS3 06-02 PS4 05-20 PS5 06-26 PS6 06-26 PS7 10-10 PS8 10-11 PS9 10-11 PS10 10-11 PS11 10-25 PS12 10-25 PS13 10-25 PS14 10-25 PS15 10-28 PS16 10-28
PS17 11-01 PS18 12-18 PS19 02-10 PS20 03-25 PS21 04-17
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS21 2026-04-08 22:55 Ronnie Sahlberg lod_qos.c:540 — These changes are unrelated to the intent of the commit and should probably be part of a separate "cleanup" patch.
Ronnie Sahlberg PS21 · 2026-04-08 22:55
These changes are unrelated to the intent of the commit and should probably be part of a separate "cleanup" patch.
This and all other instances of the same change.
reply PS21 2026-04-09 02:01 Ronnie Sahlberg liblustreapi_layout.c:914 — Obj_count is only modified for the call to compute blob_size so this conditional to decrement it back to the original value should be move
Ronnie Sahlberg PS21 · 2026-04-09 02:01
Obj_count is only modified for the call to compute blob_size   so this conditional to decrement it back to the original value should be moved to to line 857   just after blob_size = ...
So the increment and decrement are close together.

Even better would be to skip the conditional increment/decrement and do : 

blob_size = lov_user_md_size(obj_count + (comp->llc_flags & LCME_FL_FOR_MERGE) ? 1 : 0, magic);

and thus avoid temporarily modifying obj_count.
tags: pw_shepherd
owner Zhenyu Xu · uploader Zhenyu Xu · PS21 uploaded 567d ago · NEW · open in Gerrit ↗
commit message
LU-15834 lfs: mirror extend take current OSTs into account

Makes mirror extend try to allocate different OSTs from existing
mirrors.

When extending a mirror, the source file FID is stored in the victim
layout's first component's object l_ost_oi::oi_fid, also set a
special flag LCME_FL_FOR_MERGE in the component.

As LOD parses this merge victim layout, it extracts the source file
FID in lod_object::ldo_merge_src_fid, and as LOD is trying to
allocate OST objects, it would try to avoid those OST indices already
used in the overlapping components from the source file.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I8bcb0411ed64447c34fa8c1443c45a3888d73842
58291 master J –B ✓T ✗7R -1/2−
LU-18771 flr: allow merge mirrored layout
needs rebase — checkpatch: cannot be cherry-picked
needs rebase pw_smallfix 5 unresolved L +196 −72
1d
needs rebase — checkpatch: cannot be cherry-picked
enforced failed: custom-1001, review-dne-part-4, review-dne-zfs-part-4, review-dne-zfs-part-5, review-zfs
5 unresolved thread(s) await your reply — last from patrick bot
failed enforced testplatformdetail
custom-1001 RHEL 9.7 / x86_64 ran 4 tests. 1 tests failed: sanity-flr. session
review-dne-part-4 RHEL 9.7 / x86_64 ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. session
review-dne-part-4 RHEL 10.1 / x86_64 ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. session
review-dne-zfs-part-4 RHEL 9.8 / x86_64 ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. session
review-dne-zfs-part-4 RHEL 10.1 / x86_64 ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. session
review-dne-zfs-part-5 RHEL 9.7 / x86_64 ran 5 tests. 1 tests failed: sanityn. session
review-zfs RHEL 8.10 / x86_64 ran 8 tests. 2 tests failed: sanity-flr, sanity-quota. session
build #134321 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets:
+8 earlier PS1 03-04 PS2 03-05 PS3 03-06 PS4 03-25 PS5 04-17 PS6 05-05 Andreas Dilger PS7 06-01 PS8 08-12
PS9 10-14 patrick bot PS10 10-14 patrick bot PS11 10-21 patrick bot PS12 10-21 patrick bot PS13 10-23 patrick bot
threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS10 2026-10-14 04:31 patrick bot lod_qos.c:806 — Patrick-Bot: Not changed. Whether the extra retry should apply only to the first component of mirrored layouts, or move to its own change, i
Gerrit AI review for Lustre PS8 · 2026-08-13 08:50
(minor) The new clause fires for the first component of every layout, not just mirrors - a plain or default-striped file also has `llc_extent.e_start == 0`.

The practical effect shows up with default striping (LOD_USES_DEFAULT_STRIPE), where stripe_count_min is 3/4 of stripe_count: the allocator now escalates to speed 1 and 2 to fill the remaining quarter. At speed 2 lod_check_and_reserve_ost() stops honouring OS_STATFS_DEGRADED and stops calling lod_should_avoid_ost(), so first components can land on degraded OSTs and on OSTs already used by a conflicting mirror component.

For an FLR patch that last one seems to work against the goal. Was the intent to limit this to mirrored layouts?
patrick bot PS10 · 2026-10-14 04:31
Patrick-Bot: Not changed. Whether the extra retry should apply only to the first component of mirrored layouts, or move to its own change, is a design decision for the patch owner.
reply PS10 2026-10-14 04:31 patrick bot lfs.c:2286 — Patrick-Bot: Done in patchset 10: a failure to get the mirror count now fails the extend. Leaving this thread open for a related problem in
Gerrit AI review for Lustre PS8 · 2026-08-13 08:50
(minor) The return value is not checked, and `rc` is overwritten by the migrate_open_files() call below. If llapi_layout_mirror_count_get() ever fails, `mirror_cnt` stays 0 and the multi-mirror handling is silently skipped.
patrick bot PS10 · 2026-10-14 04:31
Patrick-Bot: Done in patchset 10: a failure to get the mirror count now fails the extend. Leaving this thread open for a related problem in the same hunk. Clearing resync for a multi-mirror merge makes lfs set LL_LEASE_ALLOW_STALE, and since LU-18746 llite refuses that with EOPNOTSUPP unless the client has llite_enable_flr_ec=1. That parameter defaults to 0. So every extend that adds more than one mirror fails on a default client, as in sanity-flr 0d, 0e, 0f, 0m and 44d on rocky9 ldiskfs. With llite_enable_flr_ec=1 those tests pass. test-framework does not set it either: it sets MODOPTS_LLITE, but load_module reads MODOPTS_LUSTRE for the llite module. How the merge should mark the new mirrors stale without needing FLR EC is for the patch owner to decide.
reply PS10 2026-10-14 04:31 patrick bot lfs.c:2453 — Patrick-Bot: Not changed. Rejecting a mixed list would break sanity-flr test_0d, which runs 'lfs mirror extend -N -S 4M -N -f $tf-2 $tf-1' a
Gerrit AI review for Lustre PS8 · 2026-08-13 08:50
(minor) This picks the whole strategy from the first list entry only. Previously each entry was dispatched on its own `m_file`.

With `lfs mirror extend -N -f victim -N2 -c1 FILE` the loop now calls mirror_extend_file() for the second entry too, with `victim_file == NULL`, which turns into `open(NULL, ...)` and an EFAULT.

The man page does say -f cannot be combined with SETSTRIPE_OPTIONS, but nothing enforces it for extend (mirror_create_sanity_check() is only called from mirror_create()). Should mirror_extend() reject a mixed list up front?
patrick bot PS10 · 2026-10-14 04:31
Patrick-Bot: Not changed. Rejecting a mixed list would break sanity-flr test_0d, which runs 'lfs mirror extend -N -S 4M -N -f $tf-2 $tf-1' and expects it to succeed. Handling the -f entries one by one and merging the rest changes the order mirrors are added in, so this is left for the patch owner.
reply PS13 2026-10-26 15:32 Gerrit AI review for Lustre lfs.c:2368 — (minor) When more than one mirror is added, the data is now copied by lfs_mirror_resync_file(). That function always opens the file with O_D
Gerrit AI review for Lustre PS13 · 2026-10-26 15:32
(minor) When more than one mirror is added, the data is now copied by lfs_mirror_resync_file(). That function always opens the file with O_DIRECT, so 'lfs mirror extend -D|--non-direct -N2 FILE' silently ignores -D. Before this change, each mirror was copied by migrate_nonblock() on descriptors that migrate_open_files() opened according to LLAPI_MIGRATION_NONDIRECT. The single-mirror path still honours -D, so the option now behaves differently depending on how many mirrors are added. If the patch is refreshed, could migration_flags be passed down to the resync, or could the man page say that -D only applies to single-mirror extends?
reply PS10 2026-10-14 04:31 patrick bot liblustreapi.c:2451 — Patrick-Bot: Not changed. Keeping, splitting out or dropping the hex lcme_id output is for the patch owner to decide. If it stays, the examp
Gerrit AI review for Lustre PS8 · 2026-08-13 08:50
(minor) This changes `lfs getstripe` output for every composite file, and it looks unrelated to the mirror-merge work.

A couple of things go stale with it: the worked example in the comment above this function still shows `- lcme_id:             1`, and Documentation/ec.txt shows decimal ids too. Test suites also scrape this field (`awk '/lcme_id/{print $2}'` in sanity-flr.sh and sanity-ec.sh).

If the hex form is wanted, could it go in its own patch together with the doc updates?
patrick bot PS10 · 2026-10-14 04:31
Patrick-Bot: Not changed. Keeping, splitting out or dropping the hex lcme_id output is for the patch owner to decide. If it stays, the example in the comment above and Documentation/ec.txt need updating too.
tags: pw_smallfix
owner Zhenyu Xu · uploader patrick bot · PS13 uploaded 13d ago · NEW · open in Gerrit ↗
commit message
LU-18771 flr: allow merge mirrored layout

This patch prepares a merge victim llapi_layout to contain all
mirrors, and mark them as stale mirrors. On MDS, LOD accepts it for
merge. After the stale mirrors have been merged, a resync will
update the content into the newly merged mirrors.

A victim holding its own EC data/parity pair is refused for now,
as renumbering its mirrors would break the links between them.

The layout check on the merged victim accepts the nocompr
mirror flag, so 'lfs mirror extend -N --flags=nocompr' works.

The DoM first component of each merged victim mirror is
marked stale, as its data is only in the victim MDT object.

Test-Parameters: testlist=sanity-flr,sanity-ec
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I37b8eb18c5b8d3f099bc3d76ed0e4215790f61f0
57083 master J !B ✓T ✗2R -1/2−
LU-18466 lod: make sure layout gen changed under lock
needs rebase — checkpatch: cannot be cherry-picked
needs rebase 1 unresolved L +231 −136
4d
needs rebase — checkpatch: cannot be cherry-picked
enforced failed: review-dne-part-7, review-dne-zfs-part-7
1 thread(s) waiting on others
janitor run: 2 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-part-7 RHEL 9.5 / x86_64 ran 5 tests. 1 tests failed: sanity-pcc. session
review-dne-zfs-part-7 RHEL 8.10 / x86_64 ran 5 tests. 1 tests failed: sanity-scrub. session
build #116939 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Lai Siyao, Andreas Dilger, Alex Zhuravlev, Oleg Drokin
patchsets:
+23 earlier PS1 11-20 PS2 11-21 PS3 11-28 PS4 11-28 PS5 11-29 PS6 11-30 PS7 12-05 PS8 12-18 PS9 01-11 PS10 01-11 PS11 03-12 Andreas Dilger PS12 03-13 PS13 03-17 PS14 03-28 PS15 03-29 PS16 04-03 PS17 04-03 PS18 04-09 PS19 04-10 PS20 04-23 PS21 05-09 PS22 05-21 PS23 06-17
PS24 06-30 PS25 07-03 PS26 09-19 PS27 09-19 Janitor Bot PS28 09-25 Janitor Bot
threads: 0 need your reply · 1 waiting on others · 0 own notes · 0 bot
owner Zhenyu Xu · uploader Janitor Bot · PS28 uploaded 405d ago · NEW · open in Gerrit ↗
commit message
LU-18466 lod: make sure layout gen changed under lock

In transaction declaration phase, LOD layer should not change
lod_layout_gen as there is no object lock protecting it so that
its layout gen can be changed by another transaction.

This patch adds lti_layout_gen_save/lti_layout_gen_dst array to save
the layout gen before/after values, and during the transaction
execution phase with the lod object been protected with
lod_write_lock(), we would check the lod_object's layout gen, if
it keeps its value equals to lti_layout_gen_save, we'd update it to
lti_layout_gen_dst of the lod_object; if it has been changed by
others, we'd return -EAGAIN, so that MDD can retry the transaction.

This patch also fixes a glitch in mdd_xattr_set(), it needs to check
the return code for retry.

Fixes: d5ab62af24 ("LU-17048 mdd: protect layout change in MDD layer")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I6e7edabaac8f1d43d799b5ab3e2ec527d152fa55
56847 master J –B ✓T ✗7R 0/2
LU-18332 lfs: migrate to mirrored file
enforced failed: review-dne-part-3, review-dne-part-4, review-dne-zfs-part-1, review-dne-zfs-part-4, review-zfs
pw_smallfixpw_halt 8 unresolved M +221 −6
6d
enforced failed: review-dne-part-3, review-dne-part-4, review-dne-zfs-part-1, review-dne-zfs-part-4, review-zfs
8 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
failed enforced testplatformdetail
review-dne-part-3 RHEL 9.8 / x86_64 ran 3 tests. 1 tests failed: conf-sanity. session
review-dne-part-4 RHEL 9.7 / x86_64 ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. session
review-dne-part-4 RHEL 10.1 / x86_64 ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. session
review-dne-zfs-part-1 RHEL 9.8 / x86_64 ran 3 tests. 1 tests failed: sanity. session
review-dne-zfs-part-4 RHEL 9.8 / x86_64 ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. session
review-dne-zfs-part-4 RHEL 10.1 / x86_64 ran 9 tests. 2 tests failed: sanity-quota, sanity-flr. session
review-zfs RHEL 8.10 / x86_64 ran 8 tests. 2 tests failed: sanity-flr, sanity-quota. session
build #133892 SUCCESS · tests all Maloo sessions
no vote yet: Patrick Farrell
patchsets:
+14 earlier PS1 11-01 PS2 11-02 PS3 11-02 PS4 02-10 PS5 02-26 PS6 02-26 PS7 02-27 PS8 02-27 PS9 02-28 PS10 03-03 PS11 03-03 PS12 03-04 PS13 03-05 PS14 03-06
PS15 04-17 PS16 08-12 PS17 10-14 patrick bot PS18 10-16 patrick bot PS19 10-17 patrick bot
threads: 8 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS19 2026-10-18 19:30 Gerrit AI review for Lustre sanity-flr.sh:3434 — (style) Carrying this forward from patchset 6, where it was asked whether these cases should be split into separate 63a/b/c/d subtests. test
Gerrit AI review for Lustre PS19 · 2026-10-18 19:30
(style) Carrying this forward from patchset 6, where it was asked whether these cases should be split into separate 63a/b/c/d subtests. test_63 still runs all four migrations in one subtest, so a failure in one hides the others and the cases can't be run on their own.
reply PS19 2026-10-18 19:30 Gerrit AI review for Lustre sanity-flr.sh:3435 — (defect) The test needs two things on the MDS: the mdt_enable_flr_ec module parameter, which came with LU-12187 in 2.17.51, and the stale-mi
Gerrit AI review for Lustre PS19 · 2026-10-18 19:30
(defect) The test needs two things on the MDS: the mdt_enable_flr_ec module parameter, which came with LU-12187 in 2.17.51, and the stale-mirror merge support from LU-18771. A 2.16.52-70 gate lets in a released 2.17.0 MDS, which has neither. On that MDS, `cat /sys/module/mdt/parameters/mdt_enable_flr_ec` fails and the test errors out with "cannot read FLR_EC setting" instead of skipping. Should the gate use the 3-component version that includes LU-18771? The skip message should then say why the version is needed, e.g. "need MDS with stale mirror merge support".
reply PS19 2026-10-18 19:30 Gerrit AI review for Lustre lfs.c:3392 — (style) This isn't a bug, but several err_str values here end in "\n" (this one, plus "cannot get layout\n", "cannot get mirror count\n", th
Gerrit AI review for Lustre PS19 · 2026-10-18 19:30
(style) This isn't a bug, but several err_str values here end in "\n" (this one, plus "cannot get layout\n", "cannot get mirror count\n", the comp_use/mirror id ones and "cannot delete mirror\n"). The final fprintf() appends ": %s\n", so the strerror text ends up on its own line. Also, mirror_merge(), mirror_extend_layout(), lfs_mirror_resync_file() and mirror_split() already print their own errors, so every failure is reported twice. If the patch is refreshed, consider dropping the newlines and the duplicate messages.
reply PS19 2026-10-18 19:30 Gerrit AI review for Lustre lfs.c:3457 — (defect) Can this destroy the only up-to-date copy of the data? lfs_mirror_resync_file() releases its lease before the purge loop starts, an
Gerrit AI review for Lustre PS19 · 2026-10-18 19:30
(defect) Can this destroy the only up-to-date copy of the data? lfs_mirror_resync_file() releases its lease before the purge loop starts, and nothing (group lock or lease) stops writers from that point until mirror_split() runs. If the file is written in that window, the MDS picks a primary mirror (possibly an original one) and marks the new mirrors stale. mirror_split(MF_DESTROY) then removes the original. mdd_split_ea() only refuses when no *data* mirror would remain, and stale data mirrors still count. So the file ends up with only stale mirrors, and the write is lost.

The `lfs mirror delete` path checks last_non_stale_mirror() and resyncs before splitting. Should each split here do the same check, or should the whole extend/resync/purge sequence run under a lease or group lock like lfs_migrate() does in its default blocking mode?
reply PS19 2026-10-18 19:30 Gerrit AI review for Lustre lfs.c:3474 — (style) This isn't a bug, but free() and llapi_layout_free() both accept NULL, so the `if (ioc)` / `if (m_layout)` / `if (f_layout)` checks
Gerrit AI review for Lustre PS19 · 2026-10-18 19:30
(style) This isn't a bug, but free() and llapi_layout_free() both accept NULL, so the `if (ioc)` / `if (m_layout)` / `if (f_layout)` checks can go if the patch is refreshed.
reply PS19 2026-10-18 19:30 Gerrit AI review for Lustre lfs.c:5592 — (defect) Now that migrate goes through the mirror path, how is `-N=COUNT` (mirror_total_mode) meant to work? The block below subtracts the f
Gerrit AI review for Lustre PS19 · 2026-10-18 19:30
(defect) Now that migrate goes through the mirror path, how is `-N=COUNT` (mirror_total_mode) meant to work? The block below subtracts the file's existing mirror count, but lfs_migrate_to_mirror() then purges all of those original mirrors. For a file with 2 mirrors:

- `lfs migrate -N=4` creates 2 new mirrors and deletes the old 2, leaving 2 mirrors instead of 4.
- `-N=3` gives mirror_count 1, so it falls back to plain lfs_migrate().
- `-N=2` prints "no new mirrors will be created" and then runs lfs_migrate() anyway.

Should `=COUNT` be rejected for migrate, or treated as the absolute target count?
reply PS19 2026-10-18 19:30 Gerrit AI review for Lustre lfs.c:6473 — (style) This isn't a bug, but this block-local `int mirror_count` shadows the function-scope `mirror_count` that the -N parsing sets just ab
Gerrit AI review for Lustre PS19 · 2026-10-18 19:30
(style) This isn't a bug, but this block-local `int mirror_count` shadows the function-scope `mirror_count` that the -N parsing sets just above. If the patch is refreshed, a distinct name such as `total_mirrors` would make it clear which count the `> 1` check uses.
reply PS19 2026-10-18 19:30 Gerrit AI review for Lustre lfs.c:6540 — (defect) With a single mirror (`-N` or `-N1`), mirror_count is 1, so this falls through to lfs_migrate() with `param`/`layout`. With -N, tho
Gerrit AI review for Lustre PS19 · 2026-10-18 19:30
(defect) With a single mirror (`-N` or `-N1`), mirror_count is 1, so this falls through to lfs_migrate() with `param`/`layout`. With -N, though, every -E component was built into `mirror_list->m_layout` (lpp points there), and `layout` is still NULL. So `lfs migrate -N -E2M -Eeof -c-1 file` builds `param` from the last component's args and migrates to a plain, non-composite layout. The [0,2M) component and any --flags are dropped without a warning.

The new test step "migrate to 1 mirror w/ 2 components" only compares checksums, so it passes even though no component layout is created. Should the single-mirror case also go through lfs_migrate_to_mirror(), or pass `mirror_list->m_layout` to lfs_migrate()? And should the test check verify_comp_count for that step?
tags: pw_smallfix pw_halt
owner Zhenyu Xu · uploader patrick bot · PS19 uploaded 18d ago · NEW · open in Gerrit ↗
commit message
LU-18332 lfs: migrate to mirrored file

This patch makes "lfs migrate" accept -N options to migrate to a
mirrored layout.

It first merges new mirrors to the original file, then resync the
contents to all the new mirrors, and last purges the original mirrors
from the file.

The migration test enables FLR_EC on the client and every
MDT while it runs, as stale mirror merging requires both.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ie81e6120260a7406b8f8c8e57ba085666c25587a
Assisted-by: Codex:gpt-6.1-sol
Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com>
57572 master J !B ✓T ✓R -1/2−
LU-18592 lod: protect lod in-memory layout's change
needs rebase — checkpatch: cannot be cherry-picked
needs rebase 9 unresolved M +80 −31
78d
needs rebase — checkpatch: cannot be cherry-picked
9 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
CI green — no vote yet from Qian Yingjin, Andreas Dilger, Lai Siyao, Patrick Farrell
janitor run: 1 failing config(s), none unique to this patch — janitor results
11 optional test failure(s) — informational
build #127622 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Andreas Dilger, Lai Siyao, Patrick Farrell
patchsets:
+7 earlier PS1 12-23 PS2 12-23 PS3 01-03 PS4 01-10 PS5 02-14 Peter Jones PS6 02-28 PS7 08-22
PS8 09-04 PS9 09-05 PS10 09-10 PS11 09-24 PS12 07-15
threads: 9 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre COMMIT_MSG:9 — The body explains why lod_layout_mutex is needed, but two hunks aren't accounted for:
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
The body explains why lod_layout_mutex is needed, but two hunks aren't accounted for:

- `lo->ldo_flr_state = 0;` added to the plain-layout branch of lod_parse_striping()
- the extra `!lo->ldo_is_composite ||` term in the lod_declare_update_extents() assertion

Could the body say what each of those is for? As written the text reads as if the assertion should stop firing for plain layouts, but the code makes it fire more often (see the inline comment).
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre COMMIT_MSG:18 — This fixes an LBUG, so it would help to carry a Fixes: tag. The assertion being hit was added by:
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
This fixes an LBUG, so it would help to carry a Fixes: tag. The assertion being hit was added by:

    Fixes: ff5eb304fa37 ("LU-10070 lod: SEL: Implement basic spillover space")

That commit introduced lod_declare_update_extents() together with `if (lo->ldo_flr_state == LCM_FL_NONE) LASSERT(start_index == 0 && max_comp == lo->ldo_comp_cnt);` and the unlocked access to ldo_mirrors[]/ldo_comp_cnt that this change now serializes.
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre lod_lov.c:1362 — The same reset looks missing in the other two places that build a plain in-core layout after freeing the old one:
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
The same reset looks missing in the other two places that build a plain in-core layout after freeing the old one:

- lod_use_defined_striping() (lod_qos.c:2217) sets `mo->ldo_is_composite = 0` for LOV_MAGIC_V1/V3 with no ldo_flr_state reset
- lod_qos_parse_config() (lod_qos.c:2557) does the same after lod_free_comp_entries()

lod_free_comp_entries() clears ldo_mirrors, ldo_mirror_count and ldo_is_composite but not ldo_flr_state, so a composite-to-plain transition through either of those still leaves a stale value. lod_declare_layout_change() then dispatches on it, e.g. into lod_declare_update_rdonly() whose `LASSERT(lo->ldo_mirror_count > 0)` cannot hold for a plain layout. Should those get the same fix?
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre lod_object.c:7591 — Adding `!lo->ldo_is_composite ||` widens the guard rather than narrowing it: `A || B` is true whenever `B` is true, so the LASSERT is now ev
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
Adding `!lo->ldo_is_composite ||` widens the guard rather than narrowing it: `A || B` is true whenever `B` is true, so the LASSERT is now evaluated in strictly more cases than before, and the plain-layout case (`ldo_is_composite == 0`) now always evaluates it.

The commit message says ldo_flr_state is only meaningful for a composite layout and that a plain file "could get into lod_declare_update_plain()->lod_declare_update_extents() and bump into this assertion", which reads like the intent was to exempt plain layouts:

    if (lo->ldo_is_composite && lo->ldo_flr_state == LCM_FL_NONE)

With `||`, a plain file in the state that produced the LU-18592 LBUG (flr_state == LCM_FL_NONE, stale ldo_mirrors) still hits the same assertion. Which of the two is intended?
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre lod_object.c:7785 — Changing `RETURN(-EALREADY)` into `GOTO(out_unlock, rc = -EALREADY)` also routes this through `out:`, so the -EALREADY case now calls lod_st
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
Changing `RETURN(-EALREADY)` into `GOTO(out_unlock, rc = -EALREADY)` also routes this through `out:`, so the -EALREADY case now calls lod_striping_free() and drops the cached layout. Previously it returned with the cache intact.

mdd_layout_instantiate_component() turns -EALREADY into success, so every layout-write intent on an already-instantiated component now throws away the in-memory striping and forces a re-read of the LOV EA. Is that intended, or should this path skip the free?
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre lod_object.c:8613 — This isn't a bug today, but making the unlock conditional on `rc` is fragile: `out:` is reached both by fall-through with the mutex already
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
This isn't a bug today, but making the unlock conditional on `rc` is fragile: `out:` is reached both by fall-through with the mutex already released (rc == 0) and by `GOTO(out, ...)` with it still held. It only works because every goto to `out:` happens to set rc != 0 -- a future `GOTO(out, rc = 0)`, or a `lod_declare_update_extents()` return of 0 being propagated, silently leaks the mutex.

A dedicated `out_unlock:` label above `out_free:` (as was done in lod_declare_update_plain()) would make the lock state structural instead of value-dependent. Same shape in lod_declare_update_write_pending() and lod_declare_update_sync_pending().
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre lod_object.c:8825 — This assignment to ldo_flr_state is still outside ldo_layout_mutex, but lod_declare_update_write_pending() now takes the mutex and then asse
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
This assignment to ldo_flr_state is still outside ldo_layout_mutex, but lod_declare_update_write_pending() now takes the mutex and then asserts on the value:

    lod_declare_update_sync_pending()      lod_striping_reload()
      lo->ldo_flr_state = WRITE_PENDING      mutex_lock(ldo_layout_mutex)
                                             lod_parse_striping()
                                               lo->ldo_flr_state = <from disk>
                                             mutex_unlock()
      lod_declare_update_write_pending()
        mutex_lock(ldo_layout_mutex)
        LASSERT(ldo_flr_state == LCM_FL_WRITE_PENDING)  <- fires

Since this is the same class of problem the patch is fixing, should the state transition move inside the mutex (or the mutex be taken here and passed down)?
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre lod_qos.c:1582 — This isn't a bug, but `layout_lcked` is spelled `layout_locked` in every sibling function (lod_check_and_reserve_ost(), lod_ost_alloc_rr(),
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
This isn't a bug, but `layout_lcked` is spelled `layout_locked` in every sibling function (lod_check_and_reserve_ost(), lod_ost_alloc_rr(), lod_ost_alloc_specific(), lod_qos_prep_create()). Worth making it consistent if the patch is refreshed.
reply PS12 2026-07-28 05:10 Gerrit AI review for Lustre lod_qos.c:3138 — This is the one remaining caller passing `false`, and it leaves the two lock orders divergent:
Gerrit AI review for Lustre PS12 · 2026-07-28 05:10
This is the one remaining caller passing `false`, and it leaves the two lock orders divergent:

    lod_prepare_create()                    -> lod_ost_alloc_{qos,rr}()
                                               lq_rw_sem / ltd_rw_sem held
                                               -> lod_comp_is_ost_used(..., false)
                                                  -> mutex_lock(ldo_layout_mutex)

    lod_declare_update_plain()  mutex_lock(ldo_layout_mutex)
                                -> lod_declare_instantiate_components()
                                   -> lod_qos_prep_create(..., true)
                                      -> lod_ost_alloc_qos() down_write(lq_rw_sem)

So ldo_layout_mutex is now above lq_rw_sem on the new paths and below it here. This isn't reachable as a hang today (the MDT holds the layout LDLM lock EX for both entry points on a given object), but it makes the ordering depend on an unrelated lock. Would it be cleaner to have lod_prepare_create() take ldo_layout_mutex too and pass `true` everywhere, so lod_obj_for_each_stripe() never has to acquire it as an inner lock?

Related: the new critical section now spans OST allocation, which includes a `down_write_killable()` with a 2s timer in lod_ost_alloc_qos() and lod_sub_declare_create() on OSP objects, so the per-object layout mutex is held far longer than before.
owner Zhenyu Xu · uploader Zhenyu Xu · PS12 uploaded 112d ago · NEW · open in Gerrit ↗
commit message
LU-18592 lod: protect lod in-memory layout's change

The lod::ldo_flr_state is only meaningful for composite layout, while
a plain file could get into lod_declare_update_plain()->
lod_declare_update_extents() and bump into this assertion.

lod_declare_update_extents() ) ASSERTION(start_index == 0 &&
	max_comp == lo->ldo_comp_cnt)

And lod_declare_update_extents() would modify lod's layout, it needs
lod_layout_mutex's protection for consistence.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I2b3d32b32efb88317c124a7975dfd9889333bc8a
59350 master J !B ✓T ✗1R -1/1−
LU-19037 osc: initialize osc_object::oo_tree
enforced failed: review-dne-part-5
1 unresolved XS +1 −0
89d
enforced failed: review-dne-part-5
Timothy Day voted -1
1 thread(s) waiting on others
janitor run: 1 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-part-5 failed 2× RHEL 9.5 / x86_64 ran 5 tests. 1 tests failed: sanityn. session
1 optional test failure(s) — informational
build #114129 SUCCESS · tests all Maloo sessions
reviews: Timothy Day -1 2026-08-07 15:40
no vote yet: Qian Yingjin, Andreas Dilger, Patrick Farrell
patchsets:
+4 earlier PS1 05-21 PS2 05-22 PS3 05-22 PS4 05-22
PS5 05-27 PS6 05-27 PS7 06-03 PS8 06-06 PS9 06-10
threads: 0 need your reply · 1 waiting on others · 0 own notes · 0 bot
owner Zhenyu Xu · uploader Zhenyu Xu · PS9 uploaded 513d ago · NEW · backport · open in Gerrit ↗
commit message
LU-19037 osc: initialize osc_object::oo_tree

Initialize the radix tree of osc_object::oo_tree.

Lustre-change: https://review.whamcloud.com/59340
Lustre-commit: 1f4d2013929bd61f775e6c98a4122fe143b4242b

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Change-Id: I77a19cb08ccc52f4eb3457cd3367884b84624054
65013 master J !B ✓T ✓R -1/2−
LU-20066 obdclass: cache obd_name in client_obd
needs rebase — checkpatch: cannot be cherry-picked
needs rebase 2 unresolved S +15 −1
94d
needs rebase — checkpatch: cannot be cherry-picked
2 unresolved thread(s) await your reply — last from Andreas Dilger
CI green, no reviews yet — add reviewers
janitor run: 4 failing config(s), none unique to this patch — janitor results
6 optional test failure(s) — informational
build #123263 SUCCESS · tests all Maloo sessions
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-04-07 10:36 Andreas Dilger lustre_osc.h:738 — This could also crash if `cl_obd_name` is not allocated? It would be better to make this a static `char cl_obd_name[OBD_NAME_MAX]` buffer t
Andreas Dilger PS1 · 2026-04-07 10:36
This could also crash if `cl_obd_name` is not allocated?  It would be better to make this a static `char cl_obd_name[OBD_NAME_MAX]` buffer to avoid that.

There are 34 bytes of holes in `struct client_obd` that could be packed a bit better, and this struct is already 3640 bytes in size, so adding a bit more is not _quite_ going to push it over the 4096-byte size.
reply PS1 2026-04-07 10:36 Andreas Dilger ldlm_lib.c:579 — (style) `obd_name` is a fixed-size buffer, why not use the same instead of allocating a separate buffer? Otherwise, it seems possible that
Andreas Dilger PS1 · 2026-04-07 10:36
(style) `obd_name` is a fixed-size buffer, why not use the same instead of allocating a separate buffer?  Otherwise, it seems possible that the import is accessed without `cl_obd_name` being allocated and *that* will crash...
owner Zhenyu Xu · uploader Zhenyu Xu · PS1 uploaded 218d ago · NEW · open in Gerrit ↗
commit message
LU-20066 obdclass: cache obd_name in client_obd

client_obd's cli_import could be freed when the obd is being cleaned
up, while in shrinker, we need to print the obd_name, which could
cause use after free. This patch adds a new field cli_obd_name to
cache the obd_name to avoid use after free.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ic0434b9facd5eb2ef4f5df56c871ea6c4d0d8dc1
58276 master J ✓B ✓T ✓R -1/2−
LU-17771 debug: getstripe -r to recursively getstripe
needs rebase — checkpatch: cannot be cherry-picked
needs rebase stalled 372d 2 unresolved S +13 −12
372d
needs rebase — checkpatch: cannot be cherry-picked
2 unresolved thread(s) await your reply — last from Arshad Hussain
CI green — no vote yet from Andreas Dilger
1 optional test failure(s) — informational
build #116925 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets: PS1 03-03 PS2 09-24 Arshad Hussain PS3 09-24 Arshad Hussain PS4 09-25 Arshad Hussain
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2025-03-08 19:55 Arshad Hussain sanity.sh:7759 — We should check for error here '... || error "nnn"'
Arshad Hussain PS1 · 2025-03-08 19:55
We should check for error here '... || error "nnn"'
reply PS1 2025-03-08 19:55 Arshad Hussain sanity.sh:7767 — This change is correct.
Arshad Hussain PS1 · 2025-03-08 19:55
This change is correct.
owner Zhenyu Xu · uploader Arshad Hussain · PS4 uploaded 406d ago · NEW · open in Gerrit ↗
commit message
LU-17771 debug: getstripe -r to recursively getstripe

'-r' is the correct option to recursively get the stripe information
under a directory.

'-R' is for printing layout information without substituting the
filesystem's default values for unspecified fields.

Test-Parameters: trivial testlist=sanity env=ONLY=56s, ONLY_REPEAT=100
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ib6ef3ddb431e5f33a070c6ea435b7821b8fabb9d
54528 master J !B ✓T ✗2R -1/2−
LU-17663 osc: extent find only care for write
enforced failed: review-ldiskfs
stalled 457d S +4 −29
457d
enforced failed: review-ldiskfs
Alexey Lyashkov voted -1
janitor run: 1 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-ldiskfs RHEL 8.9 / x86_64, RHEL 9.3 / x86_64 ran 5 tests. 1 tests failed: sanity. session
review-ldiskfs RHEL 9.3 / x86_64 ran 5 tests. 1 tests failed: sanity. session
2 optional test failure(s) — informational
build #108831 SUCCESS · tests all Maloo sessions
reviews: Alexey Lyashkov -1 2024-11-05 18:38
no vote yet: Qian Yingjin, Andreas Dilger, Patrick Farrell
patchsets: PS1 03-22 PS2 07-31 PS3 09-18 PS4 11-05
owner Zhenyu Xu · uploader Zhenyu Xu · PS4 uploaded 729d ago · NEW · open in Gerrit ↗
commit message
LU-17663 osc: extent find only care for write

Don't use read lock in extent, read with different regions have
different compatible read locks.

Fixes: 67aca1fcc6 ("LU-16160 osc: take ldlm lock when queue sync pages")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Iceb05eb22744debc2e8122ef3ee451d149d79195
55918 master J ✗1B ✓T …R 0/2
LU-17993 debug: to reveal page count issue
janitor: 1 test failure unique to this patch — sanity2@ldiskfs+DNE:test_398c
1 unique failure stalled 457d 8 unresolved M +79 −3
457d
janitor: 1 test failure unique to this patch — sanity2@ldiskfs+DNE:test_398c
5 unresolved thread(s) await your reply — last from Oleg Drokin
build OK — testing in progress (typically 6–14h)
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
sanity2@ldiskfs+DNE:test_398cseen in 1 other review
build #107556 SUCCESS · tests all Maloo sessions · test queue
no vote yet: Qian Yingjin, Shaun Tancheff, Hongchao Zhang, Patrick Farrell
patchsets:
+17 earlier PS1 08-02 PS2 08-05 PS3 08-07 PS4 08-08 PS5 08-29 Hongchao Zhang PS6 08-30 Hongchao Zhang PS7 08-30 Hongchao Zhang PS8 09-01 Hongchao Zhang PS9 09-02 Hongchao Zhang PS10 09-03 Hongchao Zhang PS11 09-03 Hongchao Zhang PS12 09-04 Hongchao Zhang PS13 09-04 Hongchao Zhang PS14 09-05 Hongchao Zhang PS15 09-05 Hongchao Zhang PS16 09-05 Hongchao Zhang PS17 09-09 Hongchao Zhang
PS18 09-09 Hongchao Zhang PS19 09-10 Hongchao Zhang PS20 09-10 Hongchao Zhang PS21 09-11 Hongchao Zhang PS22 09-12 Hongchao Zhang
threads: 5 need your reply · 0 waiting on others · 3 own notes · 0 bot
reply PS2 2024-08-05 23:05 Oleg Drokin COMMIT_MSG:12 — since it looks like this patch will get refreshed eventually, please also fix this typo -> divide.
Oleg Drokin PS2 · 2024-08-05 23:05
since it looks like this patch will get refreshed eventually, please also fix this typo -> divide.
reply PS1 2024-08-03 06:05 Shaun Tancheff file.c:2184 — truncate
Shaun Tancheff PS1 · 2024-08-03 06:05
truncate
note PS1 2024-08-05 04:51 Zhenyu Xu rw26.c:387 — I have a doubt here, if the start of the 1st page is not page aligned, since @to most of time is PAGE_SIZE, so at each loop, the page is alw
Zhenyu Xu PS1 · 2024-08-05 04:51
I have a doubt here, if the start of the 1st page is not page aligned, since @to most of time is PAGE_SIZE, so at each loop, the page is always not page aligned as well, is it a glitch here?

Should @to be like this:
       if (from != 0)
              to = min(PAGE_SIZE - from, from + size);
       else
              to = min(PAGE, from + size);
and except the 1st/last page, all pages in the middle should always be aligned full page.
reply PS2 2024-08-27 06:27 Shaun Tancheff rw26.c:386 — No changes here, code is correct as is.
Shaun Tancheff PS2 · 2024-08-27 06:27
No changes here, code is correct as is.
reply PS2 2024-08-06 14:45 Patrick Farrell rw26.c:388 — Thanks, I can't reproduce that bug locally...
Patrick Farrell PS2 · 2024-08-05 14:55
Hmm, this looks correct - good catch...  But it's blowing up, so probably something wrong I don't see.
Patrick Farrell PS2 · 2024-08-05 21:20
Wait, no.  If from != 0, to is still "from + size".  To is always from + size, except when it's outside of the page, in which case it's end-of-page/PAGE_SIZE.
Zhenyu Xu PS2 · 2024-08-06 10:43
right, I was wrong here.
Zhenyu Xu PS2 · 2024-08-06 14:43
I'm still investigating why visited page count does not match pv->ldp_count
Patrick Farrell PS2 · 2024-08-06 14:45
Thanks, I can't reproduce that bug locally...
note PS1 2024-08-05 04:51 Zhenyu Xu cl_io.c:1383 — from here we can see that the end of the 1st page is page aligned.
Zhenyu Xu PS1 · 2024-08-05 04:51
from here we can see that the end of the 1st page is page aligned.
note PS1 2024-08-05 04:51 Zhenyu Xu cl_io.c:1387 — and the end of the last page could be page unaligned.
Zhenyu Xu PS1 · 2024-08-05 04:51
and the end of the last page could be page unaligned.
reply PS1 2024-08-03 07:16 Andreas Dilger sanity.sh:14393 — More importantly, for older servers the unaligned DIO should be handled gracefully in some manner, since applications running on newer clien
Shaun Tancheff PS1 · 2024-08-03 06:05
Can we do:

unaligned_dio || skip "Need unaligned dio support"

Instead of server version check?
Andreas Dilger PS1 · 2024-08-03 07:16
More importantly, for older servers the unaligned DIO should be handled gracefully in some manner, since applications running on newer clients will try this and we shouldn't allow them to crash the servers. Just skipping the test doesn't solve the interop problem.

One option for UDIO is to expose the DIO alignment via statx, as XFS does. That will allow userspace applications to know what the DIO alignment requirements are, and applications that don't follow them can return EIO or other error directly (as they did befoer UDIO existed, instead of trying to emulate their way through the issues.
owner Zhenyu Xu · uploader Hongchao Zhang · PS22 uploaded 784d ago · NEW · open in Gerrit ↗
commit message
LU-17993 debug: to reveal page count issue

as title

Test-Parameters: fortestonly
Test-Parameters: testlist=sanity env=ONLY=119h,ONLY_REPEAT=500 clientdistro=el8.8 serverdistro=el8.8
Signed-off-by: Hongchao Zhang <hongchao@whamcloud.com>
Change-Id: Ia502400fb20603c369c34a3fb397a472cc3403c3
13042 master J –B ✓T ✗0R +1/2
LU-5869 osc: handle ldlm_handle2lock() static analysis issue
Maloo voted -1 — tests failed (details on the change)
stalled 457d XS +7 −0
457d
reviews: Dmitry Eremin +1 2015-07-20 21:36
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 4133d ago · NEW · open in Gerrit ↗
commit message
LU-5869 osc: handle ldlm_handle2lock() static analysis issue

Even though ldlm_handle2lock() may return NULL, but ldlm_lock_match()
will add a reference on the matched lock, we add an error path to
handle this case.

Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
Change-Id: I56c72129a2414468ee59320cfc1c29b5a72ce0c3
15390 master J –B ✓T ✗0R 0/2
LU-4388 test: add sanity test case 118o
Maloo voted -1 — tests failed (details on the change)
stalled 457d S +22 −2
457d
build #57410 SUCCESS
no vote yet: Jinshan Xiong
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 3025d ago · NEW · open in Gerrit ↗
commit message
LU-4388 test: add sanity test case 118o

Add a sanity test case 118o to verify fsync issues OST_SYNC.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I4f40f0853934fd0b3e105efd76f0deeaddecb1af
15856 master J –B ✓T ✗0R 0/2
LU-6960 utils: erase mgsnode param with tunefs.lustre
Maloo voted -1 — tests failed (details on the change)
stalled 457d M +71 −1
457d
owner Zhenyu Xu · uploader Zhenyu Xu · PS8 uploaded 3809d ago · NEW · open in Gerrit ↗
commit message
LU-6960 utils: erase mgsnode param with tunefs.lustre

When we need to change MGS node, "tunefs.lustre --mgsnode" would only
append to existing mgsnode params.

This patch add a "--erase-mgsnode" parameter to wipe existing mgsnode
and append mgsnode parameters afterwards.

Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
Change-Id: I90799a0338e9f4a5f2a606388ea3dd0384ae703f
32789 master J –B ✗T –R +0/2−
LU-11118 llite: restrain initial read-ahead window length
build failure (#57148)
stalled 457d S +11 −9
457d
build failure (#57148)
Andreas Dilger voted -1
build #57148 FAILURE
reviews: Patrick Farrell +1 2019-01-09 22:01 · Andreas Dilger -1 2019-01-09 22:12
no vote yet: Rahul Deshmukh
owner Zhenyu Xu · uploader Zhenyu Xu · PS3 uploaded 3038d ago · NEW · open in Gerrit ↗
commit message
LU-11118 llite: restrain initial read-ahead window length

Restrain the initial read-ahead window length to a reasonable value,
no more than the file's size.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ib0b5d62e57d847f36912020c8089b7b53ab7d618
33556 master J !B ✓T ✗1R +1/2
LU-11600 obd: refactor cl_loi_list_lock
enforced failed: review-dne-zfs-part-1
stalled 457d M +114 −105
457d
janitor run: 1 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-zfs-part-1 RHEL 8.7/x86_64 ran 4 tests. 1 tests failed: sanity. session
1 optional test failure(s) — informational
build #96060 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger +1 2023-07-06 19:32
no vote yet: Qian Yingjin, Shuichi Ihara, Neil Brown, Li Dongyang, Patrick Farrell, Sergey Cheremencev
patchsets: PS4 11-15 PS5 11-16 PS6 11-30 PS7 07-04
owner Zhenyu Xu · uploader Zhenyu Xu · PS7 uploaded 1219d ago · NEW · open in Gerrit ↗
commit message
LU-11600 obd: refactor cl_loi_list_lock

client_obd::cl_loi_list_lock is likely getting quite hot in the IO
path. This patch split it into another client_obd::cl_grant_lock to
protect the OSC grant counters for the small window where they are
modified.

Change-Id: I05573baeeaa9e400963ffd528df118bb67ae381c
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
49164 master J !B ✓T ✗1R -1/2−
LU-16315 llite: invoke sync after write for synchorous write
enforced failed: review-zfs
stalled 457d 3 unresolved M +89 −10
457d
enforced failed: review-zfs
Li Xi voted -1
2 unresolved thread(s) await your reply — last from Li Xi
1 thread(s) waiting on others
janitor run: 3 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-zfs CentOS 8.5/x86_64 ran 10 tests. 1 tests failed: replay-single. session
2 optional test failure(s) — informational
build #90835 SUCCESS · tests all Maloo sessions
reviews: Li Xi -1 2022-12-20 13:04
no vote yet: Qian Yingjin
patchsets:
+3 earlier PS1 11-15 PS2 11-16 PS3 11-16
PS4 11-17 PS5 11-17 PS6 11-17 PS7 11-17 PS8 11-24
threads: 2 need your reply · 1 waiting on others · 0 own notes · 0 bot
reply PS8 2023-05-08 02:51 Li Xi COMMIT_MSG:9 — typo: write -> write
Li Xi PS8 · 2023-05-08 02:51
typo: write -> write
reply PS3 2022-11-16 11:20 Li Xi sanity-pfl.sh:2518 — Will this "wait" for all dd to finish?
Li Xi PS3 · 2022-11-16 11:20
Will this "wait" for all dd to finish?
As far as I tested, even dd blocked, wait will return without any problem.
I think checking "ps aux | grep dd | grep oflag=sync | wc -l" would be better. And it is necessary to repeat this test for several times. This test can pass for several times (~3) sometimes, but repeating will always hit the stuck.
owner Zhenyu Xu · uploader Zhenyu Xu · PS8 uploaded 1442d ago · NEW · open in Gerrit ↗
commit message
LU-16315 llite: invoke sync after write for synchorous write

A sync write need perform sync after the wrile, while we shouldn't
start an nested clio in another one (they share the same clio
environment while the nested clio would be reset). And a deadlock
could be ensued as following call traces show:

thread1:
======================================================================
ll_layout_refresh+0x1b2/0x9c0 [lustre]  // waiting for the update of
                                        // the layout after ll_fsync
vvp_io_init+0x23f/0x3a0 [lustre]
cl_io_init0.isra.13+0xa8/0x170 [obdclass]
cl_sync_file_range+0x206/0x340 [lustre]
ll_fsync+0x57c/0x5e0 [lustre]
generic_write_sync+0x4f/0x70
vvp_io_write_start+0x8a6/0x1000 [lustre]
cl_io_start+0x75/0x130 [obdclass]
cl_io_loop+0xd4/0x1f0 [obdclass]
ll_file_io_generic+0x685/0xc70 [lustre]
ll_file_aio_write+0x308/0x470 [lustre]
ll_file_write+0xe3/0x1d0 [lustre]
vfs_write+0xc0/0x1f0
SyS_pwrite64+0x92/0xc0
system_call_fastpath+0x25/0x2a
======================================================================

thread2:
======================================================================
lov_layout_wait.isra.35+0x14a/0x260 [lov] // waiting for thread2 to be
                                          // the only active IO upon
                                          // the file, while thread1
                                          // is working on the file
                                          // at the same time
lov_conf_set+0x1b0/0xb30 [lov]
cl_conf_set+0x7c/0x150 [obdclass]
ll_layout_conf+0x82/0x420 [lustre]
ll_layout_refresh+0x7bf/0x9c0 [lustre]
vvp_io_init+0x23f/0x3a0 [lustre]
cl_io_init0.isra.13+0xa8/0x170 [obdclass]
cl_io_init+0x41/0x90 [obdclass]
cl_io_rw_init+0x113/0x220 [obdclass]
ll_file_io_generic+0x2e5/0xc70 [lustre]
ll_file_aio_write+0x308/0x470 [lustre]
ll_file_write+0xe3/0x1d0 [lustre]
vfs_write+0xc0/0x1f0
SyS_pwrite64+0x92/0xc0
system_call_fastpath+0x25/0x2a
======================================================================

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Icac5296a269d7e428d2b934973ac2b80651e20fc
50310 master J !B ✓T ✗2R 0/2
LU-14765 llite: update inode's block numbers in mirror split
enforced failed: review-dne-selinux-ssk-part-1, review-dne-selinux-ssk-part-2
stalled 457d S +16 −8
457d
janitor run: 2 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-selinux-ssk-part-1 RHEL 8.8/x86_64 ran 3 tests. 1 tests failed: sanity. session
review-dne-selinux-ssk-part-2 RHEL 8.8/x86_64 ran 5 tests. 1 tests failed: sanity-sec. session
build #100507 SUCCESS · tests all Maloo sessions
no vote yet: Etienne AUJAMES, Andreas Dilger, Alex Zhuravlev
patchsets:
+5 earlier PS1 03-16 PS2 03-16 PS3 03-16 PS4 03-16 PS5 03-31
PS6 04-13 PS7 04-14 PS8 06-02 PS9 06-13 Andreas Dilger PS10 11-26 Andreas Dilger
owner Zhenyu Xu · uploader Andreas Dilger · PS10 uploaded 1075d ago · NEW · open in Gerrit ↗
commit message
LU-14765 llite: update inode's block numbers in mirror split

In mirror split, MDT cannot know the exact number of blocks to be
freed, so it changes the SOM flag as SOM_FL_LAZY (0x4), this patch
adds a stat operation in llite when MDT has finished the mirror split
to fetch the inode's correct block numbers from all of its stripes.
This is sent to the MDS later on close and stored in LSOM xattr.

Fixes: a30750ad2c ("LU-14526 flr: mirror split downgrade SOM")
Test-Parameters: testlist=sanity-flr env=ONLY=44c,ONLY_REPEAT=100
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Id9c0108e2cd230f3e68f97f06f3c08579930fd3c
39411 master J !B ✓T ✗6R +2/2
LU-13794 util: changing comp-flags get stuck when OST is down
enforced failed: review-dne-part-1, review-dne-part-4, review-dne-zfs-part-1, review-dne-zfs-part-2, review-dne-zfs-part-4, review-zfs
stalled 464d XS +0 −8
464d
failed enforced testplatformdetail
review-dne-part-1 CentOS 7.0/x86_64 ran 6 tests. 1 tests failed: sanityn. session
review-dne-part-4 RHEL 7.8/x86_64 ran 10 tests. 1 tests failed: replay-single. session
review-dne-zfs-part-1 CentOS 7.0/x86_64 ran 8 tests. 2 tests failed: sanityn, sanity. session
review-dne-zfs-part-2 CentOS 7.0/x86_64 ran 11 tests. 1 tests failed: sanity-hsm. session
review-dne-zfs-part-4 RHEL 7.8/x86_64 ran 10 tests. 1 tests failed: replay-single. session
review-zfs crashed RHEL 7.8/x86_64 ran 10 tests. 1 tests failed: sanity-quota. %% THIS TEST SESSION CRASHED %% session
2 optional test failure(s) — informational
build #15730 SUCCESS
reviews: Andreas Dilger +1 2020-07-17 09:13 · Li Dongyang +1 2020-07-19 23:45
owner Zhenyu Xu · uploader Zhenyu Xu · PS1 uploaded 2302d ago · NEW · open in Gerrit ↗
commit message
LU-13794 util: changing comp-flags get stuck when OST is down

In scenario of trying to write a FLR file when a mirror is
unavailable because some OST(s) serving the mirror is unavailable
at the time, admin could set preferred mirror for the write
choosing another healthy mirror. While the preference setting
api llapi_layout_file_comp_set() is trying to flush data before
setting the preference flag of the file's layout, the flush
would trip over the unavailable OST(s) and hung the setting.

Flushing data is not a necessary procedure in the component flag
setting.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Id20a21dc693b6662df7773158c76f093f36ef9aa
40483 master J ✗4B ✓T ✗6R +1/2
LU-14096 llog: proper release dt_object in llog_open_create()
janitor: 4 test failures unique to this patch — ost-pools@ldiskfs+DNE:test_15, ost-pools@ldiskfs+DNE:test_20, recovery-small@ldiskfs+DNE:test_18c +1 more
4 unique failures stalled 464d XS +1 −1
464d
janitor: 4 test failures unique to this patch — ost-pools@ldiskfs+DNE:test_15, ost-pools@ldiskfs+DNE:test_20, recovery-small@ldiskfs+DNE:test_18c +1 more
enforced failed: review-dne-part-2, review-dne-part-3, review-dne-zfs-part-1, review-dne-zfs-part-2, review-dne-zfs-part-5, review-ldiskfs-arm
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
ost-pools@ldiskfs+DNE:test_15seen in 11 other reviews
ost-pools@ldiskfs+DNE:test_20seen in 13 other reviews
recovery-small@ldiskfs+DNE:test_18cseen in 4 other reviews
sanity2@zfs:test_398gseen in 29 other reviews
failed enforced testplatformdetail
review-dne-part-2 RHEL 8.6/x86_64 ran 9 tests. 1 tests failed: replay-dual. session
review-dne-part-3 RHEL 8.6/x86_64 ran 3 tests. 1 tests failed: conf-sanity. session
review-dne-zfs-part-1 CentOS 8.5/x86_64 ran 6 tests. 1 tests failed: sanity. session
review-dne-zfs-part-2 CentOS 8.5/x86_64 ran 7 tests. 1 tests failed: replay-dual. session
review-dne-zfs-part-5 CentOS 8.5/x86_64 ran 6 tests. 2 tests failed: sanityn, recovery-small. session
review-ldiskfs-arm RHEL 8.6/aarch64, RHEL 8.6/x86_64 ran 6 tests. 1 tests failed: sanity-lnet. session
3 optional test failure(s) — informational
build #89881 SUCCESS · tests all Maloo sessions
reviews: Arshad Hussain +1 2022-10-10 11:12
no vote yet: Andreas Dilger
owner Zhenyu Xu · uploader Andreas Dilger · PS2 uploaded 1489d ago · NEW · open in Gerrit ↗
commit message
LU-14096 llog: proper release dt_object in llog_open_create()

In the rare case when the device is set rdonly, llog_open_create()
need to release the just opened llog_handle.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I3fe61a2ab0cc50f5336d04d8ee00d5280315aa7c
▶

Review feedback — your turn

(3)
68778 master J !B ✓T ✓R +1/2
LU-20703 llite: limit readahead window by the readahead budget
3 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
3 unresolved M +84 −5
43d
3 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
no vote yet from Qian Yingjin, Li Dongyang
janitor run: 4 failing config(s), none unique to this patch — janitor results
build #131763 SUCCESS · tests all Maloo sessions
reviews: Xiyang Wang +1 2026-09-22 11:49
no vote yet: Qian Yingjin, Li Dongyang
patchsets: PS1 09-10 PS2 09-15
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS2 2026-09-16 07:36 Gerrit AI review for Lustre rw.c:1288 — (minor) The comment above the block still says the readahead goes "up to ra_max_pages_per_file", and the CDEBUG below prints ra_max_read_ahe
Gerrit AI review for Lustre PS2 · 2026-09-16 07:36
(minor) The comment above the block still says the readahead goes "up to ra_max_pages_per_file", and the CDEBUG below prints ra_max_read_ahead_whole_pages and ra_max_pages_per_file.  Neither is the limit any more.  If the patch is refreshed, could the comment name the effective limit and the trace print ra_max_window_pages(ra) (or ra_max_pages) so the dump matches what the window is actually clamped to?
reply PS2 2026-09-16 07:36 Gerrit AI review for Lustre rw.c:1309 — (defect) Capping this window makes it possible for ras_whole_file_read to be true while the window no longer covers the file, and nothing re
Gerrit AI review for Lustre PS2 · 2026-09-16 07:36
(defect) Capping this window makes it possible for ras_whole_file_read to be true while the window no longer covers the file, and nothing recovers from that.

The entry test is kms_pages <= ra_max_read_ahead_whole_pages, but the window is now min(ra_max_window_pages(ra), ra_max_read_ahead_whole_pages).  max_read_ahead_whole_mb is only clamped against ra_max_pages_per_file and max_read_ahead_mb is not clamped against it at all, so ra_max_pages < kms_pages <= ra_max_read_ahead_whole_pages is reachable: with brw_size=16M (whole = 16M) and max_read_ahead_mb=8, a 12M file on its second read gets ras_whole_file_read = true and a 8M window.

From there ll_readahead() takes end_idx = ras_window_start_idx + ras_window_pages - 1 and only stretches it far enough to cover the current read, ras_update() returns early on ras_whole_file_read so the window is never grown or moved, and this function resets ras_next_readahead_idx to 0 on every read() while the whole-file test keeps matching.  The readahead frontier can never pass ra_max_pages, and the tail of the file is read a page per RPC for the life of the fd.

Before the patch the window was ra_max_read_ahead_whole_pages >= kms_pages, so the frontier walked to EOF: ll_ra_count_get() clamped each reservation to the remaining budget, and cached pages return 1 from ll_read_ahead_page() without consuming any reservation.

Would folding the budget into the entry test fix it, so the normal detector keeps running when the budget cannot cover the file?

    if (kms_pages && kms_pages <= min(ra->ra_max_read_ahead_whole_pages,
                                      ra_max_window_pages(ra))) {
reply PS2 2026-09-16 07:36 Gerrit AI review for Lustre sanity.sh:13358 — (suggestion) This was raised on patchset 1 and the pass criterion is unchanged: 101d still passes or fails on two dd wall-clock numbers, whi
Gerrit AI review for Lustre PS2 · 2026-09-16 07:36
(suggestion) This was raised on patchset 1 and the pass criterion is unchanged: 101d still passes or fails on two dd wall-clock numbers, which is what makes it flaky in the first place.

Now that the patch makes the async gate reachable, the new instrumentation already reads the values that would make this deterministic.  Could the test also assert on them unconditionally, e.g. llite.*.read_ahead_stats async_readahead > 0, or that the osc.*.rpc_stats read histogram is not dominated by 1-page RPCs?  That would fail for the LU-20703 reason rather than for timing noise.
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 51d ago · NEW · open in Gerrit ↗
commit message
LU-20703 llite: limit readahead window by the readahead budget

The per-file readahead window is capped by ra_max_pages_per_file,
independently of the global readahead budget ra_max_pages
(llite.*.max_read_ahead_mb).  When the budget is set below the
per-file window (e.g. sanity/101d sets max_read_ahead_mb=40 while
max_read_ahead_per_file_mb=64 on a 64K-page client), the readahead
window target exceeds the whole readahead budget, and then:

* the async readahead gate in kickoff_async_readahead() is never
  satisfied: the throttle defaults to ra_max_pages_per_file, so
  the gate only opens at the maximal window, but a cache miss
  runs ras_reset() and drops the window back to 0, and it takes
  ra_max_pages_per_file / ras_rpc_pages growth steps to climb
  back;
* every cache miss runs a synchronous readahead walk that reserves
  the whole remaining budget and holds it until its read RPCs
  complete;
* while the budget is in flight the reader catches up with the
  readahead frontier, and further misses can only reserve one page
  via the pages_min override, degenerating into a storm of one-page
  (64KB) read RPCs plus per-miss readahead state and lock-match
  overhead, making the readahead-enabled read slower than the
  readahead-disabled one: "readahead 22.8092s > no-readahead
  10.3606s (80M)".

Limit the effective per-file readahead window by the readahead
budget with a new helper ra_max_window_pages(), and use it where
the window growth is capped (ras_stride_increase_window(),
ras_increase_window()), where the whole-file-read window is
initialized (ll_ras_enter()) and in the async readahead gate
(kickoff_async_readahead()).  The stored tunables are unchanged,
so raising max_read_ahead_mb again restores the original behavior.

The window grows in ras_rpc_pages steps once it reaches one RPC
(ras_increase_window() aligns every step), so it tops out at
ra_max_window_pages() rounded down to the RPC size.  Round the
async readahead throttle down to the same granularity, otherwise
it can exceed every value the window can take and async readahead
never fires (e.g. brw_size=16 on a 64K-page client with
max_read_ahead_mb=40: window tops out at 512 pages, throttle is
640).  Throttles below one RPC are left unaligned, since such
windows are still reachable via the sub-RPC window in
ras_increase_window().

Also add opt-in (DEBUG_101D=1, or DEBUG_101D=trace to also capture
the D_READA trace) instrumentation to sanity/101d, which dumps the
readahead parameters, readahead stats and read RPC size histogram
around the measured reads, and restores the debug mask via
debugsave()/debugrestore() when tracing.

Assisted-by: Augment Agent:GLM 5.3 Flash
Test-Parameters: testlist=sanity.sh env=ONLY=101d,ONLY_REPEAT=50 clientdistro=rocky9.5 clientarch=aarch64
Fixes: c2791674260b ("LU-12043 llite: improve single-thread read performance")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I01818568c4cba4ff40bee0b725f7e7dcf0bc9063
55547 master J ✓B ✓T ✓R 0/2
LU-17981 test: replay-single/test_46 ineffective
1 unresolved thread(s) await your reply — last from Andreas Dilger
stalled 384d 1 unresolved XS +1 −1
384d
1 unresolved thread(s) await your reply — last from Andreas Dilger
CI green — no vote yet from Andreas Dilger
build #108438 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets: PS1 06-27 PS2 09-11 PS3 10-22 Andreas Dilger
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS3 2025-10-17 00:32 Andreas Dilger replay-single.sh:1083 — (minor) it would be better to confirm that "FID" had something in it? Otherwise the "grep didn't find anything" is too easily broken.
Andreas Dilger PS3 · 2025-10-17 00:32
(minor) it would be better to confirm that "FID" had something in it?  Otherwise the "grep didn't find anything" is too easily broken.

Also, add a comment in the code where this "force closing file handle" message is printed to ensure it is not changed.
owner Zhenyu Xu · uploader Andreas Dilger · PS3 uploaded 743d ago · NEW · open in Gerrit ↗
commit message
LU-17981 test: replay-single/test_46 ineffective

Should pass path of the test file to "lfs path2fid" to make it
an effective test.

Fixes: c0fa0ba4a8 ("LU-12368 ptlrpc: make DEBUG_REQ messages consistent")
Test-Parameters: trivial testlist=replay-single env=ONLY=46
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I8f7de367aee356e3d7db97f57a130c9b004f2942
4954 master J –B ✓T ✓R +1/2−
LU-2468 ldlm: shrinker path should not allocate memory
Oleg Drokin voted -1
stalled 457d XS +1 −1
457d
build #11747 SUCCESS
reviews: Niu Yawei +1 2013-12-21 01:06 · Oleg Drokin -1 2013-12-21 01:06 · Fan Yong +1 2013-12-21 01:06
no vote yet: Commit Reviewer
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 5051d ago · NEW · open in Gerrit ↗
commit message
LU-2468 ldlm: shrinker path should not allocate memory

Found a glitch along the ldlm_shrink path,
ldlm_pool_shrink()-> ldlm_cli_pool_shrink()->
ldlm_cancel_lru(ns, nr, LDLM_ASYNC, LDLM_CANCEL_SHRINK)->
ldlm_bl_to_thread_list(ns, NULL, &cancels, nr, LDLM_ASYNC)->
ldlm_bl_to_thread(ns, NULL, cancels, nr, LDLM_ASYNC)->
OBD_ALLOC(blwi, sizeof(*blwi))

Shrinker path should not allocate memory again.

Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
Change-Id: I91a451303e636b94e74829a97e8c8305a95cfc9b
▶

In CI

(4)
58253 master J –B ✓T …R +2/2
LU-17531 lfs: add 'mirror extend --no-resync' option
build OK — testing in progress (typically 6–14h)
pw_smallfixpt_ecro M +189 −4
48m
build #135404 SUCCESS · tests all Maloo sessions · test queue
reviews: Marc Vef +1 2026-11-04 17:31 · Andreas Dilger +1 2026-11-05 08:42
no vote yet: Ronnie Sahlberg, Jian Yu, Patrick Farrell
patchsets:
+20 earlier PS1 02-27 PS2 02-27 PS3 02-28 PS4 03-01 PS5 03-03 PS6 03-03 PS7 03-04 PS8 03-05 PS9 03-06 PS10 04-17 PS11 05-05 Andreas Dilger PS12 05-05 Andreas Dilger PS13 05-05 Andreas Dilger PS14 05-05 Andreas Dilger PS15 06-01 PS16 08-12 PS17 10-14 patrick bot PS18 10-16 patrick bot PS19 10-27 patrick bot PS20 10-28 patrick bot
PS21 10-28 patrick bot PS22 10-30 patrick bot PS23 10-31 patrick bot PS24 11-01 patrick bot PS25 11-04 Marc Vef
tags: pw_smallfix pt_ecro
owner Zhenyu Xu · uploader Marc Vef · PS25 uploaded 16h ago · NEW · open in Gerrit ↗
commit message
LU-17531 lfs: add 'mirror extend --no-resync' option

Allow adding a mirror without syncing its content
beforehand, so that it can be resynced later. The new
mirrors are marked stale and stay unusable until
"lfs mirror resync" is run. Merging a stale mirror needs FLR EC
enabled on both the client and the MDS (llite_enable_flr_ec and
mdt_enable_flr_ec, negotiated at mount), otherwise the extend is
refused.

--no-resync cannot be used with -f VICTIM_FILE or with --ec,
since the parity mirror is computed from up-to-date data.

Assisted-by: Codex:gpt-6.1-sol
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I1b43fb0299c2aaea72587eff9168e4cdee075624
70067 master J –B ✓T ↻R +3/2
LU-20690 ec: copy parity in 1+N recovery reads
review-dne-part-5 failed — auto-retest in flight (often self-heals)
pw_shepherd218_review_prioritypt_ecro 1 unresolved M +87 −14
53m
review-dne-part-5 failed — auto-retest in flight (often self-heals)
1 reviewer comment(s) to address if a respin is needed — last from Andreas Dilger
failed enforced testplatformdetail
review-dne-part-5 retesting crashed RHEL 10.2 / x86_64 ran 5 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% session
build #135384 SUCCESS · tests all Maloo sessions
reviews: Keguang Xu +1 2026-11-04 02:05 · Ronnie Sahlberg +1 2026-11-04 02:05 · Andreas Dilger +1 2026-11-04 02:44
no vote yet: Marc Vef
patchsets: PS1 10-27 PS2 11-03 Andreas Dilger PS3 11-04 Andreas Dilger
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-11-03 16:30 Andreas Dilger COMMIT_MSG:29 — Correction to my comment above: EC is not in any release. 2.17.0 has only the format definitions (LCME_FL_PARITY) and the EC library, not th
Gerrit AI review for Lustre PS1 · 2026-10-27 23:25
(minor) This fixes data corruption on degraded reads, so should it carry a Fixes: line? The wrong decode for a single-data-stripe raidset goes back to the original recovery code, not only to --ec 1+N:

Fixes: 783c13bb0b8f ("LU-12669 ec: recover data from parity")

lov_io_ec_rd_start() has always used the per-raidset dcount (sc.esc_k1 for the tail raidsets). llapi_ec_compute_parities() is also called with the per-raidset k, so it memcpy()s for those raidsets. ec_split_stripes(5, 2) gives n0=2 k0=2 n1=1 k1=1, so a `-c 5 --ec 2+2` file (and the same for -c 7, -c 9, ...) has a 1+2 tail raidset. Before this patch, losing that raidset's data stripe and parity 0 returned data * 2. That layout was valid before LU-20568 allowed --ec 1+N.

If the patch is refreshed, it may help to say in the body that this case is fixed as well, since it affects released layouts and matters when deciding on backports.
Andreas Dilger PS1 · 2026-11-03 05:01
Agreed, this is not only --ec 1+N. ec_split_stripes() gives a raidset with one data stripe in several layouts that were already valid before --ec 1+N was allowed:

- the tail raidset of an odd stripe count with --ec 2+N: ec_split_stripes(5, 2) gives 2 raidsets of 2 and 1 of 1, so `lfs setstripe -c 5 --ec 2+2` (likewise -c 7, -c 9, ...) has a 1+2 tail raidset
- any -c 1 component with an EC layout, since ec_split_stripes(1, k) always gives k = 1

llapi_ec_compute_parities() is called with the per-raidset k, so it memcpy()s the parity for these raidsets, and lov_io_ec_rd_start() uses the per-raidset dcount. Losing the data stripe and parity 0 of such a raidset thus returned data * gf_inv(2) on released versions too. That makes this a data corruption fix that needs to be backported, so please add the Fixes: line and describe these cases in the commit message.

It would also be good to have a test for the released-layout case, e.g. a variant of test_40e with `-c 5 --ec 2+2` that fails the data OST of the 1+2 tail raidset and its parity 0, and checks the md5sum. The fix keys on the per-raidset dcount, so it should already cover this.
Andreas Dilger PS1 · 2026-11-03 16:30
Correction to my comment above: EC is not in any release. 2.17.0 has only the format definitions (LCME_FL_PARITY) and the EC library, not the client recovery read or the llapi parity code, so no released files have these layouts and no Fixes: or backport is needed.

The rest still applies to master: the fix also covers raidsets with one data stripe that are not --ec 1+N (the tail raidset of `-c 5 --ec 2+2`, and -c 1 components), so the commit message could say so, and a `-c 5 --ec 2+2` variant of test_40e would cover the tail raidset case.
tags: pw_shepherd 218_review_priority pt_ecro
owner Zhenyu Xu · uploader Andreas Dilger · PS3 uploaded 1d ago · NEW · open in Gerrit ↗
commit message
LU-20690 ec: copy parity in 1+N recovery reads

A raidset with one data stripe stores a copy of that stripe in each of
its p parity objects: llapi_ec_compute_parities() memcpy()s the data
instead of calling ec_encode_data() when k == 1, so --ec 1+N writes p
identical copies.  The client recovery path did not know this and
always ran the Cauchy decode, where the coefficient of parity stripe i
is gf_inv(i + 1).  Only parity stripe 0 has coefficient 1, matching
what is on disk.  A read that lost the data stripe and parity stripe
0, and fell back to any other parity, thus returned data * 2, * 3,
... rather than the data.

Copy the first parity page that could be read over the error page
when the raidset has one data stripe, in lov_ec_recover_page().  The
RS setup is of no use in that case either, so skip the encode matrix
in lov_ec_bufs_alloc() and the scratch matrices, GF tables, matrix
inversion and ec_init_tables() in lov_ec_recover_init() when dcount
is 1.

Add sanity-ec test 40e, which fails the data OST and the OST of
parity stripe 0 in a 1+2 layout, so the read has to be rebuilt from
parity stripe 1.

Test-Parameters: testlist=sanity-ec ostcount=8
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Assisted-by: AugmentAgent:DeepSeek-V4.1-Flash
Change-Id: Idbe55e61f464d1e91bb5093bf1c41442dc588f72
66481 master J –B ✓T …R +2/2
LU-12669 ec: fix EC recovery read for encrypted files
build OK — testing in progress (typically 6–14h)
ec2 pt_ecro218_review_blocker L +344 −29
8h
build #135445 SUCCESS · tests all Maloo sessions · test queue
reviews: Keguang Xu +1 2026-11-05 01:09 · Andreas Dilger +1 2026-11-04 21:43
no vote yet: Marc Vef
patchsets:
+20 earlier PS1 06-05 PS2 06-06 PS3 06-06 PS4 06-06 PS5 06-07 PS6 06-08 PS7 06-11 PS8 06-11 PS9 06-11 PS10 06-12 PS11 06-30 PS12 07-16 Marc Vef PS13 07-26 Marc Vef PS14 07-26 Marc Vef PS15 08-01 Marc Vef PS16 08-10 Keguang Xu PS17 08-10 PS18 08-10 PS19 08-11 PS20 08-11
PS21 08-19 PS22 08-20 PS23 10-08 Andreas Dilger PS24 10-28 Andreas Dilger PS25 11-04 Andreas Dilger
your previous vote: -1 on PS24 (2026-11-02 10:01) — now at PS25
tags: pt_ecro 218_review_blocker
owner Zhenyu Xu · uploader Andreas Dilger · PS25 uploaded 11h ago · NEW · open in Gerrit ↗
commit message
LU-12669 ec: fix EC recovery read for encrypted files

The parity of an encrypted file is computed from its data as stored
on the OSTs, but an EC recovery read rebuilds a stripe from data
pages that OSC has already decrypted, together with the parity as
stored, and returns garbage.

Rebuild the stripe from the data as stored instead: have OSC leave
the data pages read for the recovery encrypted and not uptodate,
rebuild the missing pages from them and the parity, then decrypt the
pages read and rebuilt.  Leave each all-zero encryption unit (a hole)
as it is, including one followed by data in a page larger than the
unit.  A data page already in the page cache holds the plaintext, so
read the stripe again from the OST for the positions being rebuilt,
rather than encrypting the plaintext, which cannot recreate the
stored data of a hole.  Without the key, leave the pages encrypted,
as a normal read does.  Keep these pages out of extents that OSC
decrypts, and send the encryption flag with the parity reads.  If
the recovery fails, delete the data pages that were not decrypted,
so that a readahead page does not later return the ciphertext.

Add sanity-ec test_56a to recover an encrypted file with a hole in
a surviving stripe, both from the OSTs and with that stripe cached.

Fixes: 783c13bb0b8f ("LU-12669 ec: recover data from parity")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5.5 ltvm llm_code_and_review_tools
Change-Id: Ida4722d05d79bcbee4e680e75e94b005579adcac
36513 master J ✓B ✓T …R 0/2
LU-12864 test: enable unstable check accounting in test
build OK — testing in progress (typically 6–14h)
stalled 464d S +16 −6
464d
build #87351 SUCCESS · tests all Maloo sessions · test queue
no vote yet: Andreas Dilger
owner Zhenyu Xu · uploader Minh Diep · PS3 uploaded 1639d ago · NEW · open in Gerrit ↗
commit message
LU-12864 test: enable unstable check accounting in test

Enable unstable check accounting in sanity-benchmark test_iozone to
verify whether unstable check accounting could prohibit client pinning
too much memory for writing.

Test-Parameters: fortestonly testlist=sanity-benchmark envdefinitions=ONLY=iozone
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I4cc7cfead8709380ad01c90bc0be9108dbe8b3f0
▶

Needs reviewers

(2)
54384 master J –B ✓T ✓R -1/2−
LU-16489 test: loop lustre_rsync until no new changelog record
CI green — no vote yet from Andreas Dilger
stalled 457d M +75 −12
457d
build #103627 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets: PS1 03-14 PS2 03-20 PS3 03-25 PS4 03-28 PS5 03-28
owner Zhenyu Xu · uploader Zhenyu Xu · PS5 uploaded 951d ago · NEW · open in Gerrit ↗
commit message
LU-16489 test: loop lustre_rsync until no new changelog record

In lustre-rsync-test.sh, after requesting dbench stop we'd loop
running lustre_rsync until no new changelog records are added.

Test-Parameters: trivial testlist=lustre-rsync-test
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I0e303a91834c58a4a288167b97b8167389c396ce
48007 master J ✗5B ✓T ✓R 0/2
LU-16033 llite: refine ll_use_fast_io() for stride mode
CI green — no vote yet from Qian Yingjin, Patrick Farrell
stalled 457d M +106 −40
457d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
unique failing testhistory
conf-sanity2@zfs:test_38seen in 3 other reviews
conf-sanity2@zfs:test_39seen in 7 other reviews
conf-sanity2@zfs:test_40seen in 7 other reviews
conf-sanity2@zfs:test_41aseen in 5 other reviews
sanity-lfsck@ldiskfs+DNE:test_18eseen in 3 other reviews
1 optional test failure(s) — informational
build #88814 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Patrick Farrell
patchsets: PS1 07-21 PS2 08-05
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 1553d ago · NEW · open in Gerrit ↗
commit message
LU-16033 llite: refine ll_use_fast_io() for stride mode

This patch refines ll_use_fast_io() to detect whether current
readahead window allows issuing readahead RPC for stride mode.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Id49d947a0433f94bc7b63fe4d528d7c32b7b789f
▶

Waiting on reviewers

(3)
69479 master J –B ✓T ✓R +1/2
LU-20885 llite: use delay RPC for glimpse after all mirrors
no vote yet from Qian Yingjin, Marc Vef
S +15 −2
21d
build #133021 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger +1 2026-10-14 18:05
no vote yet: Qian Yingjin, Marc Vef
owner Zhenyu Xu · uploader Zhenyu Xu · PS1 uploaded 28d ago · NEW · open in Gerrit ↗
commit message
LU-20885 llite: use delay RPC for glimpse after all mirrors

__cl_glimpse_size() retries a glimpse while fast-switching FLR
mirrors, and forces io->ci_ndelay = 1 on every iteration so that the
glimpse lock is enqueued with a non-delay RPC (LDLM_FL_NDELAY).  When
the OST import is not connected, osc_lock_upcall() turns the enqueue
failure into -EAGAIN so the caller can try the next mirror.

Commit 4468f6c9d924 ("LU-16025 llite: adjust read count as file got
truncated") bounded that retry loop with ci_tried_all_mirrors to avoid
an endless restart on a concurrent truncate.  But once
ci_tried_all_mirrors is set the loop gives up and returns -EAGAIN to
userspace while io->ci_ndelay is still forced to 1, so the glimpse
never gets a chance to use a delay RPC that waits for the import to
reconnect.  Right after a client remount the OST imports are still
connecting, so a stat() on an FLR file fails with EAGAIN after only a
few mirror rounds instead of waiting for the connection, e.g. in
sanity-flr test_44d.

Stop forcing non-delay RPCs once all mirrors have been tried, and
allow one more restart so the glimpse is retried with a delay RPC
(ci_ndelay == 0) that waits for the imports to reconnect.  The
LU-16025 bound is kept: a delay RPC no longer returns the ndelay
-EAGAIN, so the loop still terminates on a concurrent truncate.

Test-Parameters: testlist=sanity-flr env=ONLY=44d,ONLY_REPEAT=10
Fixes: 4468f6c9d924 ("LU-16025 llite: adjust read count as file got truncated")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Assisted-by: Augment Agent:DeepSeek V4.1 Flash
Change-Id: I22bdf5384e3936aa6d6e606010e8e1e43c049707
10427 master J –B ✓T ✓R 0/2
LU-2522 ptlrpc: add more request flags in log
stalled 457d S +37 −10
457d
no vote yet: Amir Shehata
owner Zhenyu Xu · uploader Zhenyu Xu · PS3 uploaded 3850d ago · NEW · open in Gerrit ↗
commit message
LU-2522 ptlrpc: add more request flags in log

Add request::rq_receiving_reply and ::rq_req_unlinked and
::rq_reply_unlinked status in its log message to help debug the issue.

Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
Change-Id: I694a59b83d9923c968843ceb21e150e3551d9507
16814 master J –B ✓T ✓R 0/2
LU-7287 clio: osc_cache_shrink_scan() unsafe
stalled 457d S +10 −10
457d
no vote yet: Andreas Dilger, Alex Zhuravlev
owner Zhenyu Xu · uploader Zhenyu Xu · PS5 uploaded 3613d ago · NEW · open in Gerrit ↗
commit message
LU-7287 clio: osc_cache_shrink_scan() unsafe

In osc_cache_shrink_scan(), the stop_anchor could be removed from
the list, and results in a infinite scan loop.

This patch adds shrink osc device counter and makes
osc_cache_shrink_scan() stops when enough osc device has been
scanned.

Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
Change-Id: Id70d5df990fc6a8f27ac71ac9defd04a5cd4b765
▶

Ready to land

(3)
69680 master J –B ✓T ✓R +2/2
LU-20935 osc: fix decryption of a page with a sub-page hole
all green — ready to land (not in master-next yet)
pw_shepherd 3 unresolved M +45 −20
11h
all green — ready to land (not in master-next yet)
3 reviewer comment(s) to address if a respin is needed — last from Andreas Dilger
build #133819 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger +1 2026-11-04 20:49 · Sebastien Buisson +1 2026-10-20 08:44
no vote yet: Artem Blagodarenko, Patrick Farrell
patchsets: PS1 10-14 PS2 10-15 PS3 10-16
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS3 2026-11-04 20:49 Andreas Dilger file.c:573 — (style) 82 columns, flagged by checkpatch on each patchset. Something like:
Andreas Dilger PS3 · 2026-11-04 20:49
(style) 82 columns, flagged by checkpatch on each patchset.  Something like:
```
				if (is_empty_folio(folio, pgno, offs, unit)) {
```
with a local "const unsigned int unit = LUSTRE_ENCRYPTION_UNIT_SIZE;" would also shorten the decrypt call below.
reply PS3 2026-11-04 20:49 Andreas Dilger osc_request.c:2381 — (suggestion) This loop and its comment are now repeated in osc, DoM (file.c) and, with 66481 ("LU-12669 ec: fix EC recovery read for encrypt
Andreas Dilger PS3 · 2026-11-04 20:49
(suggestion) This loop and its comment are now repeated in osc, DoM (file.c) and, with 66481 ("LU-12669 ec: fix EC recovery read for encrypted files"), in lov_io.c for EC recovery.  A static inline in lustre_crypto.h, e.g.
```
static inline int ll_decrypt_pagecache_folio(struct folio *folio, size_t pgno)
```
that decrypts each non-empty unit and clears PagePrivate2 only when the whole page is empty, could replace the page-cache copies so a later change to the hole handling can't miss one.  Fine as a follow-up if you prefer to keep this patch as is.
reply PS3 2026-11-04 20:49 Andreas Dilger sanity-sec.sh:5992 — (suggestion) Moving the punch from unit 1 to unit 0 drops the mid-page hole case that actually failed on the 64KiB clients in master-next (d
Andreas Dilger PS3 · 2026-11-04 20:49
(suggestion) Moving the punch from unit 1 to unit 0 drops the mid-page hole case that actually failed on the 64KiB clients in master-next (data unit, hole, data units).  Both pass with this patch on a 16KiB client, so it would be good to keep both, e.g. punch unit 0 and unit 2 and zero both in $reffile.
tags: pw_shepherd
owner Zhenyu Xu · uploader Zhenyu Xu · PS3 uploaded 20d ago · NEW · open in Gerrit ↗
commit message
LU-20935 osc: fix decryption of a page with a sub-page hole

A client whose PAGE_SIZE is larger than
LUSTRE_ENCRYPTION_UNIT_SIZE (4KB), for instance aarch64
with 64KB pages, could read a file with a hole smaller
than a page and get back ciphertext: the units after the
hole were returned to userspace still encrypted.

osc_brw_fini_request() decrypts a page one encryption unit
at a time and stopped at the first all-zero unit, on the
assumption that a zero unit means the whole page is a hole.
A punch hole only has to be aligned to
LUSTRE_ENCRYPTION_UNIT_SIZE, so on a 64KB page it can zero
a single unit in the middle of the page and leave the
following units as valid ciphertext. Those units were never
decrypted.

This is not specific to a punch done by the same client.  A
sparse write from a 4KB-page client does it too: it writes
one file page and leaves the units before it unallocated on
the OST, because osc_brw_prep_request() widens an encrypted
write to start at the writer's own page boundary.  A
64KB-page client reading that range then sees a hole
followed by data and hits the same break.  The loop
predates the rejection of unaligned punches.

Skip the zero unit (leave it as zeros) and keep decrypting
the rest of the page.

This also changes ll_io_zero_page() for a page whose first
unit is a hole and whose later units hold data.  Such a page
no longer clears PagePrivate2, so an encrypted truncate that
lands inside it now zeroes and rewrites the page, instead of
skipping that step and leaving the page cached with none of
its units decrypted.  PagePrivate2 is still cleared when the
whole page is a hole, so that case is unchanged.

The same loop is fixed in do_dom_read_folio() for the DoM
read path and in the PCC-RO read path in pcc.c.

Test-Parameters: testlist=sanity-sec env=ONLY=48c clientarch=aarch64 clientdistro=rocky9.5
Fixes: ac5fcdce025b ("LU-12275 sec: encryption with different client PAGE_SIZE")
Fixes: 9e37963fa0 ("LU-10499 sec: support of PCC-RO for encrypted files")
Assisted-by: Augment Agent:DeepSeek V4.1 Flash
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I98c0e8ad6a4e8118d5b9241576995e411ee16273
69614 master J –B ✓T ✓R +2/2
LU-20935 llite: reject unaligned punch on encrypted files
all green — queued for landing (master-next)
pw_shepherd master-next 2 unresolved M +68 −0
11h
all green — queued for landing (master-next)
2 reviewer comment(s) to address if a respin is needed — last from Oleg Drokin
build #133757 SUCCESS · tests all Maloo sessions
reviews: Keguang Xu +1 2026-10-15 08:53 · Sebastien Buisson +1 2026-10-15 08:44
no vote yet: Oleg Drokin
patchsets: PS1 10-12 PS2 10-14 PS3 10-15
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS3 2026-10-26 15:48 Oleg Drokin patchset comment — sanity-sec test_48c, added by this patch, fails on an aarch64 64KiB PAGE_SIZE
Oleg Drokin PS3 · 2026-10-26 15:48
sanity-sec test_48c, added by this patch, fails on an aarch64 64KiB PAGE_SIZE
client in lustre-master-next 1020 ("aligned punch corrupted file"), while it
passes on all 56 x86_64 sessions:
https://testing.whamcloud.com/test_sets/ca88e97b-1aa8-4d19-8042-a44ab2eee271
The aligned 4KiB punch lands inside a single 64KiB page, which needs the
sub-page hole decryption fix in 69680, and 69680 is not in this -next build.
Please make this change depend on 69680, or skip 48c when PAGE_SIZE > 4096
until 69680 lands.
reply PS3 2026-10-15 08:53 Keguang Xu sanity-sec.sh:5995 — could use stack_trap to remove these files? if a refresh later needed
Keguang Xu PS3 · 2026-10-15 08:53
could use stack_trap to remove these files? if a refresh later needed
tags: pw_shepherd
owner Zhenyu Xu · uploader Zhenyu Xu · PS3 uploaded 21d ago · NEW · open in Gerrit ↗
commit message
LU-20935 llite: reject unaligned punch on encrypted files

An encrypted file is stored on the OST as ciphertext, one whole
LUSTRE_ENCRYPTION_UNIT_SIZE (4KB) encryption unit at a time, and the
client encrypts and decrypts a whole unit at once.  ll_fallocate()
already refuses FALLOC_FL_COLLAPSE_RANGE, FALLOC_FL_INSERT_RANGE and
FALLOC_FL_ZERO_RANGE on encrypted files (LU-12275), but it still
forwarded fallocate(FALLOC_FL_PUNCH_HOLE) with an offset or length
that is not aligned to the encryption unit to the OST.

For such a partial-unit punch the OST only clears the requested byte
sub-range of the ciphertext unit and leaves the rest of the unit
intact.  A later read decrypts the whole unit, so a partially zeroed
ciphertext unit decrypts to garbage: both the punched bytes and the
bytes around them are silently corrupted on disk, and the corruption
is visible from another client that has the key.  Page-aligned punches
are unaffected.

Refuse a punch that is not aligned to LUSTRE_ENCRYPTION_UNIT_SIZE on
an encrypted file with -EOPNOTSUPP, instead of corrupting the file.

Add sanity-sec test_48c to check that an unaligned punch is refused
and leaves the file unchanged, and that an aligned punch zeroes
exactly the requested encryption unit and no more.

Test-Parameters: testlist=sanity-sec env=ONLY=48c
Fixes: cb037f305c ("LU-14160 fallocate: Add punch mode to fallocate")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ieaf7c3d2dbdc4303744dc6b2f4c808e53124bc40
55851 b2_15 J !B ✓T ✓R +1/1
LU-15486 lod: mirroring a plain file in mirrored-layout dir
all green — ready to land (not in b2_15-next yet)
LTS15 stalled 814d S +36 −1
814d
janitor run: 1 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-zfs-part-2 RHEL 8.9/x86_64 ran 7 tests. 1 tests failed: replay-dual. session
review-dne-zfs-part-4 RHEL 8.9/x86_64 ran 9 tests. 1 tests failed: sanity-quota. session
2 optional test failure(s) — informational
build #106765 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger +1 2024-07-30 14:32
no vote yet: Alex Zhuravlev, Oleg Drokin
patchsets: PS1 07-24 PS2 07-29
owner Zhenyu Xu · uploader Zhenyu Xu · PS2 uploaded 829d ago · NEW · backport · open in Gerrit ↗
commit message
LU-15486 lod: mirroring a plain file in mirrored-layout dir

If a file does not have a mirror in a directory with a default FLR
mirror, then "lfs mirror extend" on the file fails with
"cannot create volatile file: Invalid argument".

This comes from the the non-striped file layout generated from
LOD inheriting its FLR state from the default FLR while it contains
no mirror in it, and lov_init_composite() will complain about it.

 if (equi(flr_state == LCM_FL_NONE, comp->lo_mirror_count > 1))
         RETURN(-EINVAL);

Lustre-change: https://review.whamcloud.com/46517
Lustre-commit: 8005a374cac2ba726a88cec3c1bb331fc96153a1

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I5e849acb2327ce735d0008271bfd48fa7293161c
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
▶

Parked (WIP / self-blocked)

(0)
nothing here right now

Carrying — uploaded by me, owned by others

32 open
▶

Failed / broken

(19)
65737 master J –B ✓T ✗2R -1/2−
LU-10026 csdc: set compress component for file
cc Marc Vef · needs rebase — checkpatch: cannot be cherry-picked
needs rebase csdc 14 unresolved XL +1163 −16
14d
needs rebase — checkpatch: cannot be cherry-picked
enforced failed: custom-1001, review-dne-part-7
14 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
failed enforced testplatformdetail
custom-1001 RHEL 9.7 / x86_64 ran 3 tests. 1 tests failed: sanity-pfl. session
review-dne-part-7 RHEL 9.8 / x86_64 ran 6 tests. 1 tests failed: sanity-pcc. session
build #132858 SUCCESS · tests all Maloo sessions
no vote yet: James Simmons, Roman Bolshakov, Andreas Dilger, Artem Blagodarenko
patchsets:
+10 earlier PS1 05-07 PS2 05-07 PS3 05-28 PS4 05-28 PS5 06-11 PS6 06-11 PS7 06-16 Artem Blagodarenko PS8 06-16 Artem Blagodarenko PS9 07-24 Artem Blagodarenko PS10 08-19 Artem Blagodarenko
PS11 08-19 Artem Blagodarenko PS12 08-20 Artem Blagodarenko PS13 08-20 Artem Blagodarenko PS14 08-21 Artem Blagodarenko PS15 10-05 Roman Bolshakov
threads: 14 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS15 2026-10-06 08:14 Gerrit AI review for Lustre COMMIT_MSG:56 — (minor) The body doesn't mention the client-side gate added by squashing Ib1e2123ff: the new lustre_check_lov_user_md() and lustre_check_lov
Gerrit AI review for Lustre PS15 · 2026-10-06 08:14
(minor) The body doesn't mention the client-side gate added by squashing Ib1e2123ff: the new lustre_check_lov_user_md() and lustre_check_lov_comp_md_v1() in ptlrpc/pack_generic.c, and their calls from ll_lov_setstripe_ea_info() and ll_xattr_set(). These reject a compress layout when `llite.*.enable_compression=0`, which is a user-visible behaviour change. Could a short paragraph describing them be added?
reply PS11 2026-08-20 12:36 Artem Blagodarenko patchset comment — Hi Andreas. Thanks for poining to this. I have reverted all fixed by Patchset 11 pushing wrong branch. I have reverted to Patchset 10 where
Andreas Dilger PS11 · 2026-08-19 23:52
@ablagodarenko@thelustrecollective.com it looks like the patches were rebased, but did not address any of the AI review comments?  While we can't go overboard changing every detail of the patches, I think it does make sense to fix the code where possible so that we don't carry technical debt later.
Artem Blagodarenko PS11 · 2026-08-20 12:36
Hi Andreas. Thanks for poining to this. I have reverted all fixed by Patchset 11 pushing wrong branch. I have reverted to Patchset 10 where I addressed AI bot comments and fixed build.
reply PS14 2026-10-05 17:51 Roman Bolshakov patchset comment — Squashed Ib1e2123ffdb239c3e1401d682ae9c2c49e3f4a6f into the change. I'll address a couple more comments in another push.
Roman Bolshakov PS14 · 2026-10-05 17:51
Squashed Ib1e2123ffdb239c3e1401d682ae9c2c49e3f4a6f into the change. I'll address a couple more comments in another push.
reply PS9 2026-08-19 23:52 Andreas Dilger lfs-getstripe.1:331 — Should be fixed if patch is refreshed.
Gerrit AI review for Lustre PS9 · 2026-07-28 09:23
(minor) There is no `.TP` before this entry, so `--compress-type|--compr-type` and its description get folded into the `-z, --extension-size` paragraph above instead of starting their own tagged item. The two entries below it do have theirs.
Oleg Drokin PS9 · 2026-08-12 02:29
weird but in my man output it looks ok.
Artem Blagodarenko PS10 · 2026-08-19 19:47
The entry was missing its .TP in the troff source. Some man implementations are lenient and reflow correctly, but others fold the entry into the previous paragraph. Added .TP for correctness.
Artem Blagodarenko PS10 · 2026-08-19 19:47
Done. Added the missing .TP before the --compress-type|--compr-type entry.
Andreas Dilger PS9 · 2026-08-19 23:52
Should be fixed if patch is refreshed.
reply PS14 2026-08-22 12:47 Gerrit AI review for Lustre llapi_layout_compress_set.3:105 — (minor) Neither of the two new man3 pages has an EXAMPLES section. Lustre llapi pages are expected to carry a short usage example showing th
Gerrit AI review for Lustre PS14 · 2026-08-22 12:47
(minor) Neither of the two new man3 pages has an EXAMPLES section. Lustre llapi pages are expected to carry a short usage example showing the required header and a realistic call.
reply PS15 2026-10-06 08:14 Gerrit AI review for Lustre llapi_layout_compress_set.3:71 — (minor) This, and the matching EINVAL entry under ERRORS, says a `stripe_size` that is not a multiple of `chunk_size` is an error. llapi_lay
Gerrit AI review for Lustre PS15 · 2026-10-06 08:14
(minor) This, and the matching EINVAL entry under ERRORS, says a `stripe_size` that is not a multiple of `chunk_size` is an error. llapi_layout_compress_set() never fails for that: it decrements `log_bits` until the chunk divides the stripe and stores the smaller chunk (sanity-pfl test_100c expects 3*64KiB to become 128KiB). Similarly, gzip/lz4/lz4fast levels outside the listed ranges are clamped by their from_*_level() helpers, not rejected with EINVAL as the text above says (test_100c expects gzip:15 to read back as 9). If the patch is refreshed, could the page describe the rounding and clamping instead?
reply PS14 2026-08-22 12:47 Gerrit AI review for Lustre llapi_parse_compress_type.3:62 — (minor) llapi_parse_compress_type() also returns -EINVAL - for a level that isn't a valid number or falls outside +/-COMPR_LEVEL_MAX - which
Gerrit AI review for Lustre PS14 · 2026-08-22 12:47
(minor) llapi_parse_compress_type() also returns -EINVAL - for a level that isn't a valid number or falls outside +/-COMPR_LEVEL_MAX - which neither RETURN VALUES nor ERRORS mentions. Mixing -1 with -Exxx returns in one function is also awkward for callers; would returning -EINVAL for the unknown-type case be more consistent?
reply PS14 2026-08-22 12:47 Gerrit AI review for Lustre lustreapi.h:1457 — (minor) The 9 used as the lz4 default collides with a real level. from_lz4_level(10) returns 9, and to_lz4_level(9) returns 9 because 9 == L
Gerrit AI review for Lustre PS14 · 2026-08-22 12:47
(minor) The 9 used as the lz4 default collides with a real level. from_lz4_level(10) returns 9, and to_lz4_level(9) returns 9 because 9 == LZ4HC_DEFAULT_CLEVEL, so 'lfs setstripe -Z lz4:10' reports back as lz4:9 and level 10 can never be displayed - even though lfs-setstripe.1 documents 1-16 as the valid lz4 range.
reply PS15 2026-10-06 08:14 Gerrit AI review for Lustre file.c:2838 — (defect) This gate runs only for regular files: ll_lov_setstripe_ea_info(), and the `lov.` branch in ll_xattr_set(). A directory default goe
Gerrit AI review for Lustre PS15 · 2026-10-06 08:14
(defect) This gate runs only for regular files: ll_lov_setstripe_ea_info(), and the `lov.` branch in ll_xattr_set(). A directory default goes through ll_setstripe_ea() -> ll_dir_setstripe() (and the LL_IOC_LOV_SETSTRIPE case in ll_dir_ioctl()), which never calls lustre_check_lov_user_md(). So on a client with `enable_compression=0`:

    lfs setstripe -E eof -Z lz4 $dir    # accepted
    touch $dir/f                        # MDS instantiates a compress layout

This still produces a file the client can't handle. lsm_lmm_verify_v1v3() rejects it with "file compression not enabled", and the PS14 report shows a later unlink or stripe change hitting the lov_io_layout_at() LBUG. Should ll_dir_setstripe() apply the same check? Or, if allowing compressed defaults on a disabled client is intended, should the client reject the layout cleanly instead of asserting?
reply PS15 2026-10-06 08:14 Gerrit AI review for Lustre xattr.c:425 — (defect) On this `lov.` path nothing validates `size` before lustre_check_lov_user_md() walks the entries. lustre_check_lov_comp_md_v1() rea
Gerrit AI review for Lustre PS15 · 2026-10-06 08:14
(defect) On this `lov.` path nothing validates `size` before lustre_check_lov_user_md() walks the entries. lustre_check_lov_comp_md_v1() reads `lcm_entry_count` and then up to 65535 `lcm_entries[]`, but the buffer here is only the `size` bytes copied in by the VFS.

The `lustre.` xattr namespace needs only write permission on the inode, so any file owner can trigger it:

    setxattr(f, "lustre.lov.add", buf, 8, 0);  /* buf starts with LOV_USER_MAGIC_COMP_V1 */

That reads lcm_entry_count past the end of an 8-byte allocation and keeps reading for up to ~3MB. KASAN reports it as slab-out-of-bounds. Before this patch, little-endian clients only read `lmm_magic` here.

The next change in the series ("utils: add 'lfs find' support for compressed file") adds a `size < need` check just above this call. Since this patch introduces the read, should that check move here? Passing `size` into lustre_check_lov_user_md(), the way lustre_swab_lov_user_md() takes one, would also let it validate the buffer itself.
reply PS14 2026-08-22 12:47 Gerrit AI review for Lustre lod_qos.c:3191 — (minor) This applies the chunk adjustment to every component including extension ones, where llc_stripe_size holds the extension size rather
Gerrit AI review for Lustre PS14 · 2026-08-22 12:47
(minor) This applies the chunk adjustment to every component including extension ones, where llc_stripe_size holds the extension size rather than a real stripe size. lod_declare_layout_add() deliberately skips LCME_FL_EXTENSION components for exactly that reason, so the same input layout gets different chunk_lum_bits depending on whether it arrives via create or via --component-add. Should this site skip extension components as well?

While there: the comment added in lod_declare_layout_add() says chunk adjustment is deferred until instantiation, but nothing calls lod_adjust_compr_chunk_size() on the instantiation path - the only three callers are here, lod_declare_layout_add() and lod_striping_from_default().
reply PS15 2026-10-06 08:14 Gerrit AI review for Lustre pack_generic.c:2672 — (defect) -ENOTSUPP (524) is kernel-internal and has no userspace errno, so this reaches `lfs setstripe` through ioctl()/setxattr() as "Unkno
Gerrit AI review for Lustre PS15 · 2026-10-06 08:14
(defect) -ENOTSUPP (524) is kernel-internal and has no userspace errno, so this reaches `lfs setstripe` through ioctl()/setxattr() as "Unknown error 524". The erasure-coding check just above it in ll_lov_setstripe_ea_info() returns -EOPNOTSUPP for the same kind of rejection. Should this be -EOPNOTSUPP too?

While here, a couple of nits: `rc` is never changed from 0, there's a double blank line after the EXPORT_SYMBOL(), and the default case in lustre_check_lov_user_md() logs "Invalid LOV magic" but still returns 0.
tags: csdc
owner Marc Vef · uploader Roman Bolshakov · PS15 uploaded 30d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: set compress component for file

Introduce per-component compression support for composite LOV layouts.
A new LCME_FL_COMPRESS component flag marks entries that carry
compress fields; the flag is set when the user supplies a compression
type via 'lfs setstripe -Z' and is propagated through the LOD and LOV
layers so that compressed components are distinguished from plain
ones.

LOD layer:
- lod_parse_striping(): read lcme_compr_type/lvl/chunk_lum_bits from
  the user-supplied lov_comp_md_v1 when LOV_PATTERN_COMPRESS is set.
- lod_use_defined_striping(): likewise for pre-defined layouts.
- lod_get_default_lov_striping(): carry compress fields into the LOD
  component when inheriting a default layout that includes
  compression.
- lod_generate_lovea(): serialise llc_compr_* fields into the on-wire
  lcm entry when LOV_PATTERN_COMPRESS is set.
- lod_adjust_compr_chunk_size(): new helper that rounds down the
  requested chunk-size exponent so the chunk fits evenly within one
  stripe and within one RPC (clamped to COMPR_CHUNK_MAX_BITS in the
  following changes).

API / utils layer:
- 'lfs setstripe' gains --compress|-Z <type>[:<level>] and
  --compress-chunk=<size> options to set the compression type, level,
  and chunk size on a new component.  Like -S and -c, -Z is inherited
  by subsequent -E components unless overridden by another -Z.

  Example:
	$ lfs setstripe -Eeof -Z lz4:5 --compress-chunk=512 <file>

- 'lfs getstripe' gains --compress-type, --compress-level, and
  --compress-chunk options to print individual compress parameters:

  Example:
	$ lfs getstripe <file>
    lcme_compr_type:     lz4
    lcme_compr_lvl:      5
    lcme_compr_chunk_kb: 512
      lmm_pattern:       raid0,compress

- llapi_layout_merge(): copy compress fields when merging layouts.
- Two new man3 pages: llapi_layout_compress_set.3 and
  llapi_parse_compress_type.3.

Misc:
- dump_lsm() in lov_ea.c prints compress fields for debugging.
- compr_name_from_type() helper added in lov_internal.h and wired up
  in dump_lsm() to print compression type names in debug output.

Test-Parameters: testlist=sanity-pfl serverversion=2.17
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Signed-off-by: Roman Bolshakov <rbolshakov@ddn.com>
Change-Id: Ife0382469cbc5099e0c6dc96534bb169ddeff61e
Was-Change-Id: Ib1e2123ffdb239c3e1401d682ae9c2c49e3f4a6f
68788 master J ✓B ✗T –R 0/2
LU-10026 tests: compression component via --component-add
reviewing Marc Vef · build failure (#131544)
csdc 1 unresolved S +15 −0
55d
build failure (#131544)
1 unresolved thread(s) await your reply — last from Marc Vef
build #131544 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-09-10 19:52 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-09-10 19:52
[Marc Bot] upstream remarks for reference:

The lod fix this test was written for is already on master (90c093b7850, LU-17468); only the sanity-compr test_1a part was unlanded - ported under a new Change-Id with the original as Was-Change-Id.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 55d ago · NEW · open in Gerrit ↗
commit message
LU-10026 tests: compression component via --component-add

Add sanity-compr test_1a: create a file with a plain first component,
append a compressed component with "lfs setstripe --component-add
-Z gzip" and verify the added component carries the compression
type. This covers the compression branch of the component-add path
in lod_declare_layout_add().

The lod fix this test was written for is already on master as
commit 90c093b7850 ("LU-17468 lod: component add missed pattern
info"); only the test part is new here.

Test-Parameters: forjanitoronly
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Was-Change-Id: I7ad746a550f1afea54a6f5b68823a79a85a44082
Change-Id: I0624bf3f5f9c965f826e72656a8cd8198c5624fd
68389 master J !B ✗T –R 0/2
LU-10026 csdc: inherit CSDC params unless overriden
reviewing Marc Vef · build failure (#130361)
csdc 1 unresolved L +258 −25
68d
build failure (#130361)
1 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 7 failing config(s), none unique to this patch — janitor results
build #130361 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 12:50 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 12:50
[Marc Bot] upstream remarks for reference:

- Rewritten onto the current naming: LL_COMPR_TYPE_SPEC_NONE = 9 added (MAX moves to 10); wire asserts extended accordingly (this tree carries LL_COMPR_TYPE_MAX asserts the original did not have).
- compr_type_table: the NONE row loses its name, SPEC_NONE row ("none") added before the MAX sentinel - the compress_type_2str()/parse helpers were already in the matching form.
- The inheritance-hint struct uses cd_compr_chunk_lum_bits with this series' lum-bits semantics (offset above COMPR_CHUNK_MIN_BITS - no +16 at use sites), and lod_adjust_compr_chunk_size() is called in its take-by-value/return-by-value form.
- lod_qos_parse_config: the convert_plain arm skips all lcme-derived assignments including fields this tree has that the original context did not (llc_mirror_link_id, llc_dstripe_count, llc_cstripe_count).
- SPEC_NONE clearing blocks in lod_parse_striping/lsm_unpackmd applied at the current field naming.
- test_1000d version gate converted to compression_supported.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: inherit CSDC params unless overriden

If a parent directory has been set CSDC parameters, the file created
under it needs to inherit the CSDC parameters unless another CSDC
parameters or an empty CDSC has been specified for a component of the
file. The file create method includes touch, setstripe a plain layout
file, or setstripe a composite layout file.

As "-Z none" would be used to set compression type to 0 and server
would treat it as no CSDC parameters has been set, so "-Z none"
can not be used to stop inherit parent directory's CSDC inheritance,
so this patch introduces another compression type
LL_COMPR_TYPE_SPEC_NONE to associate with "none" compresstion type,
and it can be used to stop the CSDC inheritance from parent
directories, when user uses "-Z none" to reset compression type,
this patch would set the compression type to LL_COMPR_TYPE_SPEC_NONE.

If we use patched new client to create a file with "-Z none" upon old
servers, the old servers cannot recognize this new
LL_COMPR_TYPE_SPEC_NONE compression type, and it just records the
type as is in the layout.

On old clients "lfs getstripe" will show "unknown" to the component's
lcme_compr_type, and on new clients, "lfs getstripe" will show "none"
to the lcme_compr_type.

When we write data to this file, both clients work but with different
behavior. On old client, with "unknown" compression type, it chooses
a fallback algorithm to compress the data, twisting the original
intention not to compress the component; while on new client, it will
treat "none" component as uncompressed one as intended.

Test-Parameters: forjanitoronly
DDN-bug-id: EX-10201
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Ibbdb3f6489cf7e19bfebe075bf88580f39ed79e4
68410 master J !B ✗T –R 0/2
LU-10026 llite: issue compressiblity change in workqueue
reviewing Marc Vef · build failure (#130382)
csdc 3 unresolved M +118 −56
68d
build failure (#130382)
3 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 7 failing config(s), none unique to this patch — janitor results
build #130382 FAILURE
no vote yet: Artem Blagodarenko
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 12:51 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 12:51
[Marc Bot] upstream remarks for reference:

The test_1021 tweaks (sleeps, echo moves) re-applied against the unwrapped assertion blocks; ci_need_change_layout renamed as in the original.
reply PS1 2026-08-26 13:39 Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:292 — warn: vvp_layout_minor_change():passing zero to 'ERR_CAST'
Misc Code Checks Robot (Gatekeeper helper) PS1 · 2026-08-26 13:39
warn: vvp_layout_minor_change():passing zero to 'ERR_CAST'
reply PS1 2026-08-26 13:39 Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:294 — error: vvp_layout_minor_change():'vlcw' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper) PS1 · 2026-08-26 13:39
error: vvp_layout_minor_change():'vlcw' dereferencing possible ERR_PTR()
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 llite: issue compressiblity change in workqueue

This patch uses kernel-global workqueue to handle the file's minor
layout change RPC equest. At vvp_io_fini() when it find that the
file's compressibility should be changed, it creates a work and
insert the request to the kernel workqueue.

This would prevent the layout minor change RPC issued from within an
IO, and it could avoid the possible double lock the LOV conf lock.

lov: replace switch compressibility

The switch compressibility flag results in weird behavior -
it tells us we are to flip what's there, but results in some
very hard to read code.

I *think* the existing code is probably correct in absence
of race conditions, but an instruction to "flip" rather than
set is very confusing and could easily do the wrong thing
if there's a race which changes the compressibility value.

Replace it with two explicit bit flags.

DDN-bug-id: EX-10857
Was-Change-Id: I3b1d9f8d635e0bdbe67d5806127727a7264d26be

Singed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com>

Test-Parameters: forjanitoronly
DDN-bug-id: EX-10857
Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Ic4345b1387288ab11ce9061f40b056b07cb976bf
68368 master J !B ✗T –R 0/2
LU-10026 csdc: tune allowed compression type on server
reviewing Marc Vef · build failure (#130343)
csdc 1 unresolved L +258 −18
68d
build failure (#130343)
1 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 8 failing config(s), none unique to this patch — janitor results
build #130343 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 10:37 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 10:37
[Marc Bot] upstream remarks for reference:

- The patch re-created a libcfs_string.h/.c pair to host string-mask helpers; master already provides cfs_str2mask()/cfs_mask2str() with u64 masks (lnet/libcfs/debug.c), so both files were dropped and the new compress_types stores call the existing helper (~0ULL masks). A hunk that narrowed the existing capability-mask store from ~0ULL to ~0 was dropped for the same reason.
- mdt.*.compress_types and obdfilter.*.compress_types are implemented as sysfs attributes (the target-side procfs vars tables the original patch extended no longer exist on master).
- The obd_compress_types mask enum / COMPRESS_NAMES use the series' type naming (lz4 for the HC type) and already include zstd, which is a valid layout type at this point in the series.
- OST-side only, as in the original: OBD_CONNECT2_COMPRESS is advertised in OST_CONNECT_SUPPORTED2 and requested by the OSC; MDT enabling remains pending (test_1013b keeps its unconditional skip; its old-version negative-check block, meaningless on master, was dropped).
- compression_supported() in test-framework.sh now probes the OSC import for the compressed_file connect flag instead of comparing versions. (The OSC import, not the MDC one, because MDT support is not enabled.)
- test_1013a/b were placed before test_1015 (the tests they were anchored to arrive later in the series).
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: tune allowed compression type on server

Use lctl get_param {mdt|obdfiler}.*.compress_types to list supported
compression types on server.

Use lctl set_param {mdt|obdfilter}.*.compress_types="+gzip-lzo" to
add gzip to and delete lzo from existing compression types on server.

Server will negotiate supported compression types with client in
ocd_compress_types and client import stats could show the negotiated
supported compression types in "lctl get_param {mdc|odc}.*.import"
connect_data section:

import:
  ....
  connect_data:
     ....
     compress_types: [ fast,best,gzip,lz4fast,lz4hc,lzo ]

The OST support for the connect flags is enabled in this patch, but
MDT enabling is pending unaligned compression support for DoM files.

test: refine sanity-compr.sh/test_0a

Only change and verify compression types negotiation between client
and OST0000.

DDN-bug-id: EX-9802
Was-Change-Id: I307f3826973f48791b7fbf4cdfa121401b059b0e
Was-Change-Id: Ic22685d2b21e872c01d90f2c3062b5d0d9b92ec2

test: sanity-compr.sh/test_0a failure

* move sanity-compr.sh test_0a/test_0b to test_1013a/test_1013b
* explicitly specify client's hostname to get client's negotiated
  compression types, as test environtment could mount several clients

DDN-bug-id: EX-9802
Was-Change-Id: Ic091f55a59ad9cfdaf3a94a58d44b372070c7875

Test-Parameters: forjanitoronly
DDN-bug-id: EX-6269
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I18943352e25ed9d5fe82442df9f00a7ef388f242
68374 master J ✗2B ✗T –R 0/2
LU-10026 csdc: store compression info in FID EA
reviewing Marc Vef · build failure (#130348)
2 unique failures csdc 1 unresolved M +37 −65
68d
build failure (#130348)
janitor: 2 test failures unique to this patch — sanity-pfl@ldiskfs+DNE:test_100b, sanity-quota@ldiskfs+DNE:test_80
1 unresolved thread(s) await your reply — last from Marc Vef
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
sanity-pfl@ldiskfs+DNE:test_100bseen in 4 other reviews
sanity-quota@ldiskfs+DNE:test_80seen in 73 other reviews
build #130348 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 10:37 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 10:37
[Marc Bot] upstream remarks for reference:

Applied cleanly. Note for reviewers: this changes where the PFID EA is stored for small inodes (no longer embedded in LMA for <=256-byte inodes) - needs interop/lfsck review on master.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: store compression info in FID EA

Store compression information in OST-object's FID EA, and lfsck could
use it to recover the MDT-object layout EA from orphan OST-object(s).

2.15 Lustre may embed PFID and layout stripe info in LMA EA, this
patch would clear them from LMA EA and store them with compression
info directly into FID EA thereafter.

Test-Parameters: forjanitoronly
DDN-bug-id: EX-8038
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Iacac04601b73f85d9bc057b8dd34a5004248dac4
66612 master J !B ✗T –R 0/2
LU-10026 csdc: sending compression info to server
reviewing Marc Vef · build failure (#130320)
csdc 4 unresolved M +100 −13
68d
build failure (#130320)
4 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor run: 11 failing config(s), none unique to this patch — janitor results
build #130320 FAILURE
patchsets: PS1 06-11 PS2 08-25 PS3 08-26
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-07-15 00:58 Gerrit AI review for Lustre COMMIT_MSG:12 — (minor) This is an on-wire change: the client now fills bytes in the obdo (formerly o_padding_4) that are sent to the OST/MDS. Test-Paramete
Gerrit AI review for Lustre PS1 · 2026-07-15 00:58
(minor) This is an on-wire change: the client now fills bytes in the obdo (formerly o_padding_4) that are sent to the OST/MDS. Test-Parameters: forjanitoronly doesn't exercise interoperability. Consider requesting old-server/new-client and new-server/old-client runs with serverjob/serverbuildno and clientjob/clientbuildno so the padding-reuse stays wire-compatible with unpatched peers.
reply PS2 2026-08-25 21:23 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS2 · 2026-08-25 21:23
[Marc Bot] upstream remarks for reference:

Rebase notes: kept the base's comment wording for the chunk-bits field
(2^(16+chunk_lum_bits)); the lov_lsm2layout() wrapper is added alongside
the base's compr_name_from_type() helper in lov_internal.h.
reply PS1 2026-07-15 00:58 Gerrit AI review for Lustre lustre_user.h:1128 — (minor) This comment reword looks unrelated to sending compression info to the server; is it meant to be in this patch? Also the code comput
Gerrit AI review for Lustre PS1 · 2026-07-15 00:58
(minor) This comment reword looks unrelated to sending compression info to the server; is it meant to be in this patch? Also the code computes the chunk size with COMPR_CHUNK_MIN_BITS (COMPR_GET_CHUNK_SIZE()), not LOV_MIN_STRIPE_BITS; they happen to both be 16, but referencing the constant the code actually uses would be clearer.
reply PS1 2026-07-15 00:58 Gerrit AI review for Lustre lov_internal.h:408 — This isn't a bug, but after this patch lov_lsm2layout() has no remaining callers (both lov_io.c and lovsub_object.c now call lov_lsm2layout2
Gerrit AI review for Lustre PS1 · 2026-07-15 00:58
This isn't a bug, but after this patch lov_lsm2layout() has no remaining callers (both lov_io.c and lovsub_object.c now call lov_lsm2layout2()). Folding the olc parameter into lov_lsm2layout() and updating those two call sites would avoid the version-suffixed name and the now-dead wrapper.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS3 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: sending compression info to server

Client fills in layout compression info into obdo and passes it
to server.

Test-Parameters: forjanitoronly
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Ieb5d7b3609da41f35f8622ed6116f19ce7567ddb
68380 master J !B ✗T –R 0/2
LU-10026 csdc: exponential backoff of incompressiblity check
reviewing Marc Vef · build failure (#130354)
csdc 1 unresolved M +144 −90
69d
build failure (#130354)
1 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 8 failing config(s), none unique to this patch — janitor results
build #130354 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 10:38 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 10:38
[Marc Bot] upstream remarks for reference:

Chunk-bits field naming follows the series (llc_compr_chunk_lum_bits).
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: exponential backoff of incompressiblity check

If a file is incompressible and after a round of compressibility
check, if it remains incompressible, this patch would doubles the
skip bytes before running into another round of compressiblity
check.

This patch adds a state machine for update_compression_info(), the
states could be CS_INCOMPR, CS_COMPR, CS_CHECK, CS_CHECK_INC.

CS_INCOMPR    --  file is not compressible
CS_COMPR      --  file is  compressible
CS_CHECK      --  was in CS_COMPR, is now under check phase
CS_CHECK_INC  --  was in CS_INCOMPR, is now under check phase

state transition:
INCOMPR --> INCOMPR   : skip bytes has not been passed
INCOMPR --> CHECK_INC : skip bytes has been reached, in check phase
COMPR   --> CHECK     : in check phase, checked bytes has not been
                        reached
CHECK*  --> CHECK*    : in check phase, checked bytes has not been
                        reached
CHECK*/COMPR
          --> COMPR   : file is determined to be compressible
CHECK/COMPR
          --> INCOMPR : file is determined to be incompressible, reset
                        the skip bytes check length
CHECK_INC --> INCOMPR : file is determined to be incompressible,
                        double the skip bytes check length

====

Test with 4 OSTs system, target file layout is set as:
lfs setstripe -Eeof -c-1 -Z lz4 --compress-chunk=64 $tf

and src file is 336M bz2 file, using "dd if=$src of=$tf bs=4M" copy
this bz2 file to target file.

w/o the patch, copy uses about 7 seconds
** start 1724216088 **
84+1 records in
84+1 records out
352625400 bytes (353 MB, 336 MiB) copied, 3.76366 s, 93.7 MB/s
** end 1724216095 **
...7 seconds

w/ the patch, copy uses about 4 seconds
** start 1724215237 **
84+1 records in
84+1 records out
352625400 bytes (353 MB, 336 MiB) copied, 2.07946 s, 170 MB/s
** end 1724215241 **
...4 seconds

Test-Parameters: forjanitoronly
DDN-bug-id: EX-8355
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I42105d3e137bf50897ff5c67654ca33552b23102
68379 master J !B ✗T –R 0/2
LU-10026 utils: return error on invalid compress level setting
reviewing Marc Vef · build failure (#130353)
csdc 1 unresolved S +11 −4
69d
build failure (#130353)
1 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 7 failing config(s), none unique to this patch — janitor results
build #130353 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 10:38 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 10:38
[Marc Bot] upstream remarks for reference:

- The strtoul/end-pointer validation this patch adds was already carried (in stricter form) by the earlier level-handling patches of this series; those hunks were dropped.
- The parse-time rewrite of low lz4 levels to the lz4fast default was removed here (matching the original series' final behaviour): the stored level is kept and the compression engine falls back to lz4fast when allocating the compressor. This also makes the negotiated-type test lists in sanity-pfl roundtrip correctly.
- The new negative test was renamed test_1013a -> test_1013c: 1013a already exists (type negotiation test); the duplicate name would have silently shadowed it (latent issue in the original series).
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 utils: return error on invalid compress level setting

lfs setstripe -Z <compress_type>:<compress_level> does not report
error on invalid <compress_level>.
An explicit low level for the lz4 type (below the lz4hc minimum) is
no longer silently rewritten to the lz4fast default at parse time;
the stored level is kept and the compression engine falls back to
lz4fast for such levels when allocating the compressor.

Test-Parameters: forjanitoronly
DDN-bug-id: EX-10186
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Ie794a6d4cf208a9c66d1d179c157fee756477aee
66611 master J !B ✗T –R 0/2
LU-10026 lfs: migrate compressed file without stripe info
reviewing Marc Vef · build failure (#130319)
csdc 2 unresolved M +76 −14
69d
build failure (#130319)
2 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor run: 4 failing config(s), none unique to this patch — janitor results
build #130319 FAILURE
patchsets: PS1 06-11 PS2 08-25 PS3 08-26
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-07-15 00:58 Gerrit AI review for Lustre COMMIT_MSG — (minor) The diff also touches Documentation/man1/lfs-mirror-extend.1 (documenting compression options for SETSTRIPE_OPTIONS), which the mess
Gerrit AI review for Lustre PS1 · 2026-07-15 00:58
(minor) The diff also touches Documentation/man1/lfs-mirror-extend.1 (documenting compression options for SETSTRIPE_OPTIONS), which the message doesn't mention and which is unrelated to the migrate fix. Is that hunk meant to be part of this patch, or should it be split out / called out in the body?
reply PS1 2026-07-15 00:58 Gerrit AI review for Lustre liblustreapi_layout.c:2166 — (minor) This prints `fd`, which is always -1 on this path, so the message reads "Cannot open file X: -1" with no useful detail. The error is
Gerrit AI review for Lustre PS1 · 2026-07-15 00:58
(minor) This prints `fd`, which is always -1 on this path, so the message reads "Cannot open file X: -1" with no useful detail. The error is in errno from open() – strerror(errno) would be the informative value.

Also note the caller (lfs_migrate/lfs.c) already emits its own llapi_error() when this returns < 0, so this adds a duplicate line. Using llapi_error(LLAPI_MSG_ERROR, errno, ...) here (as the ENOSPC path below does) would decode errno and respect the message level instead of writing to stderr unconditionally.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS3 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 lfs: migrate compressed file without stripe info

lfs migrate file without specifying stripe info will get layout info
from the file as the target layout template, and
llapi_layout_get_by_xattr() tries to convert LOV_PATTERN_* values
to user scope LLAPI_LAYOUT_* values, while LOV_PATTERN_COMPRESS
is missed in this conversion.

This patch add a function llapi_pattern_from_lov() to handle this
conversion specifically.

This patch also add more error messages for llapi_layout_file_open().

Test-Parameters: forjanitoronly
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I49a43cc7761cd2baed7a5da7d4e7cff2152ff9bb
66615 master J ✗1B ✗T –R 0/2
LU-10026 csdc: prohibit set compression upon encrypted file
reviewing Marc Vef · build failure (#130322)
1 unique failure csdc 1 unresolved L +247 −35
69d
build failure (#130322)
janitor: 1 test failure unique to this patch — conf-sanity4@zfs:test_123aj
1 unresolved thread(s) await your reply — last from Marc Vef
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
conf-sanity4@zfs:test_123ajNEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews
build #130322 FAILURE
patchsets: PS1 06-11 PS2 08-25 PS3 08-26
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS2 2026-08-25 21:23 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS2 · 2026-08-25 21:23
[Marc Bot] upstream remarks for reference:

Rebase note: kept the base's newer compression-parameter assignment block
in lod_use_defined_striping() (gated on LOV_PATTERN_COMPRESS, with the
extension-component chunk-adjustment deferral); this patch's encryption
checks and attr threading apply on top unchanged.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS3 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: prohibit set compression upon encrypted file

Setting compression layout component upon encrypted file is not
allowed for now.

This patch add this check on MDS in creating file with layout,
adding/merging new mirror to existing file.

Test-Parameters: forjanitoronly
Test-Parameters: testlist=sanity-sec env=ONLY=67,PTLDEBUG=-1
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I60d9f4bfce3a498f1eb3994c6276afb9d89c99a7
66266 master J !B ✗T –R 0/2
LU-10026 osc: clear oi_write_osclock in lock fini func
cc Marc Vef · build failure (#130263)
csdc S +12 −4
69d
janitor run: 3 failing config(s), none unique to this patch — janitor results
build #130263 FAILURE
patchsets: PS1 05-28 PS2 06-11 PS3 06-11 PS4 08-25
tags: csdc
owner Marc Vef · uploader Marc Vef · PS4 uploaded 71d ago · NEW · open in Gerrit ↗
commit message
LU-10026 osc: clear oi_write_osclock in lock fini func

Move osc_io::oi_write_osclock clearance in osc_lock_fini() as
it's set in osc_lock_init().

Compression IO could possibly expand lock region and
osc_lock_set_writer() could access a osc_io that is not accessed
in osc_io_iter_init(), so that osc_io_rw_iter_fini() miss clearing
osc_io's oi_writer_osclock.

This patch moves the oi_write_osclock clearance in lock fini function
to match its creation in osc_lock_init().

Test-Parameters: forjanitoronly
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Ied42f5befc1abd76aa10a7666eadb9a58e1f1783
68351 master J ✗2B ✗T –R 0/2
LU-10026 llite: don't queue async IO page for inode in freeing
cc Marc Vef · build failure (#130329)
2 unique failures csdc 1 unresolved S +19 −0
70d
build failure (#130329)
janitor: 2 test failures unique to this patch — runtests@ldiskfs+DNE:test_1, runtests-ssk@ldiskfs+SharedKey:test_1
1 unresolved thread(s) await your reply — last from Marc Vef
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
runtests@ldiskfs+DNE:test_1seen in 5 other reviews
runtests-ssk@ldiskfs+SharedKey:test_1seen in 8 other reviews
build #130329 FAILURE
patchsets: PS1 08-25 PS2 08-26
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-25 21:24 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-25 21:24
[Marc Bot] upstream remarks for reference:

Port notes:

- Registered as .cio_commit_async with the current signature (the
  enum cl_io_priority argument was added upstream), next to master's
  renamed .cio_read_ahead_prep hook.
- Reviewer note: master meanwhile carries LU-17364 ("discard un-flushable
  pages on evicted inode teardown"), which addresses the same teardown
  crash from another angle; this patch is kept as an additional guard and
  may be droppable after evaluation.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS2 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 llite: don't queue async IO page for inode in freeing

When inode is being freed, do not try to queue async IO pages as
there is a race window between ll_delete_inode() and
ll_truncate_inode_pages_final(), and the queued async IO pages
cannot be teardown.

(osc_page.c:182:osc_page_delete()) Trying to teardown failed: -16
(osc_page.c:184:osc_page_delete()) ASSERTION( 0 ) failed:
(osc_page.c:184:osc_page_delete()) LBUG

    lbug_with_loc+0x64/0xb0 [libcfs]
    osc_page_delete+0x290/0x574 [osc]
    cl_page_delete0+0xb8/0x404 [obdclass]
    cl_page_delete+0x64/0x22c [obdclass]
    ll_invalidate_folio+0x114/0x2a0 [lustre]
    truncate_cleanup_folio+0x6c/0xf0
    truncate_inode_pages_range+0xf8/0x4e0
    truncate_inode_pages_final+0x54/0x80
    ll_truncate_inode_pages_final+0x40/0x520 [lustre]
    ll_delete_inode+0x68/0x25c [lustre]
    evict+0xb8/0x1a0

Test-Parameters: forjanitoronly
DDN-bug-id: EX-11006
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: If655a89faf6f979167c05c91c7b52a6c49a7884b
68399 master J –B ✗T –R -1/2−
LU-10026 tests: sanity-compr/1000d failure for ARM client
reviewing Marc Vef · build failure (#130371)
csdc S +9 −7
70d
build #130371 FAILURE
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 tests: sanity-compr/1000d failure for ARM client

aarch64 has 64K page size and compression chunk size could be adjusted
upward if it's original setting value is equal to page size, so
the test should be refined to get the actual chunk size be set.

Test-Parameters: forjanitoronly
DDN-bug-id: EX-7536
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Ide2f91e255ba886f9c1e18d1e1fe89c589f3bca1
68373 master J –B ✗T –R +0/2−
LU-10026 csdc: stop compressing incompressible file data
reviewing Marc Vef · build failure (#130347)
csdc 2 unresolved L +413 −17
70d
build failure (#130347)
2 unresolved thread(s) await your reply — last from Marc Vef
build #130347 FAILURE
reviews: Alex Zhuravlev +1 2026-08-26 12:21
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 10:37 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 10:37
[Marc Bot] upstream remarks for reference:

ci_incompressible placed in the relocated cl_io bitfield next to ci_size_extend_compression; test_1021 gate converted to compression_supported.
reply PS1 2026-08-26 11:09 Misc Code Checks Robot (Gatekeeper helper) osc_io.c:566 — error: osc_io_iter_init():'osc' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper) PS1 · 2026-08-26 11:09
error: osc_io_iter_init():'osc' dereferencing possible ERR_PTR()
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: stop compressing incompressible file data

The reduced_ratio (original_size/compress_reduced_size) represents
the minimum fraction of pages that are compressed out of each chunk,
namely the compressed chunk needs to shrink by at least
1/reduced_ratio blocks for it to be "compressible".

Let size compression_ratio be defined as
original_size/after_compression_size, so

reduced_ratio = compression_ratio / (compression_ratio - 1)

and we set its default value to 16, equivalent to 1.07 of compression
ratio (i.e. needs to shrink at least one 4KB block out of each 64KB
chunk).

After every compress_check_bytes of data being compressed, file's
compressibility would be re-calculated based on average
compress_reduced and average compress_orig data size.

Stop compressing file data if it is deemed to be incompressible, and
after compress_skip_bytes data have been written uncompressed , retry
the file compressibility check.

compress_reduced_ratio, compress_check_bytes, compress_skip_bytes
are tunable parameters:
	osc.*.compress_reduced_ratio
	osc.*.compress_check_bytes
	osc.*.compress_skip_bytes
their default values are 16, 1M and 32M respectively.

tests: use /dev/zero as compressible source

in test 1021 as hdf file has few incompressible chunks and this
breaks the test infrequently.

DDN-bug-id: EX-10857
Was-Change-Id: Iba29d9e654a245d3c0cbb14a8b7dbb9f847f52d5

Test-Parameters: forjanitoronly
DDN-bug-id: EX-8355
Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I4ce3d752c67f18ba7b100c72a2bb61a91258c6e8
68405 master J !B ✗T –R 0/2
LU-10026 cdsc: update layout compressibility
reviewing Marc Vef · build failure (#130377)
csdc 4 unresolved L +335 −54
70d
build failure (#130377)
4 unresolved thread(s) await your reply — last from Marc Vef
janitor run: 3 failing config(s), none unique to this patch — janitor results
build #130377 FAILURE
no vote yet: Alex Zhuravlev
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 12:51 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 12:51
[Marc Bot] upstream remarks for reference:

- OBD_CONNECT2_UPDATE_LAYOUT was already reserved on master at the same bit; only the MDT_CONNECT_SUPPORTED2 and client connect lists needed the addition.
- ci_need_change_layout added to the current cl_io bitfield; CAT_COMPRESSIBLE handling merged into the current vvp_attr_update().
- mdd_layout_update_pccro was renamed/extended per the patch on the current (retry-aware) master form.
- FORMATTED_BUF_LEN (used by the new getstripe formatting) is defined locally - the source branch carries it from an unrelated change.
- test_1021 layout-flag assertions applied unconditionally (the original wrapped them in version gates).
reply PS1 2026-08-26 13:38 Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:297 — error: vvp_layout_minor_change():'vob' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper) PS1 · 2026-08-26 13:38
error: vvp_layout_minor_change():'vob' dereferencing possible ERR_PTR()
reply PS1 2026-08-26 13:38 Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:429 — error: vvp_io_fini():'vob' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper) PS1 · 2026-08-26 13:38
error: vvp_io_fini():'vob' dereferencing possible ERR_PTR()
reply PS1 2026-08-26 13:38 Misc Code Checks Robot (Gatekeeper helper) vvp_io.c:1973 — error: vvp_io_init():'vob' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper) PS1 · 2026-08-26 13:38
error: vvp_io_init():'vob' dereferencing possible ERR_PTR()
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 cdsc: update layout compressibility

When compressing write changes the file's compressibility, it updates
the file layout flags so that its compressibility persists.

lod: reset la_attr at declare

to avoid unplanned local attributes update during minor layout change.

DDN-bug-id: EX-10786
Was-Change-Id: I093efeb9cf110adfe6a7590091e60b1e9f1eb9ed

Test-Parameters: forjanitoronly
DDN-bug-id: EX-8355
Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Ia2964817d1b5fee2d84ef15e9f1036882d70adb2
66284 master J –B ✗T –R -1/2−
LU-10026 csdc: handle data compression on MDT
reviewing Marc Vef · build failure (#130318)
csdc 4 unresolved S +39 −1
70d
build failure (#130318)
4 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
build #130318 FAILURE
patchsets:
+2 earlier PS1 05-28 PS2 06-11
PS3 06-11 PS4 06-11 PS5 06-11 PS6 08-25 PS7 08-26
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS5 2026-07-15 00:57 Gerrit AI review for Lustre COMMIT_MSG:9 — (minor) The body explains the DoM+compress block, but two hunks pull the other way and aren't mentioned: lov_pattern_available() gains LOV_P
Gerrit AI review for Lustre PS5 · 2026-07-15 00:57
(minor) The body explains the DoM+compress block, but two hunks pull the other way and aren't mentioned: lov_pattern_available() gains LOV_PATTERN_MDT | LOV_PATTERN_COMPRESS, and llapi_pattern_to_lov() gains MDT|COMPRESS and RAID0|COMPRESS cases. Both make the combination more acceptable, not less. Could the message cover why they belong in a patch whose stated purpose is to disallow it?
reply PS5 2026-07-15 00:57 Gerrit AI review for Lustre lustre_user.h:837 — (defect) This makes the server accept an MDT|COMPRESS component (lod_lov.c / lov_ea.c call lov_pattern_available()), yet lov_pattern_support
Gerrit AI review for Lustre PS5 · 2026-07-15 00:57
(defect) This makes the server accept an MDT|COMPRESS component (lod_lov.c / lov_ea.c call lov_pattern_available()), yet lov_pattern_supported() still excludes it, so client IO marks such an entry invalid (lov_object.c sets lle_valid = 0). The only guard against creating it lives in lfs.c; a liblustreapi caller doing llapi_layout_pattern_set(MDT) + llapi_layout_compress_set() bypasses that and produces a layout the server stores but IO cannot use. If DoM+compress is unsupported, should the block live in the library/server rather than only the CLI?
reply PS5 2026-07-15 00:57 Gerrit AI review for Lustre lfs.c:3459 — (defect) errno is set to a negative value here; every other error path in comp_args_to_layout() uses errno = EINVAL. A negative errno breaks
Gerrit AI review for Lustre PS5 · 2026-07-15 00:57
(defect) errno is set to a negative value here; every other error path in comp_args_to_layout() uses errno = EINVAL. A negative errno breaks strerror(errno)/perror on this -1 return. Should be errno = EINVAL.
reply PS5 2026-07-15 00:57 Gerrit AI review for Lustre liblustreapi_layout.c:831 — (minor) These two cases look unreachable. The COMPRESS bit never reaches llc_pattern: llapi_layout_pattern_set() rejects any pattern carryin
Gerrit AI review for Lustre PS5 · 2026-07-15 00:57
(minor) These two cases look unreachable. The COMPRESS bit never reaches llc_pattern: llapi_layout_pattern_set() rejects any pattern carrying it, and llapi_layout_from_lum() stores compression in llc_compr_type, not the pattern. The bit is OR'd into lmm_pattern separately in llapi_layout_to_lum() (blob->lmm_pattern |= LOV_PATTERN_COMPRESS). Was a real caller intended, or can these be dropped?
tags: csdc
owner Marc Vef · uploader Marc Vef · PS7 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: handle data compression on MDT

Do not support setting data compression component on DoM until
data compression on MDT implemented.

DDN-bug-id: EX-7806
Was-Change-Id: I3794460140f08a073377c418dd56e7dda907d96d

Test-Parameters: forjanitoronly
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I8b5c4d5fd18033e796b1c7555c37251e4f7f9a49
65762 master J ✗1B ✓T ✗1R 0/2
LU-10026 csdc: prefer uncompressed mirror for read and write
reviewing Marc Vef · janitor: 1 test failure unique to this patch — sanity3@zfs:test_907
1 unique failure csdc 4 unresolved L +213 −47
74d
janitor: 1 test failure unique to this patch — sanity3@zfs:test_907
enforced failed: review-dne-selinux-ssk-part-2
4 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
sanity3@zfs:test_907seen in 57 other reviews
failed enforced testplatformdetail
review-dne-selinux-ssk-part-2 RHEL 8.10 / x86_64 ran 7 tests. 1 tests failed: sanity-sec. session
build #129912 SUCCESS · tests all Maloo sessions
no vote yet: James Simmons, Andreas Dilger, Artem Blagodarenko
patchsets:
+7 earlier PS1 05-08 PS2 05-28 PS3 05-28 PS4 06-11 PS5 06-11 PS6 07-27 Artem Blagodarenko PS7 07-28 Artem Blagodarenko
PS8 08-19 Artem Blagodarenko PS9 08-19 Artem Blagodarenko PS10 08-20 Artem Blagodarenko PS11 08-20 Artem Blagodarenko PS12 08-21 Artem Blagodarenko
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS12 2026-08-22 12:56 Gerrit AI review for Lustre lod_lov.c:622 — This bonus is added once per allocated stripe, which is exactly the weight the OS_STATFS_NONROT bonus a few lines above uses, so the two can
Gerrit AI review for Lustre PS12 · 2026-08-22 12:56
This bonus is added once per allocated stripe, which is exactly the weight the OS_STATFS_NONROT bonus a few lines above uses, so the two can cancel out.

Two mirrors, no LCME_FL_PREF_WR anywhere, one stripe each:

    mirror 0: compressed,   stripe on a NONROT OST -> pref = 1
    mirror 1: uncompressed, stripe on a rotating OST -> pref = 1

lme_preference ties, so the `!found_preferred` fallback below keeps the lower index (`>` is strict) and sets lme_prefer on mirror 0. lod_primary_pick() then classifies mirror 0 as case B (preferred + compressed) and mirror 1 as case C, and B outranks C, so the write goes to the compressed mirror.

A wider compressed mirror wins outright rather than tying: 4 NONROT stripes compressed = 4 vs 1 NONROT stripe uncompressed = 2.

Mixed flash/disk mirrors are the case the non-rotational preference was added for, so this is not an exotic layout. Should the uncompressed bonus be on a different scale than the per-stripe NONROT count (or applied once per mirror) so it can't be traded away against OST speed?

The comment also says "mirror", but this sits in the per-stripe loop of one component.
reply PS12 2026-08-22 12:56 Gerrit AI review for Lustre lod_object.c:8060 — (style) Not a bug, but this comment has a UTF-8 em dash in it; the rest of the tree is plain ASCII. A plain '-' would do.
Gerrit AI review for Lustre PS12 · 2026-08-22 12:56
(style) Not a bug, but this comment has a UTF-8 em dash in it; the rest of the tree is plain ASCII. A plain '-' would do.
reply PS12 2026-08-22 12:56 Gerrit AI review for Lustre lod_object.c:8088 — Ranking B (preferred + compressed) above C (uncompressed) reads as "an explicit `lfs setstripe --flags=prefer` beats the compression heurist
Gerrit AI review for Lustre PS12 · 2026-08-22 12:56
Ranking B (preferred + compressed) above C (uncompressed) reads as "an explicit `lfs setstripe --flags=prefer` beats the compression heuristic". But lme_prefer is not only user intent: when no component carries LCME_FL_PREF_WR, lod_fill_mirrors() picks the highest lme_preference non-stale mirror and sets lme_prefer = 1 on it.

So tier B is reachable on a file the user never flagged, and the heuristic ends up overriding its own compression preference. Should case B be restricted to mirrors that actually carry LCME_FL_PREF_WR, or should the synthesized preference be tracked separately from the user flag?
reply PS12 2026-08-22 12:56 Gerrit AI review for Lustre lov_io.c:662 — (minor) ci_ndelay_tried > 0 means "not the first lov_io_mirror_init() for this env", which is broader than "this is an FLR error retry".
Gerrit AI review for Lustre PS12 · 2026-08-22 12:56
(minor) ci_ndelay_tried > 0 means "not the first lov_io_mirror_init() for this env", which is broader than "this is an FLR error retry".

ll_file_io_generic() restarts the io for reasons unrelated to mirror failure and preserves the counter:

    partial_io -> io->ci_need_restart = 1   (file.c)
    retried = io->ci_ndelay_tried; goto restart;

A single buffered read larger than max_io_bytes therefore takes the uncompressed mirror for the first chunk only; from the second chunk on ci_ndelay_tried is non-zero, lis_mirror_index has been advanced by one, and the first in-range mirror is accepted even when it is compressed. The layout-change restart in vvp_io_iter_init() has the same shape.

Would gating on something that only the -EAGAIN mirror-failover path sets (io->ci_tried_all_mirrors, or a dedicated flag set where cl_io_loop() retries) keep the failover fix without giving up the preference on ordinary io continuation?
tags: csdc
owner Marc Vef · uploader Artem Blagodarenko · PS12 uploaded 76d ago · NEW · open in Gerrit ↗
commit message
LU-10026 csdc: prefer uncompressed mirror for read and write

When accessing a mirrored file with both compressed and uncompressed
components, choose uncompressed components for read (lov_io.c).

When writing to mirrored files with both compressed and uncompressed
mirrors, prefer the uncompressed components to write; this is better
for performance, more compatible with older clients, and better fits
the model of compressing files after initial write. The write-side
preference is implemented via lod_fill_mirrors() and lod_primary_pick()
using a new lme_compressed flag.

Note: the changes to lod_fill_mirrors() and lod_primary_pick() affect
all FLR files, not only those with compressed mirrors. Plain FLR writes
will also use the updated preferred-mirror selection logic.

DDN-bug-id: EX-6510
Was-Change-Id: I62a117d5cc3d34e2c0c96d1a9ade8eef0a2d1291

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Artem Blagodarenko <ablagodarenko@gmail.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I043b27bd891c039901075a08c76630f8f0f9f182
65761 master J !B ✓T ✗1R 0/2
LU-10026 utils: add 'lfs find' support for compressed file
reviewing Marc Vef · enforced failed: review-dne-selinux-ssk-part-2
csdc 9 unresolved L +715 −67
74d
enforced failed: review-dne-selinux-ssk-part-2
9 unresolved thread(s) await your reply — last from Gerrit AI review for Lustre
janitor run: 4 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-selinux-ssk-part-2 RHEL 8.10 / x86_64 ran 7 tests. 1 tests failed: sanity-sec. session
build #129911 SUCCESS · tests all Maloo sessions
no vote yet: James Simmons, Andreas Dilger, Artem Blagodarenko
patchsets:
+12 earlier PS1 05-08 PS2 05-28 PS3 05-28 PS4 06-11 PS5 06-11 PS6 06-17 Artem Blagodarenko PS7 06-18 Artem Blagodarenko PS8 07-24 Artem Blagodarenko PS9 07-27 Artem Blagodarenko PS10 07-27 Andreas Dilger PS11 07-27 Andreas Dilger PS12 07-27 Andreas Dilger
PS13 08-19 Artem Blagodarenko PS14 08-19 Artem Blagodarenko PS15 08-20 Artem Blagodarenko PS16 08-20 Artem Blagodarenko PS17 08-21 Artem Blagodarenko
threads: 9 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre COMMIT_MSG:9 — (minor) The first three bullets read as new functionality, but `--comp-flags=[^]compress` and `--comp-flags=[^]nocompr` already work (LCME_F
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(minor) The first three bullets read as new functionality, but `--comp-flags=[^]compress` and `--comp-flags=[^]nocompr` already work (LCME_FL_COMPRESS/LCME_FL_NOCOMPR are in comp_flags_table[]), and so does `-L compress` (LOV_PATTERN_COMPRESS is in lov_pattern_names[]). This patch documents them and adds test coverage rather than adding them. Could the wording say "document" for those three, so the message matches the diff?
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre lustre_user.h:3278 — (style) COMPR_LEVEL_MAX is already defined with the same value earlier in this header, just after `enum ll_compr_type`, with a comment expla
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(style) COMPR_LEVEL_MAX is already defined with the same value earlier in this header, just after `enum ll_compr_type`, with a comment explaining it. Two definitions can drift apart later; can this one be dropped?
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre sanity-pfl.sh:3078 — (style) extra blank line. Also z1..z4 here, and `expect` in test_100d, are not declared `local`.
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(style) extra blank line. Also z1..z4 here, and `expect` in test_100d, are not declared `local`.
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre lfs.c:4637 — (style) not a bug, but `compress-chunk` already appears in this long_opts[] further down, so it is listed twice now. getopt_long takes the f
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(style) not a bug, but `compress-chunk` already appears in this long_opts[] further down, so it is listed twice now. getopt_long takes the first match so it still works; `compr-chunk` looks like the only new alias actually needed here.
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre lfs.c:8226 — (typo) this comment uses a UTF-8 em dash; the tree is otherwise plain ASCII. Same in the `%LZ` directory-branch comment in liblustreapi_pfin
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(typo) this comment uses a UTF-8 em dash; the tree is otherwise plain ASCII. Same in the `%LZ` directory-branch comment in liblustreapi_pfind.c.
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre lfs.c:8248 — (defect) atoi() cannot report a parse failure, so `--compr-level=abc` silently becomes level 0, and `--compr-level=+abc` becomes "level > 0"
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(defect) atoi() cannot report a parse failure, so `--compr-level=abc` silently becomes level 0, and `--compr-level=+abc` becomes "level > 0", i.e. every compressed component. The unsigned range check above cannot catch it.

`-Z gzip:abc` is rejected by llapi_parse_compress_type(), and the setstripe `--compress-level` path uses strtol() with an end-pointer check, so the three spellings of the same thing disagree. strtol() plus `*end != '\0'` here would line them up.
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre liblustreapi_pfind.c:509 — (minor) This helper backs every numeric `lfs find` predicate, and the new exact-match branch only changes behaviour when `margin == 0`. `lfs
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(minor) This helper backs every numeric `lfs find` predicate, and the new exact-match branch only changes behaviour when `margin == 0`. `lfs find -z N` with a plain number is such a caller: lfs.c does `fp_ext_size_units /= SEL_UNIT_SIZE`, so 1/1024 becomes 0, and an exact `-z` match that previously reported "no match" now matches. That may well be desirable, but it is a silent change to an unrelated option.

The new compression predicates are the only callers passing margin 0; the rest pass 1 or a unit size, and with margin 1 this function already returns 1 on an exact match. Passing 1 there would avoid touching the shared helper, and would also make `--compr-level=-N` / `--compr-chunk=-N` mean "< N" like `-c -N`, `--size -N` and friends, rather than "<= N".

The table above the function (rows 5 and 6, and the note about the interval `(limit - margin, limit]`) no longer describes the code either.
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre liblustreapi_pfind.c:975 — (defect) Negation is handled differently for level/chunk than for type. `fp_exclude_compr_lvl` is passed into find_value_cmp() as `negopt`,
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(defect) Negation is handled differently for level/chunk than for type. `fp_exclude_compr_lvl` is passed into find_value_cmp() as `negopt`, so `found_lvl` ends up meaning "some component does not match" instead of "no component matches", and the aggregation here then ignores the exclude flag entirely - unlike the fp_check_compr_type block just above.

For a file with two compressed components, level 3 and level 5:

    lfs find ! --compr-level=3 dir

entry(lvl 5) makes find_value_cmp() return -1, negopt flips it to 1, found_lvl is set, and the file is reported - even though it does have a level-3 component. The equivalent `! --compr-type=gzip` on a gzip+lz4 file correctly does not match.

Should the level and chunk comparisons drop the negopt argument and be inverted here the same way type is?
reply PS17 2026-08-22 12:35 Gerrit AI review for Lustre liblustreapi_pfind.c:1771 — (defect) `fp_lum_size` is the size common_param_init() allocated for the lmd buffer (>= XATTR_SIZE_MAX, 64KiB), not the length of the layout
Gerrit AI review for Lustre PS17 · 2026-08-22 12:35
(defect) `fp_lum_size` is the size common_param_init() allocated for the lmd buffer (>= XATTR_SIZE_MAX, 64KiB), not the length of the layout stored in it.

For a non-composite lum, llapi_layout_get_by_xattr() never narrows that value, so llapi_layout_objects_in_lum() computes (65536 - 32) / 24 = 2729 objects and __llapi_comp_alloc() rejects it with EINVAL because 2729 > LOV_MAX_STRIPE_COUNT (2000).

So this call fails for every plain V1/V3 file and always falls through to llapi_layout_get_by_path(); only composite layouts reach the new path, because the entry loop resets the size to `ent->lcme_size`. Passing the actual layout length instead would make the fast path work for non-PFL files too.
tags: csdc
owner Marc Vef · uploader Artem Blagodarenko · PS17 uploaded 76d ago · NEW · open in Gerrit ↗
commit message
LU-10026 utils: add 'lfs find' support for compressed file

* Add "--comp-flags=[^]compress" to locate file with/without
  compressed components.
* Add "--comp-flags=[^]nocompr" to locate file with/without setting
  component compress preference.
* Add "[!] --layout=compress" to locate file with/without compressed
  components.
* Add "[!] --compress-type=<compress-type>" to locate compressed file
  with/without specified compress algorithm.
* Add "[!] --compress-level=[+-]<compress-level>" to locate compressed
  file with/without specified compress level.
* Add "[!] --compress-chunk=[+-]<compress-chunk>" to locate compressed
  file with/without specified compress chunk in KiB.

utils: add -Z option for 'lfs getstripe/find'

Add support for "lfs getstripe -Z" to get the last instantiated
component compression information.

Add support for "lfs find -Z <type>[:[+-]<level>]" to keep consistent
options with "lfs setstripe -Z".
DDN-bug-id: EX-6856
Was-Change-Id: Ia5e2a2ea6937dc2b46e224cec808504a196b974c

utils: logical AND for 'lfs find' compression exprs

All search expressions provided to 'lfs find' must be combined as a
logical AND. Fix newly added options for compression support, so that
they comply with this logical AND.
DDN-bug-id: EX-7714
Was-Change-Id: I3b28cd87c1d304df6d04753b413d46f5abcfe16e

csdc: don't set compression layout when disabled

When llite_enable_compression is disabled
(lfs set_param llite.*.enable_compression=0), we should check
it before sending it to MDS lest we get a file with compressed
component which we cannot handle.
DDN-bug-id: EX-7593
Was-Change-Id: Ib1e2123ffdb239c3e1401d682ae9c2c49e3f4a6f

utils: support 'lfs find --printf %LZ'

Add support for "lfs find --printf %LZ" to print the compression
type:level of the last instantiated component of a file.
DDN-bug-id: EX-6856
Was-Change-Id: Iaf1b6c031b06c70e7b5be51354697aa6bdcc9850

csdc: right error code in case compression is disabled

Currently, if compression is disabled on a client the error
message is confusing "Cannot set layout EA: Unknown error 524"

Let's replace the error code from  ENOTSUPP to EOPNOTSUPP,
so error messages become more informative

ctl get_param -n llite.*.enable_compression
0
lfs setstripe -i 0 -c 1 -E -1 -Z lz4 /mnt/lustre/foo.txt
Cannot set layout EA: Operation not supported
lfs setstripe: cannot create composite file
'/mnt/lustre/foo.txt': Inappropriate ioctl for device

This message could be even more informative, but this version
is already much better.
DDN-bug-id: EX-10577
Was-Change-Id: I7fd67d5d3d20bc7de169f35f6fa63b53f2bfe718

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: Ic36946738c3463fd862aeca4ee2e2c2ed85eff84
▶

Review feedback — your turn

(1)
30928 master J –B ✓T ✓R +0/2−
LU-10502 utils: redefine progname in lfs.c
reviewing Jian Yu · John Hammond voted -1
stalled 457d L +353 −343
457d
reviews: Andreas Dilger +1 2018-05-11 15:53 · John Hammond -1 2022-04-06 14:52
no vote yet: Jinshan Xiong
owner Jian Yu · uploader Jian Yu · PS13 uploaded 3106d ago · NEW · open in Gerrit ↗
commit message
LU-10502 utils: redefine progname in lfs.c

This patch redefines progname in lfs.c to fix the issue of
address of a local variable is returned through global variable.

The patch also standardizes some error messages in lfs.c to
remove argv[0] because progname already contains the sub-command
name.

Change-Id: I3adf824dc3b27fbc7e90e94b5163137017baae31
Signed-off-by: Bobi Jam <bobijam.xu@intel.com>
Signed-off-by: Jian Yu <jian.yu@intel.com>
▶

In CI

(0)
nothing here right now
▶

Needs reviewers

(6)
59266 b2_15 J ✗1B ✓T ✓R 0/1
LU-16958 llite: migrate deadlock on not responding lock cancel
reviewing Etienne AUJAMES · CI green — no vote yet from Qian Yingjin, Andreas Dilger
stalled 535d M +21 −49
535d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
unique failing testhistory
sanity2@ldiskfs+DNE:test_813NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews
build #113467 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Andreas Dilger
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS1 uploaded 537d ago · NEW · backport · open in Gerrit ↗
commit message
LU-16958 llite: migrate deadlock on not responding lock cancel

lfs migrate race makes MDS hang with following backtrace

[ 3683.248584] [<0>] ldlm_completion_ast+0x78d/0x8e0 [ptlrpc]
[ 3683.250122] [<0>] ldlm_cli_enqueue_local+0x2fd/0x840 [ptlrpc]
[ 3683.251363] [<0>] mdt_object_local_lock+0x50e/0xb10 [mdt]
[ 3683.252615] [<0>] mdt_object_lock_internal+0x187/0x430 [mdt]
[ 3683.253793] [<0>] mdt_object_lock_try+0x22/0xa0 [mdt]
[ 3683.254857] [<0>] mdt_getattr_name_lock+0x1317/0x1dc0 [mdt]
[ 3683.256016] [<0>] mdt_intent_getattr+0x264/0x440 [mdt]
[ 3683.257105] [<0>] mdt_intent_opc+0x452/0xa80 [mdt]
[ 3683.258126] [<0>] mdt_intent_policy+0x1fd/0x390 [mdt]
[ 3683.259191] [<0>] ldlm_lock_enqueue+0x469/0xa90 [ptlrpc]
[ 3683.260350] [<0>] ldlm_handle_enqueue0+0x61a/0x16c0 [ptlrpc]
[ 3683.261596] [<0>] tgt_enqueue+0xa4/0x200 [ptlrpc]
[ 3683.262662] [<0>] tgt_request_handle+0xc9c/0x1a40 [ptlrpc]
[ 3683.263860] [<0>] ptlrpc_server_handle_request+0x323/0xbd0 [ptlrpc]
[ 3683.265220] [<0>] ptlrpc_main+0xbf3/0x1540 [ptlrpc]
[ 3683.266303] [<0>] kthread+0x134/0x150
[ 3683.267111] [<0>] ret_from_fork+0x35/0x40

The deadlock happens as follows:
T1:
vvp_io_init()
  ->ll_layout_refresh() <= take lli_layout_mutex
  ->ll_layout_intent()
  ->ll_take_md_lock()  <= take the CR layout lock ref
  ->ll_layout_conf()
    ->vvp_prune()
    ->vvp_inode_ops() <= release lli_layout_mtex
    ->vvp_inode_ops() <= try to acquire lli_layout_mutex
    -> racer wait here for T2
T2:
->ll_file_write_iter()
  ->vvp_io_init()
    ->ll_layout_refresh() <= take lli_layout_mutex
    ->ll_layout_intent() <= Request layout from MDT
    -> racer wait from server...

And server want to cancel the CR layout lock T1 hold, and it won't
happen. Also T1 could has take extent ldlm lock while waiting
lli_layout_mutex hold by T2, and ofd_destroy_hdl does not get the
lock cancellation response from T1.

lli_layout_mutex is only needed for enqueuing layout lock from server,
so that ll_layout_conf() does not involve with lli_layout_mutex.

Lustre-change: https://review.whamcloud.com/52388
Lustre-commit: 37646c74bf884c535149d530af840d728814792b

Fixes: 8f2c1592c3 ("LU-16958 llite: migrate vs regular ops deadlock")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ib94de2c63544c3a962199aa0537418255980ae8c
Reviewed-by: Qian Yingjin <qian@ddn.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
57653 b2_15 J ✗15B ✓T ✓R 0/1
LU-16637 llite: call truncate_inode_pages() in inode lock
reviewing Etienne AUJAMES · CI green — no vote yet from Neil Brown
stalled 537d L +336 −97
537d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
unique failing testhistory
ost-pools@zfs:test_1nseen in 2 other reviews
ost-pools@zfs:test_11seen in 2 other reviews
ost-pools@zfs:test_15seen in 2 other reviews
ost-pools@zfs:test_16seen in 2 other reviews
ost-pools@zfs:test_19seen in 2 other reviews
ost-pools@zfs:test_20seen in 2 other reviews
ost-pools@zfs:test_21seen in 2 other reviews
ost-pools@zfs:test_22seen in 2 other reviews
ost-pools@zfs:test_24seen in 3 other reviews
ost-pools@zfs:test_27seen in 2 other reviews
replay-single@ldiskfs+DNE:test_20bNEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews
sanity-flr@zfs:test_200cseen in 2 other reviews
sanity-flr@zfs:test_203seen in 2 other reviews
sanity-flr@zfs:test_204dseen in 2 other reviews
sanity-flr@zfs:test_204eseen in 2 other reviews
build #113465 SUCCESS · tests all Maloo sessions
no vote yet: Neil Brown
patchsets: PS1 01-06 PS2 05-16
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS2 uploaded 537d ago · NEW · backport · open in Gerrit ↗
commit message
LU-16637 llite: call truncate_inode_pages() in inode lock

In some cases vvp_prune()->truncate_inode_pages() is get called
without IO context, we need protect it with inode lock as well.

So we add ll_inode_info::lli_inode_lock_owner and set it according to
vfs lock rules (Documentation/filesystems/Locking or
Documentation/filesystems/locking.rst), so before calling
truncate_inode_pages(), we'd lock the inode if it's not locked in
vfs.

Lustre-change: https://review.whamcloud.com/50857
Lustre-commit: 51d62f2122fee14fbb3ff8333b5a830e1181e4e5

Fixes: ef9be34478 ("LU-16637 llite: call truncate_inode_pages() under inode lock")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I84d7d999a49325810062a9a7337e184d35467820
Reviewed-by: Neil Brown <neilb@suse.de>
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
57654 b2_15 J !B ✓T ✓R 0/1
LU-16958 llite: migrate vs regular ops deadlock
reviewing Etienne AUJAMES · CI green — no vote yet from Andreas Dilger, Alex Zhuravlev
stalled 537d M +47 −11
537d
janitor run: 1 failing config(s), none unique to this patch — janitor results
build #113464 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger, Alex Zhuravlev
patchsets: PS1 01-06 PS2 05-16
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS2 uploaded 537d ago · NEW · backport · open in Gerrit ↗
commit message
LU-16958 llite: migrate vs regular ops deadlock

When it need to lock inode in lov_conf_set(), it could have hold
inode's lli_layout_mutex, we need unlock the layout mutex before
taking its inode lock to keep the lock order.

Lustre-change: https://review.whamcloud.com/c/51641
Lustre-commit: 8f2c1592c3bbd0351ab3984a88a3eed7075690c8

Fixes: 51d62f2122f ("LU-16637 llite: call truncate_inode_pages() in inode lock")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I7ee58039a6d31daefc625ac571a52baf112f8151
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
57652 b2_15 J ✗1B ✓T ✓R 0/1
LU-16637 llite: call truncate_inode_pages() under inode lock
reviewing Etienne AUJAMES · CI green — no vote yet from Andreas Dilger
stalled 537d S +18 −6
537d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
unique failing testhistory
sanity-quota@zfs:test_82NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews
build #113463 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets: PS1 01-06 PS2 05-16
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS2 uploaded 537d ago · NEW · backport · open in Gerrit ↗
commit message
LU-16637 llite: call truncate_inode_pages() under inode lock

truncate_inode_pages() is required to be called under (and serialised
by) inode lock.

Lustre-change: https://review.whamcloud.com/50284
Lustre-commit: ef9be34478036db0544753e33030fff7e32bfe44

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I0f1a09c8756522f87a2e5d8030d12f80e2f630b4
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
57793 b2_15 J ✗1B ✓T ✓R 0/1
LU-17048 mdd: protect layout change in MDD layer
reviewing Etienne AUJAMES · CI green — no vote yet from Andreas Dilger, Alex Zhuravlev
stalled 657d L +278 −96
657d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
unique failing testhistory
sanityn@ldiskfs+DNE:test_51cNEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews
build #110333 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger, Alex Zhuravlev
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS1 uploaded 658d ago · NEW · backport · open in Gerrit ↗
commit message
LU-17048 mdd: protect layout change in MDD layer

We need to detect changes to the LOD layout in between transaction
declaration and when the objects are locked during transaction
execution. Otherwise, if another thread has modified the layout
of an object used by the transaction then the declaration may
be incorrect.

This patch save objects' layout generation in transaction delaration
phase, and check whether they have been changed by others in the
transaction execution phase, if that's the case, the transaction will
be retried for several times.

Lustre-change: https://review.whamcloud.com/52146
Lustre-commit: d5ab62af24166529b84b4d7227b96d3a69989a95

Fixes: b7bd4e3422 ("LU-14621 mdd: fix lock-tx order in mdd_xattr_merge()")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I25fe03c6e8fc4eebccc039e62dfc88db1179cb26
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
49446 b2_12 J ✗1B ✓T ✓R 0/1
LU-14042 llite: don't check layout info for page discard
reviewing Etienne AUJAMES · CI green — no vote yet from Qian Yingjin, Andreas Dilger
stalled 1409d S +9 −2
1409d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
unique failing testhistory
sanity-hsm@ldiskfs+DNE:test_300NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews
build #91244 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Andreas Dilger
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS1 uploaded 1416d ago · NEW · backport · open in Gerrit ↗
commit message
LU-14042 llite: don't check layout info for page discard

The CIT_MISC+ignore_layout is indicating locks/pages manipulation
from the OSC layer, it does not care/access lov layout related info.

Lustre-change: https://review.whamcloud.com/40267
Lustre-commit: 5d1ffc65d5a97c7b3a5597267c5682498c87a5da

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ibdf22f0d47712d370385af4c6c984052b91fc7c6
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Yingjin Qian <qian@ddn.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
▶

Waiting on reviewers

(0)
nothing here right now
▶

Ready to land

(6)
69350 master J –B ✓T ✓R +2/2
LU-12669 ec: create lock placeholder for reconstructed pages
reviewing Andreas Dilger · all green — queued for landing (master-next)
218_review_prioritypt_ecropw_shepherd master-next 4 unresolved L +532 −68
11h
all green — queued for landing (master-next)
4 reviewer comment(s) to address if a respin is needed — last from Gerrit AI review for Lustre
build #134472 SUCCESS · tests all Maloo sessions
reviews: Keguang Xu +1 2026-10-29 00:03 · Zhenyu Xu +1 2026-10-29 00:41
no vote yet: Marc Vef, Patrick Farrell
patchsets:
+2 earlier PS1 10-01 PS2 10-01
PS3 10-13 PS4 10-13 PS5 10-14 PS6 10-14 PS7 10-26
your previous vote: +1 on PS6 (2026-10-22 11:39) — now at PS7
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS6 2026-10-17 13:31 Gerrit AI review for Lustre ldlm_request.c:583 — (minor) If the patch is refreshed: this says matchers must skip LDLM_FL_PLACEHOLDER unless they only test page coverage, but osc_lock_to_pla
Gerrit AI review for Lustre PS6 · 2026-10-17 13:31
(minor) If the patch is refreshed: this says matchers must skip LDLM_FL_PLACEHOLDER unless they only test page coverage, but osc_lock_to_placeholder() matches with skip_flags 0 and without LDLM_FL_TEST_LOCK, taking a reader reference so it can reuse an existing placeholder:

    mode = ldlm_lock_match_with_skip(ns, LDLM_FL_BLOCK_GRANTED, 0, ...
                                     LCK_PR, LDLM_MATCH_AST, &lockh);

The same "only matched by page coverage tests" wording appears in the osc_lock_to_placeholder() comment and in the commit message. Maybe mention placeholder reuse as the second allowed match, so a future caller doesn't treat the reuse match as a contract violation, or copy it as a precedent for a generic match?
reply PS2 2026-10-05 06:31 Gerrit AI review for Lustre vvp_io.c:494 — (minor) If the patch is refreshed: this comment says the LOV layer uses a placeholder for these mmap-buffer locks, but vvp_mode_from_vma() r
Gerrit AI review for Lustre PS2 · 2026-10-05 06:31
(minor) If the patch is refreshed: this comment says the LOV layer uses a placeholder for these mmap-buffer locks, but vvp_mode_from_vma() returns CLM_WRITE for a shared writable mapping, and osc_lock_to_placeholder() refuses anything but LCK_PR. For such a buffer the stripe is only tolerated, and the reconstructed pages are dropped after the read through ec_unprotected_recovery. Maybe say "a placeholder for a read-mode lock"?
reply PS7 2026-10-28 23:59 Andreas Dilger vvp_io.c:1583 — Right, the kept pages never leave cl_lru_busy. This is fixed by https://review.whamcloud.com/69908 ("LU-12669 ec: fix degraded read page le
Gerrit AI review for Lustre PS7 · 2026-10-27 13:16
(defect) Do the pages kept here ever reach the OSC LRU list?

A reconstructed page is created by cl_page_find(CPT_CACHEABLE) in lov_ec_read_stripe_pages(), so osc_page_init()->osc_lru_alloc() reserves a cache slot for it (ops_in_lru = 1, cl_lru_busy++). A page only moves from "busy" onto cl_lru_list in osc_extent_finish()->osc_lru_add_batch(), after a BRW. A rebuilt page never goes through a BRW, so it stays counted in cl_lru_busy and takes a ccc_lru_left slot. osc_lru_shrink() only scans cl_lru_list, so it cannot reclaim the page.

Before this change, cl_page_delete() here always returned the slot through osc_page_delete()->osc_lru_del(). Now the slot is held until the placeholder (or the granted lock) is cancelled, or until kernel memory reclaim calls ll_release_folio().

A large degraded read can pin max_cached_mb this way, e.g. one dead stripe of a 4+2 file several times larger than the cache. osc_lru_alloc() callers for any file on the mount then sleep in l_wait_event_abortable(osc_lru_waitq, cl_lru_left > 0), and readahead gets -EBUSY. This lasts until the placeholder ages out of the ldlm LRU.

Should the kept pages be added to the client LRU when they are marked Uptodate, like osc_lru_add_batch() does after a read?
Andreas Dilger PS7 · 2026-10-28 23:59
Right, the kept pages never leave cl_lru_busy.  This is fixed by https://review.whamcloud.com/69908 ("LU-12669 ec: fix degraded read page leak and short read"), which adds the kept pages to the client LRU with cl_page_lru_add().  That fix will be merged into this patch the next time it is refreshed.
reply PS2 2026-10-05 06:31 Gerrit AI review for Lustre osc_lock.c:1268 — (suggestion) This isn't a bug, but exporting ldlm_lock_create() and ldlm_lock_enqueue() means osc now builds an ldlm_lock by hand: it sets l
Gerrit AI review for Lustre PS2 · 2026-10-05 06:31
(suggestion) This isn't a bug, but exporting ldlm_lock_create() and ldlm_lock_enqueue() means osc now builds an ldlm_lock by hand: it sets l_conn_export, l_flags, l_policy_data and l_req_extent, and takes the addref before the grant. ldlm_cli_enqueue_local() does the same steps but asserts on a client namespace. Would a small exported client-side helper in ldlm (or a relaxed ldlm_cli_enqueue_local()) keep these lock-construction details inside ldlm, instead of making the two internals public API?
tags: 218_review_priority pt_ecro pw_shepherd
owner Andreas Dilger · uploader Andreas Dilger · PS7 uploaded 9d ago · NEW · open in Gerrit ↗
commit message
LU-12669 ec: create lock placeholder for reconstructed pages

Pages that CIT_EC_RD reconstructs from parity for a stripe on an
unavailable OST are not covered by a DLM lock, so they are dropped
after each read, and every later read rebuilds them from parity
again.

Grant a client-only LDLM_FL_PLACEHOLDER ldlm_lock over the whole
stripe object locally, without an RPC, and keep the reconstructed
pages Uptodate under it.  A stripe gets a placeholder when its target
is inactive, or when its sub-lock enqueue fails.  If the conversion
fails, drop the pages after the read as before.  Add
cl_lock_operations::clo_to_placeholder() and
ldlm_cli_enqueue_placeholder() for this.

The pages stay valid while the parity they were rebuilt from is not
STALE.  Any write or truncate of the file must stale the parity with
a layout write intent first, which revokes the layout lock on every
client.  When a client loses the layout lock, cancel the placeholder
locks of the file with LCF_PLACEHOLDER, which discards their pages
under the page lock as a server lock cancel does, and cancel one that
a read creates meanwhile once that read is done.  Fast reads from
the page cache already wait for the next IO to refresh the layout,
so make the mmap fast fault do the same.  So the placeholder needs no
server state: it is neither replayed nor dropped before a lock
replay, is only matched by page coverage tests, does not hold up the
KMS, and otherwise leaves the cache through the LRU like any unused
lock.  Only PR locks are converted, since a PW placeholder could
satisfy a later write without a server lock.

Also cancel initialized sub-locks on the lov_lock_sub_init() error
path, and in lov_lock_cancel() when the sub-lock env is not found, so
a placeholder reference is not leaked, and free the lov_lock with the
size it was allocated with.  Drop lov_lock_sub::sub_initialized, as
every sub-lock is now initialized.

Add sanity-ec test_49f to check that a second degraded read sends no
read RPCs, that the placeholder survives OST recovery, and that the
cached pages do not hide a later write from another client from
either read() or an existing mmap.

Test-Parameters: testlist=sanity-ec
Test-Parameters: testlist=sanity-ec fstype=zfs
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: Augment Agent:DeepSeek V4.1 Flash
Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools
Change-Id: Idbad18031562d5cef02ab16aadcd4818ec3ebbe5
55936 b2_15 J ✓B ✓T ✓R +2/1
LU-17482 llite: short read could mess up next read offset
reviewing Etienne AUJAMES · all green — ready to land (not in b2_15-next yet)
LTS15 S +35 −4
78d
1 optional test failure(s) — informational
build #106610 SUCCESS · tests all Maloo sessions
reviews: Stephane Thiell +1 2025-12-11 18:51 · Andreas Dilger +1 2026-08-18 22:58
no vote yet: Qian Yingjin, Patrick Farrell
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS1 uploaded 820d ago · NEW · backport · open in Gerrit ↗
commit message
LU-17482 llite: short read could mess up next read offset

When read reaches EOF, it could read data from stale pagecache, but
we need to restore the iocb->ki_pos so that next read could continue
from the correct offset.

Lustre-change: https://review.whamcloud.com/53827
Lustre-commit: 35fb413683affe9d41f3521259c260de6caf81d9

Fixes: 4468f6c9d9 ("LU-16025 llite: adjust read count as file got truncated")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ib8b62c41bf65f8efec82dda53fcfbdb68ad08b38
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Qian Yingjin <qian@ddn.com>
Reviewed-by: Patrick Farrell <patrick.farrell@oracle.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
60382 b2_15 J ✗2B ✓T ✓R +1/1
LU-10026 csdc: DoM pattern could be a combined value
reviewing Andreas Dilger · all green — ready to land (not in b2_15-next yet)
LTS15 stalled 296d M +48 −38
296d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
unique failing testhistory
sanity-flr@zfs:test_204cseen in 3 other reviews
sanity-pfl@ldiskfs+DNE:test_22cseen in 1 other review
build #120346 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger +1 2025-12-05 09:20 · Zhenyu Xu +1 2025-12-05 09:20
patchsets: PS2 07-26 PS3 07-26 PS4 11-04 PS5 12-05
your previous vote: +1 on PS3 (2025-08-28 17:00) — now at PS5
owner Andreas Dilger · uploader Andreas Dilger · PS5 uploaded 335d ago · NEW · backport · open in Gerrit ↗
commit message
LU-10026 csdc: DoM pattern could be a combined value

DoM pattern is LOV_PATTERN_MDT for now, and in the future it could
be combined with LOV_PATTERN_COMPRESS to represent a compressed
DoM component.

Fix a minor glitch for lov_getstripe_old code path (in
ll_lov_getstripe_ea_info), which intends to return the last component
stripe info but the commit abf04e7ea3 omits to correctly set the
last component stripe info before using it.

Lustre-change: https://review.whamcloud.com/51978
Lustre-commit: bb0cc84fbed51e006bfac230dada426bfac4f500

Fixes: abf04e7ea3 ("LU-14337 lov: return valid stripe_count/size for PFL files")
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Id0779c30c004b6979f88bf96b7b7b74a8b8c26e4
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
60266 b2_15 J !B ✓T ✓R +3/1
LU-16837 llite: handle unknown layout component
reviewing Andreas Dilger · all green — ready to land (not in b2_15-next yet)
LTS15 stalled 321d M +171 −22
321d
janitor run: 1 failing config(s), none unique to this patch — janitor results
build #119906 SUCCESS · tests all Maloo sessions
reviews: James Simmons +1 2025-12-18 21:53 · Zhenyu Xu +1 2025-12-18 21:53 · Vitaliy Kuznetsov +1 2025-12-18 21:53
patchsets: PS1 07-21 PS2 08-28 PS3 11-04 PS4 12-18
your previous vote: +1 on PS1 (2025-07-22 03:00) — now at PS4
owner Andreas Dilger · uploader Andreas Dilger · PS4 uploaded 321d ago · NEW · backport · open in Gerrit ↗
commit message
LU-16837 llite: handle unknown layout component

If lustre client encounters unknown layout component pattern in
a mirror file, this patch makes client mark this mirror as invalid
and skip it.

Lustre-change: https://review.whamcloud.com/51060
Lustre-commit: 14ed4a6f8f231fe94392906f991a32f07e7d7883

LU-16837 lov: NULL dereference in lov_delete_composite

commit 14ed4a6f8f retroduced the issue fixed by commit
5da049d9ef ("LU-14389 lov: avoid NULL dereference in cleanup), this
patch makes the fix cover the new case added by 14ed4a6f8f.

Lustre-change: https://review.whamcloud.com/52826
Lustre-commit: 250c6195fbe748d7c8f4c55888ed749de4cb95ce
Was-Change-Id: I4a2b72e21139b60519ed523b4851723c91f523c1

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ie5f44212ab96bdc706cc5a9e11f330234fc01069
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Vitaliy Kuznetsov <vkuznetsov@ddn.com>
60568 b2_15 J ✗4B ✓T ✓R +3/1
LU-15683 ofd: proper initialize filter_fid in ofd fallocate
cc Dominique Martinet · all green — ready to land (not in b2_15-next yet)
stalled 328d 2 unresolved S +23 −0
328d
all green — ready to land (not in b2_15-next yet)
2 reviewer comment(s) to address if a respin is needed — last from Dominique Martinet
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
unique failing testhistory
recovery-small@ldiskfs+DNE:test_18cseen in 1 other review
sanity1@ldiskfs+DNE:test_27ceNEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews
sanity2@zfs:test_63aseen in 5 other reviews
sanityn@ldiskfs+DNE:test_18NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 0 reviews
1 optional test failure(s) — informational
build #117878 SUCCESS · tests all Maloo sessions
reviews: Stephane Thiell +1 2025-12-11 18:52 · Arshad Hussain +1 2025-10-24 13:02 · Andreas Dilger +1 2025-10-24 13:02
no vote yet: Oleg Drokin
patchsets: PS1 08-06 PS2 08-06 PS3 08-07 PS4 10-24 Etienne AUJAMES
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS3 2025-08-09 01:22 Dominique Martinet COMMIT_MSG:12 — Hm, from what I'm seeing in other b2_15 commits actually it looks like such commits have been squashed together, keeping each commits messag
Andreas Dilger PS3 · 2025-08-08 06:17
(minor) this should also have a Fixes: line to reflect which patch introduced the issue.
Dominique Martinet PS3 · 2025-08-08 13:23
I've actually just backported this as a dependency of https://review.whamcloud.com/c/fs/lustre-release/+/60569/4 for https://jira.whamcloud.com/browse/LU-19203

For linux-stable this would get a `Stable-dep-of:` tag, but I see no such tag in lustre so I'm not quite sure how to express this.

I'll find some time to check the test failures that are all over the place on these commits, but the few I looked at seem to be pretty much unrelated so it'll take a bit of time to make sure..
Dominique Martinet PS3 · 2025-08-09 01:22
Hm, from what I'm seeing in other b2_15 commits actually it looks like such commits have been squashed together, keeping each commits message body + Lustre-change/Lust-commit (and eventually renaming Change-Id to Was-Change-Id)

But to be honest I picked this commit because it was a conflict but it's a completely independant fix, so I'm not really sure squashing is appropriate...
Well, just let me know -- Stanford is already running quite a few non-merged patches so I don't have any strong opinion on trying to merge this, but if it doesn't take so much time I think we'd all rather run the same thing to avoid novel bugs due to non-standard setup so I'll be happy to do minor cleanups.

(FWIW here's the list of patches they have:
```
LU-17482 llite: short read could mess up next read offset
LU-16500 utils: 'lfs migrate' should select new OSTs
LU-16500 utils: set default ost index for lfs migrate
LU-16339 quota: notify OSTs until lge_qunit_nu is set
LU-7668 utils: add lctl del_ost
LU-16345 ofd: ofd_commitrw_read() with non-existing object
LU-15117 ofd: no lock for dt_bufs_get() in read path
LU-15117 ofd: don't take lock for dt_bufs_get()
LU-16044 osd: discard pagecache in truncate's declaration
LU-15880 quota: fix insane grant quota
LU-15694 quota: keep grace time while setting default limits
LU-15880 quota: fix issues in reserving quota
LU-16771 llite: add statfs_project tunable
```
)
reply PS3 2025-08-08 13:23 Dominique Martinet COMMIT_MSG:19 — I wish git had a more sensible way of saying "this is the original commit message" but given what we have I guess this makes as much sense a
Andreas Dilger PS3 · 2025-08-08 06:17
(minor) typically, the Tested-by: lines are also removed, along with Oleg's Reviewed-by: line, so that he is not CC'd on every patch that is backported.
Dominique Martinet PS3 · 2025-08-08 13:23
I wish git had a more sensible way of saying "this is the original commit message" but given what we have I guess this makes as much sense as not touching the original tags, I'll fix this next rebase
owner Dominique Martinet · uploader Etienne AUJAMES · PS4 uploaded 376d ago · NEW · backport · open in Gerrit ↗
commit message
LU-15683 ofd: proper initialize filter_fid in ofd fallocate

Intialize filter_fid buffer and call xattr set XATTR_NAME_FID properly
in ofd_object_fallocate().

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ied573c39dde77f935622e9fbedb2d71eb3bd8f5d
Reviewed-on: https://review.whamcloud.com/46919
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Arshad Hussain <arshad.hussain@aeoncomputing.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Lustre-change: https://review.whamcloud.com/46919
Lustre-commit: 755fdc6678836652302cea51f838e4894f2a7efc
Signed-off-by: Dominique Martinet <asmadeus@codewreck.org>
59271 b2_15 J !B ✓T ✓R +1/1
LU-16612 llite: protect cp_state with vmpage lock
cc Etienne AUJAMES · all green — ready to land (not in b2_15-next yet)
LTS15 stalled 378d XS +5 −1
378d
janitor run: 3 failing config(s), none unique to this patch — janitor results
1 optional test failure(s) — informational
build #117697 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger +1 2025-10-22 08:07
no vote yet: Patrick Farrell
patchsets: PS1 05-16 PS2 10-22
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS2 uploaded 379d ago · NEW · backport · open in Gerrit ↗
commit message
LU-16612 llite: protect cp_state with vmpage lock

cl_page_make_ready() calls cl_page_io_start() without vmpage lock
protection, and that could mess up cl_page's cp_state/cp_owner.

Lustre-change: https://review.whamcloud.com/50180
Lustre-commit: d03b038d0dd8360dc896ceb7f3cee99245551cb8

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Id0df7e14246aa561494a9b6e581cebc55241c4b9
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
▶

Parked (WIP / self-blocked)

(0)
nothing here right now
85 open
▶

Re-review needed — new patchset since your vote

(5)
69694 master J –B ✓T ✓R +1/2
LU-20958 llite: only update blocks after a flush
reviewing Andreas Dilger · PS4→PS5 since your +1
pt_ecro218_review_priority 1 unresolved M +116 −10
54m
build #135070 SUCCESS · tests all Maloo sessions
reviews: Keguang Xu +1 2026-11-04 07:12
patchsets: PS1 10-14 PS2 10-21 patrick bot PS3 10-29 PS4 10-29 PS5 11-01
your previous vote: +1 on PS4 (2026-10-29 07:11) — now at PS5
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS5 2026-11-01 20:12 Gerrit AI review for Lustre vvp_io.c:1412 — (minor) If the patch is refreshed: this says i_size is not shrunk, but ll_merge_attr_try() -> ll_merge_attr_nolock(..., true) still shrinks
Gerrit AI review for Lustre PS5 · 2026-11-01 20:12
(minor) If the patch is refreshed: this says i_size is not shrunk, but ll_merge_attr_try() -> ll_merge_attr_nolock(..., true) still shrinks i_size when cat_kms_partial is clear, i.e. once every stripe has had a lock granted (the truncate-on-another-client case described in the commit message). Maybe "so i_size is not shrunk while some stripe size is unknown", to match the ll_merge_attr_nolock() kernel-doc.
tags: pt_ecro 218_review_priority
owner Andreas Dilger · uploader Andreas Dilger · PS5 uploaded 4d ago · NEW · open in Gerrit ↗
commit message
LU-20958 llite: only update blocks after a flush

vvp_io_fsync_end() merges the stripe attributes into the inode after
every flush and OST sync, to update the blocks for LSOM.  Neither
takes a lock on the stripes, so the merged size and blocks are only
what this client last cached for each stripe.  That replaces a valid
i_size, e.g. a strict SOM size from the MDS, with a smaller one, down
to 0, for example in the local flush before lseek(SEEK_DATA).  An
lseek of an EC file with a stripe on an unavailable OST then finds no
data before this EOF.

Only update i_blocks there, which is what LSOM needed, and not while
i_size and i_blocks came from the MDS.

A write only locks the stripes it covers, and a stripe that this
client never held a lock on only has the size last cached for it, 0
if never seen, so the merge after a write, an O_SYNC write or a tiny
write could also shrink i_size, e.g. to 1MiB after a write at offset
0 of a 3MiB file with three 1MiB stripes whose size came from the
MDS.  Have lov_merge_lvb_kms() report such a stripe in the new
cl_attr::cat_kms_partial, and since a write never makes a file
shorter, let these merges only grow i_size then.  When the size of
every stripe is known, they may still shrink i_size, e.g. after a
truncate on another client.  If that truncate changed the layout, a
write merge can keep a stale larger i_size until a glimpse, which
only affects the lazy SOM size sent at close.

Add sanity-flr test_44j, which checks that an fsync does not
shrink the strict SOM size of a mirrored file.

Test-Parameters: testlist=sanity-flr
Fixes: dfb08bbf77a1 ("LU-16465 llite: fix LSOM blocks for ftruncate and close")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5-5 ltvm llm_code_and_review_tools
Change-Id: Id5561dd9af3aec5f966ae4db4bc055bb213ebbe5
64086 master J –B ✓T …R -1/2−
LU-20958 lov: handle unavailable EC stripes in lseek
reviewing Patrick Farrell · PS47→PS49 since your +1
ec2 pt_ecro218_review_priority 6 unresolved L +453 −12
8h
build #135433 SUCCESS · tests all Maloo sessions · test queue
reviews: Ronnie Sahlberg -1 2026-11-05 01:28
no vote yet: Keguang Xu, Marc Vef, Andreas Dilger
patchsets:
+44 earlier PS1 02-17 PS2 03-29 PS3 03-29 PS4 03-29 PS5 03-29 Ronnie Sahlberg PS6 03-30 Ronnie Sahlberg PS7 03-31 Ronnie Sahlberg PS8 03-31 PS9 03-31 Ronnie Sahlberg PS10 04-01 Ronnie Sahlberg PS11 04-01 Ronnie Sahlberg PS12 04-07 Ronnie Sahlberg PS13 04-08 PS14 04-09 PS15 04-09 PS16 04-09 PS17 04-09 PS18 04-09 PS19 04-09 PS20 04-09 PS21 04-09 PS22 04-10 PS23 04-10 PS24 04-10 PS25 04-10 PS26 04-10 PS27 04-14 PS28 04-14 PS29 04-14 PS30 04-15 PS31 04-15 PS32 04-15 PS33 04-25 PS34 05-20 Marc Vef PS35 06-04 Ronnie Sahlberg PS36 07-13 Marc Vef PS37 07-13 Marc Vef PS38 07-13 Marc Vef PS39 07-15 Marc Vef PS40 07-16 Marc Vef PS41 07-26 Marc Vef PS42 07-26 Marc Vef PS43 08-17 Marc Vef PS44 08-19 Maximilian Dilger
PS45 10-14 Andreas Dilger PS46 10-16 Andreas Dilger PS47 10-21 Andreas Dilger PS48 10-29 Andreas Dilger PS49 11-04 patrick bot
your previous vote: +1 on PS47 (2026-10-26 10:33) — now at PS49
threads: 6 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS47 2026-10-27 10:04 Marc Vef patchset comment — Highlighting a conflict with 69111. This patch (and the parent) needs to be refreshed due to 68361 since the code is no longer compatible. (
Marc Vef PS47 · 2026-10-27 10:04
Highlighting a conflict with 69111. This patch (and the parent) needs to be refreshed due to 68361 since the code is no longer compatible. (-1)

Does this patch need the current parent patches or can it be rebased and updatd for the RAID10 patch now?
reply PS48 2026-11-03 16:17 Marc Vef patchset comment — Conflicts with #69694: it sits on ps3 of #69694, and the current patch set (ps5) conflicts with it in lustre/lov/lov_io.c, lustre/tests/sani
Marc Vef PS48 · 2026-11-03 16:17
Conflicts with #69694: it sits on ps3 of #69694, and the current patch set (ps5) conflicts with it in lustre/lov/lov_io.c, lustre/tests/sanity-ec.sh. It needs a rebase onto #69694 before it can land.
reply PS48 2026-10-31 02:29 Gerrit AI review for Lustre file.c:5435 — (defect) The code here depends on lli_attr_valid losing OBD_MD_FLSIZE when the UPDATE lock is cancelled. That clearing is added by 69828 ("L
Gerrit AI review for Lustre PS48 · 2026-10-31 02:29
(defect) The code here depends on lli_attr_valid losing OBD_MD_FLSIZE when the UPDATE lock is cancelled. That clearing is added by 69828 ("LU-20958 llite: drop strict SOM size with the UPDATE lock"), but 69828 is not an ancestor of this patch set. The parent is 8bef60849e (an older patch set of 69694), which sits directly on 40b80bc048 on master. In this tree, lli_attr_valid is written only in ll_update_inode(), and nothing clears it in ll_md_blocking_ast().

Without 69828, this sequence goes wrong:

    client A: open/stat while the file is in sync -> OBD_MD_FLSIZE, i_size = S
    client B: writes the file up to T > S (MDS revokes LAYOUT|UPDATE, marks the SOM stale)
    an OST of a data stripe becomes unavailable
    client A: lseek(SEEK_DATA, S) -> ci_ec_unavail, but FLSIZE is still set
      -> no revalidate; vvp_io_lseek_start() skips ll_merge_attr()
      -> eof = S, so the result is -ENXIO although [S, T) has data

Because ll_merge_attr() is skipped, this also misses B's data on the stripes that are available. Should this patch be rebased onto 69828 so that the two cannot land in the wrong order?
reply PS47 2026-10-29 01:23 Andreas Dilger lov_io.c:3833 — Not yet in PS48: 68361 is still at PS17 and its stack does not apply to master. This will be done when 64086 is rebased onto the refreshed
Andreas Dilger PS47 · 2026-10-27 03:43
This needs to be updated for the LU-20690 parity layout in https://review.whamcloud.com/68361 ("LU-20690 ec: like-RAID10 parity layout"), which removes RAID0|PARITY: parity components become LOV_PATTERN_PARITY with the p parity objects of a raid set sharing one offset.  Once that lands, this check returns -EOPNOTSUPP for every EC file and the parity SEEK_DATA/SEEK_HOLE path is never used.  Please check for the parity flag/pattern instead and use the new mapping below.
Andreas Dilger PS47 · 2026-10-29 01:23
Not yet in PS48: 68361 is still at PS17 and its stack does not apply to master.  This will be done when 64086 is rebased onto the refreshed 68361.
reply PS47 2026-10-29 01:23 Andreas Dilger lov_io.c:3862 — Not yet in PS48, for the same reason. The slot helpers and absolute-offset row/set mapping will be used once 68361 is refreshed.
Andreas Dilger PS47 · 2026-10-27 03:43
The parity offset needs to change with 68361 in two ways:
1. RAID10 layout: one stripe_size per raid set per row, and the parity index selects the object rather than the offset, i.e. poff = e_start + (row * R + set) * ss + intra, pstripe = (stripe of that slot) + pi with R = esc_n0 + esc_n1, via the 69516/68361 slot helpers (lsme_parity_slots_per_raidset()) rather than lov_stripe_number() on the concatenated offset.
2. The row/set must come from the absolute data offset, not offset - e_start (see my lov_io.c comment on 68361 PS17): row = off / (c * ss), offset_i = (off / ss) % c, and poff relative to row0 = e_start / (c * ss).  Otherwise when e_start is not a multiple of the stripe width this looks at the parity of a different raid set than the one holding the data.
Ideally use the shared helper that 68361 adds for this mapping so the kernel recovery, llapi resync, hedge (64919) and lseek all agree.  Rebase onto that series once it is updated.
Andreas Dilger PS47 · 2026-10-29 01:23
Not yet in PS48, for the same reason.  The slot helpers and absolute-offset row/set mapping will be used once 68361 is refreshed.
reply PS48 2026-10-31 02:29 Gerrit AI review for Lustre lov_io.c:3865 — (minor) lov_parity_mirror_index_from_data() looks up the parity link from the data component at lio->lis_pos, which is the lseek start, not
Gerrit AI review for Lustre PS48 · 2026-10-31 02:29
(minor) lov_parity_mirror_index_from_data() looks up the parity link from the data component at lio->lis_pos, which is the lseek start, not from dsub's component dindex. If the seek starts in an earlier component of the mirror that has no parity link (e.g. a non-EC first PFL component), pmirror is < 0, and the stripe is reported as all data even though in-sync parity exists. The result is still correct, only less precise. If this is changed to use lsm_entries[dindex]->lsme_mirror_link_id, note that the LASSERTF in lov_io_sub_init() does the same lis_pos lookup, so it would need to stay in step for lov_sub_get() on the parity stripe.
tags: pt_ecro 218_review_priority
owner Patrick Farrell · uploader patrick bot · PS49 uploaded 13h ago · NEW · open in Gerrit ↗
commit message
LU-20958 lov: handle unavailable EC stripes in lseek

SEEK_DATA/SEEK_HOLE on an EC file with a data stripe on an OST that
was deactivated would fail with -ESHUTDOWN, and with an OST that was
down, e.g. during an OSS failover, the lseek would wait for the OST to
return, although reads of the file are rebuilt from parity at once.

Do the lseek with no-delay lock enqueues, as reads do.  When the
sub-lock enqueue of a stripe in an EC data component fails, mark it in
this IO's lov_io_sub::sub_ec_err and do not start its sub-IO.  Retry
with blocking enqueues once every mirror has been tried.  The
unavailable stripe leaves its size out of the merged stripe
attributes, so take EOF from the strict SOM size from the MDS instead,
fetched again as stat() does if the UPDATE lock was dropped.  Without
one, wait for the OST, or return -EIO if it stays unavailable, rather
than miss data past a smaller EOF.  A stripe whose extent lock is
still cached is locked locally, so its OST_SEEK still waits for the
OST.

Resync writes parity only where a data stripe of its raid set has
data, page aligned, and punches the rest, so a hole in an in-sync
parity stripe is a hole in every data stripe of the raid set.  Seek an
available parity stripe of the unavailable stripe's raid set from the
matching offset, and map the result back, for the RAID0|PARITY parity
layout.  Each row of a raid set holds one stripe_size chunk in every
data and parity object, so offsets in the two objects advance
together.  The result can report data where only another stripe of the
raid set has data, but never a hole where the stripe may have data.
With no parity stripe that can answer, report the stripe as data from
where the IO starts in it, with no hole before its end, which is
always correct: a seek must not skip data, but may report a hole as
data.  Since such a stripe has no hole at its end, report the hole at
EOF for SEEK_HOLE if nothing before it is found, and -ENXIO for
SEEK_DATA at EOF.

The parity object is not covered by the lseek lock, so seek it with a
server lock, and do not trust the LVB size of an unlocked object in
osc_io_lseek_start().  Seek parity without delay, failing at once if
its OST is disconnected; an idle import still reconnects for the seek.

Add sanity-ec test_79a, which stops the OST of a stripe, and
test_79b, which checks holes found from parity, and that the stripe
is reported as data when the parity OSTs are stopped too.

Test-Parameters: testlist=sanity-ec ostcount=8
Fixes: 783c13bb0b8f ("LU-12669 ec: recover data from parity")
Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com>
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5-5 ltvm llm_code_and_review_tools
Change-Id: I5cce4e0ea51c68b0c6fda1d83b694af19cad57bd
47805 master J ✗1B ✓T ✓R -1/2−
LU-12397 osp: remove opd_new_connection
reviewing Yang Sheng · PS7→PS16 since your +1
needs rebase S +13 −28
4d
PS7→PS16 since your +1
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
unique failing testhistory
sanity-quota@ldiskfs+DNE:test_48seen in 6 other reviews
4 optional test failure(s) — informational
build #122116 SUCCESS · tests all Maloo sessions
no vote yet: Sergey Cheremencev, Andreas Dilger, Alex Zhuravlev
patchsets:
+11 earlier PS1 06-28 PS2 07-14 PS3 07-18 PS4 07-22 PS5 07-22 PS6 07-23 PS7 07-23 PS8 03-29 Andreas Dilger PS9 04-24 PS10 05-31 PS11 07-25
PS12 08-07 PS13 10-09 PS14 08-21 PS15 08-21 PS16 03-05
your previous vote: +1 on PS7 (2023-03-13 07:02) — now at PS16
owner Yang Sheng · uploader Yang Sheng · PS16 uploaded 245d ago · NEW · open in Gerrit ↗
commit message
LU-12397 osp: remove opd_new_connection

Since we update opd_new_connection regardless the
opd_got_disconnected, so it is pointless to use it
rather than opd_imp_connected.

Signed-off-by: Yang Sheng <ys@whamcloud.com>
Change-Id: I02f9c1c434e0e16156f65b1a7865b3e164832145
67996 master J –B ✓T ✓R 0/2
LU-20590 llite: pin the layout lock for a starving IO
reviewing Chris Horn · PS6→PS9 since your +1
CI@PS8 L +303 −9
14d
build #133851 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin
patchsets:
+4 earlier PS1 08-14 PS2 08-14 PS3 08-16 PS4 08-30
PS5 09-01 PS6 10-02 PS7 10-13 PS8 10-16 PS9 10-21
your previous vote: +1 on PS6 (2026-10-06 16:52) — now at PS9
build/test results are from PS8 — PS9…PS9 changed only the commit message (votes copied, CI not re-run)
owner Chris Horn · uploader Chris Horn · PS9 uploaded 14d ago · NEW · open in Gerrit ↗
commit message
LU-20590 llite: pin the layout lock for a starving IO

can_populate_pages() asks ll_file_io_generic() to restart the IO when
the cached layout generation of the inode is the invalid sentinel.
Local reclaim of the MDC ibits lock which carries the layout produces
that sentinel. With the lock cache under pressure, a reader or a
writer then goes round the restart loop. The loop can run until the
budget is gone, and move no data at all.

Count consecutive restarts which moved no bytes and found no cached
generation. After LL_LAYOUT_PIN_RESTARTS of them, ll_layout_pin()
pins the layout lock. The pin holds the lock out of voluntary LRU
reclaim for the rest of the syscall. The function ll_layout_unpin()
drops the pin on the way out. The pin takes no mode reference. The
server can still revoke the layout at once, and the existing
generation checks stay in force.

The counter is a heuristic. A server revoke and a local reclaim both
reach vvp_conf_set() through ll_layout_conf(OBJECT_CONF_INVALIDATE).
The sentinel therefore does not name the cause. A mirror failover
retry which moves nothing can advance the counter too. The cost of a
wrong guess is one spare pin, which the syscall drops on the way out.
A try which moves bytes, or which reads a valid generation, resets the
counter. The threshold only has to clear the one-shot paths.

A try at the pin can fail. A pin which succeeds spends one of
LL_LAYOUT_PIN_TRIES. A failure which says that no pin can help also
spends one. One syscall makes at most four such tries. Thus a server
which revokes four pins in one syscall ends the pins for that syscall.
Four revokes show that the server, not reclaim, causes the restarts.
More pins would then only add RPCs.

A failure with -ENOENT or -ESTALE says only that the reclaim won the
race. That race is the condition the pin exists for, so it
spends no try. The count of restarts still bounds the retries. Every
restart already sends its own layout intent RPC from vvp_io_init(), so
a try adds at most one RPC. A failed try never aborts the IO.

While a thread starves on a file, cancel_lru_locks and an
lru_size=clear no longer drop that file's layout lock.

Add a fault injection, OBD_FAIL_LLITE_LAYOUT_LRU_DROP (0x143a). The
helper vvp_layout_lru_drop() drops the unused locks of the MDC
namespace inside the window the IO uses. The injection goes through
the LRU cancel path, not a direct invalidation of the object. The
condition under test is therefore the real one. The injection fires
only after the layout refresh succeeds. The injection also gates on
the IO type, because vvp_io_init() serves every llite cl_io. The
reclaim is best effort, so the injection can bite fewer times than the
test needs.

Add the llite stats counters layout_restart and layout_pin. The first
counts the restarts which moved no data and found no cached
generation. The second counts the pins. A layout_restart count which
grows on a production client shows starvation of the lock cache.

Add sanity test_251d. The test writes and then reads 1 MiB under the
injection. It checks that each IO completes, that the data is correct,
and that the client took a pin. The test reads the counters, not the
debug log, so a change to a debug message cannot break it. The test
skips when the injection bit too few times in both IOs. A test which
did not run must not report a pass.

ldlm_cancel_lru() moves to a public header for the injection site. The
llite module is separate, so the patch exports the symbol. The move
also corrects the description of ldlm_cancel_lru(). The old text named
LCF_ASYNC for both cases. The return section named a parameter which
the function does not have. The section also gave one meaning to a
return of 0 where the function has two.

Fixes: 4af3ab1945fd ("LU-2017 mdc: add layout swap between 2 objects")
Test-Parameters: testlist=sanity env=ONLY=251,ONLY_REPEAT=3
Assisted-by: Claude:claude-opus-5
Signed-off-by: Chris Horn <chorn@ddn.com>
Change-Id: I94a96d0c1216acce674a47ade170c6de0b1474c3
48102 master J ✗2B ✓T ✗2R -1/2−
LU-16064 ldlm: postpone lock cancellation
reviewing Alex Zhuravlev · PS15→PS72 since your +1
2 unique failures stalled 100d 14 unresolved M +109 −8
100d
PS15→PS72 since your +1
blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
sanity-slow@ldiskfs+DNE:test_255cseen in 2 other reviews
sanityn@ldiskfs+DNE:test_121seen in 5 other reviews
failed enforced testplatformdetail
review-dne-zfs-part-1 RHEL 9.7 / x86_64 ran 3 tests. 1 tests failed: sanity. session
review-dne-zfs-part-2 RHEL 10.1 / x86_64 ran 11 tests. 1 tests failed: sanity-lfsck. session
build #127492 SUCCESS · tests all Maloo sessions
reviews: Vitaly Fertman -1 2026-07-13 08:57
no vote yet: Qian Yingjin, Alexey Lyashkov, Andreas Dilger, Mikhail Pershin
patchsets:
+67 earlier PS1 08-01 PS2 08-01 PS3 08-02 PS4 08-02 PS5 08-02 PS6 08-02 PS7 08-03 PS8 08-18 PS9 08-18 PS10 08-22 PS11 08-23 PS12 08-30 PS13 09-05 PS14 09-05 PS15 09-23 Colin Faber PS16 11-28 PS17 01-17 Andreas Dilger PS18 03-04 PS19 04-24 PS20 05-09 PS21 05-11 PS22 06-01 PS23 06-12 PS24 06-15 PS25 06-28 PS26 06-30 PS27 08-01 PS28 08-20 PS29 08-22 PS30 09-23 PS31 09-24 PS32 10-06 PS33 10-16 PS34 10-25 PS35 11-03 PS36 11-09 PS37 11-19 PS38 11-30 PS39 01-06 PS40 04-30 PS41 05-11 PS42 06-10 PS43 06-19 PS44 06-21 PS45 07-09 PS46 07-27 PS47 02-06 PS48 02-14 PS49 02-19 PS50 03-27 PS51 04-10 PS52 04-18 PS53 05-18 PS54 06-05 PS55 06-16 PS56 06-18 PS57 06-30 PS58 07-09 PS59 07-15 PS60 11-04 PS61 11-26 PS62 12-12 PS63 12-24 PS64 01-06 PS65 01-09 PS66 01-28 PS67 02-18
PS68 02-22 PS69 03-18 PS70 04-15 PS71 06-23 PS72 07-13
your previous vote: +1 on PS15 (2022-10-09 04:02) — now at PS72
threads: 14 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS72 2026-07-28 05:23 Gerrit AI review for Lustre COMMIT_MSG:11 — The body explains the postponement, but three parts of the diff are not accounted for.
Gerrit AI review for Lustre PS72 · 2026-07-28 05:23
The body explains the postponement, but three parts of the diff are not accounted for.

The biggest one is the MDT exclusion in obd_stale_export_get(): the fix is deliberately disabled for MDT exports, so DoM writes from an evicted client are still exposed. That limitation belongs in the message rather than only in an XXX comment.

The new OBD_FAIL_OST_PAUSE_COMMITRW fault point in ofd_commitrw_write() and the two new replay-dual subtests are also unmentioned.
reply PS61 2025-12-01 18:52 Alex Zhuravlev patchset comment — we can't grab a lock on both server and client. marking makes no sense as few RPCs can be covered by a single lock.
Vitaly Fertman PS61 · 2025-12-01 18:37
> > we can do what is enough to resolve the problem. to grab. or to mark individual locks as not to be cancelled on eviction - so that you know which ones to leave on the export in ldlm_bl_thread_exports.

> this is what the patch does - do not cancel on eviction and wait for all the export's RPC to complete.

no, the patch postpones all the locks on the export from being cancelled, what I suggested above is to grab/mark only involved locks in ptlrpc_server_request_add for the on-going IO. others can be cancelled immediately.

> > > once IO (in ofd) started we don't check locks until the operation is done.

> > we prolong locks twice in advance in ptlrpc_server_request_add() and at the end in ptlrpc_server_finish_request()

> we do, but eviction can happen during bulk, for example which may take dozen on seconds and during this time the corresponding thread just sleeps being unable to check/prolong locks.

bulk starts after ptlrpc_server_request_add() which prolongs locks where I suggested to grab to corresponding locks, thus at the time of the eviction it will be clear which one are not to be cancelled. 1 operation under 1 lock should not block for dozen of seconds other 1000 locks on the same export which can be cancelled immediately.

btw, there is another thread which is able to prolong if there is an IO under an expired lock - see expired_lock_main->ldlm_lock_busy. this loop could be optimised here as well.
Alex Zhuravlev PS61 · 2025-12-01 18:52
we can't grab a lock on both server and client. marking makes no sense as few RPCs can be covered by a single lock.
reply PS72 2026-07-28 05:23 Gerrit AI review for Lustre obd_class.h:364 — (style) `exp` is used bare here while every other reference in this macro is parenthesised as `(exp)`. Worth matching the rest of the macro
Gerrit AI review for Lustre PS72 · 2026-07-28 05:23
(style) `exp` is used bare here while every other reference in this macro is parenthesised as `(exp)`. Worth matching the rest of the macro so a non-trivial argument expression can't bind wrongly.
reply PS72 2026-07-28 05:23 Gerrit AI review for Lustre obd_class.h:365 — ldlm_bl_thread_wakeup() is only declared in lustre/ldlm/ldlm_internal.h, which is a module-private header, and it has no EXPORT_SYMBOL. obd_
Gerrit AI review for Lustre PS72 · 2026-07-28 05:23
ldlm_bl_thread_wakeup() is only declared in lustre/ldlm/ldlm_internal.h, which is a module-private header, and it has no EXPORT_SYMBOL. obd_class.h is a public header included all over the tree.

It builds today only because the two users of class_export_rpc_dec() (ptlrpc/service.c via ptlrpc_internal.h, and ldlm/ldlm_lib.c) both happen to pull in ldlm_internal.h and both live in ptlrpc.ko. The first caller added from ofd/mdt/obdclass gets an implicit-declaration error, or an unresolved symbol at modpost.

Would it be better to declare the wakeup in a public header (or route this through a small obdclass helper) so the macro stands on its own?
reply PS29 2023-08-28 19:19 Patrick Farrell ldlm_lockd.c:2982 — Is this really just unique to the MDS?
Patrick Farrell PS29 · 2023-08-28 19:19
Is this really just unique to the MDS?

What about OSTs where we're running clients for hot pools?
reply PS29 2023-08-28 19:19 Patrick Farrell ldlm_lockd.c:2987 — Maybe I'm misunderstanding this, but isn't this making a very large change - We will now not do lock cancellation while there are any RPCs r
Patrick Farrell PS29 · 2023-08-28 19:19
Maybe I'm misunderstanding this, but isn't this making a very large change - We will now not do lock cancellation while there are any RPCs running?  But on a busy system there will be RPCs ~all the time, so this seems like it would be a very big behavior change with possible performance impacts?
reply PS39 2024-04-30 07:37 Alex Zhuravlev ldlm_lockd.c:3003 — I tend to agree, but we'd block anyway? and we have few threads to handle this?
Vitaly Fertman PS39 · 2024-01-15 13:43
this way the thread cannot take another job to handle. this check should be done right in ldlm_bl_get_work
Alex Zhuravlev PS39 · 2024-04-30 07:37
I tend to agree, but we'd block anyway? and we have few threads to handle this?
reply PS72 2026-07-28 05:23 Gerrit AI review for Lustre genops.c:1924 — (minor) The loop always breaks immediately after list_del_init(), so nothing is iterated past a removal and `tmp` is never used for its purp
Gerrit AI review for Lustre PS72 · 2026-07-28 05:23
(minor) The loop always breaks immediately after list_del_init(), so nothing is iterated past a removal and `tmp` is never used for its purpose. Plain list_for_each_entry() would say what this does more clearly.
reply PS72 2026-07-28 05:23 Gerrit AI review for Lustre genops.c:1925 — This carries forward an open question from patchset 29 that the current revision still doesn't answer, with some extra detail.
Gerrit AI review for Lustre PS72 · 2026-07-28 05:23
This carries forward an open question from patchset 29 that the current revision still doesn't answer, with some extra detail.

The comment says an MDS can deadlock because RPC handling may need to evict its own client. The same shape looks reachable on an OST: a service thread holds exp_rpc_count on E and blocks in tgt_extent_lock()/ldlm_cli_enqueue_local() on a lock that conflicts with one of E's own granted locks; E's locks are only dropped by ldlm_bl_thread_exports(), which now can't get E because exp_rpc_count > 0. What structurally prevents that cycle on OST that doesn't hold on MDT?

There is also no bound and no fallback wake here. If exp_rpc_count never returns to zero the export stays on obd_stale_exports forever, which keeps it on obd_unlinked_exports, and target cleanup then spins in obd_exports_barrier() printing "Is it stuck?" (and obd_zombie_impexp_stop() asserts the list is empty). Previously the export was always picked up.
reply PS72 2026-07-28 05:23 Gerrit AI review for Lustre genops.c:1930 — Matching on obd_name means the fix silently turns itself off for the OSTs of any filesystem whose name contains "MDT" - `mkfs.lustre --fsnam
Gerrit AI review for Lustre PS72 · 2026-07-28 05:23
Matching on obd_name means the fix silently turns itself off for the OSTs of any filesystem whose name contains "MDT" - `mkfs.lustre --fsname=testMDT` gives obd_name "testMDT-OST0000", and strstr() finds it.

The device type is what's actually being tested here, so comparing the type would be exact:

    strcmp(exp->exp_obd->obd_type->typ_name, LUSTRE_MDT_NAME) != 0

That is the idiom used elsewhere, e.g. tgt_handler.c:973. It also avoids running strstr() over every stale export on every scan while holding obd_stale_export_lock.
reply PS72 2026-07-28 05:23 Gerrit AI review for Lustre replay-dual.sh:1347 — (style) Test preconditions in this suite read as the positive condition that must hold:
Gerrit AI review for Lustre PS72 · 2026-07-28 05:23
(style) Test preconditions in this suite read as the positive condition that must hold:

    [[ "$ost1_FSTYPE" == ldiskfs ]] || skip "needs ldiskfs backend"

The negated `&&` form is what the tree is moving away from.
reply PS72 2026-07-28 05:23 Gerrit AI review for Lustre replay-dual.sh:1363 — (minor) The suggestion to use /dev/urandom instead of /dev/random was raised on patchsets 38 and 39 and marked resolved, but both dd calls h
Gerrit AI review for Lustre PS72 · 2026-07-28 05:23
(minor) The suggestion to use /dev/urandom instead of /dev/random was raised on patchsets 38 and 39 and marked resolved, but both dd calls here (and in test_34b) still read /dev/random.
owner Alex Zhuravlev · uploader Alex Zhuravlev · PS72 uploaded 115d ago · NEW · open in Gerrit ↗
commit message
LU-16064 ldlm: postpone lock cancellation

until all export's RPCs are complete, otherwise lock can be granted to
another client and then RPC processing from just evicted client can
break data consistency.

Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Change-Id: Id7944cb5583cbe5997e96ee413f7ec70d3faf287
▶

Awaiting your review — CI green

(33)
69392 master J –B ✓T ✓R -1/2−
LU-12669 ec: wait for stripes that parity cannot rebuild
reviewing Andreas Dilger · CI green — awaiting your review
218_review_prioritypt_ecro 2 unresolved L +289 −36
54m
failed enforced testplatformdetail
review-dne-zfs-part-1 RHEL 9.8 / x86_64 ran 3 tests. 1 tests failed: sanity. session
build #134706 SUCCESS · tests all Maloo sessions
reviews: Marc Vef -1 2026-11-05 08:36
no vote yet: Keguang Xu, Ronnie Sahlberg
patchsets: PS1 10-03 PS2 10-14 PS3 10-28
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS3 2026-11-03 16:10 Marc Vef patchset comment — Conflicts with master-next: Conflicts with #69350 LU-12669 ec: create lock placeholder for reconstructed pages, number 54 in the queue: lust
Marc Vef PS3 · 2026-11-03 16:10
Conflicts with master-next: Conflicts with #69350 LU-12669 ec: create lock placeholder for reconstructed pages, number 54 in the queue: lustre/include/cl_object.h
reply PS3 2026-11-05 08:36 Marc Vef patchset comment — needs rebase or address the conflict with the placeholder patch
Marc Vef PS3 · 2026-11-05 08:36
needs rebase or address the conflict with the placeholder patch
tags: 218_review_priority pt_ecro
owner Andreas Dilger · uploader Andreas Dilger · PS3 uploaded 7d ago · NEW · open in Gerrit ↗
commit message
LU-12669 ec: wait for stripes that parity cannot rebuild

A read of an EC file whose raid set has more data stripes on stopped
OSTs than parity can rebuild fails with -EAGAIN or -EIO, while the
same read of a file without parity waits for the OSTs to return,
e.g. after an OSS failover.  Adding parity to a file should not make
it less available than a plain striped file.

When CIT_EC_RD finds too many unavailable stripes or too little
parity, set the new cl_io::ci_ec_wait, which cl_io_loop() turns into
a restart, and record that raid set's range.  Restart the read up to
the start of that raid set as CIT_EC_RD, so earlier raid sets are
still rebuilt from parity, then read that raid set as a plain read
without the no-delay flag, which waits for the stripes' OSTs.  The
rest of the read goes back to the no-delay read, so later raid sets
are also rebuilt from parity.  A synchronous direct read whose aio
was freed for the CIT_EC_RD restart gets a new one.  A read of a
deactivated OST still fails at once.  Since waiting for the OSTs is
not an error, print a debug message instead of a console warning.

Change sanity-ec test_29a to check that such a buffered or direct
read waits for its OSTs and then returns the right data, and add
test_29b and test_29c for reads whose second or first raid set is
rebuilt from parity.

Test-Parameters: testlist=sanity-ec ostcount=8
Fixes: 783c13bb0b8f ("LU-12669 ec: recover data from parity")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5-5 ltvm llm_code_and_review_tools
Change-Id: I9956bab1b63744d0b52d03268b95c78ca73ebbe5
69517 master J –B ✓T ✓R +2/2
LU-20690 ec: implement STRIPE I/O scope
reviewing Keguang Xu · CI green — awaiting your review
raid10-like218_review_blockerpt_ecro218_review_prioritypw_shepherd 2 unresolved L +455 −99
1h
build #134549 SUCCESS · tests all Maloo sessions
reviews: Ronnie Sahlberg +1 2026-10-28 05:23 · Andreas Dilger +1 2026-11-02 17:52
no vote yet: Marc Vef
patchsets:
+4 earlier PS1 10-08 PS2 10-10 PS3 10-13 PS4 10-14
PS5 10-17 PS6 10-22 Marc Vef PS7 10-23 PS8 10-27 PS9 10-27
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS9 2026-10-28 23:34 Marc Vef patchset comment — I think there is a slight misunderstanding. The diagram puts each raidset's parity at the data offset of the raidset's first stripe. So, (0,
Ronnie Sahlberg PS9 · 2026-10-28 05:23
I attach an ASCII diagram of the layout, I this should go into ec.txt : 
===
 -c 8 -S ss  --ec 4x2

Stripe size is ss
8 stripes per Stripe Set
2 Raid Sets, each 4 data stripes.
2 Parities, each with 2	stripes


The SCOPE_STRIPE objects are conceptually sparse. Parity data is aligned
to the same offset as the first	data stripe in the raidset they	protect.

+-----------+----------+-----------------+-----------------+
|  OFFSET   |   DATA   |   PARITY P0     |   PARITY P1     |
|           | (1 obj   | ci_designated_  | ci_designated_  |
|           |  each)   |  stripe = 0     |  stripe = 1     |
+-----------+----------+-----------------+-----------------+
|   0       |  d0      |  phys stripe 0  |  phys stripe 1  |  \        \
|   ss      |  d1      |                 |                 |  | R 0    |
|  2*ss     |  d2      |                 |                 |  |        |
|  3*ss     |  d3      |                 |                 |  /        |
+-----------+----------+-----------------+-----------------+  	       | S 0
|  4*ss     |  d4      |  phys stripe 2  |  phys stripe 3  |  \	       |
|  5*ss     |  d5      |                 |                 |  | R 1    |
|  6*ss     |  d6      |                 |                 |  |        |
|  7*ss     |  d7      |                 |                 |  /        /
+-----------+----------+-----------------+-----------------+  	      	
|  8*ss     |  d0      |  phys stripe 0  |  phys stripe 1  |  \	       \
|  9*ss     |  d1      |                 |                 |  | R 0    |
| 10*ss     |  d2      |                 |                 |  |      	| S 1
| 11*ss     |  d3      |                 |                 |  /	       |
+-----------+----------+-----------------+-----------------+  	      ...
===

I like that you align the parity stripe offset into the SCOPE_STRIPE P* "mirror" to the same offset as the first data stripe of the raidset it protects. That makes it trivial to map between a raidset offset and where the corresponding parity data is laid out.

But it does however also mean that if an application wants to read all the parity data it would have to be aware of the ec geometry so that it could compute the stride between the individual parity stripes.
You can't just "open, SCOPE_STRIPE(P0) then read all the data from offset 0 to eof and you have all the parity data for P0.

Should it perhaps in the future also plug into faking SEEK_DATA/SEEK_HOLE for this so [0, ss[ would be DATA and [ss,4*ss[ would be HOLE ?
I think that would be very useful for applications that would like to use this API as it would somewhat reduce the need to be ec-geometry-aware when reading from SCOPE_STRIPE.   But that could be added much later.
Marc Vef PS9 · 2026-10-28 23:34
I think there is a slight misunderstanding. The diagram puts each raidset's parity at the data offset of the raidset's first stripe. So, (0, 4·ss, 8·ss) with holes.

But, the code packs them one stripe size apart (0, 1·ss, 2·ss). Keguang described this in more detail in LU-20690 ec: like-RAID10 parity layout | https://review.whamcloud.com/c/fs/lustre-release/+/68361 where he updated ec.txt. And Section 3 (of ec.txt) describes this. This matches what `lov_offset.c` does in 69516 (previous patch).

from ec.txt in 68361:
```
 parity-offset = stripeset * raidset-count * stripe-size
                 + raid-set * stripe-size
 parity-object = raid-set * number-of-parities
```


This means a reader with a fixed index gets all of that parity back to back without holes
reply PS9 2026-10-28 03:38 Gerrit AI review for Lustre lov_io.c:1319 — (style) Carried over from patchset 8, where it was Acknowledged: this isn't a bug, but this branch runs only for truncate. A truncate is nev
Gerrit AI review for Lustre PS9 · 2026-10-28 03:38
(style) Carried over from patchset 8, where it was Acknowledged: this isn't a bug, but this branch runs only for truncate. A truncate is never CIT_READ/CIT_WRITE, so lov_foreach_io_stripe() always visits every stripe here. If the patch is refreshed, the plain `for (stripe = 0; stripe < r0->lo_nr; stripe++)` loop would keep the churn, and conflicts with the EC read patches, smaller.
tags: raid10-like 218_review_blocker pt_ecro 218_review_priority pw_shepherd
owner Keguang Xu · uploader Keguang Xu · PS9 uploaded 8d ago · NEW · open in Gerrit ↗
commit message
LU-20690 ec: implement STRIPE I/O scope

In the RAID10-like EC parity layout the p stripes of a raidset share
one file offset but hold different data, so read and write must name
one of them. Implement LL_IO_SCOPE_STRIPE for that.

ll_io_scope_validate() accepts STRIPE with ios_mirror_id in
[1, MIRROR_ID_MAX] and ios_stripe_idx below
LOV_EC_MAX_CODING_STRIPES. ios_stripe_idx must be 0 for FILE and
MIRROR. It is not checked against p here: the scope outlives the
layout and the I/O type is not known yet. ll_io_scope_init() handles
STRIPE like MIRROR and, for STRIPE, copies ios_stripe_idx into
cl_io::ci_designated_stripe and sets ci_designated_stripe_set.
OBJECT stays reserved.

ci_designated_stripe is an unsigned index. 0 is a valid stripe, so
ci_designated_stripe_set says whether it is in use. A zeroed cl_io
is unset. The index is meaningful only with ci_designated_mirror
set.

lov visits only the stripes an I/O touches through
lov_foreach_io_stripe(), and maps an offset to a stripe through
lov_io_stripe_number(). On a parity component, read and write use
only the designated stripe of each raidset and fail with -EINVAL if
it is unset or not less than p. Punch, truncate, fallocate and lseek
reach every stripe and ignore the index, so a leftover STRIPE scope
does not fail them.

These helpers target the bare LOV_PATTERN_PARITY encoding for stripe
picking. lov_page_init_composite() also refuses CPT_CACHEABLE pages
when ci_designated_mirror is set on any parity component
(lsm_entry_is_parity()), including RAID0|PARITY. That covers MIRROR
and STRIPE scopes and LL_IOC_FLR_SET_MIRROR: a designated parity
read that falls back to the page cache (fcntl clears O_DIRECT, or a
short O_DIRECT read finished through the cache) returns -EINVAL.
sanity-ec test_312 checks that case.

llapi_io_scope_set(3) and the uapi comment document STRIPE, and that
ios_layout_version 0 uses the fd version from the last lease release
or resync lease. LL_IOC_SET_IO_SCOPE reuses nr 177 with
LL_IOC_FLR_SET_MIRROR (different size) to save an ioctl number.
sanity-flr test_213a checks the ioctl limits for FILE, MIRROR and
STRIPE, that OBJECT stays reserved, that mirror resync still goes
through the SET_MIRROR alias, and that a STRIPE read of a non-parity
mirror ignores the index. sanity-ec test_311 checks that lseek,
truncate and fallocate succeed for any index, and skips below 6
OSTs. io_scope gains -b, -x, -r, -t, -f and -l for that.

Test-Parameters: testlist=sanity-flr
Test-Parameters: testlist=sanity-ec ostcount=8
Assisted-by: Cursor:Composer-2 llm_code_and_review_tools
Signed-off-by: Keguang Xu <kxu@ddn.com>
Change-Id: Ia8c9e729df4f8651ac4f9dad88d4aef8b056100d
69940 master J –B ✓T ✓R 0/2
LU-21016 llite: do not switch hybrid IO to DIO on ZFS
reviewing Patrick Farrell · CI green — awaiting your review
pw_own218_review_priority M +195 −8
7h
build #135279 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger, Timothy Day
patchsets:
+2 earlier PS1 10-22 PS2 10-22 patrick bot
PS3 10-26 patrick bot PS4 10-27 patrick bot PS5 10-27 patrick bot PS6 11-01 patrick bot PS7 11-03 patrick bot
tags: pw_own 218_review_priority
owner Patrick Farrell · uploader patrick bot · PS7 uploaded 2d ago · NEW · open in Gerrit ↗
commit message
LU-21016 llite: do not switch hybrid IO to DIO on ZFS

Hybrid IO switches large buffered IO to direct IO. On ZFS
each direct write RPC forces a transaction group sync, so
with anything but fast storage hybrid IO is far slower than
the buffered IO it replaces. Reads do not sync and still
switch.

Do not switch writes when any initialized component of the
file has a stripe on a ZFS OST. ZFS OSTs are recognized by
the ocd_maxbytes they report at connect, MAX_LFS_FILESIZE,
which ldiskfs does not approach, so no server change is
needed. osd-wbcfs reports the same and is treated alike. The
OSTs are classified when the layout is unpacked, so the write
path tests a flag per component.

Add llite.*.hybrid_io_to_zfs, off by default, to allow the
write switch on ZFS anyway for sites with fast storage.
sanity 119k checks writes with and without it.

Fixes: d8a194db21dc ("LU-18033 llite: enable hybrid IO by default")
Assisted-by: ClaudeCode:claude-sonnet-5-5
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: Codex:gpt-6.1-sol
Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com>
Change-Id: Ibb0043020a05087f6ec2d960524c0d7c5bb29858
69769 master J –B ✓T ✓R 0/2
LU-11962 flr: fix FLR and SOM state after a layout swap
reviewing Andreas Dilger · CI green — awaiting your review
ssompt_ecropw_shepherd 3 unresolved M +180 −6
8h
build #135064 SUCCESS · tests all Maloo sessions
no vote yet: Patrick Farrell
patchsets: PS1 10-17 PS2 10-28 PS3 10-31 PS4 11-01
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS3 2026-11-01 03:37 Gerrit AI review for Lustre lod_lov.c:1372 — (suggestion) This covers the reload after an LU_XATTR_REPLACE swap. Other paths still keep the old state, though, because lod_striping_free_
Gerrit AI review for Lustre PS3 · 2026-11-01 03:37
(suggestion) This covers the reload after an LU_XATTR_REPLACE swap. Other paths still keep the old state, though, because lod_striping_free_nolock() never resets ldo_flr_state:

- A mirrored file swapped with a file that has no layout loses its LOV through mdd_swap_layouts()->lod_xattr_del()->lod_striping_free(), and keeps LCM_FL_RDONLY in memory.
- The plain-layout branch of lod_use_defined_striping() (the LU_XATTR_CREATE side of that swap) and lod_striping_from_default() with one mirror don't reset it either.

If such a file later gets a default PFL layout, can lod_declare_layout_change() send the write intent to lod_declare_update_rdonly()? This predates the patch. Resetting ldo_flr_state to LCM_FL_NONE in lod_striping_free_nolock() might cover every path at once, here or in a follow-up.
reply PS3 2026-11-01 03:37 Gerrit AI review for Lustre mdd_object.c:3213 — (minor) The HSM restore swap in hsm_swap_layouts() passes flags 0, so this now makes the restored file's SOM stale inside the swap transacti
Gerrit AI review for Lustre PS3 · 2026-11-01 03:37
(minor) The HSM restore swap in hsm_swap_layouts() passes flags 0, so this now makes the restored file's SOM stale inside the swap transaction. The mdt_lsom_downgrade() call that follows mo_swap_layouts() there will then always find SOM already stale, and it is the only caller of mdt_lsom_downgrade(). If the patch is refreshed, could that call (and maybe the function) be removed?
reply PS4 2026-11-01 19:01 Gerrit AI review for Lustre mdt_handler.c:1969 — (defect) Can this deadlock against a concurrent rename that overwrites one of the two files?
Gerrit AI review for Lustre PS4 · 2026-11-01 19:01
(defect) Can this deadlock against a concurrent rename that overwrites one of the two files?

mdt_swap_layouts() locks the larger FID first: it does swap(o1, o2) when lu_fid_cmp(fid1, fid2) < 0, so o1 is always the larger FID. mdt_reint_rename() locks the two children in ascending FID order (LU-15491), taking the source `mold` with LOOKUP|XATTR and the target `mnew` with LOOKUP|UPDATE, both EX.

Before this change only the XATTR bit on `mold` conflicted with the swap. Now UPDATE also conflicts on `mnew`, so `lfs swap_layouts A B` racing with `mv A B` on the same MDT, A < B:

    rename: holds A (LOOKUP|XATTR), waits for B (LOOKUP|UPDATE)
    swap:   holds B (LAYOUT|XATTR|UPDATE), waits for A

With A > B, rename takes B first (child_reverse_lock), and the swap order closes the same cycle. Both are server-local blocking enqueues with no trylock, so the two MDT threads hang and any later access to A or B blocks behind them. Any user who can write both files can trigger this.

mdt_close_handle_layouts() already locks in ascending order. Should mdt_swap_layouts() lock o2 before o1 (or swap only when the comparison is > 0) so that all three paths use the same order?
tags: ssom pt_ecro pw_shepherd
owner Andreas Dilger · uploader Andreas Dilger · PS4 uploaded 4d ago · NEW · open in Gerrit ↗
commit message
LU-11962 flr: fix FLR and SOM state after a layout swap

The SOM xattr stays with the inode when its layout is swapped, e.g. by
"lfs migrate" of a mirrored file after "lfs mirror resync".  The new
layout is usually not FLR, so writes do not go through a layout write
intent that makes SOM stale, and mdt_lsom_update() does not change
strict SOM at close.  The MDT then keeps returning the old size and
blocks as strict, and clients do not glimpse the OSTs.  Also,
lod_parse_striping() does not reset the FLR state for a plain layout,
so after such a swap LOD keeps the state of the layout it replaced.

Make strict SOM stale on both files in mdd_swap_layouts(), in the
transaction of the swap, so that a replay never finds the swap
committed without it.  HSM release keeps the strict SOM it sets.
Revoke the UPDATE locks too, so that clients drop strict attributes
they cached, and reset the FLR state of a plain layout in
lod_parse_striping().

Fixes: ce61bcac8661 ("LU-9771 clio: no glimpse for data immutable file")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5-5 ltvm llm_code_and_review_tools
Change-Id: I4dd07511ca0cad7a412623976370fefb17f97e32
69688 master J –B ✓T ✓R +1/2
LU-20964 llite: keep zero page owned if read ahead
reviewing Sebastien Buisson · CI green — awaiting your review
pw_shepherd M +56 −1
12h
build #134086 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger +1 2026-11-04 20:55
no vote yet: Shaun Tancheff, Timothy Day, Patrick Farrell
patchsets: PS1 10-14 PS2 10-15 PS3 10-20
tags: pw_shepherd
owner Sebastien Buisson · uploader Sebastien Buisson · PS3 uploaded 16d ago · NEW · open in Gerrit ↗
commit message
LU-20964 llite: keep zero page owned if read ahead

When truncating an encrypted file to a size that is not a multiple
of PAGE_SIZE, ll_io_zero_page() assumes the page at the new EOF,
reads it if it is not uptodate, zeroes the end of it and writes it.
It sets PagePrivate2 so that ll_io_read_page() keeps the page owned
and locked.

But if the page was read ahead and not yet used, it has
cp_defer_uptodate set and is not uptodate. ll_io_read_page() then
marked it uptodate and called cl_page_disown(), whatever PagePrivate2
says. This cleared the owner and unlocked the vmpage, so
ll_io_zero_page() queued for write a page it did not own anymore:
  (cl_io.c:944:cl_page_list_add()) ASSERTION( page->cp_owner != NULL )
  ll_io_zero_page+0x46c/0x850 [lustre]
  ll_setattr_raw+0x95c/0x1130 [lustre]
  do_truncate+0x94/0x100

Do not disown the page in that case either, as is already done after
an actual read.

Add sanity-sec test_48d to exercise this. The client must hold a PW
lock covering the page before the truncate, otherwise the lock
request in ll_io_zero_page() cancels the read lock and drops the
read-ahead pages, so the test writes the file before reading it.

Fixes: edcd05e5ac03 ("LU-15803 sec: correctly handle page lock in ll_io_zero_page")
Signed-off-by: Sebastien Buisson <sbuisson@ddn.com>
Assisted-by: Claude:claude-opus-5-5
Change-Id: I06603a26e0be98dd60b4ee2bec4a2d3d7950dc2c
64441 master J –B ✓T ✓R +2/2
LU-12187 lov: MDS layout pattern negotiation
reviewing Maximilian Dilger · CI green — awaiting your review
pt_ecropw_shepherd218_review_blocker 4 unresolved XL +1273 −53
14h
build #135207 SUCCESS · tests all Maloo sessions
reviews: Marc Vef +1 2026-11-04 12:18 · Andreas Dilger +1 2026-11-04 03:36
no vote yet: Oleg Drokin
patchsets:
+29 earlier PS1 03-09 PS2 03-12 PS3 03-12 PS4 03-12 PS5 03-15 PS6 03-26 PS7 04-10 PS8 04-23 PS9 04-23 Andreas Dilger PS10 04-24 Andreas Dilger PS11 05-04 Andreas Dilger PS12 06-03 PS13 06-05 PS14 06-08 PS15 06-24 PS16 06-25 PS17 07-09 PS18 07-10 PS19 08-13 PS20 08-21 PS21 08-25 PS22 08-25 PS23 09-02 PS24 09-03 PS25 09-08 PS26 09-09 PS27 09-11 PS28 09-16 PS29 10-13
PS30 10-13 PS31 10-21 PS32 10-24 PS33 11-02 Marc Vef PS34 11-02 Marc Vef
threads: 4 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS34 2026-11-04 02:19 Gerrit AI review for Lustre COMMIT_MSG:7 — (style) This isn't a bug, but the summary is a noun phrase rather than imperative, e.g. "lov: add MDS layout pattern negotiation" (still wit
Gerrit AI review for Lustre PS34 · 2026-11-04 02:19
(style) This isn't a bug, but the summary is a noun phrase rather than imperative, e.g. "lov: add MDS layout pattern negotiation" (still within 62 characters).
reply PS34 2026-11-04 02:19 Gerrit AI review for Lustre llite_lib.c:452 — (minor) Is the side effect here intended? lmv_get_info() for KEY_CONN_DATA also does
Gerrit AI review for Lustre PS34 · 2026-11-04 02:19
(minor) Is the side effect here intended? lmv_get_info() for KEY_CONN_DATA also does

    exp->exp_connect_data = *(struct obd_connect_data *)val;

so now, on every OBD_NOTIFY_OCD from any MDC, sbi->ll_md_exp->exp_connect_data is rewritten with MDT0000's imp_connect_data:

    ptlrpc_connect_interpret()->mdc_import_event(IMP_EVENT_OCD)->lmv_notify()->ll_upcall_notify()->ll_layout_pattern_types_refresh()->lmv_get_info()

Before this patch it was only written at mount. It is an unlocked struct copy while exp_connect_flags*(sbi->ll_md_exp) is read without locks all over llite. After an MDT0000 failover to a server granting different flags, those flags would change mid-mount, while the LL_SBI_* bits derived from them at mount stay the same. If it is intended, a line in the commit message would help. Otherwise the mask could be read from the MDT0000 MDC import without going through the LMV export.
reply PS34 2026-11-04 02:19 Gerrit AI review for Lustre xattr.c:244 — (minor) For a regular file this check runs twice: ll_setstripe_ea() calls ll_adjust_lum() and then ll_lov_setstripe_ea_info(), and ll_lov_se
Gerrit AI review for Lustre PS34 · 2026-11-04 02:19
(minor) For a regular file this check runs twice: ll_setstripe_ea() calls ll_adjust_lum() and then ll_lov_setstripe_ea_info(), and ll_lov_setstripe_ea_info() calls ll_layout_patterns_check() again first thing (file.c). The only extra case covered here is S_ISDIR via ll_dir_setstripe(). The LL_IOC_LOV_SETSTRIPE ioctl on a directory goes to ll_dir_setstripe() without the check, so the two directory paths now behave differently. Should the check be either only in ll_lov_setstripe_ea_info(), or in ll_dir_setstripe() as well, so both directory paths agree?
reply PS34 2026-11-04 02:19 Gerrit AI review for Lustre mdt_lproc.c:1431 — (suggestion) With MDT_LAYOUT_PATTERN_TYPES as defmask, cfs_str2mask() makes "layout_pattern_types=default" turn parity on (`newmask = defmas
Gerrit AI review for Lustre PS34 · 2026-11-04 02:19
(suggestion) With MDT_LAYOUT_PATTERN_TYPES as defmask, cfs_str2mask() makes "layout_pattern_types=default" turn parity on (`newmask = defmask`). The man page's Default property, and the mdt_init0() seed with mdt_enable_flr_ec=0, are the baseline without parity. The man page does say "all and default enable every type", but "default" giving something other than the default is surprising, and "default" is missing from Valid Values. Would passing the boot seed (LOV_LAYOUT_PATTERN_TYPES_217 | (mdt_enable_flr_ec ? LOV_PATTERN_PARITY : 0)) as defmask be more intuitive?
tags: pt_ecro pw_shepherd 218_review_blocker
owner Maximilian Dilger · uploader Marc Vef · PS34 uploaded 2d ago · NEW · open in Gerrit ↗
commit message
LU-12187 lov: MDS layout pattern negotiation

Add obd_connect_data::ocd_layout_pattern_types so a client and the MDS
negotiate the layout patterns and LOV_PATTERN_F_* flags both support.
The client sends what it knows, the MDS replies with the intersection
when it grants OBD_CONNECT2_FLR_EC, and the client falls back to the
pre-2.18 baseline LOV_LAYOUT_PATTERN_TYPES_217 otherwise.  FLR-EC uses
this for LOV_PATTERN_PARITY.  The mask comes from MDT0000 through the
LMV and is refreshed on every MDC reconnect; the client's own request
is restored for each reconnect like the connect flags, so a pattern
the MDS re-enables comes back without a remount.  OSTs are not
involved.

A component whose pattern or flag was not negotiated is left
uninitialized by lov_init_composite() like an unknown pattern, so IO
reads another mirror instead; writes still stale it so that a later
resync rebuilds it.  The client refuses to create such a component
with EOPNOTSUPP on both the setstripe ioctl and lustre.lov xattr
paths.  Parsing stays pattern-agnostic so lsme alloc/free remain
symmetric.

Add mdt.*.layout_pattern_types to change the advertised types at
runtime (mdt_enable_flr_ec only seeds it at MDT start), read-only
lov.*.layout_pattern_types on the client, and man pages for both.
The value is filesystem-wide, so set it on all MDTs.

Rename llite_enable_flr_ec to enable_flr_ec, reached as
lustre.enable_flr_ec via 'lctl {get,set}_param --module'.  Since
mdt_enable_flr_ec only seeds an MDT at startup, set_mdt_flr_ec() in
the test framework also enables parity on the MDT it has just
mounted.  MODOPTS_MDT never reaches the MDS when mount loads the
server modules (LOAD_MODULES_REMOTE=false, as in autotest), so
sanity-ec and sanity test_27D negotiate parity explicitly, and
test_27D skips the EC subtests that create parity layouts when the
client or MDS cannot.

Add conf-sanity 163a-163d: the negotiated mask in the import, the
tunable and reconnect renegotiation, write staling from a client
without EC, and an un-negotiated layout flag injected with
OBD_FAIL_LOV_COMP_FLAG.

Assisted-by: ClaudeCode:Fable-5.1 llm_code_and_review_tools
Assisted-by: ClaudeCode:Opus-5.5 llm_code_and_review_tools
Test-Parameters: testlist=sanity-ec
Test-Parameters: testlist=conf-sanity env=ONLY="163"
Test-Parameters: testlist=sanity serverversion=2.17
Test-Parameters: testlist=sanity-pfl clientversion=2.17
Test-Parameters: testlist=sanity-pfl serverversion=2.17 env=SANITY_PFL_EXCEPT="18 28"
Test-Parameters: testlist=sanity-flr clientversion=2.17
Test-Parameters: testlist=sanity-flr serverversion=2.17 env=SANITY_FLR_EXCEPT="0a"
Signed-off-by: Maximilian Dilger <mdilger@whamcloud.com>
Change-Id: Iaef716e28014be5b91dd50b117dd0881f5c37f37
62952 master J –B ✓T ✓R +1/2
LU-19687 lov: skip foreign layouts for regular file IO
reviewing Alex Zhuravlev · CI green — awaiting your review
pw_shepherd 19 unresolved S +43 −2
1d
build #134759 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger +1 2026-11-04 03:10
no vote yet: Oleg Drokin, Nikitas Angelinas, Patrick Farrell
patchsets:
+16 earlier PS1 12-08 PS2 12-09 PS3 12-09 PS4 01-09 PS5 01-28 PS6 02-11 PS7 02-18 PS8 03-10 PS9 03-12 PS10 03-30 Andreas Dilger PS11 04-29 PS12 04-29 PS13 05-02 PS14 05-29 PS15 05-29 PS16 06-08
PS17 06-12 PS18 06-23 PS19 09-16 PS20 10-23 PS21 10-29
threads: 19 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS19 2026-09-18 04:16 Gerrit AI review for Lustre COMMIT_MSG:20 — (minor) This removes a client LBUG, so a Fixes: tag would help decide which maintenance branches need it. The LASSERT came in with 61a002cd8
Gerrit AI review for Lustre PS19 · 2026-09-18 04:16
(minor) This removes a client LBUG, so a Fixes: tag would help decide which maintenance branches need it. The LASSERT came in with 61a002cd8631 ("LU-13602 flr: skip unknown FLR component types"), but it only became reachable for a plain PFL file once a broken component started being converted to an in-memory foreign entry:

    Fixes: 902fe290e51d ("LU-17261 lov: ignore broken components")
reply PS20 2026-10-26 15:24 Gerrit AI review for Lustre COMMIT_MSG:16 — (typo) "such a write" -> "such as a write".
Gerrit AI review for Lustre PS20 · 2026-10-26 15:24
(typo) "such a write" -> "such as a write".
reply PS20 2026-10-26 15:24 Gerrit AI review for Lustre COMMIT_MSG:19 — (minor) If the patch is refreshed, could this also name the new OBD_FAIL_LOV_INVALID_OSTIDX2 fail_loc in lod_gen_component_ea()? The test_21
Gerrit AI review for Lustre PS20 · 2026-10-26 15:24
(minor) If the patch is refreshed, could this also name the new OBD_FAIL_LOV_INVALID_OSTIDX2 fail_loc in lod_gen_component_ea()? The test_210c/d sentence is the only hint that the patch also changes MDS code.
reply PS19 2026-10-23 00:26 Oleg Drokin patchset comment — sanity-flr test_210c/test_210d fail in all 7 interop sessions with a b2_15 or b2_16 MDS
Oleg Drokin PS19 · 2026-10-23 00:26
sanity-flr test_210c/test_210d fail in all 7 interop sessions with a b2_15 or b2_16 MDS
in lustre-master-next build 1018 ("can dd" / "can truncate"), and pass in the other 50:
https://testing.whamcloud.com/test_sets/5655b63e-5787-4566-9872-2ea78d70e78d
https://testing.whamcloud.com/test_sets/7a2a037d-1b7c-4dd2-bae4-33f33a05cb9a
The tests depend on fail_loc 0x1440 (OBD_FAIL_LOV_INVALID_OSTIDX2) on mds1, which only
exists with this patch's lod_lov.c change, so an older MDS hands out a valid layout.
Please add an MDS version guard next to the client one, e.g.
  (( $MDS1_VERSION >= $(version_code 2.17.<landing version>) )) ||
          skip "need MDS with OBD_FAIL_LOV_INVALID_OSTIDX2"
reply PS20 2026-10-29 10:58 Alex Zhuravlev obd_support.h:659 — oh, thanks!
Marc Vef PS20 · 2026-10-29 10:35
(conflict) this line has a neighbouring line conflict with https://review.whamcloud.com/c/fs/lustre-release/+/69573

69573 is ready. I just rebased 69573 on the current master. Since this patch needs to be refreshed again, I think it makes sense to rebase this patch onto 69573 so they can land together
Alex Zhuravlev PS20 · 2026-10-29 10:58
oh, thanks!
reply PS21 2026-10-31 06:55 Gerrit AI review for Lustre obd_support.h:660 — (style) This isn't a bug, but 0x1440 sits between 0x1439 and 0x143a, so the list is out of order and 0x143b-0x143f are skipped. If the patch
Gerrit AI review for Lustre PS21 · 2026-10-31 06:55
(style) This isn't a bug, but 0x1440 sits between 0x1439 and 0x143a, so the list is out of order and 0x143b-0x143f are skipped. If the patch is refreshed, could it use the next free value (0x143b) after OBD_FAIL_LLITE_DIO_FALLBACK? A name that says what it does, e.g. OBD_FAIL_LOV_INVALID_OSTIDX_COMP0 (every stripe of component 0 gets a bad index), would also read better than a "2" suffix.
reply PS10 2026-04-27 22:25 Nikitas Angelinas lod_lov.c:830 — cfs_fail_val isn't used in the added tests, fwiw
Nikitas Angelinas PS10 · 2026-04-27 22:25
cfs_fail_val isn't used in the added tests, fwiw
reply PS10 2026-04-27 22:25 Nikitas Angelinas lod_lov.c:830 — the braces aren't necessary and could be removed; same for the CFS_FAIL_CHECK() below
Nikitas Angelinas PS10 · 2026-04-27 22:25
the braces aren't necessary and could be removed; same for the CFS_FAIL_CHECK() below
reply PS10 2026-04-29 07:34 Alex Zhuravlev lod_lov.c:832 — well, no, I wanted to make it looking "mostly fine"
Nikitas Angelinas PS10 · 2026-04-27 22:25
Could this be cpu_to_le32(0xffffffff), same as below?
Alex Zhuravlev PS10 · 2026-04-29 07:34
well, no, I wanted to make it looking "mostly fine"
reply PS19 2026-09-18 04:16 Gerrit AI review for Lustre lod_lov.c:846 — (style) Not a bug, but if the patch is refreshed: ltd_tgts_size+1 wants spaces around the +, and the two arms of the same if spell the same
Gerrit AI review for Lustre PS19 · 2026-09-18 04:16
(style) Not a bug, but if the patch is refreshed: ltd_tgts_size+1 wants spaces around the +, and the two arms of the same if spell the same test differently - !comp_idx here versus comp_idx == 0 just below.
reply PS20 2026-10-26 15:24 Gerrit AI review for Lustre lod_lov.c:848 — (style) This isn't a bug, but now that the opening line is "} else if (", the continuation line should be re-aligned to start after the open
Gerrit AI review for Lustre PS20 · 2026-10-26 15:24
(style) This isn't a bug, but now that the opening line is "} else if (", the continuation line should be re-aligned to start after the open parenthesis. It still has the old "if (" indentation.
reply PS19 2026-09-18 04:16 Gerrit AI review for Lustre lov_io.c:2356 — (defect) Skipping the entry here means lov_io_layout_at() reports "no component at this offset", and lov_foreach_io_layout() uses exactly th
Gerrit AI review for Lustre PS19 · 2026-09-18 04:16
(defect) Skipping the entry here means lov_io_layout_at() reports "no component at this offset", and lov_foreach_io_layout() uses exactly that as its loop terminator:

    ind = lov_io_layout_at(lio, lov_io_extent(lio, ind)->e_end)

Take a mixed layout - comp0 [0,4M) regular, comp1 [4M,8M) foreign, comp2 [8M,EOF) regular. The loop in lov_io_iter_init() starts at comp0, then the advance step looks up offset 4M: comp1 is now skipped and comp2 does not cover 4M, so it returns -1 and the loop ends. comp2 never reaches lis_active, so a CIT_FSYNC or CIT_DATA_VERSION over the whole file quietly does nothing for it. The foreign component is not skipped, it truncates the iteration.

Everywhere else the tree handles a foreign component by skipping it in the loop body, so iteration continues - lov_io_iter_init() at line 1094 and lov_attr_get_composite() in lov_object.c. Those checks become unreachable with this change, as do lov_io.c:1251 and the lsm_entry_is_foreign() term at lov_io.c:1461, since lov_io_layout_at() can no longer return a foreign index.

Would it be better to have lov_io_layout_at() keep returning the foreign entry and let those per-caller checks decide? That steps over the foreign extent instead of stopping at it, and matches the PCC-RO / HSM-in-PFL case raised earlier in the review, where the regular components around a foreign one should stay usable.
tags: pw_shepherd
owner Alex Zhuravlev · uploader Alex Zhuravlev · PS21 uploaded 6d ago · NEW · open in Gerrit ↗
commit message
LU-19687 lov: skip foreign layouts for regular file IO

If the client sees a bad layout in lsm_unpackmd_comp_md_v1(),
for example if the OST index is invalid after the retry loop in
lsme_unpack_comp()->lsme_unpack() waits for newly-added OSTs to
appear in the client configuration (LU-17334) and fails, then
lsm_unpackmd_comp_md_v1() changes the component type to use
LOV_MAGIC_FOREIGN (in memory only).

If a regular IO (such a write) meets a foreign component layout
in lov_io_layout_at(), then just skip it instead of LASSERT().

Add sanity-flr.sh test_210c and test_210d to verify this case.

Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Change-Id: I51c6dbc196d70d8d03a165b9877f7617b85dfac1
65798 master J –B ✓T ✓R +1/2
LU-20238 ec: GFNI-accelerated EC primitives
reviewing Hiroshi Nishida · CI green — awaiting your review
pt_ecropw_smallfix CI@PS23 XL +3332 −38
2d
build #134847 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger +1 2026-11-03 08:16
no vote yet: patrick bot, Keguang Xu, Ronnie Sahlberg, Patrick Farrell, Marc Vef, Maximilian Dilger, Oleg Drokin
patchsets:
+19 earlier PS1 05-11 PS2 05-11 PS3 05-11 PS4 05-12 PS5 05-12 PS6 05-13 PS7 05-13 PS8 05-17 PS9 06-08 PS10 06-17 PS11 07-10 PS12 07-10 PS13 08-05 PS14 08-06 PS15 08-07 PS16 10-01 patrick bot PS17 10-02 PS18 10-05 patrick bot PS19 10-13
PS20 10-21 patrick bot PS21 10-21 PS22 10-24 patrick bot PS23 10-30 patrick bot PS24 11-03 Andreas Dilger
tags: pt_ecro pw_smallfix
build/test results are from PS23 — PS24…PS24 changed only the commit message (votes copied, CI not re-run)
owner Hiroshi Nishida · uploader Andreas Dilger · PS24 uploaded 2d ago · NEW · open in Gerrit ↗
commit message
LU-20238 ec: GFNI-accelerated EC primitives

Add a runtime-dispatched GFNI fast path to libec.a (LU-19465).
On x86_64 with GFNI, ec_encode_data(), ec_encode_data_update(),
ec_init_tables(), gf_vect_dot_prod() and gf_vect_mad() route to
AVX-512 or AVX2 GFNI kernels; everywhere else the existing
ec_*_base() path is used unchanged.

The kernels are C intrinsics (_mm{256,512}_gf2p8affine_epi64_epi8)
gated per-function with __attribute__((target(...))), so the build
needs only GCC >= 10 / clang >= 8 and no NASM.  They use only the
GF(2^8) affine instruction and XOR/load/store, not the PSHUFB
nibble-table lookup the ISA-L AVX2/SSE kernels rely on.

The multi-output AVX-512 dot_prod kernels take the coefficient as
an EVEX {1to8} embedded broadcast to keep it off Port5; compilers
will not emit {1to8} from intrinsics, so a short inline-asm macro
is used.  The mad kernels use _mm512_set1_epi64(), the coefficient
being loop-invariant there.
Against ISA-L's NASM kernels this reaches parity on AVX-512 (+1%
to -5%) and matches or beats NASM on 4 of 5 AVX2 benchmarks, the
one slower case by 6%.

A configure probe (EC_GFNI_SUPPORT) compile-tests the intrinsic
and defines LUSTRE_EC_GFNI for the libec.a build only.  It rejects
GCC 8 and 9, which mark GF2P8AFFINEQB commutative and can swap its
data and matrix operands, giving wrong parity.  Every
dispatch block is guarded by the pair defined(LUSTRE_EC_GFNI) &&
!defined(__KERNEL__), so no shipped consumer reaches a GFNI kernel
yet: ec.ko and liblustreapi both take the base path, and the
numbers above compare kernels directly rather than describing a
user-visible speedup.  Follow-on patches add the Kbuild plumbing
and the liblustreapi wiring.

gfni_ec_test checks that the GFNI and base paths produce identical
output, and exits 77 without GFNI so a caller can skip instead of
recording a base-against-base pass.  It installs with the test
suite; sanity-ec.sh test_0 sweeps geometries and lengths through
it.  -i picks the kernel family directly, because the runtime
dispatch always prefers AVX-512 and would otherwise leave the
AVX2 kernels untested on any CPU that has both.

The vendored gf_*_gfni.c kernels are reflowed for lustre
checkpatch; see lustre/utils/erasurecode/GFNI_VENDORED.md.

Test-Parameters: trivial testlist=sanity-ec
Signed-off-by: Hiroshi Nishida <hnishida@thelustrecollective.com>
Assisted-by: Claude:Opus-5 claude-code
Change-Id: Ia40a743c8e47c018250728668090215c7bd8365b
69828 master J –B ✓T ✓R +2/2
LU-20958 llite: drop strict SOM size with the UPDATE lock
reviewing Andreas Dilger · CI green — awaiting your review
218_review_prioritypt_ecro 2 unresolved S +35 −1
2d
build #134055 SUCCESS · tests all Maloo sessions
reviews: Keguang Xu +1 2026-11-03 05:23 · Ronnie Sahlberg +1 2026-10-29 04:05
no vote yet: Patrick Farrell
patchsets: PS1 10-19 PS2 10-19
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS2 2026-11-03 03:45 Andreas Dilger sanity-flr.sh:2570 — This should be fixed, but I'm reluctant to refresh the patch just for this. Will push a separate patch on top to fix, can be merged in if t
Gerrit AI review for Lustre PS2 · 2026-10-21 02:48
(style) This gate and skip message were copied from test_44e, which uses the enable_strict_som tunable. test_44i never touches that tunable, so the "for SOM tunable" reason doesn't fit here. If the patch is refreshed, could the message say what this test actually needs from the MDS?
Keguang Xu PS2 · 2026-10-25 05:35
Or should we use the recent version like 2.17.59?
Andreas Dilger PS2 · 2026-11-03 01:23
Agreed, the gate and skip message come from test_44e.  If this patch is refreshed, the message will say what the test needs (strict SOM after resync) and use the 2.17.59 version.
Andreas Dilger PS2 · 2026-11-03 03:45
This should be fixed, but I'm reluctant to refresh the patch just for this.  Will push a separate patch on top to fix, can be merged in if this needs to be refreshed for another reason.
reply PS2 2026-11-03 03:45 Andreas Dilger sanity-flr.sh:2591 — The test cases are verified before/after to detect the failure, so this _should_ be enough to detect an issue.
Keguang Xu PS2 · 2026-10-25 05:35
(suggestion) Should we use 2 clients? cli1 `dd + stats` then cli2 `dd` which would revoke the `UPDATE` lock from cli1?
Andreas Dilger PS2 · 2026-11-03 01:23
One client is enough: strict SOM is only set on an FLR file after a resync, and the first write from the same client sends a layout write intent, which takes LAYOUT|UPDATE in EX mode on the MDS and cancels this client's own UPDATE lock too.  The test of the bits will be in 64086, as above.
Andreas Dilger PS2 · 2026-11-03 03:45
The test cases are verified before/after to detect the failure, so this _should_ be enough to detect an issue.
tags: 218_review_priority pt_ecro
owner Andreas Dilger · uploader Andreas Dilger · PS2 uploaded 16d ago · NEW · open in Gerrit ↗
commit message
LU-20958 llite: drop strict SOM size with the UPDATE lock

A strict SOM size and blocks from the MDS are only valid under the
MDS UPDATE lock: a write or truncate of the file takes LAYOUT|UPDATE
in EX mode before the MDS marks the SOM stale.  The client kept
OBD_MD_FLSIZE|OBD_MD_FLBLOCKS in lli_attr_valid after that lock was
cancelled, so anything trusting them without a getattr would use a
size from before another client's write.  stat() was not affected,
since ll_getattr() revalidates first, but EC lseek and the fsync
blocks update are about to rely on these bits.

Clear them from lli_attr_valid when the UPDATE lock is cancelled, so
the next getattr fetches them again.

Add sanity-flr test_44i, which writes a mirrored file with a strict
SOM size and checks the blocks stored at close.

Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools
Change-Id: Ice12d7b03bb2b78e4f6b1f839d4b8ac4b03ebbe5
69161 master J ✓B ✓T ✓R +2/2
LU-20818 osc: build RPCs on a dedicated unbound workqueue
reviewing Patrick Farrell · CI green — awaiting your review
pw_bigfixpw_halt 1 unresolved S +23 −10
3d
build #132327 SUCCESS · tests all Maloo sessions
reviews: Sebastien Buisson +1 2026-10-16 15:39 · Andreas Dilger +1 2026-10-16 12:19
no vote yet: Shaun Tancheff, Timothy Day
patchsets: PS1 09-23 PS2 09-25 patrick bot
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS2 2026-11-01 14:45 Xiao Yang patchset comment — Sorry for the confusion, I meant only 70293 needs the count, since it uses per-CPT workqueues.
Xiao Yang PS2 · 2026-11-01 14:26
Hi Patrick,

I tested 69161/69162 for the single-stream write regression from LU-17180, and also wrote an alternative patch (70293) that runs the work on the submitter's CPT. On a client with several CPTs, 69161/69162 are still 7-12% slower than reverting LU-17180, while my patch matches the revert.

Setup (local VMs)
- Client: 8 vCPUs in one NUMA node, Rocky 10 (kernel 6.12), cpu_pattern="", so 4 CPTs of 2 CPUs each
- 4 OSTs; file striped with lfs setstripe -C 16 -S 16M
- dd if=/dev/zero bs=1M count=16384 conv=fsync, page cache dropped before each run, 5 runs per build
- All builds based on 2.17.60, tested back to back in the same session

Results (MB/s, mean of 5 runs)

┌───────────────────┬─────────────┬──────────────┐
│       Build       │ checksums=0 │ checksums=1  │
├───────────────────┼─────────────┼──────────────┤
│ LU-17180 reverted │ 919         │ 958          │
├───────────────────┼─────────────┼──────────────┤
│ 69161 + 69162     │ 854 (−7.1%) │ 839 (−12.5%) │
├───────────────────┼─────────────┼──────────────┤
│ 70293             │ 909 (−1.2%) │ 955 (−0.3%)  │
└───────────────────┴─────────────┴──────────────┘

Before LU-17180, ptlrpcd_queue_work() ran this work in a ptlrpcd thread of the writer's CPT. An unbound workqueue, especially when spread over the node, loses that locality, and for a single writer that costs more than the extra CPUs gain. My patch instead queues the work on a per-CPT workqueue for the submitter's CPT, and counts the requests like ptlrpcd_queue_work() did, so a work item is never on two workqueues at once.

I haven't tested your case (many OSCs on a small CCD, where spreading helps). I'd be glad to compare the two approaches and discuss which way to go.
patrick bot PS2 · 2026-11-01 14:31
Patrick-Bot: Thanks for the numbers and for 70293. Which approach should go forward is for the patch owner and reviewers to decide, so I am leaving this thread open for them.

One factual point for the comparison: this series does not need a request count to keep a work item off two workqueues. Every queueing of cl_writeback_work and cl_lru_work in this patch goes to the single osc_brw workqueue, and __queue_work() sends a work item that is still running back to the pool running it whenever both are the same workqueue, for unbound workqueues too (rocky8 4.18 included). That covers the queue_work_on() in 69162 as well. The count in 70293 is needed because it uses one workqueue per CPT.

osc_brw is WQ_SYSFS, so its cpumask and (on 6.12) affinity_scope under /sys/devices/virtual/workqueue/osc_brw/ can be changed at run time. Rerunning 69161 alone with its cpumask set to the writer's CPT would separate placement from the rest of the difference.
Xiao Yang PS2 · 2026-11-01 14:45
Sorry for the confusion, I meant only 70293 needs the count, since it uses per-CPT workqueues.
tags: pw_bigfix pw_halt
owner Patrick Farrell · uploader patrick bot · PS2 uploaded 40d ago · NEW · open in Gerrit ↗
commit message
LU-20818 osc: build RPCs on a dedicated unbound workqueue

Since RPC building moved from ptlrpcd to the system workqueue,
every OSC's writeback work is queued on the submitting CPU and
runs there one after another, CPU-bound work being serialized
on a per-CPU pool.  A single thread's IO to a striped file is
built on one CPU, including the user copy of unaligned (and so
hybrid) DIO writes, which now caps at one core's copy rate.
The LRU work moved with it and has the same problem.  The
system workqueue also has no rescuer, though writeback and LRU
shrinking may be needed to reclaim memory.

Queue the writeback and LRU work on an unbound, memory reclaim
workqueue of its own, so the OSCs run it in parallel.  The
workqueue is visible in sysfs as osc_brw, for its CPU mask and
affinity scope.

Fixes: 776e163cf542 ("LU-17180 ptlrpc: don't block ptlrpcd too long")
Assisted-by: ClaudeCode:claude-opus-5-5
Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com>
Change-Id: I2d0468fefd91aa5faf8c4c7a2fa7ab38f4181a37
69731 master J –B ✓T ✓R 0/2
LU-19895 osc: account cached folios in base pages
reviewing Patrick Farrell · CI green — awaiting your review
pw_own M +137 −23
3d
build #134783 SUCCESS · tests all Maloo sessions
no vote yet: Arshad Hussain, Shaun Tancheff, Andreas Dilger, Timothy Day
patchsets:
+2 earlier PS1 10-16 PS2 10-16 patrick bot
PS3 10-18 patrick bot PS4 10-18 patrick bot PS5 10-19 patrick bot PS6 10-21 patrick bot PS7 10-29 patrick bot
tags: pw_own
owner Patrick Farrell · uploader patrick bot · PS7 uploaded 6d ago · NEW · open in Gerrit ↗
commit message
LU-19895 osc: account cached folios in base pages

With large folios one osc_page covers a whole folio, up to
256 base pages, but the OSC LRU still took one slot for each
osc_page. The IO reservation is made in base pages and the
unused part is returned at the end of the IO, so a 1 MiB
folio kept a 4 KiB charge. max_cached_mb was then not
enforced: with max_cached_mb=64, a 256 MiB buffered write
stayed fully cached while used_mb reported 1.

Use osc_lru_npgs() to charge each osc_page for its folio
in base pages. Count LRU, busy and unevictable totals,
shrink scans and cross OSC reclaim in base pages too, so
they agree with max_cached_mb, osc_cached_mb and readahead.
Set cl_io::ci_folio_order only when large folios are
allowed for the inode. For multi-page IO, round the
reservation to whole folios in lov_io_lru_reserve() and
osc_lru_alloc(), so a cached folio never waits for slots
while the IO holds other queued folios. osc_lru_take()
charges the shared cache for any shortfall, returning the
reservation before waiting. A file limited to order 0
pages behaves as before.

Add sanity/858 to check that max_cached_mb bounds the page
cache and used_mb matches it after a large folio write.

Test-Parameters: clientdistro=el10.1
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: Codex:gpt-6.1-sol
Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com>
Change-Id: If759ec95cec1a2d867e24fc321016d40f083f210
67651 master J –B ✓T ✓R -2/2−
LU-20541 lfs: Implement migrate_stripe command and add test
reviewing Ronnie Sahlberg · CI green — awaiting your review (needs rebase first)
needs rebase ec2 pt_ecro 11 unresolved XL +2004 −1
4d
CI green — awaiting your review (needs rebase first)
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked
build #134057 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger -1 2026-10-20 07:01
no vote yet: Marc Vef
patchsets:
+15 earlier PS1 07-31 PS2 07-31 PS3 07-31 PS4 08-01 PS5 08-03 PS6 08-03 PS7 08-04 PS8 08-05 PS9 08-05 PS10 08-06 PS11 08-26 PS12 08-26 PS13 08-27 PS14 08-27 PS15 08-31
PS16 09-03 PS17 09-04 PS18 10-12 PS19 10-13 PS20 10-20
threads: 11 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS19 2026-10-16 10:50 Gerrit AI review for Lustre lfs-migrate_stripe.1:71 — (minor) lfs_migrate_stripe() also accepts `--src-ost-index` and `--dst-ost-index`, but the man page, the SYNOPSIS and the help text don't li
Gerrit AI review for Lustre PS19 · 2026-10-16 10:50
(minor) lfs_migrate_stripe() also accepts `--src-ost-index` and `--dst-ost-index`, but the man page, the SYNOPSIS and the help text don't list them. If the patch is refreshed, could they either be documented or dropped?
reply PS20 2026-10-20 07:01 Andreas Dilger lfs-migrate_stripe.1:9 — The -i and -o options are generally used interchangeably for regular lfs migrate, lfs find, lfs setstripe, so it _might_ be confusing here.
Andreas Dilger PS20 · 2026-10-20 07:01
The -i and -o options are generally used interchangeably for regular lfs migrate, lfs find, lfs setstripe, so it _might_ be confusing here.  However, I do see the benefit that they could be named `--input` and `--output` to make their distinction more clear.

I think requiring users to select the output OST index will not result in good choices, as that would be different for each raidset, each file, and a good choice will depend on the failure domain of every other stripe in the raidset.
reply PS20 2026-10-20 07:01 Andreas Dilger lfs-migrate_stripe.1:12 — This is "--block" (or "--non-block") for regular lfs migrate.
Andreas Dilger PS20 · 2026-10-20 07:01
This is "--block" (or "--non-block") for regular lfs migrate.
reply PS20 2026-10-20 07:01 Andreas Dilger lfs-migrate_stripe.1:54 — im not sure what this means?
Andreas Dilger PS20 · 2026-10-20 07:01
im not sure what this means?
reply PS20 2026-10-20 07:01 Andreas Dilger lfs-migrate_stripe.1:78 — In addition to the complexity of specifying the correct target OST for every file, another complexity here is that it is unlikely that a tar
Andreas Dilger PS20 · 2026-10-20 07:01
In addition to the complexity of specifying the correct target OST for every file, another complexity here is that it is unlikely that a target OST has enough space to hold the full capacity of an OST being evacuated, unless it is a brand-new replacement.  Otherwise, the single target OST will be full or severely imbalanced compared to the other OSTs.

Also, there would only be the write bandwidth of the single target rather than using the distributed write bandwidth and capacity of many OSTs (at least the peers in a target failure domain, or many failure domains if there are many OSTs in the filesystem (which is often true).
reply PS20 2026-10-20 07:01 Andreas Dilger sanity-pfl.sh:26 — (style) the preference for files that are changed is to use the "new" `always_except` helper to manage the list, so that the LU ticket numbe
Andreas Dilger PS20 · 2026-10-20 07:01
(style) the preference for files that are changed is to use the "new" `always_except` helper to manage the list, so that the LU ticket numbers are better associated with the excepted subtest, and there is no error in manipulating the string, like there was in this case.

(defect) excepted tests need to be associated with an LU ticket that describes the specific issue to be fixed, so that the next person working on this code (maybe you in a year) does not need to reverse engineer the reason for it.
reply PS20 2026-10-20 07:01 Andreas Dilger lfs.c:1667 — I don't think all of this code belongs in lfs.c. I _think_ there is code in llapi to calculate the object offsets, though we've tried to avo
Andreas Dilger PS20 · 2026-10-20 07:01
I don't think all of this code belongs in lfs.c. I _think_ there is code in llapi to calculate the object offsets, though we've tried to avoid externalizing that due to the burden of keeping it in sync for complex layouts.  If not, then this should live in a separate file to avoid adding complexity here (which is aspirationally a "user" of llapi and not a net provider of new/critical functionality, though it is imperfectly so).
reply PS20 2026-10-20 23:14 Gerrit AI review for Lustre lfs.c:1773 — (minor) Does this still match the MDS side? With the parent change, mdd_layout_swap_allowed() lets a CAP_FOWNER caller through a uid/gid mis
Gerrit AI review for Lustre PS20 · 2026-10-20 23:14
(minor) Does this still match the MDS side? With the parent change, mdd_layout_swap_allowed() lets a CAP_FOWNER caller through a uid/gid mismatch when SWAP_LAYOUTS_SINGLE_STRIPE is set:

    if (!(flags & SWAP_LAYOUTS_SINGLE_STRIPE))
        RETURN(-EPERM);
    uc = lu_ucred_check(env);
    if (uc == NULL || !cap_raised(uc->uc_cap, CAP_FOWNER))
        RETURN(-EPERM);

llapi_fswap_layout_fids() always sets that flag, so root would not get -EPERM here even without the fchown(). The fchown() is still reasonable (the volatile is charged to the right owner while it exists), but the stated reason doesn't hold. If the patch is refreshed, the same wording in lfs-migrate_stripe.1 (NOTES, "so mdd_swap_layouts accepts the exchange") and in the comment above sanity-pfl test_36 ("needs fchown on volatile") could be updated to match.
reply PS20 2026-10-20 23:14 Gerrit AI review for Lustre lfs.c:1920 — (style) This isn't a bug, but this kernel-doc block describes migrate_stripe_copy_data(), while it sits directly above migrate_stripe_copy_r
Gerrit AI review for Lustre PS20 · 2026-10-20 23:14
(style) This isn't a bug, but this kernel-doc block describes migrate_stripe_copy_data(), while it sits directly above migrate_stripe_copy_region(), which has its own comment block right after it. The same thing happens further down: the "Resolve OST object FID for stripe @stripe_index ..." block sits above struct migrate_stripe_info and is followed by a second description of migrate_stripe_get_ost_fid(). If the patch is refreshed, could each block be moved to (or merged into) the function it describes?
reply PS20 2026-10-20 23:14 Gerrit AI review for Lustre lfs.c:2288 — (minor) Can LOV_USER_MAGIC_SPECIFIC actually come back from the lustre.lov xattr of a regular file? lod only emits LOV_MAGIC_SPECIFIC for di
Gerrit AI review for Lustre PS20 · 2026-10-20 23:14
(minor) Can LOV_USER_MAGIC_SPECIFIC actually come back from the lustre.lov xattr of a regular file? lod only emits LOV_MAGIC_SPECIFIC for directory default layouts (lod_lov.c: `if (is_dir && lod_comp->llc_ostlist.op_count) magic = LOV_MAGIC_SPECIFIC;`), and lov_lsm_pack() writes V1/V3 for file components. If it were ever reached, it would also be parsed wrongly: SPECIFIC uses the lov_user_md_v3 shape (with lmm_pool_name), but the code takes `v1->lmm_objects` for it. The same applies to the plain-layout branch below. If the patch is refreshed, consider dropping SPECIFIC from both checks.
reply PS20 2026-10-20 23:14 Gerrit AI review for Lustre lfs.c:2933 — (suggestion) If the MDS does not negotiate OBD_CONNECT2_ONE_OBJ_SWAP, the -EOPNOTSUPP only appears at the end, in ll_swap_layouts(). By then
Gerrit AI review for Lustre PS20 · 2026-10-20 23:14
(suggestion) If the MDS does not negotiate OBD_CONNECT2_ONE_OBJ_SWAP, the -EOPNOTSUPP only appears at the end, in ll_swap_layouts(). By then the volatile has been created on the target OST and the whole stripe has been copied. This loop then repeats that full copy for every remaining FILE operand. For the many-file OST drain that the man page describes, could the loop stop after the first -EOPNOTSUPP, or could support be checked once before any copying starts?
tags: pt_ecro
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS20 uploaded 16d ago · NEW · open in Gerrit ↗
commit message
LU-20541 lfs: Implement migrate_stripe command and add test

Add lfs migrate_stripe to move OST objects of a file onto another
OST using a single-stripe volatile partner and llapi_fswap_layout_fids().
Accepts multiple FILE operands, migrating each one in turn with the
same options, to make draining many files off an OST convenient.

-i selects a source OST index rather than a stripe index: with
multiple FILE operands the stripe holding data for a given source
OST differs from file to file, so identifying it by index would not
make sense. Instead every stripe currently on the source OST is
migrated to the target OST, including repeats of the same OST within
one component or across components, unless -I restricts the scan to
a single component.

Copy follows absolute LOV stripe numbering and object offsets, keeps
holes sparse, and ftruncates the volatile so trailing holes still
carry file size without SOM. Match source uid/gid on the volatile for
mdd_swap_layouts(). Default path is optimistic (DV check at swap);
--lock-copy holds a group lock across copy and swap.

Clamp the copy end from st_size after reading dv_src (under the group
lock for --lock-copy) so a concurrent append cannot leave the new
stripe short while CHECK_DV1 still matches.

llapi_layout_comp_flags_get() always reports LCME_FL_INIT clear for
a plain (non-composite) layout, so skip that check unless the layout
is actually composite; otherwise every stripe of a plain-layout file
would be silently skipped as "uninstantiated".

Document in lfs-migrate_stripe.1. sanity-pfl 30-39 cover content,
holes, PFL offsets, size, absolute striping, root on user files,
past-EOF components, an OST reused multiple times in a component,
and migrating multiple FILE operands in one invocation. Test 39
covers migrate_stripe on a plain (non-PFL) layout.

Test 32 is skipped on ZFS as we do not yet have FIEMAP support. LU-1941

Test-Parameters: trivial
Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com>
Change-Id: I48be7e597544c6856fdcf8edbd181b9f8d3db263
69205 master J !B ✓T ✓R 0/2
LU-20783 llite: ignore nolock, remove LL_IOC_SETFLAGS
reviewing patrick bot · CI green — awaiting your review
bot-ci-generatedpw_own CI@PS2 M +49 −87
5d
janitor run: 2 failing config(s), none unique to this patch — janitor results
no vote yet: Qian Yingjin, Andreas Dilger, Lai Siyao, Patrick Farrell
patchsets: PS1 09-25 PS2 10-01 PS3 10-09 Patrick Farrell
tags: bot-ci-generated pw_own
build/test results are from PS2 — PS3…PS3 changed only the commit message (votes copied, CI not re-run)
owner patrick bot · uploader Patrick Farrell · PS3 uploaded 26d ago · NEW · open in Gerrit ↗
commit message
LU-20783 llite: ignore nolock, remove LL_IOC_SETFLAGS

The nolock mount option and LL_IOC_SETFLAGS with
LL_FILE_IGNORE_LOCK both forced CILR_NEVER and
ci_no_srvlock, making buffered I/O both client- and
server-lockless. osc_req_attr_set() needs one of the two
to find a lock covering a dirty page when it builds a
writeback RPC; with neither, it LBUGs with "uncovered
page!" and "No lock resource". Direct I/O does not need
either interface: it is already client-lockless by
default, and normally still takes a server-side extent
lock per RPC, which these interfaces also dropped for no
benefit.

nolock still mounts, but is now ignored with a console
warning. LL_IOC_SETFLAGS and LL_IOC_CLRFLAGS are removed;
their ioctl numbers and LL_FILE_IGNORE_LOCK stay reserved
in lustre_user.h, and now fall through to -ENOTTY. A caller
that used LL_IOC_SETFLAGS(LL_FILE_IGNORE_LOCK) to get an
O_DIRECT file fully lockless, such as IOR's
--posix.lustre.ignorelocks, will see that ioctl fail rather
than silently keep the lock it asked to drop.
ll_file_nolock(), CILR_NEVER and ci_no_srvlock, along with
the code paths that existed only to serve them, are removed
as unreachable.

ll_show_options() had two separate display bugs around
"nolock". LL_SBI_NOLCK has no paired positive "lock"
pattern, so its generic "no"-prefix on/off handling printed
",nolock" on every mount that never asked for it; fixed by
skipping that token in the loop, since it is now never set.
The other bug was the leading, comma-less print used for an
actual nolock mount, which ran straight into the "rw" the
VFS itself prints, showing up as "rwnolock"; fixed by
dropping that print along with the option's effect.

Reproduced by mounting with nolock and doing a buffered
write: writeback LBUGed in osc_req_attr_set() as above.
The same write now takes a normal lock and completes
cleanly. Added conf-sanity/163 to cover it.

Fixes: 3f3a24dc5d7d ("LU-3259 clio: cl_lock simplification")
Assisted-by: Codex:gpt-6.1-sol
Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com>
Change-Id: I689260706e82698efae846791246e35daba23820
69338 master J –B ✓T ✓R +1/2
LU-20856 llite: do not force commits on background writeback
reviewing Patrick Farrell · CI green — awaiting your review
pw_own M +85 −13
6d
build #134186 SUCCESS · tests all Maloo sessions
reviews: Keguang Xu +1 2026-10-23 02:45
no vote yet: Qian Yingjin, Andreas Dilger, Timothy Day
patchsets: PS1 09-30 PS2 10-21 patrick bot
tags: pw_own
owner Patrick Farrell · uploader patrick bot · PS2 uploaded 14d ago · NEW · open in Gerrit ↗
commit message
LU-20856 llite: do not force commits on background writeback

Background writeback runs whenever a client's dirty pages pass the
background threshold, which is normal for any client that is
writing. Since LU-16713 it is treated as memory reclaim, so every
background writeback pass sent an OST_SYNC for each stripe of
every file it visited, and busy clients produced storms of
forced journal commits on the OSTs.

Force a commit only for writeback started for page reclaim, which
LU-16713 added at the same time. Memory-limited cgroups do not
depend on the background commit: writers that write several times
their cgroup's limit with no fsync are not OOM-killed on cgroup v1
or v2 without it. Background writeback keeps the priority it gets
when the writer is over its dirty limit, so the active extent
flush from LU-19014 is unchanged.

Add sanity test 411c: with background writeback running for the
whole of a buffered write that never calls fsync, the client must
send far fewer OST_SYNC than OST_WRITE.

Fixes: 8aa231a99468 ("LU-16713 llite: writeback/commit pages under memory pressure")
Assisted-by: ClaudeCode:claude-opus-5-5
Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com>
Change-Id: I4b68f32e4939d16a56e06d2d2e39fe53b967bece
69162 master J ✓B ✓T ✓R 0/2
LU-20818 osc: spread RPC builds over the submitting node
reviewing Patrick Farrell · CI green — awaiting your review
pw_watch M +73 −4
6d
build #132329 SUCCESS · tests all Maloo sessions
no vote yet: Shaun Tancheff, Timothy Day
patchsets: PS1 09-23 PS2 09-25 patrick bot
tags: pw_watch
owner Patrick Farrell · uploader patrick bot · PS2 uploaded 40d ago · NEW · open in Gerrit ↗
commit message
LU-20818 osc: spread RPC builds over the submitting node

An unbound workqueue runs work in the affinity pod of the CPU
it was queued on, and since Linux 6.6 the default pod is the
last level cache; RHEL 9 carries that change.  From 7.1 the
default is an 8 core shard of the cache instead.  Where the pod
is one CCD of 8 CPUs, every OSC's RPC build still runs in the
submitter's CCD, and a single thread's striped IO gains little
over the system workqueue.  A module cannot change a
workqueue's scope.

Queue each OSC's writeback work at a core of the submitting
thread's node, in bit reversed order of the device index, so
consecutive OSCs are far apart in the node's core order.  Only
the first thread of each core is used: SMT siblings share a
cache, so a second OSC landing on one would build in the
first's pod.  Core order is not pod order, so this spreads the
OSCs well rather than perfectly.

An unplug is queued on every extent release and RPC completion,
so the chosen CPU is kept on the client rather than walking the
node's CPU mask each time.  There is one slot, so an OSC whose
unplugs arrive from two nodes recomputes whenever the node
changes; it is the single node case that the walk cost hurts.

Assisted-by: ClaudeCode:claude-opus-5
Signed-off-by: Patrick Farrell <patrick@thelustrecollective.com>
Change-Id: I70dd11726cd1fd3e05ba04ad402de6ac19144e01
66255 master J –B ✓T ✓R +2/2
LU-19712 utils: Handle migrate/mirror on pinned files
reviewing Nikos Papakonstantinou · CI green — awaiting your review
1 unresolved XL +1886 −35
7d
build #134268 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger +1 2026-10-29 08:55 · Sebastien Buisson +1 2026-10-26 12:35
patchsets:
+43 earlier PS1 05-28 PS2 05-28 PS3 05-29 PS4 05-29 Janitor Bot PS5 06-04 PS6 06-05 PS7 06-05 PS8 06-08 PS9 06-10 PS10 06-14 PS11 06-15 PS12 06-22 PS13 07-09 PS14 07-10 PS15 07-10 PS16 07-13 PS17 07-14 PS18 07-15 PS19 07-15 PS20 07-16 PS21 07-17 PS22 07-20 PS23 07-20 PS24 07-30 PS25 07-30 PS26 07-31 PS27 08-07 PS28 08-20 PS29 08-26 PS30 08-27 PS31 08-27 PS32 08-27 PS33 09-01 PS34 09-04 PS35 09-04 PS36 09-08 PS37 09-14 PS38 09-15 PS39 09-15 PS40 09-23 PS41 10-01 PS42 10-08 PS43 10-14
PS44 10-16 PS45 10-19 PS46 10-21 PS47 10-22 PS48 10-22
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS48 2026-10-29 08:57 Andreas Dilger lfs.c:6589 — On the other hand, moving this blob out-of-line of the caller probably makes it easier to read, even if the function is only used once.
Sebastien Buisson PS48 · 2026-10-26 12:35
I appreciate it needs quite some work to print the correct message, but I am not sure it deserves a dedicated function, as this code is only used once in `setstripe_pool_pin_check`.
Andreas Dilger PS48 · 2026-10-29 08:57
On the other hand, moving this blob out-of-line of the caller probably makes it easier to read, even if the function is only used once.
owner Nikos Papakonstantinou · uploader Nikos Papakonstantinou · PS48 uploaded 13d ago · NEW · open in Gerrit ↗
commit message
LU-19712 utils: Handle migrate/mirror on pinned files

Add a safety gate to lfs setstripe/migrate/mirror operations that
respects a file's lustre.pin pool constraints:

- migrate requires the new layout to keep a whole mirror on every
  pinned pool that has one, and on at least one pinned pool; an
  exclusive pin also needs every component on a pinned pool, and no
  component may use a denied pool. A flat/omitted --pool falls back
  to the pool the MDS would itself assign from the target
  directory's default layout, so an in-place restripe still
  succeeds; --restripe is checked against that whole default. A
  bare "lfs migrate FILE" keeps the file's own layout, so it skips
  the pin check, but components naming no pool still pick up the
  directory default, which must not be denied or fall outside an
  exclusive pin. MDT-only migrate (-m) is not covered.
- mirror extend and component-add only add data alongside what is
  already there, so only an exclusive pin or a deny_pool constraint
  restrict the new components; a plain pin is satisfied by the
  untouched existing copy.
- mirror split and mirror delete are rejected only if removing the
  targeted mirror would leave no other whole mirror on a pinned pool.
- mirror create is not covered: it always targets a file with no
  existing layout.
- DoM and foreign components carry no OST pool and are skipped.

mirror split/delete's selector and the pin gate's survivor check
share one resolve_split_mirror_id() helper, so they can't disagree
about which mirror is targeted.

The pool inferred for lfs pool pin/unpin and lfs setstripe --pin also
skips DoM and foreign components, so a file whose first component is
DoM infers its first OST pool instead of none, and mirror_split() now
returns an error when it cannot open the file.

Also add llapi_pool_is_denied_fd()/_file()/_fid() to
include/lustre/lustreapi.h alongside the existing is_pinned trio,
with a matching man3 page. The gate parses each file's lustre.pin
once.

Signed-off-by: Nikos Papakonstantinou <npapakonstantinou@ddn.com>
Change-Id: I748ff8d2af4d4ca914ed123b5edba1f28ccef3dd
69949 master J –B ✓T ✓R +1/2
LU-21020 lov: wait for mirror once all were tried
reviewing Markus Hilger · CI green — awaiting your review
M +65 −6
7d
build #134487 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger +1 2026-10-28 20:26
no vote yet: Keguang Xu
patchsets: PS1 10-22 PS2 10-24 PS3 10-26
owner Markus Hilger · uploader Markus Hilger · PS3 uploaded 9d ago · NEW · open in Gerrit ↗
commit message
LU-21020 lov: wait for mirror once all were tried

When fast mirror switching has tried all mirrors of a file,
lov_io_mirror_init() sets ci_tried_all_mirrors but leaves ci_ndelay
set, so the lock enqueue and BRW of the next try still carry
LDLM_FL_NDELAY and OBD_BRW_NDELAY. They fail at once with -EAGAIN,
and cl_io_loop() returns -EIO. A read of a mirrored file fails while
its OSTs are in failover, where a read of a file with one mirror
waits for them.

Clear ci_ndelay once ci_tried_all_mirrors is set, so that every user
of it waits for the OSTs in that round. This includes the glimpse of
stat(), which now waits as well instead of failing. EC IO keeps
ci_ndelay: it rebuilds a failed stripe from parity and decides on its
own when to wait.

ll_file_io_generic() carried ci_ndelay_tried across every restart of
a read, also those that moved data, so ci_tried_all_mirrors came up
in a long read while a mirror could still serve it. Carry it only
across restarts that moved no data, so that it means all mirrors
failed.

cl_io_loop() mapped -EAGAIN to -EIO in that round only while
ci_ndelay was set. Check ci_tried_all_mirrors first, so that an
-EAGAIN which does not come from the non-delay flags, e.g. from a
component that is not valid, still ends as -EIO and not -EAGAIN.

Add sanity-flr test_33f.

Test-Parameters: testlist=sanity-flr env=ONLY=33,ONLY_REPEAT=5
Fixes: f5564c35ede1 ("LU-16935 llite: avoid hopeless i/o repeats")
Signed-off-by: Markus Hilger <markus.hilger@megware.com>
Change-Id: I22d9f3b989e655add8a5fc8d69fe6eae34445e4f
68994 master J –B ✓T ✓R -1/2−
LU-20765 osc: avoid RCU stalls during eviction page discard
reviewing Lai Siyao · CI green — awaiting your review (needs rebase first)
needs rebase 5 unresolved S +36 −2
12d
CI green — awaiting your review (needs rebase first)
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked
build #134266 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger
patchsets: PS1 09-17 PS2 09-17 PS3 10-22
threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS3 2026-10-24 06:32 Gerrit AI review for Lustre COMMIT_MSG:19 — (minor) The description of the mechanism doesn't quite match what cond_resched() does. It doesn't reschedule unconditionally. __cond_resched
Gerrit AI review for Lustre PS3 · 2026-10-24 06:32
(minor) The description of the mechanism doesn't quite match what cond_resched() does. It doesn't reschedule unconditionally. __cond_resched() still calls preempt_schedule_common() only when should_resched(0) is true, so the old and new code yield the CPU in exactly the same cases.

The real difference is in the no-resched path. On !CONFIG_PREEMPT_RCU kernels it calls rcu_all_qs(), which reports a quiescent state once RCU has set rcu_urgent_qs. Guarding cond_resched() with need_resched() skips that call. kernel/rcu/tree.c calls this out: "some in-kernel loops check need_resched() before calling cond_resched(), which defeats the above code".

If the patch is refreshed, could the message say that the fix is to let cond_resched() report an RCU quiescent state between batches? The soft-lockup and NMI hard-LOCKUP claims also look out of reach for this change. The soft-lockup watchdog's stopper thread sets need_resched, which the old code already honoured. A hard LOCKUP needs IRQs disabled, and they aren't disabled anywhere in this loop.
reply PS3 2026-10-24 06:32 Gerrit AI review for Lustre osc_cache.c:3548 — (minor) Is "simulate a slow discard" accurate here? The discard runs in (*cb)() after oo_tree_lock is dropped. OBD_FAIL_OSC_SLOW_PAGE_EVICT
Gerrit AI review for Lustre PS3 · 2026-10-24 06:32
(minor) Is "simulate a slow discard" accurate here? The discard runs in (*cb)() after oo_tree_lock is dropped. OBD_FAIL_OSC_SLOW_PAGE_EVICT (sanity test_903) already covers a slow discard outside the lock.

This delay sits before the spin_unlock() and before the changed cond_resched(). So it injects a long lock hold that the fix can't affect. Any writer contending on oo_tree_lock spins with preemption disabled for the whole delay.

Also, with fail_val left unset the default busy-wait is 20s under a spinlock. That reaches the default soft-lockup threshold (2 * watchdog_thresh), so the fault injection can trigger the very warning the patch is meant to prevent.
reply PS3 2026-10-24 06:32 Gerrit AI review for Lustre osc_cache.c:3589 — (minor) If the patch is refreshed: cond_resched() only yields when a reschedule is already pending. What changes here is that it now also re
Gerrit AI review for Lustre PS3 · 2026-10-24 06:32
(minor) If the patch is refreshed: cond_resched() only yields when a reschedule is already pending. What changes here is that it now also reports an RCU quiescent state via rcu_all_qs(). Something like "let cond_resched() report an RCU quiescent state" would describe the change more accurately than "yield".
reply PS2 2026-10-11 14:33 Andreas Dilger recovery-small.sh:3900 — (style) "nsec" looks like "nanoseconds", use "delay" or similar (should not "sleep" or "wait" that shadow shell functions)
Andreas Dilger PS2 · 2026-10-11 14:33
(style) "nsec" looks like "nanoseconds", use "delay" or similar (should not "sleep" or "wait" that shadow shell functions)
reply PS3 2026-10-24 06:32 Gerrit AI review for Lustre recovery-small.sh:3918 — As written, does this test pass identically with and without the cond_resched() change? The fail_loc is one-shot (0x80000000). It fires once
Gerrit AI review for Lustre PS3 · 2026-10-24 06:32
As written, does this test pass identically with and without the cond_resched() change? The fail_loc is one-shot (0x80000000). It fires once, before the unlock, and 10s is below the default RCU stall and soft-lockup thresholds. The only check is client_up. Nothing looks for an "rcu.*stall" or "soft lockup" message in dmesg, and nothing exercises the many-batch path that the fix changes.

So it doesn't seem to deliver the "RCU stall reproducer" or "guard against reintroducing a long hold" described in the commit message. One option is a per-batch delay outside the lock (like OBD_FAIL_OSC_SLOW_PAGE_EVICT, but busy-waiting), run long enough to pass jiffies_till_sched_qs, followed by a dmesg check.

While at it, a stack_trap to remove the 256MB file would clean up after a failure too.
owner Lai Siyao · uploader Lai Siyao · PS3 uploaded 13d ago · NEW · open in Gerrit ↗
commit message
LU-20765 osc: avoid RCU stalls during eviction page discard

On eviction osc_page_gang_lookup() walks the object page tree under
osc_object::oo_tree_lock and discards cached pages in batches.  For
a large object this loop can run for a very long time (see LU-14711:
discarding 750GB takes over 170s).  The loop only called
cond_resched() when need_resched() was already set, so on
voluntary-preempt kernels it could monopolise the CPU across many
batches - even though the tree lock is dropped between them - long
enough to trip the soft-lockup / RCU-stall watchdog and, under an
eviction storm, escalate to an NMI hard-LOCKUP.

Reschedule unconditionally between batches.  The tree lock is
already released at that point, so yielding is safe and keeps each
lock hold short.

Also add OBD_FAIL_OSC_EVICT_HOLD_LOCK and recovery-small test_164,
which holds oo_tree_lock across a dirty-page discard to
deterministically exercise this path and guard against
reintroducing a long hold of the page-tree lock during eviction.

Signed-off-by: Lai Siyao <lai.siyao@whamcloud.com>
Assisted-by: AugmentCode:Opus-4.8 llm_code_and_review_tools
Change-Id: Ibd2578cab278f1d4fd18378f1d27006d6d085945
61016 master J –B ✓T ✓R -1/2−
LU-13638 ptlrpc: delay to handle the req_unlinked
reviewing Yang Sheng · CI green — awaiting your review (needs rebase first)
needs rebase 27 unresolved M +156 −30
14d
CI green — awaiting your review (needs rebase first)
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked
failed enforced testplatformdetail
review-dne-part-5 RHEL 9.7 / x86_64 ran 5 tests. 1 tests failed: sanityn. session
review-dne-zfs-part-1 RHEL 9.8 / x86_64 ran 3 tests. 1 tests failed: sanity. session
build #134007 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Lai Siyao, Andreas Dilger
patchsets:
+9 earlier PS1 09-01 PS2 09-03 PS3 09-04 PS4 09-29 PS5 10-27 PS6 01-13 PS7 03-06 PS8 03-20 PS9 06-09
PS10 09-10 PS11 09-10 PS12 09-14 PS13 09-16 PS14 10-19
threads: 27 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS11 2026-09-12 01:27 Gerrit AI review for Lustre COMMIT_MSG:13 — (minor) The body describes only the ptlrpc_client_recv_or_unlink() change. Several other behaviour-changing hunks are not mentioned:
Gerrit AI review for Lustre PS11 · 2026-09-12 01:27
(minor) The body describes only the ptlrpc_client_recv_or_unlink() change. Several other behaviour-changing hunks are not mentioned:

- ptlrpc_req_put() moves from request_out_callback() to reply_in_callback(), so the ptl_send_rpc() reference changes owner
- the new on-wire MSG_WAIT_OUTACK flag
- ptlrpc_wait_ack_list and its teardown in ptlrpc_exit_portals()
- the new OBD_FAIL_PTLRPC_REQ_ACK_LOST fail_loc
- the RMMOD_AWARE change in test-framework.sh cleanupall()

Could these be covered in the message, and could the reference-ownership change in particular be spelled out? It is the part of the patch with the widest blast radius.
reply PS11 2026-09-12 01:27 Gerrit AI review for Lustre COMMIT_MSG:14 — (minor) If MSG_WAIT_OUTACK stays in lustre_idl.h, this changes an on-wire definition and would be worth an interop run, e.g.
Gerrit AI review for Lustre PS11 · 2026-09-12 01:27
(minor) If MSG_WAIT_OUTACK stays in lustre_idl.h, this changes an on-wire definition and would be worth an interop run, e.g.

    Test-Parameters: serverversion=2.16 clientversion=2.16

If the flag becomes a purely in-memory rq_* bit instead, this does not apply.
reply PS12 2026-09-14 20:39 Gerrit AI review for Lustre COMMIT_MSG:9 — (minor) Removing the rq_req_unlinked wait has landed and been reverted twice already:
Gerrit AI review for Lustre PS12 · 2026-09-14 20:39
(minor) Removing the rq_req_unlinked wait has landed and been reverted twice already:

    babf0232273 ("LU-13368 lnet: discard the callback")
      reverted by fc28666b2f ("LU-14499 lnet: Revert \"LU-13368 lnet: discard the callback\"")
    a6886dba0ed ("LU-17379 ptlrpc: fix check for callback discard")
      reverted by 394de8d9066 ("LU-17704 revert: \"LU-17379 ptlrpc: fix check for callback discard\"")

Could the message say what those attempts got wrong and why keeping the buffer on a wait-ack list avoids it? Without that a future reader has no way to tell this apart from a third attempt at the same thing.
reply PS13 2026-09-18 03:12 Gerrit AI review for Lustre COMMIT_MSG:14 — (minor) This fixes a real hang/timeout, so a Fixes: trailer would help the maintenance branches pick it up. The `!req->rq_req_unlinked ||` t
Gerrit AI review for Lustre PS13 · 2026-09-18 03:12
(minor) This fixes a real hang/timeout, so a Fixes: trailer would help the maintenance branches pick it up. The `!req->rq_req_unlinked ||` term being removed from ptlrpc_client_recv_or_unlink() was added by:

    Fixes: b8e981df1ae9 ("LU-5696 ptlrpc: missing wakeup for ptlrpc_check_set")

That commit converted rq_req_unlink/rq_reply_unlink into status bits and made the client wait for the request-buffer unlink as well as the reply unlink, which is the wait this patch drops.
reply PS11 2026-09-12 01:27 Gerrit AI review for Lustre lustre_idl.h:638 — (defect) pb_flags is sent to the server, so this consumes one of the few remaining on-wire flag bits for state that is purely client-local,
Gerrit AI review for Lustre PS11 · 2026-09-12 01:27
(defect) pb_flags is sent to the server, so this consumes one of the few remaining on-wire flag bits for state that is purely client-local, and the flag is then transmitted on any resend or replay of the request. MSG_WAIT_OUTACK has no meaning to a peer.

Could this be a bit in struct ptlrpc_request instead of a lustre_idl.h flag? If it does have to stay on the wire, wirecheck.c and both wiretest.c copies would need the matching entries.
reply PS11 2026-09-12 01:27 Gerrit AI review for Lustre lustre_net.h:2468 — (typo) "sometiem" -> "sometime". The last sentence also reads a little oddly - maybe "Just keep the request buffer until the ACK arrives."
Gerrit AI review for Lustre PS11 · 2026-09-12 01:27
(typo) "sometiem" -> "sometime". The last sentence also reads a little oddly - maybe "Just keep the request buffer until the ACK arrives."
reply PS11 2026-09-12 01:27 Gerrit AI review for Lustre lustre_net.h:2476 — (defect) This writes into rq_reqmsg, and the condition guarding it is !rq_req_unlinked - that is, LNet still owns rq_reqbuf and may still be
Gerrit AI review for Lustre PS11 · 2026-09-12 01:27
(defect) This writes into rq_reqmsg, and the condition guarding it is !rq_req_unlinked - that is, LNet still owns rq_reqbuf and may still be transmitting from it. lustre_msg_add_flags() does a read-modify-write of pb_flags in that live buffer.

For null sec rq_reqmsg == rq_reqbuf, so this is the exact memory that was handed to LNetMDBind()/LNetPut(). Under gss integrity the checksum was already computed over the pre-modification bytes.

A bit in struct ptlrpc_request (e.g. rq_wait_outack:1, set under rq_lock which is already held here) would avoid touching the buffer at all.
reply PS11 2026-09-12 01:27 Gerrit AI review for Lustre lustre_net.h:2478 — (defect) Dropping the rq_req_unlinked term also lets the request go back through ptl_send_rpc() while the previous request MD is still bound
Gerrit AI review for Lustre PS11 · 2026-09-12 01:27
(defect) Dropping the rq_req_unlinked term also lets the request go back through ptl_send_rpc() while the previous request MD is still bound. On a reply timeout rq_reply_unlinked is set by the reply-MD unlink, rq_receiving_reply is 0, so this returns 0, ptlrpc_check_set() advances the phase and the rq_timedout branch resends.

ptl_send_buf() then does LNetMDBind(&md, LNET_UNLINK, &request->rq_req_md_h) over the live handle: the old MD can no longer be unlinked, two MDs point at the same rq_reqbuf while ptl_send_rpc() rewrites the handle, conn_cnt, xid and MSG_RESENT in it, and when the old MD's SEND event finally arrives request_out_callback() sets rq_req_unlinked (and possibly rq_net_err) against the new attempt.

This is the timeout-then-resend case the patch is aimed at, so it would be good to have something that keeps the second send from starting while the first MD is live.
reply PS13 2026-09-18 03:12 Gerrit AI review for Lustre lustre_net.h:2463 — (minor) With the rq_req_unlinked term gone, this rq_req_deadline early return is the only request-side gate left, and it is set purely by fa
Gerrit AI review for Lustre PS13 · 2026-09-18 03:12
(minor) With the rq_req_unlinked term gone, this rq_req_deadline early return is the only request-side gate left, and it is set purely by fault injection (OBD_FAIL_PTLRPC_LONG_REQ_UNLINK in ptlrpc_request_pack()). Nothing else reads rq_req_deadline.

So recovery-small test_115a/115b/115f/115g ("late REQ MDunlink") now exercise a simulated wait that no production path can enter. Should the deadline, the fail_loc and those cases be retired along with the condition, or is the deadline still meant to serve a purpose here?
reply PS4 2025-09-29 12:12 Alexey Lyashkov client.c:2868 — rq_set can't be used where.
Alexey Lyashkov PS4 · 2025-09-29 12:12
rq_set can't be used where.
reply PS11 2026-09-12 01:27 Gerrit AI review for Lustre client.c:2921 — (defect) MSG_WAIT_OUTACK is never cleared once ptlrpc_client_recv_or_unlink() sets it, so this test does not mean "the out ACK is still outs
Gerrit AI review for Lustre PS11 · 2026-09-12 01:27
(defect) MSG_WAIT_OUTACK is never cleared once ptlrpc_client_recv_or_unlink() sets it, so this test does not mean "the out ACK is still outstanding" at put time - it means "it was outstanding at some point".

In the common case the callback arrives microseconds later and sets rq_req_unlinked, but the flag is still set here, so wait_ack is 1 and __ptlrpc_free_req() parks the request and its reqbuf on ptlrpc_wait_ack_list, where nothing frees them until ptlrpc_exit_portals(). Every RPC that ever loses that race leaks for the life of the module.

Would testing !request->rq_req_unlinked here (the state that actually says LNet still owns the buffer) work instead?
reply PS12 2026-09-14 20:39 Gerrit AI review for Lustre client.c:2445 — (defect) This store is not under rq_lock, but rq_wait_outack lives in the bitfield word that lustre_net.h documents as "client-side flags ar
Gerrit AI review for Lustre PS12 · 2026-09-14 20:39
(defect) This store is not under rq_lock, but rq_wait_outack lives in the bitfield word that lustre_net.h documents as "client-side flags are serialized by rq_lock", alongside rq_req_unlinked, rq_reply_unlinked and rq_net_err.

request_out_callback() does its own read-modify-write of that word (rq_req_unlinked = 1, rq_net_err = 1) while holding rq_lock. Two unsynchronized RMWs on the same word lose one of the updates:

  - rq_wait_outack lost  -> __ptlrpc_free_req() frees the request and rq_reqbuf while the MD is still live, which is exactly what this patch is trying to prevent
  - rq_req_unlinked / rq_net_err lost -> the send failure is never seen

The rq_req_unlinked read in the condition above is unsynchronized for the same reason, so the decision itself can be made on a stale value.
owner Yang Sheng · uploader Yang Sheng · PS14 uploaded 16d ago · NEW · open in Gerrit ↗
commit message
LU-13638 ptlrpc: delay to handle the req_unlinked

We ignore the req_unlinked flag in sending process
since sometime the reply could be received before
request out callback was invoked. In such case we
should go ahead despite the md unlink ACK. Just
keep the request buffer until it arrived.

Signed-off-by: Yang Sheng <ys@whamcloud.com>
Change-Id: I4969ed4473358dba89a82b38f230405cce7d9a1b
69716 master J –B ✓T ✓R +1/2
LU-20924 ldiskfs: allocate hybrid metadata in IOPS groups
reviewing Andreas Dilger · CI green — awaiting your review
2 unresolved XL +7153 −1728
16d
build #133764 SUCCESS · tests all Maloo sessions
reviews: Artem Blagodarenko +1 2026-10-19 14:38
no vote yet: Li Dongyang
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-10-19 17:28 Andreas Dilger ext4-mballoc-for-hybrid.patch:157 — Minor nit to fix if patch is refreshed for some other reason.
Gerrit AI review for Lustre PS1 · 2026-10-18 01:08
(minor) If the patch is refreshed: ext4_mb_scan_state_next() also lets data use these clusters when the blocks are delalloc-reserved, even with mb_enable_iops_data=0, so "can only use if mb_enable_iops_data is set" isn't quite accurate. The same comment is in the other copies.
Andreas Dilger PS1 · 2026-10-19 17:28
Minor nit to fix if patch is refreshed for some other reason.
reply PS1 2026-10-19 17:28 Andreas Dilger ext4-mballoc-for-hybrid.patch:727 — Seems reasonable if patch is refreshed. As-is this patch is fixing significant issues with the IOPS allocation, and delalloc is not used by
Gerrit AI review for Lustre PS1 · 2026-10-18 01:08
(defect) With mb_enable_iops_data=0, can delalloc data land in IOPS groups even though the HDD groups still have usable space?

This fallback runs inside ext4_mb_regular_allocator(), so ext4_mb_new_blocks() never gets to its usual ENOSPC recovery before IOPS blocks are used:

    ext4_mb_new_blocks()
      ext4_mb_regular_allocator()
        NON_IOPS pass fails
        ext4_mb_scan_state_next() -> IOPS pass (DELALLOC_RESERVED)
      /* never reached: */
      ext4_mb_discard_preallocations_should_retry()

Other inodes' PAs and the locality-group PAs show as used in the buddy but free in s_freeclusters_counter. So when an HDD region is nearly full and most of its free space is held in PAs, the NON_IOPS pass fails and writeback goes straight to flash. Without this patch, those PAs would be discarded and the allocation retried on HDD.

The same thing happens with blocks freed in the running transaction: ext4_do_writepages() would force a commit and retry on -ENOSPC, but the fallback gets there first.

Could the delalloc IOPS fallback be held back until the PA discard retries are used up (e.g. only once EXT4_MB_STRICT_CHECK is set), or moved into ext4_mb_new_blocks() after the retry loop? The same code is in the rhel8, rhel9.4, rhel10.0, rhel10.2 and linux-6.12 copies.
Andreas Dilger PS1 · 2026-10-19 17:28
Seems reasonable if patch is refreshed.  As-is this patch is fixing significant issues with the IOPS allocation, and delalloc is not used by Lustre today so that would only affect a local ldiskfs mount.  That might happen during a whole-target backup/restore via tar, but that is also unlikely for OSTs (which can do online migration/evacuation), and is typically only used for MDTs (which are invariably all-flash anyway).
owner Andreas Dilger · uploader Andreas Dilger · PS1 uploaded 20d ago · NEW · open in Gerrit ↗
commit message
LU-20924 ldiskfs: allocate hybrid metadata in IOPS groups

Previously, on a hybrid ldiskfs with EXT4_BG_IOPS groups on flash,
directory, xattr and extent index blocks were almost never allocated
in the IOPS groups.  The goal group and the s_mb_max_linear_groups
linear scan were tried before the IOPS lists, and the metadata goal
was in the HDD groups next to the inode.  The IOPS lists were only
searched at the two fast criteria, and only once a group's buddy was
loaded, so metadata fell back to HDD whenever those missed.  The data
fallback into IOPS groups at CR_ANY_FREE was dead code, and with
mb_enable_iops_data=1 data used IOPS groups as soon as the fast HDD
lists missed.  Free IOPS space was counted as available for data, so
with mb_enable_iops_data=0 a full HDD region made delalloc writeback
loop on ENOSPC, and statfs and OST grants reported space data could
not use.

Rework all copies of ext4-mballoc-for-hybrid.patch (rhel8, rhel9.4,
rhel10.0, rhel10.2, linux-6.12) and add it to the 7.0-ml and ubuntu26
series as linux-7.0, so each allocation has a scan state limiting it
to one class of groups.  Metadata (no EXT4_MB_HINT_DATA) searches only
IOPS groups through all criteria, from an IOPS goal mapped from its
original goal, and falls back to the non-IOPS groups only if that pass
fails.  Data searches only the non-IOPS groups, and IOPS groups only
after that and if mb_enable_iops_data is set or the blocks are
delalloc-reserved.  The class check in ext4_mb_good_group_nolock() and
ext4_mb_find_by_goal() covers the goal, linear and list scans, and the
IOPS pass scans linearly only a sorted array of the IOPS groups.  The
IOPS lists are the upper half of the existing list or xarray arrays,
replacing the _iops copies of the scan functions.

Track free IOPS clusters in a percpu counter, shown in sysfs file
mb_iops_free_clusters, and exclude them from the space available for
data unless mb_enable_iops_data is set, and search IOPS groups last
for metadata when none are free.  If only some inode tables are in
IOPS groups (flash appended to the filesystem), place new directory
inodes in groups whose inode table is in an IOPS group, spreading them
by name hash, randomly or by a hash of the parent's inode number.  Map
the data goal of files with inodes in IOPS groups onto the non-IOPS
groups.  Load the IOPS group buddies at mount and read-write remount.
Treat EA inode blocks, quota files, the orphan file (not on rhel8) and
files with the new EXT4_STATE_META_ALLOC inode state as metadata on
hybrid filesystems, so osd-ldiskfs can place its internal files and
llog headers in IOPS groups.  In the xarray copies, return after the
s_mb_max_linear_groups scan if it covered all groups (e.g. exactly
that many IOPS groups) and moved to the next criteria, which could
reach the WARN_ON() in ext4_mb_scan_groups() at CR_GOAL_LEN_SLOW.

Add conf-sanity test_170 to check placement, including quota files,
both fallbacks and the free IOPS cluster count.  Refresh the rhel8.8
fstrim patch context.

Placement on rhel9.7, 1000MiB dm-linear device, groups 0-3 IOPS:
                                      master        patched
  dir blocks in IOPS                  0/124         124/124
  xattr blocks in IOPS                0/40          40/40
  extent index blocks in IOPS         0/2           2/2
  data blocks in IOPS                 0             0
  dir blocks, IOPS full / freed       0/31 / 0/31   0/31 / 31/31
  data, HDD fragmented, iops_data=1   256/256       0/256
  dir inodes, itables in 24-31 IOPS   28/80         80/80

Fixes: 05e487a01b40 ("LU-16750 ldiskfs: optimize metadata allocation for hybrid LUNs")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools
Change-Id: I71c2e85f43279f01a507245371b5ed62d53ebbe5
69717 master J –B ✓T ✓R +1/2
LU-20924 osd-ldiskfs: allocate internal files as metadata
reviewing Andreas Dilger · CI green — awaiting your review
L +312 −17
16d
build #133765 SUCCESS · tests all Maloo sessions
reviews: Artem Blagodarenko +1 2026-10-19 15:20
no vote yet: Li Dongyang
owner Andreas Dilger · uploader Andreas Dilger · PS1 uploaded 20d ago · NEW · open in Gerrit ↗
commit message
LU-20924 osd-ldiskfs: allocate internal files as metadata

On hybrid flash/HDD ldiskfs targets, Lustre internal index and log
files are regular files, so ldiskfs allocates their blocks as data in
the HDD groups.  OI lookups are the main small random IO on an OST,
and the other IAM indexes and the last_rcvd, reply_data and LAST_ID
record files are updated in place like other metadata.

Set LDISKFS_STATE_META_ALLOC on these inodes before osd-ldiskfs
allocates blocks for them, so ldiskfs places them in the IOPS groups
like directories.  The state is set before every IAM block append and
every block allocation in osd_write() to a regular file, which is only
used for internal files.  Only the header (first 64KiB) of a plain
unnamed llog (changelog, OSP sync and DNE update llogs) is updated in
place, while the records are appended and written back by journal
checkpoint sequentially, so for these the state is set only while
allocating blocks in the first 64KiB and cleared for later blocks.
This is done under i_append_sem with each allocation, since changelog
and OUT update writes to one llog run in parallel, and the block
preallocation for llog appends stops at 64KiB.  They are identified by
their unnamed-llog or update-log FID sequence, and DNE update llogs by
their normal FID, which no other regular file written by osd_write()
has.  Named llogs (CONFIGS, changelog_users...) and catalogs are
long-lived, so they are fully metadata, catalogs recognized by
LLOG_F_IS_CAT in the llog header that llog_osd_write_rec() writes
before each record, or read from the first block once after the inode
is loaded.  OST object and DoM file data are written through the bulk
IO path and stay data.  The state is kept in memory only, so it also
applies to existing filesystems.

Add conf-sanity test_172 to check that directories, internal files,
named llogs, catalogs and llog headers of a hybrid MDT and OST are in
the IOPS groups and plain llog records and file data are not.

Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools
Change-Id: I3ec147655d3e3f111ccb08b342eef681bc3ebbe5
39732 master J ✗1B ✓T ✓R -2/2−
LU-13214 llite: pass error to upper layers
reviewing Alexander Boyko · CI green — awaiting your review (needs rebase first)
needs rebase M +96 −11
37d
CI green — awaiting your review (needs rebase first)
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
unique failing testhistory
sanity1@zfs:test_27TNEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews
2 optional test failure(s) — informational
build #103819 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Alexander Zarochentsev, Vitaly Fertman, Andreas Dilger, Patrick Farrell
patchsets:
+2 earlier PS3 12-16 PS4 12-18
PS5 02-19 PS6 02-28 PS7 03-08 PS8 03-25 PS9 04-03
owner Alexander Boyko · uploader Alexander Boyko · PS9 uploaded 946d ago · NEW · open in Gerrit ↗
commit message
LU-13214 llite: pass error to upper layers

vvp_io_write_start ignores error when some bytes were
written. For a stripe case this could lead to a wrong data
and wrong assumptions at user level. For example write at two
stripes, first is DOM was written 1 page from 16, seocond is OST
and was fully written. Data is [0:4096]-hole-[64K:1M], user level
see successfull write for 4096 bytes, and file position at the 1MB.

The patch passes error to the upper layer to notify caller about
write error.
Also sanity test 281 is added. Test simulate MDT enospace, this
leads to no grants on a client, and partial fail write data-hole-data.

HPE-bug-id: LUS-8414
Signed-off-by: Alexander Boyko <alexander.boyko@hpe.com>
Change-Id: I56ff460ca536549009ff2105669f4eed37021dde
45071 master J ✗4B ✓T ✓R -1/2−
LU-15016 osd: fix corrupted OI file online
reviewing Hongchao Zhang · CI green — awaiting your review
1 unresolved L +251 −43
49d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
unique failing testhistory
conf-sanity3@ldiskfs+DNE:test_109aNEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews
conf-sanity3@ldiskfs+DNE:test_150NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews
conf-sanity3@zfs:test_135seen in 55 other reviews
sanity2@ldiskfs+DNE:test_421hseen in 5 other reviews
1 optional test failure(s) — informational
build #103356 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger -1 2025-08-18 20:12
no vote yet: Qian Yingjin, Alexey Lyashkov
patchsets:
+3 earlier PS1 09-28 PS2 09-29 PS3 09-29
PS4 10-22 PS5 03-14 PS6 03-14 PS7 03-22 PS8 03-22
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS6 2024-03-22 04:02 Hongchao Zhang osd_oi.c:679 — If the old corrupted OI file has been deleted immediately because the Scrub thread was not
Andreas Dilger PS6 · 2024-03-14 07:17
(defect?) is there a danger that osd_scrub_start() is called but the started thread does not set scrub->os_running before mutex_unlock(&oi->oi_mutex) is called?  Otherwise, it looks like the above code to set ic_pending_delete = 1 could be called by another thread:

	if (bag->ic_stale) {
		if (!scrub->os_running) {
			spin_lock(&osd->od_oi_lock);
			osd->od_oi_table_old[index] = NULL;
			bag->ic_pending_delete = 1;
			spin_unlock(&osd->od_oi_lock);
		}

That would mean that the old OI file could be deleted *immediately* at "out" below, rather than stick around while scrub is being run? 

Setting "ic_stale = 1" *after* osd_scrub_start() returns would be better.  What happens if osd_scrub_start() fails?  Then the old OI file is already deleted and the new one will not be created?

Or maybe it would be better to check something like:

        if (scrub->os_file.sf_status == SS_COMPLETED)

instead of os_running?
Hongchao Zhang PS6 · 2024-03-22 04:02
If the old corrupted OI file has been deleted immediately because the Scrub thread was not
started normally, the following FID lookup will try to start Scrub thread again to fix it
in the new OI file.
If the old corrupted OI file was reserved if Scrub failed to start, it could need to wait
the completion of next Scrub to complete, could it be complex for just handling the error
case of Scrub start? or it could be more complicated if the new OI file encounters some error
during rebuilding the OI?
owner Hongchao Zhang · uploader Hongchao Zhang · PS8 uploaded 958d ago · NEW · open in Gerrit ↗
commit message
LU-15016 osd: fix corrupted OI file online

When the OI files are being used to lookup/insert/update FID/inode
pairs, if some of block is corrupted, the MDT was needed to umount
to fix it by deleting the corrupted file.

With this patch, it will recreate a new OI index file by OI scrub
and replace it online, the corrupted OI file will temporarily
be saved as "old" versions in memory for FID lookup while OI Scrub
rebuilds a new OI file. FIDs will only be added or deleted to/from
the "new" OI file, but until OI Scrub has finished scanning the whole
filesystem it is at least possible to find FIDs in the old OI
(if that part is not corrupted). If the FID is found in the old
OI file then it avoids returning -EINPROGRESS and blocking client
access to the filesystem while OI Scrub is running.

Signed-off-by: Hongchao Zhang <hongchao@whamcloud.com>
Change-Id: Id16414455aa7da928e86a78cc47f7db2d6f7550b
52166 master J ✓B ✓T ✓R -1/2−
LU-13814 osc: add osc_dio_page_submit
reviewing Patrick Farrell · CI green — awaiting your review (needs rebase first)
needs rebase M +42 −16
62d
CI green — awaiting your review (needs rebase first)
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked
failed enforced testplatformdetail
review-dne-part-3 RHEL 8.10 / x86_64 ran 3 tests. 1 tests failed: conf-sanity. session
review-dne-part-5 RHEL 8.10 / x86_64 ran 5 tests. 1 tests failed: sanityn. session
review-dne-part-8 RHEL 9.5 / x86_64 ran 4 tests. 1 tests failed: replay-dual. session
review-dne-zfs-part-1 RHEL 8.10 / x86_64 ran 3 tests. 1 tests failed: sanity. session
review-dne-zfs-part-2 RHEL 8.10 / x86_64 ran 11 tests. 1 tests failed: sanity-lnet. session
review-dne-zfs-part-7 RHEL 8.10 / x86_64 ran 5 tests. 1 tests failed: sanity-scrub. session
review-ldiskfs RHEL 8.10 / x86_64, RHEL 9.5 / x86_64 ran 5 tests. 1 tests failed: sanity. session
review-ldiskfs-ubuntu RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 ran 8 tests. 1 tests failed: sanity. session
review-zfs RHEL 8.10 / x86_64 ran 10 tests. 1 tests failed: replay-single. session
8 optional test failure(s) — informational
build #119017 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Marc Vef, Andreas Dilger
patchsets:
+31 earlier PS1 08-29 PS2 08-30 PS3 08-30 PS4 08-30 PS5 08-31 PS6 09-05 PS7 09-09 PS8 09-10 PS9 09-10 PS10 09-10 PS11 09-10 PS12 09-10 PS13 09-10 PS14 09-12 PS15 09-14 PS16 09-15 PS17 09-24 PS18 09-25 PS19 09-26 PS20 09-26 PS21 10-05 PS22 10-05 PS23 10-20 PS24 10-22 PS25 10-22 PS26 02-27 PS27 10-28 PS28 11-03 PS29 04-28 PS30 04-28 PS31 05-01
PS32 07-04 PS33 07-14 PS34 11-06 PS35 11-09 PS36 11-16
owner Patrick Farrell · uploader Patrick Farrell · PS36 uploaded 353d ago · NEW · open in Gerrit ↗
commit message
LU-13814 osc: add osc_dio_page_submit

This patch adds the osc_dio_page_submit and specializes
osc_page_submit to take only BIO pages.

Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Change-Id: I048bbcd25ffee28fbbd8fee26017796b5e3586bd
52182 master J !B ✓T ✓R 0/2
LU-13814 osc: simplify osc_dio_page_submit
reviewing Patrick Farrell · CI green — awaiting your review
stalled 341d S +10 −14
341d
janitor run: 3 failing config(s), none unique to this patch — janitor results
2 optional test failure(s) — informational
build #119105 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Marc Vef, Andreas Dilger
patchsets:
+32 earlier PS1 08-30 PS2 08-30 PS3 08-30 PS4 08-31 PS5 09-05 PS6 09-09 PS7 09-09 PS8 09-10 PS9 09-10 PS10 09-10 PS11 09-10 PS12 09-10 PS13 09-10 PS14 09-10 PS15 09-12 PS16 09-14 PS17 09-15 PS18 09-24 PS19 09-25 PS20 09-26 PS21 09-26 PS22 10-05 PS23 10-05 PS24 10-20 PS25 10-22 PS26 10-22 PS27 02-27 PS28 10-28 PS29 11-03 PS30 04-28 PS31 05-01 PS32 07-04
PS33 07-14 PS34 11-06 PS35 11-09 PS36 11-16 PS37 11-16
owner Patrick Farrell · uploader Patrick Farrell · PS37 uploaded 353d ago · NEW · open in Gerrit ↗
commit message
LU-13814 osc: simplify osc_dio_page_submit

Remove more code from osc_dio_page_submit, with the goal of
eliminating it entirely.

Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Change-Id: Id408aad01c2e81a126dd04807819aed9d29fca6b
52167 master J !B ✓T ✓R 0/2
LU-13814 osc: add osc_dio_completion
reviewing Patrick Farrell · CI green — awaiting your review
stalled 341d M +49 −32
341d
janitor run: 3 failing config(s), none unique to this patch — janitor results
2 optional test failure(s) — informational
build #119044 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Marc Vef, Andreas Dilger
patchsets:
+31 earlier PS1 08-29 PS2 08-30 PS3 08-30 PS4 08-30 PS5 08-31 PS6 09-05 PS7 09-09 PS8 09-10 PS9 09-10 PS10 09-10 PS11 09-10 PS12 09-10 PS13 09-10 PS14 09-12 PS15 09-14 PS16 09-15 PS17 09-24 PS18 09-25 PS19 09-26 PS20 09-26 PS21 10-05 PS22 10-05 PS23 10-20 PS24 10-22 PS25 10-22 PS26 02-27 PS27 10-28 PS28 11-03 PS29 04-28 PS30 05-01 PS31 07-04
PS32 07-14 PS33 11-06 PS34 11-09 PS35 11-16 PS36 11-16
owner Patrick Farrell · uploader Patrick Farrell · PS36 uploaded 353d ago · NEW · open in Gerrit ↗
commit message
LU-13814 osc: add osc_dio_completion

Specialize osc_completion to add the osc_dio_completion
version.

Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Change-Id: I4d202165ee6c4f50338b6a9381aa476b969d3593
61801 b2_15 J ✗2B ✓T ✓R +1/1
LU-19113 llite: cfs_delete_from_page_cache() keep page locked
reviewing Etienne AUJAMES · CI green — awaiting your review
stalled 376d S +6 −6
376d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
unique failing testhistory
recovery-small@ldiskfs+DNE:test_24bseen in 1 other review
replay-single1@ldiskfs+DNE:test_90seen in 1 other review
1 optional test failure(s) — informational
build #117871 SUCCESS · tests all Maloo sessions
reviews: Bruno Faccini +1 2025-10-24 12:43
no vote yet: Patrick Farrell
patchsets: PS1 10-13 PS2 10-24
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS2 uploaded 376d ago · NEW · backport · open in Gerrit ↗
commit message
LU-19113 llite: cfs_delete_from_page_cache() keep page locked

Like in other places where generic_error_remove_folio() is
also being called, in both Lustre and Kernel, page should not
be unlocked prior to call it in cfs_delete_from_page_cache().

This was also allowing a race where page->mapping may become
NULL.

Taking an extra reference is also useless if page not unlocked
anymore.

Lustre-change: https://review.whamcloud.com/59829
Lustre-commit: 3dec26990738ad3f5008d46ee9d3d03df7454925

Fixes: 738e69d4b9 ("LU-16292 llite: delete_from_page_cache not exported")
Signed-off-by: Bruno Faccini <bfaccini@nvidia.com>
Change-Id: If39575f4339afe460b3b1c955201e8f9cdfeb871
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Reviewed-by: Zhenyu Xu <bobijam@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
31596 master J ✓B ✓T ✓R -1/2−
LU-10781 test: Add sanity-flr test_33a
reviewing Sarah Liu · CI green — awaiting your review
stalled 464d M +52 −0
464d
build #8408 SUCCESS
reviews: Andreas Dilger -1 2020-01-31 06:12
no vote yet: James Nunez
owner Sarah Liu · uploader James Nunez · PS5 uploaded 2609d ago · NEW · open in Gerrit ↗
commit message
LU-10781 test: Add sanity-flr test_33a

Add sanity-flr test_33a to test OST fail senario
when reading is ongoing

Test-Parameters: trivial testlist=sanity-flr
Signed-off-by: Wei Liu <wei3.liu@intel.com>
Change-Id: I33c56f5552f567a94d000d01fc4967431df8423b
44765 master J !B ✓T ✓R +0/2−
LU-14794 utils: output text for lctl debug_daemon
reviewing Yang Sheng · CI green — awaiting your review
stalled 464d M +134 −62
464d
janitor run: 3 failing config(s), none unique to this patch — janitor results
build #23991 SUCCESS · tests all Maloo sessions
reviews: Emoly Liu +1 2021-11-12 03:26 · Andreas Dilger -1 2023-03-16 20:10
patchsets:
+3 earlier PS1 08-27 PS2 09-27 PS3 09-27
PS4 09-29 PS5 09-30 PS6 09-30 PS7 10-09 PS8 11-03
owner Yang Sheng · uploader Yang Sheng · PS8 uploaded 1827d ago · NEW · open in Gerrit ↗
commit message
LU-14794 utils: output text for lctl debug_daemon

Add a option to output log in text mode while debug
daemon running. It can be used to monitoring the log
rather than convert later.

Signed-off-by: Yang Sheng <ys@whamcloud.com>
Change-Id: I173fba77853c36484fefa1068fd8f098535bec6a
52613 master J !B ✓T ✓R 0/2
LU-17177 mdt: prevent read-on-open for FLR file
reviewing Mikhail Pershin · CI green — awaiting your review
stalled 464d S +45 −1
464d
janitor run: 3 failing config(s), none unique to this patch — janitor results
2 optional test failure(s) — informational
build #99307 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Andreas Dilger
owner Mikhail Pershin · uploader Mikhail Pershin · PS1 uploaded 1121d ago · NEW · open in Gerrit ↗
commit message
LU-17177 mdt: prevent read-on-open for FLR file

DoM read-on-open shouldn't fetch data for FLR file without
knowledge about mirror states. Also it is better to ignore
DoM component having STALE flag.

The following changes are proposed:
- no read-on-open data prefetch for FLR file
- no DoM lock/size returned if DoM component has stale FLR flag

Signed-off-by: Mikhail Pershin <mpershin@whamcloud.com>
Change-Id: I38a29d34f0c1d9f9bc56f362e49202e759f9e800
57655 b2_15 J ✓B ✓T ✓R 0/1
LU-16637 llite: tolerate fresh page cache pages after truncate
reviewing Etienne AUJAMES · CI green — awaiting your review
LTS15 stalled 537d M +63 −11
537d
build #113466 SUCCESS · tests all Maloo sessions
no vote yet: Andrew Perepechko
patchsets: PS1 01-06 PS2 05-16
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS2 uploaded 537d ago · NEW · backport · open in Gerrit ↗
commit message
LU-16637 llite: tolerate fresh page cache pages after truncate

Truncate called by ll_layout_refesh() can race with a fast read
or tiny write, which can add an uninitialized non-uptodate page
into the page cache.

We want to avoid expensive locking for this rare case so if there
is any leftover in the cache after truncate, just check that
the pages are not uptodate, not dirty and do not have any
filesystem-specific information attached to them.

Lustre-change: https://review.whamcloud.com/53554
Lustre-commit: 7bb1e211d217d5a82ac2d5e4edad5ae018090761

Change-Id: I8cadc022a3d1822a585f32e1a765e59ad0ff434d
Signed-off-by: Andrew Perepechko <andrew.perepechko@hpe.com>
HPE-bug-id: LUS-11937
Reviewed-by: Zhenyu Xu <bobijam@hotmail.com>
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
57668 b2_15 J !B ✓T ✓R +1/1
LU-18468 llapi: always truncate mirrors on resync
reviewing Etienne AUJAMES · CI green — awaiting your review
stalled 665d M +54 −11
665d
janitor run: 1 failing config(s), none unique to this patch — janitor results
build #110108 SUCCESS · tests all Maloo sessions
reviews: Alex Zhuravlev +1 2025-01-07 15:02
no vote yet: Andreas Dilger
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS1 uploaded 666d ago · NEW · backport · open in Gerrit ↗
commit message
LU-18468 llapi: always truncate mirrors on resync

When mirrors are synced, all mirrors should be truncated to
match the size of the source/primary mirror.  This was
skipped if the size was unaligned, but that is a mistake.

Lustre-change: https://review.whamcloud.com/57090
Lustre-commit: b5db891cad71f17dda00ab157332db819d2292f8

Test-Parameters: testlist=sanity-flr,sanity-flr,sanity-flr
Test-Parameters: testlist=sanity-pfl,sanity-pfl,sanity-pfl
Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Change-Id: I767a1b3ef58c855f57967228d37b04fa0ab87e57
Reviewed-by: Zhenyu Xu <bobijam@hotmail.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
50325 b2_12 J ✓B ✓T ✓R 0/1
LU-10810 osd: implement lseek method in OSD
reviewing Etienne AUJAMES · CI green — awaiting your review
stalled 1325d M +165 −42
1325d
build #93096 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger, Mikhail Pershin
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS1 uploaded 1328d ago · NEW · backport · open in Gerrit ↗
commit message
LU-10810 osd: implement lseek method in OSD

Introduce lseek support in dt_object methods and at OSD level

This is server support for SEEK_HOLE and SEEK_DATA distributed
request, it returns a resulting offset or error code

ZFS support is added as well but it is not yet available due to
missing export of dmu_offset_next() function.

Patch adds also osd_quasi_file() common method to create fake
file structure to use in inode i_fop calls

Lustre-change: https://review.whamcloud.com/39706
Lustre-commit: 947af94817f8eeb5e6108b0b3cde65419b13c8d3

Signed-off-by: Mikhail Pershin <mpershin@whamcloud.com>
Change-Id: I3802743e31c94d2de219b72a540c5df9c72f1897
Reviewed-by: Bobi Jam <bobijam@hotmail.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
▶

Awaiting review — CI not green yet

(38)
67507 master J –B ✓T …R 0/2
LU-6142 obdclass: add/use OBD_ALLOC_PTR_ARRAY[_LARGE]()
reviewing Andreas Dilger · awaiting review (CI not green yet)
pw_smallfix L +193 −213
3h
build #135466 SUCCESS · tests all Maloo sessions · test queue
no vote yet: Marc Vef, Alex Zhuravlev, Timothy Day
patchsets:
+7 earlier PS1 07-24 PS2 07-25 PS3 07-25 PS4 09-28 patrick bot PS5 10-05 patrick bot PS6 10-05 patrick bot PS7 10-06 patrick bot
PS8 10-07 patrick bot PS9 10-27 patrick bot PS10 10-28 patrick bot PS11 11-04 patrick bot PS12 11-05 patrick bot
tags: pw_smallfix
owner Andreas Dilger · uploader patrick bot · PS12 uploaded 4h ago · NEW · open in Gerrit ↗
commit message
LU-6142 obdclass: add/use OBD_ALLOC_PTR_ARRAY[_LARGE]()

Reimplement OBD_ALLOC_PTR_ARRAY() and
OBD_ALLOC_PTR_ARRAY_LARGE() with overflow-checked array
sizes instead of open-coding them, and add
OBD_ALLOC_ARRAY_GFP() and OBD_ALLOC_ARRAY_LARGE_GFP() as
the underlying array allocators.  These simplify callers and
avoid potential bugs with overflow of calculations with 32-bit
variables.

Convert OBD_ALLOC() and OBD_ALLOC_LARGE() and corresponding
OBD_FREE[_LARGE]() callers to the new macros where possible.
OBD_ALLOC_ARRAY_LARGE_GFP() keeps the explicit kmalloc then
vmalloc fallback of OBD_ALLOC_LARGE(), since kvmalloc_array()
does not fall back to vmalloc for GFP_NOFS before Linux 5.15.

Remove OBD_ALLOC_WAIT(), OBD_ALLOC_PTR_WAIT() and
OBD_ALLOC_PTR_ARRAY_WAIT(); their few callers now use
OBD_ALLOC_GFP(..., GFP_KERNEL) directly.  Update
leak_finder.pl to parse the new allocation labels.

Change lds_def_comp_size_cnt to hold the maximum count of
entries in the lds_def_comp_entries array, rather than the
requested number of entries.  This avoids recalculating
the array size on each call so lod_free_def_comp_entries()
and lod_free_comp_buffer() can use OBD_FREE_PTR_ARRAY_LARGE().

Cleanup code style issues in related code.

Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5-5
Assisted-by: ClaudeCode:claude-sonnet-5
Change-Id: Ie0db250d017d228606d4d976132968d138500c1e
64919 master J –B ✓T …R +1/2
LU-12669 lov: slow and dead OST detection for degraded reads
reviewing Maximilian Dilger · awaiting review (CI not green yet)
218_review_prioritypw_shepherdpt_ecro 5 unresolved XL +2385 −77
8h
build #135439 SUCCESS · tests all Maloo sessions · test queue
reviews: Keguang Xu +1 2026-11-05 01:09
no vote yet: Ronnie Sahlberg, Andreas Dilger
patchsets:
+48 earlier PS1 03-26 PS2 03-26 PS3 03-29 Andreas Dilger PS4 03-29 Patrick Farrell PS5 03-29 Patrick Farrell PS6 03-29 Patrick Farrell PS7 03-29 Ronnie Sahlberg PS8 03-30 Ronnie Sahlberg PS9 03-31 Ronnie Sahlberg PS10 03-31 Patrick Farrell PS11 03-31 Ronnie Sahlberg PS12 04-01 Ronnie Sahlberg PS13 04-01 Ronnie Sahlberg PS14 04-07 Ronnie Sahlberg PS15 04-08 Patrick Farrell PS16 04-09 Patrick Farrell PS17 04-09 Patrick Farrell PS18 04-09 Patrick Farrell PS19 04-09 Patrick Farrell PS20 04-09 Patrick Farrell PS21 04-09 Patrick Farrell PS22 04-09 Patrick Farrell PS23 04-09 Patrick Farrell PS24 04-10 Patrick Farrell PS25 04-10 Patrick Farrell PS26 04-10 Patrick Farrell PS27 04-10 Patrick Farrell PS28 04-10 Patrick Farrell PS29 04-14 Patrick Farrell PS30 04-14 Patrick Farrell PS31 04-14 Patrick Farrell PS32 04-15 Patrick Farrell PS33 04-15 Patrick Farrell PS34 04-15 Patrick Farrell PS35 04-21 PS36 04-25 PS37 05-04 PS38 05-20 Marc Vef PS39 06-04 Ronnie Sahlberg PS40 07-13 Marc Vef PS41 07-13 Marc Vef PS42 07-13 Marc Vef PS43 07-15 Marc Vef PS44 07-26 Marc Vef PS45 07-26 Marc Vef PS46 08-04 PS47 08-19 PS48 09-26
PS49 10-05 Andreas Dilger PS50 10-05 Andreas Dilger PS51 10-15 Andreas Dilger PS52 10-24 Andreas Dilger PS53 11-04
threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS50 2026-10-05 18:53 Gerrit AI review for Lustre COMMIT_MSG:62 — (minor) Earlier review agreed to keep the lov_io_set_range(), readahead and via_hybrid_switched fixes in this patch. The io_latency_stats ar
Gerrit AI review for Lustre PS50 · 2026-10-05 18:53
(minor) Earlier review agreed to keep the lov_io_set_range(), readahead and via_hybrid_switched fixes in this patch. The io_latency_stats array fix is newer, though, and is a different case. The arrays are allocated with PTLRPC_MAX_BRW_BITS - PAGE_SHIFT entries, but brw_interpret() indexes them with fls(page_count) - 1. A maximum-size RPC therefore writes one histogram past the end of the allocation. d67cf23fb18a is already in 2.17.0, so this heap overflow needs to reach b2_17, and the EC degraded-read feature will not be backported there. Could the OSC_LAT_BUCKETS change go in a separate patch with its own Fixes: line, so it can be cherry-picked on its own?
reply PS52 2026-11-03 16:13 Marc Vef patchset comment — Conflicts with master: Does not apply after the 1 change below it: lustre/osc/osc_cache.c
Marc Vef PS52 · 2026-11-03 16:13
Conflicts with master: Does not apply after the 1 change below it: lustre/osc/osc_cache.c
reply PS52 2026-10-26 15:10 Gerrit AI review for Lustre lov_io.c:3631 — (defect) lov_sub_unavailable() is evaluated again for every parity stripe on each pass, and the answer can change between the passes. Pass 0
Gerrit AI review for Lustre PS52 · 2026-10-26 15:10
(defect) lov_sub_unavailable() is evaluated again for every parity stripe on each pass, and the answer can change between the passes. Pass 0 does a synchronous lov_ec_read_parity_stripe() (cl_sync_io_wait(), no soft deadline) for each available stripe, and a slow mark is time-bound, so cl_read_slow_until can expire while pass 0 is reading.

Example, err_nr == 2, pcount == 2, parity p0 slow-marked: pass 0 skips p0 and reads p1. p0's mark expires during that read. Pass 1 now sees p0 as available, so `lov_sub_unavailable(los) != pass` skips it again, par_stripes_used stays 1, and the read fails with "not enough parity stripes" -EIO. Before this patch the single loop would have read p0 and recovered.

The opposite flip (a stripe already read in pass 0 gets marked slow by another reader's soft timeout) would read it again and put the same index twice into ecr_parity_used[], which makes the decode matrix singular (-EIO from gf_invert_matrix()).

Could the availability of each parity stripe be sampled once before the passes (e.g. a small bitmap of pcount bits) so each stripe is tried exactly once?
reply PS52 2026-10-26 15:10 Gerrit AI review for Lustre lov_lock.c:238 — (minor) Is it intended that this also matches stripes that have no sub-IO only because they are past EOF? lov_ecio_add_data_sub() caps data_
Gerrit AI review for Lustre PS52 · 2026-10-26 15:10
(minor) Is it intended that this also matches stripes that have no sub-IO only because they are past EOF? lov_ecio_add_data_sub() caps data_ext at ec_inode_size, so in a small file the other data stripes of the expanded raid set get no sub-IO, while io_ext here is the uncapped [lis_pos, lis_endpos). Those sub-locks on healthy OSTs are then turned into placeholders instead of being enqueued.

That may well be harmless (no pages are rebuilt there), but it is not what the comment says ("as it routes around the OST, is rebuilt"), and it widens the placeholder use from unavailable OSTs to every stripe past EOF of a degraded read. If the patch is refreshed, either intersect with the EOF-capped extent here, or document the past-EOF case in the comment and commit message.
reply PS52 2026-10-26 15:10 Gerrit AI review for Lustre osc_request.c:4231 — (minor) osc_setup_common() is also called by mdc_setup(), and DoM reads go through the same osc_queue_sync_pages()/osc_build_rpc() path, so
Gerrit AI review for Lustre PS52 · 2026-10-26 15:10
(minor) osc_setup_common() is also called by mdc_setup(), and DoM reads go through the same osc_queue_sync_pages()/osc_build_rpc() path, so a mirrored file with a DoM component gets soft deadlines on its MDT reads with slow_read_pct=300. But slow_read_pct, slow_read_min_ms and slow_read_stats are only registered for osc, so an admin cannot see or turn this off for the MDC (`osc.*.slow_read_pct=0` does not cover it). Should MDC either get the same tunables, or start with cl_slow_read_pct = 0?
tags: 218_review_priority pw_shepherd pt_ecro
owner Maximilian Dilger · uploader Maximilian Dilger · PS53 uploaded 12h ago · NEW · open in Gerrit ↗
commit message
LU-12669 lov: slow and dead OST detection for degraded reads

A read of an EC file whose data stripe is on a dead OST waits for
the RPC's adaptive timeout, 7 s in production, before it is
reconstructed from parity; a slow OSS extends that with early
replies, and even a dead import costs the FLR retry rounds first.

Give such reads a soft deadline and route around the OST.  A
request past it fails with -ETIMEDOUT without failing the import or
touching the adaptive timeout.  Each OSC keeps a smoothed OST_READ
latency and deviation per RPC size, as for the TCP retransmission
timer, and a top-level no-delay read of an EC or mirrored file gets
a deadline, counted from its send, of the largest of
osc.*.slow_read_pct (default 300) percent of the smoothed latency,
that latency plus four deviations, and osc.*.slow_read_min_ms
(default 250 ms for a non-rotational OST, 2 s otherwise).  An
abandoned read marks the import slow for four times its deadline;
each further soft timeout before a successful read doubles the
deadline and the mark, up to the adaptive timeout.

LOV treats a deactivated, invalid, disconnected or slow-marked import
as unavailable, but not one reconnecting from idle.  A read of a dead
stripe is reconstructed at once when its raid set's own parity covers
its dead stripes, and of a slow-marked one only when it covers all of
its unavailable stripes; otherwise the read waits for them, e.g. until
an OSS failover completes.  A read spanning several raid sets waits if
any of them cannot be rebuilt.  With no in-sync parity the file reads
like a plain mirror.  A read of part of a raid set, whose
reconstruction reads many times its size, gets no soft deadline and is
not reconstructed around a slow stripe when most of the set's other
stripes are on OSTs running at over twice their median latency since
mount and over an eighth of slow_read_min_ms.  A plain mirror's
buffered reads get the same deadline and rotate mirrors on expiry,
unless no other mirror can serve the read.  An EC read skips the lock
and read of a stripe it reconstructs by having no sub-IO for it,
rather than through the lso_status shared with other readers.
osc.*.slow_read_stats shows the estimates and counters.

A 1MiB read of stripe 0 of a 4+2 EC file on an 8-OST VM, with one
30s stall of its OST (OBD_FAIL_OST_BRW_PAUSE_BULK), then 200 1MiB
direct and 200 4KiB buffered random reads while 4 writers load all
OSTs:

  slow_read_pct            0 (off)    300 (default)
  direct read, stall       30053ms    2069ms
  buffered read, stall     30055ms    2048ms
  reads under load: 0 soft timeouts, no extra parity or survivor reads

Also fix lov_io_set_range() rounding the reconstruction range end
past its component, which LBUGged "uncovered page!"; the
ra_cur_pages leak in ll_readahead_handle_work() when
cl_io_rw_init() fails, which stopped readahead for the mount; and
do_file_read_iter() never clearing via_hybrid_switched, which ran
later O_DIRECT AIO reads on the same lu_env synchronously.  Also fix
ll_readahead_handle_work() passing a page index and count to
cl_io_rw_init() as bytes, which routed async readahead of FLR and EC
files by the wrong extent, and the client io_latency_stats arrays
being one size short for a maximum-size RPC.

Add sanity-ec 54a-54k, and change test_29a to check that a read with
more stripes lost than parity waits for their OSTs.

Test-Parameters: testlist=sanity-ec ostcount=8
Test-Parameters: testlist=sanity-ec ostcount=8 fstype=zfs
Test-Parameters: testlist=sanity,sanity-flr ostcount=8
Fixes: c2791674260b ("LU-12043 llite: improve single-thread read performance")
Fixes: 3fc4243da7ef ("LU-13802 llite: tag switched hybrid IOs")
Fixes: 783c13bb0b8f ("LU-12669 ec: recover data from parity")
Fixes: d67cf23fb18a ("LU-18993 osc: Add IO RPC latency statistics by size")
Signed-off-by: Maximilian Dilger <mdilger@whamcloud.com>
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools
Change-Id: I0913e1ee977c9850193c92835edb185b0aedc6d4
69908 master J –B ✓T …R +1/2
LU-12669 ec: fix degraded read page leak and short read
reviewing Maximilian Dilger · awaiting review (CI not green yet)
218_review_prioritypt_ecro 3 unresolved L +253 −8
8h
build #135446 SUCCESS · tests all Maloo sessions · test queue
reviews: Ronnie Sahlberg +1 2026-11-04 23:31
no vote yet: Andreas Dilger, Patrick Farrell
patchsets: PS1 10-22 PS2 11-03 PS3 11-04
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS2 2026-11-03 20:56 Misc Code Checks Robot (Gatekeeper helper) osc_page.c:205 — error: osc_page_lru_add():'opg' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper) PS2 · 2026-11-03 20:56
error: osc_page_lru_add():'opg' dereferencing possible ERR_PTR()
reply PS3 2026-11-04 22:00 Misc Code Checks Robot (Gatekeeper helper) osc_page.c:205 — error: osc_page_lru_add():'opg' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper) PS3 · 2026-11-04 22:00
error: osc_page_lru_add():'opg' dereferencing possible ERR_PTR()
reply PS1 2026-10-23 16:05 Gerrit AI review for Lustre sanity-ec.sh:7818 — (style) The fixed `sleep 1` is meant to start the read at 5M after the EC read is paused at the fail_loc. If the DIO attempt and the switch
Gerrit AI review for Lustre PS1 · 2026-10-23 16:05
(style) The fixed `sleep 1` is meant to start the read at 5M after the EC read is paused at the fail_loc. If the DIO attempt and the switch to CIT_EC_RD take longer than 1s on a slow VM, the 5M read finishes before the pause, nothing cuts i_size, and the test passes without testing the race. If the patch is refreshed, consider waiting for the one-shot fail_loc to fire (CFS_FAILED, 0x40000000, set in fail_loc) with wait_update, rather than sleeping a fixed time.
tags: 218_review_priority pt_ecro
owner Maximilian Dilger · uploader Maximilian Dilger · PS3 uploaded 11h ago · NEW · open in Gerrit ↗
commit message
LU-12669 ec: fix degraded read page leak and short read

Fix two bugs in degraded EC reads:

- Pages rebuilt from parity stay busy on the OSC until their lock is
  cancelled, as only a completed transfer puts a page on the LRU
  list.  A degraded read of more than max_cached_mb then waits in
  osc_lru_alloc() forever.  Add cl_page_lru_add() (cpo_lru_add) so
  vvp_io_ec_rd_end() puts each rebuilt page it keeps on the LRU
  list.

- While the OST of the last stripe is unavailable the file's KMS is
  short, and vvp_prep_size() of a concurrent read writes it to i_size.
  An EC read near EOF then reads that i_size back and returns no data,
  or its copy-out stops at it.  Keep the MDT size that
  vvp_update_inode_size() got, raise i_size for the whole read, and
  restart if i_size still cuts it short.

Add sanity-ec test_51c for the page leak, and test_51b, with two new
fail_locs, for the short read.

Test-Parameters: testlist=sanity-ec ostcount=8
Fixes: 783c13bb0b8f ("LU-12669 ec: recover data from parity")
Fixes: 240cad9a0a82 ("LU-19344 llite: set read size correctly")
Assisted-by: ClaudeCode:claude-opus-5.5 llm_code_and_review_tools
Signed-off-by: Maximilian Dilger <mdilger@whamcloud.com>
Change-Id: Ie052eeefc07d5bdb67d93c2307c47a3968441bd5
68347 master J –B ✗T –R ✗
LU-10026 ofd: csdc final integration patch
reviewing Marc Vef · blocked on the owner: build failure; Marc Vef voted -1
CR -1 csdc 5 unresolved XL +3772 −421
8d
blocked on the owner: build failure; Marc Vef voted -1
awaiting review (CI not green yet)
build #130325 FAILURE
reviews: Marc Vef -1 2026-08-27 20:12
no vote yet: Sergey Cheremencev, Sebastien Buisson, Alex Zhuravlev, Hongchao Zhang, Li Dongyang
patchsets: PS1 08-25 PS2 08-26
threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-25 21:24 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-25 21:24
[Marc Bot] upstream remarks for reference:

Port notes for this upstream submission (large squash; adapted to current
master):

- The build-file hunk was retargeted: the tree no longer has per-directory
  autotools files (LU-18876), so ofd_compress.o is added to the kbuild
  lustre/ofd/Makefile; the EXTRA_DIST hunk has no equivalent and was
  dropped.
- LU-13139 moved the dt_bufs_get()/dt_read_prep()/dt_write_prep() bodies
  out of dt_object.h into obdclass/dt_object.c; this patch's signature
  changes (offset/len args, decompression/read flags) were applied to the
  relocated bodies, with the prototypes and the new dt_unlock_pages()
  wrapper in the header.
- OBD_FAIL_OST_BRW_WRITE_BULK3 renumbered 0x256 -> 0x258: 0x256 is already
  OBD_FAIL_OST_GRANT_PREPARE on master.
- An m4 call to LC_FORCE_UACCESS_BEGIN was dropped: the macro is not
  defined anywhere (neither in this patch nor in the tree). The functional
  m4 content (LC_VM_MAP_RAM_PROT_ARG probe for the 4-arg vm_map_ram()) is
  kept.
- The compression level-mapping helpers and compr_type_table were moved
  from lustreapi.h into the lustre_user.h UAPI header (as this patch
  intends, so server code can share them), based on the current series'
  versions of those helpers; the table gained the LL_COMPR_TYPE_MAX
  sentinel and iteration skips NULL-name entries. compress_type_2str()/
  mapback_compress_level() are static inlines there now; the lfs find
  loops live in liblustreapi_pfind.c and were converted there.
- Adapted to the reworked struct ll_compr_hdr (65769): split magic words
  and the packed level_and_chunk byte with its accessors, in ofd_compress.c
  and the shared compression library. is_chunk_start() takes a folio in
  this series; the OFD call sites pass page_folio(lnb_page).
- The chunk-bits fields follow the series' *_lum_bits naming and offset
  semantics; llc_compr_chunk_lum_bits already stores the offset above
  COMPR_CHUNK_MIN_BITS, so the filter-fid assignment in lod_object.c is
  direct, without re-subtracting COMPR_CHUNK_MIN_BITS.
- ptlrpc_connection_is_local() does not exist upstream - replaced with the
  LNetIsPeerLocal(&exp->exp_connection->c_peer.nid) form used by the
  surrounding OFD code.
- osd_write_prep(): the partial-page zeroing block had been converted to
  kmap_local_page()/folio_index_page() upstream; the patch's changes
  (PageUptodate skip, read flag, whole-page memset) were applied on the
  current form.
- The preview-period client-side restriction on non-chunk-aligned
  overwrites (vvp_io_write_start) is removed as in the original patch.
- unmerge_chunk(): the new tail-clearing loop indexed lnb[i] while its loop
  condition and debug message used first + i; the stores now use
  lnb[first + i] consistently.
- Old version gates carried by the squashed test additions (sanity-compr
  1004-1006, sanity-lfsck 18i, test_460e area) are meaningless on master
  and were converted to the compression_supported() helper.
- A Fixes: line pointing at one of this patch's own squashed sub-patches
  was dropped; a file for an external repository (lipe) was dropped.
reply PS2 2026-08-26 10:30 Misc Code Checks Robot (Gatekeeper helper) ofd_compress.c:663 — warn: ofd_map_chunks_to_lnb_write():missing conversion: 'rc + maxlnb' 'unit_page + unit_array_size'
Misc Code Checks Robot (Gatekeeper helper) PS2 · 2026-08-26 10:30
warn: ofd_map_chunks_to_lnb_write():missing conversion: 'rc + maxlnb' 'unit_page + unit_array_size'
reply PS2 2026-08-26 10:30 Misc Code Checks Robot (Gatekeeper helper) ofd_compress.c:667 — warn: ofd_map_chunks_to_lnb_write():missing conversion: 'rc + maxlnb' 'unit_page + unit_array_size'
Misc Code Checks Robot (Gatekeeper helper) PS2 · 2026-08-26 10:30
warn: ofd_map_chunks_to_lnb_write():missing conversion: 'rc + maxlnb' 'unit_page + unit_array_size'
reply PS2 2026-08-27 20:12 Marc Vef ofd_compress.c:975 — (defect) range lock must be taken before `ofd_map_chunks_to_lnb_write()`
Marc Vef PS2 · 2026-08-27 20:12
(defect) range lock must be taken before `ofd_map_chunks_to_lnb_write()`
reply PS2 2026-08-26 10:30 Misc Code Checks Robot (Gatekeeper helper) ofd_compress.c:1048 — warn: ofd_object_punch_compr():duplicate check 'orig_lnb' (previous on line 957)
Misc Code Checks Robot (Gatekeeper helper) PS2 · 2026-08-26 10:30
warn: ofd_object_punch_compr():duplicate check 'orig_lnb' (previous on line 957)
tags: csdc
owner Marc Vef · uploader Marc Vef · PS2 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 ofd: csdc final integration patch

Add calls to the csdc functions from the regular read/write paths.
This also brings OFD range locking back for compressed objects,
reverting commit a21ce928aa64 ("LU-15894 ofd: revert range locking
in ofd") for this use case.

ofd: rename 'local' in thread_big_cache

It's not a big deal since it's only used a few times, but
let's give this variable a descriptive name.

DDN-bug-id: EX-7601
Was-Change-Id: Ide136cd42e885d59f1a2e4ce22a2e7449faca3f9

ofd: rename map_remote_to_local

osd_map_remote_to_local implies some complex role, but in
fact what this does is initialize the fields of the
local niobuf structs to represent the requested range.

This *may* be the same as a remote niobuf, but it also
isn't in some cases.  Name it osd_init_lnbs instead.

DDN-bug-id: EX-7601
Was-Change-Id: I0d3b5f24e42ee8dc962437daea7cf9347ccb9059

ofd: series description and reorder declarations

Reorder declarations in tgt_brw_read prior to adding things.

This trivial patch is a good place to put the description
of this series, which handles unaligned reads to compressed
files.

-----------------------
These patches handle compression chunk unaligned reads on
the server.

When using compression, the client attempts to send chunk
aligned reads, but sometimes it can't, and the client will
send a read to the server which is not chunk aligned.

In this case, the server must read the full chunk,
decompress it, and provide the requested data to the client.

Here's how we do this.

The server receives a set of remote niobufs describing IO
from the client.  Each remote niobuf (rnb) describes a range
of data the client wants to do IO to.

These are translated to a set of local niobufs on the
server, which we then use to do the read.  For compression,
the server has to read complete chunks on unalinged reads.

So we walk these remote niobufs and identify unaligned read
requests (in ofd_preprw_read), then round them to chunk
size. The server then reads the chunk rounded read request
from storage.

The local niobufs now contain a set of complete compressed
chunks, ie, the raw data from disk.  We need to decompress
the chunks where the client is doing an unaligned read, but
leave the other chunks compressed (because the client will
uncompress them).

So, in obd_decompress_read, we use the remote niobuf to
identify unaligned reads from the client.  We then walk the
local niobufs, identify the chunks which match the unaligned
reads from the client, and decompress them 'in place'.
The decompression uses temporary buffers, but the
decompressed data is placed back in the local niobuf.
(If the data is uncompressed on disk, we of course do not
decompress it.  This happens for incompressible data.)

Now the local niobuf contains some raw chunks and some
chunks which have been decompressed.  This is *more* data
than the client asked for.  Normally, the server local
niobuf contains exactly what the client asked for, so the
server checksums and sends the entire local niobuf.  But
because we read complete chunks, the local niobuf contains
more data than the client requested.

This means we need to identify the subset of the local
niobuf which the client actually wants to read and present
that to the client.

In order to do that, we walk the local niobuf and use the
remote niobufs (the description of the pages the client
needs) and create a special tx niobuf which points to only
the pages the client wants (io_lnb_to_tx_lnb).  Then we use
this tx niobuf for checksum and transfer to the client.

DDN-bug-id: EX-7601
Was-Change-Id: Ic89dcef7e169879725caa6cdef4619b9a76b2b37

ofd: identify reads to round

If the beginning or end of a client read is unaligned, we
must round the locking.  This patch identifies reads where
this is required, the next patch will do the locking.

Print a debug message when such an IO is found, but don't
do anything different - yet.

DDN-bug-id: EX-7601
Was-Change-Id: Ibdab35b733225b4b1349ef457f66ca37dcb2d9bf

ofd: round read lock to chunk

For unaligned reads, we need to round the read locking to
cover the any leading or trailing chunks.  We do this by
creating a local 'remote niobuf' to describe the rounded
range and doing the locking against that niobuf.

DDN-bug-id: EX-7601
Was-Change-Id: I8818522c188aca3c5c5eb564da2a8ba8aef18a4b

ofd: convert dt_bufs_get to offset, len

dt_bufs_get takes a remote niobuf, but just uses the
offset and length for getting pages.

Compression requires rounding the local IO to include the
full compression chunk, which means the local IO does not
match the remote niobuf any more.

So we modify dt_bufs_get to take an offset and length
rather than a remote niobuf, so we can ask for the pages we
need.

DDN-bug-id: EX-7601
Was-Change-Id: I4beaf8207fa00d802c0a339df3de2a3c71154fc7

ofd: add chunk_size to preprw_read

preprw_read needs chunk size for rounding.  Add this in a
separate patch to keep things trivial, it will be used in
a subsequent patch.

Also use this to add a check in DOM to ensure it doesn't
attempt to do compression.  This should already be
prevented by setstripe, so this is just an extra safety
check.

DDN-bug-id: EX-7601
Was-Change-Id: I9dc4d1559e5c8be315268a593466571b54c90a96

ofd: add remote_pages

When we round a read to get all of the compressed chunks,
the number of local and the number of remote pages will
differ.  We need to make sure we do the checksum and data
transfer using the number of remote pages, not the number of
local pages.

This patch calculates the number of remote pages and uses it
accordingly.  This doesn't do anything yet, but when we
round the local read to include the whole compressed chunk,
this will be needed.

DDN-bug-id: EX-7601
Was-Change-Id: I4875b02016570d227b3b926efd117f0a7cda41b4

tgt: add second tbc lnb for RDMA

Compression requires the server to do local IO which differs
from the IO requested by the client.  This means we cannot
directly use the IO niobufs for doing the transfer to the
client.

So we add a second set of lnb pointers, which are used to
point at a specific subset of the pages in the main
per-thread cache.  This subset will be used for doing the
transfer to the client.

DDN-bug-id: EX-7601
Was-Change-Id: I53aa46045aaf335da20a311900ac0bf425823b22

tgt: add io_lnb_to_tx_lnb

With compression, the lnbs used for the disk IO on the
server can contain more data than the client requested,
due to reading up whole chunks for decompression.

This means we need to transfer only a subset of the lnbs.
We do this by creating a second set of lnbs, and pointing
them at the pages in the local io lnb which need to be
transferred to the client.

This code doesn't do anything for now, but it will kick in
with the next patch when we start rounding chunks for read.

DDN-bug-id: EX-7601
Was-Change-Id: I0fe690718a3484578b139eaaec52c0c3b265da6a

ofd: add chunk rounding to read

We need to round all niobufs to chunk size in the read
process, so we read in the full chunk.

dt_bufs_get sets up the local niobuf for the read, so we
round before calling it.

This patch is a partial implementation of unaligned read
support, and breaks compression testing until the next few
patches are landed.  So this patch temporarily adds the
compression tests to ALWAYS_EXCEPT.

DDN-bug-id: EX-7601
Was-Change-Id: I587a519db4dae983db5db1d690e63e15bc010b7e

ofd: add chunk_size to preprw_write

preprw_write needs chunk size for rounding.  Add this in a
separate patch to keep things trivial, it will be used in
a subsequent patch.

This patch is really trivial on the write side, since the
read side already did most of this.  But it's being kept
separate for symmetry.

DDN-bug-id: EX-7601
Was-Change-Id: Id25957dbc185b6e61b7f208cee8cf5f897f03944

ofd: do not use page cache for compressed files

It is challenging for the server to safely use the page
cache with compressed files, because if data is
decompressed in to the page cache, the data in cache now
differs from the data on disk.

This is a problem if *part* of the page cache is ever
evicted, because we can end up with a situation where a read
will be partially satisfied from cache and partially from
disk, but the data on disk is compressed and the data in
cache is not.

It is possible to deal with this by carefully ensuring the
page cache is not used just for decompressed data, but this
makes getting the buffers/lnbs for compressed files fairly
complicated.  Instead, we can just entirely block using the
server page cache for compressed files.

This must be done for both read and write, and only works
for ldiskfs - ZFS cannot easily be forced to not use its
page cache.  But that's OK because we do not support CSDC
with ZFS.

DDN-bug-id: EX-7601
Was-Change-Id: Iee73abb29ad5631bb2203c2133756d7ebf5b686d

ofd: add ofd_decompress_read implementation

ofd_decompress_read is responsible for walking the
remote niobufs (rnbs) in the RPC and identifying if they
are chunk unaligned.  It then passes them on to the rnb
decompression code (not implemented yet, see next patch).

It also allocates the bounce buffers for decompression so
they can be reused for each remote niobuf.

DDN-bug-id: EX-7601
Was-Change-Id: I1f2f86ce3fc036ac5d79b060a5e44f6564e123aa

ofd: lock pages from read to decompression

When using the page cache on the server, for pages which
will be decompressed, we can't unlock them until they've
been decompressed.

Rather than only waiting to unlock the pages which will be
decompressed, we keep all of the read pages locked.  This
simplifies the code, at the cost of delaying other reads to
the aligned portion of an unaligned read.  ie, shouldn't be
important in practice.

DDN-bug-id: EX-7601
Was-Change-Id: Ie98920327979a5c9600e8c9e8627816461ea1a34

ofd: (ofd part)add obd level compression lib

Some compression functions will be used by several areas of
of Lustre, so they need to be in obdclass.

This moves merge_chunk and unmerge_chunk there and adds the
ability for them to merge lnbs.  This is used in a future
patch.

DDN-bug-id: EX-7601
Was-Change-Id: If4a318119bb7685e41adb9f3b31a66074031e6ac

ofd: make compress_chunk take chunk_bits

Chunk bits is used everywhere, have compress_chunk convert
to log bits rather than have the callers do it.

Was-Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>

ofd: add decompress_rnb implementation

This implements decompress_rnb, which is the core code for
handling unaligned reads from the client.

Decompress rnb takes an unaligned remote niobuf and
identifies the unaligned portion(s) of the IO, then finds
the corresponding local niobufs (pages read from disk),
and passes them on for decompression in place.

decompress_chunk_in_lnb decompresses the data in a set of
lnbs and copies it back to the same location, replacing the
raw data from disk with decompressed data.  (If the chunk
was not compressed, it does nothing.)

With this patch, the implementation of unaligned reads is
complete and we can add the compression sanity tests back
safely.

DDN-bug-id: EX-7601
Was-Change-Id: Ifd1d9b03d5d004bec3f5e456da359b8d10e005f9

ofd: improve decompress_rnb debug

Since we're very close on landing the unaligned read
patches, this minor debug improvement is being placed later
in the series.

DDN-bug-id: EX-7601
Was-Change-Id: I36ad243bd1f7025e358f9593f1008f0b851cc1bb

tgt: reorder tgt_brw_write decls

Reorder the declarations in tgt_brw_write.

This patch also serves as the series head for implementing
read-modify-write support for compressed chunks.

The process for read-modify-write is similar to that used
for unaligned reads.

At a high level, read-modify-write means we must read up,
decompress, then recompress and write back the data.  This
only applies when we're actually doing read-modify-write.

To know when to do this, we rely partly on the client.  If
the client is able to compress a chunk, either because it is
a complete chunk, or because the start is chunk aligned and
the write is past EOF, we know there is no read-modify-write
required.  Either there is no existing data (write past EOF)
or the data will be fully replaced.

So, when we see a write which is not fully chunk aligned and
not already compressed, we will do a read-modify-write.

For this, we round the IO lnbs and associated locking to
cover complete chunks, then we do a read of the unaligned
chunks.

ie, if we have a write which goes from 63 KiB to 257 KiB
with a chunk size of 64 KiB, we will read 0-64 KiB and
256-320 KiB, and decompress those chunks in to the buffer.
64 KiB to 256 KiB is *NOT* read, because those are complete
chunks.

We then set up a transfer mapping - identical to the process
for unaligned reads - so the client data is written in to
the correct lnbs.

Now we have a set of chunk aligned lnbs which contain data
updated with the client write.  In the initial version, we
write these to disk uncompressed.  This is sufficient for
correct operation, but it does mean read-modify-write will
decompress those chunks.

There is code for recompression, but it is not working 100%
yet, and there are some complexities around managing holes
and EOF which still need to be resolved.

TBD if this will make our initial release - I am hopeful but
not sure yet.

DDN-bug-id: EX-7601
Was-Change-Id: Ia24583d4221f498928e99afa8c289b70e4d25f5b

tests: unaligned read tests

This adds testing for handling unaligned reads and partial
chunk reads from compressed files.

Testing for writes and multi-client and racing tests will
be added later, but we put the checking function in
test-framework now so it's easy to use later.

DDN-bug-id: EX-7601
Was-Change-Id: I06217c8aeba75016aa4168f329026842dff1d979

obd: add error check in merge_chunk

If the lnbs we're trying to merge have an error recorded in
them, then they're not going to be valid input for
decompression, so return an error.

DDN-bug-id: EX-7601
Was-Change-Id: I1bf17131cb65106087eb5e72e2700db30c0cc975

obd: do not decompress empty lnbs

For reads which cross EOF, we may get lnbs with no data in
them (similarly for writes which cross EOF).

For these cases, it's important to only copy from the lnbs
where there is data, and only do decompression on the lnbs
if there's actually data in them.

Modify merge chunk to do this.

DDN-bug-id: EX-7601
Was-Change-Id: I83fefcfa6d1396dcd97fad994334bf29438bb4bf

ofd: clear pages in decompression

Handling writes to compressed files requires a
read-modify-write cycle, which has implications for how we
handle reads.

Consider the case of a file with an 8 KiB write at offset 0,
which is compressed to 4 KiB.  Then there is another 4 KiB
write at offset 16 KiB.

Updating this correctly requires reading the first chunk,
then decompressing it.  However, this read will go past
EOF, because the write has not occurred yet.  The OSD read
code does not fill in these pages, because read past EOF is
not returned to the client (client gets a short read and
does not actually use the pages).

In our case, however, we must use these pages (from 8 KiB
16 KiB).  In the naive version without recompression, we
simply write out 0 - 16 KiB, so we must have zeroes in
those pages, and once we have recompression, we must
compress those pages so we need zeroes in that case too.

So we note if a page has data in it after decompression,
then if it does not, we clear the page.  Note we do NOT set
lnb_rc to 0 when we clear a page, because lnb_rc = 0 is
used to indicate EOF rather than a gap in the file.

DDN-bug-id: EX-7601
Was-Change-Id: If1d1360185eb087e821167a08e49c9427e29ffc4

tgt: identify writes to round

If the beginning or end of a client write is unaligned, we
must round the locking.  This patch identifies writes where
this is required, the next patch will do the locking.

DDN-bug-id: EX-7601
Was-Change-Id: Iec140c24423a0da478f6d42ff6fc620d7ad3ba4a

tgt: round write lock to chunk

For unaligned writes, we need to round the write locking to
cover the any leading or trailing chunks.  We do this by
creating a local 'remote niobuf' to describe the rounded
range and doing the locking against that niobuf.

DDN-bug-id: EX-7601
Was-Change-Id: I2bdea620386ad229375647a0e2cc6180c9bd7aa6

tgt: add remote_pages for writes

When we round a write to get all of the compressed chunks,
the number of local and the number of remote pages will
differ.  We need to make sure we do the checksum and data
transfer using the number of remote pages, not the number of
local pages.

This patch calculates the number of remote pages and uses it
accordingly.

Note that just like on the read side, this patch doesn't do
anything until we're actually rounding the chunks for IO in
a later patch.

DDN-bug-id: EX-7601
Was-Change-Id: I38256070d68246613ce67b0bfe328f6443a95533

csdc: fix ofd_preprw_write() for sanity 819b test

Sanity 819b asserts:
tgt_brw_write()) ASSERTION( npages_local == npages_remote )

The test triggers fault inject in ofd_preprw_write():
if (OBD_FAIL_CHECK(OBD_FAIL_OST_2BIG_NIOBUF))
     rnb[i].rnb_len += PAGE_SIZE;

ofd_preprw_write() calculates npages_local taking in account
additional len from fault inject, BUT npages_remote is calulated
BEFORE the fault inject. So npages_remote was not adjusted.

To solve the problem it is enough to move range_to_page_count() call.

DDN-bug-id: EX-9523
Was-Change-Id: Ifd659985a78c7630049a17622aff2eb7f4525fb1

tgt: add tx lnb for writes

With compression, the lnbs used for the disk IO on the
server can contain more data than the client requested,
due to reading up whole chunks for decompression.

This means the client is only going to write data in to
a subset of the lnbs used for io to storage.

We handle this the same way we do for reads:
We create a second set of lnbs just for the transfer, and
point these lnbs at the pages which will actually receive
data from the client.

DDN-bug-id: EX-7601
Was-Change-Id: I5b668547537698309792daf309842866be79f0b6

ofd: switch preprw to chunk_bits

The compression/decompression code requires chunk_bits
rather than chunk size.  Since we need to call this code
from ofd_preprw_write, we need chunk_bits there.

This modifies the functions so chunk_bits is available
there.

DDN-bug-id: EX-7601
Was-Change-Id: Id98e6d6364eeaaa7753a8aba059387e3e659d2a2

vvp: remove unaligned write restriction

This series will resolve the unaligned write issue for
compressed files, so we need to remove the restriction on
unaligned writes in order to test it.

This does not mean unaligned writes are working yet, but we
need to make this change so the subsequent patches can be
tested.

DDN-bug-id: EX-7601
Was-Change-Id: I4abcbdcd18b00718099483c8dfdb9a7aa41c3ce7

ofd: add chunk rounding to write

For compressed files, we need to round all niobufs to
chunk size in the write process, so we have buffers for
reading in and rewriting the complete chunks.

dt_bufs_get sets up the local niobuf for the write, so we
round before calling it.

Note this breaks writing to compressed files, which is not
fixed until a few patches later.  For this reason, we
disable the compression tests.  They will be reenabled
shortly - similar to how we handled the read series.

DDN-bug-id: EX-7601
Was-Change-Id: I413aaba9866dd7d6c4463fa620eadf1423379ba1

ofd: add read to write process

This adds a very simple read to the write process, which
just reads up the entire chunk-rounded write range.

This is a first step - the read will eventually be modified
to only read the unaligned portions which must be
decompressed for read-modify-write.  We will create a
special lnb mapping which contains only the pages which must
be read for decompression (similar to the tx lnb mapping).

For now, this read allows us to test decompression without
handling the mapping.

DDN-bug-id: EX-7601
Was-Change-Id: I169ddc2e161094aebdad1a60ec62e9c1d75cd6d8

ofd: add decompress_read to ofd_preprw_write

We have read up the compressed data from disk, now we must
decompress it so we can rewrite it successfully.

This code still works on the whole lnbs rather than just on
the portion of it which is unaligned.  This is temporary
and will be resolved by a future patch.

With this patch, we have basic read-modify-write support,
so we can re-enable testing.  The next patch adds tests
for read-modify-write.

DDN-bug-id: EX-7601
Was-Change-Id: Ib6503c15e9fb3d425a7bc295bcc61b41c089a1f0

ofd: add read lnb to ofd_preprw_write

The read phase of read-modify-write for compressed files
needs to read only a subset of the pages which will be
written, so it needs a separate set of lnb pointers for
tracking this subset.

This patch passes around the necessary argument but does
not set up or use the lnb yet.

DDN-bug-id: EX-7601
Was-Change-Id: I7ec7101e65e73a6c9e67cea3c58d8cace38e70e0

ofd: distinguish nr_write and nr_read

We will have two counts of pages in lnbs, distinguish
between them.

Not actually used yet - will be calculated when the read
lnb mapping is created.

DDN-bug-id: EX-7601
Was-Change-Id: I709b8fd299163d348a196184152bb0294fcb650b

ofd: create read mapping for read-modify-write

When we need to do a read-modify-write for unaligned writes
to a compressed file, it's important we read only the
portion of the file which is receiving unaligned IO.

This patch identifies these chunks in preprw_write and
creates a read lnb mapping from a subset of the pages for
write.  These pages we read up are then decompressed.

Note one issue this patch does not address is reading of
data past EOF.  If the final chunk is unaligned, we will
round the write to cover it.  This results in extending the
file inappropriately, writing zeroes where they aren't
needed.  The read side gives us the info to address this,
which we will do in a future patch.

DDN-bug-id: EX-7601
Was-Change-Id: Iede43f12127cbb93e73c22a915192aa2f814a927

osd: add assert for prepare partial page

In the write prep code, we read up any partial pages (pages
which are not completely overwritten by the write) to
prepare them for write.  But for compressed files, we will
have already done this to prepare for decompression.

Add an assert to make sure we catch if this is ever wrong.

DDN-bug-id: EX-7601
Was-Change-Id: I1366b1f5b191a4d581448d692933d562198c3a1f

ofd: minor debug improvements

A smattering of minor debug improvements across several
patches, placed at the end because they're all minor and
some of them would disturb early parts of the series.

DDN-bug-id: EX-7601
Was-Change-Id: I2071911eb09f5c7fad28203db05396bb31ccda59

ofd: set compressed file size for fake writes

When using the fake writes fail_loc, file size setting is
done at the ofd layer, since the osd layer isn't used.  So
we must also handle the compressed file size for this case.

This fixes sanity test 399a with compression.

DDN-bug-id: EX-8826
Was-Change-Id: Icda612405908166d043e1e568d0d8bd9cd0c5156

tgt: objcount in RPC must be 1

Much of the BRW write code assumes objcount is one, but
there is some provision for multiple objects.

Since the code will break if we send it multiple objects,
add errors to make sure anyone changing it will notice.

This isn't strictly compression related, but compression
adds even more code which assumes this, so this protection
will be useful.

DDN-bug-id: EX-7601
Was-Change-Id: Idcbf33fd14d4b1bd179c9516bed07cca907008bc

ofd: multiple reads in same chunk

When doing DIO or if we get unusual cache behavior on the
client, multiple reads can hit the same chunk.

This only shows up in racing tests, but it's important to
handle.  We do this by making sure we start searching the
lnbs for decompression at the start of the last chunk we
decompressed.

DDN-bug-id: EX-7601
Was-Change-Id: I81fbbba79b16066e6d4519c66030cc58e03d2de7

ofd: don't read for writes past eof

There's no data past EOF, so there's no need to do
read-modify-writes when the entire write is past the chunk
at EOF.  So in that case, don't read up data and don't
attempt decompression.

There's no explicit test for this, but this shows up
immediately in the random-offset copy tests, because they
seek and write various sizes to offsets past current EOF.

We also need this functionality for reads, because in some
cases the client will do reads past EOF (this is unusual,
but can still happen sometimes).  This is added in a
separate patch because it requires some code reorganization.

DDN-bug-id: EX-7601
Was-Change-Id: Ia2b598165d5645c5a44c3d58bea69c7e42f10e41

ofd: same-ify preprw_read and preprw_write

preprw_read and preprw_write have some sections which are
functionally the same but which have diverged slightly.
(These can't easily be shared between the functions.)

This is a short patch to make them more similar before
adding eof checking to reads.

DDN-bug-id: EX-7601
Was-Change-Id: I7bce912e99e61a4eec4060d6b49d4917894b44c4

ofd: put decompress_read in read prep

ofd_decompress_read is called from ofd_write_prep for
writes, but from tgt_brw_read for reads.  This makes the
code a little harder to follow and makes it difficult to
check read side decompression against EOF.

Instead, we move the decompression call to ofd_preprw_read.
This makes no change to the real operations here, but makes
for better code (and more similar code between read and
write).

DDN-bug-id: EX-7601
Was-Change-Id: Ibefd0a48ad08e83725f2df64618db60ba61c5ce0

ofd: add past eof check for reads

The client does not normally generate reads past EOF, but
this can occur during some racing situations.  We need to
check for that case and not attempt decompression, since
there's no data to decompress if we're reading past EOF.

This covers a failure which shows up occasionally in the
racing parts of the test suite, but it's challenging to
write an explicit test for this.

We also add handling for complete reads of the last chunk,
even if that chunk is partial, because we can send that to
the client for decompression.

This allows us to remove the slightly funky eof handling
in decompress_rnb, since we'll just not call that code in
this case now.  Note we'll still call decompress_rnb, etc,
for writes if they start before EOF and finish after EOF
(and are unaligned).  This is fine - this case should be
rare and if we hit it, we'll notice there's nothing to
decompress and proceed accordingly.

DDN-bug-id: EX-7601
Was-Change-Id: I50295f2803af611de5069d094c0a5d1b0a4a9c2d

ofd: add checks to io_lnb_to_tx_lnb

We should always be able to find the remote niobuf in the
local io range, if we can't, there's a bug.  So assert on
this.

We should also never have page level overlapping remote IOs,
at least until we have unaligned DIO.  (We can remove this
check when we combine the features.)

DDN-bug-id: EX-7601
Was-Change-Id: I325d4a37d25c116e42621964e90b225b71fd8f1f

tests: tests for read-modify-write

This patch adds tests for the read-modify-write case for
EX-7601.  There's still some additional tests to be added
here, but this is a good start.

DDN-bug-id: EX-7601
Was-Change-Id: I5dd9e566b8274ece99283c8962e0d34225089cc0

tests: use alternative data source for rewriting

Using the same file as input has disadvantages. It is not
possible to understand that data was not rewritten at all.
Alternative data source should be used.

Let's shift source file data and use it as a source.
To check rewriting result the same operarion is performed
on the destination file copy stored outside the Lustre FS.

DDN-bug-id: EX-8598
Was-Change-Id: I6ef400520359bfe9156c3f47e757064863bdf4e0

tests: add multi-mount compression test

This adds a multi-mount correctness test for compression.
This races IO from two mountpoints at varying sizes to
stress test compression.

DDN-bug-id: EX-7601
Was-Change-Id: If49cbd6d171068faa802835146f273d835b39bc3

obd: add 'lvl' for best and fast

'best' and 'fast' compression types must also set a level,
because not all levels are supported by all algorithms.

Rather than trying to be clever, just use simple universally
supported values, except for lz4fast, where we special case
this, because otherwise '0' is the slowest setting (and
lz4fast is likely to remain our default fastest).

DDN-bug-id: EX-6269
Was-Change-Id: I7c29659d4f027af2e44285ae38e4c9d91e35509a

ofd: use niocount consistently

'niocount' refers to the number of remote niobufs, ie, the
number of separate IOs from the client.  Except for a few
places, where it's used to refer to the number of pages in
the entire RPC.  Eek.

Replace this usage with 'npages', making niocount usage
consistent.

DDN-bug-id: EX-8993
Was-Change-Id: I266087ad8dccadb54c054b0a11fb03dc9868a725

csdc: allow specify 'fast'/'best' compression type

Use lctl set_param osc.*.compress_type_{fast|best}=<type>:<level>
to specify the compression_type:level for LL_COMPR_TYPE_FAST/
LL_COMPR_TYPE_BEST.

lctl get_param osc.*.compress_type_{fast|best} will list these
values.

DDN-bug-id: EX-8311
Was-Change-Id: Ifeff7f25e30fc0884f0c770a3b6d0798937b3c35

lfs: not iterate compr_type_table using ARRAY_SIZE

patch modifies compr_type_table to contain NULL fields in the
array, so iterate over the array should not use ARRAY_SIZE, but skip
those elements with NULL compression type name.

DDN-bug-id: EX-8311
Was-Change-Id: I8e4988fd3a63c1cb66f75510d190c2ebc4f8f9be

ofd: handle 'missing object' reads

When the read code (eg, mdt_preprw_read) finds there is no
object, it will return a read with 0 pages, but not fail the
read.  The assert for local and remote pages needs to
recognize this case.

DDN-bug-id: EX-8996
Was-Change-Id: Idc6ff70f71abc100f750a63eca73a754a56f6435

ofd: do not write 'hole' pages on compression

When doing unaligned read-modify-write to a compressed file,
we must round the IO lnb used for write in order to read up
the compressed data for modification.

In some cases, this creates a situation where there are
pages in the write lnb which have no data in them.  It is
important not to write out these pages, because if we do,
this wastes space and can cause incorrect file size.

In most cases, the file size is covered by the client
sending the file size, but if the client does not compress
a particular write, it does not send the size and the server
does not use it.  We could resolve this by having the client
always send size info and have the server always use it, but
it's better to make server writes 'hole' aware, since this
improves space usage.  (And this will be required for the
server to do recompression on read-modify-write, otherwise
no space is gained.)

DDN-bug-id: EX-8993
Was-Change-Id: I66169e205fe4691ed03b2c9b3005ffc4ecd3213d

obdclass: disable T10PI guard from disk when decompressing

When server handles chunk unaligned read, we need to read
the chunk from disk and decompress the raw data.
This means we should not use the guard tags from the storage,
as they only match the raw data.
Disable the guard from disk and the T10PI checksum will be
recalculated later using decompressed data.

DDN-bug-id: EX-9108
Was-Change-Id: I49964e1412e9d02769797c64aab290b17851e26f

ofd: take local chunk-aligned lock

On OST side to prevent racing read-modify-write against same
compressed chunk from the same client.

DDN-bug-id: EX-9192
Was-Change-Id: Iffaf2d2856e276cb2f9becce2506154314217e3c

csdc: Do not print error if a chunk is not compressed

is_chunk_start() can decide that a chunk can not be decompressed in
two cases: 1) chunk has not been compressed 2) chunk is corrupted

The error message should be printed only in case 2)

DDN-bug-id: EX-9784
Was-Change-Id: I85f4850f989ba0fc8f00653f8f6b0f1b4837d625

osd: add @read param to dt_write_prep()

the purpose is to skip full page reading when OSD is aked for
pages to be written later. in CSDC we need all data as the
pages can be compressed and we may need to decompress them
first.

DDN-bug-id: EX-9858
Was-Change-Id: I2ea9888a1dab419275dbee97e9acc661101b5262

ofd: new structures and data for csdc in ofd

just structures and few helper function to manipulate
chunks and buffers.

DDN-bug-id: EX-9858
Was-Change-Id: I25931f8360a30689a027eaf05ad6c43b4f1746f9

ofd: chunk decompress function

ofd_decompress_chunk() is to literally decompress chunks.
it uses kernel's vmap infrastructure to create a virtual
linear buffer from the pages provided by OSD.

memcpy vs vm_map_ramp()+vm_unmap_ram() benchmark as it's
a replacement for memcpy, each operation repeats 1M times
in each thread, then cost in usec is calculated:

memcpy 32 pages 1 threads - 2404282998, 2404 usec/1
memcpy 32 pages 2 threads - 4830830436, 2415 usec/1
memcpy 32 pages 4 threads - 10098563354, 2524 usec/1

vmap 32 pages 1 threads - 1088538713, 1088 usec/1
vmap 32 pages 2 threads - 2207667980, 1103 usec/1
vmap 32 pages 4 threads - 4613110111, 1153 usec/1

memcpy 64 pages 1 threads - 5564630189, 5564 usec/1
memcpy 64 pages 2 threads - 15904163026, 7952 usec/1
memcpy 64 pages 4 threads - 30345722986, 7586 usec/1

vmap 64 pages 1 threads - 1587480151, 1587 usec/1
vmap 64 pages 2 threads - 3190874847, 1595 usec/1
vmap 64 pages 4 threads - 6887315343, 1721 usec/1

the benchmark was done in qemu (6 cores enabled).

DDN-bug-id: EX-9858
Was-Change-Id: Ia46406401d3c8d720065cc8000b6a52d1a437349

ofd: vm_map_ram prot argument

From kernel 5.8 commit d4efd79a81 "mm: remove the prot argument from
vm_map_ram" the vm_map_ram() function does not accept a prot argument
anymore.

DDN-bug-id: EX-9858
Was-Change-Id: Ib878ba6c6a214ebc0b0716392ce9b7e91bb74453

ofd: csdc read helpers

few functions to implement read path in ofd.

DDN-bug-id: EX-9895
Was-Change-Id: Idca3b095471dbbf177b4026853aa716414280757

ofd: csdc write helpers

few functions to implement write path in ofd.

DDN-bug-id: EX-9895
Was-Change-Id: I0f6802b0911bd358bdb69e0ddb5e8581878cb9dc

ofd: csdc truncate support

to truncate a compressed file correctly we may need to
convert a compressed chunk into a regular one first.

DDN-bug-id: EX-9895
Was-Change-Id: Ia8a3b12eda81874e209046eef1afd33e165561b0

ofd: ofd_object_punch_compr

Fix potential memory leak in ofd_object_punch_compr.
It might not release orig_lnb in case of error from
ofd_trans_create or ofd_map_niobuf_to_chunks.

DDN-bug-id: EX-11092
Was-Change-Id: I45bafdbbf06036add5b5fa9993cbac9e06c856e9

tests: couple new FAIL codes

and trivial way to break a compressed chunk on a disk.

DDN-bug-id: EX-9858
Was-Change-Id: I5516ab3d7add4eb5d76292cf15ac220db08a7150

csdc: expand filter_fid

Expand filter_fid to include compression information, for
compatibility reason, if the file is an uncompressed file, still
store the old filter_fid with no compression info in FID EA.

WasChange-Id: I388500c03604749d05849aeed3c9141974540e4a

lfsck: support compression in filter_fid

The OST object compression info has been stored in filter_fid
by EX-8038, the LFSCK also needs to handle the compression info
during processing the filter_fid.

DDN-bug-id: EX-6247
Was-Change-Id: Id050214ba0057776a05c194dc9222117c5d7fd8b

ofd: add info in overflow error message

Such a message should help to inverstigate which
client triggered the overflow.

DDN-bug-id: EX-9895
Was-Change-Id: I701d8c8fb2a37684ecb0cd5cd272321c715db864

ofd: reject incomplete compressed chunks

client can send a compressed tail, but this RPC can race with another
newer RPC containing bits (uncompressed) from the same compression
chunk as the first RPC. OST can't handle such a compressed partial
chunk properly (that would need to decompress into a temp buffer,
then merge back to disk buffers). but we can ask the client to resend
this RPC uncompressed.

DDN-bug-id: EX-10402
Was-Change-Id: I5e854be4300d50bc8368911782018fb6fa6d38fa

Test-Parameters: forjanitoronly
Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com>
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Li Dongyang <dongyangli@ddn.com>
Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Signed-off-by: Artem Blagodarenko <artem.blagodarenko@hpe.com>
Signed-off-by: Sebastien Buisson <sbuisson@ddn.com>
Signed-off-by: Sergey Cheremencev <scherementsev@ddn.com>
Signed-off-by: Hongchao Zhang <hongchao@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I7b95416530b5d0f1994900ee4ae1ceb392046e32
68693 master J –B ✓T ✗2R -1/2−
LU-17364 mdc: ignore no-object in truncate path
reviewing Alex Zhuravlev · blocked on the owner: enforced tests failed
5 unresolved S +38 −1
8d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
failed enforced testplatformdetail
review-dne-part-2 RHEL 9.7 / x86_64 ran 11 tests. 1 tests failed: sanity-sec. session
review-dne-selinux-ssk-part-2 RHEL 8.10 / x86_64 ran 7 tests. 1 tests failed: sanity-sec. session
build #134426 SUCCESS · tests all Maloo sessions
reviews: Alexey Lyashkov -1 2026-10-25 12:18
patchsets: PS1 09-07 PS2 09-15 PS3 09-30 PS4 10-25
threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS3 2026-10-05 07:44 Gerrit AI review for Lustre COMMIT_MSG:24 — (typo) "found in a unexpected start" should read "found in an unexpected state".
Gerrit AI review for Lustre PS3 · 2026-10-05 07:44
(typo) "found in a unexpected start" should read "found in an unexpected state".
reply PS3 2026-10-05 07:44 Gerrit AI review for Lustre COMMIT_MSG:29 — (minor) This fixes an LBUG, so it should probably carry a Fixes: tag. The -ENODATA comes from mdc_attr_get(), which returns the LVB error st
Gerrit AI review for Lustre PS3 · 2026-10-05 07:44
(minor) This fixes an LBUG, so it should probably carry a Fixes: tag. The -ENODATA comes from mdc_attr_get(), which returns the LVB error stored in lvb_blocks, and from mdt_dom_lvb_alloc(), which seeds the DoM LVB with -ENODATA. Both were added together, along with mdc_io_setattr_start() returning that error, in:

Fixes: 4f35c341f22b ("LU-3285 mds: add IO locking to the MDC and MDT")
reply PS3 2026-10-05 07:44 Gerrit AI review for Lustre sanity-dom.sh:197 — (minor) PID is saved but never used: the bare `wait` below ignores the truncate's exit status, so the test can only fail by crashing the nod
Gerrit AI review for Lustre PS3 · 2026-10-05 07:44
(minor) PID is saved but never used: the bare `wait` below ignores the truncate's exit status, so the test can only fail by crashing the node. With the fix, the truncate should succeed. Would `wait $PID || error "truncate failed"` be useful here?

The test also relies on `sleep 0.3` for the truncate to reach the fail_loc before the rm. On a slow VM the rm can run first, and the test then passes without hitting the race.
reply PS3 2026-10-05 07:44 Gerrit AI review for Lustre sanity-dom.sh:200 — (minor) The file is created as $tf (that is, $DIR/$tfile), but here it is removed as $MOUNT/$tfile. If DIR is not $MOUNT, `rm -f` silently s
Gerrit AI review for Lustre PS3 · 2026-10-05 07:44
(minor) The file is created as $tf (that is, $DIR/$tfile), but here it is removed as $MOUNT/$tfile. If DIR is not $MOUNT, `rm -f` silently succeeds without removing anything, the race never happens, and the test passes without testing anything. Should this be `rm -f $tf`?
reply PS3 2026-10-05 07:44 Gerrit AI review for Lustre sanity-dom.sh:204 — (typo) "trancate" on the previous line should be "truncate". Also, the MDT puts -ENODATA (not ENOENT) into lvb_blocks, as mdt_dom_lvb_alloc(
Gerrit AI review for Lustre PS3 · 2026-10-05 07:44
(typo) "trancate" on the previous line should be "truncate". Also, the MDT puts -ENODATA (not ENOENT) into lvb_blocks, as mdt_dom_lvb_alloc() shows and as the commit message says. "brings ENOENT back to in lvb_blocks" reads a bit garbled.
owner Alex Zhuravlev · uploader Alex Zhuravlev · PS4 uploaded 10d ago · NEW · open in Gerrit ↗
commit message
LU-17364 mdc: ignore no-object in truncate path

when DoM component is presented the following race is possible:
1) 1st process initiates a truncate by filename, refreshes layout and
   about to enqueue ldlm locks on data objects (incl. DoM component)
2) 2nd process does unlink which removes the file and given the file
   is not open - kills MDT object, then releases corresponding LDLM
   lock on MDT
3) 1st process enqueues LDLM lock on DoM component, but MDT can not
   find corresponding object and returns -ENODATA in LVB's lvb_blocks
4) cl_io_loop() needs to start IO on all involved components starting
   from DoM: mdc_io_setattr_start() fails due to missing attributes
   and expected osc_io_setattr_start() is not called.
5) a part of IO starting process is osc_cache_truncate_start() which
   is to prepare data extents, so the extents belonging to OSCs are
   ignored
6) in osc_io_setattr_end() those extents are found in a unexpected
   start which is the reason for LBUG:
(osc_page.c:144:osc_page_delete()) Trying to teardown failed: -16
(osc_page.c:146:osc_page_delete()) ASSERTION( 0 ) failed:

the fix is to ignore such an error in mdc_io_setattr_start()

Test-Parameters: env=ONLY=9 testlist=sanity-dom
Test-Parameters: env=ONLY=9 testlist=sanity-dom
Test-Parameters: env=ONLY=9 testlist=sanity-dom
Assisted-by: ClaudeCode:Opus-5
Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Change-Id: I942e9372c6175c6a3a00552b9858fba26ff063f3
64440 master J !B ✓T ✗2R -1/2−
LU-19956 osc: fix race from direct ops_transfer_pinned clear
reviewing Patrick Farrell · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase 10 unresolved M +82 −16
14d
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
awaiting review (CI not green yet)
janitor run: 1 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-part-2 RHEL 9.7 / x86_64 ran 11 tests. 1 tests failed: sanity-lfsck. session
review-dne-zfs-part-4 RHEL 10.1 / x86_64 ran 9 tests. 1 tests failed: sanity-hsm. session
build #130741 SUCCESS · tests all Maloo sessions
no vote yet: Jinshan Xiong, Shaun Tancheff, Andreas Dilger, Oleg Drokin
patchsets:
+9 earlier PS1 03-09 PS2 03-09 PS3 03-09 PS4 03-09 PS5 03-09 PS6 03-09 PS7 03-09 PS8 03-10 PS9 03-10
PS10 03-10 PS11 03-11 PS12 03-11 PS13 08-31 Zhenyu Xu PS14 08-31 Andreas Dilger
threads: 10 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS14 2026-09-02 11:53 Gerrit AI review for Lustre COMMIT_MSG:35 — This paragraph describes formal_models/clio/TransferPin.tla, but the patch does not add that file and it does not exist anywhere in the tree
Gerrit AI review for Lustre PS14 · 2026-09-02 11:53
This paragraph describes formal_models/clio/TransferPin.tla, but the patch does not add that file and it does not exist anywhere in the tree:

    $ find . -name '*.tla'
    $ git log --oneline -- formal_models

Should the model be added here, or should the paragraph point at where it actually lives?
reply PS14 2026-09-02 11:53 Gerrit AI review for Lustre COMMIT_MSG:38 — The body doesn't mention the lustre/tests/sanity.sh changes at all. Two things happen there that a reader would not expect from this message
Gerrit AI review for Lustre PS14 · 2026-09-02 11:53
The body doesn't mention the lustre/tests/sanity.sh changes at all. Two things happen there that a reader would not expect from this message: test_80 is renamed to test_80a, and a new test_80b is added. The new OBD_FAIL_OSC_COMPLETION_RACE (0x41b) fail_loc isn't described either.

Renaming a long-lived subtest also breaks references to "sanity test_80" in older bug reports and results history. Would a fresh unused number for the new test avoid that?
reply PS14 2026-09-02 11:53 Gerrit AI review for Lustre COMMIT_MSG:43 — This fixes a crash, so it should carry a Fixes: tag. The direct clear of ops_transfer_pinned paired with a separate cl_page_put() goes back
Gerrit AI review for Lustre PS14 · 2026-09-02 11:53
This fixes a crash, so it should carry a Fixes: tag. The direct clear of ops_transfer_pinned paired with a separate cl_page_put() goes back to the original CLIO landing:

    Fixes: fbf5870b9848 ("land clio. b=14166")

If a more recent anchor is preferred, 364c4cdb58ed ("LU-1030 osc: move io data from lov_oinfo into osc_object") is the commit that moved the pattern from osc_page_completion_common() into what is now osc_completion().
reply PS14 2026-09-02 11:53 Gerrit AI review for Lustre lustre_osc.h:556 — This isn't a bug, but the same prototype is added to lustre/osc/osc_internal.h line 31 as well, and osc_cache.c includes both headers. The o
Gerrit AI review for Lustre PS14 · 2026-09-02 11:53
This isn't a bug, but the same prototype is added to lustre/osc/osc_internal.h line 31 as well, and osc_cache.c includes both headers. The only new caller is osc_cache.c, inside the osc module, so the osc_internal.h declaration on its own would do - and then EXPORT_SYMBOL() in osc_page.c isn't needed either. No code outside osc references osc_page_transfer_put().
reply PS14 2026-09-02 11:53 Gerrit AI review for Lustre osc_cache.c:1395 — Not introduced here, but this comment now reads badly next to a sleeping call. osc_completion() is not called under cl_loi_list_lock - osc_e
Gerrit AI review for Lustre PS14 · 2026-09-02 11:53
Not introduced here, but this comment now reads badly next to a sleeping call. osc_completion() is not called under cl_loi_list_lock - osc_extent_finish() calls osc_free_grant() after the loop, and that takes cl_loi_list_lock itself:

    osc_free_grant() { ... spin_lock(&cli->cl_loi_list_lock); ... }

Since the function is being touched anyway, would it be worth correcting the comment so the new CFS_FAIL_TIMEOUT_MS() doesn't look like it sleeps under a spinlock?
reply PS14 2026-09-02 11:53 Gerrit AI review for Lustre osc_cache.c:1455 — The injection sits between cl_page_get() and osc_page_transfer_put(), so what it widens is the interval where the page is still pinned and s
Gerrit AI review for Lustre PS14 · 2026-09-02 11:53
The injection sits between cl_page_get() and osc_page_transfer_put(), so what it widens is the interval where the page is still pinned and still CPS_PAGEOUT. That is exactly the interval this patch argues is safe. The window the commit message is worried about is transfer_put -> cl_page_complete, and nothing is injected there.

Also, the fail_loc only exists in the fixed code, so the test can't fail before the fix and pass after it. Should the sleep go between osc_page_transfer_put() and cl_page_complete(), and should it be added on top of the old ordering to demonstrate the failure?
reply PS14 2026-09-02 11:53 Gerrit AI review for Lustre sanity.sh:12982 — This description doesn't match the code being fixed. Before this patch osc_completion() did its own cl_page_put() for every non-transient pa
Gerrit AI review for Lustre PS14 · 2026-09-02 11:53
This description doesn't match the code being fixed. Before this patch osc_completion() did its own cl_page_put() for every non-transient page:

    if (cptype != CPT_TRANSIENT)
        cl_page_put(env, page);

so the pin's reference was always released and nothing was orphaned. osc_page_delete() skipping its cl_page_put() when the flag is already clear is the intended behaviour of osc_page_transfer_put(), not a leak.

The failure the commit message describes is ASSERTION(!opg->ops_transfer_pinned) in osc_page_transfer_get(), which is a different symptom from an LBUG in cl_batch_put(). Could the comment be reworded to match?
reply PS14 2026-09-02 11:53 Gerrit AI review for Lustre sanity.sh:12995 — fail_loc is global and osc_completion() runs once per page, so this makes every OSC completion on the client sleep 100ms for 30 seconds. osc
Gerrit AI review for Lustre PS14 · 2026-09-02 11:53
fail_loc is global and osc_completion() runs once per page, so this makes every OSC completion on the client sleep 100ms for 30 seconds. osc_extent_finish() walks ext->oe_pages calling osc_completion() for each, and it runs in brw_interpret() on a ptlrpcd thread - a 1MiB RPC is 256 pages, so ~25s of uninterruptible sleep in one interpreter.

The cancellation loop this test drives goes through the same path:

    osc_lock_flush() -> osc_cache_writeback_range() -> osc_extent_finish() -> osc_completion()

so a blocking AST that has to flush a megabyte of dirty pages now takes longer than ldlm_timeout, which risks evicting the client rather than reproducing the race. Would a much smaller fail_val, or a CFS_FAIL_ONCE variant, still widen the window enough?
reply PS14 2026-09-02 11:53 Gerrit AI review for Lustre sanity.sh:13010 — The filesystem name is hard-coded. On any mount where FSNAME isn't "lustre" this glob matches nothing, lctl fails, and since errors are redi
Gerrit AI review for Lustre PS14 · 2026-09-02 11:53
The filesystem name is hard-coded. On any mount where FSNAME isn't "lustre" this glob matches nothing, lctl fails, and since errors are redirected the while loop exits on the first iteration - the lock-cancellation half of the test silently never runs. Combined with the fact that the test makes no assertion, that is a vacuous pass.

Other cases in this suite avoid it, e.g. test at line 18635 uses:

    ldlm.namespaces.*-OST0000-osc-*.lru_size=clear

Using $FSNAME (or a leading wildcard) would fix it.
reply PS14 2026-09-02 11:53 Gerrit AI review for Lustre sanity.sh:13018 — kill only reaps the two subshells; the dd or lctl child running at that moment survives, so writes can continue into the next subtest. Addin
Gerrit AI review for Lustre PS14 · 2026-09-02 11:53
kill only reaps the two subshells; the dd or lctl child running at that moment survives, so writes can continue into the next subtest. Adding the child pids, or a `wait` on the dd itself, would make this deterministic.

test_80a removes $DIR/$tfile when it finishes - a stack_trap for the file here would keep the two consistent.
owner Patrick Farrell · uploader Andreas Dilger · PS14 uploaded 65d ago · NEW · open in Gerrit ↗
commit message
LU-19956 osc: fix race from direct ops_transfer_pinned clear

The ops_transfer_pinned flag in osc_page is paired
with a cl_page reference -- the flag and the ref must
always be managed together through the
osc_page_transfer_get/put() accessors.

osc_completion() violated this by clearing the flag
directly and dropping the ref with a separate
cl_page_put().  This decoupled the flag from the ref,
opening a race on weakly-ordered architectures.

The initial fix (complete first, then transfer_put)
introduced a re-submission crash: once
cl_page_complete() transitions the page to CPS_CACHED,
a concurrent write can re-submit it via
osc_page_cache_add -> osc_page_transfer_get, which
asserts the pin is clear.  If the old completion has
not yet called transfer_put, the assert fires.

Fix osc_completion to release the transfer pin BEFORE
cl_page_complete().  While still in CPS_PAGEOUT, the
state machine prevents any other transition, so the
transfer_put is race-free.  Take a temporary cl_page
ref first: transfer_put drops the pin's ref (cp_ref
2->1), and cl_page_complete's end_page_writeback can
make the page reclaimable on another CPU.

A TLA+ formal model (formal_models/clio/TransferPin.tla)
with the NoPinWhileCached invariant verifies this fix
catches the re-submission crash in all three buggy
variants (original, LASSERT-in-delete, complete-first).

Generated with Claude Code + Tools

Test-Parameters: testlist=sanity env=ONLY=80b
Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Change-Id: Ib8416c753e13fe6eb8e11790b63687fbc2c8a26d
14288 master J –B ✓T ✓R +0/2−
LU-6418 llite: Simplify code of ll_direct_rw_pages
reviewing Wu Libin · awaiting review (CI not green yet)
M +10 −46
28d
reviews: Jinshan Xiong +1 2015-04-07 17:48 · Timothy Day -1 2026-10-07 19:32
owner Wu Libin · uploader Wu Libin · PS3 uploaded 4233d ago · NEW · open in Gerrit ↗
commit message
LU-6418 llite: Simplify code of ll_direct_rw_pages

In function ll_direct_rw_pages, the cl_page_find will return a
cl_page with cp_type with value of CPT_TRANSIENT for sure. And
it will not cache this type of cl_page anymore. This patch remove
the code of logical when cp_type is equal to CPT_CACHEABLE which
is needed in old version.

Signed-off-by: Wu Libin <lwu@ddn.com>
Change-Id: I6634c31dca65a54ad6d0e092554c033403315077
57454 master J !B ✓T ✗1R 0/2
LU-18461 layout: allow to be started from zero offset.
reviewing Alexey Lyashkov · blocked on the owner: enforced tests failed
70 unresolved XL +1309 −65
30d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
janitor run: 3 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-part-5 RHEL 9.7 / x86_64 ran 7 tests. 1 tests failed: lustre-rsync-test. session
build #132562 SUCCESS · tests all Maloo sessions
no vote yet: James Simmons, Alexander Boyko, Andreas Dilger, Mikhail Pershin
patchsets:
+33 earlier PS1 12-16 PS2 12-17 PS3 12-27 PS4 01-10 PS5 02-18 PS6 02-19 PS7 02-21 PS8 02-27 PS9 02-28 PS10 03-18 PS11 05-23 PS12 08-22 PS13 09-09 PS14 09-22 PS15 10-15 PS16 10-17 PS17 10-22 PS18 11-03 PS19 12-18 PS20 12-18 PS21 12-25 PS22 01-13 PS23 01-27 PS24 02-20 PS25 02-28 PS26 03-02 PS27 03-02 PS28 04-24 PS29 04-27 PS30 05-19 PS31 05-21 PS32 05-26 PS33 06-02
PS34 08-20 PS35 08-25 PS36 09-14 PS37 09-23 PS38 09-29
threads: 70 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS30 2026-05-21 21:31 Andreas Dilger COMMIT_MSG:10 — (typo) "Do object"?
Andreas Dilger PS30 · 2026-05-21 21:31
(typo) "Do object"?
reply PS34 2026-08-21 02:39 Gerrit AI review for Lustre COMMIT_MSG:7 — (style) The subject has no grammatical subject - "allow to be started" leaves out what is being started. Something like "allow components to
Gerrit AI review for Lustre PS34 · 2026-08-21 02:39
(style) The subject has no grammatical subject - "allow to be started" leaves out what is being started. Something like "allow components to start at offset zero" reads better, and the trailing period is not usual for Lustre subjects.

More importantly, neither the subject nor the body names anything that this patch actually adds: `LOV_PATTERN_ZEROSTART`, `LLAPI_LAYOUT_ZEROSTART`, the `zerostart` layout type, or `lfs setstripe --zerostart`. That makes the change hard to find later with `git log --grep`.
reply PS34 2026-08-21 02:39 Gerrit AI review for Lustre COMMIT_MSG:10 — (typo) "Do object" - DoM?
Gerrit AI review for Lustre PS34 · 2026-08-21 02:39
(typo) "Do object" - DoM?

This was raised on an earlier patchset and still reads the same way here.
reply PS34 2026-08-21 02:39 Gerrit AI review for Lustre COMMIT_MSG:19 — Several hunks are not accounted for by the description; could they be explained, or split out?
Gerrit AI review for Lustre PS34 · 2026-08-21 02:39
Several hunks are not accounted for by the description; could they be explained, or split out?

- osc_cache.c: the LASSERTF message gains `io %px`, which looks like debug instrumentation for this work rather than part of the feature.
- lfs.c `case 'C'`: the guard changes from `lsa_pattern == LLAPI_LAYOUT_MDT` to `(lsa_pattern & LLAPI_LAYOUT_RAID0) == 0`, a behaviour change to `-C|--overstripe-count` validation.
- lov_io.c `lov_io_layout_at()` and lov_offset.c `lov_stripe_offset()`: `return` converted to `RETURN()`.
- lov_offset.c: blank line after the SPDX tag removed.
- sanity-pfl.sh test_16b: two blank lines removed.
- lov_cl_internal.h: `lov_foreach_io_layout()` split into two macros.

It would also help to state the interop story here: `LOV_PATTERN_ZEROSTART` is a new on-disk/on-wire pattern bit, so a client older than this patch fails `lov_pattern_supported()` on such a layout and cannot open the file, and an older MDS rejects the setstripe. Is a version/feature gate expected, or is "both ends must be new" the intended contract?
reply PS36 2026-09-15 22:37 Gerrit AI review for Lustre COMMIT_MSG:10 — (typo) "Do object" -> "DoM object". This was raised on patchset 30 and is still here.
Gerrit AI review for Lustre PS36 · 2026-09-15 22:37
(typo) "Do object" -> "DoM object". This was raised on patchset 30 and is still here.
reply PS36 2026-09-15 22:37 Gerrit AI review for Lustre COMMIT_MSG:19 — The body describes the motivation well but never names anything the patch adds, so this won't be findable later with `git log --grep`. Could
Gerrit AI review for Lustre PS36 · 2026-09-15 22:37
The body describes the motivation well but never names anything the patch adds, so this won't be findable later with `git log --grep`. Could it mention `--zerostart`, `LOV_PATTERN_ZEROSTART`/`LLAPI_LAYOUT_ZEROSTART` and `lsme_is_zerostart()` explicitly?

It also doesn't cover the largest kernel-side piece: the rework of `lov_io_iter_init()` that pulls the last stripe of the preceding component into a truncate so the KMS survives when a ZEROSTART component is truncated to its own start. That deserves a paragraph.

A few hunks are not explained at all and read as leftovers - should they be split out, or described?

- `lustre/osc/osc_cache.c`: the `osc_extent_find()` LASSERTF() gains the `io %px` argument; it looks like a debugging aid rather than part of the feature.
- `lustre/utils/lfs.c`: the `-C|--overstripe-count` check changes from `== LLAPI_LAYOUT_MDT` to `& LLAPI_LAYOUT_RAID0` and the message text changes. That is a user-visible behaviour change and isn't needed for `--zerostart` to work.
- `lustre/tests/sanity-dom.sh`: dropping the explicit `mkdir -p $MOUNT2` / `mount_client $MOUNT2` is unrelated to this feature (it is redundant with `MOUNT_2=yes` + `check_and_setup_lustre`, so it looks correct, just out of scope).
reply PS38 2026-10-05 11:26 Gerrit AI review for Lustre COMMIT_MSG:10 — (typo) "Do object" was pointed out on patch set 30 and is still here. Should it be "DoM object"?
Gerrit AI review for Lustre PS38 · 2026-10-05 11:26
(typo) "Do object" was pointed out on patch set 30 and is still here. Should it be "DoM object"?
reply PS38 2026-10-05 11:26 Gerrit AI review for Lustre COMMIT_MSG:13 — (style) The body explains the motivation but not what the patch actually changes, so it is hard to find later with git log. If the patch is
Gerrit AI review for Lustre PS38 · 2026-10-05 11:26
(style) The body explains the motivation but not what the patch actually changes, so it is hard to find later with git log. If the patch is refreshed, could it name:

- the new `LOV_PATTERN_ZEROSTART` / `LLAPI_LAYOUT_ZEROSTART` pattern bit
- the `lfs setstripe --zerostart` and `-L raid0,zerostart` options
- the truncate change in lov_io_iter_init(), which pulls the last stripe of the preceding component into a truncate landing on a ZEROSTART component start
- the new sanity-zero.sh suite

Also, the subject should not end with a period.
reply PS36 2026-09-15 22:37 Gerrit AI review for Lustre lfs-setstripe.1:189 — (minor) There is no `lfs join` command or `lfs-join.1` man page in the tree - the join-file feature was removed, as the commit message itsel
Gerrit AI review for Lustre PS36 · 2026-09-15 22:37
(minor) There is no `lfs join` command or `lfs-join.1` man page in the tree - the join-file feature was removed, as the commit message itself notes. This cross-reference will be a dangling link; could the sentence just describe the property directly?
reply PS36 2026-09-15 22:37 Gerrit AI review for Lustre lfs-setstripe.1:219 — (typo) "below" - the `--zerostart` description is above this one in the page.
Gerrit AI review for Lustre PS36 · 2026-09-15 22:37
(typo) "below" - the `--zerostart` description is above this one in the page.
reply PS37 2026-09-24 09:18 Gerrit AI review for Lustre lfs-setstripe.1:599 — (minor) EXAMPLES doesn't gain a `--zerostart` case. A short composite example, e.g. a DoM or plain first component followed by a zerostart o
Gerrit AI review for Lustre PS37 · 2026-09-24 09:18
(minor) EXAMPLES doesn't gain a `--zerostart` case. A short composite example, e.g. a DoM or plain first component followed by a zerostart one, would show how the option is meant to be combined - the option description alone leaves that to the reader.
reply PS38 2026-10-05 11:26 Gerrit AI review for Lustre lfs-setstripe.1:217 — (typo) "see --zerostart below": the --zerostart option is described above this point in the page.
Gerrit AI review for Lustre PS38 · 2026-10-05 11:26
(typo) "see --zerostart below": the --zerostart option is described above this point in the page.
owner Alexey Lyashkov · uploader Alexey Lyashkov · PS38 uploaded 36d ago · NEW · open in Gerrit ↗
commit message
LU-18461 layout: allow to be started from zero offset.

Traditional PFL objects have a hole at the start to accommodate the
Do object if it needs to be migrated. This is not always necessary,
however, as the hole can prevent the use of large files with a small
number of OST objects in the ldiskfs backend.

Introducing the ability to eliminate this hole at the beginning could
provide an opportunity for OST objects to be moved across components
and offsets, and allow for a greater number of OST objects to be
stored in larger files. Additionally, multiple files could be combined
into one, similar to the join file feature of the past, once
components are able to be relocated.

Test-Parameters: testlist=sanity-zero
Signed-off-by: Alexey Lyashkov <alexey.lyashkov@hpe.com>
Change-Id: I730c66c695a3ff718c78cb82dab878b4f720bf55
68371 master J ✗1B ✗T –R -1/2−
LU-10026 osc: Add counters for compressed data
reviewing Marc Vef · blocked on the owner: janitor: test failures unique to this patch; build failure
1 unique failure csdc 1 unresolved L +544 −265
69d
blocked on the owner: janitor: test failures unique to this patch; build failure
awaiting review (CI not green yet)
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
sanity-pfl@ldiskfs+DNE:test_100bseen in 5 other reviews
build #130346 FAILURE
no vote yet: Sebastien Buisson, Artem Blagodarenko, Vitaliy Kuznetsov
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 10:37 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 10:37
[Marc Bot] upstream remarks for reference:

- The removed dead decompression helpers (decompress_chunk_in_lnb / decompress_rnb) were deleted against their current (folio/accessor) form.
- obt_compr_stats placed after the histogram member master added since.
- The osc stats_compr file and the compress_type_fast/best entries live in the debugfs vars table; the stats_compr fops therefore use LDEBUGFS_SEQ_FOPS (LPROC_SEQ_FOPS produces struct proc_ops on kernels >= 5.6, which the CI -Werror build rejects for debugfs entries). The ofd counter-init sits next to the reworked kernel-doc of ofd_stats_counter_init().
- New tests' old-version gates converted to compression_supported; the counter-reset calls are unconditional (the parameters always exist on a server with this series).
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 osc: Add counters for compressed data

This patch is the first of two patches that add counters
to track client/server-side data compression statistics.
This patch add new compr_stats file in osc.*.compr_stats.

From added counters:
1. Size of compressed/uncompressed chunks written/read by
   client to compressed files, in chunk/bytes;
2. Compressed page counter;

ofd: Add counters for compressed data

This patch is the second of two patches that add counters
to track server-side data compression statistics.
From added counters:
1. Size of compressed/uncompressed chunks read by
   client to compressed files, in chunk/bytes;

Example:
	obdfilter.lustre-OST0000.stats_compr=
	snapshot_time             1715876501.602669648 secs.nsecs
	start_time                1715873670.819396144 secs.nsecs
	elapsed_time              2830.783273504 secs.nsecs
	compressed_objects        2 samples [reqs]
	uncompressed_objects      1 samples [reqs]
	compr_bytes_read          885 samples [bytes] 557 126974 52174403
	compr_bytes_read_raw      893 samples [bytes] 16384 131104 115885042
	incompr_bytes_read        8 samples [bytes] 16384 16384 131072
	compr_chunks_read         885 samples [reqs]
	incompr_chunks_read       8 samples [reqs]

DDN-bug-id: EX-7729
Was-Change-Id: I0998b1facaffd3e84b8d9429c5674d8d9ad60020

csdc: rename client-side stats

Some CSDC client-side stats can be confusing for the uninitiated:
- write_pages_compr is the number of pages from the 'raw' file that
  could actually be compressed;
- write_pages_uncompr is the number of pages from the 'raw' file that
  count not be compressed;
- write_chunks_compr is the number of chunks from the 'raw' file that
  could actually be compressed;
- write_chunks_no_compr is the number of chunks from the 'raw' file
  that count not be compressed;
- read_pages_compr is the number of pages from the 'raw' file that
  were actually compressed;
- read_chunks_compr is the number of chunks from the 'raw' file that
  were actually compressed;

So rename those parameters as follows:

    write_pages_compr -> write_pages_compressible
    write_pages_uncompr -> write_pages_incompressible
    write_chunks_compr -> write_chunks_compressible
    write_chunks_no_compr -> write_chunks_incompressible
    read_pages_compr -> read_pages_compressed
    read_chunks_compr -> read_chunks_compressed

And also change the corresponding field names in struct client_obd to
make them more explicit.

DDN-bug-id: EX-10914
Was-Change-Id: Ia876e0cde435095493e0b7457ce7f363ea86146d

test: sanity-compr.sh/test_1001 error

sanity-compr test_1001: operand expected (error token is "+ ")

Some compression stat counters could be 0 and not shows in the
stats_compr stats, so we need to assign 0 to the counter if
necessary.

DDN-bug-id: EX-10088
Was-Change-Id: I87948a61e591680d105a8a98a4cde4fba634e5fe

tests: fix check compr_chunk in test 1020

Skip test 1020 in sanity-compr, which depends on fixes
applied to the code that were not available in older
versions.

Temporarily add an additional tolerance of 1 unit when
checking the number of chunks in test 1020 in
sanity-compr.sh

DDN-bug-id: EX-10914
Was-Change-Id: Ia1c071d754217127decbf4d4397a58b512808843

Test-Parameters: forjanitoronly
DDN-bug-id: EX-7729
Signed-off-by: Vitaliy Kuznetsov <vkuznetsov@ddn.com>
Signed-off-by: Sebastien Buisson <sbuisson@ddn.com>
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I091153480e53309c641d39f271bef536296dc09e
68390 master J !B ✗T –R 0/2
LU-10026 mmap: add mmap support for compression
reviewing Marc Vef · blocked on the owner: build failure
csdc 1 unresolved L +446 −78
69d
blocked on the owner: build failure
awaiting review (CI not green yet)
janitor run: 31 failing config(s), none unique to this patch — janitor results
build #130362 FAILURE
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-26 12:50 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-26 12:50
[Marc Bot] upstream remarks for reference:

- OBD_FAIL_LOV_SKIP_CHECK_COMPR renumbered to 0x143a: the original's 0x1436 collides with OBD_FAIL_LLITE_TRUNC_PAUSE on this branch, and the original's sanity.sh test actually set fail_loc=0x1429, which is OBD_FAIL_LLITE_FORCE_BIO_AS_DIO - both the define and the test now use 0x143a consistently.
- The osd_lseek() compressed-object rejection was merged into the current form of the function (osd_get_filp_for_inode(), not osd_alloc_file_pseudo()); osd_xattr_get() prototype added to osd_internal.h.
- mmap_copy_file added to the current THETESTS line in tests/Makefile.am.
- test_1003 anchored before test_1004; its gate and the sanity.sh 460g gate converted to compression_supported.
tags: csdc
owner Marc Vef · uploader Marc Vef · PS1 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 mmap: add mmap support for compression

This removes the EOPNOTSUPP for compression with mmap and
adds an mmap sanity test for compression.  This patch
removes all the restrictions for mmap, but we actually only
have unaligned read support right now, so the test is
deliberately simplified to only test reads.

A more complicated version which also tests mmap writes
comes later in the series, once read-modify-write is
supported.

The test tests mmap by copying data at several different
block sizes with several different compression chunk sizes.

tests: add mmap write test

This improves the existing mmap test to test mmap writing
as well as mmap reading.

DDN-bug-id: EX-7601
Was-Change-Id: I81840c7bbbefbc5c3bae6b270c2d94297a254d19

csdc: server reject FIEMAP/SEEK_HOLE|DATA on compr obj

Server return -EOPNOTSUPP if they get the FIEMAP and
SEEK_HOLE/SEEK_DATA requests upon compressed file objects.

DDN-bug-id: EX-8927
Was-Change-Id: I9f04fbb13a22cc83402d9989daab63a59367ff33

csdc: check ocd flag for fiemap/lseek

Currently client will not sending fiemap/lseek request to OST if
the file is a compressed one. This patch will check the
OBD_CONNECT2_COMPRESS flags and send the request if OST supports
compression as server would do the fiemap/lseek check instead.

DDN-bug-id: EX-8927
Was-Change-Id: I478cbf161044165fa31d4caa2336e9949fc626fe

Test-Parameters: forjanitoronly
DDN-bug-id: EX-7644
Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I4a37b106831a903d90e8a8871e9a93baac4e201e
68349 master J ✗2B ✗T –R +0/2−
LU-10026 osc: limit compression chunks in RPC
reviewing Marc Vef · blocked on the owner: janitor: test failures unique to this patch; build failure
2 unique failures csdc 2 unresolved L +283 −22
70d
blocked on the owner: janitor: test failures unique to this patch; build failure
awaiting review (CI not green yet)
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
runtests@ldiskfs+DNE:test_1seen in 10 other reviews
runtests-ssk@ldiskfs+SharedKey:test_1seen in 10 other reviews
build #130327 FAILURE
reviews: Alex Zhuravlev +1 2026-08-26 11:31
no vote yet: Artem Blagodarenko
patchsets: PS1 08-25 PS2 08-26
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-08-25 21:24 Marc Vef patchset comment — [Marc Bot] upstream remarks for reference:
Marc Vef PS1 · 2026-08-25 21:24
[Marc Bot] upstream remarks for reference:

Port notes:

- try_to_add_extent_for_io()/get_write_extents() gained their env parameter
  on top of master's reworked extent-RPC code: the erd_max_compr_chunks
  member was added to the write_rpc_def()/read_rpc_def() initializer macros
  (which master introduced since), with the macros now taking the osc
  object.
- Page indices in the chunk-counting loops use osc_index() - struct
  brw_page no longer has a bp_page member on master (folio-based).
- The RPC-fragment limiting in the submit path is applied in
  osc_io_submit() only; master has since split direct-IO submission into
  osc_dio_submit(), which keeps its existing behaviour (DIO on compressed
  files is restricted to chunk-aligned IO anyway).
- cp_compr_chunk_log_bits -> cp_compr_chunk_lum_bits (series field naming).
- Fixed a short memcpy in the chunk-ledger growth helper
  (expand_osc_compr_chunk_array copied the element count as bytes,
  losing 3/4 of the saved entries on expansion).
- The new sanity-compr test_1016 gained a compression_supported skip guard
  (it had none).
reply PS2 2026-08-26 10:30 Misc Code Checks Robot (Gatekeeper helper) osc_io.c:138 — error: osc_io_submit():'osc' dereferencing possible ERR_PTR()
Misc Code Checks Robot (Gatekeeper helper) PS2 · 2026-08-26 10:30
error: osc_io_submit():'osc' dereferencing possible ERR_PTR()
tags: csdc
owner Marc Vef · uploader Marc Vef · PS2 uploaded 70d ago · NEW · open in Gerrit ↗
commit message
LU-10026 osc: limit compression chunks in RPC

Limit the number of partial compressed chunks that can be sent to
the server in a single RPC, so that it doesn't need to allocate
buffers for read-modify-write on a huge number of chunks at once.
It is better to handle that in separate server threads.

In the worst case, each extent in the BRW RPC belongs to a different
compression chunk, so the worst_case_chunks would expand on the OSS
to worst_case_chunks * compression_chunk_size bytes IO on the server.
That might be hundreds of MB in size per thread and LASSERT or OOM.

Add tunable osc.*.compress_rpc_fragment_ratio to reduce the maximum
compressed chunks by the given factor, its value ranges in [1, 32].

osc: scan extents to find compression chunks

as we can't trust oe_start and oe_end, we have to scan all the
pages covered by extent and so find all compression chunks to
estimate and limit potential read-modify-write IO on OST.

osc_submit_io() should not create too big extents we can't send
due to limits for compressed chunks.

DDN-bug-id: EX-10141
Was-Change-Id: I00b104ded6cdb8e66414eb2f759f6dca1b7b4d11

osc: make oti_compr_chunks ledger expandable

This patch makes osc_thread_info::oti_compr_chunks an expandable
array.

DDN-bug-id: EX-10361
Was-Change-Id: Ib2ad5407815c733687eadd4a46014d0a694dbf41

osc: expand_osc_compr_chunks_array() use atomic alloc

This can be called in "spinlock" context and generate a stack dump:

  BUG: sleeping function called from invalid context
  in_atomic(): 1, irqs_disabled(): 0, name: ptlrpcd_00_02
  Call Trace:
    ___might_sleep.cold.23+0x104/0x118
    kmem_cache_alloc_trace+0x1cd/0x2a0
    expand_osc_compr_chunk_array+0xc6/0x5d0 [osc]
    try_to_add_extent_for_io.isra.10+0x11f6/0x16b0 [osc]
    osc_io_unplug0+0x6a4/0x1b50 [osc]
    brw_queue_work+0x29/0xb0 [osc]
    work_interpreter+0x2b/0x100 [ptlrpc]
    ptlrpc_check_set+0x583/0x2fe0 [ptlrpc]
    ptlrpcd_check+0x511/0x570 [ptlrpc]
    ptlrpcd+0x1b5/0x4b0 [ptlrpc]

DDN-bug-id: EX-10361
Was-Change-Id: I72f30b5185be0417c1bb7170ac278f48b04e7d0b

osc: revert to correct cl_max_extent_pages

otherwise grant overhead calculation breaks.

DDN-bug-id: EX-10267
Was-Change-Id: I4e74524b17c7834c432a708bb917f291fd773023

Test-Parameters: forjanitoronly
DDN-bug-id: EX-10047
Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I4d0b4bdaaa91f46147d2ca1c52741117533f8f7a
62675 master J !B ✓T ✗2R +0/2−
LU-19569 ofd: print more logs for -ENOSPC
reviewing Hongchao Zhang · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase S +19 −5
74d
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
awaiting review (CI not green yet)
janitor run: 5 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
custom-1001 RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 ran 1 tests. 1 tests failed: node-provisioning. %% NODE-PROVISIONING FAILED MULTIPLE TIMES FOR custom %% http session
review-ldiskfs-dne RHEL 8.10 / x86_64 ran 5 tests. 1 tests failed: sanity. session
build #120861 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger +1 2026-01-22 02:21
no vote yet: Qian Yingjin, Jian Yu
patchsets:
+9 earlier PS1 11-24 PS2 11-24 PS3 11-25 PS4 11-26 PS5 11-28 PS6 12-01 PS7 12-05 PS8 12-09 PS9 12-16
PS10 12-18 PS11 12-19 PS12 12-26 PS13 01-22 Andreas Dilger PS14 01-22 Andreas Dilger
owner Hongchao Zhang · uploader Andreas Dilger · PS14 uploaded 287d ago · NEW · open in Gerrit ↗
commit message
LU-19569 ofd: print more logs for -ENOSPC

Print more logs for test_45 in sanity-lfsck to error -ENOSPC

Test-Parameters: trivial clientdistro=rocky9.5 clientarch=aarch64 serverarch=x86_64 serverdistro=el8.10 testlist=sanity-lfsck,sanity-lfsck,sanity-lfsck,sanity-lfsck,sanity-lfsck env=DEBUG_SIZE=100
Signed-off-by: Hongchao Zhang <hongchao@whamcloud.com>
Change-Id: Iacab1d1c4ff5a0ce78b9751c3ca3caf4c1c76911
66111 master J ✗45B ✓T ✗0R 0/2
DRAFT LU-20244 utils: add support to resync a region
reviewing Ronnie Sahlberg · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
45 unique failures ec2 pt_ecro M +84 −36
78d
blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
awaiting review (CI not green yet)
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
sanity-ec@ldiskfs+DNE:test_1aseen in 21 other reviews
sanity-ec@ldiskfs+DNE:test_1bseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_1cseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_1dseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_1gseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_4eseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_5aseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_5bseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_6aseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_6bseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_6dseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_6eseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_7seen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_23aseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_23bseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_23cseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_24aseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_24bseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_25aseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_26aseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_26bseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_27aseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_28aseen in 22 other reviews
sanity-ec@zfs:test_1aseen in 21 other reviews
sanity-ec@zfs:test_1bseen in 23 other reviews
sanity-ec@zfs:test_1cseen in 23 other reviews
sanity-ec@zfs:test_1dseen in 23 other reviews
sanity-ec@zfs:test_1gseen in 23 other reviews
sanity-ec@zfs:test_4eseen in 23 other reviews
sanity-ec@zfs:test_5aseen in 23 other reviews
sanity-ec@zfs:test_5bseen in 22 other reviews
sanity-ec@zfs:test_6aseen in 23 other reviews
sanity-ec@zfs:test_6bseen in 23 other reviews
sanity-ec@zfs:test_6dseen in 23 other reviews
sanity-ec@zfs:test_6eseen in 23 other reviews
sanity-ec@zfs:test_7seen in 23 other reviews
sanity-ec@zfs:test_23aseen in 22 other reviews
sanity-ec@zfs:test_23bseen in 22 other reviews
sanity-ec@zfs:test_24aseen in 22 other reviews
sanity-ec@zfs:test_24bseen in 22 other reviews
sanity-ec@zfs:test_25aseen in 22 other reviews
sanity-ec@zfs:test_26aseen in 22 other reviews
sanity-ec@zfs:test_26bseen in 22 other reviews
sanity-ec@zfs:test_27aseen in 22 other reviews
sanity-ec@zfs:test_28aseen in 22 other reviews
no vote yet: Marc Vef, Andreas Dilger
patchsets: PS1 05-25 PS2 05-25 PS3 05-25 PS4 08-18
tags: pt_ecro
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS4 uploaded 78d ago · NEW · open in Gerrit ↗
commit message
DRAFT LU-20244 utils: add support to resync a region

Add support to resync EC for a region of a file instead of the entire
file.

Test-Parameters: testlist=sanity-ec
Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com>
Change-Id: I49a0ab53e7948c40086b532a0e6f9298d1bc8e1e
66112 master J ✗45B ✓T ✗0R 0/2
DRAFT LU-20244 utils: resync/verify stale mirrors in 1GB chunks.
reviewing Ronnie Sahlberg · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
45 unique failures ec2 pt_ecro 3 unresolved S +30 −4
78d
blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
awaiting review (CI not green yet)
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
sanity-ec@ldiskfs+DNE:test_1aseen in 21 other reviews
sanity-ec@ldiskfs+DNE:test_1bseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_1cseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_1dseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_1gseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_4eseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_5aseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_5bseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_6aseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_6bseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_6dseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_6eseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_7seen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_23aseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_23bseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_23cseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_24aseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_24bseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_25aseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_26aseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_26bseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_27aseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_28aseen in 22 other reviews
sanity-ec@zfs:test_1aseen in 21 other reviews
sanity-ec@zfs:test_1bseen in 23 other reviews
sanity-ec@zfs:test_1cseen in 23 other reviews
sanity-ec@zfs:test_1dseen in 23 other reviews
sanity-ec@zfs:test_1gseen in 23 other reviews
sanity-ec@zfs:test_4eseen in 23 other reviews
sanity-ec@zfs:test_5aseen in 23 other reviews
sanity-ec@zfs:test_5bseen in 22 other reviews
sanity-ec@zfs:test_6aseen in 23 other reviews
sanity-ec@zfs:test_6bseen in 23 other reviews
sanity-ec@zfs:test_6dseen in 23 other reviews
sanity-ec@zfs:test_6eseen in 23 other reviews
sanity-ec@zfs:test_7seen in 23 other reviews
sanity-ec@zfs:test_23aseen in 22 other reviews
sanity-ec@zfs:test_23bseen in 22 other reviews
sanity-ec@zfs:test_24aseen in 22 other reviews
sanity-ec@zfs:test_24bseen in 22 other reviews
sanity-ec@zfs:test_25aseen in 22 other reviews
sanity-ec@zfs:test_26aseen in 22 other reviews
sanity-ec@zfs:test_26bseen in 22 other reviews
sanity-ec@zfs:test_27aseen in 22 other reviews
sanity-ec@zfs:test_28aseen in 22 other reviews
no vote yet: Marc Vef, Andreas Dilger
patchsets: PS1 05-25 PS2 05-25 PS3 05-25 PS4 08-18
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS3 2026-05-26 08:20 Andreas Dilger COMMIT_MSG:14 — I don't see this patch doing these things, mainly changing the buffer size?
Andreas Dilger PS3 · 2026-05-26 08:20
I don't see this patch doing these things, mainly changing the buffer size?
reply PS3 2026-05-26 08:20 Andreas Dilger lfs.c:14655 — How was this 1GiB buffer size selected?
Andreas Dilger PS3 · 2026-05-26 08:20
How was this 1GiB buffer size selected?
reply PS3 2026-05-26 08:20 Andreas Dilger lfs.c:14663 — The file was stat'dback on line 14591, so that could be used here instead of a new stat() call? If there is a reason the stat() info has go
Andreas Dilger PS3 · 2026-05-26 08:20
The file was stat'dback on line 14591, so that could be used here instead of a new stat() call?  If there is a reason the stat() info has gone stale since the start of this function, then that is probably a sign the file shouldn't be resync'd at this time.
tags: pt_ecro
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS4 uploaded 78d ago · NEW · open in Gerrit ↗
commit message
DRAFT LU-20244 utils: resync/verify stale mirrors in 1GB chunks.

Instead of resyncing each stale mirror, one after the other, resync/verify
the mirrors one chunk (1GB region) of the file at a time.
This is so that if we are resyncing/verifying multiple stale mirrors at a time,
that we read data from the up-to-date mirror once, for generating/writing to the first
stale mirror and then re-read the original data from page-cache when generating/writing
to the other stale mirrors.

Otherwise if we resync/verify the whole mirrors one at a time, we risk for very large
files that the read data from the good mirror will fall out of cache and need te be
re-read for each stale submirror.

Test-Parameters: testlist=sanity-ec
Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com>
Change-Id: I279cdedf9b07c8f091747fcaa5b103852ee166c7
66110 master J ✗45B ✓T ✗0R 0/2
DRAFT LU-20244 tests: add tests for resync of FLR + EC
reviewing Ronnie Sahlberg · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
45 unique failures ec2 pt_ecro M +148 −0
78d
blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
awaiting review (CI not green yet)
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
sanity-ec@ldiskfs+DNE:test_1aseen in 21 other reviews
sanity-ec@ldiskfs+DNE:test_1bseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_1cseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_1dseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_1gseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_4eseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_5aseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_5bseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_6aseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_6bseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_6dseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_6eseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_7seen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_23aseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_23bseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_23cseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_24aseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_24bseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_25aseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_26aseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_26bseen in 22 other reviews
sanity-ec@ldiskfs+DNE:test_27aseen in 23 other reviews
sanity-ec@ldiskfs+DNE:test_28aseen in 22 other reviews
sanity-ec@zfs:test_1aseen in 21 other reviews
sanity-ec@zfs:test_1bseen in 23 other reviews
sanity-ec@zfs:test_1cseen in 23 other reviews
sanity-ec@zfs:test_1dseen in 23 other reviews
sanity-ec@zfs:test_1gseen in 23 other reviews
sanity-ec@zfs:test_4eseen in 23 other reviews
sanity-ec@zfs:test_5aseen in 23 other reviews
sanity-ec@zfs:test_5bseen in 22 other reviews
sanity-ec@zfs:test_6aseen in 23 other reviews
sanity-ec@zfs:test_6bseen in 23 other reviews
sanity-ec@zfs:test_6dseen in 23 other reviews
sanity-ec@zfs:test_6eseen in 23 other reviews
sanity-ec@zfs:test_7seen in 23 other reviews
sanity-ec@zfs:test_23aseen in 22 other reviews
sanity-ec@zfs:test_23bseen in 22 other reviews
sanity-ec@zfs:test_24aseen in 22 other reviews
sanity-ec@zfs:test_24bseen in 22 other reviews
sanity-ec@zfs:test_25aseen in 22 other reviews
sanity-ec@zfs:test_26aseen in 22 other reviews
sanity-ec@zfs:test_26bseen in 22 other reviews
sanity-ec@zfs:test_27aseen in 22 other reviews
sanity-ec@zfs:test_28aseen in 22 other reviews
no vote yet: Marc Vef, Andreas Dilger
patchsets: PS1 05-25 PS2 05-25 PS3 05-25 PS4 08-18
tags: pt_ecro
owner Ronnie Sahlberg · uploader Ronnie Sahlberg · PS4 uploaded 78d ago · NEW · open in Gerrit ↗
commit message
DRAFT LU-20244 tests: add tests for resync of FLR + EC

We can have files that use FLR mirroring but at the same time also use
EC to protect the FLR mirrors.
It is probably not common to use as a persistent end user configuration
as Mirrorins and EC usually are meant for different purposes :
with Mirroring being prefered when performance outweights storage cost
and EC is preferred when storage costs outweigh performance.

But there will be situations where FLR+EC will be in use during a
transitionary period, for example when migrating an EC protected file
between different storage hierarchies.

As such we need to have a test for this situation and that we can
support and resync buth FLR and EC components at the same time.

Test-Parameters: testlist=sanity-ec
Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com>
Change-Id: Idcac78327b501d484653dec6be0882b5dbb1fa6f
62479 master J !B ✓T ✗10R -1/2−
LU-19298 lod: use Xarray instead of static arrays for comp entires
reviewing James Simmons · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase stalled 217d 1 unresolved L +442 −423
217d
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
awaiting review (CI not green yet)
janitor run: 3 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-part-2 crashed RHEL 9.5 / x86_64 ran 13 tests. 2 tests failed: sanity-pfl, sanity-lfsck. %% THIS TEST SESSION CRASHED %% session
review-dne-part-2 crashed RHEL 8.10 / x86_64 ran 13 tests. 2 tests failed: sanity-pfl, sanity-lfsck. %% THIS TEST SESSION CRASHED %% session
review-dne-part-4 crashed RHEL 8.10 / x86_64 ran 11 tests. 2 tests failed: sanity-quota, sanity-flr. %% THIS TEST SESSION CRASHED %% session
review-dne-part-4 crashed RHEL 9.5 / x86_64 ran 11 tests. 2 tests failed: sanity-quota, sanity-flr. %% THIS TEST SESSION CRASHED %% session
review-dne-part-7 crashed RHEL 8.10 / x86_64 ran 7 tests. 1 tests failed: sanity-pcc. %% THIS TEST SESSION CRASHED %% session
review-dne-part-7 crashed RHEL 9.5 / x86_64 ran 7 tests. 1 tests failed: sanity-pcc. %% THIS TEST SESSION CRASHED %% session
review-dne-zfs-part-2 crashed RHEL 8.10 / x86_64 ran 13 tests. 2 tests failed: sanity-pfl, sanity-lfsck. %% THIS TEST SESSION CRASHED %% session
review-dne-zfs-part-4 RHEL 8.10 / x86_64 ran 11 tests. 1 tests failed: sanity-flr. session
review-dne-zfs-part-7 crashed RHEL 8.10 / x86_64 ran 7 tests. 1 tests failed: sanity-pcc. %% THIS TEST SESSION CRASHED %% session
review-zfs RHEL 8.10 / x86_64 ran 10 tests. 1 tests failed: sanity-flr. session
build #119712 SUCCESS · tests all Maloo sessions
no vote yet: Ronnie Sahlberg, Qian Yingjin, Alexey Lyashkov, Andreas Dilger, Patrick Farrell
patchsets: PS1 11-10 PS2 11-16 PS3 12-12
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS3 2025-12-18 13:27 Andreas Dilger patchset comment — James, file layout join/migrate/mirror happen _maybe_ only once or twice in the lifetime of a file, so it doesn't make sense to add a comple
Patrick Farrell PS3 · 2025-12-15 17:25
James, the lack of ability to remove other components than the last one is a deliberate choice to prevent the creation of incomplete layouts.  There is nothing about the current approach that can’t support removing other components, it’s just a sanity restriction.
James Simmons PS3 · 2025-12-18 00:33
Think about file join work with 2 mirrors each with 3 components and another file with also 2 mirrors also with 3 components. Its going to be merged right. The current approach would require allocating a new larger array. Then copying items from file 1 static array and then copying items from file 2 static array. Then deleting the old array. Some slicing is needed due the 2 mirrors. Compared to Xarray its erasing the reference to pointers in file 2 xarray and adding a reference of that same pointer into file 1 Xarray. Do you feel the former approach is way better?

Honestly the biggest impact is for the file join project so the really important opinion I need is from Alexey. Alexey what do you think?
Patrick Farrell PS3 · 2025-12-18 01:29
Yes, I do - it's very simple.  You allocate a larger array and write the layout to it.  Very simple.

It requires no complex data structures and no locking.  The idea that we should have references across two xarrays is very concerning - that means the layout components need reference counting then, I guess?  They do not today.

There is no particular impact on file join - it is just as easy to do file join via layout copy as any other operation.
Andreas Dilger PS3 · 2025-12-18 13:27
James, file layout join/migrate/mirror happen _maybe_ only once or twice in the lifetime of a file, so it doesn't make sense to add a complex data structure and overhead to optimize a 0.00001% usage case.  That is doubly a problem if it means many small allocations and/or additional locking needs to be added to handle this extremely rare use case.
owner James Simmons · uploader James Simmons · PS3 uploaded 327d ago · NEW · open in Gerrit ↗
commit message
LU-19298 lod: use Xarray instead of static arrays for comp entires

The LOD layer implements very large static arrays to manage the
component entries for each layout. This works well for the case
that all the components are for block I/O that are expected to
be aligned to each other in a specific order. In such cases the
API works to add or delete components at the end of such layouts.
With the upcoming introducting of parity and foreign components
the rules change in that you can delete or add a component
located in the middle of the layout. This would be very
complicated when using static arrays.

To make life easier for upcoming projects we move away from
static arrays to using Xarrays. We no longer requires creating
a whole new array and copying components over. Instead we just
insert or delete components into the Xarray. This current
implementation just does the change from static arrary to
Xarray without truly introducing gaps in the Xarray. This can
be done in follow on patches and can be used to greatly simplify
the code. For example since "gaps" are allowed in the Xarray
we can place components in the Xarray using the mirror id as
apart of the index which mirrors the component ID. This removes
the need to manage the new mirror ranges in the Xarray.

Change-Id: I67020f899ad89bfa6095c4b22f7f1b07b6de3e86
Signed-off-by: James Simmons <jsimmons@infradead.org>
32066 master J –B ✓T ✓R -2/2−
LU-10927 osc: do not spend too much time in osc_lru_reclaim
reviewing Li Xi · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked
needs rebase stalled 219d XS +3 −4
219d
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked
awaiting review (CI not green yet)
reviews: Jinshan Xiong -1 2018-04-19 18:19
no vote yet: Rahul Deshmukh
owner Li Xi · uploader Li Xi · PS1 uploaded 3122d ago · NEW · open in Gerrit ↗
commit message
LU-10927 osc: do not spend too much time in osc_lru_reclaim

When a IO calls osc_lru_reclaim(), it needs the LRU slots immediately.
So if the thread is asking for less than max_pages_per_rpc slots,
do not waste time to shrink max_pages_per_rpc slots. The overhead
will become much more significant when memory gets bigger.

Signed-off-by: Li Xi <lixi@ddn.com>
Change-Id: Ia9a5f7756f931db8bcb0a23d14914712fa804004
57426 master J !B ✓T ✗3R -1/2−
LU-18553 llite: ensure layout refresh on fast read
reviewing Patrick Farrell · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase stalled 240d 1 unresolved M +47 −15
240d
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
awaiting review (CI not green yet)
janitor run: 2 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-zfs-part-1 RHEL 8.10 / x86_64 ran 4 tests. 1 tests failed: sanity. session
review-ldiskfs RHEL 8.10 / x86_64, RHEL 9.3 / x86_64 ran 5 tests. 1 tests failed: sanity. session
review-ldiskfs-ubuntu RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 ran 6 tests. 1 tests failed: sanity-sec. session
2 optional test failure(s) — informational
build #109666 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Shaun Tancheff, Andreas Dilger, Alex Zhuravlev
patchsets: PS1 12-13 PS2 12-13 PS3 12-13
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS3 2024-12-13 18:24 Patrick Farrell rw.c:2019 — And look, we can finally get rid of this terrifying (and correct!) TODO ....... eek
Patrick Farrell PS3 · 2024-12-13 18:24
And look, we can finally get rid of this terrifying (and correct!) TODO ....... eek
owner Patrick Farrell · uploader Patrick Farrell · PS3 uploaded 691d ago · NEW · open in Gerrit ↗
commit message
LU-18553 llite: ensure layout refresh on fast read

It is essential to refresh the layout before doing a fast
read, otherwise we could read stale data if the layout has
changed and, eg, the mirror our data is from is now stale.

Today, we do this refresh incidentally in
file_read_confine_iter->cl_io_init->vvp_io_init, but this
is obviously fragile to future changes, since it's not
directly associated with the fast read path.

Add dedicated code in the fast read path to refresh the
layout.

Also opportunistically rename a few functions to make clear
they are Lustre functions and not kernel functions.

Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Change-Id: Ifbd827b79847309fe8d798963774ccd6650ad22f
61816 b2_15 J !B ✓T ✗2R -1/1−
LU-19223 osc: stop after scanning
reviewing Etienne AUJAMES · blocked on the owner: enforced tests failed
stalled 268d M +100 −21
268d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
janitor run: 3 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-zfs-part-1 RHEL 8.10 / x86_64 ran 3 tests. 1 tests failed: sanity. session
review-dne-zfs-part-2 failed 2× RHEL 8.10 / x86_64 ran 11 tests. 1 tests failed: pjdfstest. session
1 optional test failure(s) — informational
build #117419 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger -1 2026-02-07 16:29
no vote yet: Shaun Tancheff, Patrick Farrell
patchsets: PS1 10-14 PS2 10-14
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS2 uploaded 386d ago · NEW · backport · open in Gerrit ↗
commit message
LU-19223 osc: stop after scanning

Currently, the Lustre shrinker tries to scan until it has
freed the number of pages requested for scanning.  If no
pages can be freed, this can take an extremely long time,
manifesting as an almost hung system.

Also set nr_scanned so the kernel can understand what
we've done.

Lustre-change: https://review.whamcloud.com/60489
Lustre-commit: 109e32dc23c53baf0d5b8e11d34a9f5f2fce70aa

Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Change-Id: Ic3ed85d27a785c2f722b6529b79beb3757e15549
Reviewed-by: Zhenyu Xu <bobijam@whamcloud.com>
Reviewed-by: Shaun Tancheff <shaun.tancheff@hpe.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
21652 master J –B ✓T ✓R -1/2−
LU-8464 llite: Lustre I/O hung waiting for page
reviewing Andriy Skulysh · awaiting review (CI not green yet)
stalled 457d M +118 −63
457d
reviews: Jinshan Xiong -1 2016-09-12 16:21
no vote yet: Patrick Farrell, Andriy Skulysh, Ann Koehler, Oleg Drokin
owner Andriy Skulysh · uploader Andriy Skulysh · PS4 uploaded 3725d ago · NEW · open in Gerrit ↗
commit message
LU-8464 llite: Lustre I/O hung waiting for page

A deadlock during lock_page()

Thread 1:
sleep_on_page
__wait_on_bit_lock
                        <<< lock 2nd page
__lock_page
vvp_page_make_ready
cl_page_make_ready
osc_extent_make_ready
osc_io_unplug0

Thread 2:
__wait_on_bit
wait_on_page_bit
shrink_inactive_list
shrink_list
shrink_zone
do_try_to_free_pages
try_to_free_mem_cgroup_pages
mem_cgroup_hierarchical_reclaim
__mem_cgroup_try_charge
mem_cgroup_prepare_migration
                        <<< lock 2nd page
migrate_pages
compact_zone
__compact_pgdat
compact_node
sysfs_compact_node

Thread 2 tries to migrate 2nd page from extent
and waits for 1st to complete writeback.

But these 2 pages are going to fit in one RPC.

Lock all extent pages and modify them after.

Change-Id: Iec92bb5961561386ca8cc2b141d829bc5b367cd1
Seagate-bug-id: MRP-3434
Signed-off-by: Andriy Skulysh <andriy.skulysh@seagate.com>
27992 master J –B ✓T ✗0R +1/2
LU-9762 lov: Remove lsm lock
reviewing Patrick Farrell · blocked on the owner: enforced tests failed
stalled 457d S +0 −32
457d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
reviews: Ben Evans +1 2018-02-26 16:29
no vote yet: Andreas Dilger
owner Patrick Farrell · uploader Patrick Farrell · PS2 uploaded 3182d ago · NEW · open in Gerrit ↗
commit message
LU-9762 lov: Remove lsm lock

The lsm lock was formerly used to protect lov_stripe_md.
That use has been replaced by the coh_attr_guard lock.

Remove the lock.  This reduces overhead in getattr
slightly.

Signed-off-by: Patrick Farrell <paf@cray.com>
Change-Id: I6056eea10ba5dea79517391ecfc00ba02b66cd0d
28139 master J –B ✓T ✓R 0/2
LU-9787 quota: acquire id lock when overquota
reviewing Niu Yawei · awaiting review (CI not green yet)
stalled 457d 1 unresolved S +26 −11
457d
no vote yet: Sergey Cheremencev, Hongchao Zhang
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2025-02-28 17:30 Sergey Cheremencev osd_io.c:1180 — In a new code there is a check above right after for (i = 0; i < npages; i++) cycle:
Sergey Cheremencev PS1 · 2025-02-28 17:30
In a new code there is a check above right after for (i = 0; i < npages; i++)  cycle:

       /*   
         * overwrite case, no need to modify tree and
         * allocate blocks.
         */
        if (!extent_end)
                goto out_declare;

At least this change is not needed anymore.
owner Niu Yawei · uploader Niu Yawei · PS1 uploaded 3395d ago · NEW · open in Gerrit ↗
commit message
LU-9787 quota: acquire id lock when overquota

When overquota flag is set on client, we'd acquire id lock to
trigger pre-acquire even if usage is equal to granted, otherwise,
client will keep sync write forever if all writes from client are
re-writes. (re-writes doesn't need to allocate space, so it won't
trigger quota acquire usually)

Minor fix in osd_declare_write_commit() for ldiskfs: when all
pages are mapped, no need to add extra meta blocks for quota space.

Signed-off-by: Niu Yawei <yawei.niu@intel.com>
Change-Id: I9f3d84471bc04d29f5b7c56762bc6021f89cae24
30848 master J ✗1B ✓T ✗1R -1/2−
LU-10407 osc: update size before queue page
reviewing Hongchao Zhang · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
1 unique failure stalled 457d XS +3 −3
457d
blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
awaiting review (CI not green yet)
janitor flagged test failures unique to this patch
unique failing testhistory
sanity-dom@ldiskfs+DNE:test_155bNEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews
failed enforced testplatformdetail
review-dne-selinux CentOS 7.8/x86_64 ran 5 tests. 1 tests failed: recovery-small. session
1 optional test failure(s) — informational
build #78701 SUCCESS
reviews: Jinshan Xiong -1 2021-01-14 15:22
no vote yet: Jinshan Xiong, Alexey Lyashkov
owner Hongchao Zhang · uploader Oleg Drokin · PS2 uploaded 2120d ago · NEW · open in Gerrit ↗
commit message
LU-10407 osc: update size before queue page

In osc_io_commit_async, the inode's size should be updated
before the corresponding page is queued to some osc_extent.

Change-Id: I57e0e3acb20518148dceec9de0a305335ecf30ce
Signed-off-by: Hongchao Zhang <hongchao.zhang@intel.com>
33137 master J –B ✓T ✗0R -1/2−
LU-10686 tests: correct layout in sanity-pfl 9
reviewing Patrick Farrell · blocked on the owner: enforced tests failed
stalled 457d XS +1 −6
457d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
build #614 SUCCESS
reviews: James Nunez -1 2020-12-28 15:31
owner Patrick Farrell · uploader James Nunez · PS2 uploaded 2975d ago · NEW · open in Gerrit ↗
commit message
LU-10686 tests: correct layout in sanity-pfl 9

The layout used in sanity-pfl test 9 is too short, which
means that the write intended to instantiate a component
fails.

Make the layout longer and do not except this test.

Test-Parameters: trivial mdscount=1 mdtcount=1 testlist=sanity-pfl
Test-Parameters: testgroup=review-dne-part-4

Change-Id: I655e3cd06bcb23fe8e4c1e6bf152cd88bd3786ee
Signed-off-by: Patrick Farrell <paf@cray.com>
33862 master J ✗1B ✓T ✓R +2/2
LU-11775 osc: check imp_invalid without imp_lock
reviewing Li Dongyang · blocked on the owner: Verified -1 by Oleg Drokin
Verified -1 stalled 457d XS +0 −2
457d
blocked on the owner: Verified -1 by Oleg Drokin
awaiting review (CI not green yet)
janitor flagged test failures unique to this patch — superseded (tests have since passed)
unique failing testhistory
conf-sanity-slow@zfs:test_69NEW unique failure for this branch in the last 30 days, but was seen 0 times across 0 other branches 0 reviews
build #5675 SUCCESS
reviews: Patrick Farrell +1 2019-06-04 13:52 · Alexander Boyko +1 2019-06-04 11:55
no vote yet: James Simmons, Andreas Dilger, Alex Zhuravlev, Oleg Drokin
owner Li Dongyang · uploader Alexander Boyko · PS3 uploaded 2710d ago · NEW · open in Gerrit ↗
commit message
LU-11775 osc: check imp_invalid without imp_lock

We don't need to hold imp_lock while checking the
imp_invalid flag. This avoids the contention on
imp_lock in osc_io_ter_init().

Signed-off-by: Li Dongyang <dongyangli@ddn.com>
Change-Id: Ic825ad09f6c8020058d0fa9a417281c1258156ce
36517 master J !B ✓T –R 0/2
LU-12916 clio: force lockless io for all writes
reviewing Oleg Drokin · awaiting review (CI not green yet)
stalled 457d M +67 −30
457d
build #15619 SUCCESS
no vote yet: Qian Yingjin, Shuichi Ihara, Andreas Dilger, Alex Zhuravlev, Shilong Wang
owner Oleg Drokin · uploader Oleg Drokin · PS8 uploaded 2306d ago · NEW · open in Gerrit ↗
commit message
LU-12916 clio: force lockless io for all writes

Only for write operations.

Test-Parameters: fortestonly

Change-Id: I06975c9a22f0c5f95a553dd63d8235f9162e1639
Signed-off-by: Oleg Drokin <green@whamcloud.com>
38577 master J ✗1B ✓T ✗1R +0/2−
LU-13435 utils: Add max value to --mirror-id
reviewing Dominique Martinet · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
1 unique failure stalled 457d S +7 −3
457d
blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
awaiting review (CI not green yet)
janitor flagged test failures unique to this patch
unique failing testhistory
sanity-quota@zfs:test_18NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews
failed enforced testplatformdetail
review-dne-part-3 failed 3× CentOS 7.0/x86_64 ran 3 tests. 1 tests failed: conf-sanity. session
build #15035 SUCCESS
reviews: Andreas Dilger -1 2023-01-05 18:38 · Quentin Bouget +1 2020-08-26 07:45
no vote yet: Kevin Baillergeau, Jian Yu
owner Dominique Martinet · uploader Kevin Baillergeau · PS8 uploaded 2333d ago · NEW · open in Gerrit ↗
commit message
LU-13435 utils: Add max value to --mirror-id

Add max value for mirror_id : MIRROR_ID_MAX, which
is 0x7FFF as the mirror-id is stored in __u16
Add a test to check if --mirror-id argument
is higher than its max value MIRROR_ID_MAX

Signed-off-by: Kévin Baillergeau <kevin.baillergeau.ocre@cea.fr>
Change-Id: Icefbb8fb577fe8f4a3118c8a469e378a8410c8eb
40937 master J ✓B ✓T ✗2R -1/2−
LU-13638 ptlrpc: addition change for callback discard
reviewing Yang Sheng · blocked on the owner: enforced tests failed
stalled 457d S +15 −9
457d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
failed enforced testplatformdetail
review-dne-part-4 CentOS 8.3/x86_64 ran 10 tests. 2 tests failed: sanity-quota, replay-single. session
review-dne-selinux-ssk CentOS 8.3/x86_64 ran 6 tests. 1 tests failed: sanity. session
build #19571 SUCCESS
reviews: Alexey Lyashkov -1 2022-08-17 18:18
no vote yet: Qian Yingjin, Shuichi Ihara, James Simmons, Serguei Smirnov, Amir Shehata, Andreas Dilger
owner Yang Sheng · uploader Yang Sheng · PS4 uploaded 2066d ago · NEW · open in Gerrit ↗
commit message
LU-13638 ptlrpc: addition change for callback discard

--Fix some style issue;
--decrease ibc_nsends_posted along with ibc_sending, else
  we may hit the ASSERT in kiblnd_destroy_conn();
--We should bypass checking delayed request and then handle
  it in ptlrpc_unregister_reply();

Fixes: babf023227 (LU-13368 lnet: discard the callback)
Signed-off-by: Yang Sheng <ys@whamcloud.com>
Change-Id: I84dc43acad1e010bf1370dc115f2f12002a35b4d
44526 master J –B ✓T ✗3R ✗
LU-14917 llite: Switch mmap readahead logic
reviewing Patrick Farrell · blocked on the owner: enforced tests failed; Patrick Farrell voted -1
CR -1 stalled 457d M +228 −11
457d
blocked on the owner: enforced tests failed; Patrick Farrell voted -1
awaiting review (CI not green yet)
failed enforced testplatformdetail
review-dne-part-3 CentOS 8.3/x86_64 ran 3 tests. 1 tests failed: conf-sanity. session
review-dne-part-3 failed 2× RHEL 8.3/x86_64 ran 1 tests. 1 tests failed: node-provisioning. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE TIMES session
review-dne-part-4 failed 2× CentOS 8.3/x86_64 ran 9 tests. 1 tests failed: sanity-flr. session
build #86016 SUCCESS · tests all Maloo sessions
reviews: Patrick Farrell -1 2023-02-23 19:02
no vote yet: Qian Yingjin, Andreas Dilger
patchsets:
+19 earlier PS3 08-09 PS4 08-13 Peter Jones PS5 09-16 Andreas Dilger PS6 09-16 Andreas Dilger PS7 10-13 PS8 10-13 PS9 10-13 PS10 10-14 PS11 10-15 PS12 10-15 PS13 10-15 PS14 10-17 PS15 10-20 PS16 10-20 PS17 10-21 PS18 11-05 PS19 11-06 PS20 11-07 PS21 11-07
PS22 11-08 PS23 12-09 PS24 01-26 PS25 02-01 PS26 02-02
owner Patrick Farrell · uploader Patrick Farrell · PS26 uploaded 1737d ago · NEW · open in Gerrit ↗
commit message
LU-14917 llite: Switch mmap readahead logic

The mmap readahead logic has shown to be badly suited for
certain workloads (kdb).  Experimentation showed that for
these workloads, the standard readahead algorithm works
better.

This patch allows switching the readahead algorithm for
mmap to the 'standard' readahead algorithm.

The added tunable is:
mmap_read_ahead_logic in llite
(lctl get_param llite.*.mmap_read_ahead_logic)

It defaults to '1', which is the special mmap readahead
logic.

Setting it to 0 switches mmap readahead to use the standard
readahead logic.

This patch also fixes the existing mmap readahead test,
which was not running.

Note the results for the existing test are better with the
standard readahead logic, ie, with mmap readahead logic
disabled.  This suggests we should default to non-mmap
readahead logic.

However, the mmap readahead logic was carefully tuned for
certain workloads, and this would be a large change.  So,
this question is deferred until we can do a larger look at
readahead behavior.

Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Change-Id: Ib34297f1dd0498356b21580224f4b954bb10cb14
45263 master J !B ✓T ↻R 0/2
LU-15108 hsm: HE_STATE should be issued when necessary
reviewing Etienne AUJAMES · awaiting review (CI not green yet)
stalled 457d M +177 −57
457d
janitor run: 2 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-zfs-part-4 retesting failed 2× CentOS 8.5/x86_64 ran 9 tests. 1 tests failed: sanity-quota. session
2 optional test failure(s) — informational
build #90292 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Guillaume Courrier, Lai Siyao, Nikitas Angelinas, Thomas LEIBOVICI, Aurelien Degremont, Andreas Dilger
patchsets:
+4 earlier PS1 10-15 PS2 10-15 PS3 10-18 PS4 10-26
PS5 11-02 PS6 11-02 PS7 11-02 PS8 12-08 PS9 11-02
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS9 uploaded 1463d ago · NEW · open in Gerrit ↗
commit message
LU-15108 hsm: HE_STATE should be issued when necessary

HE_ARCHIVE HSM changelog is issued by the coordinator instead of
HE_STATE event for restore request.
The HE_STATE changelogs issued inside hsm_cdt_request_completed()
are redundant with the actuals HE_ARCHIVE, HE_RESTORE, HE_REMOVE
and HE_CANCEL changelogs. This could confuse monitoring softwares
(like Robinhood).

This patch disables the HE_STATE changelogs inside
hsm_cdt_request_completed() by adding a new setxattr flag
"LU_XATTR_NO_CHLG".

The behaviour of mdd_hsm_update_locked() is corrected to return if a
changelog should be emitted for a HE_STATE event.

Test-Parameters: testlist=sanity-hsm,sanity-hsm
Test-Parameters: testlist=sanity-hsm env=ONLY="607",ONLY_REPEAT=20
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
Change-Id: Ib1b7a7705050d3c2f34a61b0c651fb3a15ee7384
45554 master J !B ✓T ✗4R +0/2−
LU-14364 nrs: release spinlock when stopping policy
reviewing Li Xi · blocked on the owner: enforced tests failed
stalled 457d XS +6 −1
457d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
janitor run: 3 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-part-2 RHEL 8.6/x86_64 ran 7 tests. 1 tests failed: sanity-sec. session
review-dne-part-4 RHEL 8.6/x86_64 ran 9 tests. 1 tests failed: sanity-quota. session
review-dne-zfs-part-1 CentOS 8.5/x86_64 ran 6 tests. 1 tests failed: sanity. session
review-ldiskfs-arm RHEL 8.6/aarch64, RHEL 8.6/x86_64 ran 6 tests. 1 tests failed: sanity-lnet. session
2 optional test failure(s) — informational
build #91467 SUCCESS · tests all Maloo sessions
reviews: Etienne AUJAMES -1 2023-03-28 15:50 · Vitaliy Kuznetsov +1 2023-03-28 13:38
no vote yet: Qian Yingjin, Andreas Dilger, Alex Zhuravlev, Oleg Drokin
patchsets: PS1 11-12 PS2 11-12 PS3 11-13 PS4 11-15 PS5 01-05 Andreas Dilger
owner Li Xi · uploader Andreas Dilger · PS5 uploaded 1400d ago · NEW · open in Gerrit ↗
commit message
LU-14364 nrs: release spinlock when stopping policy

Stopping a NRS policy might sleep. So release the spinlock
temporarily to avoid soft lockup.

Signed-off-by: Li Xi <lixi@ddn.com>
Change-Id: I30641d5d3c4e9499305dd3270311e820a1ae212e
46569 master J !B ✓T ✗7R -1/2−
LU-15578 readahead: hold the lock reference for readahead
reviewing Yang Sheng · blocked on the owner: enforced tests failed
stalled 457d 1 unresolved M +131 −45
457d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
janitor run: 1 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-part-2 RHEL 8.6/x86_64 ran 7 tests. 1 tests failed: sanity-sec. session
review-dne-selinux-ssk-part-2 CentOS 8.5/x86_64 ran 7 tests. 1 tests failed: sanity-sec. session
review-dne-zfs-part-2 CentOS 8.5/x86_64 ran 7 tests. 1 tests failed: sanity-sec. session
review-dne-zfs-part-4 CentOS 8.5/x86_64 ran 9 tests. 1 tests failed: sanity-quota. session
review-dne-zfs-part-5 crashed CentOS 8.5/x86_64 ran 6 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% session
review-ldiskfs-arm RHEL 8.6/aarch64, RHEL 8.6/x86_64 ran 6 tests. 1 tests failed: sanity-sec. session
review-ldiskfs-ubuntu CentOS 8.5/x86_64, Ubuntu 20.04/x86_64 ran 6 tests. 1 tests failed: sanity-sec. session
3 optional test failure(s) — informational
build #90571 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger -1 2023-02-23 23:29
no vote yet: Qian Yingjin, Wang Shilong, Patrick Farrell
patchsets:
+9 earlier PS1 02-21 PS2 02-22 PS3 02-23 PS4 02-23 PS5 02-23 PS6 02-23 PS7 02-23 PS8 02-23 PS9 02-25
PS10 02-26 PS11 02-27 PS12 03-08 PS13 03-14 PS14 11-11 Andreas Dilger
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS14 2022-11-11 19:31 Patrick Farrell (personal) rw.c:1771 — This seems like a long-winded way to say "not the first page"? But of course what's a shorter way to do it... Huh.
Patrick Farrell (personal) PS14 · 2022-11-11 19:31
This seems like a long-winded way to say "not the first page"?  But of course what's a shorter way to do it...  Huh.
owner Yang Sheng · uploader Andreas Dilger · PS14 uploaded 1454d ago · NEW · open in Gerrit ↗
commit message
LU-15578 readahead: hold the lock reference for readahead

While the readahead is working as separate thread, we should
hold the lock reference of ldlm lock to avoid it was canceled.

  LustreError: (osc_object.c:396:osc_req_attr_set()) uncovered page!
  BUG: unable to handle kernel NULL pointer dereference at 000000016
  IP: ldlm_resource_dump+0x86/0x420 [ptlrpc]
  Oops: 0000 [#1] SMP
  Call Trace:
  osc_req_attr_set+0x3ec/0x620 [osc]
  cl_req_attr_set+0x63/0x160 [obdclass]
  osc_build_rpc+0x483/0x1070 [osc]
  osc_io_unplug0+0xc22/0x1910 [osc]
  brw_interpret+0x34b/0xea0 [osc]
  ptlrpc_check_set.part.23+0x481/0x1df0 [ptlrpc]
  ptlrpc_check_set+0x5b/0xe0 [ptlrpc]
  ptlrpcd_check+0x4ab/0x590 [ptlrpc]
  ptlrpcd+0x29b/0x560 [ptlrpc]

Fixes: c2791674260 ("LU-12043 llite: improve single-thread read performance")
Signed-off-by: Yang Sheng <ys@whamcloud.com>
Change-Id: Id8c3b8544ef5652693746471f41c938566875857
50379 master J ✗6B ✓T ✗4R 0/2
LU-16656 llite: Improve 'out:' in ll_file_io_generic
reviewing Patrick Farrell · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
6 unique failures stalled 457d XS +2 −1
457d
blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
awaiting review (CI not green yet)
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
recovery-small@ldiskfs+DNE:test_110mNEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews
replay-single@ldiskfs+DNE:test_70cseen in 4 other reviews
sanity2@ldiskfs+DNE:test_154gseen in 2 other reviews
sanity-pcc@ldiskfs+DNE:test_1dseen in 3 other reviews
sanity-pcc@zfs:test_1fseen in 2 other reviews
sanity-pcc@zfs:test_1gseen in 3 other reviews
failed enforced testplatformdetail
review-dne-selinux-ssk-part-1 RHEL 8.7/x86_64 ran 3 tests. 1 tests failed: sanity. session
review-dne-selinux-ssk-part-2 RHEL 8.7/x86_64 ran 5 tests. 1 tests failed: sanity-sec. session
review-dne-zfs-part-1 RHEL 8.7/x86_64 ran 4 tests. 1 tests failed: sanity. session
review-zfs RHEL 8.7/x86_64 ran 10 tests. 1 tests failed: replay-single. session
1 optional test failure(s) — informational
build #93762 SUCCESS · tests all Maloo sessions
no vote yet: Qian Yingjin, Andreas Dilger
patchsets: PS1 03-22 PS2 03-22 PS3 04-10
owner Patrick Farrell · uploader Patrick Farrell · PS3 uploaded 1304d ago · NEW · open in Gerrit ↗
commit message
LU-16656 llite: Improve 'out:' in ll_file_io_generic

The location of the 'out:' label in ll_file_io_generic is a
bit scary, because it skips part of the setup for
io restart, where partial io is taken in to account.

This is safe today because 'out' is only used before calls
to cl_io_loop, so IO hasn't started yet, but if 'out' is
ever used later in the function, it will be incorrect.

Let's move it now rather than leave a trap for the unwary.

Note that until cl_io_loop is called "io->ci_nob" is 0, so
this shouldn't change current behavior.

Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Change-Id: I89e29708a6d17c5eecdf4f86261dfa013c7a5ec3
50407 master J ✗1B ✓T ✗1R -1/2−
LU-16665 llite: check whether page under I/O in releasepage()
reviewing Qian Yingjin · blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
1 unique failure stalled 457d 6 unresolved M +52 −7
457d
blocked on the owner: janitor: test failures unique to this patch; enforced tests failed
awaiting review (CI not green yet)
janitor flagged test failures unique to this patch — full janitor results
unique failing testhistory
sanity-flr@zfs:test_200seen in 29 other reviews
failed enforced testplatformdetail
review-dne-selinux-ssk-part-1 CentOS 8.5/x86_64 ran 3 tests. 1 tests failed: sanity. session
2 optional test failure(s) — informational
build #93282 SUCCESS · tests all Maloo sessions
reviews: Patrick Farrell -1 2023-04-19 21:54
no vote yet: Andreas Dilger
patchsets: PS1 03-24 PS2 03-27
threads: 6 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2023-03-24 14:20 Patrick Farrell file.c:2084 — A general thought - I think it would be better to fall back to slow read on error here, rather than add this cost to the fast read path ever
Patrick Farrell PS1 · 2023-03-24 14:20
A general thought - I think it would be better to fall back to slow read on error here, rather than add this cost to the fast read path every time.

In fact, I think we should probably just fall back to slow read on *any* error from fast read.
reply PS2 2023-04-19 21:54 Patrick Farrell file.c:2091 — Hmm, is tiny_write an issue as well? (see ll_file_write_iter)
Patrick Farrell PS2 · 2023-04-19 21:54
Hmm, is tiny_write an issue as well?  (see ll_file_write_iter)
reply PS2 2023-04-19 21:54 Patrick Farrell llite_mmap.c:311 — don't we need to do this for mkwrite as well?
Patrick Farrell PS2 · 2023-04-19 21:54
don't we need to do this for mkwrite as well?
reply PS1 2023-03-24 14:22 Patrick Farrell rw.c:1643 — That caching would be tricky, now that I think about it. Maybe not worth the trouble.
Patrick Farrell PS1 · 2023-03-24 14:20
So we're going to do this for every page.  If there are many readers moving many pages, I think this will get *expensive* quickly, because there will be several LCCs, and we will check all of them for every page.

Basically, we're taking an inode level rwlock for every page we move, and then walking a list.  That list won't have thousands of members, but it could have 10s or 100s of members, and if it's being updated a lot (which would happen with many readers), it would be taking the 'write' lock a lot.

If we really want to go this route, it might make sense to cache the most recently used lcc and check it first?
Patrick Farrell PS1 · 2023-03-24 14:22
That caching would be tricky, now that I think about it.  Maybe not worth the trouble.
reply PS2 2023-04-19 21:54 Patrick Farrell rw.c:1643 — I remain worried about cost of this; I think it's correct but I'm worried about the cost...
Patrick Farrell PS2 · 2023-04-19 21:54
I remain worried about cost of this; I think it's correct but I'm worried about the cost...
reply PS1 2023-03-24 15:28 Patrick Farrell rw26.c:211 — It's not that we check refcount without any lock - other people change the page refcount without taking the lock. You can see it in some pl
Patrick Farrell PS1 · 2023-03-24 14:20
So, the vmpage_in_use check is still wrong - it's racey, it just works most of the time.  But it's incorrect because it's racey.

I think we need to see if this approach can pass:
sanityn 16f,16g,95b (the test in my seqlock fix for generic_file_read_iter)

without the vmpage_in_use check and without either seqlock fix.
Qian Yingjin PS1 · 2023-03-24 15:13
Could you please describe why it is racey in NVDA DGS?
static inline int vmpage_in_use(struct page *vmpage, int refcount)
{
	return (page_count(vmpage) - page_mapcount(vmpage) > 2 + refcount);
}

I guess it is because that NVDA DGS gets an extra lock reference, thus vmpage_in_use check returns true, thus we can not release the page?

We check vmpage refcount without any lock?
Could we do some quick but not including all cases checking for whether the vmpageis in use as following?:
static inline int vmpage_in_use(struct page *vmpage, int refcount)
{
	return (page_count(vmpage)  > 2 + refcount);
}
Patrick Farrell PS1 · 2023-03-24 15:28
It's not that we check refcount without any lock - other people change the page refcount without taking the lock.  You can see it in some places in generic_file_buffered_read() - the page is unlocked, and then page_put() is called.

So it doesn't matter what we do - the lock does not protect the refcount.  (That's why the refcount has to be an atomic.)

And this means we can't use this for checking things like this.  The refcount just protects the page from freeing.

So, the race isn't specific to GDS, but it does affect GDS:
GDS needs to be able to flush pages, and if we have this vmpage check, it sometimes fails to flush them.  Even if they are not part of IO.  But the more important thing is this refcount is changed without the lock, so we can't safely use it for anything.
owner Qian Yingjin · uploader Qian Yingjin · PS2 uploaded 1319d ago · NEW · open in Gerrit ↗
commit message
LU-16665 llite: check whether page under I/O in releasepage()

We use seqlock to check if a page has been deleted on this inode
during the fault process, allowing us to catch an erronous short
read or EIO and retry the I/O.

However, the newer kernel (such as Unbutu 2204) introduces
@mapping->invalidate_lock. By using this lock, we could get rid of
all these seqlock check for the newer kernel which may have impact
on the performance.

A user can use drop_caches or DONTNEED fadvise to drop unused page
cache. In kernel it calls invalidate_mapping_pages() to release
pages that are not in use or under I/O. And this function is
called without invalidate_lock held.

Thus it needs to check wether the current page trying to release
in ->releasepage() is under I/O or not.
In ->releasepage(), we check whether the current page is under I/O
by check whether it is in the I/O range of the read/fault I/O
context in the list @lli_lccs(ll_cl_context). The page can only be
released if it is not under I/O or in use.

Signed-off-by: Qian Yingjin <qian@ddn.com>
Change-Id: I281c0815e79ab800944700451c4a168ebddbc7c8
23552 master J –B ✓T ✗7R +0/2−
LU-8709 llite: implement parallel asynchronous readahead
reviewing Li Xi · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase stalled 457d XL +1467 −1103
457d
blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
awaiting review (CI not green yet)
failed enforced testplatformdetail
review-dne-part-1 CentOS 7.0/x86_64 ran 6 tests. 1 tests failed: sanity. session
review-dne-part-2 CentOS 7.0/x86_64 ran 10 tests. 1 tests failed: sanity-hsm. session
review-dne-part-4 crashed CentOS 7.0/x86_64 ran 12 tests. 1 tests failed: sanity-flr. %% THIS TEST SESSION CRASHED %% session
review-dne-zfs-part-1 CentOS 7.0/x86_64 ran 6 tests. 1 tests failed: sanity. session
review-dne-zfs-part-2 CentOS 7.0/x86_64 ran 10 tests. 1 tests failed: sanity-hsm. session
review-ldiskfs CentOS 7.0/x86_64 ran 6 tests. 1 tests failed: sanity. session
review-zfs crashed CentOS 7.0/x86_64 ran 10 tests. 1 tests failed: sanity-flr. %% THIS TEST SESSION CRASHED %% session
2 optional test failure(s) — informational
build #60987 SUCCESS
reviews: Andreas Dilger +1 2019-01-15 06:51
no vote yet: Qian Yingjin, Jinshan Xiong, Patrick Farrell, James Simmons
owner Li Xi · uploader Wang Shilong · PS14 uploaded 2861d ago · NEW · open in Gerrit ↗
commit message
LU-8709 llite: implement parallel asynchronous readahead

This patch proposes a new design of Lustre readahead framework,
parallel-readahead, which implements a similar algorithm like current
Linux kernel's on-demand readahead, but in a way that is more
optimized for the characteristics of Lustre, more extendable for
differet I/O patterns, and more adaptable to the high bandwidth of
Lustre since data could be prefetched in parallel by multiple
threads.

Like the on-demand readahead, the parallel-readahead maintains a
"readahead window" consisting of a portion of the file starting
with the application's last read. Pages inside the readahead window
are either already in the page cache, or being prefetched into the
page cache of the client. The window moves forward as the reading of
the application moves forward.

The parallel-readahead framework prefetches more agressively than
on-demand readahead using a large readahead window, since Lustre
usually has more overhead than local file systems.

The parallel-readahead can do real asynchronous prefetch in parallel
by multiple threads. The reason of this implement is that, if all
prefetching is done in the process of the application that issued
read() syscall, the overhead caused by logic of Lustre client side
would become the bottleneck.

The parallel-readahead framework provides an extendable I/O pattern
detection mechanism which currently has detection algorithms for both
sequential read and stride read.  And more pattern detection
algorithms and corresponding prefetching policies can be added into
the framework for other I/O patterns, including random read,
semisequential read, backward read, interleaved read, etc.

Todo:
make max_read_ahead_whole_mb really work

Signed-off-by: Li Xi <lixi@ddn.com>
Signed-off-by: Wang Shilong <wshilong@whamcloud.com>
Change-Id: Ida399b9d0b499ba3f6bd08d7bb4528132e8e98e4
39926 master J ✓B ✓T ✗3R +0/2−
LU-13669 readahead: increase ra window progressively
reviewing Wang Shilong · blocked on the owner: enforced tests failed
stalled 464d S +15 −2
464d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
failed enforced testplatformdetail
review-dne-part-1 CentOS 8.3/x86_64 ran 6 tests. 1 tests failed: sanity. session
review-dne-zfs-part-1 crashed CentOS 8.3/x86_64 ran 6 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% session
review-ldiskfs-arm CentOS 8.3/aarch64, CentOS 8.3/x86_64 ran 6 tests. 1 tests failed: sanity. session
build #81939 SUCCESS · tests all Maloo sessions
reviews: Qian Yingjin +1 2021-07-14 02:01 · Andreas Dilger -1 2021-07-14 02:01
no vote yet: Shuichi Ihara, Patrick Farrell
owner Wang Shilong · uploader Wang Shilong · PS2 uploaded 1940d ago · NEW · open in Gerrit ↗
commit message
LU-13669 readahead: increase ra window progressively

For KX applications(https://kx.com), use default read ahead
per window will hurt performance, we only get good numbers with
1M window size.

The reason behind that is it is not really sequenetial mmap read,
however sequential read RPC size increased as one RPC size even
first time, this potentially cause a lot of page discard.

To overcome problem like above, RPC size will be started as 32K
and increased twice every time before it reach RPC size(16M etc).

Once we reach RPC size, it will grow one RPC size each time as before.
With this patch, we got same performance numbers with 1M and 64M
read_ahead_per_file_mb.

Signed-off-by: Wang Shilong <wshilong@ddn.com>
Change-Id: I147aafefb66b574a9b130786597018d079553727
50423 master J !B ✓T ✗2R +1/2
LU-16665 llite: remove lli_page_inv_lock in newer kernel
reviewing Qian Yingjin · blocked on the owner: enforced tests failed
stalled 1295d 2 unresolved S +28 −2
1295d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
janitor run: 1 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-part-1 RHEL 8.6/x86_64 ran 4 tests. 1 tests failed: sanity. session
review-ldiskfs CentOS 8.5/x86_64 ran 5 tests. 1 tests failed: sanity. session
1 optional test failure(s) — informational
build #93286 SUCCESS · tests all Maloo sessions
reviews: Patrick Farrell +1 2023-04-19 21:52
no vote yet: Andreas Dilger
patchsets: PS1 03-27 PS2 03-27 PS3 03-27
threads: 2 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS3 2023-04-19 21:52 Patrick Farrell vvp_io.c:923 — This needs to be rebased - not urgently or anything, but I see it's missing the latest version of the patch which added this
Patrick Farrell PS3 · 2023-04-19 21:52
This needs to be rebased - not urgently or anything, but I see it's missing the latest version of the patch which added this
reply PS3 2023-04-19 21:52 Patrick Farrell vvp_page.c:89 — [minor]
Patrick Farrell PS3 · 2023-04-19 21:52
[minor]
Maybe split this comment to "clearpageuptodate" and "seqlock" parts and move the clearpageuptodate part above the #ifdef?

It would be sad if we removed the whole comment when we (some day!) remove the lli_page_inv_lock code completely
owner Qian Yingjin · uploader Qian Yingjin · PS3 uploaded 1319d ago · NEW · open in Gerrit ↗
commit message
LU-16665 llite: remove lli_page_inv_lock in newer kernel

This patch remove @lli_page_inv_lock in newer kernel as
@mapping->invalidate_lock can achieve the same effect.

Test-Parameters: testlist=sanityn clientdistro=ubuntu2204 env=ONLY="16f 16g 95b",ONLY_REPEAT=10
Signed-off-by: Qian Yingjin <qian@ddn.com>
Change-Id: I5a26ce366817b3a92f9fe1ca9724ab5a9e13f999
49138 master J !B ✓T ✗2R 0/2
LU-16285 ldlm: flush the page out for bl lock
reviewing Yang Sheng · blocked on the owner: enforced tests failed
stalled 1350d 6 unresolved M +196 −9
1350d
blocked on the owner: enforced tests failed
awaiting review (CI not green yet)
janitor run: 2 failing config(s), none unique to this patch — janitor results
failed enforced testplatformdetail
review-dne-selinux-ssk-part-2 CentOS 8.5/x86_64 ran 5 tests. 1 tests failed: recovery-small. session
review-dne-zfs-part-4 CentOS 8.5/x86_64 ran 9 tests. 1 tests failed: sanity-quota. session
2 optional test failure(s) — informational
build #90833 SUCCESS · tests all Maloo sessions
no vote yet: Andreas Dilger, Patrick Farrell
patchsets: PS1 11-11 PS2 11-16 PS3 11-23
threads: 6 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS2 2022-11-23 19:45 Andreas Dilger COMMIT_MSG:12 — This is a good explanation, but it needs to be added into the commit message so that it can be found in the future, not in a Gerrit comment
Andreas Dilger PS2 · 2022-11-22 03:56
Can you please expand the description of what this patch is doing.  It looks like there is a separate thread or timer that is generating RPCs for high priority locks, but I don't understand why this is much different from the current client RPC generation engine?

I'm wondering if we are missing something simple in the current RPC engine that it doesn't keep on sending new RPCs for blocked locks when the current RPCs have completed.  Maybe something like the high-priority locks/object are being blocked by rpcs_in_flight or similar?
Yang Sheng PS2 · 2022-11-23 16:02
Yes, I set a timer if the bl queue depth has reached a limitation while a blwi insert. Then start flushing out the pages after the timer fired if the blwi still in queue. 
The different than usual RPC engine is that current engine only consider flush whole range of lock but we need only flush part pages(only one RPC in this patch).
Andreas Dilger PS2 · 2022-11-23 19:45
This is a good explanation, but it needs to be added into the commit message so that it can be found in the future, not in a Gerrit comment on an old version of the patch.

My main concern is that having two separate RPC engines may cause other issues (eg. overflow of max_rpcs_in_flight, fragmented RPCs, etc).  My preference would be to update the current RPC generation to round-robin over HP objects/locks when there is a large HP object/lock that is taking too long to flush. 

I'm thinking something like limiting the number of RPCs for each object at one time to max(1, max_rpcs_in_flight / 4), and doing a pass over all HP locks and sending an RPC for those that have not had any RPCs sent in some time (obd_timeout / 4). This will ensure that there are no locks left idle for a long time, and if there are many small files that can be written with a few RPCs they will be finished quickly, and the large files that take thousands of RPCs to flush will still have occasional RPCs sent to keep the locks alive. If there are only the large files in the HP list then they will be processed more quickly.
reply PS2 2022-11-23 16:02 Yang Sheng ldlm_lockd.c:2873 — I was thinking no possible to divide zero since jiffies should change rapidly. But in fact it really crash on divide zero.
Andreas Dilger PS2 · 2022-11-22 03:56
Is there a danger that this could ever divide by zero?  I don't think so, (blp_proc_time should always be <= jiffies, so I guess the "+1" is to handle the == case) but it isn't totally obvious.
Yang Sheng PS2 · 2022-11-23 16:02
I was thinking no possible to divide zero since jiffies should change rapidly. But in fact it really crash on divide zero.
reply PS2 2022-11-23 16:02 Yang Sheng ldlm_lockd.c:3026 — Since bl queue is accessed as FIFO in bl thread. But we need flush the pages as a reverse order(All of blwis before blp_echo_item are older
Andreas Dilger PS2 · 2022-11-22 03:56
(style) it would be more understandable if this was written like "list_for_each_entry()" or similar.
Yang Sheng PS2 · 2022-11-23 16:02
Since bl queue is accessed as FIFO in bl thread. But we need flush the pages as a reverse order(All of blwis before blp_echo_item are older than it).
Since the start pointer is different than end pointer. Seem no stand api can be used. But i'll try to find it.
reply PS2 2022-11-23 16:02 Yang Sheng ldlm_lockd.c:3039 — It is my fault. I should set the pos as blp_echo_item->prev. So it was moved one step forward in worst case. Will update.
Andreas Dilger PS2 · 2022-11-22 03:56
(defect?) I don't understand why this does not just lloop on the same blwi entry each time?  The item is not being removed from the list or moved to the end (AFAICS), so it definitely has some danger.
Yang Sheng PS2 · 2022-11-23 16:02
It is my fault. I should set the pos as blp_echo_item->prev. So it was moved one step forward in worst case. Will update.
reply PS2 2022-11-22 03:56 Andreas Dilger ldlm_lockd.c:3051 — (style) remove extra blank space
Andreas Dilger PS2 · 2022-11-22 03:56
(style) remove extra blank space
reply PS2 2022-11-22 03:56 Andreas Dilger osc_lock.c:350 — (style) only one space between variable type and name for local variable declarations
Andreas Dilger PS2 · 2022-11-22 03:56
(style) only one space between variable type and name for local variable declarations
owner Yang Sheng · uploader Yang Sheng · PS3 uploaded 1442d ago · NEW · open in Gerrit ↗
commit message
LU-16285 ldlm: flush the page out for bl lock

The client could be evicted if it is no chance to write out
the dirty data and cancel the lock in timely manner. So we
made some IO for locks which still in BL queue. The timeout
can be prolong to avoid eviction.

Signed-off-by: Yang Sheng <ys@whamcloud.com>
Change-Id: I7349d45e565cade7581fb756eee448356c6d91f7
▶

Voted on current patchset

(9)
69573 master J –B ✓T ✓R +2/2
LU-19932 llite: Treat direct write as sync write again
reviewing Xiao Yang · you voted +1 on current PS
pw_shepherd S +35 −2
11h
build #135046 SUCCESS · tests all Maloo sessions
reviews: Marc Vef +1 2026-11-04 17:32 · Zhenyu Xu +1 2026-11-04 04:22
no vote yet: Qian Yingjin, Andreas Dilger, Patrick Farrell, Timothy Day
patchsets:
+5 earlier PS1 10-11 PS2 10-12 PS3 10-12 PS4 10-14 PS5 10-15
PS6 10-15 PS7 10-18 PS8 10-29 PS9 10-29 PS10 11-01
your previous vote: +1 on PS3 (2026-10-13 05:05) — now at PS10
tags: pw_shepherd
owner Xiao Yang · uploader Xiao Yang · PS10 uploaded 4d ago · NEW · open in Gerrit ↗
commit message
LU-19932 llite: Treat direct write as sync write again

LU-16695 dropped O_DIRECT from wr_sync when switching to ki_flags.
When a DIO write falls back to a buffered write (e.g. unaligned DIO to
OSTs without unaligned DIO support, or -EBUSY from invalidating cached
pages) and pages are committed to OSC once the buffered write reaches
64MiB (PTLRPC_MAX_BRW_SIZE), the last extent committed by the write
cl_io stays active until its cl_io_end. Before that, the same thread
runs direct_write_fallback(), whose nested fsync cl_io waits for that
extent, so the thread deadlocks with itself.

Include IOCB_DIRECT in wr_sync again so the extent is released at
commit in cl_io_start instead of at cl_io_end.

Test-Parameters: serverversion=2.15 testlist=sanity env=ONLY=119
Fixes: dad7079dfd9d ("LU-16695 llite: switch to ki_flags from f_flags")
Signed-off-by: Xiao Yang <xyang@ddn.com>
Change-Id: I1dce660ee3a29341e1c484dc7c466f05a176a228
66882 master J –B ✓T ✓R +2/2
LU-20211 mdt: trunc(0) layout replace on inactive stripes
reviewing Keguang Xu · you voted +1 on current PS
218_review_prioritypw_shepherdpt_ecro 3 unresolved XL +1320 −64
11h
build #135174 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger +1 2026-11-02 04:54 · Zhenyu Xu +1 2026-11-03 02:34
no vote yet: Ronnie Sahlberg, Qian Yingjin, Marc Vef
patchsets:
+29 earlier PS1 06-26 PS13 07-27 PS14 07-28 PS15 07-31 PS16 08-05 PS17 08-06 PS18 08-07 PS19 08-12 PS20 08-20 PS21 08-25 PS22 08-25 PS23 09-02 PS24 09-08 PS25 09-08 PS26 09-09 PS27 09-11 PS28 09-17 PS29 10-08 Andreas Dilger PS30 10-08 Andreas Dilger PS31 10-08 Andreas Dilger PS32 10-12 PS33 10-12 PS34 10-13 Andreas Dilger PS35 10-15 Andreas Dilger PS36 10-15 Andreas Dilger PS37 10-16 Andreas Dilger PS38 10-19 Andreas Dilger PS39 10-22 Andreas Dilger PS40 10-26 Andreas Dilger
PS41 10-28 PS42 10-30 PS43 11-02 Andreas Dilger PS44 11-02 Andreas Dilger PS45 11-02 Andreas Dilger
threads: 3 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS41 2026-10-28 23:26 Ronnie Sahlberg cl_object.h:226 — Or change CL_FSYNC_LOCAL = 0 and a BUILD_BUG_ON(CL_FSYNC_LOCAL != 0) would make it safe if future code blindly clears the conf where t
Ronnie Sahlberg PS41 · 2026-10-28 23:14
The risk is for future code. A new layout-change caller that just zeroes conf would get CL_FSYNC_NONE without anyone noticing. Prune would start writeback but not wait for it, and the old layout would be torn down while dirty pages were still being written to its objects. The likely result is lost or misdirected writes, or crashes and assertion failures during cleanup. The code compiles fine and nothing warns, so this would be hard to trace back to the missing field.
Ronnie Sahlberg PS41 · 2026-10-28 23:26
Or change CL_FSYNC_LOCAL = 0     and a BUILD_BUG_ON(CL_FSYNC_LOCAL != 0)   would make it safe if future code blindly clears the conf where this enum is embedded.
reply PS41 2026-10-28 16:32 Gerrit AI review for Lustre mdd_object.c:4453 — (style) This isn't a bug, but the kernel-doc for this non-static function does not describe @env, @obj or @mlc, and has no Return: section.
Gerrit AI review for Lustre PS41 · 2026-10-28 16:32
(style) This isn't a bug, but the kernel-doc for this non-static function does not describe @env, @obj or @mlc, and has no Return: section. `kernel-doc -v` warns about all three parameters. If the patch is refreshed, consider adding them.
reply PS45 2026-11-03 00:40 Gerrit AI review for Lustre mdt_reint.c:955 — (defect) Can the victim's new layout land on the same OST that lod_ost_offline() just reported as offline?
Gerrit AI review for Lustre PS45 · 2026-11-03 00:40
(defect) Can the victim's new layout land on the same OST that lod_ost_offline() just reported as offline?

The template keeps the source stripe count as an assigned count, so lod_stripe_count_min() requires all of it. A stopped OST is not excluded by the allocator. osp_statfs() returns -EAGAIN for a DISCON import, lod_statfs_and_check() keeps it active, and the last RR pass accepts it:

    lod_ost_alloc_qos() -> -EAGAIN (too few good OSTs)
    lod_ost_alloc_rr(): speed == 2, connecting -> rc = 0
    osp_precreate_reserve(): opd_pre_status -ENODEV, objects still in the pool -> success

The reserve hands out a precreated object without contacting the OST. Take 4 OSTs, a file created with `-c -1` and OST0 stopped. trunc(0) instantiates 4 stripes with one on OST0, swaps, bumps the generation and replies MS_LAYOUT_REPLACED. The client's punch of the new object then blocks on OST0, the same hang this patch is meant to avoid. The swap and the new objects are wasted as well. The comment in sanity-flr test_50e ("RR last-resort may place on the DISCONN OST") suggests this was seen in testing.

Would it work to run mo_layout_check(MD_LAYOUT_UNAVAILABLE) on the victim after mo_layout_change() and skip the swap if it still reports an unavailable stripe? setattr would then fall back to the normal trunc(0), as the commit message describes for allocation failures.
tags: 218_review_priority pw_shepherd pt_ecro
owner Keguang Xu · uploader Andreas Dilger · PS45 uploaded 3d ago · NEW · open in Gerrit ↗
commit message
LU-20211 mdt: trunc(0) layout replace on inactive stripes

When truncate(0) hits a file whose layout references deactivated or
disconnected OSTs, and the client advertises
OBD_CONNECT2_LAYOUT_REPLACE, replace the layout: move the old layout
onto a volatile victim and instantiate a fresh layout on the file from
the existing pattern via QoS/RR.  A full or read-only OST is still
usable and does not trigger this.  If the new layout cannot be
allocated, keep the old layout and do a normal trunc(0).
Skip it for a lease holder (MDS_TRUNC_KEEP_LEASE): lfs mirror resync
and copy truncate only one mirror, and the in-sync mirror must stay.
An OST is offline if it was deactivated or its OSP import is not
connected, which is checked directly since LOD only learns of the
disconnection at its next statfs refresh.

After the layout swap, do not update the parent FID of the volatile
victim's objects, which are destroyed on close, nor of any object on
an offline OST.  That update reads the object's filter_fid first, and
the RPC would wait for an unreachable OST while LAYOUT EX is held.
An OST that reconnects between the declare and execute passes is also
skipped at execute, since no OSP sub-transaction was declared for it.

Skip replace when any component has LCME_FL_NOSYNC.  That flag freezes
the mirror's existing objects; swap would discard the snapshot.  The
NOSYNC test runs once, inside mdt_replace_unavailable_layout(), which
returns 0 so setattr falls through to a normal trunc(0).

mdt_reint_setattr() does not check NOSYNC.  It probes for an
unavailable layout before mdt_attr_set() and without a DLM lock, so a
healthy trunc(0) skips LAYOUT EX.  If the probe finds one,
mdt_attr_set() takes UPDATE|LAYOUT|XATTR EX in a single enqueue and
replaces the layout under it.  A second lock on the file while the
saved UPDATE lock is held could queue behind a setxattr waiting for
both, and deadlock (LU-3601).  The unavailable-stripe result is
re-checked under the lock, so a concurrent trunc(0) that already
replaced the layout does not allocate a second set of objects.

Extend the layout API with MD_LAYOUT_UNAVAILABLE (detect stripes on
offline OSTs) and MD_LAYOUT_INSTANTIATE (allocate from a source
pattern).  Add lod_generate_lovea_template() to emit uninstantiated
LOVEA templates that omit placement hints so new stripes use QoS/RR,
and trigger replacement from mdt_reint_setattr() via
mdt_replace_unavailable_layout().

Layout-type handling for templates / instantiate:
- DoM: never carries OST objects; force stripe_count to 0 and skip
  the OST object array so LOVEA size matches INIT DoM.
- PFL/DoM: keep the DoM component and replace only OST components.
- SEL: coerce LOV_MAGIC_SEL to COMP_V1 for lod_qos_parse_config();
  keep LCME_FL_EXTENSION and restamp SEL when LOVEA is written.
- EC: re-emit bound data/parity as unbound (IS_LINK_ID + shared
  link id) so lod_qos_prep_create() can pair before component IDs
  exist.

Layout replace creates a volatile victim via mdt_orphan_open().
Set mlc_no_inherit on MD_LAYOUT_INSTANTIATE so the new layout does
not inherit the local ROOT default pool from the orphan parent.
Zero mti_spec first defensively before the volatile create;
mdt_thread_info_reset() already clears it per request, and setattr
does not leave create state there.

After a successful swap, sync the object before replying so the new
layout is durable; replay skips replace.  On success, return
MS_LAYOUT_REPLACED (with OBD_MD_FLEASIZE) in the setattr reply so
the client applies the new LOVEA.  Before applying it, the client
discards its dirty pages past the returned size (all of them for
trunc(0)), so prune does not write them back to unavailable OSTs.
This lets a later server replace only the OST objects past a
non-zero truncate size.  The client reserves the default layout size
in the setattr reply buffer of any truncate.  A resent trunc(0)
setattr (lost or truncated reply) returns the current layout with
MS_LAYOUT_REPLACED, whether or not the original request replaced it;
the client ignores a layout whose generation is unchanged.

Add sanity/test_27xt (plain, PFL/DoM, SEL), sanity-ec/test_74b (EC),
and sanity-flr/test_50e (mirrors, resync), which stop the OST.  Add
sanity/test_27xv, which holds the replace with
OBD_FAIL_MDS_LAYOUT_REPLACE_PAUSE while a setxattr from a second
mount waits for the file, with sync_lock_cancel=never so the saved
UPDATE lock stays PW, to check for the deadlock.

Test-Parameters: testlist=sanity serverversion=2.17 env=SANITY_EXCEPT="24D 27D"
Test-Parameters: testlist=sanity-flr ostcount=5 serverversion=2.17 env=SANITY_FLR_EXCEPT="0a 34b"
Test-Parameters: testlist=sanity clientversion=2.17
Assisted-by: Cursor:Grok-4.6 llm_code_and_review_tools
Signed-off-by: Keguang Xu <kxu@ddn.com>
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools
Assisted-by: Cursor:Composer
Change-Id: I07e0792a51e144d935cece4b028e17f659e4ccfd
65219 master J –B ✓T ✓R +2/2
LU-12669 llite: make AIO reads on EC file synchronous
reviewing Patrick Farrell · you voted +1 on current PS
pw_ownpt_ecro M +127 −14
22h
build #134978 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger +1 2026-10-31 07:23 · Zhenyu Xu +1 2026-11-04 09:46
no vote yet: Ronnie Sahlberg, Marc Vef, Shaun Tancheff
patchsets:
+34 earlier PS1 04-10 PS2 04-10 PS3 04-10 PS4 04-10 PS5 04-10 PS6 04-15 PS7 04-15 PS8 04-25 PS9 04-29 PS10 04-29 PS11 04-29 PS12 04-29 PS13 05-05 PS14 05-05 PS15 05-05 PS16 05-06 Ronnie Sahlberg PS17 05-20 Marc Vef PS18 06-04 Ronnie Sahlberg PS19 07-13 Marc Vef PS20 07-13 Marc Vef PS21 07-13 Marc Vef PS22 07-15 Marc Vef PS23 07-26 Marc Vef PS24 07-26 Marc Vef PS25 08-17 Marc Vef PS26 08-17 Marc Vef PS27 08-17 Marc Vef PS28 08-17 Marc Vef PS29 08-17 Marc Vef PS30 08-19 Maximilian Dilger PS31 10-16 patrick bot PS32 10-18 patrick bot PS33 10-19 patrick bot PS34 10-19 patrick bot
PS35 10-20 patrick bot PS36 10-28 patrick bot PS37 10-28 patrick bot PS38 10-29 patrick bot PS39 10-31 patrick bot
tags: pw_own pt_ecro
owner Patrick Farrell · uploader patrick bot · PS39 uploaded 5d ago · NEW · open in Gerrit ↗
commit message
LU-12669 llite: make AIO reads on EC file synchronous

For sync DIO, EC recovery on read failure runs inline in
ll_file_io_generic() after cl_sync_io_wait_recycle().  AIO
has the same recovery requirement but cannot run recovery
from the sub-DIO completion path: ll_file_io_generic()
returns -EIOCBQUEUED to the VFS before the BRW completion
fires, so the syscall context recovery needs (the lu_env,
the user's iov_iter, the range lock) is gone by the time the
read error is known.

Rather than building a workqueue-based async recovery path,
make AIO reads on EC files behave as sync DIO: after
cl_io_loop(), for an AIO read on a layout with a parity
mirror, set cda_no_aio_complete and cda_creator_free to
disarm the async ki_complete path, then drop into the same
wait + restart code sync DIO uses.  The VFS calls
ki_complete itself when we return.

The check is on the whole layout, not on the component at
the read offset, so a read starting in a plain component is
drained on its first pass too.  Otherwise an error from that
pass surfaces in a later EC pass, which reconstructs only
its own range and reports the earlier bytes as read.  For
the same reason, an AIO read whose layout gains a parity
mirror after an earlier async pass has moved bytes stays
async, and reports a read error as it would on a plain file.

The flag flip is race-free because the submission ref on
cda_sync is still held: end_io cannot fire until we drop it
in cl_sync_io_wait_recycle().

This disables async semantics for every AIO read on an EC
file, not only those that need recovery. We cannot tell at
submission time whether reconstruction will be needed, so
the sync conversion drains queued IO even when submission
requests a restart without returning -EIOCBQUEUED.  As a
side effect, the range_lock taken by ll_file_io_generic() is
now held until all sub-DIOs have drained, instead of being
dropped while they are still in flight.

Do not retry -EINVAL or -EFAULT as a reconstruction read,
for sync DIO or AIO: they reject the request itself, so an
unaligned O_DIRECT read fails on an EC file as it does on a
plain file.

Re-enable the existing degraded AIO regression tests now
that these reads use the synchronous recovery path. Cover
an inactive later stripe in a single multi-stripe AIO, and
a failed plain component ahead of an EC one.

Test-Parameters: testlist=sanity-ec
Test-Parameters: testlist=sanity-ec fstype=zfs
Assisted-by: Opus:4.8 llm_code_and_review_tools
Assisted-by: Codex:gpt-6.1-sol
Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Signed-off-by: Marc Vef <mvef@whamcloud.com>
Change-Id: I394a3610e33b29ead8f5adb52dfa21db6b721944
57682 b2_15 J ✗2B ✓T ✓R +2/1
LU-17364 llite: don't use stale page.
reviewing Etienne AUJAMES · you voted +1 on current PS
LTS15 testfix S +44 −1
2d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
unique failing testhistory
runtests@ldiskfs+DNE:test_1seen in 11 other reviews
sanityn@zfs:test_51cseen in 1 other review
1 optional test failure(s) — informational
build #117698 SUCCESS · tests all Maloo sessions
reviews: Alexey Lyashkov +1 2025-10-24 07:54 · Zhenyu Xu +1 2025-11-11 02:09
no vote yet: Alexander Zarochentsev, Patrick Farrell
patchsets: PS1 01-08 PS2 10-21 PS3 10-22
tags: testfix
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS3 uploaded 379d ago · NEW · backport · open in Gerrit ↗
commit message
LU-17364 llite: don't use stale page.

using stale page for write might confuse a read path,
which expect any IO page have PG_uptodate flag set,
and it caused an panic with removing from IO.

Lustre-commit: dad3bed7617fba895db169facde91856e89c2b08
Lustre-change: https://review.whamcloud.com/53550

Test-Parameters: testlist=sanityn env=SLOW=yes,ONLY=16k,ONLY_REPEAT=10
Test-Parameters: testlist=sanityn env=SLOW=yes,ONLY=16k,ONLY_REPEAT=10
Test-Parameters: testlist=sanityn env=SLOW=yes,ONLY=16k,ONLY_REPEAT=10
Test-Parameters: testlist=sanityn env=SLOW=yes,ONLY=16k,ONLY_REPEAT=10
Test-Parameters: testlist=sanityn env=SLOW=yes,ONLY=16k,ONLY_REPEAT=10
Test-Parameters: testlist=sanityn env=SLOW=yes,ONLY=16k,ONLY_REPEAT=10
Signed-off-by: Alexey Lyashkov <alexey.lyashkov@hpe.com>
Change-Id: Ia01129ceaecf53d8d9f301c26cd2d65122f6a267
Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com>
Reviewed-by: Alexander Zarochentsev <alexander.zarochentsev@hpe.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
69702 master J –B ✓T ✓R +1/2
LU-20708 llite: rebuild faulting EC pages from parity
reviewing Andreas Dilger · you voted +1 on current PS
pt_ecro218_review_priority 5 unresolved M +220 −15
7d
build #133745 SUCCESS · tests all Maloo sessions
reviews: Zhenyu Xu +1 2026-10-23 06:57
no vote yet: Keguang Xu, Patrick Farrell
threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS1 2026-10-17 21:56 Gerrit AI review for Lustre llite_mmap.c:77 — (style) This isn't a bug, but the kernel-doc block above ll_fault_io_init() doesn't describe the new @ndelay_tried and @ndelay parameters, s
Gerrit AI review for Lustre PS1 · 2026-10-17 21:56
(style) This isn't a bug, but the kernel-doc block above ll_fault_io_init() doesn't describe the new @ndelay_tried and @ndelay parameters, so `contrib/scripts/kernel-doc -v -none` now warns twice for this file.
reply PS1 2026-10-17 21:56 Gerrit AI review for Lustre llite_mmap.c:160 — (suggestion) Only the fast fault path finds the rebuilt page on the retry. With llite.*.fast_read=0, or while the layout lock is not held (C
Gerrit AI review for Lustre PS1 · 2026-10-17 21:56
(suggestion) Only the fast fault path finds the rebuilt page on the retry. With llite.*.fast_read=0, or while the layout lock is not held (CL_LAYOUT_GEN_NONE), the retried fault takes the slow path. Its CIT_FAULT lock enqueue never matches the EC placeholder, since osc_match_base() skips LDLM_FL_PLACEHOLDER except for page-coverage tests. The no-delay enqueue fails again, ll_fault_ec_read() returns false because FAULT_FLAG_TRIED is set, and the fault ends up waiting for the OST after already doing the parity rebuild. Should the commit message mention the fast_read dependency, or should the slow path handle this case?
reply PS1 2026-10-28 11:15 Keguang Xu llite_mmap.c:179 — (defect?) the 1MiB round-down prefetch in ll_fault_ec_read() can make a
Keguang Xu PS1 · 2026-10-28 11:15
(defect?) the 1MiB round-down prefetch in ll_fault_ec_read() can make a
recoverable fault unrecoverable.

For non-VM_RAND_READ faults, ll_fault_ec_read() expands the read to an aligned 1MiB window (llite_mmap.c:177-179). That range is what CIT_EC_RD passes to lov_find_comp_with_ec(). If the window overlaps any stale parity component on the mirror, that helper clears the match and breaks out of the mirror walk, so a later valid parity component in the same mirror is never considered (lov_io.c:375-380). The whole CIT_EC_RD then fails with -EIO even when the fault page itself could have been rebuilt.

Example:
  - stripe size 64KiB
  - components [0, 512KiB) and [512KiB, EOF)
  - parity for the first component is stale; parity for the second is valid
  - the offline data OST holds data at the start of both components
  - fault at offset 512KiB
  
The target page sits only in the second component and could be restored from its valid parity. ll_fault_ec_read() instead starts at round_down(512KiB, 1MiB) == 0 and reads [0, 1MiB). That extent overlaps the stale first parity, lov_find_comp_with_ec() rejects the parity mirror, and the read fails before the target page is rebuilt.

ll_fault_ec_read() ignores the read result and still returns true, so the fault returns VM_FAULT_RETRY. On the next entry FAULT_FLAG_TRIED makes fault_flag_allow_retry_first() fail, recovery is not retried, and the fault waits for the OST.

Please restore the fault page first (or clamp the prefetch window to the target component) before prefetching neighbouring pages, and do not treat a failed EC read as success.
reply PS1 2026-10-28 11:15 Keguang Xu llite_mmap.c:362 — (defect?) after a successful EC rebuild, the fault can still hang waiting for the offline OST ll_fault_ec_read() fills the page cache under
Keguang Xu PS1 · 2026-10-28 11:15
(defect?) after a successful EC rebuild, the fault can still hang waiting for the offline OST ll_fault_ec_read() fills the page cache under an EC placeholder and returns VM_FAULT_RETRY, but completing the kernel retry still depends on one opportunistic fast-path hit in __ll_fault() (llite_mmap.c around the ll_filemap_fault() call). That is not reliable.

Example 1 — fast_read enabled, folio lock contention:
  1. First fault: OST down, ndelay/mirror path ends in ll_fault_ec_read(),
     pages are Uptodate in cache, return VM_FAULT_RETRY.
  2. Kernel re-enters ->fault with FAULT_FLAG_TRIED.
  3. Fast path sets FAULT_FLAG_RETRY_NOWAIT and calls ll_filemap_fault().
     Another thread briefly holds the folio lock, so filemap_fault() returns
     VM_FAULT_RETRY immediately without waiting.
  4. __ll_fault() treats that as a fast-path miss and falls through to the
     slow CIT_FAULT path in the same call.
  5. CIT_FAULT enqueues a normal data lock before filemap_fault(). Placeholder
     locks are skipped by ordinary match in osc_match_base() (only page-coverage
     TEST_LOCK may match them), so this enqueues against the dead data OST.
  6. Recovery is attempted again, but ll_fault_ec_read() bails out because
     fault_flag_allow_retry_first() is false under FAULT_FLAG_TRIED, then
     ndelay is cleared and the fault waits for the OST.
At step 6 the rebuilt pages are already in cache. A later folio unlock does not unblock the LDLM wait.

Example 2 — fast_read disabled (no contention required):
  Same as above after step 1, but the retry never takes the fast path, so it
  goes straight to CIT_FAULT and the same placeholder/OST wait problem.

The intended model is "rebuild once, then the retried fault consumes cache via the fast path". Any miss of that single NOWAIT lookup leaves a fault that cannot complete while the OST is still down.

Please make cache consume on retry reliable — for example match/use the placeholder for coverage, or skip dead-OST enqueue when the fault page is already Uptodate under a placeholder — rather than depending on one NOWAIT fast-path lookup.
reply PS1 2026-10-17 21:56 Gerrit AI review for Lustre llite_mmap.c:402 — (minor) ll_fault_io_init() returns ERR_PTR(-ENODATA) for the EC switch, but also returns cl_io_init()'s own rc unchanged, and an HSM-release
Gerrit AI review for Lustre PS1 · 2026-10-17 21:56
(minor) ll_fault_io_init() returns ERR_PTR(-ENODATA) for the EC switch, but also returns cl_io_init()'s own rc unchanged, and an HSM-released file returns -ENODATA too. lov_io_init_released() sets ci_restore_needed, and vvp_io_fini() leaves ci_need_restart clear when ll_layout_restore() fails ("if restore registration failed, no restart, we will return -ENODATA").

So a fault on a released file whose restore can't be registered now goes into the parity path. ll_fault_ec_read() drops the mmap lock and runs a 1MiB read_iter() (another restore attempt) and returns VM_FAULT_RETRY. The retried fault fails twice more before the SIGBUS that used to happen right away. That is about four restore requests instead of one, plus an "EC read" debug message for a non-EC file.

Could the EC switch be reported with its own signal, e.g. a `bool *switch_ec` out parameter, rather than overloading -ENODATA?
tags: pt_ecro 218_review_priority
owner Andreas Dilger · uploader Andreas Dilger · PS1 uploaded 21d ago · NEW · open in Gerrit ↗
commit message
LU-20708 llite: rebuild faulting EC pages from parity

A page fault on an EC file with a data stripe on an unavailable OST,
e.g. during an OSS failover, waits for the OST in the fault's lock
enqueue, while read() of the same page is rebuilt from parity at once.
So mmap readers of the file, such as git or executables, hang.

Do the lock enqueues of read faults without delay like reads, so they
fail over to another mirror, and switch to CIT_EC_RD after the mirror
rounds as reads do.  The fault then drops the mmap lock, as
filemap_fault() does for IO, rebuilds the page, with the rest of the
aligned 1MiB around it unless the mapping is read randomly, into the
page cache with a CIT_EC_RD read, where the EC placeholder lock keeps
the pages Uptodate, and retries, which finds the page through the fast
fault path.  A fault that cannot be retried, one under a read() or
write() of the same file, which holds lli_trunc_sem, and one whose
every mirror has been tried wait for the OST as before.
The read RPC of a fault is not sent without delay, since a fault
cannot be restarted once the read fails, so a fault on a page whose
extent lock is still cached also waits for the OST.

Add sanity-ec test_41o, which stops the OST of a stripe.

Test-Parameters: testlist=sanity-ec ostcount=8
Fixes: 783c13bb0b8f ("LU-12669 ec: recover data from parity")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Assisted-by: ClaudeCode:claude-opus-5.5 ltvm,llm_code_and_review_tools
Change-Id: I8d565cbf7d643f026a5fb5e9428b5612e63ebbe5
31748 master J –B ✓T ✓R +0/2−
LU-4423 llite: change sai_thread to sai_task
reviewing Dmitry Eremin · you voted +1 on current PS
M +106 −99
28d
reviews: Zhenyu Xu +1 2018-04-11 04:22 · Timothy Day -1 2026-10-07 19:14
no vote yet: Jinshan Xiong, Andreas Dilger
owner Dmitry Eremin · uploader Dmitry Eremin · PS5 uploaded 3130d ago · NEW · open in Gerrit ↗
commit message
LU-4423 llite: change sai_thread to sai_task

Rather than allocating a ptlrpc_thread for the stat-ahead thread,
just use the task_struct provided by kthreads directly.

As nothing ever waits for the sai_task, it must call do_exit() directly
rather than simply return from the function.
Also it cannot use kthread_should_stop() to know when to stop.

There is one caller which can ask it to stop so we need a simple
signaling mechanism.  I've chosen to set ->sai_task to NULL when the
thread should finish up.  The thread notices this and cleans up and
exits. lli_sa_lock is used to avoid races between waking up the process
and the process exiting.

Change-Id: I0c807dfc3d9cc307e30b024e7a75c5d541fbaa12
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Dmitry Eremin <dmitry.eremin@intel.com>
65392 master J ✗2B ✓T ✓R +0/2−
LU-20156 lov: dont check layout rdonly for OSC page discard
reviewing Qian Yingjin · you voted +1 on current PS
5 unresolved XS +4 −2
37d
janitor flagged test failures unique to this patch — superseded (tests have since passed) — full janitor results
unique failing testhistory
racer@ldiskfs+DNE:test_2seen in 65 other reviews
sanity-lfsck@ldiskfs+DNE:test_18eseen in 12 other reviews
7 optional test failure(s) — informational
build #129029 SUCCESS · tests all Maloo sessions
reviews: Zhenyu Xu +1 2026-08-10 15:11 · Timothy Day -1 2026-09-28 15:53
no vote yet: Andreas Dilger
patchsets: PS1 04-17 PS2 08-10
threads: 5 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS2 2026-08-10 20:31 Gerrit AI review for Lustre COMMIT_MSG:9 — (defect) The description says the read-only state is not checked for page discard coming in as CIT_MISC+ignore_layout, but the code does not
Gerrit AI review for Lustre PS2 · 2026-08-10 20:31
(defect) The description says the read-only state is not checked for page discard coming in as CIT_MISC+ignore_layout, but the code does not key on that at all - lsm_is_rdonly() is still called for that I/O type whenever `lo_lsm` happens to be non-NULL. The skip is keyed on the pointer, not on the I/O type.

Could the body also say why `lo_lsm` can be NULL here? The OSC path runs without lo_type_guard, so lov_layout_change() can be sitting between lov_fini_composite() and the new llo_init(). Without that, a later reader cannot tell what the NULL case corresponds to.
reply PS2 2026-08-10 20:31 Gerrit AI review for Lustre COMMIT_MSG:14 — (style) Change-Id: normally sits after Signed-off-by: - that is the order the Lustre commit-msg hook produces.
Gerrit AI review for Lustre PS2 · 2026-08-10 20:31
(style) Change-Id: normally sits after Signed-off-by: - that is the order the Lustre commit-msg hook produces.
reply PS1 2026-08-10 09:09 Qian Yingjin lov_io.c:527 — done
Patrick Farrell PS1 · 2026-04-17 14:02
Should we skip this for any other cases as well?
Qian Yingjin PS1 · 2026-04-23 03:12
You mean only check for type CIT_READ CIT_WRITE CIT_SETATTR CIT_FAULT and skip other types?
Zhenyu Xu PS1 · 2026-08-10 06:00
I think the more appropriate change is to check lo_lsm before checking the rdonly state, as CIT_MISC+ignore_layout is called from the OSC, and the object's lo_lsm could have already been freed by then.
Qian Yingjin PS1 · 2026-08-10 09:09
done
reply PS2 2026-08-12 02:15 Timothy Day lov_io.c:727 — Maybe have a copy of the line `rdonly = lsm_is_rdonly(obj->lo_lsm);` in every case of the switch-case that needs it?
Gerrit AI review for Lustre PS2 · 2026-08-10 20:31
(defect) This is a test and then a separate dereference of a field that nothing on this path serializes. LOV_2DISPATCH_MAYLOCK() in lov_io_init() deliberately skips lov_conf_freeze() for CIT_MISC+ci_ignore_layout, and lov_io_init_composite() does not bump lo_active_ios for it, so lov_layout_wait() never waits on this I/O.

lov_free_memmd() does:

    *lsmp = NULL;
    kref_put(&lsm->lsm_refc, lsm_free);

A read that lands just before that store still returns a pointer that lsm_free() can release before lsm_is_rdonly() gets to `lsm_is_rdonly`. Does this shrink the race window rather than close it?

The CIT_MISC+ignore_layout case never touches lo_lsm anywhere else - it returns at the ci_ignore_layout test further down, before the lo_lsm users. So keying the skip off the I/O type would keep that path from reading lo_lsm at all, and would match what the commit message describes:

    if (!(io->ci_ignore_layout && io->ci_type == CIT_MISC))
        rdonly = lsm_is_rdonly(obj->lo_lsm);
Timothy Day PS2 · 2026-08-12 02:15
Maybe have a copy of the line `rdonly = lsm_is_rdonly(obj->lo_lsm);` in every case of the switch-case that needs it?
reply PS2 2026-08-10 08:28 Qian Yingjin lov_io.c:745 — null obj->lo_lsm is usually coming from CIT_MISC
Misc Code Checks Robot (Gatekeeper helper) PS2 · 2026-08-10 08:25
error: lov_io_slice_init():we previously assumed 'obj->lo_lsm' could be null (see line 727)
Qian Yingjin PS2 · 2026-08-10 08:28
null obj->lo_lsm is usually coming from CIT_MISC
owner Qian Yingjin · uploader Qian Yingjin · PS2 uploaded 87d ago · NEW · open in Gerrit ↗
commit message
LU-20156 lov: dont check layout rdonly for OSC page discard

It should not check the read-only state of the LOV layout for
page discard from OSC layer via CIT_MISC+ignore_layout as it
does not care/access LOV layout related info.

Fixes: ce98bfe5f72 ("LU-10499 pcc: add readonly mode for PCC")
Change-Id: I18506033ed53fbc6376fc8db546efbc0bfc9e350
Signed-off-by: Yingjin Qian <qian@ddn.com>
31734 master J –B ✓T ✓R +0/2−
LU-4423 llite: remove 'ptlrpc_thread usage' for sai_agl_thread
reviewing Dmitry Eremin · you voted +1 on current PS
stalled 457d M +57 −75
457d
reviews: Neil Brown -1 2019-07-10 07:16 · Zhenyu Xu +1 2018-04-10 06:44
no vote yet: Jinshan Xiong, Andreas Dilger
owner Dmitry Eremin · uploader Dmitry Eremin · PS3 uploaded 3131d ago · NEW · open in Gerrit ↗
commit message
LU-4423 llite: remove 'ptlrpc_thread usage' for sai_agl_thread

Lustre has a 'struct ptlrpc_thread' which provides control functionality
wrapped around kthreads. None of the functionality used in statahead.c
requires ptlrcp_thread - it can all be done directly with kthreads.

So discard the ptlrpc_thread and just use a task_struct directly.

Change-Id: Ifa63dead3dc791f702d355fe03aea834ff7c2965
Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Dmitry Eremin <dmitry.eremin@intel.com>
48311 b2_12 J !B ✓T ✓R +1/1
LU-14541 llite: Check vmpage in releasepage
reviewing Etienne AUJAMES · you voted +1 on current PS
stalled 1484d S +28 −12
1484d
janitor run: 1 failing config(s), none unique to this patch — janitor results
build #89205 SUCCESS · tests all Maloo sessions
reviews: Zhenyu Xu +1 2022-10-13 04:08
no vote yet: Andreas Dilger, John Hammond
owner Etienne AUJAMES · uploader Etienne AUJAMES · PS1 uploaded 1534d ago · NEW · backport · open in Gerrit ↗
commit message
LU-14541 llite: Check vmpage in releasepage

We cannot release a page if the vmpage reference count is
>1, otherwise we will detach a vmpage from Lustre when the
page is still referenced in the VM.

This creates a situation where page discard for lock
cancellation will not find the page, so we can get stale
data reads.

This re-introduces the LU-12587 issue where direct I/O on
a client falls back to buffered I/O if there are pages in
cache, since it cannot flush them.  This is annoying but
not a huge problem.

Lustre-change: https://review.whamcloud.com/47262
Lustre-commit: c524079f4f59a39b99467d9868ee4aafdcf033e9

Fixes: e59f0c9a245f ("LU-12587 llite: don't check vmpage refcount in ll_releasepage()")
Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Change-Id: I3aa1cd7330f5e7d1ba2ddb0c12779aa22f3d70b7
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: John L. Hammond <jhammond@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>

CC'd — on your radar, review not requested

(1)
58981 master J !B ✓T ✗15R -2/2−
LU-17159 lod: mark file layouts with append striping
cc Patrick Farrell · blocked on the owner: needs rebase — checkpatch: cannot be cherry-picked; enforced tests failed
needs rebase stalled 442d 1 unresolved M +74 −2
442d
janitor run: build failed — no tests ran — janitor results
failed enforced testplatformdetail
review-dne-part-1 crashed RHEL 9.4 / x86_64 ran 6 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% session
review-dne-part-1 crashed RHEL 8.10 / x86_64 ran 6 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% session
review-dne-part-4 crashed RHEL 8.10 / x86_64 ran 13 tests. 2 tests failed: sanity-flr, sanity-dom. %% THIS TEST SESSION CRASHED %% session
review-dne-part-4 crashed RHEL 9.4 / x86_64 ran 13 tests. 2 tests failed: sanity-flr, sanity-dom. %% THIS TEST SESSION CRASHED %% session
review-dne-part-6 RHEL 8.10 / x86_64 ran 4 tests. 1 tests failed: replay-single. session
review-dne-selinux-ssk-part-1 crashed RHEL 8.10 / x86_64 ran 3 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% session
review-dne-subtest-change RHEL 8.10 / x86_64 ran 3 tests. 1 tests failed: sanity. session
review-dne-zfs-part-1 crashed RHEL 8.10 / x86_64 ran 6 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% session
review-dne-zfs-part-4 crashed RHEL 8.10 / x86_64 ran 13 tests. 2 tests failed: sanity-flr, sanity-dom. %% THIS TEST SESSION CRASHED %% session
review-dne-zfs-subtest-change RHEL 8.10 / x86_64 ran 3 tests. 1 tests failed: sanity. session
review-ldiskfs crashed RHEL 8.10 / x86_64 ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% session
review-ldiskfs crashed RHEL 9.4 / x86_64 ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% session
review-ldiskfs crashed RHEL 8.10 / x86_64, RHEL 9.4 / x86_64 ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% session
review-ldiskfs crashed RHEL 8.10 / x86_64, SLES 15.5 / x86_64 ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% session
review-ldiskfs-ubuntu crashed RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 ran 8 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% session
7 optional test failure(s) — informational
build #112825 SUCCESS · tests all Maloo sessions
reviews: Andreas Dilger -1 2025-04-26 10:40
no vote yet: Qian Yingjin
patchsets: PS1 04-25 PS2 04-26 PS3 04-26 PS4 04-26 PS5 04-26
threads: 1 need your reply · 0 waiting on others · 0 own notes · 0 bot
reply PS5 2025-04-29 23:35 Andreas Dilger lod_object.c:5405 — Instead of making this a
Zhenyu Xu PS5 · 2025-04-29 16:03
if want_composite is true, then we need to set mirror_count to 1, as there is an assertion to make sure mirror_count == 0 only for plain layout file in lod_fill_mirrors() as LU-18962 shows.
Andreas Dilger PS5 · 2025-04-29 23:35
Instead of making this a
owner Patrick Farrell · uploader Patrick Farrell · PS5 uploaded 558d ago · NEW · open in Gerrit ↗
commit message
LU-17159 lod: mark file layouts with append striping

Add LCM_FL_APPEND flag to file layouts when a file is opened with
O_APPEND flag. This makes it easier to diagnose layout behavior
when the MDS decides to use append-specific layout, which can
override the default file layout.

Add dah_flags to dt_allocation_hint structure to pass MDS_OPEN_APPEND
flag from mdd_object_make_hint() to lod_ah_init(). The flag is set in
mdd_object_make_hint() when MDS_OPEN_APPEND is present in the open
flags, and is then used in lod_ah_init() to set the LCM_FL_APPEND flag
in the layout.

Also added BUILD_BUG_ON tests for LCM_FL flags in wiretest.c to ensure
the flag values remain consistent.

Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Change-Id: I927faae3a385a9d0acf40a37ab1be0c0d4cbb82c

Merged — last 30 days

(1)
67613 master J –B ✓T ✓R +4/2
LU-19994 ec: block LCME_FL_PARITY flag changes
mine
pt_ecro 2 unresolved M +91 −6
7d
reviews: Ronnie Sahlberg +1 2026-10-28 16:07 · Andreas Dilger +1 2026-10-28 16:07 · Oleg Drokin +2 2026-10-28 16:07
patchsets: PS1 07-29 PS2 09-24 PS3 10-14 Andreas Dilger PS4 10-14 Andreas Dilger
tags: pt_ecro
owner Zhenyu Xu · uploader Oleg Drokin · PS5 uploaded 7d ago · MERGED · open in Gerrit ↗
commit message
LU-19994 ec: block LCME_FL_PARITY flag changes

The LCME_FL_PARITY flag is reserved for EC parity mirrors that are
created implicitly by the --ec option.  It must not be settable on a
file layout component through "lfs setstripe --comp-set
--comp-flags=parity", nor clearable with "^parity", on either a
plain data component or the data component of an EC file.

The set of component flags that users may not set or clear on an
existing component, LCME_FL_INIT and LCME_FL_PARITY, was open-coded in
both llapi_layout_file_comp_set() and lod_declare_layout_set(), and
the same pair was reused as the keep-mask in mdd_split_ea().  Three
copies of one constant invite drift: adding another internal flag
later would have to be remembered at every site.

Hoist it into LCME_INTERNAL_COMP_FLAGS in lustre_user.h, next to the
existing LCME_USER_COMP_FLAGS, and use it at all three sites.

Also correct the LCME_USER_COMP_FLAGS comment.  LCME_FL_PARITY was
added to that mask by 782f0899635a ("LU-12186 utils: Add parity flag
to correct places"), but LU-19994 now rejects it on an existing
component, so "creation/modification time" is only accurate for
creation.

Fixes: 782f0899635a ("LU-12186 utils: Add parity flag to correct places")
Assisted-by: Augment:GLM-5.2
Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: Ie1aba5b5817569fc76d9e52548c36ba9dd38f9db
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/67613
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Ronnie Sahlberg <rsahlberg@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@thelustrecollective.com>
Tested-by: Maloo <maloo@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>