LU-18774 lnet: SIGSEGV in lnetctl yaml parser Avoid dereferencing a NULL pointer when YAML output contains an unmatched single or double quotation mark. Continue scanning for single quotation marks after an unmatched double quotation mark. Add a sanity-lnet regression test for both cases. Test-Parameters: trivial testlist=sanity-lnet env=ONLY=411 Signed-off-by: Frank Sehr <fsehr@whamcloud.com> Signed-off-by: Manish Regmi <mregmir@ddn.com> Change-Id: I2633ee0bb5461eec25044f0ca622cfaf18e2e5a1
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-2 crashed | RHEL 9.8 / x86_64 | ran 11 tests. 1 tests failed: sanity-pfl. %% THIS TEST SESSION CRASHED %% | session |
(style) The ldiskfs copy wraps this od_proc_entry cleanup in `#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 18, 53, 0)` but this one is unguarded. Harmless today, but the two should probably match so the guard can be dropped in one go later.
(defect) Same double-put as in qsd_tunables_init(): this drops the last reference, and then qmt_pool_alloc() does GOTO(out, rc) -> qpi_putref() -> qmt_pool_free() -> qmt_pool_tunables_fini(), which puts qpi_kobj again. Leaving the put to the fini (as dt_tunables_fini() does, gated on qpi_def_attrs) would keep it balanced.
(minor) This limit predates the patch, but it reads differently now that the file lives in sysfs, where writing with `echo` is the normal thing to do: `echo ugp > enabled` is 4 bytes and works, while `echo none > enabled` is 5 and gets -E2BIG. Since the function is being rewritten anyway, sysfs_streq(buffer, "none") plus a slightly larger bound would accept the trailing newline.
(style) Not a bug, but qsd_wait_timeout() returns int and these used to print with %d; %u here and in verion_mismatch_timeout_show() would render a negative value as a huge number. Worth restoring %d if the patch is refreshed.
(defect) On the strscpy() error path in qsd_init(), qsd_dev is still NULL when qsd_fini() gets here, so qsd->qsd_dev->dd_lu_dev is a NULL dereference.
(minor) The type is already known - qsd_tunables_init() is handed the server_name2index() result - so re-deriving it from ld_site->ls_top_dev here means the two halves can disagree. During osd_device_init0() the site's top device is still the OSD itself, so lu_device_is_md() is false even on an MDT and the MD instance's `quota_slave` link is not removed by its own fini. Storing the type (or just a bool) in the qsd_instance would keep create and remove symmetrical.
(defect) This put/wait runs unconditionally, but qsd_tunables_init() is the last thing qsd_init() does, and three earlier failures reach the same cleanup:
qsd_init() -> GOTO(out, ...) -> qsd_fini() -> qsd_tunables_fini()
The strscpy(), server_name2fsname() and qsd_get_fsinfo() failures all land there before qsd_tunables_init() has run, so qsd_kobj and qsd_kobj_unregister are still the zeroed OBD_ALLOC_PTR memory. kobject_put() then WARNs (state_initialized == 0) and never calls the release, and wait_for_completion() adds to a swait_queue_head whose task_list is {NULL, NULL}, which faults in list_add().
dt_tunables_fini(), which this looks modelled on, keeps the put and wait inside `if (dt->dd_def_attrs)` for exactly this reason. Should the same guard be used here?
This is legit and a defect.
(defect) Two problems in this error block: The link is created on the parent, `sysfs_create_link(&dev->dd_kobj, ...)`, so removing it from `&qsd->qsd_kobj` is a no-op and the `quota_slave` link is left behind. After this kobject_put() drops the last reference, qsd_init() still routes through `out:` -> qsd_fini() -> qsd_tunables_fini(), which puts qsd_kobj a second time. That is a refcount underflow on an already-released kobject.
LU-8066 quota: migrate quota out of proc With the upstream kernel requirement of not using procfs move the quota proc entries over to debugfs / sysfs. The simple entries are placed into sysfs and the complex into the debugfs tree. Extend the time to support proc symlink until after the 2.18 LTS release. Now on osd module load the symlink_brw_stats will determine if procfs is setup at all. Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: I003841c4e9131db9ac423763fa817097c09ed83d
| unique failing test | history |
|---|---|
| ost-pools@ldiskfs+DNE:test_25 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_25 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| recovery-small@ldiskfs+DNE:test_29a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| recovery-small@zfs:test_29a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@ldiskfs+DNE:test_56od | seen in 6 other reviews |
| sanity2@ldiskfs+DNE:test_65k | seen in 2 other reviews |
| sanity2@zfs:test_65k | seen in 2 other reviews |
| sanity-slow@zfs:test_255c | seen in 3 other reviews |
| sanity-lfsck@ldiskfs+DNE:test_43 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lfsck@ldiskfs+DNE:test_45 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lfsck@zfs:test_45 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_16c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_80 | seen in 81 other reviews |
| sanity-quota@zfs:test_16c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
It would be better to have a table declaring the stats, then have a loop iterating over all entries in the table to call lpricfs_counter_init() for each entry.
LU-13139 obdclass: collect stats for OSD methods frequency and time spent in each method is collected, then can be found in os[dp].*.osd_stats and lod.*.osd_stats: osd-ldiskfs.lustre-MDT0000.osd_stats= snapshot_time 1674142976.044241006 secs.nsecs start_time 1674142916.072747822 secs.nsecs elapsed_time 59.971493184 secs.nsecs trans_create 259 samples [usecs] 2 18 2000 18560 trans_start 259 samples [usecs] 0 249 505 64715 trans_stop 259 samples [usecs] 0 1906 11820 10291894 read_lock 332 samples [usecs] 0 1 3 3 write_lock 284 samples [usecs] 0 0 0 0 decl_create 100 samples [usecs] 0 12 57 491 create 94 samples [usecs] 11 96 4060 198414 decl_destroy 2 samples [usecs] 4 12 16 160 attr_get 493 samples [usecs] 0 23 24 530 decl_ref_add 36 samples [usecs] 0 0 0 0 ref_add 24 samples [usecs] 0 1 1 1 decl_ref_del 2 samples [usecs] 0 0 0 0 decl_xattr_set 102 samples [usecs] 0 0 0 0 xattr_set 15 samples [usecs] 0 5 10 32 xattr_get 35 samples [usecs] 0 7 17 91 decl_insert 116 samples [usecs] 0 0 0 0 insert 116 samples [usecs] 0 31 441 5607 ... osp.lustre-MDT0000-osp-MDT0001.osd_stats= snapshot_time 1734959321.493552049 secs.nsecs start_time 1734959257.142508748 secs.nsecs elapsed_time 64.351043301 secs.nsecs trans_create 5 samples [usecs] 0 0 0 0 trans_start 5 samples [usecs] 0 0 0 0 trans_stop 5 samples [usecs] 0 306 324 93870 read_lock 4 samples [usecs] 0 0 0 0 write_lock 13 samples [usecs] 0 0 0 0 decl_create 3 samples [usecs] 0 1 1 1 create 3 samples [usecs] 0 2 2 4 attr_get 16 samples [usecs] 0 34 68 2312 Change-Id: I1efe3eb5e646cd638a5fe558886468faa528a9d1 Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-arm | RHEL 8.10 / x86_64, Rocky 9.8 / aarch64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 24.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-lnet. | session |
(typo) "Do object"?
(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`.
(typo) "Do object" - DoM? This was raised on an earlier patchset and still reads the same way here.
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?
(typo) "Do object" -> "DoM object". This was raised on patchset 30 and is still here.
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).
(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?
(typo) "below" - the `--zerostart` description is above this one in the page.
(minor) `llapi_join_layouts(3)` doesn't exist in the tree, so this is a dangling cross-reference.
pattern_base is more clear
(minor) this should probably have `#ifndef BIT`
(style) unnecessary
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
Why are you working on a alternate version of the netlink patch series? What's the point?
Its a much simpler API than what has been developed. The other abstract doesn't buy much since its just as complicated. The goal here is to make the effort as little as possible.
The proof will be in the follow-on patches being smaller than the existing ones. The other patch has +450 LOC for the base patch (with only marginally more comments, not a full-on AI deluge), and this one is +270, so that is a good start.
As we previously discussed, having a patch that implements the same functionality on top of this framework matching, say, https://review.whamcloud.com/65205 ("LU-19768 quota: add quota genetlink family") would allow an apples-to-apples comparison.
LU-19768 obd: Create new framework for obd_device based Netlink The netlink API is very complex and each implementation has repeated code. Create a framework to make implementation easier and this allows more code sharing. To demostrate this new API move the target_obd to this new framework. This new framework actually uses the struct genl_info for its family field which exposed some issues with older kernels. Those issues have been fixed. New features: 1) Enforce setup of min_dump_alloc so we never have sk_buff overflow. Common sizes like OBD_GENL_HDR_SIZE and OBD_GENL_SOURCE_SIZE are done for you. ctx->setup_keys() is used to do implementation specific sizing calculations. 2) Besides ensuring the obd still exist only collect obd devices that are attached, set up and not stopping. 3) Each source attribute is per obd device so only emit when the obd changes, not once per message. 4) Use Xarray instead of genradix since it has built in cursor handling. 5) Use of obd device's obd_minor value instead of the obd location string. Test-Parameters: trivial Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: I06931716758cb02b353ba3ec37d08a73fb332c69
"since these are symbols exported from the shared library" looks backwards. lustre/utils/liblustreapi.map globs only `cfs_*`, `llapi_*`, `libcfs_*`, `l_ioctl`, `mdt_hash_name`, `lu_foreign_types`, `Parser_*` and ends with `local: *`, so dump_pin_object() and friends were hidden before this patch. The llapi_ prefix is what makes them match the `llapi_*` wildcard and become part of the library's exported ABI, even though they stay declared only in lustreapi_internal.h and take a `struct cYAML *` that is not public. Is exporting them intended, or should the rationale be restated?
The body covers the two new options, the new llapi entry points and the renames, but the largest hunk in the patch is unmentioned: liblustreapi_pcc.c replaces cYAML_build_tree() with a hand-written parser, parse_pin_xattr_advanced(), and rewrites llapi_dump_pin_object() so lustre.pin is now serialised as a single YAML flow sequence, e.g.
[hsm: 1,pool: [p1,^p2,^any]]
That is a new on-disk encoding for lustre.pin and a new parser for attacker-settable input, so it deserves a paragraph of its own here. Should it be described, or split into its own patch ahead of the option work?
(minor) The three `lfs pool pin/unpin/pin_info` option parsers also switch from `llint_lqa_name_verify()` to `llint_pool_name_verify()`, which is a user-visible fix rather than a rename: the LQA form only permits `_` as an extra character, so a pool name containing `-` was previously rejected (with an "LQA" diagnostic). Worth a sentence here so the hunk isn't a surprise.
This reads as though the exclusive set can be grown, and the DESCRIPTION paragraph above only says a new *non-exclusive* pin fails with EPERM. `llapi_pool_pin_only_fd()` runs `pool_pin_check_constraints()` first, which returns -EPERM whenever an only_pool entry exists and the requested pool is not already among the `pool` entries, so a second `--only` pin is rejected too:
lfs pool pin --only --pool p1 f # [pool: [p1,^any]]
lfs pool pin --only --pool p2 f # EPERM, p2 is not added
Should adding another exclusive pool be allowed, or should the wording say that once a target is exclusively pinned no further pool can be added at all?
(minor) if the patch is refreshed: every pre-existing form of the command has an example here, but the two new options do not. Something like
$ lfs pool pin --only --pool scratch /mnt/testfs/file
$ lfs pool pin --not-pool archive /mnt/testfs/file
would keep the section complete.
(minor) same as in lfs-pool-pin.1 - no example for the new --not-pool form, e.g. `lfs pool unpin --not-pool archive /mnt/testfs/file`.
(style) this isn't a bug, but the error string is split across two source lines; the sibling messages in this function keep theirs on one line even when it runs long.
(style) this isn't a bug, but `int i;` here, `int j = i + 1; int k;` at 978, and `char *v = val; bool is_num = false;` at 1095 are declarations after statements. Kernel/Lustre style keeps declarations at the top of their block; if the block gets too crowded for that, it is usually a sign the value-scanning loop wants to be its own helper.
Can this write one byte past `buff`?
In the unbracketed branch `end = len`, and for the last key/value pair no next-key comma is found, so `v_end = end` and `val_end = end`. `llapi_read_pin_xattr_object_fd()` calls this as
rc = fgetxattr(fd, XATTR_LUSTRE_PIN, buff, sizeof(buff)); /* char buff[XATTR_SIZE_MAX] */
yaml = parse_pin_xattr_advanced(buff, rc);
so `len` can be exactly XATTR_SIZE_MAX and `buff[val_end]` is `buff[XATTR_SIZE_MAX]`. setxattr() accepts a value of exactly XATTR_SIZE_MAX bytes, and a lustre.pin value that does not start with '[' and end with ']' is reachable via setfattr (sanity.sh sets lustre.pin that way).
The bracketed branch is fine because `end = len - 1`. Would rejecting `len >= XATTR_SIZE_MAX` on line 921, or reserving a byte for the terminator, close it?
(style) `else if` belongs on the same line as the preceding `}`.
"a lone only_pool key is preserved as-is" does not round-trip. With no pool/deny_pool entry, `have_pool_tokens` is false, so the only_pool node falls through to the generic emitter and is written as
[only_pool: name]
but parse_pin_xattr_advanced() rejects a literal only_pool key (`goto invalid` at 1092), so re-reading that attribute fails with EINVAL. It looks unreachable today because only_pool is always created alongside a pool entry and pool_unpin_update_entry() drops it when the last pool entry goes away. Should the comment say that instead, or should the emitter skip a lone only_pool?
"^any" shares the same token space as a pool name, so a pool actually named `any` collides with the exclusivity marker. `llapi_pool_deny_fd()` accepts it (`llint_pool_name_verify()`/`llapi_pool_name_validate()` both allow `any`, and neither pin path checks that the pool exists), and `llapi_dump_pin_object()` then writes it as a plain `^any` element.
Running the real parser/serialiser over that input:
lfs pool pin --not-pool any f -> writes [pool: ^any]
re-read of [pool: ^any] -> saw_any set, first_pool == NULL -> goto invalid, EINVAL
After that the attribute is unreadable by every later `lfs pool pin`, `lfs pool unpin`, `lfs pool pin_info` and `lfs pcc pin/unpin` on that file, and `lfs pool unpin --not-pool any` cannot undo it either, since it reads through the same parser. Only a raw `setfattr -x lustre.pin` recovers the file.
With other entries already present the deny is instead silently swallowed:
[pool: [p1,^any]] + deny "any" -> writes [pool: [p1,^any,^any]]
re-read -> {pool=p1} {only_pool=p1}, deny rule gone
and a pre-existing `[pool: [^d1,^any]]` fails to parse outright. Should `any` be rejected as a reserved name in `llapi_pool_deny_fd()` (and documented as such in lfs-pool-pin.1), or should the marker use a spelling that cannot be a valid pool name?
LU-19712 utils: Add only and not-pool options to lfs pool pin Introduce --only and --not-pool options to lfs pool pin. The --only option makes the pin exclusive to the set of pools the target is already positively pinned to (including the one this operation itself pins), while the --not-pool option prevents the file from being migrated or mirrored to the specified pool. Also add a matching --not-pool option to lfs pool unpin, via a new llapi_pool_undeny_fd(), to remove a deny rule without disturbing a same-named positive pin (a pool can never be both, since --not-pool on pin already refuses to deny an already-pinned pool). --not-pool always takes an explicit pool name; unlike --pool, it is never inferred from the target's layout, since a denied pool cannot appear there. Also rename verify_pin_xattr_object(), dump_pin_object(), read_pin_xattr_object() and read_pin_xattr_object_fd() to their llapi_-prefixed equivalents, since these are symbols exported from the shared library and the original unprefixed names were too generic for that; --only/--not-pool themselves go through the new llapi_pool_pin_only_fd()/llapi_pool_deny_fd()/llapi_pool_undeny_fd() entry points instead. Signed-off-by: Nikos Papakonstantinou <npapakonstantinou@ddn.com> Change-Id: Icc35bf87444edd74c1fcda927cead5e3b34a0fcd
Having a comment block that lists the enum field names but doesn't give them any descriptions is a waste of space.
(minor) Two things on this line, both for whenever the patch is next refreshed. `latency` is __u64, so `%lld` is the wrong conversion; `%ju` with a `(uintmax_t)` cast would match the rest of this format string. More visibly, the value printed here is now nanoseconds when the rule came back over Netlink, but the old_api path below still assigns seconds from attr.u.delay.la_latency, and `lctl net_delay_add -l` is still seconds. So `-l 5` followed by `net_delay_list` reports "latency 5000000000" against a current kernel and "latency 5" against a pre-Netlink one, under the same label. Would it be clearer to convert back to seconds here, or to spell the unit out in the output?
Makes sense to fix.
LU-16832 lnet: add nanosecond delay latency support Introduce nanosecond-resolution latency for LNet delay fault injection. The previous interface accepted latency only in seconds (u32). This change promotes the field to u64 nanoseconds and plumbs it so that sub-second delays (s/ms/us/ns) can be expressed precisely. Since this changes the Netlink output we bump the LNet netlink family version. The user land code is updated to accept and process the new latency_ns option for the non ioctl approach. The internal timer is moved to hrtimer for finer level of time resolution. Test-Parameters: trivial Signed-off-by: Sohei Koyama <skoyama@ddn.com> Change-Id: I9ed1bd34cef0f0bf647f87d17dd68f05274e2b28
(minor) Nothing in the patch makes an iter_iov_len() available: what is added is compat_iter_iov_len(), under a guard that makes it the only thing vvp_io.c ever calls. Could the body also say that vvp_mmap_locks() gains an iter_is_ubuf() special case, since that is a behaviour change rather than a rename?
(defect) `len` is not declared - the declaration above is `ssize_t nr`. With -Werror this test fails to compile on every kernel, so HAVE_ITER_IOV_LEN is never defined and the result is silently "no".
iter_iov_len() returns size_t, so this probably wants the same form as the neighbouring LC_SRC_HAVE_IOVEC_WITH_IOV_MEMBER test:
size_t len __attribute__ ((unused));
(typo) `384492c48e6e` does not resolve; the commit is 384492c48e6a ("net: devmem: support single IOV with sendmsg").
(defect) Once the autoconf test compiles, a 6.3+ kernel defines both HAVE_ITER_IOV_LEN and HAVE_USER_BACKED_ITER, so this helper is not compiled - but vvp_mmap_locks() calls compat_iter_iov_len() unconditionally, so vvp_io.c stops building. Right now the only thing preventing that is the broken test above; fixing either one alone breaks the build. Would it be simpler to follow the iter_iov_addr() pattern just above and supply the upstream name, `#ifndef HAVE_ITER_IOV_LEN` / `static inline size_t iter_iov_len(...)`, and call iter_iov_len() from vvp_io.c? Then the call site really does match upstream, and there is no Lustre-only name to keep in sync.
(defect) The advance expression now uses `bytes`, which the loop body modifies: `bytes += addr & ~PAGE_MASK` below, and `bytes -= vma->vm_end - addr` in the inner while loop. The old code advanced by `iov.iov_len` from the iovec copy, which the body never touched (it worked on `bytes` instead). So for an unaligned multi-segment iovec the iterator is advanced by `iov_len + (addr & ~PAGE_MASK)` per segment. The following segment is then scanned from a bogus offset, and a segment shorter than the overshoot is skipped completely, so no mmap lock is taken for it. Keeping the segment length in its own variable, used only by iov_iter_advance(), would preserve the old behaviour.
(minor) Can this branch be reached? The early return above returns 0 unless the iter is ITER_IOVEC or ITER_KVEC, and iter_is_iovec() is false for ITER_UBUF, so a ubuf iter never gets to the loop. Either the branch is dead code, or the gate above is what needs relaxing - the ubuf iter missing its mmap locks entirely looks like the pre-existing problem here.
(minor) compat_iter_iov_len() returns `iov_len - iov_offset`, while the iov_iter_iovec() being replaced returned `min(count, iov_len - iov_offset)`. The clamp is reachable: vvp_io_rw_lock() calls vvp_io_update_iov() -> iov_iter_truncate(vui_iter, crw_bytes) immediately before this, and lov_io_rw_iter_init() has already clipped crw_bytes to the current stripe chunk. A 4M read into a single 4M buffer on a 1M-striped file now asks policy_from_vma() for a 4M extent instead of 1M, and that extent can run past the end of the vma. Clamping with the remaining iov_iter_count() would keep the old extent.
LU-18687 build: iov_iter_iovec to iter_iov_len, iter_iov_addr Add HAVE_ITER_IOV_LEN to ensure an iter_iov_len() is available. iov_iter_iovec() is dropped and the address and bytes from the segment are accessed directly. This is done to align with the upstream linux kernel. Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun@tancheff.com> Change-Id: I906b248d03f30a765f27b0916419b88ee178d6a5
| unique failing test | history |
|---|---|
| sanity3@zfs:test_907 | seen in 60 other reviews |
| sanity-hsm@zfs:test_254b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanityn@ldiskfs+DNE:test_71a | seen in 62 other reviews |
LU-12514 utils: Build a real mount.lustre_tgt in a build tree
mount.lustre reads the fstype from argv[0], but in a build tree it
is a libtool wrapper that execs the hard-coded .libs/lt-mount.lustre,
so a mount.lustre_tgt symlink to it quietly mounts with '-t lustre'.
Build a real one for the build tree, under 'if TESTS' since only the
tests use it; keep installing a symlink, from install-data-hook,
which runs after mount.lustre is installed, and remove it from
uninstall-hook.
Update load_modules_local() to point /sbin/mount.lustre_tgt at the
build tree's mount.lustre_tgt, or at mount.lustre when there is
none, unless it points there already. Whatever was there is saved
first, or a .nonex marker left if there was nothing, so that
unload_modules_local() can restore the node. The old cleanup sat in
unload_modules(), which remote nodes never run.
Fixes: 58adf0b4aaf1 ("LU-12514 tests: add testing for lustre_tgt type")
Signed-off-by: Xiao Yang <xyang@ddn.com>
Change-Id: I1ffdfafa0a127ba12b371e61d14a2ce49389f9bf
| unique failing test | history |
|---|---|
| runtests@ldiskfs+DNE:test_1 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 crashed | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity-sec. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-dne | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-dne | RHEL 9.8 / x86_64 | ran 7 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-dne-arm | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 7 tests. 1 tests failed: sanity. | session |
The body says this handles the replacement of fscrypt_inherit_context(), but all three call sites are still there and unguarded:
lustre/llite/namei.c:1230
lustre/llite/namei.c:1851
lustre/llite/dir.c:537
llcrypt_set_context() is only wired up in one place (ll_new_node_finish() for symlinks); everywhere else the new call is commented out. Should the message say the conversion is partial?
A few hunks aren't accounted for by the description - can they be explained, or split out?
- config/Makefile.exports.in + lnet/libcfs/Makefile + lustre_compat/fs/crypto/Makefile: switching the llcrypt build gate from a config.h grep to an exported make variable
- lustre/llite/statahead.c: ll_xattr_cache_insert() -> ll_set_encflags()
- lustre/llite/namei.c: dropping the -ERANGE retry loop around get_context()
- lustre/llite/namei.c: dropping the `encrypt && (open_flags & O_CREAT) && d_inode(dentry)` branch that used to call ll_set_encflags() with preload=true
- the CDEBUG text changes ("it_finish server returned ...", "statahead server returned ...")
(defect) Two hunks aren't accounted for by the description: - a new UAPI ioctl, LL_IOC_GET_ENCRYPTION_NONCE / llcrypt_ioctl_get_nonce() - the folio signature change of llcrypt_encrypt_pagecache_blocks(), llcrypt_decrypt_pagecache_blocks() and llcrypt_finalize_bounce_page(), plus the new lustre_compat/linux/folio.h include Both are independently landable. Should they be split out, or at least named in the body?
(defect) These now hand a folio to the in-kernel helpers, but on 5.15 - the kernel this patch is targeting - fscrypt_encrypt_pagecache_blocks() and fscrypt_decrypt_pagecache_blocks() take a `struct page *`, and fscrypt_finalize_bounce_page() at line 77 takes a `struct page **` (osc_request.c passes `foliop`). The folio conversions are much more recent. There is no HAVE_* guard or compat shim here, so the in-kernel build looks like it would still fail on 5.15 with incompatible-pointer errors. Should a config/*.m4 test cover the page-vs-folio variants?
(defect) FS_IOC_GET_ENCRYPTION_NONCE and fscrypt_ioctl_get_nonce() only appeared in v5.7, and the mapping at line 96 is unguarded. Since the commit message says in-kernel fscrypt is supported down to 5.8-era kernels today, is a HAVE_FSCRYPT_IOCTL_GET_NONCE test needed before this can be mapped unconditionally?
(defect) This `#else` arm also covers the `--disable-crypto` build (no HAVE_LUSTRE_CRYPTO, no CONFIG_LL_ENCRYPTION), and llcrypt_context_for_new_inode() has no declaration there -- it is declared only at line 67 for the native branch, and in include/lustre_compat/linux/llcrypt.h only inside `#ifdef CONFIG_LL_ENCRYPTION`. dir.c and namei.c call it unguarded, so the build stops on an implicit declaration. llcrypt_prepare_new_inode() has the matching problem on the link side: it is declared here, but keysetup.c only defines it under `#if !defined(HAVE_FSCRYPT_SET_CONTEXT) || defined(CONFIG_LL_ENCRYPTION)`. On a kernel where HAVE_FSCRYPT_SET_CONTEXT is set (the autoconf test at config/lustre-core.m4:787 runs regardless of --enable-crypto), neither condition holds and nothing defines it. Should the no-crypto section of llcrypt.h grow stubs for both?
(style) Not a bug, but this `len` shadows the `size_t len` parameter that is handed to md_create() further down, which makes the block harder to follow. If the patch is refreshed, something like `ctxsize` would read better.
Since `encrypt` is forced to true a few lines up whenever IS_ENCRYPTED(dir) and open_flags is non-zero, the value passed in by ll_lookup_it_finish() is now only meaningful for the open_flags == 0 case. Was the parameter meant to stay?
(defect) This runs on every lookup, not just creates - ll_lookup_it_finish() is reached from plain ll_lookup_nd() too.
Two consequences for an encrypted parent:
- llcrypt_prepare_new_inode() returns -ENOKEY when the master key isn't loaded, so `ls` / `stat` of anything inside an encrypted directory without the key now fails instead of showing no-key names.
- with the key loaded it ends in llcrypt_get_encryption_info(inode), i.e. a getxattr RPC for the child's context, issued *before* the server-supplied context is stored. That is exactly what the comment three lines below says this code is arranged to avoid ("save an extra getxattr and avoid deadlock").
Was this meant to be gated on the create disposition?
(defect) GOTO(free_fake_inode, ...) lands on a label that is still inside this `if` block, and nothing after the label rechecks the error - control just falls through to the security-context setup, ll_intent_lock() and ll_lookup_it_finish(), and `retval` is overwritten by the success assignment at the end. So a failure from llcrypt_prepare_new_inode() or llcrypt_context_for_new_inode() is silently discarded, and the OBD_ALLOC failure at the -ENOMEM goto continues with op_file_encctx == NULL, creating the file in the encrypted directory with no encryption context at all. ll_dir_setdirstripe() and ll_new_node_prepare() both put an `if (err) GOTO(out..., err)` after the label; that seems to be missing here.
(defect) The volatile branch above takes a reference via volatile_ref_file() and the old code released it with fput() once the context had been fetched. Now the only fput() left is on the !ref_inode error path, so the reference leaks on every volatile-file create in an encrypted directory. The fake-inode branch also skips llcrypt_put_encryption_info(ref_inode) before destroy_inode(), so the llcrypt_info that llcrypt_prepare_new_inode() attached leaks too - dir.c:539 and namei.c:1843 both call it.
(defect) Swapping ll_xattr_cache_insert() for llcrypt_set_context() ties caching the server-supplied context to the *parent's* policy, which it did not depend on before.
For a directory that has its own policy but sits under an unencrypted parent, mdt_pack_encctx_in_reply() still sets OBD_MD_ENCCTX because the child carries LUSTRE_ENCRYPT_FL. Here `parent` is not encrypted, so llcrypt_prepare_new_inode() above returns 0 and leaves `encrypt` false, and then:
llcrypt_set_context() -> llcrypt_inherit_context(parent, ...)
-> llcrypt_get_encryption_info(parent) -> get_context() -> -ENODATA
(native path: fscrypt_set_context() hits WARN_ON_ONCE(!ci) and returns -ENOKEY).
The CWARN reads as non-fatal, but `rc` is no longer cleared on the way out -- the old `GOTO(out, rc = 0)` before the `out:` label is gone and `if (encrypt)` does not run to overwrite it, so ll_lookup_it_finish() returns the error and ll_lookup_it() turns it into ERR_PTR(). Does that make `ls`/`stat` of such a directory fail?
LU-20108 sec: support fscrypt natively for Linux 5.15 Currently Lustre only supports up to 5.8 kernels. This work handles the replacement of fscrypt_inherit_context() with fscrypt_prepare_new_inode() and fscrypt_set_context(). So the encrypt context is done in a two step process. Test-Parameters: trivial testlist=sanity-sec Change-Id: Ie8defa6e71fecddfd773e01f93d7ae3cb8d6e18e Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-ipv6 | RHEL 9.8 / x86_64 | ran 4 tests. 1 tests failed: sanity-lnet. | session |
| review-dne-part-2 | RHEL 9.7 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
| review-ldiskfs-arm | RHEL 8.10 / x86_64, Rocky 9.8 / aarch64 | ran 8 tests. 1 tests failed: lnet-selftest. | session |
I few issues. 1) Don't add new fault injection to lctl. Instead add it to lnetctl 2) No new ioctls. You need to update lnet_fault_cmd() and friends in api.c instead. The Netlink interface is IPv6 freindly. Can you tell me what the YAML net fault looks like? I can help you with this.
I added lnetctl commands together with Netlink support and also removed ipv4 specific logic to make it ipv6 friendly. I have not removed the ioctl and lctl commands yet as it can be used as fallback.
(style) This isn't a bug, but the fonts in the new synopsis are inconsistent: `-r` and `-i` are bold while `-s`, `-d`, `-z`, `-f`, `-n`, `-m`, `-p` and `-o` are plain, and the placeholders are lowercase italic. man-pages(7) style (and the rest of Documentation/man8) is bold for the option including its dashes and italic uppercase for the value, e.g. `\fB\-s\fR \fISRC\fR`.
(minor) This reads as if a portal selector simply has no effect on REPLY, but it actually removes REPLY from the rule. lnet_fault_attr_validate() narrows fa_msg_mask to GET|PUT as soon as fa_ptl_mask is non-zero, and lnet_corrupt_rule_add() then masks with PUT|REPLY, so PUT is all that is left. So `-p 52` with no `-m` gives a PUT-only rule even though the previous sentence says both are selected by default, and `-m REPLY -p 52` is rejected outright - lnetctl just prints "failed to add corrupt rule: Invalid argument" with no hint about which option caused it. Could the text say that specifying a portal restricts the rule to PUT?
(minor) Lustre man pages are expected to carry an EXAMPLES entry for each major way of using a sub-command, and lnetctl.8 already has that pattern at the end of the page for udsp. Could a short example be added here for the two scheduling modes, e.g. a rate rule
lnetctl fault corrupt add -s 10.0.0.1@tcp -d 10.0.0.2@tcp -r 100 -z 8 -f 4096 -m PUT -p 52
and an interval rule? The offset/offset_range/size interaction is hard to infer from the prose alone.
No ioctl!!!! This is not IPv6 friendly. You need to update lnet_fault_cmd() in api.c instead.
(minor) corrupt-fault.sh is added to noinst_SCRIPTS but not to lustre/tests/test-groups/regression, so once `Test-Parameters: testlist=corrupt-fault` has run for this change the new suite will not be picked up by any of the standard sessions again. Since the subtests are LNet-selftest based, would it be simpler to add them to sanity-lnet.sh, which is already in the regression group, or to add corrupt-fault to that list?
LU-19167 lnet: add corrupt fault injection Add a receive-side LNet fault rule that corrupts bytes in completed PUT and REPLY payloads before upper-layer completion. Rules can match source, destination, local NID, portal, and message type. They support rate- or interval-based scheduling and select the corruption offset, range, and size. Manage corrupt rules with lnetctl fault corrupt add, del, show, and reset over generic netlink. Document the commands in lnetctl(8), and add an LNet selftest for the corruption feature. Assisted-By: Codex:5.6-Sol Test-Parameters: testlist=corrupt-fault Signed-off-by: Manish Regmi <mregmi@ddn.com> Change-Id: Ib4972807a48c185043f335d030d266ed3cad7e1e
(typo) The test added by this patch is `test_113`, not `test_630`, so the message no longer greps against the code. Also "interace" on the next line.
(style) This isn't a bug, but the `case` is at the same indent as the enclosing `for` body while `esac` is one tab deeper. Both should line up one tab inside the loop.
(defect) These rules name `tcp$i` while the nets above are created as `${NETTYPE}$i`. The guard at the top of the test only requires `tcp*`, so with `NETTYPE=tcp1` the nets are `tcp11`..`tcp1140` and none of the UDSP rules match anything.
LU-20221 lnet: fix panic in lnet_net_show_dump with >128 NIDs
Dumping more than ~128 NIDs at high verbosity exhausts the hardcoded
64 KiB Netlink buffer. When the buffer is full, nla_nest_start()
returns NULL. The code previously failed to check this return value,
resulting in a NULL pointer dereference and an immediate kernel panic.
This patch fixes the crash by specifying the needed sk buffer size.
cb->min_dump_alloc is now dynamically sized based on
lnet_net_size_skb().
While strace profiling shows a typical NI payload takes ~480-520 bytes,
NI_MSG_VALUES_SIZE is set to more than 6Kb bytes. This provides
a safe margin for complex UDSP rulesets and massive IPv6 NIDs.
test_630 is added to sanity-lnet.sh to exercise high-stress
Netlink dumps using 140 LNet nets using the same interace and 50
UDSP policies.
Test-parameters: trivial
Fixes: 8f64231185a9 ("LU-9680 utils: fix nested attribute handling in liblnetconfig")
Signed-off-by: Malkeet Singh <masingh@ddn.com>
Change-Id: If8b55d87c13e3a14cb0335108dd3afedbc7a6c5f
LU-19921 sec: add disable_rootsquash mount option
Add the -o disable_rootsquash mount option, allowing users to
explicitly request disabling root squash on GSSIAM mounts when
authorized by the external GSSIAM authority.
Specifically, this patch implements:
- Client Mount Option:
Adds -o disable_rootsquash parsing in lustre/llite/llite_lib.c
and packs GSSIAM_OPT_DISABLE_ROOT_SQUASH in the GSSIAM init ctx
options payload.
- Server Nodemap Privilege Raising:
When authorized by the external GSSIAM server
(GSSIAM_AUTH_DISABLE_ROOT_SQUASH), gssiam_get_nodemap() passes
allow_root=true to nodemap_gssiam_attrs_update(). The per-identity
dynamic child nodemap is permitted to raise allow_root via the
parent 'gssiam' nodemap's pre-configured NODEMAP_RAISE_PRIV_ADMIN
delegation capability. Root squash remains strictly enforced
(allow_root=false) by default unless explicitly requested at mount
and authorized by the GSSIAM server.
- Extended Upcall Downcall Format:
Extends the kernel/userspace downcall contract by adding an
":options" field to the downcall string format parsed in
tgt_gssiam.c ("mount_option:expire:options:principal"), allowing
l_gssiam_auth to pass authorized permission/option flags to the
kernel upcall cache.
- Dedicated GSSIAM Option Flags:
Defines enum gssiam_mount_option_flags (GSSIAM_OPT_RDONLY and
GSSIAM_OPT_DISABLE_ROOT_SQUASH) in lustre_idl.h, cleanly separating
the GSSIAM option space from generic OBD_CONNECT_* connection flags.
Signed-off-by: Di Wang <ddiwang@google.com>
Change-Id: I35af55f4ff4193195028b157758a7b30bb2e0f9d
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-5 | RHEL 9.7 / x86_64 | ran 7 tests. 1 tests failed: lustre-rsync-test. | session |
I guess based on your other comments that this has *not* been implemented yet? If that is the case then I don't think this patch can land until the interop code is finished. Otherwise, this patch will break interop testing for master and there is a risk that the interop patch is not completed before the 2.18.0 release, which would be a major problem for sites trying to upgrade to this release.
Yes. The interop support has not been implemented in this series yet. (Sorry, the commit message was wrong) I am currently working on it and testing it, based on the previous compatibility work (https://review.whamcloud.com/c/fs/lustre-release/+/63517 ). However, as I go through the validation, I am finding additional cases that were not sufficiently considered, so I do not yet have a reliable estimate for when it will be complete. I agree that this patch should not land until the interop code is implemented and tested. Otherwise it could break master interop testing and create problems for sites upgrading to 2.18.0, as you pointed out.
The ofd_attr_set() hunk keeping `ofo_atime_ondisk` in sync isn't described here, and it isn't a units change - it is an independent fix for stale cached atime from 7c9ce8aac9e8 ("LU-13383 ofd: lazy atime update"). Could it be split into its own patch with a Fixes: tag so it can land separately?
The hui_* LASSERTF reordering in both wiretest.c copies is also unexplained; see the comment there.
(minor) The body doesn't mention `sb->s_time_gran = 1` in client_common_fill_super(). That is a fairly central part of the change - without it current_time() keeps truncating to whole seconds, so nothing the client generates locally would ever carry a sub-second value. Worth a line in the "sinks" bullet.
This changes the interpretation of several wire fields (ost_lvb, mdt_body, mdt_rec_*), so it should carry a Test-Parameters: line requesting interop runs against an older peer, e.g.
Test-Parameters: clientversion=2.15 testlist=sanity,sanityn
Test-Parameters: serverversion=2.15 testlist=sanity,sanityn
Without it the mixed-version paths this patch changes are never exercised by the automated test runs.
(minor) s64 nanoseconds since the epoch runs out at 2262-04-11 23:47:16 UTC (S64_MAX / NSEC_PER_SEC = 9223372036 s), not 2292 - this is the usual ktime_t limit. Worth correcting, since that number is the bound on what the new representation can hold.
(minor) The client advertisement is added by this patch: client_common_fill_super() gains OBD_CONNECT_NANOSEC_TIME for both the MDC and the OSC connect flags. "already advertised by clients" reads as if it came from an earlier change.
Hi Andreas and James, I’d like to discuss this patch with you. This patch does not currently include any compatibility support. For example, timestamps will break in configurations such as an ns-unaware MDS/OSS with an ns-aware client, or an ns-aware MDS/OSS with an ns-unaware client. I’d like to discuss the following two points: 1. Whether a compatibility patch is necessary. For example, couldn't we avoid the need for a compatibility patch by merging this patch right before the release? 2. How far we should go in supporting compatibility. For example, should we also consider communication between an ns-aware MDS and an ns-unaware MDS? If so, the required patch would become quite large. Best regards, Sohei
Sohei, there *must* be compatibility between at least old/new clients/servers. This should use the `OBD_CONNECT_NANOSEC_TIME` flag to determine if the clients are sending nsec or sec timestamps. This had been part of the other nanosecond timestamp patches, so I had assumed it is part of this series as well. Even if the patch was landed right before a release, there is no requirement/guarantee that clients and servers are upgraded together. We require at least interop between successive LTS releases (e.g. 2.15.latest to 2.18.0), but prefer interop for longer than this if possible (e.g. 2.14.x or earlier). There does not need to be major version interoperability between different MDS versions because they are typically upgraded together, but if this is practical to implement (i.e. it uses mostly the same code as client interoperability) it would be good to have this as well.
No interop handling :-( I would suggest splitting this patch into 2 new patches. One for clients and one for servers. That way we can see if "interop" works properly.
OBD_CONNECT_NANOSEC_TIME is missing from MDT_CONNECT_SUPPORTED here, and from OST_CONNECT_SUPPORTED below.
The client asks for it in client_common_fill_super(), but both servers unconditionally strip unsupported bits from the reply:
mdt_connect_internal(): data->ocd_connect_flags &= MDT_CONNECT_SUPPORTED;
ofd_parse_connect_data(): data->ocd_connect_flags &= OST_CONNECT_SUPPORTED;
so the bit is cleared on every connect and exp_connect_nanosec_time()/imp_connect_nanosec_time() return false even when both peers are new. Should the two masks be extended in this patch, so the follow-on compatibility patch has a flag that can actually be negotiated?
(minor) The matching comments on struct lu_attr's la_mtime/la_atime/la_ctime/la_btime in lustre/include/lu_object.h still read "in seconds since Epoch". Those fields change units in this patch too, and the follow-on rename patch leaves the comments alone as well.
I guess I had assumed when seeing these functions checking `OBD_CONNECT_NANOSEC_TIME` that the protocol interop was implemented.
(style) These are defined in obdclass/obdo.c right next to lustre_set_wire_obdo()/lustre_get_wire_obdo(), whose prototypes live in lustre_obdo.h. Declaring the new pair there would keep the obdo wire helpers together - not a bug, just placement.
LU-1158 general: convert timestamps to nanoseconds Switch the in-memory and wire timestamp values from epoch seconds to epoch nanoseconds. The conversion is localised to the edges where timestamps enter or leave Lustre; the internal plumbing just carries the same field values through unchanged. - sources: inode_get_[amc]time_ns() and ktime_get_real_ns() now provide nanoseconds, and the OSD layer reads and writes the on-disk inode timespec at nanosecond resolution. The client superblock sets s_time_gran = 1 so that current_time() keeps the sub-second part for locally generated timestamps. - sinks: the stat/statx paths convert the s64 nanosecond value back to a timespec64 with the standard ns_to_timespec64() (and ktime_to_timespec64() for ktime_t sources). - struct ost_lvb carries full nanoseconds in lvb_[amc]time (s64); its former split-nanosecond u32 companions become lvb_padding_1..4. struct ost_lvb_v1 stays in seconds for wire compatibility. - the changelog cr_time and HSM hui_* user-visible fields keep their existing on-disk and wire formats and are left unchanged. - the ofd and mdd atime-difference thresholds, the mdt ctime age limit and the cached llite inode times are kept in nanoseconds internally, and the atime_diff tunables accept and print fractional seconds. - the llog object mtime keeps its once-per-second update filter and is stored scaled to nanoseconds. All timestamp fields and the related interval knobs keep their historic names here and gain a _ns suffix in the following patch, once they all hold nanoseconds. s64 nanoseconds since the epoch covers timestamps up to year 2292. Since the units of the timestamps on the wire change, the same patch carries the compatibility layer so that every commit on master interoperates with peers that still use seconds. Negotiate OBD_CONNECT_NANOSEC_TIME on the MDT and OST connections (it is already advertised by clients) and add it to the connect flags used by the MDT when connecting to OSTs and other MDTs. A node converts wire timestamps to seconds when sending to a peer that did not negotiate the flag, and back to nanoseconds when receiving from such a peer. Conversion is applied on every path that carries a timestamp: the MDT inode times (mdt_pack_attr2body), the setattr, create, open, close, unlink, link, rename, migrate and setxattr reint records, the Data-on-MDT glimpse reply (mdt_lvb2reply / mdc_body2lvb), rmfid, the DNE stripe refresh (lmv), the OST lvb (ofd_lvbo_fill / osc_lock_lvb_update) and the OST obdo (lustre_set/get_wire_obdo and the ofd reply handlers). On the client the inode times are converted where the reply body enters llite. mdc_get_lustre_md() scales them keyed on the import of the request that carried the reply -- the target MDT that answered, which is correct even under LMV where the reply may come from an MDT other than index 0. ll_update_times() and the getstripe ioctl do the same for the bodies they read directly. Keying on the connection flag is exact and avoids the near-epoch and far-future misreads of a magnitude heuristic. Add sanity-ns.sh, a configuration-aware test suite that verifies timestamps warm and cold, including near-epoch and boundary values (pre-1970, y2038), nanosecond precision, per-MDT directory times, Data-on-MDT, FLR, cross-MDT operations, MDT/OST failover, setattr replay and cross-client coherency. Each test detects the negotiated nanoseconds_times flag per target and asserts exact nanoseconds against a new peer or second granularity against a legacy peer, so it is meaningful on uniform and mixed-version clusters alike. It is added to the regression test group. Assisted-by: ClaudeCode:Fable-5.1 Test-Parameters: testlist=sanity-ns Test-Parameters: mdscount=2 mdtcount=4 testlist=sanity-ns Test-Parameters: ostcount=4 testlist=sanity-ns Test-Parameters: fstype=zfs testlist=sanity-ns Test-Parameters: fstype=zfs mdscount=2 mdtcount=4 testlist=sanity-ns Test-Parameters: clientcount=2 testlist=sanity-ns Test-Parameters: serverversion=2.16 testlist=sanity-ns Test-Parameters: serverversion=2.15 mdscount=2 mdtcount=4 testlist=sanity-ns Test-Parameters: clientcount=2 serverversion=2.16 testlist=sanity-ns Test-Parameters: clientversion=2.16 testlist=sanity env=ONLY="36 39" Test-Parameters: clientversion=2.15 mdscount=2 mdtcount=4 testlist=sanity env=ONLY="36 39" Signed-off-by: Sohei Koyama <skoyama@ddn.com> Change-Id: I79570bc5a66e7c15472af90d690d689d3aa36269
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-6 | RHEL 9.7 / x86_64 | ran 4 tests. 2 tests failed: ost-pools, replay-single. | session |
LU-18231 obd: change obd_recovery_expired into OBDF_RECOVERY_EXPIRED
obd_recovery_expired is set from interrupt context and
was moved to a dedicated bitfield variable in
commit 848d709605948 ("b=17760 Separate locking for obd
bitfield and recovery") as to avoid having to use locking
from within the interrupt context.
As we now have migrated to use atomic {test|set|clear}_bit
operations to set individual bits we no longer depend on
spinlocks when accessing them and can thus move this bit
back into the bitmap.
Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com>
Change-Id: I81a2a7efc057b67cdfd82ca978116d44bbca82b8
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-ipv6 crashed | RHEL 9.7 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-ipv6 crashed | RHEL 9.8 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-1 crashed | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-1 crashed | RHEL 9.8 / x86_64 | ran 3 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-1 crashed | RHEL 10.1 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-2 crashed | RHEL 9.7 / x86_64 | ran 20 tests. 8 tests failed: sanity-pfl, sanity-lnet, lnet-selftest, pjdfstest, sanity-sec, sanity-lfsck, ru | session |
| review-dne-part-3 crashed | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-3 crashed | RHEL 9.8 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-4 crashed | RHEL 10.1 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-4 crashed | RHEL 9.7 / x86_64 | ran 15 tests. 7 tests failed: sanity-quota, sanity-hsm, sanity-flr, sanity-dom, replay-ost-single, mmp, insan | session |
| review-dne-part-5 crashed | RHEL 9.7 / x86_64 | ran 8 tests. 2 tests failed: sanityn, recovery-small. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-6 crashed | RHEL 9.7 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-6 crashed | RHEL 9.8 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-6 crashed | RHEL 10.1 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-7 crashed | RHEL 9.8 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-7 crashed | RHEL 9.7 / x86_64 | ran 10 tests. 4 tests failed: sanity-ec, sanity-scrub, sanity-pcc, large-scale. %% THIS TEST SESSION CRASHED | session |
| review-dne-part-8 crashed | RHEL 9.7 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-8 crashed | RHEL 10.1 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-8 crashed | RHEL 9.8 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-selinux-ssk-part-1 crashed | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-selinux-ssk-part-2 crashed | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-1 crashed | RHEL 9.7 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-1 crashed | RHEL 9.8 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-1 crashed | RHEL 10.1 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-2 crashed | RHEL 9.7 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-2 crashed | RHEL 10.1 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-2 crashed | RHEL 9.8 / x86_64 | ran 19 tests. 9 tests failed: sanity-pfl, sanity-lnet, lnet-selftest, pjdfstest, sanity-sec, sanity-lfsck, ru | session |
| review-dne-zfs-part-3 crashed | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-3 crashed | RHEL 10.1 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-3 crashed | RHEL 9.8 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-4 crashed | RHEL 10.1 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-4 crashed | RHEL 9.8 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-4 crashed | RHEL 9.7 / x86_64 | ran 13 tests. 7 tests failed: sanity-quota, sanity-hsm, sanity-flr, sanity-dom, replay-ost-single, mmp, insan | session |
| review-dne-zfs-part-5 crashed | RHEL 9.7 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-6 crashed | RHEL 9.7 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-6 crashed | RHEL 10.1 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-6 crashed | RHEL 9.8 / x86_64 | ran 4 tests. 2 tests failed: ost-pools, replay-single. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-7 crashed | RHEL 9.8 / x86_64 | ran 6 tests. 3 tests failed: sanity-ec, sanity-pcc, large-scale. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-7 crashed | RHEL 9.7 / x86_64 | ran 10 tests. 4 tests failed: sanity-ec, sanity-scrub, sanity-pcc, large-scale. %% THIS TEST SESSION CRASHED | session |
| review-ldiskfs crashed | RHEL 8.10 / x86_64 | ran 7 tests. 3 tests failed: sanity-lnet, sanity, lnet-selftest. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | RHEL 8.10 / x86_64, SLES 15.7 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | RHEL 8.10 / x86_64, RHEL 9.8 / x86_64 | ran 7 tests. 3 tests failed: sanity-lnet, sanity, lnet-selftest. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | RHEL 8.10 / x86_64, RHEL 10.1 / x86_64 | ran 9 tests. 3 tests failed: sanity-lnet, sanity, lnet-selftest. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-arm crashed | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 8 tests. 4 tests failed: sanity-sec, sanity-lnet, sanity, lnet-selftest. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-ubuntu crashed | RHEL 8.10 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-zfs crashed | RHEL 8.10 / x86_64 | ran 14 tests. 6 tests failed: sanity-lsnapshot, insanity, replay-ost-single, replay-single, sanity-flr, sanit | session |
The body explains the data-structure swap but not the reference-counting changes that come with it. class_export_put() is added in class_unlink_export() and tgt_client_free(), and removed in tgt_reply_data_init() and update_recovery_update_ses(). Those are behavior changes, not a mechanical hash->xarray conversion, and it would help to say what the intended ownership rule for obd_gen_ids is. The old gen_kepcmp() also filtered on !exp->exp_failed, so lookups could never return a failed export; xa_load() has no such filter. That change deserves a line in the message too.
(style) Signed-off-by: normally comes before Change-Id:; the reversed order usually means the Lustre commit hook is not installed locally.
(style) The comment above still calls this a hash body. While renaming the field, `obd_gen_ids` reads as if it stores ids rather than exports keyed by generation - something like obd_gen_exports would say what it holds.
(defect) Two problems with this put. First, ted_lcd is non-NULL for every target export (tgt_client_alloc() allocates it for all non-self exports), while an obd_gen_ids entry only exists for exports inserted by tgt_clients_data_init() when tgt_is_multimodrpcs_record() is true. So a regular client that connected after mount was never in the xarray, yet still gets a put here. The old code was guarded by hlist_unhashed(&exp->exp_gen_hash), which was exactly the "is it in the table" test; xa_erase()'s return value can serve the same purpose. Second, nothing takes a matching reference on insert any more, so even for exports that are in the xarray this put has no counterpart. Worth noting too: this runs with obd_dev_lock held, and if it ever is the final reference, class_export_put() -> obd_zombie_export_add() takes obd_dev_lock again.
(minor) xa_destroy() on the next line already erases every entry and frees the nodes, so this loop looks like a no-op. If the intent was to release the export references held by the xarray, the loop needs a class_export_put() on each entry (and a reference has to be taken on insert first). Reusing `flag`, the char * used above for parsing the lcfg flag string, as the xa_for_each() entry variable is also confusing to read.
(defect) This drops a reference the xarray never took, and it does so from a context where the refcount is already zero.
The main caller chain is class_export_put() -> obd_zombie_exp_cull() -> class_export_destroy() -> obd_destroy_export() -> mdt_destroy_export()/ofd_destroy_export() -> tgt_client_free(). class_export_destroy() opens with
LASSERT(refcount_read(&exp->exp_handle.h_ref) == 0);
so the class_export_put() here hits its own LASSERT(refcount_read(...) > 0) and LBUGs. That is on the teardown path of every regular server export, not just the ones recovered from last_rcvd.
mdt_init_export()'s err_free: path also calls tgt_client_free() directly, where the export is still live, so there it silently loses a reference instead.
The old code only removed the export when it was actually hashed (hlist_unhashed()); the xarray entry only exists for exports added by tgt_clients_data_init() with a non-zero lcd_generation, so an unconditional put cannot be right either way. xa_erase() returning the old entry could be used to tell the two cases apart.
(defect) The old cfs_hash_add_unique() took a reference on the export through gen_hash_ops.hs_get()->class_export_get(). ll_xa_insert() does not, so after the class_export_put() two lines below the xarray holds a bare pointer with no reference at all. Every surviving class_export_put() that was paired with that reference is now unbalanced - see class_unlink_export(), tgt_client_free(), the error path below at tgt_set_reply_slot(), and distribute_txn_replay_handle(). Should this be class_export_get(exp) before the insert?
(minor) GFP_KERNEL here; Lustre server allocations in this path normally use GFP_NOFS (OBD_ALLOC_PTR() a few lines up does). This runs during target mount while reading last_rcvd, so reclaim recursing back into the same device seems worth avoiding.
(defect) The success-path class_export_put() below was removed with the switch to xa_load(), but this one on the tgt_set_reply_slot() error path was left behind. xa_load() returns no reference, so this drops one that belongs to someone else.
(defect) cfs_hash_lookup() returned a referenced export, and that reference was handed to tsi->tsi_exp and released later by distribute_txn_replay_handle():
if (tgt_ses_info(env)->tsi_exp != NULL) {
class_export_put(tgt_ses_info(env)->tsi_exp);
xa_load() returns an unreferenced pointer, so that put now drops a reference this path never acquired, and tsi_exp can be freed under the replay while it is still in use.
Separately, gen_kepcmp() used to reject exports with exp_failed set, so an evicted export could never end up in tsi_exp. xa_load() has no such filter - is update replay expected to cope with a failed export here?
LU-8130 obd: replace gen hash with Xarray Using a hash table for sequential values doesn't make sense in this case. Instead track the recovery generation values for exports using a Xarray. Change-Id: Iccff86b7473c61a25caf336b30342ce2dc12e148 Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
(typo) "utilies" -> "utilities" in the subject, and "utilites" -> "utilities" on the body line below.
(minor) The body only covers the lsvcgssd/l_getauth split, but the diff also appends $(UTILS_CFLAGS) to AM_CFLAGS. Is that intended to ride along here, or should it be a separate change? Either way it should be mentioned so the hunk isn't a surprise.
(minor) This hunk isn't part of the client/server split. If the intent is to pick up the distro build flags the way lustre/utils/Makefile.am does, note that file also sets
AM_LDFLAGS := $(UTILS_LDFLAGS)
and UTILS_LDFLAGS is exported alongside UTILS_CFLAGS in lustre.spec.in. Here the link flags are still unset, and each program overrides them with its own lsvcgssd_LDFLAGS/l_getauth_LDFLAGS/lgss_keyring_LDFLAGS/lgss_sk_LDFLAGS = $(KRBLDFLAGS), so an AM_LDFLAGS alone wouldn't take effect either - $(UTILS_LDFLAGS) would have to be added to each of those lines. Should the hardening flags be applied consistently, in a patch of their own?
(suggestion) While completing the client/server split: lustre/scripts/systemd/Makefile.am still installs lsvcgss.service unconditionally under HAVE_SYSTEMD, and the spec adds it to lustre.files the same way, even though lsvcgss_sysd and the init script are already SERVER-only. So a client package keeps shipping a unit for a daemon it no longer builds. Worth wrapping in SERVER here too?
With these two now server-only, a client-only install has no l_getauth and no lsvcgssd, but test-framework.sh still resolves both on the local (client) node and has no /usr/sbin fallback:
export L_GETAUTH=${L_GETAUTH:-"$LUSTRE/utils/gss/l_getauth"}
[ ! -f "$L_GETAUTH" ] && export L_GETAUTH=$(which l_getauth 2> /dev/null)
export LSVCGSSD=${LSVCGSSD:-"$LUSTRE/utils/gss/lsvcgssd"}
[ ! -f "$LSVCGSSD" ] && export LSVCGSSD=$(which lsvcgssd 2> /dev/null)
When the test node runs a client build both expand to the empty string, and the values are then used on the server nodes:
do_nodes $nodes "$LSVCGSSD -vvv -s -m -o -z $options" || return 1
do_nodesv $node "$L_GETAUTH -d"
do_nodesv $servers "$LCTL set_param sptlrpc.gss.rsi_upcall=$L_GETAUTH"
start_gss_daemons() then runs "-vvv -s -m -o -z" remotely and returns 1, and init_gss() does start_gss_daemons() || error_exit, so setup aborts for any SHARED_KEY/krb5 run on a mixed client/server install. Should this patch also give L_GETAUTH/LSVCGSSD a "/usr/sbin/..." fallback (the way LR_READER and LSOM_SYNC do a few lines above), or resolve them on a server facet instead?
LU-14291 utils: don't build gss server utilies for clients Both lsvcgssd and l_getauth are server only utilites. Test-Parameters: trivial env=SHARED_KEY=true testlist=sanity,sanity-sec Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: Iba4830ea74cad3b6c615663bd7ebe135cf39515f
| unique failing test | history |
|---|---|
| sanity-slow@zfs:test_64b | seen in 3 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-2 | RHEL 10.1 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
| review-dne-zfs-part-4 crashed | RHEL 9.7 / x86_64 | ran 9 tests. 1 tests failed: sanity-quota. %% THIS TEST SESSION CRASHED %% | session |
Should this get a `Fixes:` label?
I think this is basically a change to the fixture of Lustre since the beginning of time so there's nothing to declare here?
(minor) The double-iput fix described here lands in revalidate_statahead_dentry(), not ll_statahead_interpret(). The latter only igrab()s the inode into se_inode; it is revalidate_statahead_dentry() that calls ll_splice_alias() and now clears se_inode before the IS_ERR() check. Worth correcting the name so the change stays findable via git log later.
(minor) Not a bug, but is "both of them consequences of the OBF namespace" complete? d_lustre_invalidate() only sets a flag (llite_internal.h), so a directory renamed on another client keeps its old-parent dentry hashed and on the inode alias list. A later lookup of the new path then gets that alias from __d_find_any_alias(), with a different d_parent and no .lustre/fid anywhere in the picture, so it takes the same cross-parent __d_unalias() trylock path and the same -ESTALE. That is ordinary d_splice_alias() semantics and not a reason to change the patch, but as written the paragraph reads as if the by_fid test bounds the new -ESTALE exposure, and it doesn't.
well.... [ 368.091239] Lustre: lustre-MDT0000-mdc-ffff89a08865b000: Force grant RPC slot (1 current) to proc with flag: 208840. [ 368.091527] Lustre: Skipped 3 previous similar messages [ 370.228394] Lustre: lustre-MDT0000-mdc-ffff89a041f49000: Force grant RPC slot (1 current) to proc with flag: 208840. [ 374.536843] Lustre: lustre-MDT0000-mdc-ffff89a041f49000: Force grant RPC slot (1 current) to proc with flag: 208840. [ 374.536967] Lustre: Skipped 2 previous similar messages [ 382.893306] Lustre: lustre-MDT0000-mdc-ffff89a041f49000: Force grant RPC slot (8 current) to proc with flag: 208840. [ 382.893500] Lustre: Skipped 51 previous similar messages [ 399.281310] Lustre: lustre-MDT0000-mdc-ffff89a08865b000: Force grant RPC slot (4 current) to proc with flag: 208840. [ 399.282289] Lustre: Skipped 140 previous similar messages [ 402.163522] obd_memory max: 4662112620, obd_memory current: 4661744265 [ 402.163950] kthreadd invoked oom-killer: gfp_mask=0x400dc0(GFP_KERNEL_ACCOUNT|__GFP_ZERO), order=2, oom_score_adj=0 [ 402.164047] CPU: 0 PID: 2 Comm: kthreadd Tainted: G O ------- --- 5.14.0 #26 [ 402.164115] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.17.0-9.fc43 06/10/2025 [ 402.164175] Call Trace: [ 402.165043] <TASK> [ 402.166569] dump_stack_lvl+0x57/0x7d [ 402.167511] dump_header+0x4f/0x486 [ 402.167545] ? ___ratelimit+0x83/0x100 [ 402.167578] oom_kill_process.cold+0x54/0x79 [ 402.167614] ? lock_release+0x1c7/0x2e0 [ 402.167648] ? _raw_spin_unlock+0x1a/0x30 [ 402.167679] out_of_memory+0xc8/0x510 [ 402.167712] __alloc_pages_slowpath.constprop.0+0x6d3/0xcb0 [ 402.167751] __alloc_pages+0x2ba/0x2d0 [ 402.167781] copy_process+0x1fd/0x24b0 [ 402.167813] ? update_load_avg+0x60/0x260 [ 402.167845] ? lock_acquire+0x15c/0x2f0 [ 402.167875] ? __update_load_avg_se+0x153/0x380 [ 402.167913] ? trace_pelt_se_tp+0x29/0xc0 [ 402.167945] ? lock_release+0x1c7/0x2e0 [ 402.167976] kernel_clone+0x86/0x340 [ 402.168005] ? do_raw_spin_unlock+0x46/0x90 [ 402.168051] ? finish_task_switch.isra.0+0xef/0x330 [ 402.168088] kernel_thread+0x4a/0x50 [ 402.168118] ? kthread_park+0x80/0x80 [ 402.168151] kthreadd+0xc5/0x110 [ 402.168185] ? kthread_is_per_cpu+0x20/0x20 [ 402.168220] ret_from_fork+0x1f/0x30 [ 402.168290] </TASK> [ 402.168321] Mem-Info: [ 402.168347] active_anon:255934 inactive_anon:234092 isolated_anon:0 [ 402.168347] active_file:236 inactive_file:1651 isolated_file:214 [ 402.168347] unevictable:0 dirty:0 writeback:192 [ 402.168347] slab_reclaimable:9149 slab_unreclaimable:1153520 [ 402.168347] mapped:875 shmem:467586 pagetables:2320 [ 402.168347] sec_pagetables:0 bounce:0 [ 402.168347] kernel_misc_reclaimable:0 [ 402.168347] free:30537 free_pcp:910 free_cma:0
so, the OOM is real, it was traced to a longer retention of RPCs in replay list, mostly related to directory-churn workloads it seems. It is also affected by Alex's case of not carrying the previous patch in the series (67391) so with 2000 stripes seen the normally relatively small RPCs blow up to 256k greatly exacerbating the memory consumption. the problem is open requests are leaked because somehow atomic open machinery returns IT_OPEN_OPEN that sets rq_replay that is never cleared.
after some more thinking, this looks wrong. For regular files we absolutely want to reuse these stale dentries, all this means is we lost the lookup bit some time ago, so what? I guess for DIRECTORIES we don't and if it's an open by fid we can have a directory here, so we should also check if we found a directory before we throw it away. Or should we only throw away for the by_fid regardless of mode? Aliases for regular files don't really much do they so probably not? Though in instrumentation this is NOT a big signal compared to the leak (200 hits here for 8000 rq_replay requests stuck)
(defect) For regular files this throws away a still-usable alias instead of reusing it. Before this patch ll_find_alias()'s invalid alias was always d_move()'d and reused; a d_lustre_invalid() dentry just means the LOOKUP lock was dropped, which is the common case. Now every non-directory lookup that finds such an alias discards it (d_invalidate() + dput()) and re-adds a fresh dentry via d_add(). An open note on an earlier patchset raised the same doubt and is still unresolved. Should the discard be gated on the by_fid / directory case only, leaving regular-file aliases to be reused as before?
(style) This isn't a bug, but %pd prints the raw name and bypasses the filename obfuscation that obd_enable_fname_encoding controls. The rest of namei.c uses DNAME with encode_fn_dentry(), e.g.
"cannot splice inode %p as "DNAME": rc = %d\n", inode, encode_fn_dentry(de), ...
(nit) de cannot be NULL here - the argument is never NULL and the else branch only reassigns it when d_splice_alias() returned non-NULL - so IS_ERR_OR_NULL() is just IS_ERR(). It also reads oddly next to the plain !IS_ERR(de) guard a few lines below; if the patch is refreshed anyway, making both the same would help.
warn: ll_splice_alias():'de' can also be NULL
(minor) This comment now says the opposite of what the code requires: d_splice_alias() opens with BUG_ON(!d_unhashed(de)), and the commit message spends a paragraph establishing that no caller ever hands over a hashed dentry. Worth rewording while it is being touched (and it carries two typos, "Atoimc" and "passin").
LU-9868 llite: use d_splice_alias for directories.
In the Linux dcache a directory only ever has one dentry,
so d_splice_alias() can be used by ll_splice_alias() for directories.
It will find the one dentry whether it is DCACHE_DISCONNECTED or
IS_ROOT() or d_lustre_invalid().
Separating out the directories from non-directories will allow us
to simplify the non-directory code.
A negative lookup (@inode NULL) takes the new branch as well, where it
used to reach d_add(de, NULL): d_splice_alias(NULL, de) does the same
__d_add(), with the BUG_ON(!d_unhashed(de)) it opens with. No caller
passes a hashed dentry -- ll_atomic_open() either hands over a
d_in_lookup() dentry or d_drop()s it first.
Unlike the old ll_splice_alias() d_add() path, d_splice_alias() consumes
the passed inode reference in every case (including on its error returns
-ELOOP/-ESTALE) and can now return an error. Adjust the callers to the
new contract:
- revalidate_statahead_dentry() transferred the sa_entry inode
reference to the dentry (se_inode = NULL) only on the success path,
so on the d_splice_alias() error path the reference it already
dropped was iput() a second time when the sa_entry was freed,
underflowing i_count (WARNING at fs/inode.c ihold, hit under an rm
workload with statahead active). Transfer ownership away from the
sa_entry before inspecting the result.
- A by-FID (.lustre/fid/) directory lookup must not d_move the
directory's real (connected) dentry onto the fid path.
d_splice_alias() does exactly that for an ordinary directory:
__d_find_any_alias() returns its connected dentry, which is neither
an ancestor of the new .lustre/fid/<FID> dentry nor IS_ROOT(), so
__d_unalias() moves it there and the normal path to the directory
stops working. ($MOUNT itself and .lustre are ancestors, so they come
back -ELOOP instead -- equally fatal to sanity 233a/233b.) Keep the
legacy alias handling for OBF-parented directory lookups; use
d_splice_alias() only for normal-namespace lookups, where it keeps a
directory to a single dentry (LU-17536).
The test is on the immediate parent's FID, so it recognises the
entries directly under .lustre/fid/ and nothing else about the by-FID
namespace. Two cases are therefore left as d_splice_alias() handles
them, both of them consequences of the OBF namespace giving a
directory a second dentry in the first place:
* .lustre/fid/<dir-FID>/<name>: the parent is the duplicate dentry
this branch made for <dir-FID>, so the child takes the
d_splice_alias() path and __d_unalias() moves its real dentry into
the by-FID tree.
* $MOUNT/<path>/<dir> for a directory that already has a by-FID
dentry: __d_find_any_alias() hands that dentry back, and
__d_unalias() moves it into the normal namespace -- the useful
direction, but a direction the old d_add() never took.
In both, __d_unalias() takes its cross-parent path and can return
-ESTALE: it mutex_trylock()s s_vfs_rename_mutex, which any rename on
the filesystem holds, and inode_trylock_shared()es the alias's
parent, which any create, unlink, mkdir, rmdir or setattr in that
directory holds exclusively. The VFS retries once with LOOKUP_REVAL,
but a lookup that could not fail before now can, and under a
directory-churn workload it will meet those holders.
Covering these means recognising the whole by-FID subtree -- marking
the dentries this branch creates -- which is new dentry state and is
left for its own patch.
The legacy branch is otherwise left exactly as it was: an alias that
ll_find_alias() returns is still d_move()d onto the new dentry and
reused, whether it is d_lustre_invalid() or not. d_lustre_invalid()
only means the LOOKUP lock was dropped at some point, which is the
common case, and reusing the dentry is the whole point of
ll_find_alias(); discarding it instead would replace the dentry that
open files and mounts are attached to on every lookup that races a
lock cancellation. It would also be a behaviour change for regular
files, which this patch is not about.
Linux-commit: e9d4f0b9f55920821845b8e063ed593422c18d8a
Linux-commit: 1d6e65bedf5878c8dd5b089d3f034b619bbb8a77
Test-Parameters: optional testlist=racer
Signed-off-by: NeilBrown <neil@brown.name>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools
Change-Id: If80a02b77c4fc62cdb90e86cdb8a0f9eba21193b
Several hunks aren't accounted for by the description, and it isn't obvious which are deliberate: - lnet/utils/lnetconfig/liblnetconfig_netlink.c empty-flow-set handling - lov_obd.c switching class_register_type() from enable_proc=true to false - llapi_param_display_value() changing its success return from 0 to the raw yaml rc - llapi_get_poolbuf() gaining `poolname++` - lu_tgt_pool.op_array changing from __u32 to u32 - lod_pool.c setting op_obd_idx (LOD has no .o_pool_find, so nothing reads it yet) Could the message name the new symbols too - LUSTRE_CMD_POOLS, o_pool_find()/lov_pool_list(), lustre_pools_dump() - so the change is findable via git log?
(typo) The kernel-doc name doesn't match the enum: `lustre_pool_props_attrs` here vs `lustre_pool_prop_attrs` below, and there is no " - description" after the name. kernel-doc warns:
lustre_kernelcomm.h:248: expecting prototype for enum lustre_pool_props_attrs. Prototype was for enum lustre_pool_prop_attrs instead
The same slip already exists for lustre_target_prop_attrs, so it looks copied from there - as is the LUSTRE_POOL_ATTR_SOURCE description "obd device targets belong too", which describes targets rather than pools.
(style) This isn't a bug, but `s` is read from `file->private_data` before seq_open() has set it and then reassigned two lines later - the initializer can just be dropped.
(typo) The reference is now held for the debugfs entry rather than a /proc file.
(minor) The kernel-doc headers were not renamed along with the functions. contrib/scripts/kernel-doc reports four warnings on this file now:
lov_pool.c:154: expecting prototype for pool_proc_next(). Prototype was for pool_seq_next() instead
lov_pool.c:192: expecting prototype for pool_proc_start(). Prototype was for pool_seq_start() instead
lov_pool.c:243: expecting prototype for pool_proc_stop(). Prototype was for pool_seq_stop() instead
lov_pool.c:270: expecting prototype for pool_proc_show(). Prototype was for pool_seq_show() instead
The /proc wording in those blocks ("/proc sequence file iteration tracking structure", "Start seq_file iteration via /proc", "inode to store iteration state for /proc") is also stale now that these back a debugfs file.
(style) This isn't a bug, but the commented-out call here and the matching one in lustre_pools_end_cb() read as work-in-progress. Lustre C files also avoid // comments. Can they come out before this lands?
(defect) With pools now living only under obd_debugfs_entry, the old world-readable /proc/fs/lustre/lov/<dev>/pools/<pool> is gone and the only copy is under /sys/kernel/debug, which is mode 0700. llapi_get_poollist() and llapi_get_poolmembers() grew a Netlink fallback for that, but llapi_search_ost() did not - it still does poolpath() -> fopen(), and poolpath() -> get_lustre_param_path() -> cfs_get_param_paths() globs /sys/kernel/debug/lustre/lov/<fs>-*/pools, which a normal user cannot traverse (GLOB_NOMATCH -> -ENOENT). That propagates to llapi_stripe_param_verify(), which turns it into "pool '%s fsname %s' does not exist" and -EINVAL, so `lfs setstripe -p <pool>` fails for an unprivileged user. `lfs df --pool` and llapi_layout_sanity() -> llapi_search_ost() hit the same path. This change is the top of the relation chain, so nothing later picks it up. Should llapi_search_ost() get the same Netlink fallback in this patch?
(defect) On the -EMSGSIZE path `hdr` is neither ended nor cancelled, so genlmsg_end() never runs and `nlh->nlmsg_len` still covers only the fixed header. The LUSTRE_PARAM_ATTR_HDR/SOURCE attributes already appended to the skb therefore sit past `nlmsg_len`, and userspace reads those bytes as the start of the next nlmsghdr.
warn: lustre_obd_genl_many_dump():inconsistent returns '&(ctx->ogc_xas.xa)->xa_lock'.
(minor) The `! ` prefix is skipped but nothing ever negates the match - lov_pool_list() just does `glob_match(poolname, pool->pool_name)`, so `! foo` selects the same pools as `foo`. No other parameter path in the tree uses a `! ` prefix either. Is the exclusion meant to be implemented, or can this come out?
(defect) `all` is fixed at three slots, but `start` ends up declaring one NLA_NESTED attribute per pool, and lnet_genl_parse_list() consumes one sub-list from `data[]` for each NLA_NESTED key it emits:
rc = lnet_genl_parse_list(msg, data, ++idx);
idx = rc;
With two pools the second nested key looks at `data[2]`, which is NULL, so parse_list() returns 0 without emitting anything and resets `idx` to 0; the third nested key then re-uses `data[1]`. lustre_stats_dump() allocates `ls_num + 2` and fills `all[1..ls_num]` for exactly this reason.
Should this be `pool_count + 2` with `all[1..pool_count]` all pointing at `props`? lustre_pools_free_keys() hard-codes 3 in its OBD_FREE_PTR_ARRAY() as well.
(defect) `lkl_list[]` is a flexible array member, so it is not counted by `sizeof(struct ln_key_list)` and this assignment copies only `lkl_maxattr` - the `pools` and `source` entries stay zeroed from the OBD_ALLOC. Compiling against the real header gives `sizeof(struct ln_key_list)` = 8 and `sizeof(struct ln_key_props)` = 16, and after `*start = pool_keys` both `lkl_list[1].lkp_value` and `lkl_list[2].lkp_value` are NULL. lnet_genl_parse_list() then emits those two keys with no LN_SCALAR_ATTR_VALUE and NLA_UNSPEC as the type, so the reply carries no `pools`/`source` names and llapi_param_display_value() never dispatches to print_out_pools(). This branch is taken as soon as `pool_count > 1`, so does `lfs pool_list` still work on a filesystem with two pools? Would copying `hdr_len + sizeof(struct ln_key_props) * (LUSTRE_POOL_ATTR_MAX + 1)` bytes from `pool_keys` work here instead of the struct assignment?
LU-11850 lov: create Netlink interface for pools With the need to move pools handling to debugfs this prevents non-root user land applications and libraries from accessing this information. Create a Netlink interface that provides the same needed information. Update liblustreapi to use the Netlink YAML approach to gather pools information. Pool source defines itself by the obd device source and pool name so its not the typical single collection of data to obd device. This makes pools require its own dump function. Test-Parameters: trivial Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: I769567270e45f2de074fad2fab78a2f0c3a741b4
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 9.5 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity-selinux. | session |
LU-18689 ptlrpc: ensure import exist for sec debugfs files Access sec imports safely under with_imp_locked. This fixes crashes in recovery-small test 57 that look like this: BUG: unable to handle kernel NULL pointer dereference at 00000000000000d0 IP: [<ffffffff81411a45>] do_raw_read_lock+0x5/0x30 RIP: 0010:[<ffffffff81411a45>] [<ffffffff81411a45>] do_raw_read_lock+0x5/0x30 Call Trace: [<ffffffff817e333e>] _raw_read_lock+0x1e/0x20 [<ffffffffa0666f0e>] sptlrpc_import_sec_ref+0x1e/0x40 [ptlrpc] [<ffffffffa06742f0>] srpc_sptlrpc_sepol_seq_show+0x30/0x130 [ptlrpc] [<ffffffff8126f0b5>] seq_read+0x135/0x470 [<ffffffff81245839>] vfs_read+0xb9/0x1c0 [<ffffffff817edf49>] ? system_call_after_swapgs+0x96/0x13a [<ffffffff8124676f>] SyS_read+0x7f/0xf0 [<ffffffff817edf55>] ? system_call_after_swapgs+0xa2/0x13a [<ffffffff817ee00c>] system_call_fastpath+0x1f/0x24 [<ffffffff817edf55>] ? system_call_after_swapgs+0xa2/0x13a Signed-off-by: Oleg Drokin <green@whamcloud.com> Change-Id: Id84c8803317b621cb80a21977eafe5b9cf96a9be
(style) LU-20587 is filed as "lnetctl peer show -v 2 causes kernel oops", but the body only describes a capacity limit. Could it say that this is fixing a crash, and describe how running out of skb space in lnet_peer_ni_show_dump() leads to the oops? That makes it much easier to decide whether the change needs backporting.
(defect) This fixes a kernel oops, so it should carry a Fixes: tag. lnet_peer_ni_show_dump() and its single-skb dump came in with:
Fixes: f0be00678cc8 ("LU-9680 lnet: collect data about peer_ni by using Netlink")
(typo) "for it struct sk_buf" - the type is `struct sk_buff`, and "it" should be "its". Same misspelling on the line below.
(style) Not a bug, but 2580 has no derivation in the source, so it silently goes stale the next time an attribute is added to lnet_peer_ni_keys/lnet_peer_ni_list. Same for the literals below: 64 is LNET_NIDSTR_SIZE and the 128 in the version 4 comment is LNET_MAX_SHOW_NUM_NID - using the macros would at least keep them tied to what they measure.
Carrying forward the unbounded-allocation point from patchset 1, which does not look addressed yet: nothing caps cb->min_dump_alloc, and there is no error when the computed size is unreasonable. The sibling handlers in this file and in obdclass do bound it, e.g. lnet_route_show_start():
len += ROUTER_MSG_VALUES_SIZE * rlist->lgrl_count;
if (len > BIT(sizeof(cb->min_dump_alloc) << 3)) {
NL_SET_ERR_MSG(extack, "Netlink msg is too large");
rc = -EMSGSIZE;
} else {
cb->min_dump_alloc = len;
}
Peers are unbounded (unlike NIs, which are capped by lnet_interfaces_max), so the same guard - or a cap on how many peers one dump covers - seems needed here too.
(typo) LNET_GENL_VERION -> LNET_GENL_VERSION.
(defect) Nothing caps cb->min_dump_alloc and there is no error when the computed total is unreasonable. This was raised on patchset 1 ("allocating an 4G in kernel - very very bad style") and the reply agreed peers still need overflow handling since, unlike NIs, they are not bounded by lnet_interfaces_max - but patchset 4 still accumulates straight into the field.
The sibling handler in this file bounds it, in lnet_route_show_start():
len += ROUTER_MSG_VALUES_SIZE * rlist->lgrl_count;
if (len > BIT(sizeof(cb->min_dump_alloc) << 3)) {
NL_SET_ERR_MSG(extack, "Netlink msg is too large");
rc = -EMSGSIZE;
} else {
cb->min_dump_alloc = len;
}
and lustre/obdclass/kernelcomm.c does the same. Two reasons that guard matters here:
min_dump_alloc is u16 in netlink_callback before v5.7, so on the older supported kernels the += silently wraps modulo 65536 - and can wrap to less than PEER_KEY_TABLE_MSG_SIZE.
On newer kernels the skb head is still one contiguous kmalloc, not a kvmalloc: netlink_dump() calls alloc_skb(alloc_min_size, GFP_KERNEL), and __alloc_skb() -> kmalloc_reserve() ends in kmalloc_node_track_caller(). So above KMALLOC_MAX_SIZE the dump can only fail with -ENOBUFS, and below it every dump invocation is asking for a high-order allocation.
(defect) Skipping the peer NI walk for version 0 undercounts, because the dump still emits per peer NI at version 0. In lnet_peer_ni_show_dump() the `if (gnlh->version)` guard only covers the credits/stats block; the nest, LNET_PEER_NI_LIST_ATTR_NID and LNET_PEER_NI_LIST_ATTR_STATE are written for every version:
nid_list = nla_nest_start(msg, LNET_PEER_NI_ATTR_PEER_NI_LIST);
while ((lpni = lnet_get_next_peer_ni_locked(lp, NULL, lpni)) != NULL) {
struct nlattr *peer_nid = nla_nest_start(msg, count++);
nla_put_string(msg, LNET_PEER_NI_LIST_ATTR_NID, ...);
That is 4 + nla_total_size(strlen(nid) + 1) + nla_total_size(5) per peer NI, plus 4 for the nid_list nest, none of which appears in PEER_VERSION_0_VALUES_MSG_SIZE.
For a peer with a 17-character NID: 20 (genl header) + 24 (primary nid) + 4 (multirail) + 4 (nest) + 40 per peer NI. One NI is 92 and fits in 136; three NIs is 172 and does not. Longer NIDs push the single-NI case over as well.
Version 0 is not a corner case - `lnetctl peer show` with no -v passes detail = 0 as the genl version (lnetctl.c jt_show_peer()), and `lnetctl peer list` passes 0 literally, so this is the common invocation.
Related: the per-peer-NI NID string is not charged in any of the PEER_VERSION_* terms. For version >= 1 the slack in PEER_VERSION_1_VALUES_MSG_SIZE happens to absorb it, but nothing in the table accounts for it, so it goes wrong again the next time one of these constants is tightened. LNET_PEER_NI_ATTR_HDR is documented as 48 bytes here but is nla_put_string(msg, ..., ""), i.e. 8 bytes, and only for the first peer - that leftover is what makes the version 0 number look adequate.
(minor) This builds the whole UDSP info for every peer NI - lnet_udsp_get_construct_info() does a peer table hash lookup and fills a ~2KB struct - and the only thing read back is `cud_pref_rtr_nid[0] != 0`. That is just `!list_empty(&lpni->lpni_rtr_pref_nids)`, which needs no buffer and no lookup. Related to the same allocation: it is done unconditionally at the top, so version 0 and versions 1-3 pay for a buffer they never touch, and LIBCFS_ALLOC_ATOMIC uses GFP_ATOMIC even though this is ->start() in process context - the genradix_ptr_alloc() calls a few lines above use GFP_KERNEL. Worth noting the cost overall: this loop repeats the peer and peer NI traversal that lnet_peer_ni_show_dump() then does again, under ln_api_mutex, so `lnetctl peer show -v 4` now walks every peer twice.
(defect) None of the nla_nest_start() results in this handler are checked, and nla_nest_end() writes through the pointer without a NULL test:
static inline int nla_nest_end(struct sk_buff *skb, struct nlattr *start)
{
unsigned long diff = skb_tail_pointer(skb) - (unsigned char *)start;
start->nla_len = diff;
So once the skb runs out of room, nla_nest_start() returns NULL and the matching nla_nest_end() at the bottom of the loop faults. The nests opened for the -v 2 stats (send/recv/drop/health) are the ones LU-20587 names in its title.
Enlarging the skb makes this less likely, but any residual under-estimate still lands here. Should the dump bail out with -EMSGSIZE when a nest cannot be opened, so a short estimate degrades into a truncated dump instead of an oops?
LU-20587 lnet: expand Netlink support for more peers Currently the LNet Netlink peer interface uses the default size of 64K for it struct sk_buf. This limits the number of peers that can be reported with the Netlink layer. We can manually calculate the cb->min_dump_alloc to allocate the struct sk_buf of the needed size. Test-Parameters: trivial Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: I900ae18d6098df0df699df6a64d1d462702c2b4a
| unique failing test | history |
|---|---|
| sanityn@zfs+DNE:test_102 | seen in 1 other review |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-2 | RHEL 9.7 / x86_64 | ran 11 tests. 1 tests failed: sanity-lnet. | session |
| review-dne-zfs-part-7 failed 2× | RHEL 9.7 / x86_64 | ran 6 tests. 1 tests failed: sanity-ec. | session |
(defect) This fixes a crash, so it should carry a Fixes: tag. The unchecked nla_nest_start()/nla_put_*() calls in lnet_peer_ni_show_dump() arrived with the original Netlink conversion:
Fixes: f0be00678cc8 ("LU-9680 lnet: collect data about peer_ni by using Netlink")
(style) This isn't a bug, but Change-Id: normally sits after Signed-off-by:. Having it first usually means the Lustre commit hooks aren't installed.
(defect) lnet_udsp_info_send() is left on the unchecked path. It ignores nla_nest_start() returning NULL and then runs
nla_nest_end(msg, udsp_attr);
nla_nest_end(msg, udsp_info);
at the end of the function, which writes through the NULL start pointer. It also returns 0 on a full skb, so rc here cannot distinguish that from success.
`lnetctl peer show -v 4` sets gnlh->version to 4 and reaches this, so the oops named in the subject still looks reachable from lnet_peer_ni_show_dump().
(minor) The -ENOMEM branch here still leaves a half-built message in the skb. By this point genlmsg_put() has run and PRIMARY_NID / the nest headers / the peer NI string have been appended, so skb->tail is past the nlmsg_len that genlmsg_put() wrote. Going straight to unlock_api_mutex without genlmsg_cancel() leaves that short header followed by orphan attribute bytes; netlink then appends NLMSG_DONE after them, and a NLMSG_NEXT walk from the short header lands in the middle of the leftovers. The new EMSGSIZE branch above cancels, so it would be consistent for this one to cancel too before returning.
(defect) lgpl_hdr_sent is set as soon as the attribute is appended, but the message it lives in can still be rolled back.
Every `goto msg_full` below reaches `genlmsg_cancel(msg, hdr)`, which trims the skb back past LNET_PEER_NI_ATTR_HDR. The flag stays true, so when this peer is retried against the fresh skb the attribute is not emitted again - and no later entry emits it either.
The first entry is the one most exposed. lnet_peer_ni_show_start() never sets cb->min_dump_alloc (lnet_net_show_start() sets U16_MAX), so the first skb is NLMSG_GOODSIZE, and the ~65 keys in all[] have already consumed most of it before the loop starts. A version-4 peer with two or three peer NIs then overflows partway through this entry.
On the tools side that attribute is exactly what stops the header repeating - liblnetconfig_netlink.c clears keys[1].lkp_value ("peer") only via
if (attr && parent->lkp_value) {
free(parent->lkp_value);
parent->lkp_value = nla_strdup(attr);
}
so if it never arrives, `strlen(keys[1].lkp_value)` stays non-zero and "peer:" is printed once per netlink message instead of once per dump.
Would setting the flag after genlmsg_end() succeeds, or clearing it in msg_full when this iteration set it, keep it tied to what actually reached user space?
(minor) A realloc() failure is swallowed here - yaml_parse_value_list() returns void and neither data->error nor data->errmsg is set, so lnetctl prints a truncated YAML document and still exits 0. The older grow in yaml_netlink_msg_parse() returns NL_STOP for the same condition. Could this one report the failure too, so a short document isn't mistaken for the full listing?
(minor) This is the mirror of the accounting fixed a few lines above: data->buffer moves backwards here, so the free space grows and it should be `*size += data->indent + 2;`. It only fires when a snprintf() returns negative, so it isn't reachable today, but leaving one of the two sites inverted invites the next reader to copy the wrong one.
(minor) `<= 1` also passes when the header is missing altogether, which is the other way the once-per-dump attribute can go wrong. The dump promises exactly one, so `((hdrs == 1))` would catch both a lost and a repeated header.
(minor) The comment above says the check also confirms the retry path doesn't duplicate entries, but grep -q only proves each primary NID appears at least once. Comparing `grep -c "primary nid: " $out` against $num_peers would actually cover the duplicate case.
(style) Not a bug, but the peers and $out are only cleaned up when every assertion passes - any error() above leaves 300 peers (1500 with SLOW=yes) configured and the YAML file in $TMP for the next subtest. A `stack_trap "rm -f $out"` plus a stack_trap for the peer teardown registered right after the add loop would make the failure path tidy, and would let the del loop drop out of the verification loop.
LU-20587 lnet: fix NULL pointer deref in lnet_peer_ni_show_dump
lnet_peer_ni_show_dump() left several nla_nest_start()/nla_put_*()
return values unchecked, so a full reply skb caused a NULL pointer
dereference instead of being handled. Check every call and roll back/
retry on a fresh skb instead of crashing. Apply the same treatment to
lnet_udsp_info_send()/lnet_nl_put_latency(), and let the dump skip a
peer that got deleted mid-dump instead of aborting the whole listing.
On the userspace side, fix the YAML output buffer in
liblnetconfig_netlink.c, which the same verbose 'peer show' dumps can
overflow. yaml_netlink_msg_parse() only reserves a small amount of
headroom between messages, but a single message can expand into
several KiB of YAML. Add yaml_netlink_input_grow() to realloc the
buffer on demand (rebasing the buffer/read pointers and resyncing
*size to the real free space) and call it in yaml_parse_value_list()
before writing each key, sizing the request for the indent, the key
name, the scalar value and separators, so a message can never write
past data->end and corrupt the heap. Also fix the free-space
accounting after emitting a line to decrement *size by the bytes
written instead of incrementing it.
Add sanity-lnet test_630 to exercise a multi-skb peer dump.
Fixes: f0be00678cc8 ("LU-9680 lnet: collect data about peer_ni by using Netlink")
HPE-bug-id: LUS-13452
Signed-off-by: Andrew Perepechko <andrew.perepechko@hpe.com>
Change-Id: I24688de6f0a001943f2de6241b60bce567e29176
LU-14291 obdclass: unwind server code out of llog Currently server internals are being pulled into llog. Break out all the server code which limits the scope of the DT API. Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: Ia11f6c26289f43260c1606fb031c4b90df10f87f
| unique failing test | history |
|---|---|
| sanity-pcc@ldiskfs+DNE:test_22 | seen in 13 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 crashed | RHEL 10.1 / x86_64 | ran 3 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-5 crashed | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
| review-dne-zfs-part-3 crashed | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-3 crashed | RHEL 10.1 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. %% THIS TEST SESSION CRASHED %% | session |
cl2osc() is container_of_safe() on oo_cl, which sits at offset 0, so IS_ERR_OR_NULL(cl2osc(obj)) is the same test as IS_ERR_OR_NULL(obj). It checks the cl_object pointer that was passed in, not whether the osc_object still exists; an object that was freed while still referenced is an ordinary pointer, not NULL or an ERR_PTR. Could the message name the pointer that actually becomes NULL or an error, and where it is set that way?
ldlm/ldlm_resource.c: warn: ldlm_resource_get():inconsistent indenting
This paragraph explains the bucket-array sizing change, but not that the bucket selection function changed shape as well. ldlm_res_hop_hash() summed all four words of the res_id; ldlm_res_hop_fid_hash() hashes only the FID in name[0] and name[1]. Worth a sentence, since it changes which resources share an ldlm_ns_bucket. The new LDLM_FL_KUNIT_TESTING flag in lustre_dlm_flags.h isn't mentioned anywhere in the body either - is that meant to be part of this patch, or a separate cleanup of the bare BIT(63) uses?
ldlm/ldlm_resource.c: warn: ldlm_resource_get():inconsistent indenting
(suggestion) No Test-Parameters: line for a change of this reach - it rewrites the resource lookup path for MDC/MDT/OSC/OST/MGC/MGT namespaces and touches recovery, eviction and quota. Something like
Test-Parameters: testlist=recovery-small,replay-single,replay-dual,conf-sanity,sanity-quota
would get the paths this rewrites covered by the test run.
lr_hash and lr_rcu share storage, so call_rcu(&res->lr_rcu, ...) writes over lr_hash.next. That was safe with cfs_hash because every chain walk held the bucket lock; rhashtable readers walk the chain under rcu_read_lock() alone. ldlm_resource_putref() -> __ldlm_resource_putref_final() does rhashtable_remove_fast(), then ldlm_resource_free(res, true) -> call_rcu(), and call_rcu() sets head->next = NULL right away. RCU removal requires the removed node's next pointer to stay intact for a grace period, because a reader can already be sitting on that node when it is unlinked. A concurrent ldlm_resource_get() walking that bucket then loads NULL as the next pointer. rht_is_a_nulls() only tests bit 0, so NULL is not recognised as end-of-chain: the loop body runs with pos == NULL, rht_obj() subtracts head_offset, and rs_cmp() dereferences the result. struct lu_object_header keeps loh_hash and loh_rcu as separate fields, with a comment about exactly this requirement. Should lr_rcu be split out of the union the same way?
This isn't a bug, but BIT() is unsigned long while l_flags is __u64, so BIT(63) is out of range on a 32-bit build. Every other flag in this file spells the value out as 0x...ULL with a /* bit N */ comment and provides ldlm_is_/ldlm_set_ helpers - consider matching that:
#define LDLM_FL_KUNIT_TESTING 0x8000000000000000ULL /* bit 63 */
#define ldlm_is_kunit_testing(_l) LDLM_TEST_FLAG((_l), 1ULL << 63)
#define ldlm_set_kunit_testing(_l) LDLM_SET_FLAG((_l), 1ULL << 63)
which would also let the two ldlm_lock.c users read like the surrounding flag tests.
This gives lock_res_and_lock() a new failure return, but only 8 of the 111 call sites look at the result; the rest go straight on to unlock_res_and_lock(), which is unlock_res(lock->l_resource) on the very pointer that produced the error. As far as I can tell the error can't fire today: l_resource is only cleared by the rcu_assign_pointer(lock->l_resource, NULL) in ldlm_lock_put(), which runs after h_ref has already reached zero, so no caller that holds a lock reference can observe it, and nothing assigns an ERR_PTR to l_resource at all. So either it is unreachable, and the error plumbing added through ldlm_lock_enqueue(), ldlm_callback_handler(), osc_ldlm_glimpse_ast() and osc_extent_release() could go, or it is reachable and the other 103 callers need converting in the same patch. Which is it?
(minor) This critical section only spans the two pointer loads - res is dereferenced at the lr_type test below and handed to ldlm_resource_putref(), and ns is used by lprocfs_counter_decr(), all after rcu_read_unlock(). If l_resource really needed RCU protection here the section would have to reach as far as the putref; as written it protects nothing that the lock's own resource reference doesn't already cover. The LASSERT(lock->l_resource != LP_POISON) a few lines up reads the same field bare, which suggests the plain read was fine. Could this just go back to a direct load?
ns_reclaim_start is now only ever assigned 0 in ldlm_namespace_new(); the ldlm_res_to_ns(res)->ns_reclaim_start++ that used to advance it went away with the per-bucket bookkeeping in ldlm_reclaim_lock_cb(). rcd_start is therefore always 0, the rcd_skip/rcd_cursor fast-forward below can never trigger, and every reclaim pass restarts on the same resources. nsb_reclaim_start is incremented but no longer read either. That drops the round-robin scan the ldlm_reclaim_res() comment still describes, and it is not mentioned in the commit message. Is the intent to keep the round-robin, or to remove it and the now-dead rcd_skip/rcd_cursor/rcd_start fields with it? Also worth noting the units no longer match: rcd_cursor counts resources while tbl->size is a bucket count.
(minor) This comment doesn't match the new scheme. With the rhashtable the table holds no reference of its own: an entry is removed exactly when `lr_refcount` hits zero in `__ldlm_resource_putref_final()`, and `rs_cmp()` hides zero-refcount entries from lookups. During the walk the only extra reference is the `refcount_inc_not_zero()` in `ldlm_resource_for_each()`. So the count printed below is one lower than the number of stray references, and a resource holding exactly one leaked reference no longer produces the message at all.
(style) This is a new exported API and it has no kerneldoc, unlike `ldlm_resource_get()` right below. Worth documenting the callback contract, in particular that the callback owns no reference (it must not putref), that a non-zero return stops the walk, and that a callback can be invoked more than once for the same resource - `rhashtable_walk_start()` here is the void variant, so the `-EAGAIN` a resize produces is discarded and the walk restarts from slot 0. That last property is what forced the `l_pending_chain` check in `ldlm_chain_lock_for_replay()`, and every future callback author needs to know about it.
LU-8130 ldlm: convert ldlm_resource hash to rhashtable Using an rhashtable allows lockless lookup at the cost of rcu freeing of entries. When we find an entry, we need to atomically check the reference hasn't dropped to zero. When adding an entry, we might find an existing entry which is in the process of being removed - with a zero refcount. In that case we loop around and repeat the lookup. To ensure this doesn't spin, the 'cmp' function will fail any comparison with a resource which has a zero refcount. Now that we are using resizing hash tables, we don't need to preconfig suitable sizes for each namespace. We can just use the default and let it grow as needed. We keep the pre-configured sizes for the bucket array. Previously the size of the bucket array was the difference between nsd_all_bits and nsd_bkt_bits. As we don't need nsd_all_bits any more, nsd_bkt_bits is changed to the number of bits used to choose a bucket. Walking an rhashtable requires that we manage refcounts ourself, so a new function, ldlm_resource_for_each() is added to do that. Note that with this patch we now update a per-table counter on every insert/remove, which might cause more contention between CPUs on a busy system. Hopefully rhashtable will be enhanced in the near future to support a per-CPU counter for nelems. Only use call_rcu() to free slab resources that have been removed from the rhashtable, other cases can be free immediately. This change exposes new race conditions in the osc layer so we add code to check if osc_objects still exist. Signed-off-by: NeilBrown <neil@brown.name> Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: Ie65f6c5f6e246ed6684ade05ddab8740ac8137dd
| unique failing test | history |
|---|---|
| sanity-quota@ldiskfs+DNE:test_80 | seen in 67 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-4 | RHEL 10.1 / x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
(minor) duplicate `Signed-off-by: Minh`...
(style) instead of putting this here, it would be better to `#define GENRADIX_NODE_SIZE PAGE_SIZE` in the compat code and use that instead of `LUSTRE_NL_ENTRY_SIZE_MAX`.
So the table stuff is meant to obd specific but this is really really generic. The code seems to be a mix of both behaviors of being obd specific and then super generic. I would prefer that it was only obd specific. Its not going to be easy to make dump_one() flexible for all cases. So I'm not sold on a dump function.
Same here. While its labled as obd specific its really super generic.
`ops->collect()` is called with `obd_device_lock()` held, and that is `xa_lock(&obd_devs)` -- a spinlock. So a collect callback can't sleep, and anything it allocates (the natural implementation is `genradix_ptr_alloc()`, which existing callers such as tgt_mount.c use with GFP_KERNEL) has to be GFP_ATOMIC. Nothing in the descriptor comment in lustre_kernelcomm.h says this, and the header also doesn't say that `collect` owns updating `ctx->count` and must store entries at 0..count-1 (both the cleanup loop here and `lustre_obd_nl_dump()` assume that). Since there is no in-tree implementation yet to copy from, could the contract be spelled out with the struct? Holding the spinlock across the whole device scan is also a change in character from the existing handlers -- `lustre_stats_start()` does its scan outside `obd_device_lock()`.
`cb->min_dump_alloc` is set to a fixed `ops->min_alloc` regardless of how many entries `collect()` gathered. The two existing handlers scale it: `lustre_device_list_start()` uses `class_obd_devs_count() * DEVICE_VALUE_PACKET_SIZE`, and `lustre_stats_start()` accumulates `STATS_MSG_DATASET_SIZE * rc`. With a constant, any node with more devices than the descriptor author assumed overflows the skb -- and per the comment below, that ends the dump with an error rather than continuing. Should this be `ops->min_alloc * ctx->count` plus the key-table size?
When the skb fills, this returns -EMSGSIZE and the whole dump is aborted, dropping every entry from `ctx->index` onwards. The usual pattern -- and what `lustre_device_list_dump()` does -- is to stop adding messages and return the byte count so netlink flushes the skb and re-enters the dump:
return rc < 0 ? rc : msg->len;
`ctx->index` is already carried in the context, so resumption would work; only the return value is missing. Same for the `dump_one()` failure just below, where `rc` may well be -EMSGSIZE too.
No caller exists yet, so this isn't reachable today, but it looks worth fixing before the first command is wired up.
This looks like a reasonable suggestion?
(minor) This is the same loop that is still open-coded in `lustre_stats_dump()` above. The patch adds the `nla_put` return checks to that copy and lands a second, identical copy here, so a future fix to one will miss the other -- which is the opposite of what the commit message says the change does.
Could `lustre_stats_dump()` just call this?
rc = lustre_nl_put_dataset(msg, stats, LUSTRE_STATS_ATTR_DATASET);
if (rc)
GOTO(out_cancel, rc);
This also seems reasonable
(style) dropping the `static struct genl_family lustre_family;` forward declaration left two blank lines here; one is enough.
(style) not a bug, but `stats_dataset_list` becomes a kernel-global symbol here with no subsystem prefix, which is easy to collide with. `lustre_stats_dataset_list` would match `lustre_family` and `lustre_stats_dump()` alongside it. The extern in lustre_kernelcomm.h would need the same rename.
(style) doesn't need a whole saga. Just a short comment like `copy by element, struct copy only copies fixed header` or maybe use `unsafe_memcpy()` to avoid the warning.
(minor) This repeats the xa_lock()/__xa_alloc()/atomic_inc() sequence from ldebugfs_stats_alloc() verbatim, so the two copies can drift apart. This was raised on the first revision and still applies: ldebugfs_stats_alloc() could compute its truncated source string and then call ldebugfs_stats_register(), leaving only the debugfs file creation behind and keeping one copy of the xarray insertion.
LU-19768 obdclass: table-driven netlink framework
Introduce a reusable table-driven netlink handler framework
(lustre_nl_obd_ops / lustre_nl_ctx) that factors out the common
start/dump/done pattern shared by commands that iterate OBD devices.
Each command supplies a descriptor with collect, dump_one, and
optional release callbacks.
Also fix several bugs in the existing stats dump path:
- Add missing nla_put return-value checks
- Fix an off-by-one in key-list sizing
- Fix a typo ("togther" -> "together").
TLC-bug-id: TLU-56
Signed-off-by: Timothy Day <timday@thelustrecollective.com>
Signed-off-by: Minh Diep <mdiep@thelustrecollective.com>
Change-Id: Ic3267111785fe79761f0673477149f7fca470a35
Signed-off-by: Minh Diep <mdiep@thelustrecollective.com>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne-arm | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 5 tests. 1 tests failed: sanity. | session |
(style) presumably should have a `Fixes:` line?
(style) prefer `Change-Id:` after `Signed-off-by:`
Could the message name the fixes it is relying on, and the minimum kernel version they are in? As written "newer kernels and fixes landed for better NFS support" is not verifiable, and LU-12661 is still Open with summary "sanity test_817: FAIL: failed to execute 'true' command". The exclusion 3e2c28437404 removed here was widened from 4.14 to 4.12 specifically because SLES 4.12.14 hit it, and 4fed33473ca2 recorded that the failure happens "regardless of whether the nfs export is backed by a lustre mount or not" - i.e. it is nfsd holding the file open, not something llite can fix. That makes it worth spelling out which change is expected to have altered this.
(typo) "sanity tets 817" -> "tests".
(style) carried over from the previous revision, which was rebased without changes: a `Fixes:` line still seems appropriate here since this undoes the exclusion added by
Fixes: 3e2c28437404 ("LU-12661 tests: skip sanity 817 for kernel 4.12+")
(style) also carried over from the previous revision: `Change-Id:` is still before `Signed-off-by:`.
Dropping the block entirely re-enables 817 on every kernel, not just new ones. All currently supported clients in lustre/ChangeLog are above the 4.12 threshold - RHEL 8.10 (4.18.0-553), RHEL 9.7/9.8 (5.14.0), SLES15 SP5 (5.14.21), Ubuntu 22.04 (5.15) - so the test now runs on exactly the kernels the exclusion was added for, with nothing gating it on the "newer kernels" the commit message refers to.
If the fix really is version dependent, would a bounded guard be safer, e.g.
if (( $LINUX_VERSION_CODE < $(version_code X.Y.0) )); then
always_except LU-12661 817
fi
with X.Y.0 being the first kernel where nfsd releases the file?
With the exclusion gone this line runs again, and it execs immediately after the copy with no wait. exec() returns ETXTBSY while any writer holds the inode, and nfsd drops its write reference asynchronously (filecache / NFSv4 open state), not at the point `cp` returns - which is what 4fed33473ca2 described as "nfsd is not releasing the file after write".
Even on a kernel where nfsd does eventually release it, checking once immediately after the copy looks racy. Could this either unmount $tmpdir first to force the client CLOSE, or retry, e.g.
wait_update $HOSTNAME "$DIR/nfsexp/true && echo ok" "ok" 30 ||
error "failed to execute 'true' command"
LU-12661 tests: re-enable sanity 817 With newer kernels and fixes landed for better NFS support lets re-enable sanity tets 817. Test-Parameters: trivial Test-Parameters: testlist=sanity env=ONLY=817 Change-Id: I993165efdf5a7472676c5af20e079d6fbee5a098 Signed-off-by: James Simmons <jsimmons@infradead.org>
(defect) The body only describes removing unused variables, but the osc_page.c hunk also adds a new early return when the LRU wait is interrupted. That is a behaviour change, not a variable removal, and nothing in the message accounts for it. Could the message describe the new abort path (and why it is correct) so a reader isn't surprised by it? If the intent is really just to silence the warning, the alternative would be to drop the assignment entirely and leave the retry loop as-is.
(minor) If the abort-on-signal behaviour is intentional, this is a fix for a loop that could not be interrupted, and it would help to carry a Fixes: tag pointing at the commit that added the uninterruptible retry:
Fixes: e8b421531c16 ("LU-6271 osc: further OSC cleanup after eviction")
(minor) This sha doesn't look like the origin of the bug. osc_lru_reserve() as added by e8b421531c16 had no retry loop at all - a single best-effort cmpxchg, returning 0 when it could not reserve, and no `rc` variable.
The `again:` loop over an unchecked l_wait_event_abortable() came in later:
2a34dc95bd10 ("LU-12142 clio: fix hang on urgent cached pages")
and `rc` only became set-but-unused when 776e163cf542 ("LU-17180 ptlrpc: don't block ptlrpcd too long") replaced `rc = ptlrpcd_queue_work(cli->cl_writeback_work); if (rc) return 0;` with a plain schedule_work().
Since the substance of this hunk is making the wait abortable again, 2a34dc95bd10 looks like the right target:
Fixes: 2a34dc95bd10 ("LU-12142 clio: fix hang on urgent cached pages")
Up here the `rc` is checked and the loop is aborted if the wait is interrupted.
(defect) osc_lru_reserve() returns `unsigned long`, and its value is the number of pages reserved - there is no error channel. Returning -EINTR here hands the caller (unsigned long)-4, i.e. 0xfffffffffffffffc.
osc_io_lru_reserve() stores it verbatim and discards nothing:
oio->oi_lru_reserved = osc_lru_reserve(osc_cli(osc), npages);
RETURN(0);
So the I/O keeps running with a bogus reservation, and two things follow.
osc_lru_alloc() takes the reserved-slot shortcut for every page of the I/O:
if (oio->oi_lru_reserved > 0) {
--oio->oi_lru_reserved;
goto out;
}
cl_lru_busy is incremented but cl_lru_left is never debited, so the LRU budget is bypassed for the rest of the I/O.
Then osc_io_rw_iter_fini() gives the remainder back:
if (oio->oi_lru_reserved > 0)
osc_lru_unreserve(osc_cli(osc), oio->oi_lru_reserved);
and osc_lru_unreserve() does atomic_long_add(npages, cli->cl_lru_left) - the huge unsigned value converts to a large negative long, so cl_lru_left is permanently reduced by roughly (4 + pages touched). cl_lru_left points into the mount-wide cl_cache->ccc_lru_left, so every OSC on the mount is affected, and once it goes negative the next unreserved allocation trips
LASSERT(atomic_long_read(cli->cl_lru_left) >= 0);
in osc_lru_alloc(). The trigger is a fatal signal delivered while a writer waits for LRU slots, which is exactly the case l_wait_event_abortable() exists for.
Would `return 0;` (nothing reserved) work here instead? osc_lru_alloc() then does its own per-page reservation and already handles the abort correctly with `rc = -EINTR; break;`. Alternatively, propagate the failure through osc_io_lru_reserve()'s int return so the I/O actually stops - but that needs the callers of cio_lru_reserve to honour it.
> (defect) osc_lru_reserve() returns unsigned long, and its value is the number of pages reserved - there is no error channel. Returning -EINTR here hands the caller (unsigned long)-4, i.e. 0xfffffffffffffffc. This look correct. I think even coverity will flag this. (-1 just to highlight this)
(style) Not a bug, but there's a stray `;` left after the comment:
return 0; /* reserve nothing */;
(Your thoughts?) Tim, looks like cksum_counter is already being calculated on successful read. Why not (debug)print it below along with client_cksum. Instead of deleting it completely.? This can give us number of successful read's inbetween failures where it is reset to 0.
I'm skeptical it would be useful. We could get similar info (i.e. number of successful reads vs failures) by comparing llite stats to the number of error/debug messages. Plus, static variables like this aren't thread safe. The stat may not be reliable anyway.
I think in the old days the cksum_counter was used to change the `CDEBUG(D_PAGE)` into `CDEBUG(D_ERROR)` when the number of errors exceeded some threshold? I see something similar below with `cksum_missed`. That said, I don't think there is much value to keeping this anymore, just overhead that doesn't provide any value.
LU-16518 osc: fix -Wunused-but-set-variable warnings
Remove unused variables in osc. Clang emits a warning on set
but unused variables, so remove them. For osc_lru_reserve() we don't
handle the rc returned by l_wait_event_abortable(). If we do get
an interruption abort and report we reserved nothing.
Test-Parameters: trivial
Fixes: e8b421531c16 ("LU-6271 osc: further OSC cleanup after eviction")
Signed-off-by: Timothy Day <timday@thelustrecollective.com>
Change-Id: I7cbfbb937ba5b9947bf685fbd3bbff2b6f3b461d
| unique failing test | history |
|---|---|
| conf-sanity1@ldiskfs+DNE:test_5g | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@ldiskfs+DNE:test_29 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@ldiskfs+DNE:test_30b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@zfs:test_5g | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@zfs:test_29 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@zfs:test_30b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-pcc@ldiskfs+DNE:test_20 | seen in 27 other reviews |
(typo) "so are current actions voliates this feature" -> "so our current actions violate this feature".
(defect) Is this claim accurate? The controls the test suite leans on hardest are debugfs-only and have no netlink or sysfs equivalent. fail_loc, fail_val, fail_err, debug, subsystem_debug, dump_kernel (lctl dk), daemon_file and debug_marker are all created by lnet_insert_debugfs() from lnet_table in lnet/libcfs/module.c, so they exist only under /sys/kernel/debug/lnet/. Every suite that does `$LCTL set_param fail_loc=...` or `$LCTL dk` needs those. So the suite still requires debugfs to be mounted; the patch only stops mounting it on our own.
(style) Not a bug, but cfs_try_mount_sys_kernel_debug() was the only user of <sys/vfs.h> (statfs), <linux/magic.h> (DEBUGFS_MAGIC), <sys/mount.h> (mount) and <stdbool.h> (the static bool). Worth dropping those four includes in the same patch.
(defect) conf-sanity test_5g "handle missing debugfs" still checks for this auto-mount and is not updated here:
umount /sys/kernel/debug
$LCTL get_param -n devices | grep -E -v "error" && error "lctl can't access debugfs data"
grep " debugfs " /etc/mtab || error "debugfs failed to remount"
With the mount gone nothing remounts it, so the last line fails.
Worse, the test now leaves /sys/kernel/debug unmounted for the remainder of the conf-sanity run, so later subtests reading debugfs parameters, the `lctl dk` log dump on error(), and the KMEMLEAK check at /sys/kernel/debug/kmemleak all break too. Should test_5g be removed in this patch?
(defect) The netlink alternative cited in the commit message only applies to non-root callers.
lctl get_param / list_param / set_param fall back to llapi_param_display_value() / llapi_param_set_value() only under `rc == -ENOENT && getuid() != 0` (lustre/utils/lustre_param.c:1181, 1243, 1349, 1416, 1640). Root always stays on the glob path.
mount(2) needs CAP_SYS_ADMIN, so the code being deleted only ever did anything for root — non-root already got EPERM, which was silently ignored. That means the one caller class this removal changes is exactly the one with no netlink fallback: on a node where debugfs is not mounted, root now gets ENOENT for everything under /sys/kernel/debug/{lnet,lustre} and has no other route to it.
This was raised on patchset 1 (keep trying to mount for systems that can still use it, just don't print on failure) and the code is unchanged in patchset 2. Dropping only the fprintf() would keep the working case working while satisfying the secure-boot concern.
LU-9680 utils: remove forced debugfs mounting For older platforms debugfs wasn't always mounted but lustre had a heavy dependence on it. Today Linux secure boot enforces the lack of debugfs so are current actions voliates this feature. With the implementation of Netlink we have an alternative to using debugfs so we can remove this forced mounting. We will be able to run our test suite without debugfs after this patch. Test-Parameters: trivial Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: Iaaa2b54d8352a5b9636338b0d10191428c89adaf
(comment) Fix lockdep bug by splitting function lod_obj_for_each_stripe() into lock/unlocked version
Could we change this to LU-18658 LU ticket number
Sure, I can do that when I refresh.
what if the layout is changing in another thread at the moment?
Sadly this function is called by both the qos and lod object code using two different mutex. Normally we do nested but I don't think nesting the mutexs in this case would be the right fit. Maybe we can use wait_on_bit() which would tell us when the layout_mutex is in use?
Nesting the mutexes is fine, as long as they're consistently nested in the same order. I can see if I can rework this - might require a larger refactor.
LU-20422 lod: fix lockdep bug
WARNING: possible circular locking dependency detected
...
mdt_io00_000/394 is trying to acquire lock:
ffff8881b1c26740 (<d->ltd_rw_sem){++++}-{4:4}, at: lod_initialize_objects+0x503/0xba0
but task is already holding lock:
ffff888260077538 (&lod_obj->ldo_layout_mutex){+.+.}-{4:4}, at: lod_striping_load+0x147/0x530
...
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&lod_obj->ldo_layout_mutex);
lock(<d->ltd_qos.lq_rw_sem);
lock(&lod_obj->ldo_layout_mutex);
rlock(<d->ltd_rw_sem);
*** DEADLOCK ***
...
dump_stack_lvl+0x54/0x70
print_circular_bug+0x2e8/0x300
check_noncircular+0x12e/0x150
__lock_acquire+0x1447/0x2830
? __lock_acquire+0x5d3/0x2830
? __kmalloc_noprof+0x1a1/0x640
? lock_acquire+0xd5/0x290
? lod_initialize_objects+0x503/0xba0
lock_acquire+0xd5/0x290
? lod_initialize_objects+0x503/0xba0
? lock_is_held_type+0xc7/0x120
down_read+0x42/0x160
? lod_initialize_objects+0x503/0xba0
lod_initialize_objects+0x503/0xba0
lod_parse_striping+0x8e5/0x10a0
? lod_get_ea+0x17a/0x350
lod_striping_load+0x20a/0x530
lod_declare_destroy+0xd8/0x670
? lod_declare_attr_set+0xca/0x660
? lod_declare_attr_set+0xca/0x660
mdd_declare_finish_unlink+0x62/0x160
mdd_declare_rename+0x49f/0x4f0
mdd_rename+0x98e/0x1a40
? __mutex_lock+0x283/0xd80
mdt_reint_rename+0x1fda/0x2f60
mdt_reint_rec+0xa2/0x200
mdt_reint_internal+0x605/0x880
mdt_reint+0xaf/0x110
tgt_request_handle+0x1297/0x1990
? obd_export_timed_fini+0xa2/0xb0
ptlrpc_main+0x2b7d/0x3ac0
? lockdep_hardirqs_on+0x7a/0x110
? __pfx_ptlrpc_main+0x10/0x10
kthread+0x11b/0x140
? __pfx_kthread+0x10/0x10
ret_from_fork+0x1a5/0x370
? __pfx_kthread+0x10/0x10
ret_from_fork_asm+0x1a/0x30
Change-Id: I21e38a0b6fe7cda0c0c0566178d3137c792a5fc7
Signed-off-by: Timothy Day <timday@thelustrecollective.com>
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
LU-18652 tests: no compression with zfs create / zpool setup Several of the conf-sanity test are disabled due to ZFS by default using compression. Update all the zpool and zcreate calls to turn off compression by default. With this change we can re-enable several test. Test-Parameters: trivial fstype=zfs testlist=conf-sanity Change-Id: I00751a6a3e7c925e8d89c8697fb8e8705d46c8bf Signed-off-by: James Simmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| sanity-hsm@zfs:test_52 | seen in 13 other reviews |
It would be useful to have an explanation of what the problem is, and what this patch is doing to fix it. Is it intended for landing or just running testing?
(style) space required before the open brace '{'
Please fix if patch is refreshed.
LU-14636 pcc: reproduce hang in sanity-pcc 7a Test to see if this is still a problem. Test-Parameters: trivial testlist=sanity-pcc Change-Id: I1e0ad250e0c957f5d52f65d587d6d5cadfd9b3f3 Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | RHEL 9.7 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
| review-dne-zfs-part-2 | RHEL 9.7 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
(minor) llite.*.uuid prints the UUID with a trailing newline, this returns it without one, so cat $MOUNT/.lustre/uuid runs straight into the shell prompt. Since this is a new user-visible interface, is it worth matching the sysfs form now?
(style) Extra parentheses around the argument - fid_is_uuid(&lli->lli_fid) reads better, and matches the PFID(&lli->lli_fid) a few lines up. ll_inode2fid(inode) would work too.
(style) Not a bug, but the tab alignment between type and name is back after being asked about on earlier patchsets - a single space is what new code uses:
struct md_object *mdo;
struct mdd_object *mdd_uuid;
struct lu_fid fid = LU_UUID_FID;
int rc;
(suggestion) Nothing ever reads m->mdd_dot_lustre_objs.mdd_uuid. mdd_obf and mdd_lpf are kept because they carry mo_dir_ops, but this one has no ops attached, so the mdo_locate() / new field / mdd_object_put() trio only pins the object in the lu_site cache. Would mdd_local_file_create() on its own be enough here?
(defect) .lustre/uuid only exists on an MDS that carries this patch, so against an older server llapi_open_by_fid() returns -ENOENT here and ASSERTF() -> DIE() exits the whole binary. sanity.sh test_154g, which runs llapi_fid_test, is gated only on MDS1_VERSION >= 2.6.92, so on an interop run test_154g fails and test40/test41/test42 in this binary never execute. Can this be gated on the server version - e.g. tolerate -ENOENT here, or move the check into a version-gated shell test instead?
LU-18076 llite: add $MOUNT/.lustre/uuid Add a virtual $MOUNT/.lustre/uuid file to print the UUID for that specific mountpoint. Also, conf-sanity.sh test_44 is modified to verify this patch. Signed-off-by: Emoly Liu <emoly@whamcloud.com> Change-Id: I74d22c012dbc623d35e4fdf8594d8e7c83e01b1a
| unique failing test | history |
|---|---|
| conf-sanity4@ldiskfs+DNE:test_153a | seen in 22 other reviews |
| conf-sanity4@ldiskfs+DNE:test_153c | seen in 1 other review |
| racer@ldiskfs+DNE:test_1 | seen in 48 other reviews |
| sanity-scrub@ldiskfs+DNE:test_1a | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_1c | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_4a | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_4b | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_4c | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_5 | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_6 | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_7 | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_8 | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_9 | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_10a | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_15 | seen in 2 other reviews |
| sanity-scrub@zfs:test_1a | seen in 2 other reviews |
| sanity-scrub@zfs:test_1b | seen in 2 other reviews |
| sanity-scrub@zfs:test_4a | seen in 2 other reviews |
| sanity-scrub@zfs:test_5 | seen in 2 other reviews |
| sanity-scrub@zfs:test_10a | seen in 2 other reviews |
| sanity-scrub@zfs:test_12 | seen in 2 other reviews |
LU-18041 obd: mgc uses real uuid for its uuid to NID mapping Lustre creates a mapping, struct uuid_nid_data, using an 'uuid' to many NIDs. That 'uuid' happens to be the primary NID. This is problem for two reasons. First reason is that struct obd_uuid is to small for full length IPv6 based NID addresses so it ends up truncated. Second reason is for some systems the IP addresses expire for the network interfaces during the file system run time. This means the primary NID is not permanent. What is a better node identifier for the mgc is the UUID generated for it. Use that for the mappings. Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: Ib00ac7c3e282be924f2a64245cfcc4fc4e5744a7
ldiskfs/xattr.c: warning: sparse:no newline at end of file
ldiskfs/xattr.c: warning: sparse:no newline at end of file
The body only describes the ldiskfs credit reuse. Several hunks aren't accounted for: - `lnet/libcfs/tracefile.c` drops `static` from `cfs_trace_data` - nothing else in the patch touches libcfs. Is this a debugging leftover that should be dropped? - `osd_trans_dump_creds()` changes from `struct thandle *` to `struct osd_thandle *`, touching four call sites. That's a standalone cleanup. - The ldiskfs patches add `EXPORT_SYMBOL(ext4_xattr_ibody_get)` alongside the one that is actually needed. - `osd_declare_attr_set()` stops declaring `OSD_OT_XATTR_SET` unconditionally and gates it on the LMA flags. That is a behaviour change worth a sentence of its own. Also a few wording slips: "old code don't able to account" -> "the old code cannot account", "lets reuse" -> "let's reuse".
(typo) The quoted subject doesn't match the referenced commit. `git log -1 --format=%s 278fa1fb23` gives:
LU-12652 ldiskfs: disable credits check in 4.18
The leading `35750: ` is the Gerrit change number, not part of the subject.
I manually reverted rhel9.6/9.7 series so it points back at 5.14 patch again and the build is restored so I believe this patch is just broken.
It looks like RHEL9.6/9.7 kernel have a changes in ext4 version. sometimes it have ext4/crypto.c - sometimes not. I have tested with lastes 9.6/9.7 version but our code it looks not a last.
I checked again with 5.14.0-570.62.1.el9_6.x86_64 and 5.14.0-611.35.1.el9_7.x86_64. It looks you needs to update a kernel versions.
ext4 never sets few EAs in a single transaction AFAIU. so it's unlikely this kind of change can make into vanilla kernel.
sure. it's sets. example of this in the patch. You lost it ?
sorry? how many EAs an user can set using clean ext4 in a single transaction?
this is
(defect) This `Index:` header has no `---`/`+++` lines and no hunks - the crypto.c change is missing from this file (the linux-6.12 copy has it). This file also never patches `fs/ext4/super.c`.
`ext4_set_context()` lives in `fs/ext4/crypto.c` on 5.16+ and in `fs/ext4/super.c` before that, and in both it calls
ext4_xattr_set_credits(inode, len, false, &credits)
while the xattr.h hunk above changes the prototype to 6 arguments. `ldiskfs/Makefile.in` copies every `@EXT4_SRC_DIR@/*.c` for patching and only filters `crypto.c` out of the object list when `CONFIG_FS_ENCRYPTION` is unset, so with encryption enabled this is `error: too few arguments to function 'ldiskfs_xattr_set_credits'`.
That breaks every series still pointing at this file - rhel9.1 through 9.5, sles15sp4/sp5, oe2203, the 5.15/5.19 ubuntu20 series, ubuntu24 -45/-100/-106, ubuntu26, and all of 6.1/6.6/6.7/6.10/6.11/6.12/6.18/7.0-ml.
This is the same breakage that was reported earlier on rhel9.6/9.7; switching those two series to the linux-6.12 copy moved the failure rather than fixing it.
(minor) `ext4_xattr_ibody_get` doesn't seem to have any caller outside ldiskfs - grepping the tree for `ldiskfs_xattr_ibody_get` finds nothing. Is this export needed, or left over from an earlier version?
does not look like it actually applies to rhel9.6?
I wonder if this also works?
(defect) Only `6.8.0-90` was moved to the linux-6.12 copy. `ldiskfs-6.8.0-45-ubuntu24.series`, `ldiskfs-6.8.0-100-ubuntu24.series` and `ldiskfs-6.8.0-106-ubuntu24.series` still reference `linux-5.14/ext4-xattr-disable-credits-check.patch`, and those kernels have `fs/ext4/crypto.c`. Same for the mainline series (6.6/6.12/6.18/7.0-ml) and 7.0.0-14-ubuntu26. Should the remaining series be switched too, or should the linux-5.14 copy be completed instead?
warning: sparse:symbol 'cfs_trace_data' was not declared. Should it be static?
LU-20154 ldiskfs: fix credit calculation for xattr
old code don't able to account an EA inode credits,
lets reuse an ldiskfs code to avoid this.
Fixes: 278fa1fb23 ("35750: LU-12652 ldiskfs: disable credits check in 4.18")
HPe-bug-id: LUS-12937
Signed-off-by: Alexey Lyashkov <alexey.lyashkov@hpe.com>
Change-Id: Id7eca1783dd4f6848f8d235b6159b8d34eb398db
(minor) This one is not a pure move. The old check sat inside the `--enable-efa` block and ran with EXTRA_CHECK_INCLUDE set, so with `--with-o2ib=<MOFED>` it resolved `<rdma/ib_verbs.h>` out of the external OFED tree; the ksym always reads the in-kernel header, and it now runs unconditionally. The new answer looks like the correct one for efalnd, since lnet/klnds/efalnd/Makefile only adds `-I $(EFA_INCLUDE_PATH)` and not the OFED includes. Since it changes what gets detected on MOFED builds, worth a line in the commit message rather than listing it as a plain move.
(minor) The comment being dropped recorded two things this file doesn't: that 4.18.0-193.el8 carries the backport, and why the _rtnl variant is used instead of _rcu (the current locking is rtnl). ksymfind() has an `extra` field for exactly this kind of note, so the rationale could be carried over.
(suggestion) The test being replaced compiled `kernel_bind(NULL, (struct sockaddr_unsized *)0, 0)` under -Werror, so it proved the prototype that lnet_sock_bind()/lnet_sock_connect() and gss_svc_upcall.c actually depend on. Grepping for the struct definition only proves the type exists. Upstream split those apart: bf33247a90d3e adds the struct to linux/socket.h, and the `kernel_bind()`/`kernel_connect()` conversions land in later commits (0e50474fa514, 85cb0757d7e1). On a tree carrying only the struct, HAVE_STRUCT_SOCKADDR_UNSIZED is defined, the `sockaddr_unsized` -> `sockaddr` fallback is skipped, and the casts in lnet/lnet/lib-socket.c hit an incompatible pointer type. Would matching the converted prototype in include/linux/net.h be a closer equivalent?
(style) Not a bug, but collapsing the double space before `=` in the GNILND/KFILND conditionals has nothing to do with moving the lnet checks to ksym, and the commit message doesn't mention it. Drop it or split it out?
LU-20418 build: Move lnet common checks to ksym Move checks for: HAVE_IBDEV_TO_NODE HAVE_IN_DEV_FOR_EACH_IFA_RTNL HAVE_SOCK_INUSE_ADD HAVE_SOCK_NOT_OWNED_BY_ME HAVE_NETDEV_LOCK_OPS HAVE_SENDPAGE_OK HAVE_STRUCT_SOCKADDR_UNSIZED sockaddr_unsized Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: Iaf1759e7d88480254983b2d79c41f12d43974ef6
warning: sparse:symbol 'ptlrpc_pmqos_use_stats_for_duration' was not declared. Should it be static?
all these need to be static
warning: sparse:symbol 'cpus_latency_qos' was not declared. Should it be static?
and this one too.
I suspect this might not be safe either. ptlrpc_connection_addref() is just an unchecked increment. Same thing is done under rev_import_reconnect(). Export connections can be swapped and old ones dropped in target_handle_connect() (ldlm_lib.c:1604-1615. Since connections are now freed immediately when ref reaches zero, I think this becomes another potential use-after-free in both the reply handling and revert-import reconnect paths.
Do we need a reference here since connection is dereferenced below (line 915)? I'm concerned this could race with the connection being replaced in import_select_connection(). If I'm right then is potentially use-after-free.
LU-17594 ptlrpc: remove ptlrpc_connection hash table With the removal of c_remote_uuid and c_self, it's clear that the hash table in connection.c is simply mapping a lnet_processid to itself. We can remove the hash table entirely. With this change, ptlrpc_connection becomes a ref counted lnet_processid. In the future, we may be able to remove ptlrpc_connection entirely. Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: I9665fb321e961be308bd18327fca0efe2b57c01b
LU-0000 obdclass: rollback testing find breakage Test-Parameters: trivial Change-Id: I93c1ca71984efd3b66e56d549141c78883abebc6 Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-1 failed 2× | RHEL 8.9/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
| review-dne-zfs-part-2 failed 2× | RHEL 8.9/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
| review-dne-zfs-part-3 failed 2× | RHEL 8.9/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
| review-dne-zfs-part-4 failed 2× | RHEL 8.9/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
| review-dne-zfs-part-5 failed 2× | RHEL 8.9/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
| review-dne-zfs-part-6 failed 2× | RHEL 8.9/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
| review-dne-zfs-part-7 failed 2× | RHEL 8.9/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
| review-zfs failed 2× | RHEL 8.9/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
LU-12607 osd-zfs: use proper locking for dnodes Currently lustre uses the DB_DNODE_[ENTER|EXIT] macros which is incorrect as pointed out by the ZFS developers. OpenZFS ticket https://github.com/openzfs/zfs/pull/9027 exported the proper dnode management functions so move Lustre to these new functions. Change-Id: If1165c4db149a1eb46bf00df9b48589d90acb7c6 Signed-off-by: James Simmons <jsimmons@infradead.org>
``` checking for /tmp/ktest-out/kernel_build.x86_64/.config... noconfigure: error: Kernel config could not be found. ``` The userland build shouldn't depend on the kernel config. I think we'd need to skip this check somehow.
I think I know what's wrong: --disable-modules isn't propagated when we try to make the debian packages. There's a couple other tweaks we need as well. I can push an updated patch.
The kernel really doesn't like it if you attempt to build userspace components against the Linux source tree. They recommend (https://kernelnewbies.org/KernelHeaders) either building against the installed headers (i.e. what you already have implemented) or building against a version of the headers copied from Linux. This would be equivalent to building against the openSFS headers. I think this should be supported somehow. Perhaps --disable-modules could have an argument to decided whether to use the installed headers or openSFS headers?
The question is which UAPI headers to test against? Some of the autoconf test for the utilities look at the UAPI headers to decided what is supported.
Oops. I added Shaun so we can verify. Do the autoconf test use the kernel UAPI pointed to by --with-kernel. I do agree we don't need to look at the .config for the kernel. The only complex case is the dummy fscrypt kernel option that changed.
> Do the autoconf test use the kernel UAPI pointed to by --with-kernel Yes. The test builds work the same as any kernel module build. You can see generated examples with: $ export PARALLEL_BUILD_OPT=debug $ ./configure ...
Maybe you are asking about user space utilities? Those do now know anything about the kernel headers, they should build just like any other user space utility looking under /usr/include and /usr/lib
LU-13903 build: allow building for a kernel with native client Currently we can build just the Lustre utilites on a system with a installed kernel with native Lustre client support. This doesn't work for building against a kernel tree with the native lustre client i.e ./configure --disable-modules --disable-server --with-linux=~/lustre-upstream This patch adds takes the kernel header location and adds it to the CPPFLAGS. The tools then can be built against that set of headers. Test-Parameters: trivial Change-Id: I3348f90474d0dd87da5fc8e779b71c9d6a2953df Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-8980 libcfs: add tracepoint support for libcfs Add initial trace events to the libcfs module. With this we can now collect data using the perf utility. Each traditonal lustre debug macro is turned into an unique tracepoint event. Any debugging macros moved over to trace point will now handling printing message to the console. Change-Id: I0fc6efc24fd9495fae2829990f74b1a72491baf8 Signed-off-by: James Simmons <uja.ornl@yahoo.com>
| unique failing test | history |
|---|---|
| sanity-flr@ldiskfs+DNE:test_70a | seen in 92 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-selinux-ssk-part-2 failed 4× | RHEL 8.10 / x86_64 | ran 8 tests. 3 tests failed: lustre-initialization, sanity-sec, recovery-small. | session |
LU-14291 gss: seperate out the client from server code. The gss code is all lumped together. Lets separate the code out. Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: If249e56e27054aa8accd4754e9bddec010ff0e7a
| unique failing test | history |
|---|---|
| replay-dual@zfs+DNE:test_26 | seen in 17 other reviews |
(minor) this looks like an `sptlrpc` parameter. Also, version numbers never really explain what they are for. It would be better to name this something more clear like `lst_force_large_nid`.
Yucky. Can't we do version handshaking instead. My next patch in this area will try the hand shaking approach.
srpc_force_v2 is for disabling v1 on v2 hosts. If it is not used, there's "handshaking": v2 is able to initiate a session with v1 (ipv4) or v2 (both ipv6 and ipv4), v1 is able to initiate an ipv4 session to v2 and v1.
Is there no mechanism that LNet (and LST) can use to automatically negotiate protocol feature support? If not, then this should be added as part of this compatibility-breaking change. Or do I misread this, and the `srpc_force_v2` is only used to force the new large-NID functionality on systems that don't need it?
(defect) this should have `env=FORCE_LARGE_NID=true` to run IPv6 sessions?
(minor) variable-sized `lnet_processid` should go after `nde_state`
(minor) These should all be replaced with fixed-size types (e.g. `__u32`)
(minor) should remove pointers from UAPI structs, especially in the middle
I thought I ported the SID handling to Netlink.
??
LU-19323 lnet: add IPv6 support to lnet_selftest Adds IPv6 support to lnet_selftest. Is backwardly-compatible to earlier versions of selftest. Adds module parameter srpc_force_v2 which can optionally force large-NID (v2) protocol on wire (breaks v1-compatibility) Test-Parameters: fortestonly Test-Parameters: trivial testlist=sanity-lnet Signed-off-by: Serguei Smirnov <ssmirnov@whamcloud.com> Change-Id: I3879dc88f0c89ebbaa21adb9faca6782a855ee3a
| unique failing test | history |
|---|---|
| sanity-quota@ldiskfs+DNE:test_48 | seen in 25 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
| review-ldiskfs-dne-arm | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 5 tests. 1 tests failed: sanity. | session |
LU-8585 tests: re-enable fid2path sanity test for subdir mount
When a subdirectory is mounted, the .lustre directory cannot be
seen. With the move of llapi_fid2path() from using .lustre/fid to
name_to_handle_at() previous sanity test that failed due to
file sets being enabled should now pass since name_to_handle_at()
should be file set aware. We update a few test applications to
work with llapi_open_by_fid() if we can't access .lustre. Same
is done with liblustreapi.so as well.
Fixes: f71554200 ("LU-11208 tests: add version check to sanity tests")
Fixes: e2ac6e1ea ("LU-9341 lod: Add special O_APPEND striping")
Fixes: 9bd3e64b8 ("LU-28 fileset: add fileset mount support")
Test-Parameters: trivial envdefinitions="FILESET=/subdir" testlist=sanity
Change-Id: Iddbcea298613e1dcc0af5c6f3cab4f0de01dbb5c
Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-5 | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: lustre-rsync-test. | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 | ran 6 tests. 2 tests failed: sanity-sec, sanity-lnet. | session |
(minor) Most parameters allow other values to be written to clear it, like "0", and not just "clear".
same
...
LU-17266 mdt: purge objects via procfs sometimes it can be useful for testing to drop/reload lu objects. lctl set_param mdt.*.site_stats=clear lctl set_param ofd.*.site_stats=clear it should be possible to replace total system cache drop (echo 3 > /proc/sys/vm/drop_caches) with this lustre-only version. Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Change-Id: I9055be3b53d0af22758eac0acac8771e40c371f7
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-5 | RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
LU-9868 llite: remove directory-specific code from ll_find_alias() Now that ll_find_alias() is never called for directories, we can remove code that only applies to directories. Linux-commit: ac63774689265d50bc1d83ac9b7889ac7e645b5a Signed-off-by: Mr. NeilBrown <neil@brown.name> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: I54f726eac648374cd631319095cfdab8b1f5dfff
| unique failing test | history |
|---|---|
| runtests-ssk@ldiskfs+SharedKey:test_1 | seen in 3 other reviews |
| runtests-ssk@ldiskfs+SharedKey:test_cleanup | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| runtests@zfs:test_1 | seen in 3 other reviews |
| runtests@zfs:test_cleanup | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-4 | RHEL 8.8/x86_64 | ran 9 tests. 1 tests failed: sanity-hsm. | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.8/x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-4 | RHEL 8.8/x86_64 | ran 9 tests. 1 tests failed: sanity-hsm. | session |
| review-ldiskfs crashed | RHEL 8.8/x86_64, RHEL 9.2/x86_64 | ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | RHEL 8.8/x86_64 | ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-arm crashed | RHEL 8.7/aarch64, RHEL 8.8/x86_64 | ran 8 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
LU-11501 llite: use d_real for directories in fid cache. Lustre has a special directory called .lustre which contains a collection of directories whose name matches a fid. This is used in a similar way as open by fhandle but we use this functionality since it allows opens by normal users. For opening a file by proxy with the .lustre/fid/"FID" directory we use a dcache alias. While this is valid Lustre does the same thing for open a directory with this .lustre FID which means we have multiple hard links to directories which is forbidden. More modern kernels report this as an error and we risk a future kernel pruning such dentry entries. The solution is to look at how overlayfs does this since .lustre is sort of a pseudo file system. We can use d_real() to lookup the real dentry that maps to the special .lustre/fid/"FID". Change-Id: I02d8a54465d685430d9290c24faf1ef6bfd6a876 Signed-off-by: James Simmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| sanity3@zfs:test_233a | seen in 3 other reviews |
| sanityn@zfs:test_108a | seen in 11 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-part-1 | RHEL 9.5 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-part-2 | RHEL 9.5 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, SLES 15.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 6 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 24.04 / x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
LU-9868 llite: refine ll_find_alias based on d_exact_alias The task of ll_find_alias() is now very similar to d_exact_alias(). We cannot use that function directly, but we can copy much of the structure so that the similarities and differences are more obvious. Examining d_exact_alias() shows that the d_lock spinlock does not need to be held in ll_find_alias as much as it currently is. Linux-commit: 8016ab9ebbda3dee637ac66b9e0f7a74ef6fe9e6 Signed-off-by: Mr. NeilBrown <neilb@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: I52ba4bc35cb84f523551816df7df2d4d0b1573b7
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-part-1 | RHEL 9.5 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, SLES 15.5 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 24.04 / x86_64 | ran 6 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. | session |
LU-9868 llite: simplify ll_find_alias() Now that ll_find_alias is only searching for one type of dentry, we can return as soon as we find it. This allows substantial simplification, and brings the bonus that we don't need to take the d_lock again just to increment the ref-count. We can increment it immediately that the dentry is found. Linux-commit: 7e08e9a8942dfc38693edf2e389cde620e918356 Signed-off-by: Mr. NeilBrown <neilb@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: I18d6130c27186e1a7c9254e50b4d1242b7ada383
LU-7672 tests: Update Kerberos set up script Update and clean up the Kerberos set up script setup_kerberos.sh. Test-Parameter: forbuildonly Signed-off-by: James Nunez <james.a.nunez@intel.com> Change-Id: Iae7b1a7a524759c524bc0a69f4755a8c6eed3f9a
| failed enforced test | platform | detail | |
|---|---|---|---|
| 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 |
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.
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?
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.
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.
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>
| unique failing test | history |
|---|---|
| sanity-pfl@ldiskfs+DNE:test_1c | NEW unique failure for this branch in the last 30 days, and was seen 2 times across 1 other branches 1 reviews |
| sanity-pfl@zfs:test_1c | NEW unique failure for this branch in the last 30 days, and was seen 2 times across 1 other branches 1 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | RHEL 8.10 / x86_64 | ran 11 tests. 1 tests failed: sanity-pfl. | session |
| review-dne-part-2 | RHEL 9.5 / x86_64 | ran 11 tests. 1 tests failed: sanity-pfl. | session |
| review-dne-zfs-part-2 | RHEL 8.10 / x86_64 | ran 11 tests. 1 tests failed: sanity-pfl. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
LU-19298 lod: merge different lmm handling togther. For PFL handling the LOD has developed very similar code independently. Besides code duplication we end up not having consistent PFL handling. For example lod_layout_add() handling doesn't support specific OST indexes being requested by the user for the new component. We merge all the code into lod_comp_for_each_lcm(). In the future any change here will impact many code paths at the same time. For EC developement we don't need to touch any many places in the code. Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: Ic2392dd84eb397e87e384d6916ccb2de04b6d083
| unique failing test | history |
|---|---|
| conf-sanity2@ldiskfs+DNE:test_35a | seen in 4 other reviews |
| conf-sanity2@ldiskfs+DNE:test_35b | seen in 18 other reviews |
| conf-sanity2@ldiskfs+DNE:test_37 | seen in 18 other reviews |
| conf-sanity2@ldiskfs+DNE:test_38 | seen in 16 other reviews |
| conf-sanity2@ldiskfs+DNE:test_39 | seen in 28 other reviews |
| conf-sanity2@ldiskfs+DNE:test_40 | seen in 30 other reviews |
| conf-sanity2@ldiskfs+DNE:test_41a | seen in 27 other reviews |
| conf-sanity2@zfs:test_35a | seen in 4 other reviews |
| conf-sanity2@zfs:test_35b | seen in 8 other reviews |
| conf-sanity2@zfs:test_38 | seen in 11 other reviews |
| conf-sanity2@zfs:test_39 | seen in 25 other reviews |
| conf-sanity2@zfs:test_40 | seen in 25 other reviews |
| conf-sanity2@zfs:test_41a | seen in 12 other reviews |
| recovery-small@ldiskfs+DNE:test_10a | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| recovery-small@ldiskfs+DNE:test_24b | seen in 4 other reviews |
| recovery-small@ldiskfs+DNE:test_106 | seen in 4 other reviews |
| recovery-small@ldiskfs+DNE:test_108 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| recovery-small@zfs:test_10a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| recovery-small@zfs:test_24b | seen in 2 other reviews |
| recovery-small@zfs:test_106 | seen in 4 other reviews |
| replay-single@ldiskfs+DNE:test_65b | seen in 6 other reviews |
| replay-single@zfs:test_65b | seen in 6 other reviews |
| sanity2@ldiskfs+DNE:test_60f | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_170 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| sanity2@ldiskfs+DNE:test_360 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| sanity2@ldiskfs+DNE:test_401a | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| sanity2@ldiskfs+DNE:test_818 | seen in 7 other reviews |
| sanity2@zfs:test_60f | seen in 1 other review |
| sanity2@zfs:test_170 | seen in 1 other review |
| sanity2@zfs:test_401a | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 9.3/x86_64 | ran 4 tests. 1 tests failed: sanity. | session |
| review-dne-part-3 | RHEL 9.3/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. This build will be scored -1 since fortestonly was specified. | session |
| review-dne-part-5 | RHEL 9.3/x86_64 | ran 6 tests. 1 tests failed: recovery-small. | session |
| review-dne-part-6 | RHEL 9.3/x86_64 | ran 4 tests. 1 tests failed: replay-single. | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.9/x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.9/x86_64 | ran 5 tests. 1 tests failed: recovery-small. | session |
| 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 |
| review-ldiskfs | RHEL 8.9/x86_64, SLES 15.5/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.9/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-zfs | RHEL 8.9/x86_64 | ran 8 tests. 1 tests failed: replay-single. | session |
never kill a subsystem check. I will make developers work harder.
I'm hoping to use the tracepoints to enable/disable subsystem logging. There's a tracepoint enabled macro I could use to restore this check.
Does this add 256 bytes of stack usage to every function that calls CDEBUG()? That could be pretty bad in some call chains.
Yes. This is super hack-y. There's definitely a better way to do this.
you are really want to kill a performance? I think yes.
This entire __ltrace_printk() macro sucks. I need to rewrite it entirely. I have an idea that should make this macro much better.
There are tunable parameters for the CDEBUG rate limiting, why not use them here?
I'll probably have to, since old kernels don't like '#include <linux/ratelimit_types.h>'. I was hoping that these macro would be simpler.
This will also need to be fixed.
I think this is fine? This is just redefining this function to be always false is debugging is disabled.
Sorry, I was thinking this was the no-op version of the actual libcfs_debug_msg() which had been removed. Carry on.
Doesn't build on aarch64 and ppc. Needs to go in debug.c probably. These are pretty huge functions anyway.
Same.
Same.
LU-8980 debug: redefine CDEBUG to use tracing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TODO: 1) Look at debug upcalls 2) Test/verify/update userspace helpers 3) Clean up more code 4) Validate LBUG, LASSERT 5) Write kernel doc comments for everything 6) Make sure various userspace settings actually work 7) Fix CDEBUG_LIMIT/CDEBUG_LIMIT_LOC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The custom Lustre debugging infrastruction should be refactored to use existing kernel debugging infrastructure. We should aim to: 1) Improve the current developer experience: Writing code for Lustre shouldn't be made harder. Existing userspace debugging tools should still work and should be improved. 2) Maintain or improve performance: Lustre is a high performance filesystem, not a low performance one. 3) Significantly reduce divergence with upstream: The custom Lustre debugging must go. The code in libcfs and various Lustre subsystem must be refactored. The first step towards that is pushing all debug message into the trace log. This will allow use to retain the features of current Lustre debugging while significantly reducing the need for custom code. This patch removes old Lustre debugging code at the same time. Also, it implements the minimum userspace code needed to make Lustre debugging tools still function. Test-Parameters: fortestonly Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: I8004049eb97a3fdc9a5725aa8402355107494950
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 crashed | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-4 crashed | RHEL 8.10 / x86_64 | ran 9 tests. 1 tests failed: sanity-quota. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-5 crashed | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-5 crashed | RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-6 crashed | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: ost-pools. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-6 crashed | RHEL 9.5 / x86_64 | ran 4 tests. 1 tests failed: ost-pools. %% THIS TEST SESSION CRASHED %% | 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-zfs-part-2 crashed | RHEL 8.10 / x86_64 | ran 11 tests. 1 tests failed: sanity-pfl. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-4 crashed | RHEL 8.10 / x86_64 | ran 9 tests. 1 tests failed: sanity-quota. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-6 crashed | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: ost-pools. %% 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 |
LU-18175 ldlm: replace namespace lock with RCU With newer kernels you can enable a debugfs interface to flush out the shrinkers. When enabled in testing the below was discovered: BUG: sleeping function called from invalid context at kernel/mutex.c:104 in_atomic(): 1, irqs_disabled(): 0, pid: 18286, name: lctl CPU: 3 PID: 18286 Comm: lctl Kdump: loaded Tainted: G OE ------------ 3.10.0-7.9-debug #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.2-1.fc38 04/01/2014 Call Trace: [<ffffffff817ded29>] dump_stack+0x19/0x1b [<ffffffff810c8ec9>] __might_sleep+0xd9/0x100 [<ffffffff817e5540>] mutex_lock+0x20/0x40 [<ffffffffa08ae00c>] ldlm_pools_shrink+0x6c/0x330 [ptlrpc] [<ffffffffa08ae2eb>] ldlm_pools_cli_shrink+0x1b/0x20 [ptlrpc] [<ffffffffa022be76>] shrinker_debugfs_count_show+0x106/0x200 [libcfs] [<ffffffff8126e115>] seq_read+0x135/0x470 [<ffffffff81244899>] vfs_read+0xb9/0x1c0 [<ffffffff812457cf>] SyS_read+0x7f/0xf0 [<ffffffff817f400c>] system_call_fastpath+0x1f/0x24 This is due to the debugfs interface taking its own mutex lock and our own ldlm pools using a mutex lock as well. Replace our mutex lock with RCU list handling. Special note is that their is no list_empty_rcu(). We have to use list_first_or_null_rcu() instead. This is due to list_empty() and the next list operation performing separate READ_ACCESS which can give different results. Change-Id: I175f345b5a8cf7d29e32c7e192620f9c896e6a9d Signed-off-by: James Simmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| sanity-quota@zfs+DNE:test_12b | seen in 100 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-2 | CentOS 7.0/x86_64 | ran 13 tests. 1 tests failed: sanity-sec. | session |
LU-8875 lnet: Change to new RDMA done callback mechanism Adapt to changes made to the RDMA API: - change call to ib_create_cq() to ib_alloc_cq() (use SOFTIRQ for callbacks) - change call to ib_destroy_cq() to ib_free_cq() - introduce a new struct kib_sched_element as the items we put on the kib scheduler work list (rather than putting connections to be processed) - added a kib_sched_element to kib_tx and kib_rx so they can be scheduled to be processed by the kib scheduler - have separate callbacks for each CQ operation type - set the proper callback to be called when setting up CQ elements - change kiblnd_scheduler() to process work items (kib_sched_element) rather than process connections All of this means we are making good use of the new RDMA CQ callback mechanism and focusing our scheduler to process complete items rather than letting it process connections and have to poll for completions. Test-Parameter: trivial nettype=o2ib Signed-off-by: Doug Oucharek <dougso@me.com> Change-Id: I4ba719578086fedb68ca554eeec191c839ceaca2
I am really suspicious about this patch. current master-next on boilpot started to get strange use after free problems which seem to be accessing OBD device that's already freed. Four distinct trace so far: https://knox.linuxhacker.ru/crashdb_ui_external.py.cgi?newid=73710 https://knox.linuxhacker.ru/crashdb_ui_external.py.cgi?newid=73714 https://knox.linuxhacker.ru/crashdb_ui_external.py.cgi?newid=73724 https://knox.linuxhacker.ru/crashdb_ui_external.py.cgi?newid=73725 I am going to omit it next time over and we'll see how it works. Not setting -1 just yet
dropping this patch resulted in total disappearance of the problems reported in the latest master-next over the last week
Odd. I wonder if this is exposing an issue introduced in a previous patch somehow?
LU-18162 obdclass: standardize class_(un)register_type Rather than passing many arguments to class_register_type(), statically define all of the fields of the LU type and pass only that LU type to the class register/unregister functions. This makes it easier to see what methods are defined on each LU device type and also aligns more closely with Linux kernel style. This patch precedes the unification of OBD and LU type. Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: Ie33f55abaeaa76d9ede2c11a84a82660827a61f4
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-4 | RHEL 9.4 / x86_64 | ran 9 tests. 1 tests failed: sanity-hsm. | session |
| review-dne-part-5 | RHEL 8.10 / x86_64 | ran 8 tests. 1 tests failed: recovery-small. | session |
| review-dne-part-5 | RHEL 9.4 / x86_64 | ran 8 tests. 1 tests failed: recovery-small. | session |
| review-dne-part-7 | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-part-7 | RHEL 9.4 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: recovery-small. | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-5 | RHEL 8.10 / x86_64 | ran 8 tests. 2 tests failed: sanityn, recovery-small. | session |
| review-dne-zfs-part-7 | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, SLES 15.5 / x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
would be nice to have some examples of the new names, or before/after
Do the extra embedded '-' separators cause parsing issues later on?
%pU is not correct here as sbi->ll_sb_uuid.uuid is a max 40 byte string.
It is safe to require the '-mdc-' naming? Probably but I have not looked to be positive.
Extra '-' separators ... do the confuse a parser somewhere?
That is my concern as well if the format of the parameters is suddenly getting much longer and having extra dashes in them. In the past we had to deal with fsname that contained multiple '-' in them, so some code is using "strrchr()" to find the fsname from the end of the instance name. The current parameters look like: # lctl list_param llite.*.max* llite.myth-ffff909824e7f800.max_easize llite.myth-ffff909824e7f800.max_read_ahead_async_active llite.myth-ffff909824e7f800.max_read_ahead_mb llite.myth-ffff909824e7f800.max_read_ahead_per_file_mb llite.myth-ffff909824e7f800.max_read_ahead_whole_mb llite.myth-ffff909824e7f800.max_cached_mb but with this patch they would become: # lctl list_param llite.*.max* llite.myth-f1da1f0c-f89b-473e-b604-8c265d1c1ecd.max_easize llite.myth-f1da1f0c-f89b-473e-b604-8c265d1c1ecd.max_read_ahead_async_active llite.myth-f1da1f0c-f89b-473e-b604-8c265d1c1ecd.max_read_ahead_mb llite.myth-f1da1f0c-f89b-473e-b604-8c265d1c1ecd.max_read_ahead_per_file_mb llite.myth-f1da1f0c-f89b-473e-b604-8c265d1c1ecd.max_read_ahead_whole_mb llite.myth-f1da1f0c-f89b-473e-b604-8c265d1c1ecd.max_cached_mb which not only makes them longer and harder to parse, but also much less readable. If the main concern here is ASLR then we can avoid printing the raw pointer in the parameter name and work out something else. For example, the kernel could save a random 64-bit number at startup time and XOR with that, and if it needs the original pointer back it can XOR again.
you probably wants to update this comment to be inline with the syntax.
The check could be done before trying the copy
LU-13118 lustre: use UUID for naming instead of internal pointers According to ASLR it is considered a security violation to publish internal kernel addresses to user land. Currently lustre uses internal pointer addresses to create an unique identifier that ends up being used to build the sysfs tree. This patch switches this to using the UUID generated. The reason for using UUID is that in the ptlrpc layer there is a mapping between NIDs and UUIDs and many client interfaces have the same UUIDs so we could cheat and use the device name instead. Change-Id: Id91ceece847402658d1e2a364b3602572daaef87 Signed-off-by: James Simmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| conf-sanity-slow@zfs:test_45 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| conf-sanity-slow@zfs:test_69 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-dne | RHEL 9.5 / x86_64 | ran 7 tests. 1 tests failed: sanity. | session |
This says that conf-santity test_45 needs to be updated, but I don't see any changes to that test?
I don't think it is reasonable to expect "umount -f" to be 100% reliable. It certainly isn't for NFS. As long as it helps the unmount processes a long, so a few more tries will succeed, it is enough. That is unless the lustre community has some firm requirements for -f, which Linux itself doesn't have.
I think the issue is a matter of scale. Having your local filesystem fail to unmount because of a transient issue is not a huge deal to clean up, doing it on thousands of nodes is a bigger hassle.
I think a reasonable replacement would be to add a /sbin/umount.lustre script to retry the unmount instead of in the kernel, now that util-linux supports this. Something like:
#!/bin/bash
count=10
while ((count-- > 0)) && ! umount --internal-only "$@"; do
sleep 1
done
It is not enough to make umount.lustre here. I guess the command should be added into rpm spec files too. Try to install lustre from rpms and check whether umount.lustre is in the system as expected. But if we can find mnt from superblock as I mentioned in another comment, we don't need to add this new command.
Feng is correct here - this needs to be added into lustre.spec.in below mount.lustre in the "lustre.files" section:
/sbin/mount.lustre
+/sbin/umount.lustre
%if %{with servers}
/sbin/mount.lustre_tgt
%endif
It doesn't look like it is needed in the debian/ tree since it doesn't mention "mount.lustre" at all.
LU-10824 llite: remove may_umount() loop
Al Viro pointed out the work around for LU-1882 is incorrect. It
can even lead to kernel panics under the right conditions. The
reason for this work around is that PtlRPC messages can still be
received after unmounting. With todays util-linux you can provide
umount helper scripts. Create one for Lustre that does the same
thing that the kernel tried to accomplish.
Fixes: 205a57df2787 ("LU-1882 llite: Adding timed wait in ll_umount_begin")
Test-Parameters: trivial testlist=conf-sanity env=ONLY=45,ONLY_REPEAT=100
Change-Id: I1498c6348022bdd6a74db887ffc8836a7a03bab6
Signed-off-by: Rick Mohr <rmohr@ornl.gov>
Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 crashed | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-pcc. %% THIS TEST SESSION CRASHED %% | session |
[ 2231.421259] ------------[ cut here ]------------ [ 2231.422249] kernel BUG at fs/jbd2/transaction.c:2148! [ 2231.423289] invalid opcode: 0000 [#1] SMP PTI [ 2231.424158] CPU: 0 PID: 129424 Comm: ldlm_bl_03 Kdump: loaded Tainted: G OE -------- - - 4.18.0-553.85.1.el8_10.x86_64 #1 [ 2231.426385] Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011 [ 2231.427473] RIP: 0010:jbd2_journal_try_to_free_buffers+0xfa/0x100 [jbd2] [ 2231.428770] Code: 00 75 f4 eb a7 5b 4c 89 ef 5d 41 5c 41 5d 41 5e 41 5f e9 f9 7f ef de 5b 31 c0 5d 41 5c 41 5d 41 5e 41 5f c3 cc cc cc cc 0f 0b <0f> 0b 0f 1f 40 00 66 66 66 66 90 41 56 41 55 41 54 55 53 4c 8b 2f [ 2231.432135] RSP: 0018:ffffa4c40584b9e8 EFLAGS: 00010246 [ 2231.433142] RAX: 000fffffc001206d RBX: ffffedd9006f92c0 RCX: 0000000000000000 [ 2231.434497] RDX: 0000000000000000 RSI: ffffedd9006f92c0 RDI: ffff9313873d5000 [ 2231.435845] RBP: ffff9312ac220b80 R08: 0000000000000000 R09: ffffa4c40584b9b8 [ 2231.437180] R10: ffffffffffffffff R11: 000000000000003f R12: 0000000000000000 [ 2231.438513] R13: ffffedd9006f92c0 R14: 0000000000000000 R15: 0000000000000000 [ 2231.439846] FS: 0000000000000000(0000) GS:ffff9313bbc00000(0000) knlGS:0000000000000000 [ 2231.441346] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 2231.442443] CR2: 00005654730b7f44 CR3: 000000001ee10005 CR4: 00000000000606f0 [ 2231.443776] Call Trace: [ 2231.444312] ? __die_body+0x1a/0x60 [ 2231.445060] ? die+0x2a/0x50 [ 2231.445662] ? do_trap+0xe7/0x110 [ 2231.446327] ? jbd2_journal_try_to_free_buffers+0xfa/0x100 [jbd2] [ 2231.447503] ? do_invalid_op+0x36/0x40 [ 2231.448243] ? jbd2_journal_try_to_free_buffers+0xfa/0x100 [jbd2] [ 2231.449410] ? invalid_op+0x14/0x20 [ 2231.450127] ? jbd2_journal_try_to_free_buffers+0xfa/0x100 [jbd2] [ 2231.451286] invalidate_inode_page+0x72/0x90 [ 2231.452153] __invalidate_mapping_pages+0x156/0x3c0 [ 2231.453100] ? vsnprintf+0x340/0x520 [ 2231.453821] ? snprintf+0x49/0x70 [ 2231.454488] pcc_inode_put+0x118/0x140 [lustre] [ 2231.455579] pcc_layout_invalidate+0x12a/0x550 [lustre] [ 2231.456629] vvp_conf_set+0xbc/0xe0 [lustre] [ 2231.457505] cl_conf_set+0x62/0x140 [obdclass] [ 2231.458613] ll_layout_conf+0x14d/0x420 [lustre] [ 2231.459553] ? ll_lock_cancel_bits+0x484/0x9b0 [lustre] [ 2231.460612] ll_lock_cancel_bits+0x484/0x9b0 [lustre] [ 2231.461630] ll_md_blocking_ast+0x2d9/0x450 [lustre] [ 2231.462624] ldlm_cancel_callback+0x7b/0x260 [ptlrpc] [ 2231.463897] ldlm_cli_cancel_local+0xa3/0x490 [ptlrpc] [ 2231.464949] ldlm_cli_cancel_list_local+0x113/0x330 [ptlrpc] [ 2231.466082] ldlm_bl_thread_main+0x74b/0x8b0 [ptlrpc] [ 2231.467122] ? finish_wait+0x80/0x80 [ 2231.467875] ? ldlm_handle_bl_callback+0x400/0x400 [ptlrpc] [ 2231.468993] kthread+0x134/0x150 [ 2231.469678] ? set_kthread_struct+0x50/0x50 [ 2231.470499] ret_from_fork+0x35/0x40 [ 2231.471222] Modules linked in: loop mgc(OE) lustre(OE) mdc(OE) lov(OE) osc(OE) lmv(OE) fid(OE) fld(OE) ksocklnd(OE) ptlrpc(OE) obdclass(OE) lnet(OE) libcfs(OE) rpcsec_gss_krb5 auth_rpcgss nfsv4 dns_resolver nfs lockd grace fscache intel_rapl_msr intel_rapl_common crct10dif_pclmul crc32_pclmul ghash_clmulni_intel joydev pcspkr i2c_piix4 virtio_balloon sunrpc ext4 mbcache jbd2 ata_generic ata_piix libata virtio_net crc32c_intel serio_raw net_failover virtio_blk failover
LU-18657 pcc: invalidate instead of truncate inode mapping
When releasing the PCC inode the current code releases the pages
related to both the pcc inode and original inode. It is possible
additional references exist for these inode so we are not
allowed to flush all the pages. Instead use the function
invalidate_mapping_pages() that only handles pages that can be
cleaned up.
Fixes: 9e37963fa0 ("LU-10499 sec: support of PCC-RO for encrypted files")
Test-Parameters: trivial testlist=sanity-pcc
Change-Id: If979b19d68004221909450641de461b92818d243
Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 9.3 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. This build will be scored -1 since fortestonly was specified. | session |
Sure
LU-14799 tests: run stand along mgs test See what breaks for maloo setup. Test-Parameters: fortestonly testlist=conf-sanity standalonemgs=true Change-Id: I0588dc958af7c37b120f146753e898949d9cb599 Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-5 crashed | RHEL 8.8/x86_64 | ran 6 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% | session |
LU-14717 osd-ldiskfs: set readcache_max_filesize properly When set readcache_max_filesize with a negative value from the proc/sysfs interface, we should set it with maximal value OSD_MAX_CACHE_SIZE. Signed-off-by: Qian Yingjin <qian@ddn.com> Change-Id: If5d41211b2b1016a70f470f3242a17f8d5c9d3b8
| unique failing test | history |
|---|---|
| sanity-lnet@ldiskfs+DNE:test_255 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| sanity-lnet@zfs:test_255 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-lnet. | session |
| review-ldiskfs-dne | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
| review-ldiskfs-dne | RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
It would be better to say something like: The lnetctl tool supports gateways specified with a nidrange syntax. For example: gateway: 10.151.0.[1,2,3,4,5,6,7,8]@o2ib
Is strncmp needed vs. strcmp? We use strcmp everywhere else.
I would prefer you remove "route" from the cmd_mappings array (line 4363), and then move this conditional block to same level as the ip2nets conditional:
```
if (mapping) {
...
} else if (!strcmp(scalar_value, "route")) {
...
} else if (!strcmp(scalar_value, "ip2nets")) {
```
The cmd_mappings array should only be for items that don't require a custom handler.
LU-18544 utils: handle special lnetctl import for route setup The lnetctl tool supports the following: gateway: 10.151.0.[1,2,3,4,5,6,7,8]@o2ib in YAML config files as a short hand to setup many gateways. This actually voilates the YAML spec and our code doesn't handle this correctly. We need to support this incorrect behavior since it was allowed with cYAML for a long time. To do this we need to intercept route handling and unroll the gateway entries. The good news is that the '/' used by netmask will not break the YAML spec. Support for netmask has not been implemented yet. Test-Parameters: trivial testlist=sanity-lnet Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: I6a14659f62ab50d0cb521a2b8e34b1638e4f980d
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
LU-17022 obdclass: convert more flags to bitops
obd_version_recov:1, /* obd uses version checking */
obd_replayable:1, /* recovery enabled; inform clients */
obd_no_recov:1, /* fail instead of retry messages */
are now
OBDF_VERSION_RECOV, /* obd uses version checking */
OBDF_REPLAYABLE, /* recovery enabled; inform clients */
OBDF_NO_RECOV, /* fail instead of retry messages */
Introduce odb_copy_flag() to copy a flag from one obd to another.
Signed-off-by: Mr NeilBrown <neilb@suse.de>
Change-Id: Id7827b7739ca16f682ec11a216c2b35028d099de
| unique failing test | history |
|---|---|
| runtests-ssk@ldiskfs+SharedKey:test_1 | seen in 100 other reviews |
| runtests@zfs:test_1 | seen in 5 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-1 failed 2× | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-2 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-3 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-3 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-4 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-4 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-5 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-5 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-6 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-6 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-7 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-7 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-8 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-8 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-3 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-4 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-5 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-6 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-7 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-ldiskfs | RHEL 8.10 / x86_64, RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, SLES 15.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 6 tests. 2 tests failed: sanity-sec, sanity. | session |
| review-zfs | RHEL 8.10 / x86_64 | ran 10 tests. 6 tests failed: sanity-lsnapshot, insanity, replay-ost-single, replay-single, sanity-flr, sanit | session |
(defect?) I doubt the UUID should have a linefeed at the end?
LU-18884 osp: use UUIDs instead of NIDs for LWP setup The osp when setting up LWP uses NIDs instead of UUIDs for LCFG_SETUP. This is wrong and NIDs can easily over flow the obd_uuid structure. A side effect of this mistake is that the ptlrpc conn to UUID mapping just ends up being a NID looking up a NID which happens to be itself. That is very wrong. Replace using an NID with a real UUID. Test-Parameters: env=FORCE_LARGE_NID=true,LOAD_MODULES_REMOTE=true Change-Id: I1e08a9475a8dddcfd7f212b6a1b37559c00bf84e Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-5960 lnet: add in functionality of lctl to DLC One of the barriers to moving from lctl to lnetctl is the lack of certain functionality. This patch adds some of the feature that are missing back. The following commands have been added: . show peers . add peer . del peer . show connections . close connection . push connection Besides adding in the missing pieces I have added new features such as filtering the listing of peer or connections based on properties such as NID,PID or even LNet type (e.g o2ib1) to the lnetconfig library. From the lnetctl command line one can call lnetctl peer show --nid 10.0.0.1@tcp and it will only show that specific peer. Listing of a grouping of peers is also possible with for example lnetctl peer show --nid o2ib12 which will display all peers belong to the o2ib12 net configuration. Lastly the ability to use DNS hostnames was also added. Signed-off-by: Amir Shehata <amir.shehata@intel.com> Signed-off-by: James Simmons <uja.ornl@yahoo.com> Change-Id: Id102e8a6148d9e2ef8c88880df86e237a14c5ebb
LU-6034 lnet: Enable lnetctl to handle checksum settings for LNet Add the ability for lnetctl to query or set the checksum algorithm for an LNet interface. This patch only enables user land side of setting this. Change-Id: I40ec55e73032d24baf3133703efc59d49446d692 Signed-off-by: James Simmons <uja.ornl@yahoo.com>
| unique failing test | history |
|---|---|
| sanity-hsm@ldiskfs+DNE:test_113a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-hsm@ldiskfs+DNE:test_113b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-hsm@ldiskfs+DNE:test_113c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-hsm@ldiskfs+DNE:test_113d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-hsm@zfs:test_113a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-hsm@zfs:test_113b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-hsm@zfs:test_113c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-hsm@zfs:test_113d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| 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 11 tests. 1 tests failed: sanity-hsm. | session |
| review-dne-part-4 | CentOS 7.0/x86_64 | ran 10 tests. 2 tests failed: sanity-flr, sanity-pfl. | session |
| review-dne-selinux | CentOS 7.0/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-1 | CentOS 7.0/x86_64 | ran 6 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 crashed | CentOS 7.0/x86_64 | ran 12 tests. 2 tests failed: sanity-flr, replay-single. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs | CentOS 7.0/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-arm | CentOS 7.0/x86_64, CentOS 8.0/aarch64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-zfs | CentOS 7.0/x86_64 | ran 8 tests. 1 tests failed: sanity-flr. | session |
LU-6081 hsm: adding migration support Currently file migration is done by "lfs migrate". This has a couple problems. It doesn't scale well to large files and/or large number of files to copy. If an external tool (such as Robinhood) wants to migrate a file, it has to spawn lfs to do the job, for every file, which has a large overhead, or copy the file itself. A solution to this issue is to move the copy operation into the HSM copytool. The copytool already knows how to copy files, and Lustre has control over these files. Migrating a file, from an application point of view, becomes more or less the same as archiving a file. Since the file copy is done by the copytool, this copy can be optimized in one place. This patch adds the ability for HSM to migrate a file within a single Lustre filesystem. The posix copytool is enhanced to support the file migration, and the lfs migrate command now supports that option with --hsm and -a flags. HPE-bug-id: LUS-5669 Signed-off-by: Ben Evans <beevans@whamcloud.com> Change-Id: Id72db5acb3f84292b081efac4657520f0054778b
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 crashed | CentOS 8.3/x86_64 | ran 7 tests. 1 tests failed: sanity-sec. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-selinux-ssk-part-2 crashed | CentOS 8.3/x86_64 | ran 7 tests. 1 tests failed: sanity-sec. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-2 crashed | CentOS 8.3/x86_64 | ran 7 tests. 1 tests failed: sanity-sec. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-arm crashed | CentOS 8.3/aarch64, CentOS 8.3/x86_64 | ran 6 tests. 1 tests failed: sanity-sec. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-ubuntu | CentOS 8.3/x86_64, Ubuntu 20.04/x86_64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
LU-10756 ptlrpc: send uevents when import state changes When the import for a client changes state such as when the client is evicted send a uevent to make user land so it can be aware that the import state has changed. This allows the use of udev rules to perform site specific actions. Change-Id: I959700f13bca9ee7889244e1cf75eda4d128c8ca Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-101 | CentOS 7.0/x86_64, RHEL 7.6/x86_64 | ran 5 tests. 1 tests failed: sanity-hsm. | session |
| review-dne-part-2 | CentOS 7.0/x86_64 | ran 12 tests. 1 tests failed: sanity-hsm. | session |
| review-dne-zfs-part-2 | CentOS 7.0/x86_64 | ran 12 tests. 1 tests failed: sanity-hsm. | session |
LU-7659 hsm: Use netlink for KUC communication Make communications between MDC and copytools rely on asynchronous netlink communications instead of pipe based communication. Currently how the communications is done is considered incorrect as described here: https://www.linuxjournal.com/article/8110 This new netlink API uses generic netlink to avoid taking a dedicated netlink family number. Kernel now initiates communication by creating socket at module load time and message sending from kernel has changed from synchronous vfs writing to asynchronous netlink sending. As for now, copytools subscribe to both netlink & KUC groups. Copytools registration still rely on ioctls to populate KUC groups, but no more file descriptors are sent to the kernel to perform VFS writing. Change-Id: I777a24831ad3ef4bdb2be6deb57ed45be91bcf9e Test-Parameters: testlist=sanity-hsm clientcount=3 osscount=2 mdscount=2 Signed-off-by: Yohan Pipereau <yohan.pipereau.ocre@cea.fr>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | CentOS 7.0/x86_64 | ran 8 tests. 1 tests failed: sanity. | session |
LU-11234 lod: add data placement policy (DPP) for OST pools
This patch provides a mechanism to place files into different pools according
to filename, jobid, fsuid, fsgid, projid and client nid. filename and jobid
support the qualifier '*'. Fsuid, fsgid, projid and client nid support range
expression. This feature is useful when Lustre is built up with different type
of devices, such as OSTs composed of SSDs and disks. To use this feature, the
same type of OSTs firstly make up one pool and DPP rules are added to
the system. Then, when handling file creation, MDT checks the operation
according to the predefined DPP rules, and put the file's object(s) into the
corresponding pool.
The usage of the rule is similar to NRS TBF. Commands for the rule are like:
Add a rule named "rule_sourcecode" according to which filename matching "*.c"
or "*.h" will be put into the pool named "pool0"
lctl set_param lod.*.dpp=\
"add rule_sourcecode pool={pool0} fname={*.h *.c}"
Add a rule named "rule_vip_users" according to which files with uid = 500 or
uid = 100 will be put into the pool named "pool1"
lctl set_param lod.*.dpp=\
"add rule_vip_users pool={pool1} uid={500 1000}"
Add a rule named "rule_vip_groups" according to which files with gid = 500 or
gid = 1000 will be put into the pool named "pool2"
lctl set_param lod.*.dpp=\
"add rule_vip_groups pool={pool2} gid={500 1000}"
Add a rule named "rule1" according to which files with projid between 500 and
600 or between 800 and 1000 will be put into the pool named "pool2"
lctl set_param lod.*.dpp=\
"add rule1 pool={pool2} projid={500-600 800-1000}"
Add a rule named "vip_client" according to which files creation from client
with nid of 10.0.0.200@tcp will be put into the pool named "pool3"
lctl set_param lod.*.dpp=\
"add vip_client pool={pool3} nid={10.0.0.200@tcp}"
It also supports complex rules. The following command will add a rule which
will put files that match any condition of 1) its uid is 500 and gid is 1000,
or 2) it has a suffix of ".h" or ".c" into the pool named "pool4"
lctl set_param lod.*.dpp=\
"add rule2 pool={pool4} uid={500}&gid={1000},fname={*.c *.h}"
Delete a rule named "rule1"
lctl set_param lod.*.dpp="del rule1"
This patch also combines the command parse functions that are shared with NRS TBF
and pcc codes.
Change-Id: Ie4876a78adcc561f79005817433a7bbdf5fbc65b
Signed-off-by: Teddy Zheng <teddy@ddn.com>
Signed-off-by: Li Xi <lixi@ddn.com>
LU-11058 obd: manage checksum state Currently the checksum dump, checksum tunable and the checksum mount options don't affect each other. With this patch: 1) mount option checksum/nochecksum will turn on or off both checksumming and checksum dump. Additionally it will control access to all checksum related sysfs files. 2) Disabling the checksums sysfs file will also disable checksum_dump as well as prevent enabling checksum_dump. Change-Id: I0781cda49933b0f9f19f968ca211872ab3b34692 Signed-off-by: James Simmons <uja.ornl@yahoo.com>
LU-10026: Configuration for compression support and lz4 module backport This patch adds build system changes for compression: - If lz4 is not available in the kernel (< 3.11), we build a private module for it. - Always build compression module except when ldiskfs is enabled. - An option cl_compression, settable via lctl, enables or disables compression. Change-Id: I7f843ed7ca822a3f3246bd5c3e4ccb6e6f0ec90f Test-Parameters: forbuildonly, fstype=zfs Signed-off-by: Anna Fuchs <anna.fuchs@informatik.uni-hamburg.de>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-4 | RHEL 9.3/x86_64 | ran 9 tests. 1 tests failed: sanity-hsm. | session |
| review-dne-zfs-part-4 | RHEL 8.9/x86_64 | ran 9 tests. 1 tests failed: sanity-hsm. | session |
LU-8585 utils: enable fileset use with liblustreapi HSM handling Currently using the special .lustre/fid/X path doesn't work with filesets but the llapi_fid_* API in liblustreapi does. Move the HSM handling in liblustreapi to the llapi_fid_* handling. While sites that need to use fileset can create their own copy agent that uses the llapi_fid_* most sites are reluctant to replace liblustreapi with their own version that can work with fileset. Note sanity-hsm test will not work FILESET since the copy agent for testing will not be updated to use the llapi_fid_* API. Change-Id: Iaa37d0c585f84c15769e415e0fd73be7b25dd296 Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-9897 zfs: migrate autoconf detection to pkgconfig Currently we have extra complexity to determine where packages are installed. This approach is also fragile if packages are not installed in the standard location. This can be handled in a much cleaner way with pkgconfig. Update ZFS handling to use its supplied pkgconfig files it provides. Test-Parameter: trivial Change-Id: I752997a940b0a8c56772bd737f42a5acbd010abb Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-11380 utils: split llapi_fid2path() in three functions Split llapi_fid2path() into separate llapi_lufid2path() to avoid hoop jumping in the next patch that adds llapi_lufid2parent(). Add helper llapi_fsname_open() to open a descriptor on a filesystem by fsname or directory for llapi_lufid2path() and other functions. Use it in "lfs fid2path" to fix bug when passed a non-mount directory. Add ability to run a single subtest of llapi_fid_test with the "-o" option, or to exclude a single test with "-e" to speed up debugging. Signed-off-by: Andreas Dilger <adilger@whamcloud.com> Change-Id: I05abfaf888a5474d62feebab4e8db543b93ebbe5
LU-10968 hsm: create external HSM queue interface Add more, consistent, information to messages including HSM action. Create an interface for an external HSM queue Create a demonstration external HSM coordinator Create llapi calls for external cdt to communicate with Lustre sanity-hsm can be set to use an external coordinator by specifying COORDINATOR=external on the command line You must run the external coordinator on the MDS Handles all current HSM activities. No changes to any other programs are needed. Signed-off-by: Ben Evans <beevans@whamcloud.com> Signed-off-by: James Simmons <jsimmons@infradead.org> Cray-bug-id: LUS-5990 Test-Parameters: env=COORDINATOR=external testlist=sanity-hsm Change-Id: I2cbd2f8b641d8fdca427d6de82f58af58be4a477
| unique failing test | history |
|---|---|
| conf-sanity2@ldiskfs+DNE:test_48 | seen in 1 other review |
| conf-sanity2@ldiskfs+DNE:test_66 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity2@ldiskfs+DNE:test_68 | NEW 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_103 | NEW 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_108b | seen in 1 other review |
| conf-sanity3@ldiskfs+DNE:test_109a | NEW 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_109b | NEW 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_112 | seen in 2 other reviews |
| conf-sanity-slow@ldiskfs+DNE:test_32a | seen in 2 other reviews |
| conf-sanity-slow@ldiskfs+DNE:test_32d | seen in 2 other reviews |
| conf-sanity-slow@ldiskfs+DNE:test_32e | seen in 2 other reviews |
| conf-sanity3@zfs:test_103 | NEW 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_108a | seen in 1 other review |
| conf-sanity3@zfs:test_112 | seen in 1 other review |
| conf-sanity3@zfs:test_117 | seen in 6 other reviews |
| conf-sanity3@zfs:test_123aa | seen in 6 other reviews |
| conf-sanity3@zfs:test_123ab | seen in 6 other reviews |
| conf-sanity3@zfs:test_123ac | seen in 6 other reviews |
| conf-sanity3@zfs:test_123ad | seen in 6 other reviews |
| conf-sanity3@zfs:test_123ae | seen in 5 other reviews |
| conf-sanity3@zfs:test_123F | seen in 5 other reviews |
| conf-sanity-slow@zfs:test_32a | seen in 2 other reviews |
| conf-sanity-slow@zfs:test_32d | seen in 2 other reviews |
| conf-sanity-slow@zfs:test_32e | seen in 2 other reviews |
| ost-pools@ldiskfs+DNE:test_1a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_1b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_1c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_1m | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_1n | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_2c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_2d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_2e | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_3d | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_4c | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_5a | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_5b | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_6 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_7a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_7c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_11 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_15 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_16 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_17 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_18 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_19 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_20 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_21 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_22 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_23a | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_23b | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_24 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_25 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_27 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_28 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_1a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_1b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_1c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_1m | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_1n | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_2c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_2d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_2e | seen in 1 other review |
| ost-pools@zfs:test_3d | seen in 1 other review |
| ost-pools@zfs:test_4c | seen in 1 other review |
| ost-pools@zfs:test_5a | seen in 1 other review |
| ost-pools@zfs:test_5b | seen in 1 other review |
| ost-pools@zfs:test_6 | seen in 1 other review |
| ost-pools@zfs:test_7a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_7c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_11 | seen in 1 other review |
| ost-pools@zfs:test_15 | seen in 1 other review |
| ost-pools@zfs:test_16 | seen in 1 other review |
| ost-pools@zfs:test_17 | seen in 1 other review |
| ost-pools@zfs:test_18 | seen in 1 other review |
| ost-pools@zfs:test_19 | seen in 1 other review |
| ost-pools@zfs:test_20 | seen in 1 other review |
| ost-pools@zfs:test_21 | seen in 1 other review |
| ost-pools@zfs:test_22 | seen in 1 other review |
| ost-pools@zfs:test_23a | seen in 1 other review |
| ost-pools@zfs:test_23b | seen in 1 other review |
| ost-pools@zfs:test_24 | seen in 1 other review |
| ost-pools@zfs:test_25 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_27 | seen in 1 other review |
| ost-pools@zfs:test_28 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@ldiskfs+DNE:test_27Ce | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@ldiskfs+DNE:test_27D | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@ldiskfs+DNE:test_27G | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@ldiskfs+DNE:test_27I | seen in 1 other review |
| sanity1@ldiskfs+DNE:test_27L | seen in 1 other review |
| sanity1@ldiskfs+DNE:test_27M | seen in 1 other review |
| sanity1@ldiskfs+DNE:test_56wb | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_65n | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_134a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_134b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_140 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_150 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_151 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_154A | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_154B | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_154a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_154b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_154f | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_154g | seen in 5 other reviews |
| sanity2@ldiskfs+DNE:test_155e | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_155f | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_155g | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_155h | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_156 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160d | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160e | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160f | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160g | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160h | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160i | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160j | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160k | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_161a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_161b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_161c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_161d | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_162a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_162b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_162c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_169 | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_180a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_181 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_183 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_185 | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_185a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_187a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_187b | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_200 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_204a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_204b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_204c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_204d | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_204e | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_204f | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_204g | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_204h | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_208 | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_218 | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_220 | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_222a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_222b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_223 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_224c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_226a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_226b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_228a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_228b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_228c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_229 | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_230a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_230b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_230c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_230d | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_230e | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_230f | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_230i | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_230j | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_230l | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_230m | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_231a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_232a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_232b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_233a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_233b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_238 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_240 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_241b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_242 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_243 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_244a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_244b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_248b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_250 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_252 | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_257 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_270a | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_270b | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_270c | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_270d | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_270e | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_270f | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_271c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_271f | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_272a | seen in 4 other reviews |
| sanity2@ldiskfs+DNE:test_272b | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_272c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_272d | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_272e | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_272f | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_275 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_277 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300d | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300e | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300f | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300g | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300h | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300i | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300j | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300k | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300l | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300n | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300q | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300r | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_310a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_310b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_311 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_313 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_314 | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_315 | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_316 | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_317 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_318 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_319 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_399b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_402 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_406 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_409 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_412 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_413a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_413b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_415 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_417 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_418 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_421a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_421b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_421c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_421d | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_421e | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_421f | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_421g | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_422 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_423 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_801a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_801b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_801c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_803 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_804 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_806 | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_807 | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_808 | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_809 | seen in 4 other reviews |
| sanity2@ldiskfs+DNE:test_810 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_812a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_812b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_816 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_817 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_818 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_820 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_901 | seen in 1 other review |
| sanity1@zfs:test_27Ce | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@zfs:test_27D | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@zfs:test_27G | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@zfs:test_27I | seen in 1 other review |
| sanity1@zfs:test_27L | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@zfs:test_27M | seen in 1 other review |
| sanity1@zfs:test_56wb | seen in 1 other review |
| sanity-flr@ldiskfs+DNE:test_204f | NEW 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_204f | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_3 | seen in 1 other review |
| sanity-quota@ldiskfs+DNE:test_5 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_6 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_7a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_7b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_7c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_12a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_16 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_17 | seen in 1 other review |
| sanity-sec@ldiskfs+DNE:test_18 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_19 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_20 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_21 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_22 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | CentOS 7.0/x86_64 | ran 8 tests. 1 tests failed: sanity. | session |
| review-dne-part-2 | CentOS 7.0/x86_64 | ran 11 tests. 3 tests failed: sanity-sec, ost-pools, runtests. | session |
| review-dne-part-3 | CentOS 7.0/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-4 | CentOS 7.0/x86_64 | ran 14 tests. 6 tests failed: insanity, replay-ost-single, sanity-quota, sanity-flr, sanity-pfl, replay-singl | session |
| review-dne-zfs-part-1 | CentOS 7.0/x86_64 | ran 8 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-2 | CentOS 7.0/x86_64 | ran 11 tests. 1 tests failed: ost-pools. | session |
| review-dne-zfs-part-3 | CentOS 7.0/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-4 | CentOS 7.0/x86_64 | ran 16 tests. 4 tests failed: sanity-quota, sanity-flr, sanity-pfl, replay-single. | session |
| review-ldiskfs | CentOS 7.0/x86_64 | ran 7 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-arm | CentOS 7.0/x86_64, CentOS 8.0/aarch64 | ran 7 tests. 1 tests failed: sanity. | session |
| review-zfs | CentOS 7.0/x86_64 | ran 9 tests. 2 tests failed: replay-single, sanity-flr. | session |
LU-8066 obd: remove server sysfs symlinks handling Before the lustre 2.4 OSD work the lov and osc code was used on both servers and clients. With the OSD layer work we saw the new lod and osp layers created that are server specific. To avoid breakage symlinks were created that went from the lod / osp to lov / osc directories in the proc tree on the server side. This required some extra complex code to handle this. It has been a very long time since that change so we can now safely remove all the extra symlink handling to make life easier. Change-Id: I41fd5abab3d648db6d4fa1a355bd7147a34ee478 Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | CentOS 7.0/x86_64 | ran 11 tests. 6 tests failed: sanity-pcc, large-scale, mds-survey, sanity-sec, sanity-lfsck, sanity-scrub. | session |
| review-dne-part-3 | CentOS 7.0/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-4 | CentOS 7.0/x86_64 | ran 10 tests. 8 tests failed: insanity, replay-ost-single, sanity-quota, sanity-dom, sanity-flr, sanity-pfl, | session |
| review-dne-zfs-part-2 | CentOS 7.0/x86_64 | ran 11 tests. 6 tests failed: sanity-pcc, large-scale, mds-survey, sanity-sec, sanity-lfsck, sanity-scrub. | session |
| review-dne-zfs-part-3 | CentOS 7.0/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-4 | CentOS 7.0/x86_64 | ran 10 tests. 1 tests failed: mmp. | session |
LU-8066 mgc: remove no longer needed class_del_profiles() While cleaning up obd_type handling some code to handle lustre 1.14 was found in mgc_cleanup(). This code is obsolete so lets remove class_del_profiles() handling. Change-Id: Ib1e9f9cec060667972b9fa97b1a737f7dbe7edfe Signed-off-by: James Simmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| sanity-flr@ldiskfs+DNE:test_212 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| sanity-flr@zfs:test_212 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: sanity. | session |
| review-dne-part-1 | RHEL 9.3 / x86_64 | ran 4 tests. 1 tests failed: sanity. | session |
| review-dne-part-4 | RHEL 9.3 / x86_64 | ran 9 tests. 1 tests failed: sanity-flr. | session |
| review-dne-part-4 | RHEL 8.10 / x86_64 | ran 9 tests. 1 tests failed: sanity-flr. | session |
| review-dne-part-7 crashed | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-7 crashed | RHEL 9.3 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-flr. | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-4 | RHEL 8.10 / x86_64 | ran 9 tests. 1 tests failed: sanity-flr. | session |
| review-dne-zfs-part-7 crashed | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-flr. | session |
| review-ldiskfs | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, SLES 15.5 / x86_64 | ran 5 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 | RHEL 9.4 / 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. 2 tests failed: sanity-lnet, sanity. | session |
| review-zfs | RHEL 8.10 / x86_64 | ran 8 tests. 1 tests failed: sanity-flr. | session |
LU-14319 layout: make foreign layout as a mirror component A closer coupling between the HSM archive state/PCC-RW/PCC-RO (a kind of a foreign layout) and Lustre File Level Redundancy (FLR) can make PCC and HSM management more consistent with the management of other replicas in the file system. This patch adds the basic support to store foreign layout as a FLR mirror component. Signed-off-by: Qian Yingjin <qian@ddn.com> Change-Id: Ic4d699bc512599438a5ef2c1a300099494de1aed
I am nto sure where exactly ther's some sort of a calculation error, but I have a whole bunch of this message triggering for seemingly random prints all around (tend to be longish)in master-next (this is where I am carrying this patch for a while) even though this patch itself did nto trigger it. Example: http://testing.linuxhacker.ru/lustre-reports/35860/testresults/sanity2-ldiskfs-DNE-centos7_x86_64-centos7_x86_64/oleg342-server-console.txt [ 2711.693691] Lustre: DEBUG MARKER: == sanity test 103e: inheritance of big amount of default ACLs ========================================================== 15:41:10 (1695584470) [ 2930.646958] Lustre: lustre-MDT0000: Client 229219ca-e0b5-499a-9ab0-176123ac3994 (at 192.168.203.42@tcp) reconnecting [ 3211.379426] Lustre: format at ldlm_lib.c:3286:target_send_reply_msg doesn't end in newline [ 3211.806304] Lustre: format at service.c:2323:ptlrpc_server_handle_request doesn't end in newline [ 3211.984069] Lustre: format at ldlm_resource.c:1799:ldlm_resource_dump doesn't end in newline [ 3212.219257] Lustre: format at ldlm_resource.c:1660:ldlm_resource_add_lock doesn't end in newline
LU-14428 libcfs: replace tracefile buffer with ring_buffer Linux has a generic ring-buffer API which uses minimal locking and allows entries to be appended from any context. This is essentially the same functionality provided by trace_data abstraction in tracefile.c, though with less locking overhead. This patch removes the trace_data support and switches to use ring_buffer. The API functionality is not identical so some adjustments need to be made. In particular once an entry in the log has been reserved, it is not possible to reduce the size of the reservation, only to use it or discard it, where discarding might result in the space being wasted in the rare case that more space is reserved from a different context (e.g. interrupt). So instead we use a modest sized on-stack buffer to hold the formatted result, and strcpy() that to a ring_buffer. If the on-stack buffer isn't big enough (approximately 20% of messages in some testings) we need to format a second time, though we do that less often than the current code. The strcpy should be fast compared to vsprintf so this should be a net win. ring_buffer doesn't record whether a message was generated in interrupt or process context and the information is not generally useful, so that field in the ptldebug_header is now always set to zero. The pages stored in ring_buffer are not the same format as are expected by user-space, so we cannot extract whole pages and copy them to the file, but instead extract individual entries and write them to the file. Similarly, pages cannot be moved to the daemon_list, but the contents need to be copied. Also discard libcfs_debug_binary as it is ALWAYS 1 and the code would be buggy if it were zero. Signed-off-by: Mr NeilBrown <neilb@suse.de> Change-Id: Iab259c0538e970f5a77d15c453d72bf378c59c32
LU-14439 utils: skip server mount libs on client Do not include ldiskfs or zfs files in the Makefile when "./configure --disable-server" is used, or if configure does not detect any server-side support. Move server-side utilities under server conditionals. Test-Parameters: trivial Signed-off-by: Andreas Dilger <adilger@whamcloud.com> Change-Id: I244e10dfaee3470e9ad48e78dcb8d0d18f3ebbe5
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-102 | CentOS 8.3/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
LU-14799 test: setup and tear down stand alone MGS for conf-sanity While running conf-sanity I found if I have a stand alone MGS server it doesn't even run. For setup() just start the MGS server if stand alone and shut down the stand alone MGS when stop_mds() is called just in case someone forgets to call stop_mgs(). Test-Parameters: trivial testlist=conf-sanity Test-Parameters: standalonemgs=true testlist=conf-sanity Change-Id: Ifc8794e2c9fbb489183e4f205f0b8b9766e13160 Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | CentOS 8.3/x86_64 | ran 7 tests. 2 tests failed: runtests, replay-dual. | session |
| review-dne-part-4 | CentOS 8.3/x86_64 | ran 9 tests. 1 tests failed: sanity-flr. | session |
| review-dne-part-5 | CentOS 8.3/x86_64 | ran 6 tests. 1 tests failed: sanityn. | session |
| review-dne-zfs-part-4 | CentOS 8.3/x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
| review-zfs | CentOS 8.3/x86_64 | ran 8 tests. 1 tests failed: sanity-quota. | session |
LU-15030 osp: add debugfs for sync progress During sync between MDT and OSTs, it could need much more time if the load on OST is very high, it will be better to have some some kind of debugfs interface to know the sync progress and make sure the sync is moving forward. Signed-off-by: Hongchao Zhanng <hongchao@whamcloud.com> Change-Id: Id24f3a481c5d28b7dc9714a80905541c88cf0f5a
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 8.8/x86_64 | ran 6 tests. 2 tests failed: sanity-pfl, sanity. | session |
| review-dne-part-2 | RHEL 8.8/x86_64 | ran 13 tests. 4 tests failed: sanity-sec, sanity-lfsck, runtests, replay-dual. | session |
| review-dne-part-3 | RHEL 8.8/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-4 | RHEL 8.8/x86_64 | ran 13 tests. 3 tests failed: sanity-quota, mmp, insanity. | session |
| review-dne-part-5 | RHEL 8.8/x86_64 | ran 8 tests. 2 tests failed: sanityn, sanity-scrub. | session |
| review-dne-part-6 | RHEL 8.8/x86_64 | ran 6 tests. 2 tests failed: ost-pools, replay-single. | session |
| review-dne-part-7 | RHEL 8.8/x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-part-8 | RHEL 8.8/x86_64 | ran 4 tests. 1 tests failed: replay-dual. | session |
| 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 7 tests. 2 tests failed: sanity-selinux, sanity-sec. | session |
| review-dne-zfs-part-1 | RHEL 8.8/x86_64 | ran 6 tests. 2 tests failed: sanity-pfl, sanity. | session |
| review-dne-zfs-part-2 | RHEL 8.8/x86_64 | ran 13 tests. 4 tests failed: sanity-sec, sanity-lfsck, runtests, replay-dual. | session |
| review-dne-zfs-part-3 | RHEL 8.8/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-4 | RHEL 8.8/x86_64 | ran 13 tests. 3 tests failed: sanity-quota, mmp, insanity. | session |
| review-dne-zfs-part-5 | RHEL 8.8/x86_64 | ran 8 tests. 2 tests failed: sanityn, sanity-scrub. | session |
| review-dne-zfs-part-6 | RHEL 8.8/x86_64 | ran 6 tests. 2 tests failed: ost-pools, replay-single. | session |
| review-dne-zfs-part-7 | RHEL 8.8/x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
| review-ldiskfs | RHEL 8.8/x86_64 | ran 7 tests. 2 tests failed: sanity-lnet, sanity. | session |
| review-ldiskfs | RHEL 9.2/x86_64 | ran 7 tests. 2 tests failed: sanity-lnet, sanity. | session |
| review-ldiskfs | RHEL 8.8/x86_64, SLES 15.4/x86_64 | ran 7 tests. 2 tests failed: sanity-lnet, sanity. | session |
| review-ldiskfs | RHEL 8.8/x86_64, SLES 15.5/x86_64 | ran 7 tests. 2 tests failed: sanity-lnet, sanity. | session |
| review-ldiskfs | RHEL 8.8/x86_64, RHEL 9.2/x86_64 | ran 7 tests. 2 tests failed: sanity-lnet, sanity. | session |
| review-ldiskfs-arm | RHEL 8.8/aarch64, RHEL 8.8/x86_64 | ran 10 tests. 3 tests failed: sanity-sec, sanity-lnet, sanity. | session |
| review-zfs | RHEL 8.8/x86_64 | ran 18 tests. 6 tests failed: sanity-lsnapshot, insanity, replay-ost-single, replay-single, sanity-flr, sanit | session |
LU-12514 ptlrpc: move thread creation out of module initialization When the ptlrpc module is loaded, it calls ptlrpc_init_portals() which starts ptlrpcd threads, and starts the pinger work-queue. We don't need these threads until the module is actually being used, such as when a lustre filesystem is mounted. So move the thread creation into new ptlrpc_inc_ref() (modelled on ptlrpcd_incref()), and call that when needed, such as at mount time. Linux-commit: 26f7a294e5ecd46856cb9f5b718e995f1ec46779 Linux-commit: ffd87a7b1efeb8f56a229d2ab06d71be7d932d52 Change-Id: Iee077c7dfdeb67ceeeacefc4e6c7f70efef2a864 Signed-off-by: Mr. NeilBrown <neilb@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
LU-9897 build: add real versioning to liblustreapi Originally we added -version-info to increment liblustreapi version every time a new abi was added or changed. This never happened so lets number liblustreapi based the Lustre sovftware version. Test-Parameters: trivial Change-Id: I9f638c0a95b72329325b774d23f73239fcbade03 Signed-off-by: James Simmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| conf-sanity3@ldiskfs+DNE:test_76a | NEW 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_76a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-4 | RHEL 8.10 / x86_64 | ran 9 tests. 3 tests failed: sanity-quota, sanity-flr, replay-ost-single. | session |
| review-dne-part-4 | RHEL 9.4 / x86_64 | ran 9 tests. 3 tests failed: sanity-quota, sanity-flr, replay-ost-single. | session |
| review-dne-part-5 | RHEL 9.4 / x86_64 | ran 6 tests. 2 tests failed: sanityn, recovery-small. | session |
| review-dne-part-5 | RHEL 8.10 / x86_64 | ran 6 tests. 1 tests failed: recovery-small. | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: recovery-small. | session |
| review-dne-zfs-part-4 | RHEL 8.10 / x86_64 | ran 9 tests. 3 tests failed: sanity-quota, sanity-flr, replay-ost-single. | session |
| review-dne-zfs-part-5 | RHEL 8.10 / x86_64 | ran 6 tests. 1 tests failed: recovery-small. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
| review-zfs | RHEL 8.10 / x86_64 | ran 10 tests. 3 tests failed: replay-ost-single, sanity-flr, sanity-quota. | session |
LU-2096 sysfs: symlinks for forward compatibility
Currently, the "ofd" device is still named "obdfilter" in the Lustre
configuration and in /sys/fs/lustre. It would be better to name it
"ost" which is has been the long term goal.
The per-OST device statistics should really be under "ost/{target}",
like the per-MDT statistics are under "mdt/{target}" already in 2.x.
Similarly, the "OSS" statistics have always been under "ost/OSS", but
would be better in their own "oss" subdirectory much like what is done
for "MDS" statistics.
Add symlinks for "oss -> ost/OSS" and "ost -> obdfilter" to keep
older compatibility. In time we can remove those symlinks.
Change-Id: I8c4c81eb55f2880edf1d7811395c4837f50e01d5
Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-101 crashed | CentOS 7.0/x86_64 | ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-1 crashed | CentOS 7.0/x86_64 | ran 8 tests. 2 tests failed: recovery-small, sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-1 crashed | CentOS 7.0/x86_64 | ran 8 tests. 3 tests failed: recovery-small, sanityn, sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | CentOS 7.0/x86_64 | ran 6 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-arm | RHEL 7.6/aarch64, RHEL 7.6/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
LU-10937 sptlrpc: make srpc_info writable Lustre allows tuning of many nodes from the MGS server. Their are two ways to do this and currently sptlrpc can only be set by one method. This patch enables the other approach of setting the sptlrpc by making the debugfs file srpc_info writable which can now accept new configurations. Test-Parameters: envdefinitions=SHARED_KEY=true testlist=sanity,recovery-small,sanity-sec Change-Id: If8ca36dbfce20c13ab603835cf5d77fbc19de7a8 Signed-off-by: James Simmons <uja.ornl@yahoo.com> Signed-off-by: Sebastien Buisson <sbuisson@ddn.com>
| failed enforced test | platform | detail | |
|---|---|---|---|
| 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 |
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
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-1 | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-2 | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-3 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-3 | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-4 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-4 | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-5 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-5 | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-6 | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-6 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-7 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-7 | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-8 | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-8 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-3 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-4 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-5 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-6 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-7 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-ldiskfs | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-ldiskfs | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-ldiskfs | RHEL 8.10 / x86_64, RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-ldiskfs | RHEL 8.10 / x86_64, SLES 15.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-zfs | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
LU-18041 msg: use UUIDs instead of NIDs for client setup For client setups we are sending NID strings instead of actual UUIDs. This is incorrect. Change-Id: I7ebd1bfe29a5e59c989b9fa5e4166f19cb2336ce Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-11621 utils: optimize lustre_rsync with copy_file_range() Newer kernels and glibc offer copy_file_range() which avoids a context switch needed with read() + write() for file data copying. In the future Lustre can look to optimize this copy on the server backend. Updating lustre_rsync to use this new functionality which should give a performance boost. Test-Parameters: trivial testlist=lustre-rsync-test Change-Id: Ibd67847f8d876075f77e14e2721d22d4905cb9ff Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 crashed | RHEL 9.3 / x86_64 | ran 9 tests. 1 tests failed: sanity-lfsck. %% THIS TEST SESSION CRASHED %% | session |
This (and also below) is a little odd. If timeout is -1 - so nothing in set_requests lists, then timeout is 1. If timeout is zero - all requests have expired - them timeout is 0. It would make sense to me for those to both be the same. Could we make it " < 0 ? 0 : timeout" ??
Yes I think that should be fine.
Hmm. this seems to be a problem.
LU-15073 ptlrpc: An expired request isn't marked timedout New requests can be added to pc_set. It will receive wakups and timeout can never occur. Perform check for expired requests on each round before ptlrpcd_check(). HPE-bug-id: LUS-8784 Signed-off-by: Andriy Skulysh <c17819@cray.com> Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: I46f7ab1812601b1c3a78b62a41a578cdac568bd5
LU-12251 tests: re-enable running sanity-flr for PPC Its been a long time since PPC had issues with FLR test. Re-enable those test. We do keep test 50a disabled since it fails on ARM and PPC platforms. Test-Parameters: trivial clientarch=ppc64 testlist=sanity-flr Change-Id: Ia1007f6213b530d4a5695ff6143be14ac2736a6c Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-12252 tests: re-enable running sanity-hsm for PPC Its been a long time since PPC had issues with HSM test. Re-enable those test. Test-Parameters: trivial clientdistro=el8.6 clientarch=ppc64le testlist=sanity-hsm Change-Id: Ibe18524f6a1a92b66a2b6f9454374910761e8344 Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-102 failed 2× | CentOS 7.9/x86_64, RHEL 8.7/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
LU-0000 test: base code test patch on this Test-Parameters: trivial testlist=sanity-lnet Test-Parameters: serverversion=2.12 serverdistro=el7.9 testlist=runtests Test-Parameters: clientversion=2.12 testlist=runtests Change-Id: Ic52e9934283f34fc635d41a656b6cc0dff088a58 Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 9.3/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-4 | RHEL 9.3/x86_64 | ran 9 tests. 1 tests failed: replay-ost-single. | session |
| review-dne-part-8 | RHEL 9.3/x86_64 | ran 4 tests. 1 tests failed: replay-dual. | session |
LU-17060 tests: verify conf-sanity 21c passes Make sure patch 52053 fixes the issue. Test-Parameters: testlist=conf-sanity env=ONLY=21c,ONLY_REPEAT=100 Change-Id: I1092c90b15d0cdc464e251dc07ea310828ce4d15 Signed-off-by: James Simmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| conf-sanity1@ldiskfs+DNE:test_1 | seen in 5 other reviews |
| conf-sanity1@ldiskfs+DNE:test_2 | seen in 8 other reviews |
| conf-sanity1@ldiskfs+DNE:test_3 | seen in 12 other reviews |
| conf-sanity1@ldiskfs+DNE:test_4 | seen in 18 other reviews |
| conf-sanity1@ldiskfs+DNE:test_5a | seen in 21 other reviews |
| conf-sanity1@ldiskfs+DNE:test_5c | seen in 16 other reviews |
| conf-sanity1@ldiskfs+DNE:test_5d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@ldiskfs+DNE:test_5e | seen in 19 other reviews |
| conf-sanity1@ldiskfs+DNE:test_5h | seen in 24 other reviews |
| conf-sanity1@ldiskfs+DNE:test_5i | seen in 26 other reviews |
| conf-sanity1@ldiskfs+DNE:test_6 | seen in 28 other reviews |
| conf-sanity1@ldiskfs+DNE:test_7 | seen in 33 other reviews |
| conf-sanity1@ldiskfs+DNE:test_8 | seen in 34 other reviews |
| conf-sanity1@ldiskfs+DNE:test_9 | seen in 36 other reviews |
| conf-sanity1@ldiskfs+DNE:test_10a | seen in 39 other reviews |
| conf-sanity1@ldiskfs+DNE:test_17 | seen in 41 other reviews |
| conf-sanity1@ldiskfs+DNE:test_23a | seen in 12 other reviews |
| conf-sanity1@ldiskfs+DNE:test_23b | seen in 14 other reviews |
| conf-sanity1@ldiskfs+DNE:test_25 | seen in 3 other reviews |
| conf-sanity1@ldiskfs+DNE:test_26 | seen in 4 other reviews |
| conf-sanity1@ldiskfs+DNE:test_27a | seen in 2 other reviews |
| conf-sanity1@ldiskfs+DNE:test_27b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@ldiskfs+DNE:test_28A | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@ldiskfs+DNE:test_28a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@ldiskfs+DNE:test_28b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@ldiskfs+DNE:test_28c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@ldiskfs+DNE:test_29 | seen in 2 other reviews |
| conf-sanity1@ldiskfs+DNE:test_30a | seen in 2 other reviews |
| conf-sanity1@ldiskfs+DNE:test_30b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity-slow@ldiskfs+DNE:test_69 | seen in 6 other reviews |
| sanity2@ldiskfs+DNE:test_134a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_134b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_150a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_150bb | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_150c | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_150d | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_150e | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_150g | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_151 | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_154A | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_154B | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_154a | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_154b | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_154f | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_154g | seen in 8 other reviews |
| sanity2@ldiskfs+DNE:test_154h | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_154i | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_155e | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_155f | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_155g | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_155h | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_156 | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_160a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160e | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160f | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160g | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160h | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160i | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160j | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160k | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160l | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160m | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160n | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160o | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160p | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160q | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160s | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160t | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160u | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_161a | seen in 8 other reviews |
| sanity2@ldiskfs+DNE:test_161b | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_161c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_161d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_162a | seen in 4 other reviews |
| sanity2@ldiskfs+DNE:test_162b | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_162c | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_165b | seen in 4 other reviews |
| sanity2@ldiskfs+DNE:test_165d | seen in 4 other reviews |
| sanity2@ldiskfs+DNE:test_165e | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_169 | seen in 5 other reviews |
| sanity2@ldiskfs+DNE:test_170a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_170b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_172 | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_182b | seen in 5 other reviews |
| sanity2@ldiskfs+DNE:test_183 | seen in 4 other reviews |
| sanity2@ldiskfs+DNE:test_185 | seen in 10 other reviews |
| sanity2@ldiskfs+DNE:test_185a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_187a | seen in 4 other reviews |
| sanity2@ldiskfs+DNE:test_187b | seen in 4 other reviews |
| sanity3@ldiskfs+DNE:test_901 | seen in 1 other review |
| sanity3@ldiskfs+DNE:test_904 | seen in 1 other review |
| sanity3@ldiskfs+DNE:test_905 | seen in 2 other reviews |
| sanity3@ldiskfs+DNE:test_907 | seen in 7 other reviews |
| sanity3@ldiskfs+DNE:test_908b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-1 failed 2× | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-2 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-3 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-3 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-4 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-4 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-5 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-5 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-6 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-6 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-7 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-7 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-8 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-8 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-3 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-4 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-6 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-7 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
LU-18041 msg: use UUIDs instead of NIDs for OSP setup The mgs when processing logs for OSP uses NIDs instead of UUIDs for LCFG_SETUP. This is wrong and NIDs can easily over flow the obd_uuid structure. A side effect of this mistake is that the ptlrpc conn to UUID mapping just ends up being a NID looking up a NID which happens to be itself. That is very wrong. Change from NID string to the real UUID. Test-Parameters: env=FORCE_LARGE_NID=true,LOAD_MODULES_REMOTE=true Change-Id: Ie291b2fd85b6096779d7cf5ee94060edc0e3a590 Signed-off-by: James Simmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| sanity-pcc@ldiskfs+DNE:test_204a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-pcc@zfs:test_204a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-part-7 | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-part-7 | RHEL 9.4 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-zfs-part-7 | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-pcc. | session |
LU-10499 pcc: Add --pin option for 'lfs pcc attach' command If --pin option is provided, 'lfs pcc attach' command will first pin then attach a file. So that user does not need to run them separately. EX-5936 pcc: dont take UPDATE lock when set lustre.pin xattr In this patch, we do not take UPDATE lock whan set lustre.pin XATTR during the PCC pin command. The reason is that it may revoke the combined UPDATE|LAYOUT lock cached on the client namespace, and invalidate the layout and PCC cache. As we disable to cache lustre.pin xattr on the client XATTR cache, so it does not cause problem without taking UPDATE lock bit during set lustre.pin XATTR. Add test case: sanity-pcc/204d. Was-Change-Id: I35a0e399294020efdb0e4710500e8f7b846c290f EX-7395 pcc: use llapi_open_by_fid to check pinned files When check whether a file was pinned in PCC backend, it reported: "cannot read or parse pin xattr of file '/lustre/fsr/.lustre/fid/[0x780001b83:0x2138:0x0]'.: No such file or directory (2)" The failure reason is that open by FID is not configured for subdirectory mounts. In this patch, we use llapi_open_by_fid (which supports for subdirectory mount) to open the file to solve this error. Was-Change-Id: If0120d745418836cfdf449a795b6f524c40f9c27 Change-Id: Iee873821ff5815fd6b56ed8f4c48147f5ef9321f Test-Parameters: testlist=sanity-pcc EX-bug-id: EX-5102 EX-5176 EX-5477 EX-5936 EX-7395 Signed-off-by: Lei Feng <flei@whamcloud.com> Signed-off-by: Qian Yingjin <qian@ddn.com>
| unique failing test | history |
|---|---|
| sanity-lnet@ldiskfs+DNE:test_253 | seen in 1 other review |
| sanity-lnet@ldiskfs+DNE:test_254 | seen in 1 other review |
| sanity-lnet@zfs:test_253 | seen in 1 other review |
| sanity-lnet@zfs:test_254 | seen in 1 other review |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 9.3 / x86_64 | ran 3 tests. 1 tests failed: sanity-lnet. | session |
| review-ldiskfs-dne | RHEL 9.3 / x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
LU-10391 tests: debug ping failures Re-enable failing test. Test-Parameters: trivial testlist=sanity-lnet env=ONLY=253,ONLY_REPEAT=10 Change-Id: I1a55149adbc1413dc26eb004d2832baf96ead3fd Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-6034 lnet: Create a checksum value for LNet package data Using the check sum selected by the adminstrator for a LNet interface check sum the data being handled by the LNet layer. Change-Id: I069fc3a83ec8392174a5b1c6bfe1fca223e3a3af Signed-off-by: James Simmons <uja.ornl@yahoo.com>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-2 crashed | RHEL 9.8 / x86_64 | ran 11 tests. 1 tests failed: sanity-pfl. %% THIS TEST SESSION CRASHED %% | session |
(style) The ldiskfs copy wraps this od_proc_entry cleanup in `#if LUSTRE_VERSION_CODE < OBD_OCD_VERSION(2, 18, 53, 0)` but this one is unguarded. Harmless today, but the two should probably match so the guard can be dropped in one go later.
(defect) Same double-put as in qsd_tunables_init(): this drops the last reference, and then qmt_pool_alloc() does GOTO(out, rc) -> qpi_putref() -> qmt_pool_free() -> qmt_pool_tunables_fini(), which puts qpi_kobj again. Leaving the put to the fini (as dt_tunables_fini() does, gated on qpi_def_attrs) would keep it balanced.
(minor) This limit predates the patch, but it reads differently now that the file lives in sysfs, where writing with `echo` is the normal thing to do: `echo ugp > enabled` is 4 bytes and works, while `echo none > enabled` is 5 and gets -E2BIG. Since the function is being rewritten anyway, sysfs_streq(buffer, "none") plus a slightly larger bound would accept the trailing newline.
(style) Not a bug, but qsd_wait_timeout() returns int and these used to print with %d; %u here and in verion_mismatch_timeout_show() would render a negative value as a huge number. Worth restoring %d if the patch is refreshed.
(defect) On the strscpy() error path in qsd_init(), qsd_dev is still NULL when qsd_fini() gets here, so qsd->qsd_dev->dd_lu_dev is a NULL dereference.
(minor) The type is already known - qsd_tunables_init() is handed the server_name2index() result - so re-deriving it from ld_site->ls_top_dev here means the two halves can disagree. During osd_device_init0() the site's top device is still the OSD itself, so lu_device_is_md() is false even on an MDT and the MD instance's `quota_slave` link is not removed by its own fini. Storing the type (or just a bool) in the qsd_instance would keep create and remove symmetrical.
(defect) This put/wait runs unconditionally, but qsd_tunables_init() is the last thing qsd_init() does, and three earlier failures reach the same cleanup:
qsd_init() -> GOTO(out, ...) -> qsd_fini() -> qsd_tunables_fini()
The strscpy(), server_name2fsname() and qsd_get_fsinfo() failures all land there before qsd_tunables_init() has run, so qsd_kobj and qsd_kobj_unregister are still the zeroed OBD_ALLOC_PTR memory. kobject_put() then WARNs (state_initialized == 0) and never calls the release, and wait_for_completion() adds to a swait_queue_head whose task_list is {NULL, NULL}, which faults in list_add().
dt_tunables_fini(), which this looks modelled on, keeps the put and wait inside `if (dt->dd_def_attrs)` for exactly this reason. Should the same guard be used here?
This is legit and a defect.
(defect) Two problems in this error block: The link is created on the parent, `sysfs_create_link(&dev->dd_kobj, ...)`, so removing it from `&qsd->qsd_kobj` is a no-op and the `quota_slave` link is left behind. After this kobject_put() drops the last reference, qsd_init() still routes through `out:` -> qsd_fini() -> qsd_tunables_fini(), which puts qsd_kobj a second time. That is a refcount underflow on an already-released kobject.
LU-8066 quota: migrate quota out of proc With the upstream kernel requirement of not using procfs move the quota proc entries over to debugfs / sysfs. The simple entries are placed into sysfs and the complex into the debugfs tree. Extend the time to support proc symlink until after the 2.18 LTS release. Now on osd module load the symlink_brw_stats will determine if procfs is setup at all. Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: I003841c4e9131db9ac423763fa817097c09ed83d
| unique failing test | history |
|---|---|
| runtests@ldiskfs+DNE:test_1 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 crashed | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity-sec. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-dne | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-dne | RHEL 9.8 / x86_64 | ran 7 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-dne-arm | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 7 tests. 1 tests failed: sanity. | session |
The body says this handles the replacement of fscrypt_inherit_context(), but all three call sites are still there and unguarded:
lustre/llite/namei.c:1230
lustre/llite/namei.c:1851
lustre/llite/dir.c:537
llcrypt_set_context() is only wired up in one place (ll_new_node_finish() for symlinks); everywhere else the new call is commented out. Should the message say the conversion is partial?
A few hunks aren't accounted for by the description - can they be explained, or split out?
- config/Makefile.exports.in + lnet/libcfs/Makefile + lustre_compat/fs/crypto/Makefile: switching the llcrypt build gate from a config.h grep to an exported make variable
- lustre/llite/statahead.c: ll_xattr_cache_insert() -> ll_set_encflags()
- lustre/llite/namei.c: dropping the -ERANGE retry loop around get_context()
- lustre/llite/namei.c: dropping the `encrypt && (open_flags & O_CREAT) && d_inode(dentry)` branch that used to call ll_set_encflags() with preload=true
- the CDEBUG text changes ("it_finish server returned ...", "statahead server returned ...")
(defect) Two hunks aren't accounted for by the description: - a new UAPI ioctl, LL_IOC_GET_ENCRYPTION_NONCE / llcrypt_ioctl_get_nonce() - the folio signature change of llcrypt_encrypt_pagecache_blocks(), llcrypt_decrypt_pagecache_blocks() and llcrypt_finalize_bounce_page(), plus the new lustre_compat/linux/folio.h include Both are independently landable. Should they be split out, or at least named in the body?
(defect) These now hand a folio to the in-kernel helpers, but on 5.15 - the kernel this patch is targeting - fscrypt_encrypt_pagecache_blocks() and fscrypt_decrypt_pagecache_blocks() take a `struct page *`, and fscrypt_finalize_bounce_page() at line 77 takes a `struct page **` (osc_request.c passes `foliop`). The folio conversions are much more recent. There is no HAVE_* guard or compat shim here, so the in-kernel build looks like it would still fail on 5.15 with incompatible-pointer errors. Should a config/*.m4 test cover the page-vs-folio variants?
(defect) FS_IOC_GET_ENCRYPTION_NONCE and fscrypt_ioctl_get_nonce() only appeared in v5.7, and the mapping at line 96 is unguarded. Since the commit message says in-kernel fscrypt is supported down to 5.8-era kernels today, is a HAVE_FSCRYPT_IOCTL_GET_NONCE test needed before this can be mapped unconditionally?
(defect) This `#else` arm also covers the `--disable-crypto` build (no HAVE_LUSTRE_CRYPTO, no CONFIG_LL_ENCRYPTION), and llcrypt_context_for_new_inode() has no declaration there -- it is declared only at line 67 for the native branch, and in include/lustre_compat/linux/llcrypt.h only inside `#ifdef CONFIG_LL_ENCRYPTION`. dir.c and namei.c call it unguarded, so the build stops on an implicit declaration. llcrypt_prepare_new_inode() has the matching problem on the link side: it is declared here, but keysetup.c only defines it under `#if !defined(HAVE_FSCRYPT_SET_CONTEXT) || defined(CONFIG_LL_ENCRYPTION)`. On a kernel where HAVE_FSCRYPT_SET_CONTEXT is set (the autoconf test at config/lustre-core.m4:787 runs regardless of --enable-crypto), neither condition holds and nothing defines it. Should the no-crypto section of llcrypt.h grow stubs for both?
(style) Not a bug, but this `len` shadows the `size_t len` parameter that is handed to md_create() further down, which makes the block harder to follow. If the patch is refreshed, something like `ctxsize` would read better.
Since `encrypt` is forced to true a few lines up whenever IS_ENCRYPTED(dir) and open_flags is non-zero, the value passed in by ll_lookup_it_finish() is now only meaningful for the open_flags == 0 case. Was the parameter meant to stay?
(defect) This runs on every lookup, not just creates - ll_lookup_it_finish() is reached from plain ll_lookup_nd() too.
Two consequences for an encrypted parent:
- llcrypt_prepare_new_inode() returns -ENOKEY when the master key isn't loaded, so `ls` / `stat` of anything inside an encrypted directory without the key now fails instead of showing no-key names.
- with the key loaded it ends in llcrypt_get_encryption_info(inode), i.e. a getxattr RPC for the child's context, issued *before* the server-supplied context is stored. That is exactly what the comment three lines below says this code is arranged to avoid ("save an extra getxattr and avoid deadlock").
Was this meant to be gated on the create disposition?
(defect) GOTO(free_fake_inode, ...) lands on a label that is still inside this `if` block, and nothing after the label rechecks the error - control just falls through to the security-context setup, ll_intent_lock() and ll_lookup_it_finish(), and `retval` is overwritten by the success assignment at the end. So a failure from llcrypt_prepare_new_inode() or llcrypt_context_for_new_inode() is silently discarded, and the OBD_ALLOC failure at the -ENOMEM goto continues with op_file_encctx == NULL, creating the file in the encrypted directory with no encryption context at all. ll_dir_setdirstripe() and ll_new_node_prepare() both put an `if (err) GOTO(out..., err)` after the label; that seems to be missing here.
(defect) The volatile branch above takes a reference via volatile_ref_file() and the old code released it with fput() once the context had been fetched. Now the only fput() left is on the !ref_inode error path, so the reference leaks on every volatile-file create in an encrypted directory. The fake-inode branch also skips llcrypt_put_encryption_info(ref_inode) before destroy_inode(), so the llcrypt_info that llcrypt_prepare_new_inode() attached leaks too - dir.c:539 and namei.c:1843 both call it.
(defect) Swapping ll_xattr_cache_insert() for llcrypt_set_context() ties caching the server-supplied context to the *parent's* policy, which it did not depend on before.
For a directory that has its own policy but sits under an unencrypted parent, mdt_pack_encctx_in_reply() still sets OBD_MD_ENCCTX because the child carries LUSTRE_ENCRYPT_FL. Here `parent` is not encrypted, so llcrypt_prepare_new_inode() above returns 0 and leaves `encrypt` false, and then:
llcrypt_set_context() -> llcrypt_inherit_context(parent, ...)
-> llcrypt_get_encryption_info(parent) -> get_context() -> -ENODATA
(native path: fscrypt_set_context() hits WARN_ON_ONCE(!ci) and returns -ENOKEY).
The CWARN reads as non-fatal, but `rc` is no longer cleared on the way out -- the old `GOTO(out, rc = 0)` before the `out:` label is gone and `if (encrypt)` does not run to overwrite it, so ll_lookup_it_finish() returns the error and ll_lookup_it() turns it into ERR_PTR(). Does that make `ls`/`stat` of such a directory fail?
LU-20108 sec: support fscrypt natively for Linux 5.15 Currently Lustre only supports up to 5.8 kernels. This work handles the replacement of fscrypt_inherit_context() with fscrypt_prepare_new_inode() and fscrypt_set_context(). So the encrypt context is done in a two step process. Test-Parameters: trivial testlist=sanity-sec Change-Id: Ie8defa6e71fecddfd773e01f93d7ae3cb8d6e18e Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-ipv6 crashed | RHEL 9.7 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-ipv6 crashed | RHEL 9.8 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-1 crashed | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-1 crashed | RHEL 9.8 / x86_64 | ran 3 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-1 crashed | RHEL 10.1 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-2 crashed | RHEL 9.7 / x86_64 | ran 20 tests. 8 tests failed: sanity-pfl, sanity-lnet, lnet-selftest, pjdfstest, sanity-sec, sanity-lfsck, ru | session |
| review-dne-part-3 crashed | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-3 crashed | RHEL 9.8 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-4 crashed | RHEL 10.1 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-4 crashed | RHEL 9.7 / x86_64 | ran 15 tests. 7 tests failed: sanity-quota, sanity-hsm, sanity-flr, sanity-dom, replay-ost-single, mmp, insan | session |
| review-dne-part-5 crashed | RHEL 9.7 / x86_64 | ran 8 tests. 2 tests failed: sanityn, recovery-small. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-6 crashed | RHEL 9.7 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-6 crashed | RHEL 9.8 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-6 crashed | RHEL 10.1 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-7 crashed | RHEL 9.8 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-7 crashed | RHEL 9.7 / x86_64 | ran 10 tests. 4 tests failed: sanity-ec, sanity-scrub, sanity-pcc, large-scale. %% THIS TEST SESSION CRASHED | session |
| review-dne-part-8 crashed | RHEL 9.7 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-8 crashed | RHEL 10.1 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-8 crashed | RHEL 9.8 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-selinux-ssk-part-1 crashed | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-selinux-ssk-part-2 crashed | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-1 crashed | RHEL 9.7 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-1 crashed | RHEL 9.8 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-1 crashed | RHEL 10.1 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-2 crashed | RHEL 9.7 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-2 crashed | RHEL 10.1 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-2 crashed | RHEL 9.8 / x86_64 | ran 19 tests. 9 tests failed: sanity-pfl, sanity-lnet, lnet-selftest, pjdfstest, sanity-sec, sanity-lfsck, ru | session |
| review-dne-zfs-part-3 crashed | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-3 crashed | RHEL 10.1 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-3 crashed | RHEL 9.8 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-4 crashed | RHEL 10.1 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-4 crashed | RHEL 9.8 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-4 crashed | RHEL 9.7 / x86_64 | ran 13 tests. 7 tests failed: sanity-quota, sanity-hsm, sanity-flr, sanity-dom, replay-ost-single, mmp, insan | session |
| review-dne-zfs-part-5 crashed | RHEL 9.7 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-6 crashed | RHEL 9.7 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-6 crashed | RHEL 10.1 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-6 crashed | RHEL 9.8 / x86_64 | ran 4 tests. 2 tests failed: ost-pools, replay-single. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-7 crashed | RHEL 9.8 / x86_64 | ran 6 tests. 3 tests failed: sanity-ec, sanity-pcc, large-scale. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-7 crashed | RHEL 9.7 / x86_64 | ran 10 tests. 4 tests failed: sanity-ec, sanity-scrub, sanity-pcc, large-scale. %% THIS TEST SESSION CRASHED | session |
| review-ldiskfs crashed | RHEL 8.10 / x86_64 | ran 7 tests. 3 tests failed: sanity-lnet, sanity, lnet-selftest. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | RHEL 8.10 / x86_64, SLES 15.7 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | RHEL 8.10 / x86_64, RHEL 9.8 / x86_64 | ran 7 tests. 3 tests failed: sanity-lnet, sanity, lnet-selftest. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | RHEL 8.10 / x86_64, RHEL 10.1 / x86_64 | ran 9 tests. 3 tests failed: sanity-lnet, sanity, lnet-selftest. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-arm crashed | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 8 tests. 4 tests failed: sanity-sec, sanity-lnet, sanity, lnet-selftest. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-ubuntu crashed | RHEL 8.10 / x86_64, / | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-zfs crashed | RHEL 8.10 / x86_64 | ran 14 tests. 6 tests failed: sanity-lsnapshot, insanity, replay-ost-single, replay-single, sanity-flr, sanit | session |
The body explains the data-structure swap but not the reference-counting changes that come with it. class_export_put() is added in class_unlink_export() and tgt_client_free(), and removed in tgt_reply_data_init() and update_recovery_update_ses(). Those are behavior changes, not a mechanical hash->xarray conversion, and it would help to say what the intended ownership rule for obd_gen_ids is. The old gen_kepcmp() also filtered on !exp->exp_failed, so lookups could never return a failed export; xa_load() has no such filter. That change deserves a line in the message too.
(style) Signed-off-by: normally comes before Change-Id:; the reversed order usually means the Lustre commit hook is not installed locally.
(style) The comment above still calls this a hash body. While renaming the field, `obd_gen_ids` reads as if it stores ids rather than exports keyed by generation - something like obd_gen_exports would say what it holds.
(defect) Two problems with this put. First, ted_lcd is non-NULL for every target export (tgt_client_alloc() allocates it for all non-self exports), while an obd_gen_ids entry only exists for exports inserted by tgt_clients_data_init() when tgt_is_multimodrpcs_record() is true. So a regular client that connected after mount was never in the xarray, yet still gets a put here. The old code was guarded by hlist_unhashed(&exp->exp_gen_hash), which was exactly the "is it in the table" test; xa_erase()'s return value can serve the same purpose. Second, nothing takes a matching reference on insert any more, so even for exports that are in the xarray this put has no counterpart. Worth noting too: this runs with obd_dev_lock held, and if it ever is the final reference, class_export_put() -> obd_zombie_export_add() takes obd_dev_lock again.
(minor) xa_destroy() on the next line already erases every entry and frees the nodes, so this loop looks like a no-op. If the intent was to release the export references held by the xarray, the loop needs a class_export_put() on each entry (and a reference has to be taken on insert first). Reusing `flag`, the char * used above for parsing the lcfg flag string, as the xa_for_each() entry variable is also confusing to read.
(defect) This drops a reference the xarray never took, and it does so from a context where the refcount is already zero.
The main caller chain is class_export_put() -> obd_zombie_exp_cull() -> class_export_destroy() -> obd_destroy_export() -> mdt_destroy_export()/ofd_destroy_export() -> tgt_client_free(). class_export_destroy() opens with
LASSERT(refcount_read(&exp->exp_handle.h_ref) == 0);
so the class_export_put() here hits its own LASSERT(refcount_read(...) > 0) and LBUGs. That is on the teardown path of every regular server export, not just the ones recovered from last_rcvd.
mdt_init_export()'s err_free: path also calls tgt_client_free() directly, where the export is still live, so there it silently loses a reference instead.
The old code only removed the export when it was actually hashed (hlist_unhashed()); the xarray entry only exists for exports added by tgt_clients_data_init() with a non-zero lcd_generation, so an unconditional put cannot be right either way. xa_erase() returning the old entry could be used to tell the two cases apart.
(defect) The old cfs_hash_add_unique() took a reference on the export through gen_hash_ops.hs_get()->class_export_get(). ll_xa_insert() does not, so after the class_export_put() two lines below the xarray holds a bare pointer with no reference at all. Every surviving class_export_put() that was paired with that reference is now unbalanced - see class_unlink_export(), tgt_client_free(), the error path below at tgt_set_reply_slot(), and distribute_txn_replay_handle(). Should this be class_export_get(exp) before the insert?
(minor) GFP_KERNEL here; Lustre server allocations in this path normally use GFP_NOFS (OBD_ALLOC_PTR() a few lines up does). This runs during target mount while reading last_rcvd, so reclaim recursing back into the same device seems worth avoiding.
(defect) The success-path class_export_put() below was removed with the switch to xa_load(), but this one on the tgt_set_reply_slot() error path was left behind. xa_load() returns no reference, so this drops one that belongs to someone else.
(defect) cfs_hash_lookup() returned a referenced export, and that reference was handed to tsi->tsi_exp and released later by distribute_txn_replay_handle():
if (tgt_ses_info(env)->tsi_exp != NULL) {
class_export_put(tgt_ses_info(env)->tsi_exp);
xa_load() returns an unreferenced pointer, so that put now drops a reference this path never acquired, and tsi_exp can be freed under the replay while it is still in use.
Separately, gen_kepcmp() used to reject exports with exp_failed set, so an evicted export could never end up in tsi_exp. xa_load() has no such filter - is update replay expected to cope with a failed export here?
LU-8130 obd: replace gen hash with Xarray Using a hash table for sequential values doesn't make sense in this case. Instead track the recovery generation values for exports using a Xarray. Change-Id: Iccff86b7473c61a25caf336b30342ce2dc12e148 Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
(typo) "utilies" -> "utilities" in the subject, and "utilites" -> "utilities" on the body line below.
(minor) The body only covers the lsvcgssd/l_getauth split, but the diff also appends $(UTILS_CFLAGS) to AM_CFLAGS. Is that intended to ride along here, or should it be a separate change? Either way it should be mentioned so the hunk isn't a surprise.
(minor) This hunk isn't part of the client/server split. If the intent is to pick up the distro build flags the way lustre/utils/Makefile.am does, note that file also sets
AM_LDFLAGS := $(UTILS_LDFLAGS)
and UTILS_LDFLAGS is exported alongside UTILS_CFLAGS in lustre.spec.in. Here the link flags are still unset, and each program overrides them with its own lsvcgssd_LDFLAGS/l_getauth_LDFLAGS/lgss_keyring_LDFLAGS/lgss_sk_LDFLAGS = $(KRBLDFLAGS), so an AM_LDFLAGS alone wouldn't take effect either - $(UTILS_LDFLAGS) would have to be added to each of those lines. Should the hardening flags be applied consistently, in a patch of their own?
(suggestion) While completing the client/server split: lustre/scripts/systemd/Makefile.am still installs lsvcgss.service unconditionally under HAVE_SYSTEMD, and the spec adds it to lustre.files the same way, even though lsvcgss_sysd and the init script are already SERVER-only. So a client package keeps shipping a unit for a daemon it no longer builds. Worth wrapping in SERVER here too?
With these two now server-only, a client-only install has no l_getauth and no lsvcgssd, but test-framework.sh still resolves both on the local (client) node and has no /usr/sbin fallback:
export L_GETAUTH=${L_GETAUTH:-"$LUSTRE/utils/gss/l_getauth"}
[ ! -f "$L_GETAUTH" ] && export L_GETAUTH=$(which l_getauth 2> /dev/null)
export LSVCGSSD=${LSVCGSSD:-"$LUSTRE/utils/gss/lsvcgssd"}
[ ! -f "$LSVCGSSD" ] && export LSVCGSSD=$(which lsvcgssd 2> /dev/null)
When the test node runs a client build both expand to the empty string, and the values are then used on the server nodes:
do_nodes $nodes "$LSVCGSSD -vvv -s -m -o -z $options" || return 1
do_nodesv $node "$L_GETAUTH -d"
do_nodesv $servers "$LCTL set_param sptlrpc.gss.rsi_upcall=$L_GETAUTH"
start_gss_daemons() then runs "-vvv -s -m -o -z" remotely and returns 1, and init_gss() does start_gss_daemons() || error_exit, so setup aborts for any SHARED_KEY/krb5 run on a mixed client/server install. Should this patch also give L_GETAUTH/LSVCGSSD a "/usr/sbin/..." fallback (the way LR_READER and LSOM_SYNC do a few lines above), or resolve them on a server facet instead?
LU-14291 utils: don't build gss server utilies for clients Both lsvcgssd and l_getauth are server only utilites. Test-Parameters: trivial env=SHARED_KEY=true testlist=sanity,sanity-sec Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: Iba4830ea74cad3b6c615663bd7ebe135cf39515f
| unique failing test | history |
|---|---|
| sanity-slow@zfs:test_64b | seen in 3 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-2 | RHEL 10.1 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
| review-dne-zfs-part-4 crashed | RHEL 9.7 / x86_64 | ran 9 tests. 1 tests failed: sanity-quota. %% THIS TEST SESSION CRASHED %% | session |
Should this get a `Fixes:` label?
I think this is basically a change to the fixture of Lustre since the beginning of time so there's nothing to declare here?
(minor) The double-iput fix described here lands in revalidate_statahead_dentry(), not ll_statahead_interpret(). The latter only igrab()s the inode into se_inode; it is revalidate_statahead_dentry() that calls ll_splice_alias() and now clears se_inode before the IS_ERR() check. Worth correcting the name so the change stays findable via git log later.
(minor) Not a bug, but is "both of them consequences of the OBF namespace" complete? d_lustre_invalidate() only sets a flag (llite_internal.h), so a directory renamed on another client keeps its old-parent dentry hashed and on the inode alias list. A later lookup of the new path then gets that alias from __d_find_any_alias(), with a different d_parent and no .lustre/fid anywhere in the picture, so it takes the same cross-parent __d_unalias() trylock path and the same -ESTALE. That is ordinary d_splice_alias() semantics and not a reason to change the patch, but as written the paragraph reads as if the by_fid test bounds the new -ESTALE exposure, and it doesn't.
well.... [ 368.091239] Lustre: lustre-MDT0000-mdc-ffff89a08865b000: Force grant RPC slot (1 current) to proc with flag: 208840. [ 368.091527] Lustre: Skipped 3 previous similar messages [ 370.228394] Lustre: lustre-MDT0000-mdc-ffff89a041f49000: Force grant RPC slot (1 current) to proc with flag: 208840. [ 374.536843] Lustre: lustre-MDT0000-mdc-ffff89a041f49000: Force grant RPC slot (1 current) to proc with flag: 208840. [ 374.536967] Lustre: Skipped 2 previous similar messages [ 382.893306] Lustre: lustre-MDT0000-mdc-ffff89a041f49000: Force grant RPC slot (8 current) to proc with flag: 208840. [ 382.893500] Lustre: Skipped 51 previous similar messages [ 399.281310] Lustre: lustre-MDT0000-mdc-ffff89a08865b000: Force grant RPC slot (4 current) to proc with flag: 208840. [ 399.282289] Lustre: Skipped 140 previous similar messages [ 402.163522] obd_memory max: 4662112620, obd_memory current: 4661744265 [ 402.163950] kthreadd invoked oom-killer: gfp_mask=0x400dc0(GFP_KERNEL_ACCOUNT|__GFP_ZERO), order=2, oom_score_adj=0 [ 402.164047] CPU: 0 PID: 2 Comm: kthreadd Tainted: G O ------- --- 5.14.0 #26 [ 402.164115] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.17.0-9.fc43 06/10/2025 [ 402.164175] Call Trace: [ 402.165043] <TASK> [ 402.166569] dump_stack_lvl+0x57/0x7d [ 402.167511] dump_header+0x4f/0x486 [ 402.167545] ? ___ratelimit+0x83/0x100 [ 402.167578] oom_kill_process.cold+0x54/0x79 [ 402.167614] ? lock_release+0x1c7/0x2e0 [ 402.167648] ? _raw_spin_unlock+0x1a/0x30 [ 402.167679] out_of_memory+0xc8/0x510 [ 402.167712] __alloc_pages_slowpath.constprop.0+0x6d3/0xcb0 [ 402.167751] __alloc_pages+0x2ba/0x2d0 [ 402.167781] copy_process+0x1fd/0x24b0 [ 402.167813] ? update_load_avg+0x60/0x260 [ 402.167845] ? lock_acquire+0x15c/0x2f0 [ 402.167875] ? __update_load_avg_se+0x153/0x380 [ 402.167913] ? trace_pelt_se_tp+0x29/0xc0 [ 402.167945] ? lock_release+0x1c7/0x2e0 [ 402.167976] kernel_clone+0x86/0x340 [ 402.168005] ? do_raw_spin_unlock+0x46/0x90 [ 402.168051] ? finish_task_switch.isra.0+0xef/0x330 [ 402.168088] kernel_thread+0x4a/0x50 [ 402.168118] ? kthread_park+0x80/0x80 [ 402.168151] kthreadd+0xc5/0x110 [ 402.168185] ? kthread_is_per_cpu+0x20/0x20 [ 402.168220] ret_from_fork+0x1f/0x30 [ 402.168290] </TASK> [ 402.168321] Mem-Info: [ 402.168347] active_anon:255934 inactive_anon:234092 isolated_anon:0 [ 402.168347] active_file:236 inactive_file:1651 isolated_file:214 [ 402.168347] unevictable:0 dirty:0 writeback:192 [ 402.168347] slab_reclaimable:9149 slab_unreclaimable:1153520 [ 402.168347] mapped:875 shmem:467586 pagetables:2320 [ 402.168347] sec_pagetables:0 bounce:0 [ 402.168347] kernel_misc_reclaimable:0 [ 402.168347] free:30537 free_pcp:910 free_cma:0
so, the OOM is real, it was traced to a longer retention of RPCs in replay list, mostly related to directory-churn workloads it seems. It is also affected by Alex's case of not carrying the previous patch in the series (67391) so with 2000 stripes seen the normally relatively small RPCs blow up to 256k greatly exacerbating the memory consumption. the problem is open requests are leaked because somehow atomic open machinery returns IT_OPEN_OPEN that sets rq_replay that is never cleared.
after some more thinking, this looks wrong. For regular files we absolutely want to reuse these stale dentries, all this means is we lost the lookup bit some time ago, so what? I guess for DIRECTORIES we don't and if it's an open by fid we can have a directory here, so we should also check if we found a directory before we throw it away. Or should we only throw away for the by_fid regardless of mode? Aliases for regular files don't really much do they so probably not? Though in instrumentation this is NOT a big signal compared to the leak (200 hits here for 8000 rq_replay requests stuck)
(defect) For regular files this throws away a still-usable alias instead of reusing it. Before this patch ll_find_alias()'s invalid alias was always d_move()'d and reused; a d_lustre_invalid() dentry just means the LOOKUP lock was dropped, which is the common case. Now every non-directory lookup that finds such an alias discards it (d_invalidate() + dput()) and re-adds a fresh dentry via d_add(). An open note on an earlier patchset raised the same doubt and is still unresolved. Should the discard be gated on the by_fid / directory case only, leaving regular-file aliases to be reused as before?
(style) This isn't a bug, but %pd prints the raw name and bypasses the filename obfuscation that obd_enable_fname_encoding controls. The rest of namei.c uses DNAME with encode_fn_dentry(), e.g.
"cannot splice inode %p as "DNAME": rc = %d\n", inode, encode_fn_dentry(de), ...
(nit) de cannot be NULL here - the argument is never NULL and the else branch only reassigns it when d_splice_alias() returned non-NULL - so IS_ERR_OR_NULL() is just IS_ERR(). It also reads oddly next to the plain !IS_ERR(de) guard a few lines below; if the patch is refreshed anyway, making both the same would help.
warn: ll_splice_alias():'de' can also be NULL
(minor) This comment now says the opposite of what the code requires: d_splice_alias() opens with BUG_ON(!d_unhashed(de)), and the commit message spends a paragraph establishing that no caller ever hands over a hashed dentry. Worth rewording while it is being touched (and it carries two typos, "Atoimc" and "passin").
LU-9868 llite: use d_splice_alias for directories.
In the Linux dcache a directory only ever has one dentry,
so d_splice_alias() can be used by ll_splice_alias() for directories.
It will find the one dentry whether it is DCACHE_DISCONNECTED or
IS_ROOT() or d_lustre_invalid().
Separating out the directories from non-directories will allow us
to simplify the non-directory code.
A negative lookup (@inode NULL) takes the new branch as well, where it
used to reach d_add(de, NULL): d_splice_alias(NULL, de) does the same
__d_add(), with the BUG_ON(!d_unhashed(de)) it opens with. No caller
passes a hashed dentry -- ll_atomic_open() either hands over a
d_in_lookup() dentry or d_drop()s it first.
Unlike the old ll_splice_alias() d_add() path, d_splice_alias() consumes
the passed inode reference in every case (including on its error returns
-ELOOP/-ESTALE) and can now return an error. Adjust the callers to the
new contract:
- revalidate_statahead_dentry() transferred the sa_entry inode
reference to the dentry (se_inode = NULL) only on the success path,
so on the d_splice_alias() error path the reference it already
dropped was iput() a second time when the sa_entry was freed,
underflowing i_count (WARNING at fs/inode.c ihold, hit under an rm
workload with statahead active). Transfer ownership away from the
sa_entry before inspecting the result.
- A by-FID (.lustre/fid/) directory lookup must not d_move the
directory's real (connected) dentry onto the fid path.
d_splice_alias() does exactly that for an ordinary directory:
__d_find_any_alias() returns its connected dentry, which is neither
an ancestor of the new .lustre/fid/<FID> dentry nor IS_ROOT(), so
__d_unalias() moves it there and the normal path to the directory
stops working. ($MOUNT itself and .lustre are ancestors, so they come
back -ELOOP instead -- equally fatal to sanity 233a/233b.) Keep the
legacy alias handling for OBF-parented directory lookups; use
d_splice_alias() only for normal-namespace lookups, where it keeps a
directory to a single dentry (LU-17536).
The test is on the immediate parent's FID, so it recognises the
entries directly under .lustre/fid/ and nothing else about the by-FID
namespace. Two cases are therefore left as d_splice_alias() handles
them, both of them consequences of the OBF namespace giving a
directory a second dentry in the first place:
* .lustre/fid/<dir-FID>/<name>: the parent is the duplicate dentry
this branch made for <dir-FID>, so the child takes the
d_splice_alias() path and __d_unalias() moves its real dentry into
the by-FID tree.
* $MOUNT/<path>/<dir> for a directory that already has a by-FID
dentry: __d_find_any_alias() hands that dentry back, and
__d_unalias() moves it into the normal namespace -- the useful
direction, but a direction the old d_add() never took.
In both, __d_unalias() takes its cross-parent path and can return
-ESTALE: it mutex_trylock()s s_vfs_rename_mutex, which any rename on
the filesystem holds, and inode_trylock_shared()es the alias's
parent, which any create, unlink, mkdir, rmdir or setattr in that
directory holds exclusively. The VFS retries once with LOOKUP_REVAL,
but a lookup that could not fail before now can, and under a
directory-churn workload it will meet those holders.
Covering these means recognising the whole by-FID subtree -- marking
the dentries this branch creates -- which is new dentry state and is
left for its own patch.
The legacy branch is otherwise left exactly as it was: an alias that
ll_find_alias() returns is still d_move()d onto the new dentry and
reused, whether it is d_lustre_invalid() or not. d_lustre_invalid()
only means the LOOKUP lock was dropped at some point, which is the
common case, and reusing the dentry is the whole point of
ll_find_alias(); discarding it instead would replace the dentry that
open files and mounts are attached to on every lookup that races a
lock cancellation. It would also be a behaviour change for regular
files, which this patch is not about.
Linux-commit: e9d4f0b9f55920821845b8e063ed593422c18d8a
Linux-commit: 1d6e65bedf5878c8dd5b089d3f034b619bbb8a77
Test-Parameters: optional testlist=racer
Signed-off-by: NeilBrown <neil@brown.name>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools
Change-Id: If80a02b77c4fc62cdb90e86cdb8a0f9eba21193b
LU-14291 obdclass: unwind server code out of llog Currently server internals are being pulled into llog. Break out all the server code which limits the scope of the DT API. Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: Ia11f6c26289f43260c1606fb031c4b90df10f87f
| unique failing test | history |
|---|---|
| sanity-pcc@ldiskfs+DNE:test_22 | seen in 13 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 crashed | RHEL 10.1 / x86_64 | ran 3 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-5 crashed | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
| review-dne-zfs-part-3 crashed | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-3 crashed | RHEL 10.1 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. %% THIS TEST SESSION CRASHED %% | session |
cl2osc() is container_of_safe() on oo_cl, which sits at offset 0, so IS_ERR_OR_NULL(cl2osc(obj)) is the same test as IS_ERR_OR_NULL(obj). It checks the cl_object pointer that was passed in, not whether the osc_object still exists; an object that was freed while still referenced is an ordinary pointer, not NULL or an ERR_PTR. Could the message name the pointer that actually becomes NULL or an error, and where it is set that way?
ldlm/ldlm_resource.c: warn: ldlm_resource_get():inconsistent indenting
This paragraph explains the bucket-array sizing change, but not that the bucket selection function changed shape as well. ldlm_res_hop_hash() summed all four words of the res_id; ldlm_res_hop_fid_hash() hashes only the FID in name[0] and name[1]. Worth a sentence, since it changes which resources share an ldlm_ns_bucket. The new LDLM_FL_KUNIT_TESTING flag in lustre_dlm_flags.h isn't mentioned anywhere in the body either - is that meant to be part of this patch, or a separate cleanup of the bare BIT(63) uses?
ldlm/ldlm_resource.c: warn: ldlm_resource_get():inconsistent indenting
(suggestion) No Test-Parameters: line for a change of this reach - it rewrites the resource lookup path for MDC/MDT/OSC/OST/MGC/MGT namespaces and touches recovery, eviction and quota. Something like
Test-Parameters: testlist=recovery-small,replay-single,replay-dual,conf-sanity,sanity-quota
would get the paths this rewrites covered by the test run.
lr_hash and lr_rcu share storage, so call_rcu(&res->lr_rcu, ...) writes over lr_hash.next. That was safe with cfs_hash because every chain walk held the bucket lock; rhashtable readers walk the chain under rcu_read_lock() alone. ldlm_resource_putref() -> __ldlm_resource_putref_final() does rhashtable_remove_fast(), then ldlm_resource_free(res, true) -> call_rcu(), and call_rcu() sets head->next = NULL right away. RCU removal requires the removed node's next pointer to stay intact for a grace period, because a reader can already be sitting on that node when it is unlinked. A concurrent ldlm_resource_get() walking that bucket then loads NULL as the next pointer. rht_is_a_nulls() only tests bit 0, so NULL is not recognised as end-of-chain: the loop body runs with pos == NULL, rht_obj() subtracts head_offset, and rs_cmp() dereferences the result. struct lu_object_header keeps loh_hash and loh_rcu as separate fields, with a comment about exactly this requirement. Should lr_rcu be split out of the union the same way?
This isn't a bug, but BIT() is unsigned long while l_flags is __u64, so BIT(63) is out of range on a 32-bit build. Every other flag in this file spells the value out as 0x...ULL with a /* bit N */ comment and provides ldlm_is_/ldlm_set_ helpers - consider matching that:
#define LDLM_FL_KUNIT_TESTING 0x8000000000000000ULL /* bit 63 */
#define ldlm_is_kunit_testing(_l) LDLM_TEST_FLAG((_l), 1ULL << 63)
#define ldlm_set_kunit_testing(_l) LDLM_SET_FLAG((_l), 1ULL << 63)
which would also let the two ldlm_lock.c users read like the surrounding flag tests.
This gives lock_res_and_lock() a new failure return, but only 8 of the 111 call sites look at the result; the rest go straight on to unlock_res_and_lock(), which is unlock_res(lock->l_resource) on the very pointer that produced the error. As far as I can tell the error can't fire today: l_resource is only cleared by the rcu_assign_pointer(lock->l_resource, NULL) in ldlm_lock_put(), which runs after h_ref has already reached zero, so no caller that holds a lock reference can observe it, and nothing assigns an ERR_PTR to l_resource at all. So either it is unreachable, and the error plumbing added through ldlm_lock_enqueue(), ldlm_callback_handler(), osc_ldlm_glimpse_ast() and osc_extent_release() could go, or it is reachable and the other 103 callers need converting in the same patch. Which is it?
(minor) This critical section only spans the two pointer loads - res is dereferenced at the lr_type test below and handed to ldlm_resource_putref(), and ns is used by lprocfs_counter_decr(), all after rcu_read_unlock(). If l_resource really needed RCU protection here the section would have to reach as far as the putref; as written it protects nothing that the lock's own resource reference doesn't already cover. The LASSERT(lock->l_resource != LP_POISON) a few lines up reads the same field bare, which suggests the plain read was fine. Could this just go back to a direct load?
ns_reclaim_start is now only ever assigned 0 in ldlm_namespace_new(); the ldlm_res_to_ns(res)->ns_reclaim_start++ that used to advance it went away with the per-bucket bookkeeping in ldlm_reclaim_lock_cb(). rcd_start is therefore always 0, the rcd_skip/rcd_cursor fast-forward below can never trigger, and every reclaim pass restarts on the same resources. nsb_reclaim_start is incremented but no longer read either. That drops the round-robin scan the ldlm_reclaim_res() comment still describes, and it is not mentioned in the commit message. Is the intent to keep the round-robin, or to remove it and the now-dead rcd_skip/rcd_cursor/rcd_start fields with it? Also worth noting the units no longer match: rcd_cursor counts resources while tbl->size is a bucket count.
(minor) This comment doesn't match the new scheme. With the rhashtable the table holds no reference of its own: an entry is removed exactly when `lr_refcount` hits zero in `__ldlm_resource_putref_final()`, and `rs_cmp()` hides zero-refcount entries from lookups. During the walk the only extra reference is the `refcount_inc_not_zero()` in `ldlm_resource_for_each()`. So the count printed below is one lower than the number of stray references, and a resource holding exactly one leaked reference no longer produces the message at all.
(style) This is a new exported API and it has no kerneldoc, unlike `ldlm_resource_get()` right below. Worth documenting the callback contract, in particular that the callback owns no reference (it must not putref), that a non-zero return stops the walk, and that a callback can be invoked more than once for the same resource - `rhashtable_walk_start()` here is the void variant, so the `-EAGAIN` a resize produces is discarded and the walk restarts from slot 0. That last property is what forced the `l_pending_chain` check in `ldlm_chain_lock_for_replay()`, and every future callback author needs to know about it.
LU-8130 ldlm: convert ldlm_resource hash to rhashtable Using an rhashtable allows lockless lookup at the cost of rcu freeing of entries. When we find an entry, we need to atomically check the reference hasn't dropped to zero. When adding an entry, we might find an existing entry which is in the process of being removed - with a zero refcount. In that case we loop around and repeat the lookup. To ensure this doesn't spin, the 'cmp' function will fail any comparison with a resource which has a zero refcount. Now that we are using resizing hash tables, we don't need to preconfig suitable sizes for each namespace. We can just use the default and let it grow as needed. We keep the pre-configured sizes for the bucket array. Previously the size of the bucket array was the difference between nsd_all_bits and nsd_bkt_bits. As we don't need nsd_all_bits any more, nsd_bkt_bits is changed to the number of bits used to choose a bucket. Walking an rhashtable requires that we manage refcounts ourself, so a new function, ldlm_resource_for_each() is added to do that. Note that with this patch we now update a per-table counter on every insert/remove, which might cause more contention between CPUs on a busy system. Hopefully rhashtable will be enhanced in the near future to support a per-CPU counter for nelems. Only use call_rcu() to free slab resources that have been removed from the rhashtable, other cases can be free immediately. This change exposes new race conditions in the osc layer so we add code to check if osc_objects still exist. Signed-off-by: NeilBrown <neil@brown.name> Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: Ie65f6c5f6e246ed6684ade05ddab8740ac8137dd
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne-arm | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 5 tests. 1 tests failed: sanity. | session |
(style) presumably should have a `Fixes:` line?
(style) prefer `Change-Id:` after `Signed-off-by:`
Could the message name the fixes it is relying on, and the minimum kernel version they are in? As written "newer kernels and fixes landed for better NFS support" is not verifiable, and LU-12661 is still Open with summary "sanity test_817: FAIL: failed to execute 'true' command". The exclusion 3e2c28437404 removed here was widened from 4.14 to 4.12 specifically because SLES 4.12.14 hit it, and 4fed33473ca2 recorded that the failure happens "regardless of whether the nfs export is backed by a lustre mount or not" - i.e. it is nfsd holding the file open, not something llite can fix. That makes it worth spelling out which change is expected to have altered this.
(typo) "sanity tets 817" -> "tests".
(style) carried over from the previous revision, which was rebased without changes: a `Fixes:` line still seems appropriate here since this undoes the exclusion added by
Fixes: 3e2c28437404 ("LU-12661 tests: skip sanity 817 for kernel 4.12+")
(style) also carried over from the previous revision: `Change-Id:` is still before `Signed-off-by:`.
Dropping the block entirely re-enables 817 on every kernel, not just new ones. All currently supported clients in lustre/ChangeLog are above the 4.12 threshold - RHEL 8.10 (4.18.0-553), RHEL 9.7/9.8 (5.14.0), SLES15 SP5 (5.14.21), Ubuntu 22.04 (5.15) - so the test now runs on exactly the kernels the exclusion was added for, with nothing gating it on the "newer kernels" the commit message refers to.
If the fix really is version dependent, would a bounded guard be safer, e.g.
if (( $LINUX_VERSION_CODE < $(version_code X.Y.0) )); then
always_except LU-12661 817
fi
with X.Y.0 being the first kernel where nfsd releases the file?
With the exclusion gone this line runs again, and it execs immediately after the copy with no wait. exec() returns ETXTBSY while any writer holds the inode, and nfsd drops its write reference asynchronously (filecache / NFSv4 open state), not at the point `cp` returns - which is what 4fed33473ca2 described as "nfsd is not releasing the file after write".
Even on a kernel where nfsd does eventually release it, checking once immediately after the copy looks racy. Could this either unmount $tmpdir first to force the client CLOSE, or retry, e.g.
wait_update $HOSTNAME "$DIR/nfsexp/true && echo ok" "ok" 30 ||
error "failed to execute 'true' command"
LU-12661 tests: re-enable sanity 817 With newer kernels and fixes landed for better NFS support lets re-enable sanity tets 817. Test-Parameters: trivial Test-Parameters: testlist=sanity env=ONLY=817 Change-Id: I993165efdf5a7472676c5af20e079d6fbee5a098 Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
LU-18652 tests: no compression with zfs create / zpool setup Several of the conf-sanity test are disabled due to ZFS by default using compression. Update all the zpool and zcreate calls to turn off compression by default. With this change we can re-enable several test. Test-Parameters: trivial fstype=zfs testlist=conf-sanity Change-Id: I00751a6a3e7c925e8d89c8697fb8e8705d46c8bf Signed-off-by: James Simmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| conf-sanity4@ldiskfs+DNE:test_153a | seen in 22 other reviews |
| conf-sanity4@ldiskfs+DNE:test_153c | seen in 1 other review |
| racer@ldiskfs+DNE:test_1 | seen in 48 other reviews |
| sanity-scrub@ldiskfs+DNE:test_1a | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_1c | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_4a | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_4b | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_4c | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_5 | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_6 | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_7 | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_8 | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_9 | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_10a | seen in 2 other reviews |
| sanity-scrub@ldiskfs+DNE:test_15 | seen in 2 other reviews |
| sanity-scrub@zfs:test_1a | seen in 2 other reviews |
| sanity-scrub@zfs:test_1b | seen in 2 other reviews |
| sanity-scrub@zfs:test_4a | seen in 2 other reviews |
| sanity-scrub@zfs:test_5 | seen in 2 other reviews |
| sanity-scrub@zfs:test_10a | seen in 2 other reviews |
| sanity-scrub@zfs:test_12 | seen in 2 other reviews |
LU-18041 obd: mgc uses real uuid for its uuid to NID mapping Lustre creates a mapping, struct uuid_nid_data, using an 'uuid' to many NIDs. That 'uuid' happens to be the primary NID. This is problem for two reasons. First reason is that struct obd_uuid is to small for full length IPv6 based NID addresses so it ends up truncated. Second reason is for some systems the IP addresses expire for the network interfaces during the file system run time. This means the primary NID is not permanent. What is a better node identifier for the mgc is the UUID generated for it. Use that for the mappings. Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: Ib00ac7c3e282be924f2a64245cfcc4fc4e5744a7
LU-0000 obdclass: rollback testing find breakage Test-Parameters: trivial Change-Id: I93c1ca71984efd3b66e56d549141c78883abebc6 Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-1 failed 2× | RHEL 8.9/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
| review-dne-zfs-part-2 failed 2× | RHEL 8.9/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
| review-dne-zfs-part-3 failed 2× | RHEL 8.9/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
| review-dne-zfs-part-4 failed 2× | RHEL 8.9/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
| review-dne-zfs-part-5 failed 2× | RHEL 8.9/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
| review-dne-zfs-part-6 failed 2× | RHEL 8.9/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
| review-dne-zfs-part-7 failed 2× | RHEL 8.9/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
| review-zfs failed 2× | RHEL 8.9/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
LU-12607 osd-zfs: use proper locking for dnodes Currently lustre uses the DB_DNODE_[ENTER|EXIT] macros which is incorrect as pointed out by the ZFS developers. OpenZFS ticket https://github.com/openzfs/zfs/pull/9027 exported the proper dnode management functions so move Lustre to these new functions. Change-Id: If1165c4db149a1eb46bf00df9b48589d90acb7c6 Signed-off-by: James Simmons <jsimmons@infradead.org>
``` checking for /tmp/ktest-out/kernel_build.x86_64/.config... noconfigure: error: Kernel config could not be found. ``` The userland build shouldn't depend on the kernel config. I think we'd need to skip this check somehow.
I think I know what's wrong: --disable-modules isn't propagated when we try to make the debian packages. There's a couple other tweaks we need as well. I can push an updated patch.
The kernel really doesn't like it if you attempt to build userspace components against the Linux source tree. They recommend (https://kernelnewbies.org/KernelHeaders) either building against the installed headers (i.e. what you already have implemented) or building against a version of the headers copied from Linux. This would be equivalent to building against the openSFS headers. I think this should be supported somehow. Perhaps --disable-modules could have an argument to decided whether to use the installed headers or openSFS headers?
The question is which UAPI headers to test against? Some of the autoconf test for the utilities look at the UAPI headers to decided what is supported.
Oops. I added Shaun so we can verify. Do the autoconf test use the kernel UAPI pointed to by --with-kernel. I do agree we don't need to look at the .config for the kernel. The only complex case is the dummy fscrypt kernel option that changed.
> Do the autoconf test use the kernel UAPI pointed to by --with-kernel Yes. The test builds work the same as any kernel module build. You can see generated examples with: $ export PARALLEL_BUILD_OPT=debug $ ./configure ...
Maybe you are asking about user space utilities? Those do now know anything about the kernel headers, they should build just like any other user space utility looking under /usr/include and /usr/lib
LU-13903 build: allow building for a kernel with native client Currently we can build just the Lustre utilites on a system with a installed kernel with native Lustre client support. This doesn't work for building against a kernel tree with the native lustre client i.e ./configure --disable-modules --disable-server --with-linux=~/lustre-upstream This patch adds takes the kernel header location and adds it to the CPPFLAGS. The tools then can be built against that set of headers. Test-Parameters: trivial Change-Id: I3348f90474d0dd87da5fc8e779b71c9d6a2953df Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-8980 libcfs: add tracepoint support for libcfs Add initial trace events to the libcfs module. With this we can now collect data using the perf utility. Each traditonal lustre debug macro is turned into an unique tracepoint event. Any debugging macros moved over to trace point will now handling printing message to the console. Change-Id: I0fc6efc24fd9495fae2829990f74b1a72491baf8 Signed-off-by: James Simmons <uja.ornl@yahoo.com>
| unique failing test | history |
|---|---|
| sanity-flr@ldiskfs+DNE:test_70a | seen in 92 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-selinux-ssk-part-2 failed 4× | RHEL 8.10 / x86_64 | ran 8 tests. 3 tests failed: lustre-initialization, sanity-sec, recovery-small. | session |
LU-14291 gss: seperate out the client from server code. The gss code is all lumped together. Lets separate the code out. Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: If249e56e27054aa8accd4754e9bddec010ff0e7a
| unique failing test | history |
|---|---|
| sanity-quota@ldiskfs+DNE:test_48 | seen in 25 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
| review-ldiskfs-dne-arm | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 5 tests. 1 tests failed: sanity. | session |
LU-8585 tests: re-enable fid2path sanity test for subdir mount
When a subdirectory is mounted, the .lustre directory cannot be
seen. With the move of llapi_fid2path() from using .lustre/fid to
name_to_handle_at() previous sanity test that failed due to
file sets being enabled should now pass since name_to_handle_at()
should be file set aware. We update a few test applications to
work with llapi_open_by_fid() if we can't access .lustre. Same
is done with liblustreapi.so as well.
Fixes: f71554200 ("LU-11208 tests: add version check to sanity tests")
Fixes: e2ac6e1ea ("LU-9341 lod: Add special O_APPEND striping")
Fixes: 9bd3e64b8 ("LU-28 fileset: add fileset mount support")
Test-Parameters: trivial envdefinitions="FILESET=/subdir" testlist=sanity
Change-Id: Iddbcea298613e1dcc0af5c6f3cab4f0de01dbb5c
Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-5 | RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
LU-9868 llite: remove directory-specific code from ll_find_alias() Now that ll_find_alias() is never called for directories, we can remove code that only applies to directories. Linux-commit: ac63774689265d50bc1d83ac9b7889ac7e645b5a Signed-off-by: Mr. NeilBrown <neil@brown.name> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: I54f726eac648374cd631319095cfdab8b1f5dfff
| unique failing test | history |
|---|---|
| runtests-ssk@ldiskfs+SharedKey:test_1 | seen in 3 other reviews |
| runtests-ssk@ldiskfs+SharedKey:test_cleanup | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| runtests@zfs:test_1 | seen in 3 other reviews |
| runtests@zfs:test_cleanup | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-4 | RHEL 8.8/x86_64 | ran 9 tests. 1 tests failed: sanity-hsm. | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.8/x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-4 | RHEL 8.8/x86_64 | ran 9 tests. 1 tests failed: sanity-hsm. | session |
| review-ldiskfs crashed | RHEL 8.8/x86_64, RHEL 9.2/x86_64 | ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | RHEL 8.8/x86_64 | ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-arm crashed | RHEL 8.7/aarch64, RHEL 8.8/x86_64 | ran 8 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
LU-11501 llite: use d_real for directories in fid cache. Lustre has a special directory called .lustre which contains a collection of directories whose name matches a fid. This is used in a similar way as open by fhandle but we use this functionality since it allows opens by normal users. For opening a file by proxy with the .lustre/fid/"FID" directory we use a dcache alias. While this is valid Lustre does the same thing for open a directory with this .lustre FID which means we have multiple hard links to directories which is forbidden. More modern kernels report this as an error and we risk a future kernel pruning such dentry entries. The solution is to look at how overlayfs does this since .lustre is sort of a pseudo file system. We can use d_real() to lookup the real dentry that maps to the special .lustre/fid/"FID". Change-Id: I02d8a54465d685430d9290c24faf1ef6bfd6a876 Signed-off-by: James Simmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| sanity3@zfs:test_233a | seen in 3 other reviews |
| sanityn@zfs:test_108a | seen in 11 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-part-1 | RHEL 9.5 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-part-2 | RHEL 9.5 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, SLES 15.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 6 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 24.04 / x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
LU-9868 llite: refine ll_find_alias based on d_exact_alias The task of ll_find_alias() is now very similar to d_exact_alias(). We cannot use that function directly, but we can copy much of the structure so that the similarities and differences are more obvious. Examining d_exact_alias() shows that the d_lock spinlock does not need to be held in ll_find_alias as much as it currently is. Linux-commit: 8016ab9ebbda3dee637ac66b9e0f7a74ef6fe9e6 Signed-off-by: Mr. NeilBrown <neilb@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: I52ba4bc35cb84f523551816df7df2d4d0b1573b7
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-part-1 | RHEL 9.5 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, SLES 15.5 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 24.04 / x86_64 | ran 6 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. | session |
LU-9868 llite: simplify ll_find_alias() Now that ll_find_alias is only searching for one type of dentry, we can return as soon as we find it. This allows substantial simplification, and brings the bonus that we don't need to take the d_lock again just to increment the ref-count. We can increment it immediately that the dentry is found. Linux-commit: 7e08e9a8942dfc38693edf2e389cde620e918356 Signed-off-by: Mr. NeilBrown <neilb@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: I18d6130c27186e1a7c9254e50b4d1242b7ada383
| failed enforced test | platform | detail | |
|---|---|---|---|
| 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 |
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.
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?
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.
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.
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>
| unique failing test | history |
|---|---|
| sanity-pfl@ldiskfs+DNE:test_1c | NEW unique failure for this branch in the last 30 days, and was seen 2 times across 1 other branches 1 reviews |
| sanity-pfl@zfs:test_1c | NEW unique failure for this branch in the last 30 days, and was seen 2 times across 1 other branches 1 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | RHEL 8.10 / x86_64 | ran 11 tests. 1 tests failed: sanity-pfl. | session |
| review-dne-part-2 | RHEL 9.5 / x86_64 | ran 11 tests. 1 tests failed: sanity-pfl. | session |
| review-dne-zfs-part-2 | RHEL 8.10 / x86_64 | ran 11 tests. 1 tests failed: sanity-pfl. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
LU-19298 lod: merge different lmm handling togther. For PFL handling the LOD has developed very similar code independently. Besides code duplication we end up not having consistent PFL handling. For example lod_layout_add() handling doesn't support specific OST indexes being requested by the user for the new component. We merge all the code into lod_comp_for_each_lcm(). In the future any change here will impact many code paths at the same time. For EC developement we don't need to touch any many places in the code. Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: Ic2392dd84eb397e87e384d6916ccb2de04b6d083
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 crashed | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-4 crashed | RHEL 8.10 / x86_64 | ran 9 tests. 1 tests failed: sanity-quota. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-5 crashed | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-5 crashed | RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-6 crashed | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: ost-pools. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-6 crashed | RHEL 9.5 / x86_64 | ran 4 tests. 1 tests failed: ost-pools. %% THIS TEST SESSION CRASHED %% | 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-zfs-part-2 crashed | RHEL 8.10 / x86_64 | ran 11 tests. 1 tests failed: sanity-pfl. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-4 crashed | RHEL 8.10 / x86_64 | ran 9 tests. 1 tests failed: sanity-quota. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-6 crashed | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: ost-pools. %% 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 |
LU-18175 ldlm: replace namespace lock with RCU With newer kernels you can enable a debugfs interface to flush out the shrinkers. When enabled in testing the below was discovered: BUG: sleeping function called from invalid context at kernel/mutex.c:104 in_atomic(): 1, irqs_disabled(): 0, pid: 18286, name: lctl CPU: 3 PID: 18286 Comm: lctl Kdump: loaded Tainted: G OE ------------ 3.10.0-7.9-debug #1 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.2-1.fc38 04/01/2014 Call Trace: [<ffffffff817ded29>] dump_stack+0x19/0x1b [<ffffffff810c8ec9>] __might_sleep+0xd9/0x100 [<ffffffff817e5540>] mutex_lock+0x20/0x40 [<ffffffffa08ae00c>] ldlm_pools_shrink+0x6c/0x330 [ptlrpc] [<ffffffffa08ae2eb>] ldlm_pools_cli_shrink+0x1b/0x20 [ptlrpc] [<ffffffffa022be76>] shrinker_debugfs_count_show+0x106/0x200 [libcfs] [<ffffffff8126e115>] seq_read+0x135/0x470 [<ffffffff81244899>] vfs_read+0xb9/0x1c0 [<ffffffff812457cf>] SyS_read+0x7f/0xf0 [<ffffffff817f400c>] system_call_fastpath+0x1f/0x24 This is due to the debugfs interface taking its own mutex lock and our own ldlm pools using a mutex lock as well. Replace our mutex lock with RCU list handling. Special note is that their is no list_empty_rcu(). We have to use list_first_or_null_rcu() instead. This is due to list_empty() and the next list operation performing separate READ_ACCESS which can give different results. Change-Id: I175f345b5a8cf7d29e32c7e192620f9c896e6a9d Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-4 | RHEL 9.4 / x86_64 | ran 9 tests. 1 tests failed: sanity-hsm. | session |
| review-dne-part-5 | RHEL 8.10 / x86_64 | ran 8 tests. 1 tests failed: recovery-small. | session |
| review-dne-part-5 | RHEL 9.4 / x86_64 | ran 8 tests. 1 tests failed: recovery-small. | session |
| review-dne-part-7 | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-part-7 | RHEL 9.4 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: recovery-small. | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-5 | RHEL 8.10 / x86_64 | ran 8 tests. 2 tests failed: sanityn, recovery-small. | session |
| review-dne-zfs-part-7 | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, SLES 15.5 / x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
would be nice to have some examples of the new names, or before/after
Do the extra embedded '-' separators cause parsing issues later on?
%pU is not correct here as sbi->ll_sb_uuid.uuid is a max 40 byte string.
It is safe to require the '-mdc-' naming? Probably but I have not looked to be positive.
Extra '-' separators ... do the confuse a parser somewhere?
That is my concern as well if the format of the parameters is suddenly getting much longer and having extra dashes in them. In the past we had to deal with fsname that contained multiple '-' in them, so some code is using "strrchr()" to find the fsname from the end of the instance name. The current parameters look like: # lctl list_param llite.*.max* llite.myth-ffff909824e7f800.max_easize llite.myth-ffff909824e7f800.max_read_ahead_async_active llite.myth-ffff909824e7f800.max_read_ahead_mb llite.myth-ffff909824e7f800.max_read_ahead_per_file_mb llite.myth-ffff909824e7f800.max_read_ahead_whole_mb llite.myth-ffff909824e7f800.max_cached_mb but with this patch they would become: # lctl list_param llite.*.max* llite.myth-f1da1f0c-f89b-473e-b604-8c265d1c1ecd.max_easize llite.myth-f1da1f0c-f89b-473e-b604-8c265d1c1ecd.max_read_ahead_async_active llite.myth-f1da1f0c-f89b-473e-b604-8c265d1c1ecd.max_read_ahead_mb llite.myth-f1da1f0c-f89b-473e-b604-8c265d1c1ecd.max_read_ahead_per_file_mb llite.myth-f1da1f0c-f89b-473e-b604-8c265d1c1ecd.max_read_ahead_whole_mb llite.myth-f1da1f0c-f89b-473e-b604-8c265d1c1ecd.max_cached_mb which not only makes them longer and harder to parse, but also much less readable. If the main concern here is ASLR then we can avoid printing the raw pointer in the parameter name and work out something else. For example, the kernel could save a random 64-bit number at startup time and XOR with that, and if it needs the original pointer back it can XOR again.
you probably wants to update this comment to be inline with the syntax.
The check could be done before trying the copy
LU-13118 lustre: use UUID for naming instead of internal pointers According to ASLR it is considered a security violation to publish internal kernel addresses to user land. Currently lustre uses internal pointer addresses to create an unique identifier that ends up being used to build the sysfs tree. This patch switches this to using the UUID generated. The reason for using UUID is that in the ptlrpc layer there is a mapping between NIDs and UUIDs and many client interfaces have the same UUIDs so we could cheat and use the device name instead. Change-Id: Id91ceece847402658d1e2a364b3602572daaef87 Signed-off-by: James Simmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| conf-sanity-slow@zfs:test_45 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| conf-sanity-slow@zfs:test_69 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-dne | RHEL 9.5 / x86_64 | ran 7 tests. 1 tests failed: sanity. | session |
This says that conf-santity test_45 needs to be updated, but I don't see any changes to that test?
I don't think it is reasonable to expect "umount -f" to be 100% reliable. It certainly isn't for NFS. As long as it helps the unmount processes a long, so a few more tries will succeed, it is enough. That is unless the lustre community has some firm requirements for -f, which Linux itself doesn't have.
I think the issue is a matter of scale. Having your local filesystem fail to unmount because of a transient issue is not a huge deal to clean up, doing it on thousands of nodes is a bigger hassle.
I think a reasonable replacement would be to add a /sbin/umount.lustre script to retry the unmount instead of in the kernel, now that util-linux supports this. Something like:
#!/bin/bash
count=10
while ((count-- > 0)) && ! umount --internal-only "$@"; do
sleep 1
done
It is not enough to make umount.lustre here. I guess the command should be added into rpm spec files too. Try to install lustre from rpms and check whether umount.lustre is in the system as expected. But if we can find mnt from superblock as I mentioned in another comment, we don't need to add this new command.
Feng is correct here - this needs to be added into lustre.spec.in below mount.lustre in the "lustre.files" section:
/sbin/mount.lustre
+/sbin/umount.lustre
%if %{with servers}
/sbin/mount.lustre_tgt
%endif
It doesn't look like it is needed in the debian/ tree since it doesn't mention "mount.lustre" at all.
LU-10824 llite: remove may_umount() loop
Al Viro pointed out the work around for LU-1882 is incorrect. It
can even lead to kernel panics under the right conditions. The
reason for this work around is that PtlRPC messages can still be
received after unmounting. With todays util-linux you can provide
umount helper scripts. Create one for Lustre that does the same
thing that the kernel tried to accomplish.
Fixes: 205a57df2787 ("LU-1882 llite: Adding timed wait in ll_umount_begin")
Test-Parameters: trivial testlist=conf-sanity env=ONLY=45,ONLY_REPEAT=100
Change-Id: I1498c6348022bdd6a74db887ffc8836a7a03bab6
Signed-off-by: Rick Mohr <rmohr@ornl.gov>
Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 crashed | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-pcc. %% THIS TEST SESSION CRASHED %% | session |
[ 2231.421259] ------------[ cut here ]------------ [ 2231.422249] kernel BUG at fs/jbd2/transaction.c:2148! [ 2231.423289] invalid opcode: 0000 [#1] SMP PTI [ 2231.424158] CPU: 0 PID: 129424 Comm: ldlm_bl_03 Kdump: loaded Tainted: G OE -------- - - 4.18.0-553.85.1.el8_10.x86_64 #1 [ 2231.426385] Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011 [ 2231.427473] RIP: 0010:jbd2_journal_try_to_free_buffers+0xfa/0x100 [jbd2] [ 2231.428770] Code: 00 75 f4 eb a7 5b 4c 89 ef 5d 41 5c 41 5d 41 5e 41 5f e9 f9 7f ef de 5b 31 c0 5d 41 5c 41 5d 41 5e 41 5f c3 cc cc cc cc 0f 0b <0f> 0b 0f 1f 40 00 66 66 66 66 90 41 56 41 55 41 54 55 53 4c 8b 2f [ 2231.432135] RSP: 0018:ffffa4c40584b9e8 EFLAGS: 00010246 [ 2231.433142] RAX: 000fffffc001206d RBX: ffffedd9006f92c0 RCX: 0000000000000000 [ 2231.434497] RDX: 0000000000000000 RSI: ffffedd9006f92c0 RDI: ffff9313873d5000 [ 2231.435845] RBP: ffff9312ac220b80 R08: 0000000000000000 R09: ffffa4c40584b9b8 [ 2231.437180] R10: ffffffffffffffff R11: 000000000000003f R12: 0000000000000000 [ 2231.438513] R13: ffffedd9006f92c0 R14: 0000000000000000 R15: 0000000000000000 [ 2231.439846] FS: 0000000000000000(0000) GS:ffff9313bbc00000(0000) knlGS:0000000000000000 [ 2231.441346] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 2231.442443] CR2: 00005654730b7f44 CR3: 000000001ee10005 CR4: 00000000000606f0 [ 2231.443776] Call Trace: [ 2231.444312] ? __die_body+0x1a/0x60 [ 2231.445060] ? die+0x2a/0x50 [ 2231.445662] ? do_trap+0xe7/0x110 [ 2231.446327] ? jbd2_journal_try_to_free_buffers+0xfa/0x100 [jbd2] [ 2231.447503] ? do_invalid_op+0x36/0x40 [ 2231.448243] ? jbd2_journal_try_to_free_buffers+0xfa/0x100 [jbd2] [ 2231.449410] ? invalid_op+0x14/0x20 [ 2231.450127] ? jbd2_journal_try_to_free_buffers+0xfa/0x100 [jbd2] [ 2231.451286] invalidate_inode_page+0x72/0x90 [ 2231.452153] __invalidate_mapping_pages+0x156/0x3c0 [ 2231.453100] ? vsnprintf+0x340/0x520 [ 2231.453821] ? snprintf+0x49/0x70 [ 2231.454488] pcc_inode_put+0x118/0x140 [lustre] [ 2231.455579] pcc_layout_invalidate+0x12a/0x550 [lustre] [ 2231.456629] vvp_conf_set+0xbc/0xe0 [lustre] [ 2231.457505] cl_conf_set+0x62/0x140 [obdclass] [ 2231.458613] ll_layout_conf+0x14d/0x420 [lustre] [ 2231.459553] ? ll_lock_cancel_bits+0x484/0x9b0 [lustre] [ 2231.460612] ll_lock_cancel_bits+0x484/0x9b0 [lustre] [ 2231.461630] ll_md_blocking_ast+0x2d9/0x450 [lustre] [ 2231.462624] ldlm_cancel_callback+0x7b/0x260 [ptlrpc] [ 2231.463897] ldlm_cli_cancel_local+0xa3/0x490 [ptlrpc] [ 2231.464949] ldlm_cli_cancel_list_local+0x113/0x330 [ptlrpc] [ 2231.466082] ldlm_bl_thread_main+0x74b/0x8b0 [ptlrpc] [ 2231.467122] ? finish_wait+0x80/0x80 [ 2231.467875] ? ldlm_handle_bl_callback+0x400/0x400 [ptlrpc] [ 2231.468993] kthread+0x134/0x150 [ 2231.469678] ? set_kthread_struct+0x50/0x50 [ 2231.470499] ret_from_fork+0x35/0x40 [ 2231.471222] Modules linked in: loop mgc(OE) lustre(OE) mdc(OE) lov(OE) osc(OE) lmv(OE) fid(OE) fld(OE) ksocklnd(OE) ptlrpc(OE) obdclass(OE) lnet(OE) libcfs(OE) rpcsec_gss_krb5 auth_rpcgss nfsv4 dns_resolver nfs lockd grace fscache intel_rapl_msr intel_rapl_common crct10dif_pclmul crc32_pclmul ghash_clmulni_intel joydev pcspkr i2c_piix4 virtio_balloon sunrpc ext4 mbcache jbd2 ata_generic ata_piix libata virtio_net crc32c_intel serio_raw net_failover virtio_blk failover
LU-18657 pcc: invalidate instead of truncate inode mapping
When releasing the PCC inode the current code releases the pages
related to both the pcc inode and original inode. It is possible
additional references exist for these inode so we are not
allowed to flush all the pages. Instead use the function
invalidate_mapping_pages() that only handles pages that can be
cleaned up.
Fixes: 9e37963fa0 ("LU-10499 sec: support of PCC-RO for encrypted files")
Test-Parameters: trivial testlist=sanity-pcc
Change-Id: If979b19d68004221909450641de461b92818d243
Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 9.3 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. This build will be scored -1 since fortestonly was specified. | session |
Sure
LU-14799 tests: run stand along mgs test See what breaks for maloo setup. Test-Parameters: fortestonly testlist=conf-sanity standalonemgs=true Change-Id: I0588dc958af7c37b120f146753e898949d9cb599 Signed-off-by: James Simmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| sanity-lnet@ldiskfs+DNE:test_255 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| sanity-lnet@zfs:test_255 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-lnet. | session |
| review-ldiskfs-dne | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
| review-ldiskfs-dne | RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
It would be better to say something like: The lnetctl tool supports gateways specified with a nidrange syntax. For example: gateway: 10.151.0.[1,2,3,4,5,6,7,8]@o2ib
Is strncmp needed vs. strcmp? We use strcmp everywhere else.
I would prefer you remove "route" from the cmd_mappings array (line 4363), and then move this conditional block to same level as the ip2nets conditional:
```
if (mapping) {
...
} else if (!strcmp(scalar_value, "route")) {
...
} else if (!strcmp(scalar_value, "ip2nets")) {
```
The cmd_mappings array should only be for items that don't require a custom handler.
LU-18544 utils: handle special lnetctl import for route setup The lnetctl tool supports the following: gateway: 10.151.0.[1,2,3,4,5,6,7,8]@o2ib in YAML config files as a short hand to setup many gateways. This actually voilates the YAML spec and our code doesn't handle this correctly. We need to support this incorrect behavior since it was allowed with cYAML for a long time. To do this we need to intercept route handling and unroll the gateway entries. The good news is that the '/' used by netmask will not break the YAML spec. Support for netmask has not been implemented yet. Test-Parameters: trivial testlist=sanity-lnet Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: I6a14659f62ab50d0cb521a2b8e34b1638e4f980d
| unique failing test | history |
|---|---|
| runtests-ssk@ldiskfs+SharedKey:test_1 | seen in 100 other reviews |
| runtests@zfs:test_1 | seen in 5 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-1 failed 2× | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-2 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-3 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-3 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-4 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-4 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-5 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-5 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-6 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-6 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-7 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-7 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-8 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-8 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-3 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-4 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-5 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-6 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-7 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-ldiskfs | RHEL 8.10 / x86_64, RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, SLES 15.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 6 tests. 2 tests failed: sanity-sec, sanity. | session |
| review-zfs | RHEL 8.10 / x86_64 | ran 10 tests. 6 tests failed: sanity-lsnapshot, insanity, replay-ost-single, replay-single, sanity-flr, sanit | session |
(defect?) I doubt the UUID should have a linefeed at the end?
LU-18884 osp: use UUIDs instead of NIDs for LWP setup The osp when setting up LWP uses NIDs instead of UUIDs for LCFG_SETUP. This is wrong and NIDs can easily over flow the obd_uuid structure. A side effect of this mistake is that the ptlrpc conn to UUID mapping just ends up being a NID looking up a NID which happens to be itself. That is very wrong. Replace using an NID with a real UUID. Test-Parameters: env=FORCE_LARGE_NID=true,LOAD_MODULES_REMOTE=true Change-Id: I1e08a9475a8dddcfd7f212b6a1b37559c00bf84e Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 crashed | CentOS 8.3/x86_64 | ran 7 tests. 1 tests failed: sanity-sec. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-selinux-ssk-part-2 crashed | CentOS 8.3/x86_64 | ran 7 tests. 1 tests failed: sanity-sec. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-2 crashed | CentOS 8.3/x86_64 | ran 7 tests. 1 tests failed: sanity-sec. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-arm crashed | CentOS 8.3/aarch64, CentOS 8.3/x86_64 | ran 6 tests. 1 tests failed: sanity-sec. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-ubuntu | CentOS 8.3/x86_64, Ubuntu 20.04/x86_64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
LU-10756 ptlrpc: send uevents when import state changes When the import for a client changes state such as when the client is evicted send a uevent to make user land so it can be aware that the import state has changed. This allows the use of udev rules to perform site specific actions. Change-Id: I959700f13bca9ee7889244e1cf75eda4d128c8ca Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-11058 obd: manage checksum state Currently the checksum dump, checksum tunable and the checksum mount options don't affect each other. With this patch: 1) mount option checksum/nochecksum will turn on or off both checksumming and checksum dump. Additionally it will control access to all checksum related sysfs files. 2) Disabling the checksums sysfs file will also disable checksum_dump as well as prevent enabling checksum_dump. Change-Id: I0781cda49933b0f9f19f968ca211872ab3b34692 Signed-off-by: James Simmons <uja.ornl@yahoo.com>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-4 | RHEL 9.3/x86_64 | ran 9 tests. 1 tests failed: sanity-hsm. | session |
| review-dne-zfs-part-4 | RHEL 8.9/x86_64 | ran 9 tests. 1 tests failed: sanity-hsm. | session |
LU-8585 utils: enable fileset use with liblustreapi HSM handling Currently using the special .lustre/fid/X path doesn't work with filesets but the llapi_fid_* API in liblustreapi does. Move the HSM handling in liblustreapi to the llapi_fid_* handling. While sites that need to use fileset can create their own copy agent that uses the llapi_fid_* most sites are reluctant to replace liblustreapi with their own version that can work with fileset. Note sanity-hsm test will not work FILESET since the copy agent for testing will not be updated to use the llapi_fid_* API. Change-Id: Iaa37d0c585f84c15769e415e0fd73be7b25dd296 Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-9897 zfs: migrate autoconf detection to pkgconfig Currently we have extra complexity to determine where packages are installed. This approach is also fragile if packages are not installed in the standard location. This can be handled in a much cleaner way with pkgconfig. Update ZFS handling to use its supplied pkgconfig files it provides. Test-Parameter: trivial Change-Id: I752997a940b0a8c56772bd737f42a5acbd010abb Signed-off-by: James Simmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| conf-sanity2@ldiskfs+DNE:test_48 | seen in 1 other review |
| conf-sanity2@ldiskfs+DNE:test_66 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity2@ldiskfs+DNE:test_68 | NEW 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_103 | NEW 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_108b | seen in 1 other review |
| conf-sanity3@ldiskfs+DNE:test_109a | NEW 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_109b | NEW 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_112 | seen in 2 other reviews |
| conf-sanity-slow@ldiskfs+DNE:test_32a | seen in 2 other reviews |
| conf-sanity-slow@ldiskfs+DNE:test_32d | seen in 2 other reviews |
| conf-sanity-slow@ldiskfs+DNE:test_32e | seen in 2 other reviews |
| conf-sanity3@zfs:test_103 | NEW 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_108a | seen in 1 other review |
| conf-sanity3@zfs:test_112 | seen in 1 other review |
| conf-sanity3@zfs:test_117 | seen in 6 other reviews |
| conf-sanity3@zfs:test_123aa | seen in 6 other reviews |
| conf-sanity3@zfs:test_123ab | seen in 6 other reviews |
| conf-sanity3@zfs:test_123ac | seen in 6 other reviews |
| conf-sanity3@zfs:test_123ad | seen in 6 other reviews |
| conf-sanity3@zfs:test_123ae | seen in 5 other reviews |
| conf-sanity3@zfs:test_123F | seen in 5 other reviews |
| conf-sanity-slow@zfs:test_32a | seen in 2 other reviews |
| conf-sanity-slow@zfs:test_32d | seen in 2 other reviews |
| conf-sanity-slow@zfs:test_32e | seen in 2 other reviews |
| ost-pools@ldiskfs+DNE:test_1a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_1b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_1c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_1m | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_1n | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_2c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_2d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_2e | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_3d | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_4c | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_5a | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_5b | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_6 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_7a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_7c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_11 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_15 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_16 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_17 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_18 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_19 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_20 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_21 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_22 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_23a | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_23b | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_24 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_25 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@ldiskfs+DNE:test_27 | seen in 1 other review |
| ost-pools@ldiskfs+DNE:test_28 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_1a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_1b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_1c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_1m | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_1n | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_2c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_2d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_2e | seen in 1 other review |
| ost-pools@zfs:test_3d | seen in 1 other review |
| ost-pools@zfs:test_4c | seen in 1 other review |
| ost-pools@zfs:test_5a | seen in 1 other review |
| ost-pools@zfs:test_5b | seen in 1 other review |
| ost-pools@zfs:test_6 | seen in 1 other review |
| ost-pools@zfs:test_7a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_7c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_11 | seen in 1 other review |
| ost-pools@zfs:test_15 | seen in 1 other review |
| ost-pools@zfs:test_16 | seen in 1 other review |
| ost-pools@zfs:test_17 | seen in 1 other review |
| ost-pools@zfs:test_18 | seen in 1 other review |
| ost-pools@zfs:test_19 | seen in 1 other review |
| ost-pools@zfs:test_20 | seen in 1 other review |
| ost-pools@zfs:test_21 | seen in 1 other review |
| ost-pools@zfs:test_22 | seen in 1 other review |
| ost-pools@zfs:test_23a | seen in 1 other review |
| ost-pools@zfs:test_23b | seen in 1 other review |
| ost-pools@zfs:test_24 | seen in 1 other review |
| ost-pools@zfs:test_25 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_27 | seen in 1 other review |
| ost-pools@zfs:test_28 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@ldiskfs+DNE:test_27Ce | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@ldiskfs+DNE:test_27D | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@ldiskfs+DNE:test_27G | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@ldiskfs+DNE:test_27I | seen in 1 other review |
| sanity1@ldiskfs+DNE:test_27L | seen in 1 other review |
| sanity1@ldiskfs+DNE:test_27M | seen in 1 other review |
| sanity1@ldiskfs+DNE:test_56wb | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_65n | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_134a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_134b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_140 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_150 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_151 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_154A | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_154B | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_154a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_154b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_154f | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_154g | seen in 5 other reviews |
| sanity2@ldiskfs+DNE:test_155e | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_155f | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_155g | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_155h | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_156 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160d | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160e | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160f | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160g | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160h | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160i | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160j | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_160k | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_161a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_161b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_161c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_161d | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_162a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_162b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_162c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_169 | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_180a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_181 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_183 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_185 | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_185a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_187a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_187b | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_200 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_204a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_204b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_204c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_204d | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_204e | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_204f | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_204g | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_204h | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_208 | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_218 | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_220 | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_222a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_222b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_223 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_224c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_226a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_226b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_228a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_228b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_228c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_229 | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_230a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_230b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_230c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_230d | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_230e | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_230f | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_230i | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_230j | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_230l | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_230m | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_231a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_232a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_232b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_233a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_233b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_238 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_240 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_241b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_242 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_243 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_244a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_244b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_248b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_250 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_252 | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_257 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_270a | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_270b | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_270c | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_270d | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_270e | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_270f | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_271c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_271f | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_272a | seen in 4 other reviews |
| sanity2@ldiskfs+DNE:test_272b | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_272c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_272d | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_272e | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_272f | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_275 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_277 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300d | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300e | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300f | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300g | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300h | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300i | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300j | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300k | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300l | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300n | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300q | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_300r | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_310a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_310b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_311 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_313 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_314 | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_315 | seen in 2 other reviews |
| sanity2@ldiskfs+DNE:test_316 | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_317 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_318 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_319 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_399b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_402 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_406 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_409 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_412 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_413a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_413b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_415 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_417 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_418 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_421a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_421b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_421c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_421d | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_421e | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_421f | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_421g | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_422 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_423 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_801a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_801b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_801c | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_803 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_804 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_806 | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_807 | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_808 | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_809 | seen in 4 other reviews |
| sanity2@ldiskfs+DNE:test_810 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_812a | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_812b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_816 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_817 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_818 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_820 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_901 | seen in 1 other review |
| sanity1@zfs:test_27Ce | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@zfs:test_27D | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@zfs:test_27G | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@zfs:test_27I | seen in 1 other review |
| sanity1@zfs:test_27L | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@zfs:test_27M | seen in 1 other review |
| sanity1@zfs:test_56wb | seen in 1 other review |
| sanity-flr@ldiskfs+DNE:test_204f | NEW 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_204f | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_3 | seen in 1 other review |
| sanity-quota@ldiskfs+DNE:test_5 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_6 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_7a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_7b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_7c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_12a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_16 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_17 | seen in 1 other review |
| sanity-sec@ldiskfs+DNE:test_18 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_19 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_20 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_21 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_22 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | CentOS 7.0/x86_64 | ran 8 tests. 1 tests failed: sanity. | session |
| review-dne-part-2 | CentOS 7.0/x86_64 | ran 11 tests. 3 tests failed: sanity-sec, ost-pools, runtests. | session |
| review-dne-part-3 | CentOS 7.0/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-4 | CentOS 7.0/x86_64 | ran 14 tests. 6 tests failed: insanity, replay-ost-single, sanity-quota, sanity-flr, sanity-pfl, replay-singl | session |
| review-dne-zfs-part-1 | CentOS 7.0/x86_64 | ran 8 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-2 | CentOS 7.0/x86_64 | ran 11 tests. 1 tests failed: ost-pools. | session |
| review-dne-zfs-part-3 | CentOS 7.0/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-4 | CentOS 7.0/x86_64 | ran 16 tests. 4 tests failed: sanity-quota, sanity-flr, sanity-pfl, replay-single. | session |
| review-ldiskfs | CentOS 7.0/x86_64 | ran 7 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-arm | CentOS 7.0/x86_64, CentOS 8.0/aarch64 | ran 7 tests. 1 tests failed: sanity. | session |
| review-zfs | CentOS 7.0/x86_64 | ran 9 tests. 2 tests failed: replay-single, sanity-flr. | session |
LU-8066 obd: remove server sysfs symlinks handling Before the lustre 2.4 OSD work the lov and osc code was used on both servers and clients. With the OSD layer work we saw the new lod and osp layers created that are server specific. To avoid breakage symlinks were created that went from the lod / osp to lov / osc directories in the proc tree on the server side. This required some extra complex code to handle this. It has been a very long time since that change so we can now safely remove all the extra symlink handling to make life easier. Change-Id: I41fd5abab3d648db6d4fa1a355bd7147a34ee478 Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | CentOS 7.0/x86_64 | ran 11 tests. 6 tests failed: sanity-pcc, large-scale, mds-survey, sanity-sec, sanity-lfsck, sanity-scrub. | session |
| review-dne-part-3 | CentOS 7.0/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-4 | CentOS 7.0/x86_64 | ran 10 tests. 8 tests failed: insanity, replay-ost-single, sanity-quota, sanity-dom, sanity-flr, sanity-pfl, | session |
| review-dne-zfs-part-2 | CentOS 7.0/x86_64 | ran 11 tests. 6 tests failed: sanity-pcc, large-scale, mds-survey, sanity-sec, sanity-lfsck, sanity-scrub. | session |
| review-dne-zfs-part-3 | CentOS 7.0/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-4 | CentOS 7.0/x86_64 | ran 10 tests. 1 tests failed: mmp. | session |
LU-8066 mgc: remove no longer needed class_del_profiles() While cleaning up obd_type handling some code to handle lustre 1.14 was found in mgc_cleanup(). This code is obsolete so lets remove class_del_profiles() handling. Change-Id: Ib1e9f9cec060667972b9fa97b1a737f7dbe7edfe Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-102 | CentOS 8.3/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
LU-14799 test: setup and tear down stand alone MGS for conf-sanity While running conf-sanity I found if I have a stand alone MGS server it doesn't even run. For setup() just start the MGS server if stand alone and shut down the stand alone MGS when stop_mds() is called just in case someone forgets to call stop_mgs(). Test-Parameters: trivial testlist=conf-sanity Test-Parameters: standalonemgs=true testlist=conf-sanity Change-Id: Ifc8794e2c9fbb489183e4f205f0b8b9766e13160 Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 8.8/x86_64 | ran 6 tests. 2 tests failed: sanity-pfl, sanity. | session |
| review-dne-part-2 | RHEL 8.8/x86_64 | ran 13 tests. 4 tests failed: sanity-sec, sanity-lfsck, runtests, replay-dual. | session |
| review-dne-part-3 | RHEL 8.8/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-4 | RHEL 8.8/x86_64 | ran 13 tests. 3 tests failed: sanity-quota, mmp, insanity. | session |
| review-dne-part-5 | RHEL 8.8/x86_64 | ran 8 tests. 2 tests failed: sanityn, sanity-scrub. | session |
| review-dne-part-6 | RHEL 8.8/x86_64 | ran 6 tests. 2 tests failed: ost-pools, replay-single. | session |
| review-dne-part-7 | RHEL 8.8/x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-part-8 | RHEL 8.8/x86_64 | ran 4 tests. 1 tests failed: replay-dual. | session |
| 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 7 tests. 2 tests failed: sanity-selinux, sanity-sec. | session |
| review-dne-zfs-part-1 | RHEL 8.8/x86_64 | ran 6 tests. 2 tests failed: sanity-pfl, sanity. | session |
| review-dne-zfs-part-2 | RHEL 8.8/x86_64 | ran 13 tests. 4 tests failed: sanity-sec, sanity-lfsck, runtests, replay-dual. | session |
| review-dne-zfs-part-3 | RHEL 8.8/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-4 | RHEL 8.8/x86_64 | ran 13 tests. 3 tests failed: sanity-quota, mmp, insanity. | session |
| review-dne-zfs-part-5 | RHEL 8.8/x86_64 | ran 8 tests. 2 tests failed: sanityn, sanity-scrub. | session |
| review-dne-zfs-part-6 | RHEL 8.8/x86_64 | ran 6 tests. 2 tests failed: ost-pools, replay-single. | session |
| review-dne-zfs-part-7 | RHEL 8.8/x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
| review-ldiskfs | RHEL 8.8/x86_64 | ran 7 tests. 2 tests failed: sanity-lnet, sanity. | session |
| review-ldiskfs | RHEL 9.2/x86_64 | ran 7 tests. 2 tests failed: sanity-lnet, sanity. | session |
| review-ldiskfs | RHEL 8.8/x86_64, SLES 15.4/x86_64 | ran 7 tests. 2 tests failed: sanity-lnet, sanity. | session |
| review-ldiskfs | RHEL 8.8/x86_64, SLES 15.5/x86_64 | ran 7 tests. 2 tests failed: sanity-lnet, sanity. | session |
| review-ldiskfs | RHEL 8.8/x86_64, RHEL 9.2/x86_64 | ran 7 tests. 2 tests failed: sanity-lnet, sanity. | session |
| review-ldiskfs-arm | RHEL 8.8/aarch64, RHEL 8.8/x86_64 | ran 10 tests. 3 tests failed: sanity-sec, sanity-lnet, sanity. | session |
| review-zfs | RHEL 8.8/x86_64 | ran 18 tests. 6 tests failed: sanity-lsnapshot, insanity, replay-ost-single, replay-single, sanity-flr, sanit | session |
LU-12514 ptlrpc: move thread creation out of module initialization When the ptlrpc module is loaded, it calls ptlrpc_init_portals() which starts ptlrpcd threads, and starts the pinger work-queue. We don't need these threads until the module is actually being used, such as when a lustre filesystem is mounted. So move the thread creation into new ptlrpc_inc_ref() (modelled on ptlrpcd_incref()), and call that when needed, such as at mount time. Linux-commit: 26f7a294e5ecd46856cb9f5b718e995f1ec46779 Linux-commit: ffd87a7b1efeb8f56a229d2ab06d71be7d932d52 Change-Id: Iee077c7dfdeb67ceeeacefc4e6c7f70efef2a864 Signed-off-by: Mr. NeilBrown <neilb@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
LU-9897 build: add real versioning to liblustreapi Originally we added -version-info to increment liblustreapi version every time a new abi was added or changed. This never happened so lets number liblustreapi based the Lustre sovftware version. Test-Parameters: trivial Change-Id: I9f638c0a95b72329325b774d23f73239fcbade03 Signed-off-by: James Simmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| conf-sanity3@ldiskfs+DNE:test_76a | NEW 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_76a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-4 | RHEL 8.10 / x86_64 | ran 9 tests. 3 tests failed: sanity-quota, sanity-flr, replay-ost-single. | session |
| review-dne-part-4 | RHEL 9.4 / x86_64 | ran 9 tests. 3 tests failed: sanity-quota, sanity-flr, replay-ost-single. | session |
| review-dne-part-5 | RHEL 9.4 / x86_64 | ran 6 tests. 2 tests failed: sanityn, recovery-small. | session |
| review-dne-part-5 | RHEL 8.10 / x86_64 | ran 6 tests. 1 tests failed: recovery-small. | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: recovery-small. | session |
| review-dne-zfs-part-4 | RHEL 8.10 / x86_64 | ran 9 tests. 3 tests failed: sanity-quota, sanity-flr, replay-ost-single. | session |
| review-dne-zfs-part-5 | RHEL 8.10 / x86_64 | ran 6 tests. 1 tests failed: recovery-small. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
| review-zfs | RHEL 8.10 / x86_64 | ran 10 tests. 3 tests failed: replay-ost-single, sanity-flr, sanity-quota. | session |
LU-2096 sysfs: symlinks for forward compatibility
Currently, the "ofd" device is still named "obdfilter" in the Lustre
configuration and in /sys/fs/lustre. It would be better to name it
"ost" which is has been the long term goal.
The per-OST device statistics should really be under "ost/{target}",
like the per-MDT statistics are under "mdt/{target}" already in 2.x.
Similarly, the "OSS" statistics have always been under "ost/OSS", but
would be better in their own "oss" subdirectory much like what is done
for "MDS" statistics.
Add symlinks for "oss -> ost/OSS" and "ost -> obdfilter" to keep
older compatibility. In time we can remove those symlinks.
Change-Id: I8c4c81eb55f2880edf1d7811395c4837f50e01d5
Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-101 crashed | CentOS 7.0/x86_64 | ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-1 crashed | CentOS 7.0/x86_64 | ran 8 tests. 2 tests failed: recovery-small, sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-1 crashed | CentOS 7.0/x86_64 | ran 8 tests. 3 tests failed: recovery-small, sanityn, sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | CentOS 7.0/x86_64 | ran 6 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-arm | RHEL 7.6/aarch64, RHEL 7.6/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
LU-10937 sptlrpc: make srpc_info writable Lustre allows tuning of many nodes from the MGS server. Their are two ways to do this and currently sptlrpc can only be set by one method. This patch enables the other approach of setting the sptlrpc by making the debugfs file srpc_info writable which can now accept new configurations. Test-Parameters: envdefinitions=SHARED_KEY=true testlist=sanity,recovery-small,sanity-sec Change-Id: If8ca36dbfce20c13ab603835cf5d77fbc19de7a8 Signed-off-by: James Simmons <uja.ornl@yahoo.com> Signed-off-by: Sebastien Buisson <sbuisson@ddn.com>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-1 | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-2 | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-3 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-3 | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-4 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-4 | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-5 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-5 | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-6 | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-6 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-7 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-7 | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-8 | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-8 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-3 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-4 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-5 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-6 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-7 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-ldiskfs | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-ldiskfs | RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-ldiskfs | RHEL 8.10 / x86_64, RHEL 9.4 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-ldiskfs | RHEL 8.10 / x86_64, SLES 15.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-zfs | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
LU-18041 msg: use UUIDs instead of NIDs for client setup For client setups we are sending NID strings instead of actual UUIDs. This is incorrect. Change-Id: I7ebd1bfe29a5e59c989b9fa5e4166f19cb2336ce Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-102 failed 2× | CentOS 7.9/x86_64, RHEL 8.7/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
LU-0000 test: base code test patch on this Test-Parameters: trivial testlist=sanity-lnet Test-Parameters: serverversion=2.12 serverdistro=el7.9 testlist=runtests Test-Parameters: clientversion=2.12 testlist=runtests Change-Id: Ic52e9934283f34fc635d41a656b6cc0dff088a58 Signed-off-by: James Simmons <jsimmons@infradead.org>
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 9.3/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-4 | RHEL 9.3/x86_64 | ran 9 tests. 1 tests failed: replay-ost-single. | session |
| review-dne-part-8 | RHEL 9.3/x86_64 | ran 4 tests. 1 tests failed: replay-dual. | session |
LU-17060 tests: verify conf-sanity 21c passes Make sure patch 52053 fixes the issue. Test-Parameters: testlist=conf-sanity env=ONLY=21c,ONLY_REPEAT=100 Change-Id: I1092c90b15d0cdc464e251dc07ea310828ce4d15 Signed-off-by: James Simmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| conf-sanity1@ldiskfs+DNE:test_1 | seen in 5 other reviews |
| conf-sanity1@ldiskfs+DNE:test_2 | seen in 8 other reviews |
| conf-sanity1@ldiskfs+DNE:test_3 | seen in 12 other reviews |
| conf-sanity1@ldiskfs+DNE:test_4 | seen in 18 other reviews |
| conf-sanity1@ldiskfs+DNE:test_5a | seen in 21 other reviews |
| conf-sanity1@ldiskfs+DNE:test_5c | seen in 16 other reviews |
| conf-sanity1@ldiskfs+DNE:test_5d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@ldiskfs+DNE:test_5e | seen in 19 other reviews |
| conf-sanity1@ldiskfs+DNE:test_5h | seen in 24 other reviews |
| conf-sanity1@ldiskfs+DNE:test_5i | seen in 26 other reviews |
| conf-sanity1@ldiskfs+DNE:test_6 | seen in 28 other reviews |
| conf-sanity1@ldiskfs+DNE:test_7 | seen in 33 other reviews |
| conf-sanity1@ldiskfs+DNE:test_8 | seen in 34 other reviews |
| conf-sanity1@ldiskfs+DNE:test_9 | seen in 36 other reviews |
| conf-sanity1@ldiskfs+DNE:test_10a | seen in 39 other reviews |
| conf-sanity1@ldiskfs+DNE:test_17 | seen in 41 other reviews |
| conf-sanity1@ldiskfs+DNE:test_23a | seen in 12 other reviews |
| conf-sanity1@ldiskfs+DNE:test_23b | seen in 14 other reviews |
| conf-sanity1@ldiskfs+DNE:test_25 | seen in 3 other reviews |
| conf-sanity1@ldiskfs+DNE:test_26 | seen in 4 other reviews |
| conf-sanity1@ldiskfs+DNE:test_27a | seen in 2 other reviews |
| conf-sanity1@ldiskfs+DNE:test_27b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@ldiskfs+DNE:test_28A | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@ldiskfs+DNE:test_28a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@ldiskfs+DNE:test_28b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@ldiskfs+DNE:test_28c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@ldiskfs+DNE:test_29 | seen in 2 other reviews |
| conf-sanity1@ldiskfs+DNE:test_30a | seen in 2 other reviews |
| conf-sanity1@ldiskfs+DNE:test_30b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity-slow@ldiskfs+DNE:test_69 | seen in 6 other reviews |
| sanity2@ldiskfs+DNE:test_134a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_134b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_150a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_150bb | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_150c | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_150d | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_150e | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_150g | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_151 | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_154A | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_154B | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_154a | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_154b | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_154f | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_154g | seen in 8 other reviews |
| sanity2@ldiskfs+DNE:test_154h | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_154i | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_155e | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_155f | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_155g | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_155h | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_156 | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_160a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160e | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160f | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160g | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160h | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160i | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160j | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160k | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160l | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160m | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160n | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160o | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160p | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160q | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160s | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160t | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_160u | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_161a | seen in 8 other reviews |
| sanity2@ldiskfs+DNE:test_161b | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_161c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_161d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_162a | seen in 4 other reviews |
| sanity2@ldiskfs+DNE:test_162b | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_162c | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_165b | seen in 4 other reviews |
| sanity2@ldiskfs+DNE:test_165d | seen in 4 other reviews |
| sanity2@ldiskfs+DNE:test_165e | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_169 | seen in 5 other reviews |
| sanity2@ldiskfs+DNE:test_170a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_170b | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_172 | seen in 3 other reviews |
| sanity2@ldiskfs+DNE:test_182b | seen in 5 other reviews |
| sanity2@ldiskfs+DNE:test_183 | seen in 4 other reviews |
| sanity2@ldiskfs+DNE:test_185 | seen in 10 other reviews |
| sanity2@ldiskfs+DNE:test_185a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_187a | seen in 4 other reviews |
| sanity2@ldiskfs+DNE:test_187b | seen in 4 other reviews |
| sanity3@ldiskfs+DNE:test_901 | seen in 1 other review |
| sanity3@ldiskfs+DNE:test_904 | seen in 1 other review |
| sanity3@ldiskfs+DNE:test_905 | seen in 2 other reviews |
| sanity3@ldiskfs+DNE:test_907 | seen in 7 other reviews |
| sanity3@ldiskfs+DNE:test_908b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-1 failed 2× | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-2 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-3 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-3 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-4 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-4 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-5 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-5 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-6 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-6 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-7 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-7 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-8 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-part-8 | RHEL 9.5 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-2 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-3 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-4 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-6 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-dne-zfs-part-7 | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% NODE-PROVISIONING AND/OR LUSTRE-INIT FAILED MULTIPLE T | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
LU-18041 msg: use UUIDs instead of NIDs for OSP setup The mgs when processing logs for OSP uses NIDs instead of UUIDs for LCFG_SETUP. This is wrong and NIDs can easily over flow the obd_uuid structure. A side effect of this mistake is that the ptlrpc conn to UUID mapping just ends up being a NID looking up a NID which happens to be itself. That is very wrong. Change from NID string to the real UUID. Test-Parameters: env=FORCE_LARGE_NID=true,LOAD_MODULES_REMOTE=true Change-Id: Ie291b2fd85b6096779d7cf5ee94060edc0e3a590 Signed-off-by: James Simmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| sanity-pcc@ldiskfs+DNE:test_204a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-pcc@zfs:test_204a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-part-7 | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-part-7 | RHEL 9.4 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-zfs-part-7 | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-pcc. | session |
LU-10499 pcc: Add --pin option for 'lfs pcc attach' command If --pin option is provided, 'lfs pcc attach' command will first pin then attach a file. So that user does not need to run them separately. EX-5936 pcc: dont take UPDATE lock when set lustre.pin xattr In this patch, we do not take UPDATE lock whan set lustre.pin XATTR during the PCC pin command. The reason is that it may revoke the combined UPDATE|LAYOUT lock cached on the client namespace, and invalidate the layout and PCC cache. As we disable to cache lustre.pin xattr on the client XATTR cache, so it does not cause problem without taking UPDATE lock bit during set lustre.pin XATTR. Add test case: sanity-pcc/204d. Was-Change-Id: I35a0e399294020efdb0e4710500e8f7b846c290f EX-7395 pcc: use llapi_open_by_fid to check pinned files When check whether a file was pinned in PCC backend, it reported: "cannot read or parse pin xattr of file '/lustre/fsr/.lustre/fid/[0x780001b83:0x2138:0x0]'.: No such file or directory (2)" The failure reason is that open by FID is not configured for subdirectory mounts. In this patch, we use llapi_open_by_fid (which supports for subdirectory mount) to open the file to solve this error. Was-Change-Id: If0120d745418836cfdf449a795b6f524c40f9c27 Change-Id: Iee873821ff5815fd6b56ed8f4c48147f5ef9321f Test-Parameters: testlist=sanity-pcc EX-bug-id: EX-5102 EX-5176 EX-5477 EX-5936 EX-7395 Signed-off-by: Lei Feng <flei@whamcloud.com> Signed-off-by: Qian Yingjin <qian@ddn.com>
| unique failing test | history |
|---|---|
| sanity-lnet@ldiskfs+DNE:test_253 | seen in 1 other review |
| sanity-lnet@ldiskfs+DNE:test_254 | seen in 1 other review |
| sanity-lnet@zfs:test_253 | seen in 1 other review |
| sanity-lnet@zfs:test_254 | seen in 1 other review |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 9.3 / x86_64 | ran 3 tests. 1 tests failed: sanity-lnet. | session |
| review-ldiskfs-dne | RHEL 9.3 / x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
LU-10391 tests: debug ping failures Re-enable failing test. Test-Parameters: trivial testlist=sanity-lnet env=ONLY=253,ONLY_REPEAT=10 Change-Id: I1a55149adbc1413dc26eb004d2832baf96ead3fd Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-6034 lnet: Create a checksum value for LNet package data Using the check sum selected by the adminstrator for a LNet interface check sum the data being handled by the LNet layer. Change-Id: I069fc3a83ec8392174a5b1c6bfe1fca223e3a3af Signed-off-by: James Simmons <uja.ornl@yahoo.com>
Why are you working on a alternate version of the netlink patch series? What's the point?
Its a much simpler API than what has been developed. The other abstract doesn't buy much since its just as complicated. The goal here is to make the effort as little as possible.
The proof will be in the follow-on patches being smaller than the existing ones. The other patch has +450 LOC for the base patch (with only marginally more comments, not a full-on AI deluge), and this one is +270, so that is a good start.
As we previously discussed, having a patch that implements the same functionality on top of this framework matching, say, https://review.whamcloud.com/65205 ("LU-19768 quota: add quota genetlink family") would allow an apples-to-apples comparison.
LU-19768 obd: Create new framework for obd_device based Netlink The netlink API is very complex and each implementation has repeated code. Create a framework to make implementation easier and this allows more code sharing. To demostrate this new API move the target_obd to this new framework. This new framework actually uses the struct genl_info for its family field which exposed some issues with older kernels. Those issues have been fixed. New features: 1) Enforce setup of min_dump_alloc so we never have sk_buff overflow. Common sizes like OBD_GENL_HDR_SIZE and OBD_GENL_SOURCE_SIZE are done for you. ctx->setup_keys() is used to do implementation specific sizing calculations. 2) Besides ensuring the obd still exist only collect obd devices that are attached, set up and not stopping. 3) Each source attribute is per obd device so only emit when the obd changes, not once per message. 4) Use Xarray instead of genradix since it has built in cursor handling. 5) Use of obd device's obd_minor value instead of the obd location string. Test-Parameters: trivial Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: I06931716758cb02b353ba3ec37d08a73fb332c69
Several hunks aren't accounted for by the description, and it isn't obvious which are deliberate: - lnet/utils/lnetconfig/liblnetconfig_netlink.c empty-flow-set handling - lov_obd.c switching class_register_type() from enable_proc=true to false - llapi_param_display_value() changing its success return from 0 to the raw yaml rc - llapi_get_poolbuf() gaining `poolname++` - lu_tgt_pool.op_array changing from __u32 to u32 - lod_pool.c setting op_obd_idx (LOD has no .o_pool_find, so nothing reads it yet) Could the message name the new symbols too - LUSTRE_CMD_POOLS, o_pool_find()/lov_pool_list(), lustre_pools_dump() - so the change is findable via git log?
(typo) The kernel-doc name doesn't match the enum: `lustre_pool_props_attrs` here vs `lustre_pool_prop_attrs` below, and there is no " - description" after the name. kernel-doc warns:
lustre_kernelcomm.h:248: expecting prototype for enum lustre_pool_props_attrs. Prototype was for enum lustre_pool_prop_attrs instead
The same slip already exists for lustre_target_prop_attrs, so it looks copied from there - as is the LUSTRE_POOL_ATTR_SOURCE description "obd device targets belong too", which describes targets rather than pools.
(style) This isn't a bug, but `s` is read from `file->private_data` before seq_open() has set it and then reassigned two lines later - the initializer can just be dropped.
(typo) The reference is now held for the debugfs entry rather than a /proc file.
(minor) The kernel-doc headers were not renamed along with the functions. contrib/scripts/kernel-doc reports four warnings on this file now:
lov_pool.c:154: expecting prototype for pool_proc_next(). Prototype was for pool_seq_next() instead
lov_pool.c:192: expecting prototype for pool_proc_start(). Prototype was for pool_seq_start() instead
lov_pool.c:243: expecting prototype for pool_proc_stop(). Prototype was for pool_seq_stop() instead
lov_pool.c:270: expecting prototype for pool_proc_show(). Prototype was for pool_seq_show() instead
The /proc wording in those blocks ("/proc sequence file iteration tracking structure", "Start seq_file iteration via /proc", "inode to store iteration state for /proc") is also stale now that these back a debugfs file.
(style) This isn't a bug, but the commented-out call here and the matching one in lustre_pools_end_cb() read as work-in-progress. Lustre C files also avoid // comments. Can they come out before this lands?
(defect) With pools now living only under obd_debugfs_entry, the old world-readable /proc/fs/lustre/lov/<dev>/pools/<pool> is gone and the only copy is under /sys/kernel/debug, which is mode 0700. llapi_get_poollist() and llapi_get_poolmembers() grew a Netlink fallback for that, but llapi_search_ost() did not - it still does poolpath() -> fopen(), and poolpath() -> get_lustre_param_path() -> cfs_get_param_paths() globs /sys/kernel/debug/lustre/lov/<fs>-*/pools, which a normal user cannot traverse (GLOB_NOMATCH -> -ENOENT). That propagates to llapi_stripe_param_verify(), which turns it into "pool '%s fsname %s' does not exist" and -EINVAL, so `lfs setstripe -p <pool>` fails for an unprivileged user. `lfs df --pool` and llapi_layout_sanity() -> llapi_search_ost() hit the same path. This change is the top of the relation chain, so nothing later picks it up. Should llapi_search_ost() get the same Netlink fallback in this patch?
(defect) On the -EMSGSIZE path `hdr` is neither ended nor cancelled, so genlmsg_end() never runs and `nlh->nlmsg_len` still covers only the fixed header. The LUSTRE_PARAM_ATTR_HDR/SOURCE attributes already appended to the skb therefore sit past `nlmsg_len`, and userspace reads those bytes as the start of the next nlmsghdr.
warn: lustre_obd_genl_many_dump():inconsistent returns '&(ctx->ogc_xas.xa)->xa_lock'.
(minor) The `! ` prefix is skipped but nothing ever negates the match - lov_pool_list() just does `glob_match(poolname, pool->pool_name)`, so `! foo` selects the same pools as `foo`. No other parameter path in the tree uses a `! ` prefix either. Is the exclusion meant to be implemented, or can this come out?
(defect) `all` is fixed at three slots, but `start` ends up declaring one NLA_NESTED attribute per pool, and lnet_genl_parse_list() consumes one sub-list from `data[]` for each NLA_NESTED key it emits:
rc = lnet_genl_parse_list(msg, data, ++idx);
idx = rc;
With two pools the second nested key looks at `data[2]`, which is NULL, so parse_list() returns 0 without emitting anything and resets `idx` to 0; the third nested key then re-uses `data[1]`. lustre_stats_dump() allocates `ls_num + 2` and fills `all[1..ls_num]` for exactly this reason.
Should this be `pool_count + 2` with `all[1..pool_count]` all pointing at `props`? lustre_pools_free_keys() hard-codes 3 in its OBD_FREE_PTR_ARRAY() as well.
(defect) `lkl_list[]` is a flexible array member, so it is not counted by `sizeof(struct ln_key_list)` and this assignment copies only `lkl_maxattr` - the `pools` and `source` entries stay zeroed from the OBD_ALLOC. Compiling against the real header gives `sizeof(struct ln_key_list)` = 8 and `sizeof(struct ln_key_props)` = 16, and after `*start = pool_keys` both `lkl_list[1].lkp_value` and `lkl_list[2].lkp_value` are NULL. lnet_genl_parse_list() then emits those two keys with no LN_SCALAR_ATTR_VALUE and NLA_UNSPEC as the type, so the reply carries no `pools`/`source` names and llapi_param_display_value() never dispatches to print_out_pools(). This branch is taken as soon as `pool_count > 1`, so does `lfs pool_list` still work on a filesystem with two pools? Would copying `hdr_len + sizeof(struct ln_key_props) * (LUSTRE_POOL_ATTR_MAX + 1)` bytes from `pool_keys` work here instead of the struct assignment?
LU-11850 lov: create Netlink interface for pools With the need to move pools handling to debugfs this prevents non-root user land applications and libraries from accessing this information. Create a Netlink interface that provides the same needed information. Update liblustreapi to use the Netlink YAML approach to gather pools information. Pool source defines itself by the obd device source and pool name so its not the typical single collection of data to obd device. This makes pools require its own dump function. Test-Parameters: trivial Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: I769567270e45f2de074fad2fab78a2f0c3a741b4
(style) LU-20587 is filed as "lnetctl peer show -v 2 causes kernel oops", but the body only describes a capacity limit. Could it say that this is fixing a crash, and describe how running out of skb space in lnet_peer_ni_show_dump() leads to the oops? That makes it much easier to decide whether the change needs backporting.
(defect) This fixes a kernel oops, so it should carry a Fixes: tag. lnet_peer_ni_show_dump() and its single-skb dump came in with:
Fixes: f0be00678cc8 ("LU-9680 lnet: collect data about peer_ni by using Netlink")
(typo) "for it struct sk_buf" - the type is `struct sk_buff`, and "it" should be "its". Same misspelling on the line below.
(style) Not a bug, but 2580 has no derivation in the source, so it silently goes stale the next time an attribute is added to lnet_peer_ni_keys/lnet_peer_ni_list. Same for the literals below: 64 is LNET_NIDSTR_SIZE and the 128 in the version 4 comment is LNET_MAX_SHOW_NUM_NID - using the macros would at least keep them tied to what they measure.
Carrying forward the unbounded-allocation point from patchset 1, which does not look addressed yet: nothing caps cb->min_dump_alloc, and there is no error when the computed size is unreasonable. The sibling handlers in this file and in obdclass do bound it, e.g. lnet_route_show_start():
len += ROUTER_MSG_VALUES_SIZE * rlist->lgrl_count;
if (len > BIT(sizeof(cb->min_dump_alloc) << 3)) {
NL_SET_ERR_MSG(extack, "Netlink msg is too large");
rc = -EMSGSIZE;
} else {
cb->min_dump_alloc = len;
}
Peers are unbounded (unlike NIs, which are capped by lnet_interfaces_max), so the same guard - or a cap on how many peers one dump covers - seems needed here too.
(typo) LNET_GENL_VERION -> LNET_GENL_VERSION.
(defect) Nothing caps cb->min_dump_alloc and there is no error when the computed total is unreasonable. This was raised on patchset 1 ("allocating an 4G in kernel - very very bad style") and the reply agreed peers still need overflow handling since, unlike NIs, they are not bounded by lnet_interfaces_max - but patchset 4 still accumulates straight into the field.
The sibling handler in this file bounds it, in lnet_route_show_start():
len += ROUTER_MSG_VALUES_SIZE * rlist->lgrl_count;
if (len > BIT(sizeof(cb->min_dump_alloc) << 3)) {
NL_SET_ERR_MSG(extack, "Netlink msg is too large");
rc = -EMSGSIZE;
} else {
cb->min_dump_alloc = len;
}
and lustre/obdclass/kernelcomm.c does the same. Two reasons that guard matters here:
min_dump_alloc is u16 in netlink_callback before v5.7, so on the older supported kernels the += silently wraps modulo 65536 - and can wrap to less than PEER_KEY_TABLE_MSG_SIZE.
On newer kernels the skb head is still one contiguous kmalloc, not a kvmalloc: netlink_dump() calls alloc_skb(alloc_min_size, GFP_KERNEL), and __alloc_skb() -> kmalloc_reserve() ends in kmalloc_node_track_caller(). So above KMALLOC_MAX_SIZE the dump can only fail with -ENOBUFS, and below it every dump invocation is asking for a high-order allocation.
(defect) Skipping the peer NI walk for version 0 undercounts, because the dump still emits per peer NI at version 0. In lnet_peer_ni_show_dump() the `if (gnlh->version)` guard only covers the credits/stats block; the nest, LNET_PEER_NI_LIST_ATTR_NID and LNET_PEER_NI_LIST_ATTR_STATE are written for every version:
nid_list = nla_nest_start(msg, LNET_PEER_NI_ATTR_PEER_NI_LIST);
while ((lpni = lnet_get_next_peer_ni_locked(lp, NULL, lpni)) != NULL) {
struct nlattr *peer_nid = nla_nest_start(msg, count++);
nla_put_string(msg, LNET_PEER_NI_LIST_ATTR_NID, ...);
That is 4 + nla_total_size(strlen(nid) + 1) + nla_total_size(5) per peer NI, plus 4 for the nid_list nest, none of which appears in PEER_VERSION_0_VALUES_MSG_SIZE.
For a peer with a 17-character NID: 20 (genl header) + 24 (primary nid) + 4 (multirail) + 4 (nest) + 40 per peer NI. One NI is 92 and fits in 136; three NIs is 172 and does not. Longer NIDs push the single-NI case over as well.
Version 0 is not a corner case - `lnetctl peer show` with no -v passes detail = 0 as the genl version (lnetctl.c jt_show_peer()), and `lnetctl peer list` passes 0 literally, so this is the common invocation.
Related: the per-peer-NI NID string is not charged in any of the PEER_VERSION_* terms. For version >= 1 the slack in PEER_VERSION_1_VALUES_MSG_SIZE happens to absorb it, but nothing in the table accounts for it, so it goes wrong again the next time one of these constants is tightened. LNET_PEER_NI_ATTR_HDR is documented as 48 bytes here but is nla_put_string(msg, ..., ""), i.e. 8 bytes, and only for the first peer - that leftover is what makes the version 0 number look adequate.
(minor) This builds the whole UDSP info for every peer NI - lnet_udsp_get_construct_info() does a peer table hash lookup and fills a ~2KB struct - and the only thing read back is `cud_pref_rtr_nid[0] != 0`. That is just `!list_empty(&lpni->lpni_rtr_pref_nids)`, which needs no buffer and no lookup. Related to the same allocation: it is done unconditionally at the top, so version 0 and versions 1-3 pay for a buffer they never touch, and LIBCFS_ALLOC_ATOMIC uses GFP_ATOMIC even though this is ->start() in process context - the genradix_ptr_alloc() calls a few lines above use GFP_KERNEL. Worth noting the cost overall: this loop repeats the peer and peer NI traversal that lnet_peer_ni_show_dump() then does again, under ln_api_mutex, so `lnetctl peer show -v 4` now walks every peer twice.
(defect) None of the nla_nest_start() results in this handler are checked, and nla_nest_end() writes through the pointer without a NULL test:
static inline int nla_nest_end(struct sk_buff *skb, struct nlattr *start)
{
unsigned long diff = skb_tail_pointer(skb) - (unsigned char *)start;
start->nla_len = diff;
So once the skb runs out of room, nla_nest_start() returns NULL and the matching nla_nest_end() at the bottom of the loop faults. The nests opened for the -v 2 stats (send/recv/drop/health) are the ones LU-20587 names in its title.
Enlarging the skb makes this less likely, but any residual under-estimate still lands here. Should the dump bail out with -EMSGSIZE when a nest cannot be opened, so a short estimate degrades into a truncated dump instead of an oops?
LU-20587 lnet: expand Netlink support for more peers Currently the LNet Netlink peer interface uses the default size of 64K for it struct sk_buf. This limits the number of peers that can be reported with the Netlink layer. We can manually calculate the cb->min_dump_alloc to allocate the struct sk_buf of the needed size. Test-Parameters: trivial Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: I900ae18d6098df0df699df6a64d1d462702c2b4a
| unique failing test | history |
|---|---|
| conf-sanity1@ldiskfs+DNE:test_5g | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@ldiskfs+DNE:test_29 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@ldiskfs+DNE:test_30b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@zfs:test_5g | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@zfs:test_29 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@zfs:test_30b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-pcc@ldiskfs+DNE:test_20 | seen in 27 other reviews |
(typo) "so are current actions voliates this feature" -> "so our current actions violate this feature".
(defect) Is this claim accurate? The controls the test suite leans on hardest are debugfs-only and have no netlink or sysfs equivalent. fail_loc, fail_val, fail_err, debug, subsystem_debug, dump_kernel (lctl dk), daemon_file and debug_marker are all created by lnet_insert_debugfs() from lnet_table in lnet/libcfs/module.c, so they exist only under /sys/kernel/debug/lnet/. Every suite that does `$LCTL set_param fail_loc=...` or `$LCTL dk` needs those. So the suite still requires debugfs to be mounted; the patch only stops mounting it on our own.
(style) Not a bug, but cfs_try_mount_sys_kernel_debug() was the only user of <sys/vfs.h> (statfs), <linux/magic.h> (DEBUGFS_MAGIC), <sys/mount.h> (mount) and <stdbool.h> (the static bool). Worth dropping those four includes in the same patch.
(defect) conf-sanity test_5g "handle missing debugfs" still checks for this auto-mount and is not updated here:
umount /sys/kernel/debug
$LCTL get_param -n devices | grep -E -v "error" && error "lctl can't access debugfs data"
grep " debugfs " /etc/mtab || error "debugfs failed to remount"
With the mount gone nothing remounts it, so the last line fails.
Worse, the test now leaves /sys/kernel/debug unmounted for the remainder of the conf-sanity run, so later subtests reading debugfs parameters, the `lctl dk` log dump on error(), and the KMEMLEAK check at /sys/kernel/debug/kmemleak all break too. Should test_5g be removed in this patch?
(defect) The netlink alternative cited in the commit message only applies to non-root callers.
lctl get_param / list_param / set_param fall back to llapi_param_display_value() / llapi_param_set_value() only under `rc == -ENOENT && getuid() != 0` (lustre/utils/lustre_param.c:1181, 1243, 1349, 1416, 1640). Root always stays on the glob path.
mount(2) needs CAP_SYS_ADMIN, so the code being deleted only ever did anything for root — non-root already got EPERM, which was silently ignored. That means the one caller class this removal changes is exactly the one with no netlink fallback: on a node where debugfs is not mounted, root now gets ENOENT for everything under /sys/kernel/debug/{lnet,lustre} and has no other route to it.
This was raised on patchset 1 (keep trying to mount for systems that can still use it, just don't print on failure) and the code is unchanged in patchset 2. Dropping only the fprintf() would keep the working case working while satisfying the secure-boot concern.
LU-9680 utils: remove forced debugfs mounting For older platforms debugfs wasn't always mounted but lustre had a heavy dependence on it. Today Linux secure boot enforces the lack of debugfs so are current actions voliates this feature. With the implementation of Netlink we have an alternative to using debugfs so we can remove this forced mounting. We will be able to run our test suite without debugfs after this patch. Test-Parameters: trivial Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: Iaaa2b54d8352a5b9636338b0d10191428c89adaf
| unique failing test | history |
|---|---|
| sanity-hsm@zfs:test_52 | seen in 13 other reviews |
It would be useful to have an explanation of what the problem is, and what this patch is doing to fix it. Is it intended for landing or just running testing?
(style) space required before the open brace '{'
Please fix if patch is refreshed.
LU-14636 pcc: reproduce hang in sanity-pcc 7a Test to see if this is still a problem. Test-Parameters: trivial testlist=sanity-pcc Change-Id: I1e0ad250e0c957f5d52f65d587d6d5cadfd9b3f3 Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-6034 lnet: Enable lnetctl to handle checksum settings for LNet Add the ability for lnetctl to query or set the checksum algorithm for an LNet interface. This patch only enables user land side of setting this. Change-Id: I40ec55e73032d24baf3133703efc59d49446d692 Signed-off-by: James Simmons <uja.ornl@yahoo.com>
LU-11621 utils: optimize lustre_rsync with copy_file_range() Newer kernels and glibc offer copy_file_range() which avoids a context switch needed with read() + write() for file data copying. In the future Lustre can look to optimize this copy on the server backend. Updating lustre_rsync to use this new functionality which should give a performance boost. Test-Parameters: trivial testlist=lustre-rsync-test Change-Id: Ibd67847f8d876075f77e14e2721d22d4905cb9ff Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-12251 tests: re-enable running sanity-flr for PPC Its been a long time since PPC had issues with FLR test. Re-enable those test. We do keep test 50a disabled since it fails on ARM and PPC platforms. Test-Parameters: trivial clientarch=ppc64 testlist=sanity-flr Change-Id: Ia1007f6213b530d4a5695ff6143be14ac2736a6c Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-12252 tests: re-enable running sanity-hsm for PPC Its been a long time since PPC had issues with HSM test. Re-enable those test. Test-Parameters: trivial clientdistro=el8.6 clientarch=ppc64le testlist=sanity-hsm Change-Id: Ibe18524f6a1a92b66a2b6f9454374910761e8344 Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-11621 utils: optimize migrate_copy_data() with copy_file_range() Newer kernels and glibc offer copy_file_range() which avoids a context switch needed with read() + write() for file data copying. In the future Lustre can look to optimize this copy on the server backend. Updating migrate_copy_date() to use this new functionality which should give a performance boost. Change-Id: I601fb1e413f243775a464d8145351d772e6c8ff1 Signed-off-by: James Simmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| sanity-pcc@ldiskfs+DNE:test_21 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-pcc@zfs:test_21 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
LU-13745 test: add PCC test for splice handling Add a test to exercise splice() and eventually sendfile() handling with PCC. Test-Parameters: trivial env=ONLY=21 testlist=sanity-pcc Change-Id: Iae2517110c7332a81d0334232772ef1844d320ae Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-11621 utils: add special code to profile performance
Add the ability to migrate files with copy_file_range() with a
new optional lfs flag. Also add the ability to move different
size chunks for migration to see the performance.
To test this I create two pools and made a file to move between
them. Original the file is created on the 'slow' pool. The
script I used to test this is as follow:
echo "creating file ....."
lfs setstripe -c $((TGT_MAX / 2)) -p $FSNAME.slow $MOUNT/testfile
dd if=/dev/urandom of=$MOUNT/testfile bs=1M conv=fdatasync count=$((512 * TGT_MAX))
echo 3 > /proc/sys/vm/drop_caches
lfs ladvise -a dontneed $MOUNT/testfile
for iosize in 1M 4M 16M 64M; do
echo "migrating file iosize = $iosize for transfer direct I/0"
time lfs migrate --pool $FSNMAE.fast -z $iosize $MOUNT/testfile
for copy in --non-direct --copy-range; do
echo "migrating file iosize = $iosize for transfer $copy"
time lfs migrate --pool $FSNMAE.fast $copy -z $iosize $MOUNT/testfile
printf '\n'
done
done
This patch is only for testing.
Change-Id: I057208d8f9d095a2f652e0e649bd5a77a87c9854
Test-Parameters: trivial
Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-8980 llite: add tracepoint support for llite layer Add initial trace events for debug logs that never get printed to the console for llite layer. Change-Id: Ia15f669271218ae6e79754d9a9ee4080cee7a957 Signed-off-by: James Simmons <uja.ornl@yahoo.com>
LU-6864 tests: properly skip sanity/245b in interop
Skip sanity test_245b if the server does not support multi_mod_rpcs.
Lustre-commit: https://review.whamcloud.com/47656
Lustre-commit: c4ebdc96061ae9c24ac471b2866f2087bc3e98d4
Test-Parameters: trivial serverversion=2.14 testlist=sanity env=ONLY=245
Fixes: 23028efcae01 ("LU-6864 osp: manage number of modify RPCs in flight")
Signed-off-by: Andreas Dilger <adilger@whamcloud.com>
Change-Id: Ibd73625c64deaa99f6f2a515bc1214cbb83ebbe5
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Lai Siyao <lai.siyao@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
LU-9680 utils: handle very large netlink message in liblnetconfig
A few scaling patches have exposed a problem in the liblnetconfig
library when receiving message from kernel space. Currently we
examine if the remaining space falls below a certain level, 1024
bytes, then we increase the internal buffer size to receive the
next Netlink message. It is possible that the next Netlink message
is much larger than the remaining 1024 bytes. This patch changes
it to compare the calculated size needed to fit the unpacked
Netlink packet into the internal buffer. Be aware the internal
buffer consumes more space than the size of the received Netlink
packet so we scale it by 4 which covers most cases. The new
buffer size is to ensure it's large enough to cover the next
Netlink packet. A few other issues are addressed as well. Now
data->read is correctly preserved which matters for Netlink
streaming. On error of realloc() we preserve data->start so
it doesn't leak. Lastly set data->error to an errno code
return from a new function nlerr2syserr() which was missed
for yaml_netlink_read_handler(). Unlike most c applications
Lustre utilities treat errno as a negative value. Its still
can be used by strerror().
Test-Parameters: trivial
Fixes: 985fc4fa2caf ("LU-14391 utils: handle very large YAML data sets.")
Signed-off-by: James Simmons <jsimmons@infradead.org>
Change-Id: I60d81bd21496f814b1e8e4884dc4d4a5334fd21c
Most other `gnlh->version` checks use `if (!gnlh->version) goto XXX` to skip the code (even for a few lines), but this huge block of code is indented. It would be better to move these 200 lines of code into a separate function instead of keeping it inline in this sprawling 400-line function.
LU-9680 lnet: pass version to lnet_genl_send_scalar_list
By default genlmsg_put() sets the message version to the default
genl_family version. That is the latest version. Much of our
Netlink handling involves requesting that a specific version
of a message be sent back to user land and user land can query
the received version. This change ensures the correct version
is sent with the key table message.
Test-Parameters: trivial
Fixes: 3c39dac19aa ("LU-9680 utils: add netlink infrastructure")
Signed-off-by: James Simmons <jsimmons@infradead.org>
Change-Id: I16bac147b69b0761b96aa9f5c01222b8353355c4
LU-6864 osp: manage number of modify RPCs in flight Currently we use a rpc_lock to ensure concurrent in-flight request are handled serially to prevent the execution status from being over written. This patch changes the osp component to send multiple modify RPCs in parallel to the MDT. This will improve metadata performance of cross-MDT operations. For testing replace mkdirmany with createmany -d which does the same thing. Lustre-commit: https://review.whamcloud.com/14375 Lustre-commit: 23028efcae01bf1274a68fd2dd379fbb33300e82 Signed-off-by: Gregoire Pichon <gregoire.pichon@bull.net> Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: Icb601afabd6767463634a4c7943ec4206bc758ec Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Reviewed-by: Lai Siyao <lai.siyao@whamcloud.com>
| unique failing test | history |
|---|---|
| ost-pools@ldiskfs+DNE:test_25 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_25 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| recovery-small@ldiskfs+DNE:test_29a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| recovery-small@zfs:test_29a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@ldiskfs+DNE:test_56od | seen in 6 other reviews |
| sanity2@ldiskfs+DNE:test_65k | seen in 2 other reviews |
| sanity2@zfs:test_65k | seen in 2 other reviews |
| sanity-slow@zfs:test_255c | seen in 3 other reviews |
| sanity-lfsck@ldiskfs+DNE:test_43 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lfsck@ldiskfs+DNE:test_45 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lfsck@zfs:test_45 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_16c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_80 | seen in 81 other reviews |
| sanity-quota@zfs:test_16c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
It would be better to have a table declaring the stats, then have a loop iterating over all entries in the table to call lpricfs_counter_init() for each entry.
LU-13139 obdclass: collect stats for OSD methods frequency and time spent in each method is collected, then can be found in os[dp].*.osd_stats and lod.*.osd_stats: osd-ldiskfs.lustre-MDT0000.osd_stats= snapshot_time 1674142976.044241006 secs.nsecs start_time 1674142916.072747822 secs.nsecs elapsed_time 59.971493184 secs.nsecs trans_create 259 samples [usecs] 2 18 2000 18560 trans_start 259 samples [usecs] 0 249 505 64715 trans_stop 259 samples [usecs] 0 1906 11820 10291894 read_lock 332 samples [usecs] 0 1 3 3 write_lock 284 samples [usecs] 0 0 0 0 decl_create 100 samples [usecs] 0 12 57 491 create 94 samples [usecs] 11 96 4060 198414 decl_destroy 2 samples [usecs] 4 12 16 160 attr_get 493 samples [usecs] 0 23 24 530 decl_ref_add 36 samples [usecs] 0 0 0 0 ref_add 24 samples [usecs] 0 1 1 1 decl_ref_del 2 samples [usecs] 0 0 0 0 decl_xattr_set 102 samples [usecs] 0 0 0 0 xattr_set 15 samples [usecs] 0 5 10 32 xattr_get 35 samples [usecs] 0 7 17 91 decl_insert 116 samples [usecs] 0 0 0 0 insert 116 samples [usecs] 0 31 441 5607 ... osp.lustre-MDT0000-osp-MDT0001.osd_stats= snapshot_time 1734959321.493552049 secs.nsecs start_time 1734959257.142508748 secs.nsecs elapsed_time 64.351043301 secs.nsecs trans_create 5 samples [usecs] 0 0 0 0 trans_start 5 samples [usecs] 0 0 0 0 trans_stop 5 samples [usecs] 0 306 324 93870 read_lock 4 samples [usecs] 0 0 0 0 write_lock 13 samples [usecs] 0 0 0 0 decl_create 3 samples [usecs] 0 1 1 1 create 3 samples [usecs] 0 2 2 4 attr_get 16 samples [usecs] 0 34 68 2312 Change-Id: I1efe3eb5e646cd638a5fe558886468faa528a9d1 Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-6 | RHEL 9.7 / x86_64 | ran 4 tests. 2 tests failed: ost-pools, replay-single. | session |
LU-18231 obd: change obd_recovery_expired into OBDF_RECOVERY_EXPIRED
obd_recovery_expired is set from interrupt context and
was moved to a dedicated bitfield variable in
commit 848d709605948 ("b=17760 Separate locking for obd
bitfield and recovery") as to avoid having to use locking
from within the interrupt context.
As we now have migrated to use atomic {test|set|clear}_bit
operations to set individual bits we no longer depend on
spinlocks when accessing them and can thus move this bit
back into the bitmap.
Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com>
Change-Id: I81a2a7efc057b67cdfd82ca978116d44bbca82b8
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 9.5 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity-selinux. | session |
LU-18689 ptlrpc: ensure import exist for sec debugfs files Access sec imports safely under with_imp_locked. This fixes crashes in recovery-small test 57 that look like this: BUG: unable to handle kernel NULL pointer dereference at 00000000000000d0 IP: [<ffffffff81411a45>] do_raw_read_lock+0x5/0x30 RIP: 0010:[<ffffffff81411a45>] [<ffffffff81411a45>] do_raw_read_lock+0x5/0x30 Call Trace: [<ffffffff817e333e>] _raw_read_lock+0x1e/0x20 [<ffffffffa0666f0e>] sptlrpc_import_sec_ref+0x1e/0x40 [ptlrpc] [<ffffffffa06742f0>] srpc_sptlrpc_sepol_seq_show+0x30/0x130 [ptlrpc] [<ffffffff8126f0b5>] seq_read+0x135/0x470 [<ffffffff81245839>] vfs_read+0xb9/0x1c0 [<ffffffff817edf49>] ? system_call_after_swapgs+0x96/0x13a [<ffffffff8124676f>] SyS_read+0x7f/0xf0 [<ffffffff817edf55>] ? system_call_after_swapgs+0xa2/0x13a [<ffffffff817ee00c>] system_call_fastpath+0x1f/0x24 [<ffffffff817edf55>] ? system_call_after_swapgs+0xa2/0x13a Signed-off-by: Oleg Drokin <green@whamcloud.com> Change-Id: Id84c8803317b621cb80a21977eafe5b9cf96a9be
warning: sparse:symbol 'ptlrpc_pmqos_use_stats_for_duration' was not declared. Should it be static?
all these need to be static
warning: sparse:symbol 'cpus_latency_qos' was not declared. Should it be static?
and this one too.
I suspect this might not be safe either. ptlrpc_connection_addref() is just an unchecked increment. Same thing is done under rev_import_reconnect(). Export connections can be swapped and old ones dropped in target_handle_connect() (ldlm_lib.c:1604-1615. Since connections are now freed immediately when ref reaches zero, I think this becomes another potential use-after-free in both the reply handling and revert-import reconnect paths.
Do we need a reference here since connection is dereferenced below (line 915)? I'm concerned this could race with the connection being replaced in import_select_connection(). If I'm right then is potentially use-after-free.
LU-17594 ptlrpc: remove ptlrpc_connection hash table With the removal of c_remote_uuid and c_self, it's clear that the hash table in connection.c is simply mapping a lnet_processid to itself. We can remove the hash table entirely. With this change, ptlrpc_connection becomes a ref counted lnet_processid. In the future, we may be able to remove ptlrpc_connection entirely. Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: I9665fb321e961be308bd18327fca0efe2b57c01b
LU-7672 tests: Update Kerberos set up script Update and clean up the Kerberos set up script setup_kerberos.sh. Test-Parameter: forbuildonly Signed-off-by: James Nunez <james.a.nunez@intel.com> Change-Id: Iae7b1a7a524759c524bc0a69f4755a8c6eed3f9a
| unique failing test | history |
|---|---|
| sanity-quota@zfs+DNE:test_12b | seen in 100 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-2 | CentOS 7.0/x86_64 | ran 13 tests. 1 tests failed: sanity-sec. | session |
LU-8875 lnet: Change to new RDMA done callback mechanism Adapt to changes made to the RDMA API: - change call to ib_create_cq() to ib_alloc_cq() (use SOFTIRQ for callbacks) - change call to ib_destroy_cq() to ib_free_cq() - introduce a new struct kib_sched_element as the items we put on the kib scheduler work list (rather than putting connections to be processed) - added a kib_sched_element to kib_tx and kib_rx so they can be scheduled to be processed by the kib scheduler - have separate callbacks for each CQ operation type - set the proper callback to be called when setting up CQ elements - change kiblnd_scheduler() to process work items (kib_sched_element) rather than process connections All of this means we are making good use of the new RDMA CQ callback mechanism and focusing our scheduler to process complete items rather than letting it process connections and have to poll for completions. Test-Parameter: trivial nettype=o2ib Signed-off-by: Doug Oucharek <dougso@me.com> Change-Id: I4ba719578086fedb68ca554eeec191c839ceaca2
I am really suspicious about this patch. current master-next on boilpot started to get strange use after free problems which seem to be accessing OBD device that's already freed. Four distinct trace so far: https://knox.linuxhacker.ru/crashdb_ui_external.py.cgi?newid=73710 https://knox.linuxhacker.ru/crashdb_ui_external.py.cgi?newid=73714 https://knox.linuxhacker.ru/crashdb_ui_external.py.cgi?newid=73724 https://knox.linuxhacker.ru/crashdb_ui_external.py.cgi?newid=73725 I am going to omit it next time over and we'll see how it works. Not setting -1 just yet
dropping this patch resulted in total disappearance of the problems reported in the latest master-next over the last week
Odd. I wonder if this is exposing an issue introduced in a previous patch somehow?
LU-18162 obdclass: standardize class_(un)register_type Rather than passing many arguments to class_register_type(), statically define all of the fields of the LU type and pass only that LU type to the class register/unregister functions. This makes it easier to see what methods are defined on each LU device type and also aligns more closely with Linux kernel style. This patch precedes the unification of OBD and LU type. Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: Ie33f55abaeaa76d9ede2c11a84a82660827a61f4
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
LU-17022 obdclass: convert more flags to bitops
obd_version_recov:1, /* obd uses version checking */
obd_replayable:1, /* recovery enabled; inform clients */
obd_no_recov:1, /* fail instead of retry messages */
are now
OBDF_VERSION_RECOV, /* obd uses version checking */
OBDF_REPLAYABLE, /* recovery enabled; inform clients */
OBDF_NO_RECOV, /* fail instead of retry messages */
Introduce odb_copy_flag() to copy a flag from one obd to another.
Signed-off-by: Mr NeilBrown <neilb@suse.de>
Change-Id: Id7827b7739ca16f682ec11a216c2b35028d099de
| unique failing test | history |
|---|---|
| sanity-hsm@ldiskfs+DNE:test_113a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-hsm@ldiskfs+DNE:test_113b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-hsm@ldiskfs+DNE:test_113c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-hsm@ldiskfs+DNE:test_113d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-hsm@zfs:test_113a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-hsm@zfs:test_113b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-hsm@zfs:test_113c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-hsm@zfs:test_113d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| 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 11 tests. 1 tests failed: sanity-hsm. | session |
| review-dne-part-4 | CentOS 7.0/x86_64 | ran 10 tests. 2 tests failed: sanity-flr, sanity-pfl. | session |
| review-dne-selinux | CentOS 7.0/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-1 | CentOS 7.0/x86_64 | ran 6 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 crashed | CentOS 7.0/x86_64 | ran 12 tests. 2 tests failed: sanity-flr, replay-single. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs | CentOS 7.0/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-arm | CentOS 7.0/x86_64, CentOS 8.0/aarch64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-zfs | CentOS 7.0/x86_64 | ran 8 tests. 1 tests failed: sanity-flr. | session |
LU-6081 hsm: adding migration support Currently file migration is done by "lfs migrate". This has a couple problems. It doesn't scale well to large files and/or large number of files to copy. If an external tool (such as Robinhood) wants to migrate a file, it has to spawn lfs to do the job, for every file, which has a large overhead, or copy the file itself. A solution to this issue is to move the copy operation into the HSM copytool. The copytool already knows how to copy files, and Lustre has control over these files. Migrating a file, from an application point of view, becomes more or less the same as archiving a file. Since the file copy is done by the copytool, this copy can be optimized in one place. This patch adds the ability for HSM to migrate a file within a single Lustre filesystem. The posix copytool is enhanced to support the file migration, and the lfs migrate command now supports that option with --hsm and -a flags. HPE-bug-id: LUS-5669 Signed-off-by: Ben Evans <beevans@whamcloud.com> Change-Id: Id72db5acb3f84292b081efac4657520f0054778b
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-101 | CentOS 7.0/x86_64, RHEL 7.6/x86_64 | ran 5 tests. 1 tests failed: sanity-hsm. | session |
| review-dne-part-2 | CentOS 7.0/x86_64 | ran 12 tests. 1 tests failed: sanity-hsm. | session |
| review-dne-zfs-part-2 | CentOS 7.0/x86_64 | ran 12 tests. 1 tests failed: sanity-hsm. | session |
LU-7659 hsm: Use netlink for KUC communication Make communications between MDC and copytools rely on asynchronous netlink communications instead of pipe based communication. Currently how the communications is done is considered incorrect as described here: https://www.linuxjournal.com/article/8110 This new netlink API uses generic netlink to avoid taking a dedicated netlink family number. Kernel now initiates communication by creating socket at module load time and message sending from kernel has changed from synchronous vfs writing to asynchronous netlink sending. As for now, copytools subscribe to both netlink & KUC groups. Copytools registration still rely on ioctls to populate KUC groups, but no more file descriptors are sent to the kernel to perform VFS writing. Change-Id: I777a24831ad3ef4bdb2be6deb57ed45be91bcf9e Test-Parameters: testlist=sanity-hsm clientcount=3 osscount=2 mdscount=2 Signed-off-by: Yohan Pipereau <yohan.pipereau.ocre@cea.fr>
LU-10968 hsm: create external HSM queue interface Add more, consistent, information to messages including HSM action. Create an interface for an external HSM queue Create a demonstration external HSM coordinator Create llapi calls for external cdt to communicate with Lustre sanity-hsm can be set to use an external coordinator by specifying COORDINATOR=external on the command line You must run the external coordinator on the MDS Handles all current HSM activities. No changes to any other programs are needed. Signed-off-by: Ben Evans <beevans@whamcloud.com> Signed-off-by: James Simmons <jsimmons@infradead.org> Cray-bug-id: LUS-5990 Test-Parameters: env=COORDINATOR=external testlist=sanity-hsm Change-Id: I2cbd2f8b641d8fdca427d6de82f58af58be4a477
| unique failing test | history |
|---|---|
| sanity-flr@ldiskfs+DNE:test_212 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| sanity-flr@zfs:test_212 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: sanity. | session |
| review-dne-part-1 | RHEL 9.3 / x86_64 | ran 4 tests. 1 tests failed: sanity. | session |
| review-dne-part-4 | RHEL 9.3 / x86_64 | ran 9 tests. 1 tests failed: sanity-flr. | session |
| review-dne-part-4 | RHEL 8.10 / x86_64 | ran 9 tests. 1 tests failed: sanity-flr. | session |
| review-dne-part-7 crashed | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-7 crashed | RHEL 9.3 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-flr. | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-4 | RHEL 8.10 / x86_64 | ran 9 tests. 1 tests failed: sanity-flr. | session |
| review-dne-zfs-part-7 crashed | RHEL 8.10 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-flr. | session |
| review-ldiskfs | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, SLES 15.5 / x86_64 | ran 5 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 | RHEL 9.4 / 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. 2 tests failed: sanity-lnet, sanity. | session |
| review-zfs | RHEL 8.10 / x86_64 | ran 8 tests. 1 tests failed: sanity-flr. | session |
LU-14319 layout: make foreign layout as a mirror component A closer coupling between the HSM archive state/PCC-RW/PCC-RO (a kind of a foreign layout) and Lustre File Level Redundancy (FLR) can make PCC and HSM management more consistent with the management of other replicas in the file system. This patch adds the basic support to store foreign layout as a FLR mirror component. Signed-off-by: Qian Yingjin <qian@ddn.com> Change-Id: Ic4d699bc512599438a5ef2c1a300099494de1aed
I am nto sure where exactly ther's some sort of a calculation error, but I have a whole bunch of this message triggering for seemingly random prints all around (tend to be longish)in master-next (this is where I am carrying this patch for a while) even though this patch itself did nto trigger it. Example: http://testing.linuxhacker.ru/lustre-reports/35860/testresults/sanity2-ldiskfs-DNE-centos7_x86_64-centos7_x86_64/oleg342-server-console.txt [ 2711.693691] Lustre: DEBUG MARKER: == sanity test 103e: inheritance of big amount of default ACLs ========================================================== 15:41:10 (1695584470) [ 2930.646958] Lustre: lustre-MDT0000: Client 229219ca-e0b5-499a-9ab0-176123ac3994 (at 192.168.203.42@tcp) reconnecting [ 3211.379426] Lustre: format at ldlm_lib.c:3286:target_send_reply_msg doesn't end in newline [ 3211.806304] Lustre: format at service.c:2323:ptlrpc_server_handle_request doesn't end in newline [ 3211.984069] Lustre: format at ldlm_resource.c:1799:ldlm_resource_dump doesn't end in newline [ 3212.219257] Lustre: format at ldlm_resource.c:1660:ldlm_resource_add_lock doesn't end in newline
LU-14428 libcfs: replace tracefile buffer with ring_buffer Linux has a generic ring-buffer API which uses minimal locking and allows entries to be appended from any context. This is essentially the same functionality provided by trace_data abstraction in tracefile.c, though with less locking overhead. This patch removes the trace_data support and switches to use ring_buffer. The API functionality is not identical so some adjustments need to be made. In particular once an entry in the log has been reserved, it is not possible to reduce the size of the reservation, only to use it or discard it, where discarding might result in the space being wasted in the rare case that more space is reserved from a different context (e.g. interrupt). So instead we use a modest sized on-stack buffer to hold the formatted result, and strcpy() that to a ring_buffer. If the on-stack buffer isn't big enough (approximately 20% of messages in some testings) we need to format a second time, though we do that less often than the current code. The strcpy should be fast compared to vsprintf so this should be a net win. ring_buffer doesn't record whether a message was generated in interrupt or process context and the information is not generally useful, so that field in the ptldebug_header is now always set to zero. The pages stored in ring_buffer are not the same format as are expected by user-space, so we cannot extract whole pages and copy them to the file, but instead extract individual entries and write them to the file. Similarly, pages cannot be moved to the daemon_list, but the contents need to be copied. Also discard libcfs_debug_binary as it is ALWAYS 1 and the code would be buggy if it were zero. Signed-off-by: Mr NeilBrown <neilb@suse.de> Change-Id: Iab259c0538e970f5a77d15c453d72bf378c59c32
LU-14439 utils: skip server mount libs on client Do not include ldiskfs or zfs files in the Makefile when "./configure --disable-server" is used, or if configure does not detect any server-side support. Move server-side utilities under server conditionals. Test-Parameters: trivial Signed-off-by: Andreas Dilger <adilger@whamcloud.com> Change-Id: I244e10dfaee3470e9ad48e78dcb8d0d18f3ebbe5
(typo) The test added by this patch is `test_113`, not `test_630`, so the message no longer greps against the code. Also "interace" on the next line.
(style) This isn't a bug, but the `case` is at the same indent as the enclosing `for` body while `esac` is one tab deeper. Both should line up one tab inside the loop.
(defect) These rules name `tcp$i` while the nets above are created as `${NETTYPE}$i`. The guard at the top of the test only requires `tcp*`, so with `NETTYPE=tcp1` the nets are `tcp11`..`tcp1140` and none of the UDSP rules match anything.
LU-20221 lnet: fix panic in lnet_net_show_dump with >128 NIDs
Dumping more than ~128 NIDs at high verbosity exhausts the hardcoded
64 KiB Netlink buffer. When the buffer is full, nla_nest_start()
returns NULL. The code previously failed to check this return value,
resulting in a NULL pointer dereference and an immediate kernel panic.
This patch fixes the crash by specifying the needed sk buffer size.
cb->min_dump_alloc is now dynamically sized based on
lnet_net_size_skb().
While strace profiling shows a typical NI payload takes ~480-520 bytes,
NI_MSG_VALUES_SIZE is set to more than 6Kb bytes. This provides
a safe margin for complex UDSP rulesets and massive IPv6 NIDs.
test_630 is added to sanity-lnet.sh to exercise high-stress
Netlink dumps using 140 LNet nets using the same interace and 50
UDSP policies.
Test-parameters: trivial
Fixes: 8f64231185a9 ("LU-9680 utils: fix nested attribute handling in liblnetconfig")
Signed-off-by: Malkeet Singh <masingh@ddn.com>
Change-Id: If8b55d87c13e3a14cb0335108dd3afedbc7a6c5f
Having a comment block that lists the enum field names but doesn't give them any descriptions is a waste of space.
(minor) Two things on this line, both for whenever the patch is next refreshed. `latency` is __u64, so `%lld` is the wrong conversion; `%ju` with a `(uintmax_t)` cast would match the rest of this format string. More visibly, the value printed here is now nanoseconds when the rule came back over Netlink, but the old_api path below still assigns seconds from attr.u.delay.la_latency, and `lctl net_delay_add -l` is still seconds. So `-l 5` followed by `net_delay_list` reports "latency 5000000000" against a current kernel and "latency 5" against a pre-Netlink one, under the same label. Would it be clearer to convert back to seconds here, or to spell the unit out in the output?
Makes sense to fix.
LU-16832 lnet: add nanosecond delay latency support Introduce nanosecond-resolution latency for LNet delay fault injection. The previous interface accepted latency only in seconds (u32). This change promotes the field to u64 nanoseconds and plumbs it so that sub-second delays (s/ms/us/ns) can be expressed precisely. Since this changes the Netlink output we bump the LNet netlink family version. The user land code is updated to accept and process the new latency_ns option for the non ioctl approach. The internal timer is moved to hrtimer for finer level of time resolution. Test-Parameters: trivial Signed-off-by: Sohei Koyama <skoyama@ddn.com> Change-Id: I9ed1bd34cef0f0bf647f87d17dd68f05274e2b28
(minor) Nothing in the patch makes an iter_iov_len() available: what is added is compat_iter_iov_len(), under a guard that makes it the only thing vvp_io.c ever calls. Could the body also say that vvp_mmap_locks() gains an iter_is_ubuf() special case, since that is a behaviour change rather than a rename?
(defect) `len` is not declared - the declaration above is `ssize_t nr`. With -Werror this test fails to compile on every kernel, so HAVE_ITER_IOV_LEN is never defined and the result is silently "no".
iter_iov_len() returns size_t, so this probably wants the same form as the neighbouring LC_SRC_HAVE_IOVEC_WITH_IOV_MEMBER test:
size_t len __attribute__ ((unused));
(typo) `384492c48e6e` does not resolve; the commit is 384492c48e6a ("net: devmem: support single IOV with sendmsg").
(defect) Once the autoconf test compiles, a 6.3+ kernel defines both HAVE_ITER_IOV_LEN and HAVE_USER_BACKED_ITER, so this helper is not compiled - but vvp_mmap_locks() calls compat_iter_iov_len() unconditionally, so vvp_io.c stops building. Right now the only thing preventing that is the broken test above; fixing either one alone breaks the build. Would it be simpler to follow the iter_iov_addr() pattern just above and supply the upstream name, `#ifndef HAVE_ITER_IOV_LEN` / `static inline size_t iter_iov_len(...)`, and call iter_iov_len() from vvp_io.c? Then the call site really does match upstream, and there is no Lustre-only name to keep in sync.
(defect) The advance expression now uses `bytes`, which the loop body modifies: `bytes += addr & ~PAGE_MASK` below, and `bytes -= vma->vm_end - addr` in the inner while loop. The old code advanced by `iov.iov_len` from the iovec copy, which the body never touched (it worked on `bytes` instead). So for an unaligned multi-segment iovec the iterator is advanced by `iov_len + (addr & ~PAGE_MASK)` per segment. The following segment is then scanned from a bogus offset, and a segment shorter than the overshoot is skipped completely, so no mmap lock is taken for it. Keeping the segment length in its own variable, used only by iov_iter_advance(), would preserve the old behaviour.
(minor) Can this branch be reached? The early return above returns 0 unless the iter is ITER_IOVEC or ITER_KVEC, and iter_is_iovec() is false for ITER_UBUF, so a ubuf iter never gets to the loop. Either the branch is dead code, or the gate above is what needs relaxing - the ubuf iter missing its mmap locks entirely looks like the pre-existing problem here.
(minor) compat_iter_iov_len() returns `iov_len - iov_offset`, while the iov_iter_iovec() being replaced returned `min(count, iov_len - iov_offset)`. The clamp is reachable: vvp_io_rw_lock() calls vvp_io_update_iov() -> iov_iter_truncate(vui_iter, crw_bytes) immediately before this, and lov_io_rw_iter_init() has already clipped crw_bytes to the current stripe chunk. A 4M read into a single 4M buffer on a 1M-striped file now asks policy_from_vma() for a 4M extent instead of 1M, and that extent can run past the end of the vma. Clamping with the remaining iov_iter_count() would keep the old extent.
LU-18687 build: iov_iter_iovec to iter_iov_len, iter_iov_addr Add HAVE_ITER_IOV_LEN to ensure an iter_iov_len() is available. iov_iter_iovec() is dropped and the address and bytes from the segment are accessed directly. This is done to align with the upstream linux kernel. Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun@tancheff.com> Change-Id: I906b248d03f30a765f27b0916419b88ee178d6a5
(defect) The body only describes removing unused variables, but the osc_page.c hunk also adds a new early return when the LRU wait is interrupted. That is a behaviour change, not a variable removal, and nothing in the message accounts for it. Could the message describe the new abort path (and why it is correct) so a reader isn't surprised by it? If the intent is really just to silence the warning, the alternative would be to drop the assignment entirely and leave the retry loop as-is.
(minor) If the abort-on-signal behaviour is intentional, this is a fix for a loop that could not be interrupted, and it would help to carry a Fixes: tag pointing at the commit that added the uninterruptible retry:
Fixes: e8b421531c16 ("LU-6271 osc: further OSC cleanup after eviction")
(minor) This sha doesn't look like the origin of the bug. osc_lru_reserve() as added by e8b421531c16 had no retry loop at all - a single best-effort cmpxchg, returning 0 when it could not reserve, and no `rc` variable.
The `again:` loop over an unchecked l_wait_event_abortable() came in later:
2a34dc95bd10 ("LU-12142 clio: fix hang on urgent cached pages")
and `rc` only became set-but-unused when 776e163cf542 ("LU-17180 ptlrpc: don't block ptlrpcd too long") replaced `rc = ptlrpcd_queue_work(cli->cl_writeback_work); if (rc) return 0;` with a plain schedule_work().
Since the substance of this hunk is making the wait abortable again, 2a34dc95bd10 looks like the right target:
Fixes: 2a34dc95bd10 ("LU-12142 clio: fix hang on urgent cached pages")
Up here the `rc` is checked and the loop is aborted if the wait is interrupted.
(defect) osc_lru_reserve() returns `unsigned long`, and its value is the number of pages reserved - there is no error channel. Returning -EINTR here hands the caller (unsigned long)-4, i.e. 0xfffffffffffffffc.
osc_io_lru_reserve() stores it verbatim and discards nothing:
oio->oi_lru_reserved = osc_lru_reserve(osc_cli(osc), npages);
RETURN(0);
So the I/O keeps running with a bogus reservation, and two things follow.
osc_lru_alloc() takes the reserved-slot shortcut for every page of the I/O:
if (oio->oi_lru_reserved > 0) {
--oio->oi_lru_reserved;
goto out;
}
cl_lru_busy is incremented but cl_lru_left is never debited, so the LRU budget is bypassed for the rest of the I/O.
Then osc_io_rw_iter_fini() gives the remainder back:
if (oio->oi_lru_reserved > 0)
osc_lru_unreserve(osc_cli(osc), oio->oi_lru_reserved);
and osc_lru_unreserve() does atomic_long_add(npages, cli->cl_lru_left) - the huge unsigned value converts to a large negative long, so cl_lru_left is permanently reduced by roughly (4 + pages touched). cl_lru_left points into the mount-wide cl_cache->ccc_lru_left, so every OSC on the mount is affected, and once it goes negative the next unreserved allocation trips
LASSERT(atomic_long_read(cli->cl_lru_left) >= 0);
in osc_lru_alloc(). The trigger is a fatal signal delivered while a writer waits for LRU slots, which is exactly the case l_wait_event_abortable() exists for.
Would `return 0;` (nothing reserved) work here instead? osc_lru_alloc() then does its own per-page reservation and already handles the abort correctly with `rc = -EINTR; break;`. Alternatively, propagate the failure through osc_io_lru_reserve()'s int return so the I/O actually stops - but that needs the callers of cio_lru_reserve to honour it.
> (defect) osc_lru_reserve() returns unsigned long, and its value is the number of pages reserved - there is no error channel. Returning -EINTR here hands the caller (unsigned long)-4, i.e. 0xfffffffffffffffc. This look correct. I think even coverity will flag this. (-1 just to highlight this)
(style) Not a bug, but there's a stray `;` left after the comment:
return 0; /* reserve nothing */;
(Your thoughts?) Tim, looks like cksum_counter is already being calculated on successful read. Why not (debug)print it below along with client_cksum. Instead of deleting it completely.? This can give us number of successful read's inbetween failures where it is reset to 0.
I'm skeptical it would be useful. We could get similar info (i.e. number of successful reads vs failures) by comparing llite stats to the number of error/debug messages. Plus, static variables like this aren't thread safe. The stat may not be reliable anyway.
I think in the old days the cksum_counter was used to change the `CDEBUG(D_PAGE)` into `CDEBUG(D_ERROR)` when the number of errors exceeded some threshold? I see something similar below with `cksum_missed`. That said, I don't think there is much value to keeping this anymore, just overhead that doesn't provide any value.
LU-16518 osc: fix -Wunused-but-set-variable warnings
Remove unused variables in osc. Clang emits a warning on set
but unused variables, so remove them. For osc_lru_reserve() we don't
handle the rc returned by l_wait_event_abortable(). If we do get
an interruption abort and report we reserved nothing.
Test-Parameters: trivial
Fixes: e8b421531c16 ("LU-6271 osc: further OSC cleanup after eviction")
Signed-off-by: Timothy Day <timday@thelustrecollective.com>
Change-Id: I7cbfbb937ba5b9947bf685fbd3bbff2b6f3b461d
(comment) Fix lockdep bug by splitting function lod_obj_for_each_stripe() into lock/unlocked version
Could we change this to LU-18658 LU ticket number
Sure, I can do that when I refresh.
what if the layout is changing in another thread at the moment?
Sadly this function is called by both the qos and lod object code using two different mutex. Normally we do nested but I don't think nesting the mutexs in this case would be the right fit. Maybe we can use wait_on_bit() which would tell us when the layout_mutex is in use?
Nesting the mutexes is fine, as long as they're consistently nested in the same order. I can see if I can rework this - might require a larger refactor.
LU-20422 lod: fix lockdep bug
WARNING: possible circular locking dependency detected
...
mdt_io00_000/394 is trying to acquire lock:
ffff8881b1c26740 (<d->ltd_rw_sem){++++}-{4:4}, at: lod_initialize_objects+0x503/0xba0
but task is already holding lock:
ffff888260077538 (&lod_obj->ldo_layout_mutex){+.+.}-{4:4}, at: lod_striping_load+0x147/0x530
...
Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&lod_obj->ldo_layout_mutex);
lock(<d->ltd_qos.lq_rw_sem);
lock(&lod_obj->ldo_layout_mutex);
rlock(<d->ltd_rw_sem);
*** DEADLOCK ***
...
dump_stack_lvl+0x54/0x70
print_circular_bug+0x2e8/0x300
check_noncircular+0x12e/0x150
__lock_acquire+0x1447/0x2830
? __lock_acquire+0x5d3/0x2830
? __kmalloc_noprof+0x1a1/0x640
? lock_acquire+0xd5/0x290
? lod_initialize_objects+0x503/0xba0
lock_acquire+0xd5/0x290
? lod_initialize_objects+0x503/0xba0
? lock_is_held_type+0xc7/0x120
down_read+0x42/0x160
? lod_initialize_objects+0x503/0xba0
lod_initialize_objects+0x503/0xba0
lod_parse_striping+0x8e5/0x10a0
? lod_get_ea+0x17a/0x350
lod_striping_load+0x20a/0x530
lod_declare_destroy+0xd8/0x670
? lod_declare_attr_set+0xca/0x660
? lod_declare_attr_set+0xca/0x660
mdd_declare_finish_unlink+0x62/0x160
mdd_declare_rename+0x49f/0x4f0
mdd_rename+0x98e/0x1a40
? __mutex_lock+0x283/0xd80
mdt_reint_rename+0x1fda/0x2f60
mdt_reint_rec+0xa2/0x200
mdt_reint_internal+0x605/0x880
mdt_reint+0xaf/0x110
tgt_request_handle+0x1297/0x1990
? obd_export_timed_fini+0xa2/0xb0
ptlrpc_main+0x2b7d/0x3ac0
? lockdep_hardirqs_on+0x7a/0x110
? __pfx_ptlrpc_main+0x10/0x10
kthread+0x11b/0x140
? __pfx_kthread+0x10/0x10
ret_from_fork+0x1a5/0x370
? __pfx_kthread+0x10/0x10
ret_from_fork_asm+0x1a/0x30
Change-Id: I21e38a0b6fe7cda0c0c0566178d3137c792a5fc7
Signed-off-by: Timothy Day <timday@thelustrecollective.com>
(minor) This one is not a pure move. The old check sat inside the `--enable-efa` block and ran with EXTRA_CHECK_INCLUDE set, so with `--with-o2ib=<MOFED>` it resolved `<rdma/ib_verbs.h>` out of the external OFED tree; the ksym always reads the in-kernel header, and it now runs unconditionally. The new answer looks like the correct one for efalnd, since lnet/klnds/efalnd/Makefile only adds `-I $(EFA_INCLUDE_PATH)` and not the OFED includes. Since it changes what gets detected on MOFED builds, worth a line in the commit message rather than listing it as a plain move.
(minor) The comment being dropped recorded two things this file doesn't: that 4.18.0-193.el8 carries the backport, and why the _rtnl variant is used instead of _rcu (the current locking is rtnl). ksymfind() has an `extra` field for exactly this kind of note, so the rationale could be carried over.
(suggestion) The test being replaced compiled `kernel_bind(NULL, (struct sockaddr_unsized *)0, 0)` under -Werror, so it proved the prototype that lnet_sock_bind()/lnet_sock_connect() and gss_svc_upcall.c actually depend on. Grepping for the struct definition only proves the type exists. Upstream split those apart: bf33247a90d3e adds the struct to linux/socket.h, and the `kernel_bind()`/`kernel_connect()` conversions land in later commits (0e50474fa514, 85cb0757d7e1). On a tree carrying only the struct, HAVE_STRUCT_SOCKADDR_UNSIZED is defined, the `sockaddr_unsized` -> `sockaddr` fallback is skipped, and the casts in lnet/lnet/lib-socket.c hit an incompatible pointer type. Would matching the converted prototype in include/linux/net.h be a closer equivalent?
(style) Not a bug, but collapsing the double space before `=` in the GNILND/KFILND conditionals has nothing to do with moving the lnet checks to ksym, and the commit message doesn't mention it. Drop it or split it out?
LU-20418 build: Move lnet common checks to ksym Move checks for: HAVE_IBDEV_TO_NODE HAVE_IN_DEV_FOR_EACH_IFA_RTNL HAVE_SOCK_INUSE_ADD HAVE_SOCK_NOT_OWNED_BY_ME HAVE_NETDEV_LOCK_OPS HAVE_SENDPAGE_OK HAVE_STRUCT_SOCKADDR_UNSIZED sockaddr_unsized Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: Iaf1759e7d88480254983b2d79c41f12d43974ef6
LU-5960 lnet: add in functionality of lctl to DLC One of the barriers to moving from lctl to lnetctl is the lack of certain functionality. This patch adds some of the feature that are missing back. The following commands have been added: . show peers . add peer . del peer . show connections . close connection . push connection Besides adding in the missing pieces I have added new features such as filtering the listing of peer or connections based on properties such as NID,PID or even LNet type (e.g o2ib1) to the lnetconfig library. From the lnetctl command line one can call lnetctl peer show --nid 10.0.0.1@tcp and it will only show that specific peer. Listing of a grouping of peers is also possible with for example lnetctl peer show --nid o2ib12 which will display all peers belong to the o2ib12 net configuration. Lastly the ability to use DNS hostnames was also added. Signed-off-by: Amir Shehata <amir.shehata@intel.com> Signed-off-by: James Simmons <uja.ornl@yahoo.com> Change-Id: Id102e8a6148d9e2ef8c88880df86e237a14c5ebb
LU-16565 ldlm: [1] Remove ldlm is,set,clear macros
Replaces ldlm_{is,set,clear} macros with the direct flag
names.
The patch has been generated with the coccinelle script in
contrib/cocci/ldlm_flags.cocci.
Test-Parameters: trivial
Signed-off-by: Timothy Day <timday@amazon.com>
Change-Id: If537e331d52884e75cf0a241cdbb061b7d245f9f
| unique failing test | history |
|---|---|
| replay-single@ldiskfs+DNE:test_65a | seen in 1 other review |
LU-8585 llite: don't cache MDS_OPEN_LOCK for volatile files The kernels knfsd constantly opens and closes files for each access which can result in a continuous stream of open+close RPCs being send to the MDS. To avoid this Lustre created a special flag, ll_nfs_dentry, which enables caching of the MDS_OPEN_LOCK on the client. The fhandles API also uses the same exportfs layer as NFS which indirectly ends up caching the MDS_OPEN_LOCK as well. This is okay for normal files except for Lustre's special volatile files that are used for HSM restore. It is expected on the last close of a Lustre volatile file that it is no longer accessable. To ensure this behavior is kept don't cache MDS_OPEN_LOCK for volatile files. Lustre-change: https://review.whamcloud.com/36641 Lustre-commit: 6a3a842add0e941d901869db195ec0068e69cde3 Change-Id: Ia5d78baf17279c6f268bc0bf443b428d5cbea440 Signed-off-by: James Simmons <jsimmons@infradead.org> Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Reviewed-by: Shaun Tancheff <stancheff@cray.com> Reviewed-by: Quentin Bouget <quentin.bouget@cea.fr> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
(minor) This include is unconditional, but `autoMakefile` is still included for every goal outside `ALWAYS_TARGETS`, and automake keeps emitting a `dist dist-all:` rule in the top-level Makefile (lib/am/distdir.am, guarded only by `TOPDIR_P`). So `make rpms`, `make srpm` and `make install` now parse two recipes for `dist` and print
config/Makefile.dist:69: warning: overriding recipe for target 'dist'
autoMakefile:NNNN: warning: ignoring old recipe for target 'dist'
which is what the comment above the conditional include exists to prevent. Could the fragment be included only in the branch that skips autoMakefile?
Separately, being unconditional means every invocation - `make help` included - now runs LUSTRE-VERSION-GEN, `git rev-parse`, a tree-wide `find`, and one `git ls-files` fork per `*.in` file at parse time. None of the other `config/Makefile.*` fragments do shell work at parse time.
(minor) These three targets (no-lustre.spec, no-lustre-dkms.spec, no-LUSTRE-VERSION-FILE) are never referenced — dist: has no prerequisites and nothing else depends on them, so they're dead scaffolding. no-lustre-dkms.spec also substitutes @VERSION@ with $(LVF), which is never defined in this file and expands to empty. If they're leftovers, consider dropping them; if they were meant to generate the specs before archiving, dist: should depend on them and $(LVF) should be $(VERSION).
(defect) `VERSION` and `PACKAGE` are also defined by `config/Makefile.exports`, which the top-level Makefile includes on the very next line, so `VERSION = @VERSION@` wins for everything downstream. `TARNAME` is `:=`, so it keeps the LUSTRE-VERSION-GEN value. That splits the tarball name in two: `dist` writes `lustre-$(LUSTRE-VERSION-GEN).tar.gz`, while `srpm` runs `rpmbuild -ts $(PACKAGE_TARNAME)-$(VERSION).tar.gz` with the configure-time `@VERSION@`. Touch any tracked file after configure and LUSTRE-VERSION-GEN appends `_dirty`, so the names diverge and `make srpm`/`make rpms` fails on a missing tarball. Committing anything after configure does the same. automake derived distdir from `@VERSION@`, so the two could not drift before. Can this reuse `$(PACKAGE_TARNAME)-$(VERSION)` from Makefile.exports, or at least use names that don't collide with it?
(minor) This doesn't seem to hold. `Makefile` picks the fragment up with a relative `-include config/Makefile.dist`, and `./LUSTRE-VERSION-GEN` plus the `--add-file` paths are relative to the cwd as well:
$ mkdir build && cd build && make -f ../Makefile dist
make: *** No rule to make target 'dist'. Stop.
Run from the top of the checkout, `git rev-parse --git-dir` just prints `.git`, which is what plain `git archive` would use anyway. Is the explicit `--git-dir` buying anything?
(defect) `.ONESHELL:` is in effect from the top-level Makefile, so the whole recipe runs in one shell and the exit status comes from the trailing `echo`, not from `git archive`. A failed archive leaves a 0-byte `$(TAR_DEST)` behind and the target still succeeds:
$ make dist
fatal: File not found: nonexistent
DIST lustre-....tar.gz
$ echo $?
0
`srpm` then feeds that empty file to rpmbuild. config/Makefile.pkg-rpm ends each command with `|| exit 1` for exactly this reason. Should this do the same, and `rm -f $(TAR_DEST)` when the archive fails?
(Same reason the `@` on the echo below has no effect - under .ONESHELL only the first line's prefix counts, so the full git command is echoed.)
(minor) `--add-file`, and the "last `--prefix` before it wins" behaviour the ADD_FILES construction relies on, arrived in git 2.38. `lustre/kernel_patches/targets/` still carries 4.18-rhel8.x and 5.3/5.14-sles15sp* targets, and those distros ship git 2.31/2.35. On such a host `make dist` fails outright - silently, given the exit-status issue above. Worth a minimum-git check here, or a note in the commit message?
(defect) `git archive HEAD` packages the committed tree; the automake `distdir` copied from `$(srcdir)`, i.e. the working tree. Building RPMs from a modified checkout is the normal edit/test loop, and the result is now labelled `_dirty` by LUSTRE-VERSION-GEN while the contents come from HEAD. Is dropping uncommitted work intended?
It also makes `dist` git-only. From an unpacked release tarball `git rev-parse --git-dir` fails, `GIT_DIR` is empty, and:
$ git --git-dir= archive --format=tar.gz --prefix=x/ HEAD
fatal: not a git repository: ''
so `make dist`/`make srpm` no longer work there. That's a supported path today - should the commit message call it out?
LU-18687 build: reimplement dist target in plain make Presently, automake handles the dist and install targets. Reimplement the automake dist target in plain make using git archive (along with allowlisting files generated by autotools). Test-Parameters: trivial Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: Ifaacd294a03f9c54279d935f7cbc9b8ab926624d
(minor) Two things the body does not mention, which made the diff larger than the summary suggests: These are not just moved - they are renamed to `compat_capability_u32()` and `compat_set_capability_u32()`. That rename is the sole reason 7 of the 8 touched files change, so it would help to say so (and to say why, since keeping the old names would have made this a two-file patch). `HAVE_U64_CAPABILITY` and `HAVE_STRUCT_FILE_LOCK_CORE` also stop being defined at all, while `HAVE_DENTRY_D_CHILDREN` is kept. Nothing in tree uses the first two today, so this builds fine, but an `#ifdef` on a now-undefined macro fails silently rather than loudly - worth a line in the message for anyone rebasing onto this.
LU-18687 build: drop defines in config.h from lustre_compat.h Moved to config.h C_FLC_* ll_capability_u32 and ll_set_capability_u32 d_no_children and d_for_each_child Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun@tancheff.com> Change-Id: I45987b72905fd7e7c1e49d6e0c608034814889f7
(suggestion) This isn't a bug today, but the new header doesn't quite stand on its own. On HAVE_MNT_IDMAP_ARG kernels `nop_mnt_idmap` is declared in <linux/mnt_idmap.h>; assuming <linux/xattr.h> still only forward-declares `struct mnt_idmap`, this compiles only because every current includer happens to pull <linux/fs.h> earlier in the TU (pcc.c and osd_compat.c via lustre_compat/linux/fs.h, xattr_security.c and osd_internal.h via lustre_compat/linux/security.h, llite_internal.h via obd.h). A new .c file that includes just this header would fail. Adding <linux/fs.h> (or <lustre_compat/linux/fs.h>) here would make it self-contained.
(style) This isn't a bug, but the added include leaves two consecutive blank lines before the DEBUG_SUBSYSTEM define. One is enough.
LU-18687 build: move vfs_unlink and lsm* from lustre_compat.h Core lustre code uses the upstream vfs_unlink() and compat macro lives in compat fs.h Move LSM* compat wrappers to compat security.h Move ll_vfs_setxattr to compat xattr.h Migrate the changes in llite to support user namespace argument to lustre_compat headers to cleanup the ifdef mess in llite. Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun@tancheff.com> Change-Id: Ifd50da01e73ed76d8f344e2a78408b49d22bc6fb
(style) The body opens straight into the file list; a sentence on what this buys (replacing in-kernel compile tests with header greps) and why would help. Also, two of the listed items are not moved checks: `ib_uses_virt_dma.ksym` and `ib_dma_virt_map_sg_EXPORTED.ksym` are new, with no m4 predecessor, and exist only to build the HAVE_OFED_IB_DMA_MAP_SG_SANE expression. Worth saying so.
(minor) `trivial` seems light for a change that alters how o2ib capability detection works on every supported kernel. Would an o2ib-capable session (both the in-kernel ko2iblnd and an external MOFED build) be worth requesting here?
(typo) This status string looks copy-pasted from HAVE_LINUX_BIO_INTEGRITY_HEADER.ksym. Configure prints
checking if [in-kernel] header rdma/ib_verbs.h exists ... yes
for what is really an `IBK_SG_GAPS_REG` enum test. Something like "'IBK_SG_GAPS_REG' is defined" would match the other files here.
(minor) The m4 test being replaced was `offsetof(struct ib_device_ops, unmap_fmr)`, so it answered no once the FMR members went away in v5.8; this grep answers yes on anything from v5.0 on (confirmed against v6.12). No effect today - the only user is inside `#ifdef HAVE_OFED_FMR_POOL_API` in o2iblnd.c - but in-kernel and external now answer the same question differently, since LN_SRC_O2IB_IB_DEVICE_OPS_EXISTS still requires unmap_fmr. Intentional?
(defect) This emits an object-like macro whose *value* carries the answer, so IN_KERNEL_HAVE_OFED_IB_DMA_MAP_SG_SANE ends up defined on every kernel that has `ib_dma_map_sg()` in ib_verbs.h - which is all of them.
The only reader tests presence, not value (lnet/klnds/o2iblnd/o2iblnd.h:17, after the in-kernel sed rewrite):
#if defined(EXTERNAL_OFED_BUILD) && !defined(IN_KERNEL_HAVE_OFED_IB_DMA_MAP_SG_SANE)
#undef CONFIG_INFINIBAND_VIRT_DMA
#endif
so `!defined(...)` is now always false. I ran gen_compat.py against a v6.12 tree with the `EXPORT_SYMBOL(ib_dma_virt_map_sg)` line deleted: the expression evaluates to 0, but the `#define` is still emitted. Should the reader switch to `#if !IN_KERNEL_HAVE_OFED_IB_DMA_MAP_SG_SANE`, or should `macro` be a dict so it is only defined when sane?
Two smaller things on the same construct: `defined` produced by macro expansion inside `#if` is undefined behaviour (C99 6.10.1p4) and gcc warns under -Wexpansion-to-defined; and the generated comment block cites the 2006 `v2.6.19-3257-g9b513090a3c5e` DMA-mapping commit while the macro actually encodes the 5.11-era virt-dma condition, which will read oddly in config.h.
(minor) The test is for the 4-argument form, but the text reads as a plain availability check - on a pre-5.8 kernel configure will say `'rdma_reject()' is available ... no` even though rdma_reject() is there. LN_O2IB_RDMA_REJECT words it "4arg 'rdma_reject' exists"; matching that would be less confusing.
(typo) Empty `message` leaves a bare comment line with trailing whitespace in the generated header. IN_KERNEL_ib_uses_virt_dma.ksym uses 'RDMA/core: remove use of dma_virt_ops' for this same hash.
(minor) In device.c that EXPORT_SYMBOL sits inside `#ifdef CONFIG_INFINIBAND_VIRT_DMA`, so a text grep says yes regardless of the kernel's config, while the Module.symvers fallback answers correctly. ksymfind.check() only falls back to symvers on FileNotFoundError, so against a full kernel source tree the .c is found first and symvers is never consulted - the two paths can disagree for the same kernel. Is the .c grep needed at all here, given symvers is authoritative?
(style) These two macros are now single-line wrappers, and the header comments still describe "o2ib in-kernel|external" plus a `$7` in_kernel mode that no longer exists. Nothing passes `in_kernel` to LB2_LINUX_TEST_SRC() any more either, so the in_kernel branches at 708 (including the HAVE_OFED_COMPAT_RDMA / IN_KERNEL_HAVE_OFED_ sed) and 746 are dead code after this patch. Worth removing them here rather than leaving them to rot.
(minor) Dropping the in-kernel result here hits every caller, not just the nine ported to .ksym. LN_O2IB_IB_DMA_PCI_P2P_DMA_SUPPORTED in config/lustre-lnet.m4 also loses IN_KERNEL_HAVE_OFED_IB_DMA_PCI_P2P_DMA_SUPPORTED, and there is no .ksym for it. Nothing in the tree reads that macro today so it looks harmless, but it isn't mentioned in the commit message - deliberate, or an oversight?
LU-20418 build: Move lnet o2ib in-kernel checks to ksym Perform in-kernel checks: ib_uses_virt_dma.ksym ib_dma_virt_map_sg_EXPORTED.ksym HAVE_IBK_SG_GAPS_REG.ksym HAVE_OFED_RDMA_REJECT_4ARGS.ksym HAVE_OFED_IB_DEVICE_OPS.ksym HAVE_OFED_RDMA_CONNECT_LOCKED.ksym HAVE_OFED_IB_SG_DMA_ADDRESS.ksym HAVE_OFED_FMR_POOL_API.ksym HAVE_OFED_IB_DMA_MAP_SG_SANE.ksym Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: Ie7fd7e31b1c35ef8a6510f8cd2aa30416f251f0b
(typo) Stray `.ksym` suffix here, and this same macro is listed again at the end of the list.
(minor) Duplicate of the entry earlier in the list. The list is also missing `HAVE_GRAB_CACHE_PAGE_WRITE_BEGIN`, which this patch adds as config/compat.d/HAVE_GRAB_CACHE_PAGE_WRITE_BEGIN.ksym and removes from lustre-core.m4. Worth adding so every hunk is accounted for.
(suggestion) This is a header-existence check, but it anchors on a function body line rather than the include guard. The two sibling existence checks added by the previous patch use the guard: `_LINUX_BIO_INTEGRITY_H` and `_LINUX_BLK_INTEGRITY_H`. `__LINUX_UNALIGNED_H` would match here and is far more stable than the generic-implementation body of `get_unaligned_le16()`.
A missed match is not a silent no-op: osd_iam.h falls back to
#include <asm/unaligned.h>
and 5f60d5f6bbc1 deleted asm/unaligned.h in the same commit, so a false negative is a build failure.
(minor) The status text reads as the opposite of the macro it gates. On v6.13+ this prints
checking if module import uses export symbols ... yes
yet that is exactly the case where `HAVE_MODULE_IMPORT_USES_EXPORT_SYMBOLS` is *not* defined (the True branch defines `CRYPTO_INTERNAL` instead). The old m4 printed "if MODULE_IMPORT_NS() uses export symbols ... yes" when the macro *was* defined, so the meaning of the configure line flips with this move. Something like "MODULE_IMPORT_NS() needs a string literal" would track the polarity.
(typo) "availabe" -> "available". This string is printed during configure.
(minor) Same polarity readability point as the module-import check: the file is named `HAVE_PageMlocked` but a true result means `PageMlocked` is gone and `folio_test_mlocked()` is present. Naming the file after the thing it actually detects (or after `folio_test_mlocked_page`, the macro it defines) would avoid a reader reaching for the wrong branch.
This check matches on the `write_begin` prototype, but the recorded commit is the `write_end` conversion. The one that changed `write_begin` is v6.11-rc1-52-g1da86618bdce ("fs: Convert aops->write_begin to take a folio").
The m4 test this replaces carried both commits in its comment; only the less relevant one survived, and it is what ends up in the generated header comment.
(typo) The upstream subject for c6603b1d6556 is "block: rename tuple_size field in blk_integrity to metadata_size" — the "to" is missing here, which reads as a field named `blk_integrity_metadata_size`. This string is copied verbatim into the generated compat header.
LU-20418 build: Move core pre-v6.18 checks to ksym checks Move checks for: HAVE_D_REVALIDATE_WITH_INODE_NAME HAVE_FILE_KATTR HAVE_HRTIMER_SETUP HAVE_IOPS_MKDIR_RETURNS_DENTRY HAVE_LINUX_UNALIGNED_HEADER.ksym HAVE_MODULE_IMPORT_USES_EXPORT_SYMBOLS HAVE_NETIF_GET_FLAGS HAVE_PAGE_MAPCOUNT_IS_TYPE HAVE_PAGE_PRIVATE_2 HAVE_PG_ERROR HAVE_PageMlocked HAVE_SET_DEFAULT_D_OP HAVE_STRUCT_FILE_F_VERSION HAVE_TRY_LOOKUP_NOPERM HAVE_WAIT_ON_PAGE_LOCKED HAVE_WRITE_BEGIN_FOLIO HAVE_WRITE_BEGIN_KIOCB HAVE_blk_integrity_with_metadata_size HAVE_fs_struct_with_seq HAVE_simple_dentry_operations HAVE_LINUX_UNALIGNED_HEADER Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: I0660a66ac4ca3b7387be7eb87efb376a4394cda6
(minor) The body lists 21 macros as moved, but two things in the diff are not covered by that list. LC_FSCRYPT_SUPPORT is deleted from config/lustre-core.m4 and has no .ksym replacement - it is not one of the 21. HAVE_KTHREAD_USE_MM.ksym is also not a pure move: it emits kthread_use_mm()/kthread_unuse_mm() compat defines that LC_HAVE_KTHREAD_USE_MM never produced. Both are worth describing so the diff has no surprises.
and when they decide this does nto need to be GPL - it'll break? fragile.
Yes [for source only checking, ex lustre-in-tree] symvers is also checked below so if the kernel is built (lustre is out-of-tree) then we also fall back to Module.symvers which would have the symbol (if it is exported).
(defect) Adding evidence on the open question above rather than repeating it: the Module.symvers fallback does not cover the source-tree case. In ksymfind.check() (gen_compat.py) the symvers loop lives inside "except FileNotFoundError", so it only runs when the header/source path is missing. When LINUX points at a kernel source tree, fs/file_table.c exists, grep_ex() simply returns no match, errorNoFile stays False, and symvers is never consulted - which is exactly the in-tree/source-only configuration. The old LB_CHECK_EXPORT ran the other way round: Module.symvers first, then grep -E 'EXPORT_SYMBOL.*\(flush_delayed_fput\)' on the source, so it also tolerated the _GPL/_NS spellings. HAVE_ACCOUNT_PAGE_DIRTIED_EXPORT and HAVE_FSCRYPT_D_REVALIDATE have the same shape. Trying symvers first would restore the old behaviour.
(defect) Grepping one header does not follow #include, and on RHEL8 (4.18) include/linux/fscrypt.h is only a 254-line wrapper that includes <linux/fscrypt_supp.h> or <linux/fscrypt_notsupp.h>; fscrypt_dummy_context_enabled() is defined in those two, not in fscrypt.h itself. The old LC_SRC_FSCRYPT_DUMMY_CONTEXT_ENABLED compiled #include <linux/fscrypt.h> so it found the notsupp stub and set the macro. This check will report no on RHEL8, which is a primary tested server kernel. Today that is masked in a default build because LC_CONFIG_CRYPTO AC_DEFINEs the macro for the embedded-llcrypt path, but not for --enable-crypto=in-kernel. Can header take a list so fscrypt_supp.h/fscrypt_notsupp.h are covered too?
(defect) These defines end up in config.h, which is force-included into every translation unit (-include $PWD/config.h in config/lustre-build.m4). lustre/include/cl_object.h:2645 and lustre/obdclass/cl_io.c:1549 already provide the same fallback under #ifndef HAVE_KTHREAD_USE_MM, but spell it use_mm(mm) rather than use_mm((mm)). On a kernel with no kthread_use_mm() (vanilla/Ubuntu 5.4, both listed in lustre/ChangeLog) both fire and the replacement lists differ, so every file that pulls in cl_object.h gets a "kthread_use_mm redefined" diagnostic. Either drop this False branch, or remove the two in-tree fallbacks in the same patch.
(defect) This patch deletes AC_DEFUN([LC_FSCRYPT_SUPPORT], ...) but leaves this call, and there is no .ksym replacement - it is not in the list of checks being moved. With no definition left in the tree, m4 copies the token verbatim into configure and it is executed as a shell command, so has_fscrypt_support is never set. The AS_IF on the next line then always takes the embedded-llcrypt branch, and --enable-crypto=in-kernel can no longer select in-kernel fscrypt. Was this hunk removed by accident along with the neighbouring LC_LM_COMPARE_OWNER_EXISTS/LC_FSCRYPT_DIGESTED_NAME blocks?
LU-20418 build: Move core pre-v5.11 checks to ksym checks Move checks for: GENL_FAMILY_HAS_RESV_START_OP HAVE_ACCOUNT_PAGE_DIRTIED_EXPORT HAVE_BDI_DEBUG_STATS HAVE_BIO_BI_PHYS_SEGMENTS HAVE_BVEC_ITER_ALL HAVE_FLUSH_DELAYED_FPUT HAVE_FSCRYPT_DIGESTED_NAME HAVE_FSCRYPT_DUMMY_CONTEXT_ENABLED HAVE_FSCRYPT_DUMMY_POLICY HAVE_FSCRYPT_D_REVALIDATE HAVE_FSCRYPT_FNAME_ALLOC_BUFFER_NO_INODE HAVE_FSCRYPT_IS_NOKEY_NAME HAVE_FSCRYPT_NOKEY_NAME HAVE_FSCRYPT_PREPARE_READDIR HAVE_FSCRYPT_SET_CONTEXT HAVE_FSCRYPT_SET_TEST_DUMMY_ENC_CHAR_ARG HAVE_ITER_FILE_SPLICE_WRITE HAVE_KEYRING_SEARCH_4ARGS HAVE_KTHREAD_USE_MM HAVE_LM_COMPARE_OWNER HAVE_PRANDOM_H Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: Icdffc743b3acb57a02e663ce67c10cda9e881c9b
(minor) The macro this generates is HAVE_PDE_DATA, not HAVE_pde_data as listed here. The rename itself looks harmless since no C code tests it, but it is a silent change of a config.h macro name and is worth calling out in the body. Also, "remaining checks" reads as if lustre-libcfs.m4 is now empty of kernel checks; roughly twenty LIBCFS_* tests are still there.
(defect) `blk_opf_t` did not exist when bio_alloc() gained the bdev argument; it arrives with v6.0 commit 16458cf3bd15 ("block: Use the new blk_opf_t type"). In v5.18 and v5.19 the second line reads
unsigned short nr_vecs, unsigned int opf, gfp_t gfp_mask)
so the two-line match fails and HAVE_BIO_ALLOC_WITH_BDEV stays undefined on 5.18/5.19, where the removed LIBCFS_BIO_ALLOC_WITH_BDEV compile test defined it (the m4 list it came from grouped it under 5.17).
That is a build failure rather than a silent difference: cfs_bio_alloc() in lustre/include/lustre_compat.h then compiles the `bio_alloc(gfp_mask, nr_vecs)` branch against a bio_alloc() that takes four arguments. The first pattern alone is enough to identify the signature; alternatively relax the type to something like `\w+ opf`.
(defect) The parameter name `objp` was only added to this prototype in v5.16. From v5.10 (the commit quoted above) through v5.15, include/linux/slab.h has
void kfree_sensitive(const void *);
so the pattern does not match and HAVE_KFREE_SENSITIVE is left undefined on exactly the kernels the old LIBCFS_HAVE_KFREE_SENSITIVE test accepted. Running gen_compat.py over upstream headers gives no for v5.10-v5.15 and yes from v5.16 on, which covers RHEL9 (5.14), SLES15 SP4/SP5 (5.14), Ubuntu 22.04 (5.15) and openEuler 22.03 (5.10).
Nothing includes lustre_compat/linux/slab.h today so nothing breaks yet, but that header maps kfree_sensitive() to kzfree(), which no kernel >= 5.10 still defines. Dropping `objp` from the pattern makes it match both spellings.
if you are doing this you also need to escape the () above?
Yes the () should be escaped here. Not sure why a build did not fail ... will check
(minor) 9a5a30568697 is "timers: Get rid of del_singleshot_timer_sync()"; timer_delete_sync() is introduced by v6.1-rc1-11-g9b13df3fb64e ("timers: Rename del_timer_sync() to timer_delete_sync()"). The old m4 comment listed both, and this reference ends up in the generated header, so the rename commit is the one to quote here.
LU-20418 build: Move libcfs remaining checks to ksym checks Move checks for: HAVE_BIO_ALLOC_WITH_BDEV HAVE_BLK_INTEGRITY_NOVERIFY HAVE_CIPHER_H HAVE_CONST_CTR_TABLE HAVE_CRYPTO_SHA2_HEADER HAVE_KFREE_SENSITIVE HAVE_KMAP_LOCAL HAVE_LINUX_FORTIFY_STRING_HEADER HAVE_LINUX_STDARG_HEADER HAVE_LIST_CMP_FUNC_T HAVE_NLA_STRLCPY HAVE_PANIC_NOTIFIER_H HAVE_PARAM_SET_UINT_MINMAX HAVE_RB_FIND HAVE_TASK_IS_RUNNING HAVE_TIMER_DELETE HAVE_TIMER_DELETE_SYNC HAVE_pde_data Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: Iaf79673cb47beeb9ce21303765d635d73475789f
(style) The subject is wrapped onto a second line, so git and Gerrit render it as "...to ksym checks" with a double space. It fits in one line at 55 characters.
(minor) HAVE_FILEMAP_GET_FOLIOS_CONTIG is listed as moved, but LC_HAVE_FILEMAP_GET_FOLIOS_CONTIG is still defined in config/lustre-core.m4 and still called from LC_PROG_LINUX_SRC/LC_PROG_LINUX_RESULTS.
(typo) There is no HAVE_VFS_SETXATTR_USERNS macro anywhere in the tree; the check moved here is LC_HAVE_VFS_SETXATTR_NON_CONST_VALUE, which defines VFS_SETXATTR_VALUE(). Same for the .ksym file name.
(minor) This is the only converted check that also emits macros the m4 never defined: folio_migr and migrate_folio are already defined by lustre/include/lustre_compat.h under the same #ifdef HAVE_AOPS_MIGRATE_FOLIO. The two copies agree, so the redefinition is benign, but it leaves two places to keep in sync and it also pushes `migrate_folio` -> `migratepage` into config.h for every module rather than just the files that include lustre_compat.h. Either drop these here or drop the lustre_compat.h block, and mention it in the commit message.
Unlike the other 16 checks in this patch, the m4 side was not deleted: LC_SRC_HAVE_FILEMAP_GET_FOLIOS_CONTIG / LC_HAVE_FILEMAP_GET_FOLIOS_CONTIG are still in config/lustre-core.m4 and still invoked from the 6.1 block of LC_PROG_LINUX_SRC and LC_PROG_LINUX_RESULTS. So the slow compile test still runs, and HAVE_FILEMAP_GET_FOLIOS_CONTIG ends up defined twice in config.h (benign only because both expand to 1). Should the m4 half go away here too?
We don't need this symbol - https://review.whamcloud.com/c/fs/lustre-release/+/64387
The True/False branches look swapped relative to the autoconf test they replace.
LC_HAVE_VFS_SETXATTR_NON_CONST_VALUE compiled `vfs_setxattr(&init_user_ns, de, name, (const void *)value, 0, 0)`: on success (value arg is `const void *`) it defined VFS_SETXATTR_VALUE(value) as `(value)`, and only on failure (non-const window, v5.19-rc5-17-g0c5fd887d2bb .. v6.0-rc3-6-g6344e66970c6) as `((void *)(value))` -- 0006eb3644 calls that "Cast away const when required".
Here the regex matches when the header declares `const void *`, and that case selects the cast. Running gen_compat.py confirms it:
v6.18 headers (const void *):
checking if vfs_setxattr() has 'const void *' parameter ... yes
#define VFS_SETXATTR_VALUE(value) ((void *)(value))
v6.0 headers (void *):
checking if vfs_setxattr() has 'const void *' parameter ... no
#define VFS_SETXATTR_VALUE(value) (value)
Both are the opposite of what the m4 produced, and the "yes" line contradicts the branch it picks. It happens to be harmless today only because the single user in lustre_compat.h calls __vfs_setxattr(), whose value argument stayed `const void *` on every kernel; the cast becomes a build failure the moment the macro is used with vfs_setxattr() again on a v6.0 kernel.
LU-20418 build: Move core pre-v6.1 checks to ksym checks Move checks for: HAVE_ADD_TO_PAGE_CACHE_LOCKED HAVE_AOPS_MIGRATE_FOLIO HAVE_AOPS_READ_FOLIO HAVE_AOPS_RELEASE_FOLIO HAVE_DQUOT_TRANSFER_WITH_USER_NS HAVE_FILEMAP_GET_FOLIOS HAVE_FILEMAP_GET_FOLIOS_CONTIG HAVE_IOV_ITER_GET_PAGES_ALLOC2 HAVE_IOV_ITER_IS_ALIGNED HAVE_LSMCONTEXT_HAS_ID HAVE_LSMCONTEXT_INIT HAVE_NO_LLSEEK HAVE_READ_CACHE_FOLIO_WANTS_FILE HAVE_REGISTER_SHRINKER_FORMAT_NAMED HAVE_SECURITY_DENTRY_INIT_SECURTY_WITH_CTX HAVE_USER_BACKED_ITER HAVE_VFS_SETXATTR_USERNS Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: I5188c080025534c0d61220dd91cf1dcee6c0e921
| unique failing test | history |
|---|---|
| sanity-quota@zfs:test_19 | seen in 1 other review |
LU-13344 lnet: stop using struct timeval The struct timeval is not 2038 safe so the Linux kernel is moving away from its use. The use of rpe_stamp hasn't been used since Lustre 2.2 so remove the userland use of this field. This frees use to change rpe_stamp to an equivalent struct timespec64 for future use. Greatly simplify lnet_sock_[read|write] by using jiffies values of sk_sndtimeo, sk_rcvtimeo cached in struct sock. Lustre-commit: 5e4c658c4fea4f2b10c2877394eec824474ecc66 Lustre-change: https://review.whamcloud.com/38105 Change-Id: Ib58193756ec4a526e55bc810c05abd3920b2b269 Signed-off-by: James Simmons <jsimmons@infradead.org>
LU-6174 nrs: perform proper division For NRS TBF both tr_nsecs and tr_rpc_rate are 64 bit values. The code is wrongly using do_div() which could truncate tr_rpc_rate to a 32 bit value. With current hardware setups the rpc rate is less than the 4 billion limit of u32, currently I see 64K of rpcs with a single IB port. Since this is the case we can change tr_rpc_rate to a 32 bit value. Lustre-commit: c80319213c6dc4ac9826a1bd10c75373e08db837 Lustre-change: https://review.whamcloud.com/36749 Change-Id: I62eabf3a8a30f5c9062aaf4c32fa878710a788c8 Signed-off-by: James Simmons <jsimmons@infradead.org> Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Reviewed-by: Li Xi <lixi@ddn.com> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
LU-11838 scrub: handle s_uuid change to uuid_t The 4.12 kernel changed the s_uuid field in struct super_block from an character array to an uuid_t. While ldiskfs uses it own s_uuid field in struct ext4_super_block that field is a char array instead of an uuid. Currently on going effort are being down in the linux kernel to move to uuid_t so I suspect this will change in the future. Since this is the case change all the character arrays for uuid handling to uuid_t located in the scrubbing code. Change osd-ldiskfs to use the struct super_block uuid, which is equivalent to s_es version, to handle the uuid_t changes now. Lustre-change: https://review.whamcloud.com/34689 Lustre-commit: 90fd0cd449b9ae3fbff5a99e0edcf288799037c0 Change-Id: I40643d342b5bc17a6ef922e99b3e8524930822de Signed-off-by: James Simmons <uja.ornl@yahoo.com> Reviewed-by: Shaun Tancheff <stancheff@cray.com> Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Signed-off-by: Minh Diep <mdiep@whamcloud.com>
LU-15420 build: fixes to support building on Ubuntu 22.04 LTS
Lustre uses the glibc stdarg.h instead of the kernel's version which
causes the following build issue.
lustre/include/lu_object.h:35,
/usr/lib/gcc/x86_64-linux-gnu/11/include/stdarg.h:52: note: this is the
location of the previous definition
#define va_copy(d,s) __builtin_va_copy(d,s)
The solution is to use the kernels version of stdarg.h
The second build issue :
update_trans.c:1608:30: error: 'struct task_struct' has no member named
'state'; did you mean '__state'?
is due Linux commit 2f064a59a11ff9bc22e52e9678bc601404c7cb34
(sched: Change task_struct::state). The state field was
changed and the barrier macros READ_ONCE()/WRITE_ONCE()
are used to access it now which is the proper thing to do.
Since the check in update_trans.c is equivalent to testing
if the kernel thread is not running, since TASK_RUNNING == 0,
we can just change the code to use task_is_running(). The
task_is_running() was introduced in 5.13.
Lustre-change: https://review.whamcloud.com/47133
Lustre-commit: c04adbcd76725a360f411f09c63df785bf7db426
Test-Parameters: trivial
Change-Id: Ib5985b187c3013fbc513e9962a5f27bed4996f5b
Signed-off-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Jian Yu <yujian@whamcloud.com>
Reviewed-by: Shaun Tancheff <shaun.tancheff@hpe.com>
| unique failing test | history |
|---|---|
| sanity-quota@zfs:test_1e | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
LU-16463 llite: replace lld_nfs_dentry flag with opencache handling The lld_nfs_dentry flag was created for the case of caching the open lock (opencache) when fetching fhandles for NFSv3. This same path is used by the fhandle APIs. This lighter open changes key behaviors since the open lock is always cached which we don't want. Lustre introduced a way to modify caching the open lock based on the number of opens done on a file within a certain span of time. We can replace lld_nfs_dentry flag with the new open lock caching. This way for fhandle handling we match the open lock caching behavior of a normal file open. In the case of NFS this code path will always be called with the internal kernel thread 'nfsd'. If we are called by this kernel thread set the open threshold to zero which means always cache the open lock. Once Lustre is only supported on Linux kernels above 5.5 we can remove this special NFSv3 work around. Lustre-change: https://review.whamcloud.com/49237 Lustre-commit: d7a85652f4fcb83192262cfc1a0211890f404c7c Change-Id: Iba27f7ad4579fdd1f34e1e35c2cbd547e15f129a Signed-off-by: James Simmons <jsimmons@infradead.org> Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Reviewed-by: Etienne AUJAMES <eaujames@ddn.com> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
LU-4665 utils: Specified OSTs setstripe for directories Set specified OSTs for directories. Signed-off-by: Jinshan Xiong <jinshan.xiong@intel.com> Change-Id: Ia42f017622fc1677d805074c4477269845ee7d07
It seems odd that we are duplicating this entire block of code (~30 lines or so). Is there some kind of helper we could implement?
LU-20390 enc: fix subdir mount of an encrypted directory
When an encrypted directory is used as a subdirectory mount, its
".fscrypt" dir is served from the real fs root via the lu_root_fid
redirect. This exposes three problems addressed by this patch:
- Once 'fscrypt unlock' loads the key, llcrypt encrypts the
".fscrypt" name so it can no longer be looked up. Resolve it by
its plaintext name in ll_prepare_lookup()/ll_setup_filename()
regardless of key state, and drop the now-redundant -ENOENT
handling that only covered the keyless case.
- This consequently prevents the ".fscrypt" dentry from being
invalidated when the key loads, thus avoiding the subtree to detach
from s_root and escape shrink_dcache_for_umount(), which was leaving
inodes pinned whose cl_objects trip lu_device_fini() at umount.
- 'fscrypt lock' wrongly reports busy files because the mount root
inode is pinned for the mount lifetime; skip it in
check_for_busy_inodes().
Investigated with the help of Claude Code + Tools.
Fixes: c12378fba7f0 ("LU-15176 sec: present .fscrypt in subdir mount")
Test-Parameters: mdscount=2 mdtcount=4 osscount=1 ostcount=8 clientcount=2 testlist=sanity-sec clientdistro=ubuntu2604 serverdistro=el8.10 env=ONLY="54"
Signed-off-by: Sebastien Buisson <sbuisson@ddn.com>
Change-Id: Ib0576f1c31416bc10dc742e5ef330eff4b5ec541
LU-19403 llapi: Add device functions for nodemap Nodemap lctl commands look up the local MGS/MDS/OSS device number, but that logic lived only in obdctl. Add llapi_get_mgs_device()/get_mds_device()/get_oss_device() wrappers around llapi_obdname2devno(), caching the device number after the first successful lookup. Fix an errno logged but not returned in their error path. Add the llapi_nodemap_test binary and sanity-sec test_92; run_tests() gains a NULL @lustre_dir case so this server-only binary can share it instead of duplicating the fork/report loop. Signed-off-by: Nikos Papakonstantinou <npapakonstantinou@ddn.com> Change-Id: I095265bdccc8efd441c6c396c8ad267d1f6b7ca9
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-ipv6 | RHEL 9.8 / x86_64 | ran 4 tests. 1 tests failed: sanity-lnet. | session |
| review-dne-part-2 | RHEL 9.7 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
| review-ldiskfs-arm | RHEL 8.10 / x86_64, Rocky 9.8 / aarch64 | ran 8 tests. 1 tests failed: lnet-selftest. | session |
I few issues. 1) Don't add new fault injection to lctl. Instead add it to lnetctl 2) No new ioctls. You need to update lnet_fault_cmd() and friends in api.c instead. The Netlink interface is IPv6 freindly. Can you tell me what the YAML net fault looks like? I can help you with this.
I added lnetctl commands together with Netlink support and also removed ipv4 specific logic to make it ipv6 friendly. I have not removed the ioctl and lctl commands yet as it can be used as fallback.
(style) This isn't a bug, but the fonts in the new synopsis are inconsistent: `-r` and `-i` are bold while `-s`, `-d`, `-z`, `-f`, `-n`, `-m`, `-p` and `-o` are plain, and the placeholders are lowercase italic. man-pages(7) style (and the rest of Documentation/man8) is bold for the option including its dashes and italic uppercase for the value, e.g. `\fB\-s\fR \fISRC\fR`.
(minor) This reads as if a portal selector simply has no effect on REPLY, but it actually removes REPLY from the rule. lnet_fault_attr_validate() narrows fa_msg_mask to GET|PUT as soon as fa_ptl_mask is non-zero, and lnet_corrupt_rule_add() then masks with PUT|REPLY, so PUT is all that is left. So `-p 52` with no `-m` gives a PUT-only rule even though the previous sentence says both are selected by default, and `-m REPLY -p 52` is rejected outright - lnetctl just prints "failed to add corrupt rule: Invalid argument" with no hint about which option caused it. Could the text say that specifying a portal restricts the rule to PUT?
(minor) Lustre man pages are expected to carry an EXAMPLES entry for each major way of using a sub-command, and lnetctl.8 already has that pattern at the end of the page for udsp. Could a short example be added here for the two scheduling modes, e.g. a rate rule
lnetctl fault corrupt add -s 10.0.0.1@tcp -d 10.0.0.2@tcp -r 100 -z 8 -f 4096 -m PUT -p 52
and an interval rule? The offset/offset_range/size interaction is hard to infer from the prose alone.
No ioctl!!!! This is not IPv6 friendly. You need to update lnet_fault_cmd() in api.c instead.
(minor) corrupt-fault.sh is added to noinst_SCRIPTS but not to lustre/tests/test-groups/regression, so once `Test-Parameters: testlist=corrupt-fault` has run for this change the new suite will not be picked up by any of the standard sessions again. Since the subtests are LNet-selftest based, would it be simpler to add them to sanity-lnet.sh, which is already in the regression group, or to add corrupt-fault to that list?
LU-19167 lnet: add corrupt fault injection Add a receive-side LNet fault rule that corrupts bytes in completed PUT and REPLY payloads before upper-layer completion. Rules can match source, destination, local NID, portal, and message type. They support rate- or interval-based scheduling and select the corruption offset, range, and size. Manage corrupt rules with lnetctl fault corrupt add, del, show, and reset over generic netlink. Document the commands in lnetctl(8), and add an LNet selftest for the corruption feature. Assisted-By: Codex:5.6-Sol Test-Parameters: testlist=corrupt-fault Signed-off-by: Manish Regmi <mregmi@ddn.com> Change-Id: Ib4972807a48c185043f335d030d266ed3cad7e1e
LU-18774 lnet: SIGSEGV in lnetctl yaml parser Avoid dereferencing a NULL pointer when YAML output contains an unmatched single or double quotation mark. Continue scanning for single quotation marks after an unmatched double quotation mark. Add a sanity-lnet regression test for both cases. Test-Parameters: trivial testlist=sanity-lnet env=ONLY=411 Signed-off-by: Frank Sehr <fsehr@whamcloud.com> Signed-off-by: Manish Regmi <mregmir@ddn.com> Change-Id: I2633ee0bb5461eec25044f0ca622cfaf18e2e5a1
(nit) The same hunk that rewrote the DESCRIPTION to point at lctl-changelog_register(8) drops that entry from SEE ALSO, so the page now cites a man page it no longer lists. Worth putting back on a refresh.
staged locally
(minor) The quoted argument here carries its own padding spaces and the closing paren ends up bold, so groff renders this as
(e.g: lustrefs-MDT0000 ).
llapi_changelog_register.3 writes the same example as plain text, `(e.g. "lustrefs-MDT0000")`, which reads better. Also `e.g:` above wants to be `e.g.`.
staged in local tree if patch is refreshed
(minor) Same SEE ALSO ordering as llapi_changelog_register.3 - lustreapi(7) before llapi_changelog_register(3) and lctl-changelog_deregister(8). If the patch is refreshed, the section order used elsewhere in man3 would be llapi_changelog_register(3), lustreapi(7), lctl-changelog_deregister(8).
staged in local tree if patch is refreshed.
(minor) This isn't a bug, but SEE ALSO puts lustreapi(7) ahead of the (3) and (8) entries. The same patch reorders llapi_changelog_clear.3 and llapi_changelog_start.3 so that lustreapi(7) comes last, and this page plus llapi_changelog_deregister.3 are now the only two under Documentation/man3/ whose SEE ALSO isn't ordered by section number. Moving it down to sit between llapi_changelog_start(3) and lctl-changelog_register(8) would match.
staged in local tree for future update
(nit) lctl-changelog_register(8) is dropped here too, but the DESCRIPTION still refers to it for where the registered MASK comes from. Same fix as llapi_changelog_clear.3.
staged locally
(minor) Should this one stay a client prompt? llsom_sync reads changelogs through /dev/changelog-MDTNAME, which is created by the client-side mdc module (lustre/mdc/mdc_changelog.c), and it also needs the /mnt/lustre client mount it is passed. The register/deregister examples around it are correctly `mds#`, but this one only works on a node with the filesystem mounted - the same patch keeps that mds#/client# distinction carefully in lfs-changelog.1.
staged locally
(nit) If the patch is refreshed: the DESCRIPTION and the --user description now both point at lctl-changelog_register(8), but SEE ALSO still lists only lustre(7) and lctl(8).
staged locally
(style) Not a bug, but `func` reaches the user raw here. The callers hand do_device() internal tags rather than command names, so this now prints
mgsioc: no device found for name MGS: Invalid argument
--device: no device found for name foo: Invalid argument
(the second from jt_opt_device() passing argv[0]). Everything else in obd.c routes the prefix through jt_cmdname().
staged locally
(nit) The success message here starts lowercase while jt_changelog_register() a few lines up still prints "Registered changelog userid ..." with a capital. Worth making the two sibling commands agree if the patch is refreshed - the man page examples were updated to the lowercase form, so changing the register side would mean touching those too.
(minor) Can this message ever be right? `llapi_changelog_register()` returns -EOVERFLOW from two places, and neither of them is reachable with the buffer this caller passes:
char regname[CHANGELOG_USER_NAMELEN_FULL];
... llapi_changelog_register(..., regname, sizeof(regname));
The `reglen < CHANGELOG_USER_NAMELEN_FULL` check can't trip, and the post-snprintf one is marked "should never happen" (worst case is "cl" + 10 digits + "-" + 15 chars = 29 bytes in a 30-byte buffer). The -EOVERFLOW that does reach here comes from the MDT, where mdd_changelog_user_register() uses it for "max ID is exceeded" when mc_lastuser wraps. So an admin who hits the real condition is told the name is too long.
llapi_changelog_register.3 has the same gap - its ERRORS entry for -EOVERFLOW only describes the regname buffer case.
staged locally
LU-19276 llapi: add llapi_changelog_(de)register
Add llapi_changelog_register() and llapi_changelog_deregister()
to allow them to be used by external applications.
Move CHANGELOG_USER_NAMELEN and CHANGELOG_USER_NAMELEN_FULL to
lustre_user.h since applications need to know the buffer limits
when registering a changelog user.
Man pages llapi_changelog_register/deregister.3 are added and
lctl-changelog_register/deregister.8 are updated to reflect the
new changes. sanity.sh/test_160q is modified to verify this patch.
Move llapi_obdname2devno() and llapi_ioctl_dev() into internal
library functions so that they are more easily usable, but not
yet fully public API functions.
Since llapi_ioctl_dev() requires the OBD device to be registered
in order to call l_ioctl(), have llapi_obdname2devno() call
llapi_register_ioc_dev() internally to ensure it is done instead
of depending on the caller. Change llapi_register_ioc_dev() so
that it can be called repeatedly without closing and opening the
OBD ioctl device each time.
Rename yaml_get_device_index() to llapi_yaml_get_device_index()
to avoid namespace clash with yaml library. Fix a bug with that
code which returned 'device 1' on error, and leaked resources
on error cleanup paths.
Remove long unused jt_lcfg_device() wrapper function.
Test-Parameters: testlist=sanity serverversion=2.17 env=ONLY=160
Fixes: ba0d5ffc1c ("LU-9680 utils: new llapi_param_display_value().")
Fixes: 0b715b9a53 ("LU-2675 utils: remove loadgen")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Signed-off-by: Emoly Liu <emoly@whamcloud.com>
Change-Id: I732366b9972ba7c2d8ed5b49a405647e2d300c1e
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-4 | RHEL 9.8 / x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
(minor) pci_p2pdma_distance() hands back only the hop count that calc_map_type_and_dist() computes and drops the enum pci_p2pdma_map_type that came with it, so the single thing that maps to UINT_MAX here is PCI_P2PDMA_MAP_NOT_SUPPORTED. On an AMD Zen or newer host cpu_supports_p2pdma() is true (drivers/pci/p2pdma.c, same in v6.1, v6.12 and mainline), so a provider and an HCA on opposite sides of the root complex come back as PCI_P2PDMA_MAP_THRU_HOST_BRIDGE with a finite distance rather than -1; a whitelisted Intel host bridge behaves the same. Every o2ib NI then gets a real ni_dev_prio, so the `ni_dev_prio == UINT_MAX` test further down never fires and lnet_numa_range effectively stops applying to P2P traffic on exactly the platforms this feature targets. The commit message describes the fallback as "when every NI on the net reports UINT_MAX", which on such a host does not happen. Is the raw hop count the metric you want, or should a path that crosses the host bridge sort below a switch-local one rather than just a few hops further out?
LU-20438 lnet: Implement distance-based PCIe P2PDMA routing
This patch completes the P2P hardware distance topology abstraction
by preferring an NI under the same PCIe switch as the memory provider.
By introducing the lnd_get_p2pdma_device callback on the LND, LNet
dynamically queries and evaluates the physical PCIe distance between
the P2PDMA (page) provider and all active Host Channel Adapters (HCAs).
This ensures LNet bounds multi-rail transfers to perfectly matched NICs
collocated beneath the identical PCIe switch, sidestepping NUMA traffic.
If no NIC matches the specific PCIe hierarchy or distance mapping is
unsupported natively by the LND (e.g., EFALND), ni_dev_prio evaluates to
UINT_MAX. When every NI on the net reports UINT_MAX, the flattening is
applied as before, so selection falls back to the existing distance,
credits, and ni_seq order.
Introduces struct lnet_device_id as the primary cross-layer token for
identifying the backing hardware provider of outgoing memory pages,
replacing the previous lnet_get_dev_idx() call with lnet_get_device_id()
in lnet_rdma.h to supply dynamic routing capabilities.
Previously, lnet_get_best_ni() tested LNET_MD_FLAG_P2PDMA on msg->msg_md,
which on a client is the ptlrpc request MD. Because pers.c sets
LNET_MD_P2PDMA_ADDR exclusively on the bulk MD, the test never fired
and device-aware NI selection never ran. lnet_get_first_page() introduces
a new **md_ptr out-parameter that resolves and hands the mapped bulk MD
back to the caller instead, allowing checks to evaluate successfully.
Finally, the Linux kernel does not universally export an API to retrieve
the PCI device provider from a P2PDMA ZONE_DEVICE page, housing it inside
the privately scoped struct pci_p2pdma_pagemap. This explicitly maps
mainline structures across recent unexported kernel shifts, safely
extracting the PCI device natively without resorting to costly iterative
PCIe root bus scanning.
Fixes: 959304eac7ec ("LU-15189 lnet: fix memory mapping.")
Signed-off-by: Shivaji Kant <shivajikant@google.com>
Change-Id: I86e51f55028af7e83b4383f5a2ae3b8bd4051fda
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-arm | RHEL 8.10 / x86_64, Rocky 9.8 / aarch64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 24.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-lnet. | session |
(typo) "Do object"?
(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`.
(typo) "Do object" - DoM? This was raised on an earlier patchset and still reads the same way here.
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?
(typo) "Do object" -> "DoM object". This was raised on patchset 30 and is still here.
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).
(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?
(typo) "below" - the `--zerostart` description is above this one in the page.
(minor) `llapi_join_layouts(3)` doesn't exist in the tree, so this is a dangling cross-reference.
pattern_base is more clear
(minor) this should probably have `#ifndef BIT`
(style) unnecessary
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
| unique failing test | history |
|---|---|
| conf-sanity1@ldiskfs+DNE:test_30a | seen in 14 other reviews |
| conf-sanity2@ldiskfs+DNE:test_35b | seen in 30 other reviews |
| conf-sanity2@ldiskfs+DNE:test_52 | seen in 24 other reviews |
| conf-sanity2@ldiskfs+DNE:test_57b | seen in 2 other reviews |
| conf-sanity2@ldiskfs+DNE:test_65 | seen in 3 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | RHEL 9.7 / x86_64 | ran 11 tests. 1 tests failed: sanity-sec. | session |
| review-dne-part-3 | RHEL 9.8 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-subtest-change failed 3× | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-2 | RHEL 9.8 / x86_64 | ran 11 tests. 1 tests failed: sanity-sec. | session |
| review-dne-zfs-part-2 | RHEL 10.1 / x86_64 | ran 11 tests. 1 tests failed: sanity-sec. | session |
| review-dne-zfs-part-3 | RHEL 9.8 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-3 | RHEL 10.1 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-subtest-change failed 2× | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-ldiskfs-arm | RHEL 8.10 / x86_64, Rocky 9.8 / aarch64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 24.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
(minor) The 'Also:' list covers the man pages and the six conf-sanity subtests, but not the test-framework.sh and conf-sanity-framework.sh changes. Those add reset_allow_register_if_unconfigured(), a $TMP/allow-register-need-arm marker written by load_module(), and a new hook in start() and cleanup_nocli() that fire for every test suite, not just conf-sanity. Could the body mention them, since they change behaviour well outside this feature?
(defect) With allow_register now defaulting to 0, mgs_target_reg() takes the `if (!allow_register)` branch on every registration, so mgs_check_index() is on the default path and this LASSERT() is reachable for the first time.
mti_flags comes straight off the wire and is not sanitised:
mgs_target_reg() /* MGS_TARGET_REG handler */
if (mti->mti_flags & LDD_F_NEED_INDEX)
mti->mti_flags |= LDD_F_WRITECONF;
if (!allow_register)
rc = mgs_check_index(...); /* LASSERT here */
The MGS still implements LDD_F_NEED_INDEX in mgs_write_log_target() (next_index() below), so it is a flag the MGS expects to receive, and MGS_TARGET_REG carries no privilege requirement. Any peer that can open an MGS connection and set 0x0010 in mti_flags now LBUGs the MGS.
Before this patch the default of 1 kept this branch unused, and the other caller, mgs_check_target(), is protected by the NEED_INDEX -> WRITECONF conversion just above. Could this LASSERT() be turned into a plain check (NEED_INDEX means "new target", so rc = 0 / -EACCES) rather than asserting on network data?
(minor) On the expected first-registration path this prints an error before it succeeds: the first mgs_find_or_make_fsdb() reaches the `exists == 0` branch above and logs "New filesystem registration disabled. Use 'lctl set_param allow_register=unlimited' ...: rc = -13", then the arm opens the window and the retry succeeds. An admin doing a normal initial setup sees a registration-disabled error immediately followed by the window-opened warning. The retry also repeats mgs_fsdb_exists_in_configs(), a full CONFIGS readdir, on every denied registration. Would checking/arming before the CERROR() read better?
(minor) "the first target that ever registers with a freshly loaded MGS" is a bit stronger than what the code does. The window is only armed when mgs_check_index() gets -EACCES, i.e. for a filesystem with no config log. If the first target to register after a reload belongs to a filesystem the MGS already knows, nothing is armed and the one-shot is still unspent. The man page states this correctly; this comment could match it.
(minor) The kernel-doc above says the one-shot is "armed via an atomic decrement-and-test", but this is an atomic_cmpxchg(). Worth correcting if the patch is refreshed. Also, allow_register_armed starts at 1 meaning "not yet armed" and is set to 0 when it has been armed, which reads backwards against the name. Something like allow_register_arm_pending, or an atomic_t counter named for what it holds, would be easier to follow.
(defect) This gate looks like it sits above the tree: LUSTRE-VERSION-GEN reports v2_17_57 here, so MGS_VERSION parses as 2.17.57.<n> and 2.17.58.2 is larger. If that is right, 157a through 157f all skip, including on this change's own CI run, and 157a/157b lose the coverage they had with the old gate. Version gates are also conventionally 3-component; 2.17.57 would match the current tag. Same value is repeated at the top of 157b through 157f.
LU-18857 mgs: add timeout mechanism for allow_register
Add automatic timeout functionality to the allow_register
parameter to improve security by limiting the window during
which new filesystems or targets can register.
Values:
0 registration disabled (initial default)
unlimited registration enabled indefinitely (no timer)
N[s|m|h] registration enabled for N seconds/minutes/hours
(default unit is hours when no units is given)
When a timed value is set, a timer disables registration on expiry.
show() reports remaining time with explicit 's' units.
Timed windows above 7 days are rejected (-EINVAL).
Use 'unlimited' for an open-ended window.
Automatic default window:
- allow_register defaults to 0 (disabled).
- the first target ever to register for a brand-new filesystem on a
freshly loaded MGS automatically opens a one-time 24-hour window,
unless the admin already set allow_register explicitly (via module
parameter or lctl set_param). It never re-arms for later filesystems
or later mounts.
- suppressing the automatic window entirely requires setting
allow_register explicitly (e.g. 'options mgs allow_register=0')
Boot-time module parameter:
- new mgs.allow_register=<value> module parameter applies the same
policy at module load time via class_allow_register_set(), so it
gets identical validation, locking, and timer arming as the sysfs
attribute.
Compatibility changes from the original boolean allow_register:
- initial default is now 0 (disabled, see automatic default window
above) instead of 1 (enabled)
- allow_register=1 set at runtime means "enabled for 1 hour",
not "enabled"
Persistent set_param -P:
- allow_register=0 and allow_register=unlimited may be persisted
- timed values cannot use -P (replaying a duration would open a
fresh registration window on every mount)
- on config apply, bare 1 (old boolean "on") maps to unlimited;
other non-steady values are rejected
Also:
- Documentation/man4/allow_register.4
- SEE ALSO allow_register(4) in mkfs.lustre(8) and mount.lustre(8)
- conf-sanity 157a/157b: changed allow_register=1 to 'unlimited'
- conf-sanity 157c: timeout window coverage
- conf-sanity 157d: param persistence and legacy 1->unlimited
- conf-sanity 157e: mgs module parameter boot-time enforcement
- conf-sanity 157f: auto-arm 24 hour registration window
- mutex around timer/value updates in store/show
Signed-off-by: Chakshu Kansal <ckansal@ddn.com>
Change-Id: I8ce969db3e06f82d97da47b11421a2b8833c5656
"since these are symbols exported from the shared library" looks backwards. lustre/utils/liblustreapi.map globs only `cfs_*`, `llapi_*`, `libcfs_*`, `l_ioctl`, `mdt_hash_name`, `lu_foreign_types`, `Parser_*` and ends with `local: *`, so dump_pin_object() and friends were hidden before this patch. The llapi_ prefix is what makes them match the `llapi_*` wildcard and become part of the library's exported ABI, even though they stay declared only in lustreapi_internal.h and take a `struct cYAML *` that is not public. Is exporting them intended, or should the rationale be restated?
The body covers the two new options, the new llapi entry points and the renames, but the largest hunk in the patch is unmentioned: liblustreapi_pcc.c replaces cYAML_build_tree() with a hand-written parser, parse_pin_xattr_advanced(), and rewrites llapi_dump_pin_object() so lustre.pin is now serialised as a single YAML flow sequence, e.g.
[hsm: 1,pool: [p1,^p2,^any]]
That is a new on-disk encoding for lustre.pin and a new parser for attacker-settable input, so it deserves a paragraph of its own here. Should it be described, or split into its own patch ahead of the option work?
(minor) The three `lfs pool pin/unpin/pin_info` option parsers also switch from `llint_lqa_name_verify()` to `llint_pool_name_verify()`, which is a user-visible fix rather than a rename: the LQA form only permits `_` as an extra character, so a pool name containing `-` was previously rejected (with an "LQA" diagnostic). Worth a sentence here so the hunk isn't a surprise.
This reads as though the exclusive set can be grown, and the DESCRIPTION paragraph above only says a new *non-exclusive* pin fails with EPERM. `llapi_pool_pin_only_fd()` runs `pool_pin_check_constraints()` first, which returns -EPERM whenever an only_pool entry exists and the requested pool is not already among the `pool` entries, so a second `--only` pin is rejected too:
lfs pool pin --only --pool p1 f # [pool: [p1,^any]]
lfs pool pin --only --pool p2 f # EPERM, p2 is not added
Should adding another exclusive pool be allowed, or should the wording say that once a target is exclusively pinned no further pool can be added at all?
(minor) if the patch is refreshed: every pre-existing form of the command has an example here, but the two new options do not. Something like
$ lfs pool pin --only --pool scratch /mnt/testfs/file
$ lfs pool pin --not-pool archive /mnt/testfs/file
would keep the section complete.
(minor) same as in lfs-pool-pin.1 - no example for the new --not-pool form, e.g. `lfs pool unpin --not-pool archive /mnt/testfs/file`.
(style) this isn't a bug, but the error string is split across two source lines; the sibling messages in this function keep theirs on one line even when it runs long.
(style) this isn't a bug, but `int i;` here, `int j = i + 1; int k;` at 978, and `char *v = val; bool is_num = false;` at 1095 are declarations after statements. Kernel/Lustre style keeps declarations at the top of their block; if the block gets too crowded for that, it is usually a sign the value-scanning loop wants to be its own helper.
Can this write one byte past `buff`?
In the unbracketed branch `end = len`, and for the last key/value pair no next-key comma is found, so `v_end = end` and `val_end = end`. `llapi_read_pin_xattr_object_fd()` calls this as
rc = fgetxattr(fd, XATTR_LUSTRE_PIN, buff, sizeof(buff)); /* char buff[XATTR_SIZE_MAX] */
yaml = parse_pin_xattr_advanced(buff, rc);
so `len` can be exactly XATTR_SIZE_MAX and `buff[val_end]` is `buff[XATTR_SIZE_MAX]`. setxattr() accepts a value of exactly XATTR_SIZE_MAX bytes, and a lustre.pin value that does not start with '[' and end with ']' is reachable via setfattr (sanity.sh sets lustre.pin that way).
The bracketed branch is fine because `end = len - 1`. Would rejecting `len >= XATTR_SIZE_MAX` on line 921, or reserving a byte for the terminator, close it?
(style) `else if` belongs on the same line as the preceding `}`.
"a lone only_pool key is preserved as-is" does not round-trip. With no pool/deny_pool entry, `have_pool_tokens` is false, so the only_pool node falls through to the generic emitter and is written as
[only_pool: name]
but parse_pin_xattr_advanced() rejects a literal only_pool key (`goto invalid` at 1092), so re-reading that attribute fails with EINVAL. It looks unreachable today because only_pool is always created alongside a pool entry and pool_unpin_update_entry() drops it when the last pool entry goes away. Should the comment say that instead, or should the emitter skip a lone only_pool?
"^any" shares the same token space as a pool name, so a pool actually named `any` collides with the exclusivity marker. `llapi_pool_deny_fd()` accepts it (`llint_pool_name_verify()`/`llapi_pool_name_validate()` both allow `any`, and neither pin path checks that the pool exists), and `llapi_dump_pin_object()` then writes it as a plain `^any` element.
Running the real parser/serialiser over that input:
lfs pool pin --not-pool any f -> writes [pool: ^any]
re-read of [pool: ^any] -> saw_any set, first_pool == NULL -> goto invalid, EINVAL
After that the attribute is unreadable by every later `lfs pool pin`, `lfs pool unpin`, `lfs pool pin_info` and `lfs pcc pin/unpin` on that file, and `lfs pool unpin --not-pool any` cannot undo it either, since it reads through the same parser. Only a raw `setfattr -x lustre.pin` recovers the file.
With other entries already present the deny is instead silently swallowed:
[pool: [p1,^any]] + deny "any" -> writes [pool: [p1,^any,^any]]
re-read -> {pool=p1} {only_pool=p1}, deny rule gone
and a pre-existing `[pool: [^d1,^any]]` fails to parse outright. Should `any` be rejected as a reserved name in `llapi_pool_deny_fd()` (and documented as such in lfs-pool-pin.1), or should the marker use a spelling that cannot be a valid pool name?
LU-19712 utils: Add only and not-pool options to lfs pool pin Introduce --only and --not-pool options to lfs pool pin. The --only option makes the pin exclusive to the set of pools the target is already positively pinned to (including the one this operation itself pins), while the --not-pool option prevents the file from being migrated or mirrored to the specified pool. Also add a matching --not-pool option to lfs pool unpin, via a new llapi_pool_undeny_fd(), to remove a deny rule without disturbing a same-named positive pin (a pool can never be both, since --not-pool on pin already refuses to deny an already-pinned pool). --not-pool always takes an explicit pool name; unlike --pool, it is never inferred from the target's layout, since a denied pool cannot appear there. Also rename verify_pin_xattr_object(), dump_pin_object(), read_pin_xattr_object() and read_pin_xattr_object_fd() to their llapi_-prefixed equivalents, since these are symbols exported from the shared library and the original unprefixed names were too generic for that; --only/--not-pool themselves go through the new llapi_pool_pin_only_fd()/llapi_pool_deny_fd()/llapi_pool_undeny_fd() entry points instead. Signed-off-by: Nikos Papakonstantinou <npapakonstantinou@ddn.com> Change-Id: Icc35bf87444edd74c1fcda927cead5e3b34a0fcd
| unique failing test | history |
|---|---|
| sanity3@zfs:test_907 | seen in 60 other reviews |
| sanity-hsm@zfs:test_254b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanityn@ldiskfs+DNE:test_71a | seen in 62 other reviews |
LU-12514 utils: Build a real mount.lustre_tgt in a build tree
mount.lustre reads the fstype from argv[0], but in a build tree it
is a libtool wrapper that execs the hard-coded .libs/lt-mount.lustre,
so a mount.lustre_tgt symlink to it quietly mounts with '-t lustre'.
Build a real one for the build tree, under 'if TESTS' since only the
tests use it; keep installing a symlink, from install-data-hook,
which runs after mount.lustre is installed, and remove it from
uninstall-hook.
Update load_modules_local() to point /sbin/mount.lustre_tgt at the
build tree's mount.lustre_tgt, or at mount.lustre when there is
none, unless it points there already. Whatever was there is saved
first, or a .nonex marker left if there was nothing, so that
unload_modules_local() can restore the node. The old cleanup sat in
unload_modules(), which remote nodes never run.
Fixes: 58adf0b4aaf1 ("LU-12514 tests: add testing for lustre_tgt type")
Signed-off-by: Xiao Yang <xyang@ddn.com>
Change-Id: I1ffdfafa0a127ba12b371e61d14a2ce49389f9bf
LU-19921 sec: add disable_rootsquash mount option
Add the -o disable_rootsquash mount option, allowing users to
explicitly request disabling root squash on GSSIAM mounts when
authorized by the external GSSIAM authority.
Specifically, this patch implements:
- Client Mount Option:
Adds -o disable_rootsquash parsing in lustre/llite/llite_lib.c
and packs GSSIAM_OPT_DISABLE_ROOT_SQUASH in the GSSIAM init ctx
options payload.
- Server Nodemap Privilege Raising:
When authorized by the external GSSIAM server
(GSSIAM_AUTH_DISABLE_ROOT_SQUASH), gssiam_get_nodemap() passes
allow_root=true to nodemap_gssiam_attrs_update(). The per-identity
dynamic child nodemap is permitted to raise allow_root via the
parent 'gssiam' nodemap's pre-configured NODEMAP_RAISE_PRIV_ADMIN
delegation capability. Root squash remains strictly enforced
(allow_root=false) by default unless explicitly requested at mount
and authorized by the GSSIAM server.
- Extended Upcall Downcall Format:
Extends the kernel/userspace downcall contract by adding an
":options" field to the downcall string format parsed in
tgt_gssiam.c ("mount_option:expire:options:principal"), allowing
l_gssiam_auth to pass authorized permission/option flags to the
kernel upcall cache.
- Dedicated GSSIAM Option Flags:
Defines enum gssiam_mount_option_flags (GSSIAM_OPT_RDONLY and
GSSIAM_OPT_DISABLE_ROOT_SQUASH) in lustre_idl.h, cleanly separating
the GSSIAM option space from generic OBD_CONNECT_* connection flags.
Signed-off-by: Di Wang <ddiwang@google.com>
Change-Id: I35af55f4ff4193195028b157758a7b30bb2e0f9d
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-1 | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
(minor) The coverage list doesn't quite match the diff. Two more renames are in here: `md_op_data.op_mod_time` -> `op_mod_time_ns` in lustre/include/obd.h, and the helper `memfs_get_btime()` -> `memfs_get_btime_ns()` in lustre/osd-wbcfs/wbcfs.h. Worth adding so nothing in the diff is a surprise.
(minor) "pure rename with no functional change" isn't strictly true for `lctl getattr`. `OPU()` stringifies the member name, so renaming the macro argument changes the printed labels from `atime:`/`mtime:`/`ctime:` to `atime_ns:`/`mtime_ns:`/`ctime_ns:`. Probably the intent, but it is a user-visible output change and worth calling out here.
(minor) This header is installed - autoMakefile.am's install-data-local copies include/uapi/linux/lustre/*.h to $(includedir)/linux/lustre, and lustre.spec.in ships that directory in lustre-devel. So renaming members of `obdo`, `ost_lvb`, `mdt_body` and the `mdt_rec_*` structs is a source-compatibility break for anything out of tree that includes it. The wire layout is untouched, so this is only a compile-time break, but is it worth a note in the commit message?
(style) These four comments still say "in seconds since Epoch" while the fields are now `la_mtime_ns`/`la_atime_ns`/`la_ctime_ns`/`la_btime_ns` and hold nanoseconds. Given the whole point of the patch is making the unit obvious, the comment right above each field contradicting the name is the one place it will mislead someone. Same for the other three below.
(suggestion) `ktime_t` is already nanoseconds by definition, so the suffix adds little here, and with the `ns_` namespace prefix it reads as `ns_..._ns`. It also splits the field group: `ns_max_age` and `ns_dirty_age_limit` are the same type with the same "stored in ns" comment and keep their names. Either all three or none would be easier to follow.
(minor) `lli_btime` is left alone while its three siblings gain `_ns`. It holds nanoseconds too:
llite_lib.c: lli->lli_btime = body->mbo_btime_ns;
file.c: stat->btime = ns_to_timespec64(lli->lli_btime);
Since `la_btime` and `mbo_btime` both became `_ns`, should this be `lli_btime_ns` as well?
(minor) On the wire the `_ns` suffix is only true when the peer negotiated nanosecond time. Against a pre-2.17 MDS this stores seconds into a field that now claims to hold nanoseconds:
rec->sa_atime_ns = timespec64_to_ns(...);
if (!imp || !imp_connect_nanosec_time(imp))
rec->sa_atime_ns /= NSEC_PER_SEC;
The same shape shows up at every compat site the patch touches - mdc_create_pack(), mdc_open_pack(), mdc_unlink_pack(), mdc_link_pack(), mdc_rename_pack(), mdc_migrate_pack(), mdc_xattr_common(), mdc_rmfid(), mdt_pack_attr2body(), mdt_lvb2reply(), ofd_lvbo_fill(), mdt_lvbo_fill() and osc_ldlm_glimpse_ast().
The in-memory fields (`la_*_ns`, `cat_*_ns`, `lli_*_ns`) really are always nanoseconds, so those renames read well. For the wire members in `mdt_rec_*`, `mdt_body`, `ost_lvb` and `obdo` the unit depends on the connection, so the name is now slightly misleading in exactly the code that is hardest to get right. Would leaving the wire members unsuffixed, and documenting the unit next to the OBD_CONNECT_NANOSEC_TIME handling instead, be clearer?
(minor) `MAX_ATIME_DIFF` is the mdd counterpart of `OFD_DEF_ATIME_DIFF`, and it is a nanosecond value too:
mdd_internal.h:581: #define MAX_ATIME_DIFF (60LL * NSEC_PER_SEC)
The ofd constant got `_NS` in this patch, so should this one become `MAX_ATIME_DIFF_NS` as well? Right now the line reads as a seconds constant being assigned to an `_ns` field.
(minor) `mod_atime_set` also holds a nanosecond atime (assigned from `la_atime_ns` and `la_ctime_ns` in mdd_fix_attr()) and is the mdd counterpart of `ofo_atime_ondisk`, which this patch did rename. Should it get `_ns` too?
(style) This isn't a bug, but the rename pushed the open paren three columns right and the continuation line was left where it was, so it no longer lines up:
la->la_atime_ns <= (oattr->la_atime_ns +
mdd_obj2mdd_dev(obj)->mdd_atime_diff_ns)))
If the patch is refreshed, could this condition be rewrapped with a plain extra tab of indent instead of paren alignment?
(style) This comment now reads "refresh atime every ofd_atime_diff_ns seconds" - the name was updated on this line but the unit word below it was not.
(minor) `OPM()` pastes `#member` into the printf, so these three now print `atime_ns:`/`mtime_ns:`/`ctime_ns:` instead of `atime:`/`mtime:`/`ctime:`. Anything parsing `lctl getattr` output sees a different key. Also inconsistent with `obdo_print()` above, whose format string still labels the same ns values `atime:`/`mtime:`/`ctime:`. Should both be updated the same way?
LU-1158 general: rename timestamp fields to _ns Now that the timestamp fields hold epoch nanoseconds, rename them from xxx_(a/m/c)time to xxx_(a/m/c)time_ns so the field name reflects the unit. This covers the in-memory struct lu_attr and cl_attr fields, the cached llite inode times, the wire struct obdo, mdt_body, ost_lvb and mdt_rec_* fields, the lctl obdo dump helper, and the nanosecond interval tunables (ofd_atime_diff, OFD_DEF_ATIME_DIFF, ofo_atime_ondisk, mdd_atime_diff and the ldlm ns_ctime_age_limit). This patch is a pure rename with no functional change. struct ost_lvb_v1 keeps its second-based lvb_(a/m/c)time fields for wire backwards compatibility and is left unchanged. Assisted-by: ClaudeCode:Fable-5.1 Signed-off-by: Sohei Koyama <skoyama@ddn.com> Change-Id: I41626d75dab0b9735c2a3e33d7f94309afc30510
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-5 | RHEL 9.7 / x86_64 | ran 7 tests. 1 tests failed: lustre-rsync-test. | session |
I guess based on your other comments that this has *not* been implemented yet? If that is the case then I don't think this patch can land until the interop code is finished. Otherwise, this patch will break interop testing for master and there is a risk that the interop patch is not completed before the 2.18.0 release, which would be a major problem for sites trying to upgrade to this release.
Yes. The interop support has not been implemented in this series yet. (Sorry, the commit message was wrong) I am currently working on it and testing it, based on the previous compatibility work (https://review.whamcloud.com/c/fs/lustre-release/+/63517 ). However, as I go through the validation, I am finding additional cases that were not sufficiently considered, so I do not yet have a reliable estimate for when it will be complete. I agree that this patch should not land until the interop code is implemented and tested. Otherwise it could break master interop testing and create problems for sites upgrading to 2.18.0, as you pointed out.
The ofd_attr_set() hunk keeping `ofo_atime_ondisk` in sync isn't described here, and it isn't a units change - it is an independent fix for stale cached atime from 7c9ce8aac9e8 ("LU-13383 ofd: lazy atime update"). Could it be split into its own patch with a Fixes: tag so it can land separately?
The hui_* LASSERTF reordering in both wiretest.c copies is also unexplained; see the comment there.
(minor) The body doesn't mention `sb->s_time_gran = 1` in client_common_fill_super(). That is a fairly central part of the change - without it current_time() keeps truncating to whole seconds, so nothing the client generates locally would ever carry a sub-second value. Worth a line in the "sinks" bullet.
This changes the interpretation of several wire fields (ost_lvb, mdt_body, mdt_rec_*), so it should carry a Test-Parameters: line requesting interop runs against an older peer, e.g.
Test-Parameters: clientversion=2.15 testlist=sanity,sanityn
Test-Parameters: serverversion=2.15 testlist=sanity,sanityn
Without it the mixed-version paths this patch changes are never exercised by the automated test runs.
(minor) s64 nanoseconds since the epoch runs out at 2262-04-11 23:47:16 UTC (S64_MAX / NSEC_PER_SEC = 9223372036 s), not 2292 - this is the usual ktime_t limit. Worth correcting, since that number is the bound on what the new representation can hold.
(minor) The client advertisement is added by this patch: client_common_fill_super() gains OBD_CONNECT_NANOSEC_TIME for both the MDC and the OSC connect flags. "already advertised by clients" reads as if it came from an earlier change.
Hi Andreas and James, I’d like to discuss this patch with you. This patch does not currently include any compatibility support. For example, timestamps will break in configurations such as an ns-unaware MDS/OSS with an ns-aware client, or an ns-aware MDS/OSS with an ns-unaware client. I’d like to discuss the following two points: 1. Whether a compatibility patch is necessary. For example, couldn't we avoid the need for a compatibility patch by merging this patch right before the release? 2. How far we should go in supporting compatibility. For example, should we also consider communication between an ns-aware MDS and an ns-unaware MDS? If so, the required patch would become quite large. Best regards, Sohei
Sohei, there *must* be compatibility between at least old/new clients/servers. This should use the `OBD_CONNECT_NANOSEC_TIME` flag to determine if the clients are sending nsec or sec timestamps. This had been part of the other nanosecond timestamp patches, so I had assumed it is part of this series as well. Even if the patch was landed right before a release, there is no requirement/guarantee that clients and servers are upgraded together. We require at least interop between successive LTS releases (e.g. 2.15.latest to 2.18.0), but prefer interop for longer than this if possible (e.g. 2.14.x or earlier). There does not need to be major version interoperability between different MDS versions because they are typically upgraded together, but if this is practical to implement (i.e. it uses mostly the same code as client interoperability) it would be good to have this as well.
No interop handling :-( I would suggest splitting this patch into 2 new patches. One for clients and one for servers. That way we can see if "interop" works properly.
OBD_CONNECT_NANOSEC_TIME is missing from MDT_CONNECT_SUPPORTED here, and from OST_CONNECT_SUPPORTED below.
The client asks for it in client_common_fill_super(), but both servers unconditionally strip unsupported bits from the reply:
mdt_connect_internal(): data->ocd_connect_flags &= MDT_CONNECT_SUPPORTED;
ofd_parse_connect_data(): data->ocd_connect_flags &= OST_CONNECT_SUPPORTED;
so the bit is cleared on every connect and exp_connect_nanosec_time()/imp_connect_nanosec_time() return false even when both peers are new. Should the two masks be extended in this patch, so the follow-on compatibility patch has a flag that can actually be negotiated?
(minor) The matching comments on struct lu_attr's la_mtime/la_atime/la_ctime/la_btime in lustre/include/lu_object.h still read "in seconds since Epoch". Those fields change units in this patch too, and the follow-on rename patch leaves the comments alone as well.
I guess I had assumed when seeing these functions checking `OBD_CONNECT_NANOSEC_TIME` that the protocol interop was implemented.
(style) These are defined in obdclass/obdo.c right next to lustre_set_wire_obdo()/lustre_get_wire_obdo(), whose prototypes live in lustre_obdo.h. Declaring the new pair there would keep the obdo wire helpers together - not a bug, just placement.
LU-1158 general: convert timestamps to nanoseconds Switch the in-memory and wire timestamp values from epoch seconds to epoch nanoseconds. The conversion is localised to the edges where timestamps enter or leave Lustre; the internal plumbing just carries the same field values through unchanged. - sources: inode_get_[amc]time_ns() and ktime_get_real_ns() now provide nanoseconds, and the OSD layer reads and writes the on-disk inode timespec at nanosecond resolution. The client superblock sets s_time_gran = 1 so that current_time() keeps the sub-second part for locally generated timestamps. - sinks: the stat/statx paths convert the s64 nanosecond value back to a timespec64 with the standard ns_to_timespec64() (and ktime_to_timespec64() for ktime_t sources). - struct ost_lvb carries full nanoseconds in lvb_[amc]time (s64); its former split-nanosecond u32 companions become lvb_padding_1..4. struct ost_lvb_v1 stays in seconds for wire compatibility. - the changelog cr_time and HSM hui_* user-visible fields keep their existing on-disk and wire formats and are left unchanged. - the ofd and mdd atime-difference thresholds, the mdt ctime age limit and the cached llite inode times are kept in nanoseconds internally, and the atime_diff tunables accept and print fractional seconds. - the llog object mtime keeps its once-per-second update filter and is stored scaled to nanoseconds. All timestamp fields and the related interval knobs keep their historic names here and gain a _ns suffix in the following patch, once they all hold nanoseconds. s64 nanoseconds since the epoch covers timestamps up to year 2292. Since the units of the timestamps on the wire change, the same patch carries the compatibility layer so that every commit on master interoperates with peers that still use seconds. Negotiate OBD_CONNECT_NANOSEC_TIME on the MDT and OST connections (it is already advertised by clients) and add it to the connect flags used by the MDT when connecting to OSTs and other MDTs. A node converts wire timestamps to seconds when sending to a peer that did not negotiate the flag, and back to nanoseconds when receiving from such a peer. Conversion is applied on every path that carries a timestamp: the MDT inode times (mdt_pack_attr2body), the setattr, create, open, close, unlink, link, rename, migrate and setxattr reint records, the Data-on-MDT glimpse reply (mdt_lvb2reply / mdc_body2lvb), rmfid, the DNE stripe refresh (lmv), the OST lvb (ofd_lvbo_fill / osc_lock_lvb_update) and the OST obdo (lustre_set/get_wire_obdo and the ofd reply handlers). On the client the inode times are converted where the reply body enters llite. mdc_get_lustre_md() scales them keyed on the import of the request that carried the reply -- the target MDT that answered, which is correct even under LMV where the reply may come from an MDT other than index 0. ll_update_times() and the getstripe ioctl do the same for the bodies they read directly. Keying on the connection flag is exact and avoids the near-epoch and far-future misreads of a magnitude heuristic. Add sanity-ns.sh, a configuration-aware test suite that verifies timestamps warm and cold, including near-epoch and boundary values (pre-1970, y2038), nanosecond precision, per-MDT directory times, Data-on-MDT, FLR, cross-MDT operations, MDT/OST failover, setattr replay and cross-client coherency. Each test detects the negotiated nanoseconds_times flag per target and asserts exact nanoseconds against a new peer or second granularity against a legacy peer, so it is meaningful on uniform and mixed-version clusters alike. It is added to the regression test group. Assisted-by: ClaudeCode:Fable-5.1 Test-Parameters: testlist=sanity-ns Test-Parameters: mdscount=2 mdtcount=4 testlist=sanity-ns Test-Parameters: ostcount=4 testlist=sanity-ns Test-Parameters: fstype=zfs testlist=sanity-ns Test-Parameters: fstype=zfs mdscount=2 mdtcount=4 testlist=sanity-ns Test-Parameters: clientcount=2 testlist=sanity-ns Test-Parameters: serverversion=2.16 testlist=sanity-ns Test-Parameters: serverversion=2.15 mdscount=2 mdtcount=4 testlist=sanity-ns Test-Parameters: clientcount=2 serverversion=2.16 testlist=sanity-ns Test-Parameters: clientversion=2.16 testlist=sanity env=ONLY="36 39" Test-Parameters: clientversion=2.15 mdscount=2 mdtcount=4 testlist=sanity env=ONLY="36 39" Signed-off-by: Sohei Koyama <skoyama@ddn.com> Change-Id: I79570bc5a66e7c15472af90d690d689d3aa36269
(minor) The old code here was `strncpy(extraname, lprof->lp_dt, strlen(lprof->lp_dt) + 1)` - a count of strlen(src)+1 copies the terminator, so extraname was already NUL-terminated (and OBD_ALLOC() zeroes the buffer besides). The change that actually matters in that hunk is the new `if (extraname)` guard, which stops a NULL dereference when the allocation fails; that is worth saying instead. The matching `Fixes: eba2a78067e` follows from the same reasoning: that commit introduced the strncpy() (converting from strcpy()), but the unchecked OBD_ALLOC() it is guarding predates it.
(minor) The description now says the conversions go to strscpy(), but several sites in this patch go to snprintf() instead:
lib/libcfs/nidstrings.c libcfs_nid2str_r(), libcfs_nidstr_r()
lustre_user.h obd_str2uuid(), obd_uuid2fsname()
osd-zfs/osd_quota.c osd_it_acct_rec()
The first two groups are userspace-visible code where strscpy() isn't available, and osd_it_acct_rec() folds a strncpy()+strscpy() pair into one snprintf() - all reasonable, but nothing in the message says so any more, and "why snprintf() and not strscpy()" is the first thing a reader hits in the UAPI header. Could a sentence covering the userspace/UAPI case come back?
(typo) "treats the value a nul terminated string" - missing "as".
(minor) Most of these tags look like they mark the commit that introduced the strncpy() rather than a commit that introduced a bug. Walking the referenced sites: - e95e4d3227f, f2d44192278 / osd_get_name_n_idx*(): `name` comes from the static `oids[]` table, longest entry "health_check" at 12 chars, and every caller that passes a non-NULL `buf` passes `sizeof(info->oti_str)` or `sizeof(info->oti_buf)`, both 64. - 0c1ae1cb9c1 / osd_scan_dir(): `za->za_name` is `char[MAXNAMELEN]` and NUL-terminated by zap_cursor_retrieve(); `ozi_name` is `char[MAXNAMELEN]` too - osd_index.c even has `BUILD_BUG_ON(sizeof(za->za_name) > sizeof(it->ozi_name))` and a plain strcpy(). - 7869bb320e7 / upcall_cache_set_upcall(): the function returns -E2BIG for `count >= UC_CACHE_UPCALL_MAXPATH`, and `upcall` is a `count + 1` byte buffer, so `strncpy(uc_upcall, upcall, count + 1)` stayed inside `uc_upcall[UC_CACHE_UPCALL_MAXPATH]` and always copied the terminator. - 8d828762d18 / check_gssd_socket(): GSS_SOCKET_PATH is the literal "/tmp/svcgssd.socket", 19 bytes into `sun_path[108]`. - f6819c90c85 / qmt_pool_alloc(): qmt_pool_create() rejects `strnlen(poolname, LOV_MAXPOOLNAME + 1) > LOV_MAXPOOLNAME`, so `pool_name` is at most 15 chars and QPI_MAXNAME is 16. If none of those could truncate or leave the destination unterminated, should the tags be dropped so this doesn't get pulled into b2_15/b2_16 as a fix for six unrelated tickets?
(minor) Is the flat "not a nul terminated string" accurate? Plenty of producers do terminate, and consumers rely on it:
mdd/mdd_dir.c:4225 strcmp(tname->ln_name, lname->ln_name)
lfsck/lfsck_namespace.c:1869 dt_lookup(..., (const struct dt_key *)cname->ln_name)
mdt/mdt_reint.c:2564 CWARN("...%s...", rr->rr_name.ln_name)
obdecho/echo_client.c:1444 CERROR("...%s\n", lname->ln_name)
As written the comment says those four are all broken, which isn't the intent. Something like "not necessarily NUL terminated - use ln_namelen (DNAME/\"%.*s\") unless the producer is known to terminate" would describe the contract without over-claiming in either direction.
(minor) Carrying forward the request from patchset 2 for a `struct lu_name` comment saying whether `ln_name` is NUL-terminated. A lu_object.h hunk covering that was present in patchsets 3-5 and is gone again in patchset 6, and it isn't in the follow-on change either. Was dropping it deliberate, or should it come back here or in the non-obvious-cases patch?
LU-20434 build: strncpy to strscpy simple cases
Most users of strncpy want a nul terminated destination.
These case be transformed easily to use strscpy().
In obd_str2uuid() use snprintf() to copy and calculate the
bytes written and number of bytes of padding needed for
memset().
In obd_uuid2str() use memcpy() instead of strncpy()
In obd_uuid2fsname() strncpy can be replaced with snprintf()
In osd_get_name_n_idx_compat() and osd_get_name_n_idx() buf is passed
to zap_lookup() which treats the value a nul terminated string.
In osd_scan_dir() ozi_name is treated as nul terminated string.
In upcall_cache_set_upcall() uc_upcall is passed as a command line
argument and should be nul terminated.
In check_gssd_socket() sun_path should be a nul terminated string.
In qmt_pool_alloc() qpi_name should be a nul terminated string, it is
treated as string in some places.
In server_put_super() extraname must be a nul terminated string.
Test-Parameters: trivial
Fixes: e95e4d3227f ("LU-10186 osd-zfs: move LAST_ID OI mapping out of oi.xx")
Fixes: f2d44192278 ("LU-7898 osd: remove unnecessary declarations")
Fixes: 0c1ae1cb9c1 ("LU-13124 scrub: check for multiple linked file")
Fixes: 7869bb320e7 ("LU-17718 obdclass: potential string overflow upcall_cache.c")
Fixes: 8d828762d18 ("LU-17015 gss: support large kerberos token for rpc sec init")
Fixes: f6819c90c85 ("LU-11023 quota: remove quota pool ID")
Fixes: eba2a78067e ("LU-6600 obdclass: race lustre_profile_list")
Signed-off-by: Shaun Tancheff <shaun@tancheff.com>
Change-Id: Id397f4d9a4812d25f530f00926a5f2906d91f06a
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-5 crashed | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-6 | RHEL 10.1 / x86_64 | ran 4 tests. 1 tests failed: ost-pools. | session |
| review-dne-zfs-part-7 | RHEL 9.7 / x86_64 | ran 6 tests. 1 tests failed: sanity-ec. | session |
| review-dne-zfs-part-7 | RHEL 9.8 / x86_64 | ran 6 tests. 1 tests failed: sanity-ec. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 24.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-lnet. | session |
(typo) "changlog_trim_rec()" is missing an 'e'; the function is changelog_trim_rec(). Also in the paragraph above: "the fields need to be move in-order" reads better as "moved".
(minor) The body covers changelog_trim_rec() and llapi_changelog_repack_rec(), but the largest hunk of the patch - the lustre_user.h rework - is not mentioned: the new CLF_BEFORE_MASK()/CLFE_BEFORE_MASK() macros, changelog_field_size()/changelog_extra_field_size(), changelog_rec_field()/changelog_rec_extra_field(), and __CLFE_LAST redefining CLFE_SUPPORTED. The new OBD_FAIL_MDS_CHANGELOG_TRIM_JOBID fault injection isn't mentioned either. Could the message name those so the header change isn't a surprise to a reader?
(defect) This looks like it fixes real in-place corruption, not only a readability rework. The old changelog_remap_rec() moved the variable-length name to its trimmed offset first and only then moved the extension fields, so any field living above that new offset was overwritten before it was read - trimming CLF_JOBID out of a record that also has CLF_EXTRA_FLAGS + uidgid/nid drops the name on top of changelog_ext_uidgid. On top of that the old code only ever OR'd cref_want into cr_extra_flags, so a trimmed extra flag was never cleared and a reader recomputed the name offset from a layout the server no longer wrote.
Should this carry a Fixes: tag?
Fixes: 08ffb6f1428f ("LU-9727 lustre: Add an additional set of 64 changelog flags.")
That is the commit that introduced cref_want and the extra-field handling in changelog_remap_rec(); it became reachable with shipped client versions once a second extra field existed, in d2629cfcabfa ("LU-9727 lustre: add client NID to Changelogs entries").
(style) Small consistency nit on the two new helpers: this one takes `rec` plus `rec->cr_flags`, while changelog_rec_extra_field() below takes `const void *buf` plus both flag words. All six callers pass the record together with its own flags, and changelog_rec_extra_flags() is already forward-declared here, so the extra arguments mostly create a way to hand in an inconsistent pair. Could both take `const struct changelog_rec *rec` and read the flags themselves?
(minor) Both this and changelog_extra_field_size() below take the full flags enum but only work for a single flag - `changelog_field_size(CLF_RENAME | CLF_JOBID)` returns 0 rather than 64, and the switch gives no hint that a combination is wrong.
Since the point of the patch is to make adding a field easy, would a one-line comment ("@crf: exactly one CLF_* field flag") be worth it? Both are static inlines in a uapi header, so out-of-tree readers can call them too.
``` + /* Failed. Clear NID/NID_BE flags */ ```
(style) This isn't a bug, but the bare `return;` at the end of a void function is redundant and can be dropped.
(defect) The extras loop is entered on the record's cr_flags, but cref_want is not forced empty when crf_want has lost CLF_EXTRA_FLAGS. In that case the uidgid/nid/openmode/xattr fields are still memmove()d down into a record whose cr_flags no longer advertises CLF_EXTRA_FLAGS, so every consumer computes changelog_rec_name() without them and reads extension bytes as the name.
changelog_block_trim_ext() derives both masks from loghandle->lgh_hdr->llh_flags, and llog_origin_handle_next_block() takes that verbatim from body->lgd_llh_flags with no validation, so a client that sends LLOG_F_EXT_X_UIDGID / _X_NID without LLOG_F_EXT_EXTRA_FLAGS lands here. changelog_remap_rec() used to gate every extra move on (crf_wanted & CLF_EXTRA_FLAGS) && (rec->cr_flags & CLF_EXTRA_FLAGS).
Would clearing cref_want when crf_want drops CLF_EXTRA_FLAGS cover it? The loop still has to run so that src walks past the fields:
if (!(crf_want & CLF_EXTRA_FLAGS))
cref_want = CLFE_INVALID;
Technically this should not be possible. If CLF_EXTRA_FLAGS is not set cref_want should be set to 0. The only way possible is corruption or a compromise client. But the original patch have this check, so I will update.
(style) Every other static function in this file carries a `/**` block, and this one has a couple of things a reader can't guess from the signature: it rewrites `buf` in place (the same 24 bytes are read as `changelog_ext_nid` and written as `struct lnet_nid`, or vice versa), and `-EAFNOSUPPORT` means "this large NID has no nid4 form" rather than a hard error - the caller just drops CLFE_NID/CLFE_NID_BE. If the patch is refreshed, a short kdoc here would help.
(defect) Does this assertion fail without the changelog_trim_rec() rework? The old changelog_remap_rec() relocated the name to changelog_rec_offset(crf_wanted, cref_want), which is exactly the offset a reader recomputes from the trimmed flags, so the record stayed structurally valid: the UNLNK line still ends in $tfile and CLF_JOBID is still cleared from cr_flags, so ` j=` is still absent. What the old code corrupted was the extension *values*. With jobid trimmed the name is copied to rec+sizeof(rec)+ef+uidgid before changelog_ext_uidgid is moved, so the low bytes of cr_gid come back as the file name (`f160y` here), and with a name longer than the gap the nid goes too. Asserting on the surviving extra fields would make this a regression test - e.g. also require the ` u=` field in $UNLNK to still match the uid:gid that did the unlink, and check ` nid=` is unchanged. This is the same point raised on the earlier revision about exercising the extra fields.
(style) The three properties are chained into one `&& ... || error`, so a failure prints the same message whether the record went missing, the jobid survived the trim, or the uid/gid got clobbered by the field move - and the uid/gid one is the interesting failure this test exists to catch.
Splitting them reads better and says which invariant broke:
[[ -n "$UNLNK" ]] || error "no UNLNK changelog for $tfile"
[[ "$UNLNK" =~ \ j= ]] && error "jobid not trimmed: $UNLNK"
[[ "$UNLNK" =~ \ u=0:0 ]] || error "uid/gid corrupted by trim: $UNLNK"
``` + /* reset the cr_flags (flags related to original record read by + * changelog). We do this because client(crf_want) may request different + * flags than source recored + */ ```
LU-15373 llog: rework changelog_remap_rec()
Originally, changelog_remap_rec() expanded missing changelog fields,
but now we use it only to trim unsupported fields for remote clients.
So the fields need to be move in-order from the first record to last
one to avoid overwrite.
Moreover, changelog_remap_rec() is not trivial, so adding new
changelog field can be tricky.
This patch renames & improves changelog_remap_rec() to
changelog_trim_rec(). llapi_changelog_repack_rec() is updated to
reduce their dependency on field types.
Add a regression test sanity 160y to check if changelog_trim_rec() is
able to trim a field in the middle of the record.
Fixes: a98690be90 ("LU-5862 changelog: Proper record remapping")
Test-Parameters: clientversion=2.15 testlist=sanity env=ONLY=160
Test-Parameters: serverversion=2.15 testlist=sanity env=ONLY=160
Test-Parameters: clientversion=2.15 testlist=sanity-hsm env=ONLY=222
Test-Parameters: serverversion=2.15 testlist=sanity-hsm env=ONLY=222
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
Change-Id: I2a25e8131304e985187cb2c644822d1946455bf9
(suggestion) ldlm_pool_add() and ldlm_pool_del() are declared in lustre_dlm.h and called from ldlm_lock.c, so they are part of the LDLM-internal API rather than file-local helpers. Given LU-9639 is about adding kernel-doc to ldlm, is demoting them to plain comments the intended direction? Same question for ldlm_pool_get_slv(), ldlm_pool_set_clv(), ldlm_pool_get_limit(), ldlm_pool_set_limit() and ldlm_pool_get_lvf() below, which ldlm_request.c uses.
This block has the full kernel-doc layout - `ldlm_pool_t2gsp() - ...`, `@t:` and `Return:` - but the opener is `/*`, so kernel-doc skips it:
contrib/scripts/kernel-doc -man lustre/ldlm/ldlm_pool.c | grep -c '^\.TH'
9
ldlm_pool_t2gsp() is not among those 9. This was already raised on an earlier patchset and marked done, but the opener is still `/*` here - should it be `/**`?
(style) Dropping "Our goal here is to" leaves a lowercase sentence fragment. Maybe "The goal is to decrease SLV ...". While this line is being reworded: is "in next 10h" still accurate? The comment further down in the body says the effect lasts "as long as one re-calc interval (1s these days)".
(style) This isn't a bug - kernel-doc canonicalises both - but the patch mixes `Return:` (168, 320, 431, 475, 665) and `Returns:` (371, 535, 585) in the same file. The tree is heavily `Return:` (about 1300 uses vs 65), and so is ldlm_request.c from patch (1) in this series. Worth settling on `Return:` if this is refreshed.
"time in seconds" reads like an interval, but the value is an absolute timestamp:
return pl->pl_recalc_time + pl->pl_recalc_period;
and ldlm_pools_recalc_task() converts it back to a delay itself:
delay = min(ldlm_pools_recalc_delay(SERVER), ldlm_pools_recalc_delay(CLIENT));
delay -= ktime_get_seconds();
Since the return sections are being rewritten anyway, would something like "seconds (ktime_get_seconds() base) at which this pool should next be recalculated" be clearer?
(style) The parenthetical describes what the function does rather than what the parameter is, and it duplicates the description two lines below. Just `@limit: New limit value for the pool` would do.
LU-9639 ldlm: Add kernel doc style for LDLM (11) This patch converts existing functional comments to kernel doc style comments and removes '/**' for comments which is not meant to be a kernel-doc comment Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Change-Id: Ia5a4c786536e8e51e1673f737f8ff5b26622e57f
| unique failing test | history |
|---|---|
| sanityn@zfs+DNE:test_102 | seen in 1 other review |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-2 | RHEL 9.7 / x86_64 | ran 11 tests. 1 tests failed: sanity-lnet. | session |
| review-dne-zfs-part-7 failed 2× | RHEL 9.7 / x86_64 | ran 6 tests. 1 tests failed: sanity-ec. | session |
(defect) This fixes a crash, so it should carry a Fixes: tag. The unchecked nla_nest_start()/nla_put_*() calls in lnet_peer_ni_show_dump() arrived with the original Netlink conversion:
Fixes: f0be00678cc8 ("LU-9680 lnet: collect data about peer_ni by using Netlink")
(style) This isn't a bug, but Change-Id: normally sits after Signed-off-by:. Having it first usually means the Lustre commit hooks aren't installed.
(defect) lnet_udsp_info_send() is left on the unchecked path. It ignores nla_nest_start() returning NULL and then runs
nla_nest_end(msg, udsp_attr);
nla_nest_end(msg, udsp_info);
at the end of the function, which writes through the NULL start pointer. It also returns 0 on a full skb, so rc here cannot distinguish that from success.
`lnetctl peer show -v 4` sets gnlh->version to 4 and reaches this, so the oops named in the subject still looks reachable from lnet_peer_ni_show_dump().
(minor) The -ENOMEM branch here still leaves a half-built message in the skb. By this point genlmsg_put() has run and PRIMARY_NID / the nest headers / the peer NI string have been appended, so skb->tail is past the nlmsg_len that genlmsg_put() wrote. Going straight to unlock_api_mutex without genlmsg_cancel() leaves that short header followed by orphan attribute bytes; netlink then appends NLMSG_DONE after them, and a NLMSG_NEXT walk from the short header lands in the middle of the leftovers. The new EMSGSIZE branch above cancels, so it would be consistent for this one to cancel too before returning.
(defect) lgpl_hdr_sent is set as soon as the attribute is appended, but the message it lives in can still be rolled back.
Every `goto msg_full` below reaches `genlmsg_cancel(msg, hdr)`, which trims the skb back past LNET_PEER_NI_ATTR_HDR. The flag stays true, so when this peer is retried against the fresh skb the attribute is not emitted again - and no later entry emits it either.
The first entry is the one most exposed. lnet_peer_ni_show_start() never sets cb->min_dump_alloc (lnet_net_show_start() sets U16_MAX), so the first skb is NLMSG_GOODSIZE, and the ~65 keys in all[] have already consumed most of it before the loop starts. A version-4 peer with two or three peer NIs then overflows partway through this entry.
On the tools side that attribute is exactly what stops the header repeating - liblnetconfig_netlink.c clears keys[1].lkp_value ("peer") only via
if (attr && parent->lkp_value) {
free(parent->lkp_value);
parent->lkp_value = nla_strdup(attr);
}
so if it never arrives, `strlen(keys[1].lkp_value)` stays non-zero and "peer:" is printed once per netlink message instead of once per dump.
Would setting the flag after genlmsg_end() succeeds, or clearing it in msg_full when this iteration set it, keep it tied to what actually reached user space?
(minor) A realloc() failure is swallowed here - yaml_parse_value_list() returns void and neither data->error nor data->errmsg is set, so lnetctl prints a truncated YAML document and still exits 0. The older grow in yaml_netlink_msg_parse() returns NL_STOP for the same condition. Could this one report the failure too, so a short document isn't mistaken for the full listing?
(minor) This is the mirror of the accounting fixed a few lines above: data->buffer moves backwards here, so the free space grows and it should be `*size += data->indent + 2;`. It only fires when a snprintf() returns negative, so it isn't reachable today, but leaving one of the two sites inverted invites the next reader to copy the wrong one.
(minor) `<= 1` also passes when the header is missing altogether, which is the other way the once-per-dump attribute can go wrong. The dump promises exactly one, so `((hdrs == 1))` would catch both a lost and a repeated header.
(minor) The comment above says the check also confirms the retry path doesn't duplicate entries, but grep -q only proves each primary NID appears at least once. Comparing `grep -c "primary nid: " $out` against $num_peers would actually cover the duplicate case.
(style) Not a bug, but the peers and $out are only cleaned up when every assertion passes - any error() above leaves 300 peers (1500 with SLOW=yes) configured and the YAML file in $TMP for the next subtest. A `stack_trap "rm -f $out"` plus a stack_trap for the peer teardown registered right after the add loop would make the failure path tidy, and would let the del loop drop out of the verification loop.
LU-20587 lnet: fix NULL pointer deref in lnet_peer_ni_show_dump
lnet_peer_ni_show_dump() left several nla_nest_start()/nla_put_*()
return values unchecked, so a full reply skb caused a NULL pointer
dereference instead of being handled. Check every call and roll back/
retry on a fresh skb instead of crashing. Apply the same treatment to
lnet_udsp_info_send()/lnet_nl_put_latency(), and let the dump skip a
peer that got deleted mid-dump instead of aborting the whole listing.
On the userspace side, fix the YAML output buffer in
liblnetconfig_netlink.c, which the same verbose 'peer show' dumps can
overflow. yaml_netlink_msg_parse() only reserves a small amount of
headroom between messages, but a single message can expand into
several KiB of YAML. Add yaml_netlink_input_grow() to realloc the
buffer on demand (rebasing the buffer/read pointers and resyncing
*size to the real free space) and call it in yaml_parse_value_list()
before writing each key, sizing the request for the indent, the key
name, the scalar value and separators, so a message can never write
past data->end and corrupt the heap. Also fix the free-space
accounting after emitting a line to decrement *size by the bytes
written instead of incrementing it.
Add sanity-lnet test_630 to exercise a multi-skb peer dump.
Fixes: f0be00678cc8 ("LU-9680 lnet: collect data about peer_ni by using Netlink")
HPE-bug-id: LUS-13452
Signed-off-by: Andrew Perepechko <andrew.perepechko@hpe.com>
Change-Id: I24688de6f0a001943f2de6241b60bce567e29176
The body describes this as a kernel-doc conversion plus two corrected claims, but the diff also changes three lines in ldlm_setup() from GOTO(out, -ENOMEM) to GOTO(out, rc = -ENOMEM). That is a behaviour change, not a comment change, and nothing in the message accounts for it. It is worth spelling out, because it is a real fix: GOTO() only logs its second argument, so with rc still 0 from the declaration the out: path ran ldlm_cleanup() (which frees ldlm_state and sets it NULL) and then returned 0. ldlm_get_ref() read that as success and left ldlm_refcount at 1, so the next ldlm_state deref (for example __ldlm_bl_to_thread() reading ldlm_state->ldlm_bl_pool) was on a NULL pointer. Could the body say what the three lines fix, or should the fix land as its own change?
Since the patch now fixes ldlm_setup() returning 0 on the kobject/kset failure paths, should it carry a Fixes: tag so the maintenance branches pick it up?
Fixes: 1196bd199e7c ("LU-8066 ldlm: move /proc/fs/lustre/ldlm to sysfs")
That commit added the three GOTO(out, -ENOMEM) sites along with the kobject/kset setup.
This and the two below are the only non-comment lines in the patch. The change itself is right - without the assignment rc stays 0 from the declaration and ldlm_setup() reports success after ldlm_cleanup() has already torn everything down - but it belongs with a commit-message entry and a Fixes: tag rather than riding along with the kernel-doc conversion.
LU-9639 ldlm: Add kernel doc style for LDLM (3) Convert the descriptive function comments in ldlm_lockd.c to kernel-doc style, and drop '/**' from the two static-variable comments, which are not kernel-doc. Two long-standing claims are corrected while converting: the waiting-lock helpers work under waiting_locks_spinlock, not the namespace lock, and ldlm_server_glimpse_ast() neither waits for the reply nor updates the LVB itself. Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Signed-off-by: Oleg Drokin <green@whamcloud.com> Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools Change-Id: I8a1c827a7fd7f0638fd450ba4ffdf6a78e53fd70
(minor) The buffer numbering carried over from the old comment doesn't line up with what the function reads. Buffer 1 ends up in the target UUID:
memcpy(cli->cl_target_uuid.uuid, lustre_cfg_buf(lcfg, 1),
LUSTRE_CFG_BUFLEN(lcfg, 1));
and buffer 2 becomes the connection UUID handed to client_import_add_conn(). The setup line quoted a few lines above in osc_on_mdt() says the same thing - '1:lustre-OST0000_UUID 2:NID' - and lustre_start_mgc() passes LUSTRE_MGS_OBDNAME as buffer 1 and the nid string as buffer 2.
The device/client name is buffer 0. Should 1 read 'target UUID' rather than 'client UUID'?
(minor) Wrapping this bullet onto an unindented continuation line breaks the list. contrib/scripts/kernel-doc -rst emits:
* ``negative`` errno for a known LDLM error code, or an unrecognised negative
code passed through
* ``-EPROTO`` for an unrecognised positive code
and docutils then warns 'Bullet list ends without a blank line; unexpected unindent' and drops out of the list, so the -EPROTO entry is rendered as part of a plain paragraph instead of a third bullet.
Indenting the continuation to line up under the bullet text keeps all three items in the list, which is also what the rest of the tree does (jobid.c, md_attrs.c, liblustreapi_layout.c):
* * %negative errno for a known LDLM error code, or an unrecognised
* negative code passed through
LU-9639 ldlm: Add kernel doc style for LDLM (9) This patch converts existing functional comments to kernel doc style comments and removes '/**' for comments which is not meant to be a kernel-doc comment Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Change-Id: Ia9120a9b1c1f1cd24bdaed2da762f460ba66eb01
(style) this isn't a bug, but the Return: entries are missing the reST list marker that the rest of the tree uses:
* Return:
* * %0 on success
* * %-errno on error
Without the leading `* ` the two lines render as one run-together paragraph ("0 on success negative on error") instead of a two-item list. These two blocks are the only Return: sections in the tree written without it, against ~1150 that have it (see liblustreapi_swap.c and liblustreapi_hsm.c in this same directory). Same applies to the llapi_ioctl() block below.
(defect) llapi_ioctl() doesn't return a negative errno on error, so this contract looks inaccurate.
llapi_ioctl_dev() goes through l_ioctl(), which converts (lib/libcfs/l_ioctl.c):
rc = ioctl(fd, opc, buf);
return rc < 0 ? -errno : rc;
llapi_ioctl() calls ioctl(2) directly and returns its value unchanged, so a failure is -1 with errno set, not -errno. The three in-tree callers all compensate:
rc = llapi_ioctl(fd, OBD_IOC_GETDTNAME, lov_name);
if (rc)
rc = -errno;
The one exception is the fd < 0 short-circuit, which does return -EBADF. Since this is a public entry point (lustre/include/lustre/lustreapi.h), should the block spell out the mixed contract, e.g. %-EBADF if fd is negative, otherwise the ioctl(2) result with errno set on failure?
(minor) this isn't a bug, but llapi_ioctl() is public API and it also has a man page, Documentation/man3/llapi_ioctl.3, which still says under RETURN VALUES:
<0 a negative value on failure and sets errno.
That no longer lines up with the contract being pinned down here: the fd < 0 path returns -EBADF and leaves errno untouched, and the ioctl(2) failure path returns -1, not -errno. Should the man page be updated in the same patch so the two descriptions agree?
Documantation list down the the generatl return. To make it even, it will be updated.
LU-9653 utils: Add kernel doc style for utils (21) This patch converts the existing functional comments in liblustreapi_ioctl.c to kernel doc style comments. llapi_ioctl() returns the ioctl(2) result with errno set rather than a negative errno, except for a negative fd, so document that mixed contract in the kernel doc comment. Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Signed-off-by: Oleg Drokin <green@whamcloud.com> Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools Change-Id: If3120b1c705496c63a907d2aad422a939a9d38d9
The message says the patch "removes '/**' for comments which is not meant to be a kernel-doc comment", but the diff doesn't remove any. ldlm_ibits_policy_wire_to_local() still opens its inner comment with '/**' (around line 477 of the patched file), which is exactly that case. Should that hunk be part of this patch, or should the sentence be dropped from the message?
Is "conflicting lock queue" right for this parameter? Conflicting locks collected here go to the local bl_ast_list; @work_list only receives the splice for locks that were granted, and the only caller runs it as completion ASTs:
__ldlm_reprocess_all() -> reprocess(res, &res->lr_waiting, &rpc_list, ...)
ldlm_run_ast_work(ns, &rpc_list, LDLM_WORK_CP_AST)
Something like "list to collect completion AST work for granted locks" would describe it better.
This return description doesn't look right. The function returns LDLM_ITER_CONTINUE (1) or LDLM_ITER_STOP (2) - it is an ldlm_reprocessing_policy, and rc is seeded with LDLM_ITER_CONTINUE and otherwise comes from ldlm_process_inodebits_lock(). 0 only appears if ldlm_run_ast_work() happens to be the last thing to set rc, so "%0 on success" reads backwards. Should this say LDLM_ITER_CONTINUE/LDLM_ITER_STOP, or negative errno on AST failure?
The description for this parameter is empty. Rendering the block gives an empty entry for `struct list_head *queue`. Something like "granted or waiting queue to check @req against" would fill it in.
This list only covers 0 and 1, but the function also returns 2 (granted GROUP lock with a matching li_gid), -EPROTO for a non-DOM GROUP request, and -EWOULDBLOCK under LDLM_FL_BLOCK_NOWAIT. The caller tests both of those - `if (rc < 0)` and `if (rc != 2)` in ldlm_process_inodebits_lock() - so they're part of the contract. Worth listing them while the block is being rewritten.
(typo) "lcok" -> "lock".
This isn't a bug, but the doxygen marker survived the conversion here - `\a lock` should be `@lock` like the ones in ldlm_inodebits_compat_queue() above. It renders literally as "\a lock".
Two things in this block. The function never returns 0 - every exit is RETURN(LDLM_ITER_STOP), RETURN(LDLM_ITER_CONTINUE), or the `out:` label returning the negative rc from ldlm_inodebits_compat_queue(). Also, the two value lines are missing the list markers the other blocks in this patch use, so they render as one run-on paragraph:
**Return**
``0`` on success ``negative`` on failure
Prefixing each with `* ` gives the same bulleted list as ldlm_inodebits_drop() below.
Can this actually fail? Both exits are RETURN(0) - the unset-bits case warns and returns 0, and the downgrade path returns 0 - and neither caller (mdt_handler.c, ldlm_lockd.c) checks the value. Documenting a negative error return that can't happen may send callers looking for one.
LU-9639 ldlm: Add kernel doc style for LDLM (7) Convert the '/**' comment blocks in ldlm_inodebits.c to kernel-doc style and drop that marker from the comment inside ldlm_ibits_policy_wire_to_local(), which is not kernel-doc. Correct what they say: ldlm_process_inodebits_lock() needs the resource lock asserted by check_res_locked(), not the namespace lock, and returns LDLM_ITER_CONTINUE/LDLM_ITER_STOP or a negative errno, never 0. ldlm_inodebits_compat_queue() also returns 2, -EPROTO and -EWOULDBLOCK, and ldlm_inodebits_drop() always returns 0. Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Signed-off-by: Oleg Drokin <green@whamcloud.com> Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools Change-Id: Ibf11ab8dc9fa91645e7e74197c0a2efd946baa63
This isn't a bug, but since the patch is correcting the facts in this block: both criteria are documented as "exceeds", while the code uses >= for each of them.
return (ns->ns_nr_priv >= (LDLM_DEFAULT_LRU_SIZE >> 3)) &&
(ns->ns_nr_priv >=
(u64)ns->ns_nr_unused * ns->ns_lfru_priv_ratio_limit_256 >> 8);
At exactly 1/8 of the default LRU size, or exactly at the ratio, this returns true. Would "reaches" or "is at least" read more accurately?
(defect) These two descriptions look exchanged with respect to the body. LDLM_ITER_STOP is what the two conflict branches return, and LDLM_ITER_CONTINUE is what is returned once the lock has been granted:
rc = ldlm_plain_compat_queue(&res->lr_granted, lock, NULL);
if (!rc)
RETURN(LDLM_ITER_STOP);
rc = ldlm_plain_compat_queue(&res->lr_waiting, lock, NULL);
if (!rc)
RETURN(LDLM_ITER_STOP);
ldlm_resource_unlink_lock(lock);
ldlm_grant_lock(lock, grant_work);
RETURN(LDLM_ITER_CONTINUE);
ldlm_plain_compat_queue() returns 0 for "conflicting locks found", as its own Return: block a few lines up in this patch says, so !rc is the conflict case.
Should the two bullets swap places?
LU-9639 ldlm: Add kernel doc style for LDLM (13) Convert the function comments in ldlm_plain.c and ldlm_cache_policy.c to kernel doc style, correcting two stale facts they state: ldlm_process_plain_lock() is called with the resource lock held, not the namespace lock, and the ldlm_lfru_priv_too_many() ratio limit defaults to 30%, not 1/3. Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Signed-off-by: Oleg Drokin <green@whamcloud.com> Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools Change-Id: I30187b94aee65fae6bd5ddbfa91e807ea1350d7f
(minor) The message says the patch also "removes '/**' for comments which is not meant to be a kernel-doc comment", but nothing like that happens here. All four /** blocks in ldlm_reclaim.c stay /** and all four are real kernel-doc. Is this line carried over from the earlier patches in the series?
(typo) `ns_rsh_hash` should be `ns_rs_hash` - it is spelled correctly on the @hs line just above, and the field used below is `ns->ns_rs_hash`.
(minor) The old comment documented `count` in both directions and the output half is dropped here:
\param[out] count count of lock still to be revoked
That half is load-bearing - ldlm_reclaim_ns() runs `while (count > 0 && nr_processed < ns_nr)` and depends on `*count -= data.rcd_added` at the end of this function. lustre/llite/file.c already uses the `@it: [in,out] ...` form, so `@count: [in,out] count of locks to be revoked; on return, count still to be revoked` would preserve it.
(minor) Not a bug, but the prose still says 'age' now that the documented parameter has been corrected to `age_ns`, and the unit is not stated. Maybe "only revoke locks idle for longer than `age_ns` nanoseconds"?
(typo) This sentence looks garbled: "Return true if it reaches the Check on the total granted locks:" splices the summary line above into the start of the next sentence. The remaining three lines then restate the Return: block that follows.
Something like this keeps the original meaning:
* ldlm_reclaim_full() - Check on the total granted locks
*
* Also triggers lock reclaim if the low watermark
* (ldlm_reclaim_threshold) is reached.
*
* Return:
* * %true high watermark (ldlm_lock_limit) reached.
* * %false high watermark not reached.
LU-9639 ldlm: Add kernel doc style for LDLM (12) This patch converts existing functional comments in lustre/ldlm/ldlm_reclaim.c to kernel doc style comments. Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Signed-off-by: Oleg Drokin <green@whamcloud.com> Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools Change-Id: I395e2e594d8a6e3b81bc03389c495946cd122762
| unique failing test | history |
|---|---|
| sanity-quota@ldiskfs+DNE:test_80 | seen in 67 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-4 | RHEL 10.1 / x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
(minor) duplicate `Signed-off-by: Minh`...
(style) instead of putting this here, it would be better to `#define GENRADIX_NODE_SIZE PAGE_SIZE` in the compat code and use that instead of `LUSTRE_NL_ENTRY_SIZE_MAX`.
So the table stuff is meant to obd specific but this is really really generic. The code seems to be a mix of both behaviors of being obd specific and then super generic. I would prefer that it was only obd specific. Its not going to be easy to make dump_one() flexible for all cases. So I'm not sold on a dump function.
Same here. While its labled as obd specific its really super generic.
`ops->collect()` is called with `obd_device_lock()` held, and that is `xa_lock(&obd_devs)` -- a spinlock. So a collect callback can't sleep, and anything it allocates (the natural implementation is `genradix_ptr_alloc()`, which existing callers such as tgt_mount.c use with GFP_KERNEL) has to be GFP_ATOMIC. Nothing in the descriptor comment in lustre_kernelcomm.h says this, and the header also doesn't say that `collect` owns updating `ctx->count` and must store entries at 0..count-1 (both the cleanup loop here and `lustre_obd_nl_dump()` assume that). Since there is no in-tree implementation yet to copy from, could the contract be spelled out with the struct? Holding the spinlock across the whole device scan is also a change in character from the existing handlers -- `lustre_stats_start()` does its scan outside `obd_device_lock()`.
`cb->min_dump_alloc` is set to a fixed `ops->min_alloc` regardless of how many entries `collect()` gathered. The two existing handlers scale it: `lustre_device_list_start()` uses `class_obd_devs_count() * DEVICE_VALUE_PACKET_SIZE`, and `lustre_stats_start()` accumulates `STATS_MSG_DATASET_SIZE * rc`. With a constant, any node with more devices than the descriptor author assumed overflows the skb -- and per the comment below, that ends the dump with an error rather than continuing. Should this be `ops->min_alloc * ctx->count` plus the key-table size?
When the skb fills, this returns -EMSGSIZE and the whole dump is aborted, dropping every entry from `ctx->index` onwards. The usual pattern -- and what `lustre_device_list_dump()` does -- is to stop adding messages and return the byte count so netlink flushes the skb and re-enters the dump:
return rc < 0 ? rc : msg->len;
`ctx->index` is already carried in the context, so resumption would work; only the return value is missing. Same for the `dump_one()` failure just below, where `rc` may well be -EMSGSIZE too.
No caller exists yet, so this isn't reachable today, but it looks worth fixing before the first command is wired up.
This looks like a reasonable suggestion?
(minor) This is the same loop that is still open-coded in `lustre_stats_dump()` above. The patch adds the `nla_put` return checks to that copy and lands a second, identical copy here, so a future fix to one will miss the other -- which is the opposite of what the commit message says the change does.
Could `lustre_stats_dump()` just call this?
rc = lustre_nl_put_dataset(msg, stats, LUSTRE_STATS_ATTR_DATASET);
if (rc)
GOTO(out_cancel, rc);
This also seems reasonable
(style) dropping the `static struct genl_family lustre_family;` forward declaration left two blank lines here; one is enough.
(style) not a bug, but `stats_dataset_list` becomes a kernel-global symbol here with no subsystem prefix, which is easy to collide with. `lustre_stats_dataset_list` would match `lustre_family` and `lustre_stats_dump()` alongside it. The extern in lustre_kernelcomm.h would need the same rename.
(style) doesn't need a whole saga. Just a short comment like `copy by element, struct copy only copies fixed header` or maybe use `unsafe_memcpy()` to avoid the warning.
(minor) This repeats the xa_lock()/__xa_alloc()/atomic_inc() sequence from ldebugfs_stats_alloc() verbatim, so the two copies can drift apart. This was raised on the first revision and still applies: ldebugfs_stats_alloc() could compute its truncated source string and then call ldebugfs_stats_register(), leaving only the debugfs file creation behind and keeping one copy of the xarray insertion.
LU-19768 obdclass: table-driven netlink framework
Introduce a reusable table-driven netlink handler framework
(lustre_nl_obd_ops / lustre_nl_ctx) that factors out the common
start/dump/done pattern shared by commands that iterate OBD devices.
Each command supplies a descriptor with collect, dump_one, and
optional release callbacks.
Also fix several bugs in the existing stats dump path:
- Add missing nla_put return-value checks
- Fix an off-by-one in key-list sizing
- Fix a typo ("togther" -> "together").
TLC-bug-id: TLU-56
Signed-off-by: Timothy Day <timday@thelustrecollective.com>
Signed-off-by: Minh Diep <mdiep@thelustrecollective.com>
Change-Id: Ic3267111785fe79761f0673477149f7fca470a35
Signed-off-by: Minh Diep <mdiep@thelustrecollective.com>
After talking with Oleg and Andreas, there is some concern that pure regex is less reliable than doing a compile for each check. Would it be possible to modify gen_compat.py to do a simple compile test? And still keep the same general structure? I'm wary of cases where the regex finds a symbol, but we fail during link or modpost.
We can split the current parallel configure tests into individual files. As far as the modpost concern that exists in the current parallel build already (may be 1 or 2 checks verify modpost / kernel module gets linked). The main thing that doing grep/regex checks can do is run against kernel sources that have not be built. The compile tests require targeting an already kernel which is sort of annoying to have to build the kernel before configuring lustre, to then just to drop lustre back into the kernel and build the kernel again. compared to lustre out-of-tree building the kernel is a real time sink.
> The compile tests require targeting an already kernel which is sort of annoying to have to build the kernel before configuring lustre, to then just to drop lustre back into the kernel and build the kernel again. This is true. But for the latest kernels, we'd aim to have Lustre "default" to the right configuration - so you can skip the initial configuration. That doesn't help with old kernels, but I think that's fine. > compared to lustre out-of-tree building the kernel is a real time sink. Maybe there is a light-weight check-but-don't-compile approach we could use? I can investigate this a bit.
When exp is a list, the expressions only match if they land on strictly consecutive lines: the first match sets restart, and the very next non-matching line resets regex back to the full list.
struct foo { <- matches exp[0]
int a; <- resets, exp[1] never gets a chance
int bar;
};
With exp = ['struct foo {', 'int bar;'] the above gives "no"; removing the int a; line gives "yes". For the usual case - find a struct, then find a member some lines below it - that is the wrong behaviour.
The restarting line is also never re-tested against exp[0], since the elif skips the if, so a sequence that begins on that line is missed. No ksym uses a list yet, but the rest of the series builds on this.
This method can never be called. The class attribute above it is replaced by this def at class creation, and then __init__ assigns self.header, so every instance shadows it with the string or list from the ksym.
The consequence is that the list form the docstring advertises does not work end to end. grep_ex() handles a list, but map_and_save() does Path(self.header) and main() sorts on x.header. A ksym with header = [a, b] aborts configure:
TypeError: argument should be a str or an os.PathLike object ..., not 'list'
Either drop the dead method and the list wording, or rename it (header_primary()?) and use it in map_and_save() and the sort key.
A header that cannot be opened ends up here and the check just returns False, so "file is missing" and "symbol is absent" produce the same result, and the only difference is a stderr line that needs --verbose.
With a --linux path that contains no include/linux at all, all three ported checks print "no" and the script still exits 0:
checking if bio-integrity.h exists ... no
checking if blk-integrity.h exists ... no
checking if 'mmap_write_lock()' is available ... no
That matters because each ksym pins one absolute path under {linux}, while the compile tests being replaced were handed the full kernel include set (-I$LINUX/include -I$LINUX_OBJ/include -I$LINUX/arch/$SUBARCH/include ... in LB2_LINUX_TEST_COMPILE). --linux-obj is accepted but never consulted for header lookup, only for version.h.
The Debian fixup a few lines above the gen_compat call in lustre-build-linux.m4 exists precisely because $LINUX can be an arch-specific headers directory whose include/linux lives in the -common package, and that fixup only fires when LINUX equals LINUX_OBJ and LINUX is already canonical - not for the default /lib/modules/$(uname -r)/build.
When HAVE_MMAP_LOCK comes out "no" on a >= v5.8 kernel, include/lustre_compat/linux/mmap_lock.h redefines mmap_write_lock() and friends against mm->mmap_sem, so this surfaces as a confusing compile failure rather than as a configure error. Could a header that fails to open be a hard error instead?
This returns on the first entry whose distro matches (and, for rhel/suse, whose major matches), so only one linux_* range per check is ever consulted. A diagnostic like ('linux_5.8-6.0', 'linux_6.5-') would silently ignore the second range.
The HAVE_MMAP_LOCK data also looks off: rhel_9.2- excludes RHEL 9.0/9.1, which are 5.14 and do have include/linux/mmap_lock.h. Against a simulated RHEL 9.0 tree the check correctly says yes but the diagnostic then reports a failure:
checking if 'mmap_write_lock()' is available ... yes [linux/mmap_lock.h] n
rhel 9.0.70.13.1 [Linux 5.14.0] diagnostic failed ...
Should that be rhel_9.0-?
LU-20418 build: introduce gen_compat and port early libcfs Introduce a faster build checking system that uses snippets of python code in: config/compat.d/*.ksym to generate macro(s) and/or inject code into config.h Move checks for: HAVE_LINUX_BIO_INTEGRITY_HEADER HAVE_LINUX_BLK_INTEGRITY_HEADER HAVE_MMAP_LOCK A dependency is added on python3, which is widely available, and is not expected to hinder supported target platforms. gen_compat.py formatted with: $ black --version black, 26.3.1 (compiled: yes) Python (CPython) 3.14.4 Add support for kernel version parsing and diagnostics for checking if a ksym compatibility check differs from is expected. gen_compat writes to include/linux/libcfs/libcfs_gen_compat.h which is included by config.h see: AH_TOP() in configure.ac Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun@tancheff.com> Change-Id: I7080193bba1a29eae256d4896d1382e8561dd2de
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | RHEL 9.7 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
| review-dne-zfs-part-2 | RHEL 9.7 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
(minor) llite.*.uuid prints the UUID with a trailing newline, this returns it without one, so cat $MOUNT/.lustre/uuid runs straight into the shell prompt. Since this is a new user-visible interface, is it worth matching the sysfs form now?
(style) Extra parentheses around the argument - fid_is_uuid(&lli->lli_fid) reads better, and matches the PFID(&lli->lli_fid) a few lines up. ll_inode2fid(inode) would work too.
(style) Not a bug, but the tab alignment between type and name is back after being asked about on earlier patchsets - a single space is what new code uses:
struct md_object *mdo;
struct mdd_object *mdd_uuid;
struct lu_fid fid = LU_UUID_FID;
int rc;
(suggestion) Nothing ever reads m->mdd_dot_lustre_objs.mdd_uuid. mdd_obf and mdd_lpf are kept because they carry mo_dir_ops, but this one has no ops attached, so the mdo_locate() / new field / mdd_object_put() trio only pins the object in the lu_site cache. Would mdd_local_file_create() on its own be enough here?
(defect) .lustre/uuid only exists on an MDS that carries this patch, so against an older server llapi_open_by_fid() returns -ENOENT here and ASSERTF() -> DIE() exits the whole binary. sanity.sh test_154g, which runs llapi_fid_test, is gated only on MDS1_VERSION >= 2.6.92, so on an interop run test_154g fails and test40/test41/test42 in this binary never execute. Can this be gated on the server version - e.g. tolerate -ENOENT here, or move the check into a version-gated shell test instead?
LU-18076 llite: add $MOUNT/.lustre/uuid Add a virtual $MOUNT/.lustre/uuid file to print the UUID for that specific mountpoint. Also, conf-sanity.sh test_44 is modified to verify this patch. Signed-off-by: Emoly Liu <emoly@whamcloud.com> Change-Id: I74d22c012dbc623d35e4fdf8594d8e7c83e01b1a
ldiskfs/xattr.c: warning: sparse:no newline at end of file
ldiskfs/xattr.c: warning: sparse:no newline at end of file
The body only describes the ldiskfs credit reuse. Several hunks aren't accounted for: - `lnet/libcfs/tracefile.c` drops `static` from `cfs_trace_data` - nothing else in the patch touches libcfs. Is this a debugging leftover that should be dropped? - `osd_trans_dump_creds()` changes from `struct thandle *` to `struct osd_thandle *`, touching four call sites. That's a standalone cleanup. - The ldiskfs patches add `EXPORT_SYMBOL(ext4_xattr_ibody_get)` alongside the one that is actually needed. - `osd_declare_attr_set()` stops declaring `OSD_OT_XATTR_SET` unconditionally and gates it on the LMA flags. That is a behaviour change worth a sentence of its own. Also a few wording slips: "old code don't able to account" -> "the old code cannot account", "lets reuse" -> "let's reuse".
(typo) The quoted subject doesn't match the referenced commit. `git log -1 --format=%s 278fa1fb23` gives:
LU-12652 ldiskfs: disable credits check in 4.18
The leading `35750: ` is the Gerrit change number, not part of the subject.
I manually reverted rhel9.6/9.7 series so it points back at 5.14 patch again and the build is restored so I believe this patch is just broken.
It looks like RHEL9.6/9.7 kernel have a changes in ext4 version. sometimes it have ext4/crypto.c - sometimes not. I have tested with lastes 9.6/9.7 version but our code it looks not a last.
I checked again with 5.14.0-570.62.1.el9_6.x86_64 and 5.14.0-611.35.1.el9_7.x86_64. It looks you needs to update a kernel versions.
ext4 never sets few EAs in a single transaction AFAIU. so it's unlikely this kind of change can make into vanilla kernel.
sure. it's sets. example of this in the patch. You lost it ?
sorry? how many EAs an user can set using clean ext4 in a single transaction?
this is
(defect) This `Index:` header has no `---`/`+++` lines and no hunks - the crypto.c change is missing from this file (the linux-6.12 copy has it). This file also never patches `fs/ext4/super.c`.
`ext4_set_context()` lives in `fs/ext4/crypto.c` on 5.16+ and in `fs/ext4/super.c` before that, and in both it calls
ext4_xattr_set_credits(inode, len, false, &credits)
while the xattr.h hunk above changes the prototype to 6 arguments. `ldiskfs/Makefile.in` copies every `@EXT4_SRC_DIR@/*.c` for patching and only filters `crypto.c` out of the object list when `CONFIG_FS_ENCRYPTION` is unset, so with encryption enabled this is `error: too few arguments to function 'ldiskfs_xattr_set_credits'`.
That breaks every series still pointing at this file - rhel9.1 through 9.5, sles15sp4/sp5, oe2203, the 5.15/5.19 ubuntu20 series, ubuntu24 -45/-100/-106, ubuntu26, and all of 6.1/6.6/6.7/6.10/6.11/6.12/6.18/7.0-ml.
This is the same breakage that was reported earlier on rhel9.6/9.7; switching those two series to the linux-6.12 copy moved the failure rather than fixing it.
(minor) `ext4_xattr_ibody_get` doesn't seem to have any caller outside ldiskfs - grepping the tree for `ldiskfs_xattr_ibody_get` finds nothing. Is this export needed, or left over from an earlier version?
does not look like it actually applies to rhel9.6?
I wonder if this also works?
(defect) Only `6.8.0-90` was moved to the linux-6.12 copy. `ldiskfs-6.8.0-45-ubuntu24.series`, `ldiskfs-6.8.0-100-ubuntu24.series` and `ldiskfs-6.8.0-106-ubuntu24.series` still reference `linux-5.14/ext4-xattr-disable-credits-check.patch`, and those kernels have `fs/ext4/crypto.c`. Same for the mainline series (6.6/6.12/6.18/7.0-ml) and 7.0.0-14-ubuntu26. Should the remaining series be switched too, or should the linux-5.14 copy be completed instead?
warning: sparse:symbol 'cfs_trace_data' was not declared. Should it be static?
LU-20154 ldiskfs: fix credit calculation for xattr
old code don't able to account an EA inode credits,
lets reuse an ldiskfs code to avoid this.
Fixes: 278fa1fb23 ("35750: LU-12652 ldiskfs: disable credits check in 4.18")
HPe-bug-id: LUS-12937
Signed-off-by: Alexey Lyashkov <alexey.lyashkov@hpe.com>
Change-Id: Id7eca1783dd4f6848f8d235b6159b8d34eb398db
| unique failing test | history |
|---|---|
| sanity1@ldiskfs+DNE:test_27T | seen in 5 other reviews |
LU-20071 kernel: new kernel [RHEL 9.8 5.14.0-687.13.1.el9_8] This patch makes changes to support new RHEL 9.8 release for Lustre client. Linux commit v6.15-13744-g41cb08555c41 treewide, timers: Rename from_timer() to timer_container_of() Provide timer_container_of for older kernels when is not defined. Lustre-change: https://review.whamcloud.com/65431 Lustre-commit: TBD (from a5288b6979f0c8cb1dd53e513b245035525e0f5c) Test-Parameters: trivial fstype=ldiskfs mdtcount=4 mdscount=2 \ clientdistro=el9.8 serverdistro=el8.10 testlist=sanity Test-Parameters: optional fstype=zfs mdtcount=4 mdscount=2 \ clientdistro=el9.8 serverdistro=el8.10 testlist=sanity Test-Parameters: optional fstype=ldiskfs mdtcount=4 mdscount=2 \ clientdistro=el9.8 serverdistro=el8.10 testgroup=full-dne-part-1 Test-Parameters: optional fstype=ldiskfs mdtcount=4 mdscount=2 \ clientdistro=el9.8 serverdistro=el8.10 testgroup=full-dne-part-2 Test-Parameters: optional fstype=ldiskfs mdtcount=4 mdscount=2 \ clientdistro=el9.8 serverdistro=el8.10 testgroup=full-dne-part-3 Change-Id: I550b9425a6a4868a9f8f817d3e1e74068840df51 Signed-off-by: Jian Yu <yujian@whamcloud.com> Signed-off-by: Fredrik Nyström <freny@nsc.liu.se>
| unique failing test | history |
|---|---|
| sanity3@zfs:test_271f | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-4 | RHEL 8.10 / x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
ugh, why was it here when it registers in ldlm_namespace_sysfs_register?
should we just move this two lines up instead?
LU-19926 ldlm: release stats sysfs entries are removed otherwise we can hit a panic/gfp when umount races with lctl get_param: 186546:0:(lprocfs_status.c:1689:lprocfs_stats_collector()) ASSERTION( stats ) failed: 186546:0:(lprocfs_status.c:1689:lprocfs_stats_collector()) LBUG Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Change-Id: I74558c077cd5ccf962e01ce2c013bb6ea9a0754a
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | RHEL 8.10 / x86_64 | ran 11 tests. 5 tests failed: sanity-pfl, sanity-lnet, pjdfstest, sanity-sec, sanity-lfsck. | session |
| review-dne-part-2 | RHEL 9.7 / x86_64 | ran 11 tests. 5 tests failed: sanity-pfl, sanity-lnet, pjdfstest, sanity-sec, sanity-lfsck. | session |
| review-dne-part-4 | RHEL 8.10 / x86_64 | ran 9 tests. 6 tests failed: sanity-quota, sanity-hsm, sanity-flr, sanity-dom, replay-ost-single, mmp. | session |
| review-dne-part-4 | RHEL 9.7 / x86_64 | ran 9 tests. 6 tests failed: sanity-quota, sanity-hsm, sanity-flr, sanity-dom, replay-ost-single, mmp. | session |
| review-dne-part-7 | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity-scrub. | session |
| review-dne-part-7 | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanity-scrub. | session |
| review-dne-zfs-part-2 | RHEL 8.10 / x86_64 | ran 11 tests. 2 tests failed: sanity-lnet, sanity-lfsck. | session |
| review-dne-zfs-part-4 | RHEL 8.10 / x86_64 | ran 9 tests. 1 tests failed: mmp. | 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.7 / x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 24.04 / x86_64 | ran 6 tests. 2 tests failed: sanity-sec, sanity-lnet. | session |
(defect?) this will not be reset when this script is finished and the next script is started. Having a `stack_trap` to reset it would help. Unfortunately, the other problem here is that there is no way to test this with `testlist=sanity env=PANIC_ON_WARN=1` except by deleting this line...
I think this version of the patch is bogus anyway - it doesn't work. I probably have to rework this altogether.
(style) You can write this more compactly as:
local warn_setting="$(sysctl kernel.panic_on_warn)"
stack_trap "sysctl ${warn_setting/ = /}"
essentially saving the full output and restoring it. Unfortunately, sysctl is not "symmetrical" in that it prints values like `kernel.panic_on_warn = 0` but only accepts `kernel.panic_on_warn=0` as input. Hence the `${foo/ = /}` parameter substitution when registering the stack_trap.
Not sure this is a huge win, just an FYI to avoid writing the same parameter name multiple times, especially when they get long
(defect?) this shouldn't register a new `stack_trap` if the value is unchanged. Otherwise, if `set_default_debug()` is called multiple times on the same node (e.g. multiple client/target mounts in conf-sanity.sh) it could make the cleanup messy or overflow the limits for the `stack_trap()` mechanism. In any case, there is no value to do so:
[[ $new_warn_setting != ${warn_setting/.* = /} ]] || return 0
LU-18400 tests: enable panic_on_warn Enable panic_on_warn to catch kref bugs (and other strange warnings) that might otherwise get ignored. This is enabled by default for all test suites. However, explicitly disable it for test suites that still have warnings. This will prevent future regressions while enabling developers to address existing warnings incrementally. Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: Ifc042c667422761b01ba8a95e7e838b040be00b5
| unique failing test | history |
|---|---|
| replay-dual@zfs+DNE:test_26 | seen in 17 other reviews |
(minor) this looks like an `sptlrpc` parameter. Also, version numbers never really explain what they are for. It would be better to name this something more clear like `lst_force_large_nid`.
Yucky. Can't we do version handshaking instead. My next patch in this area will try the hand shaking approach.
srpc_force_v2 is for disabling v1 on v2 hosts. If it is not used, there's "handshaking": v2 is able to initiate a session with v1 (ipv4) or v2 (both ipv6 and ipv4), v1 is able to initiate an ipv4 session to v2 and v1.
Is there no mechanism that LNet (and LST) can use to automatically negotiate protocol feature support? If not, then this should be added as part of this compatibility-breaking change. Or do I misread this, and the `srpc_force_v2` is only used to force the new large-NID functionality on systems that don't need it?
(defect) this should have `env=FORCE_LARGE_NID=true` to run IPv6 sessions?
(minor) variable-sized `lnet_processid` should go after `nde_state`
(minor) These should all be replaced with fixed-size types (e.g. `__u32`)
(minor) should remove pointers from UAPI structs, especially in the middle
I thought I ported the SID handling to Netlink.
??
LU-19323 lnet: add IPv6 support to lnet_selftest Adds IPv6 support to lnet_selftest. Is backwardly-compatible to earlier versions of selftest. Adds module parameter srpc_force_v2 which can optionally force large-NID (v2) protocol on wire (breaks v1-compatibility) Test-Parameters: fortestonly Test-Parameters: trivial testlist=sanity-lnet Signed-off-by: Serguei Smirnov <ssmirnov@whamcloud.com> Change-Id: I3879dc88f0c89ebbaa21adb9faca6782a855ee3a
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-5 | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: lustre-rsync-test. | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 | ran 6 tests. 2 tests failed: sanity-sec, sanity-lnet. | session |
(minor) Most parameters allow other values to be written to clear it, like "0", and not just "clear".
same
...
LU-17266 mdt: purge objects via procfs sometimes it can be useful for testing to drop/reload lu objects. lctl set_param mdt.*.site_stats=clear lctl set_param ofd.*.site_stats=clear it should be possible to replace total system cache drop (echo 3 > /proc/sys/vm/drop_caches) with this lustre-only version. Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Change-Id: I9055be3b53d0af22758eac0acac8771e40c371f7
| unique failing test | history |
|---|---|
| conf-sanity2@ldiskfs+DNE:test_35a | seen in 4 other reviews |
| conf-sanity2@ldiskfs+DNE:test_35b | seen in 18 other reviews |
| conf-sanity2@ldiskfs+DNE:test_37 | seen in 18 other reviews |
| conf-sanity2@ldiskfs+DNE:test_38 | seen in 16 other reviews |
| conf-sanity2@ldiskfs+DNE:test_39 | seen in 28 other reviews |
| conf-sanity2@ldiskfs+DNE:test_40 | seen in 30 other reviews |
| conf-sanity2@ldiskfs+DNE:test_41a | seen in 27 other reviews |
| conf-sanity2@zfs:test_35a | seen in 4 other reviews |
| conf-sanity2@zfs:test_35b | seen in 8 other reviews |
| conf-sanity2@zfs:test_38 | seen in 11 other reviews |
| conf-sanity2@zfs:test_39 | seen in 25 other reviews |
| conf-sanity2@zfs:test_40 | seen in 25 other reviews |
| conf-sanity2@zfs:test_41a | seen in 12 other reviews |
| recovery-small@ldiskfs+DNE:test_10a | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| recovery-small@ldiskfs+DNE:test_24b | seen in 4 other reviews |
| recovery-small@ldiskfs+DNE:test_106 | seen in 4 other reviews |
| recovery-small@ldiskfs+DNE:test_108 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| recovery-small@zfs:test_10a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| recovery-small@zfs:test_24b | seen in 2 other reviews |
| recovery-small@zfs:test_106 | seen in 4 other reviews |
| replay-single@ldiskfs+DNE:test_65b | seen in 6 other reviews |
| replay-single@zfs:test_65b | seen in 6 other reviews |
| sanity2@ldiskfs+DNE:test_60f | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_170 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| sanity2@ldiskfs+DNE:test_360 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| sanity2@ldiskfs+DNE:test_401a | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| sanity2@ldiskfs+DNE:test_818 | seen in 7 other reviews |
| sanity2@zfs:test_60f | seen in 1 other review |
| sanity2@zfs:test_170 | seen in 1 other review |
| sanity2@zfs:test_401a | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 9.3/x86_64 | ran 4 tests. 1 tests failed: sanity. | session |
| review-dne-part-3 | RHEL 9.3/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. This build will be scored -1 since fortestonly was specified. | session |
| review-dne-part-5 | RHEL 9.3/x86_64 | ran 6 tests. 1 tests failed: recovery-small. | session |
| review-dne-part-6 | RHEL 9.3/x86_64 | ran 4 tests. 1 tests failed: replay-single. | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.9/x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.9/x86_64 | ran 5 tests. 1 tests failed: recovery-small. | session |
| 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 |
| review-ldiskfs | RHEL 8.9/x86_64, SLES 15.5/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.9/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-zfs | RHEL 8.9/x86_64 | ran 8 tests. 1 tests failed: replay-single. | session |
never kill a subsystem check. I will make developers work harder.
I'm hoping to use the tracepoints to enable/disable subsystem logging. There's a tracepoint enabled macro I could use to restore this check.
Does this add 256 bytes of stack usage to every function that calls CDEBUG()? That could be pretty bad in some call chains.
Yes. This is super hack-y. There's definitely a better way to do this.
you are really want to kill a performance? I think yes.
This entire __ltrace_printk() macro sucks. I need to rewrite it entirely. I have an idea that should make this macro much better.
There are tunable parameters for the CDEBUG rate limiting, why not use them here?
I'll probably have to, since old kernels don't like '#include <linux/ratelimit_types.h>'. I was hoping that these macro would be simpler.
This will also need to be fixed.
I think this is fine? This is just redefining this function to be always false is debugging is disabled.
Sorry, I was thinking this was the no-op version of the actual libcfs_debug_msg() which had been removed. Carry on.
Doesn't build on aarch64 and ppc. Needs to go in debug.c probably. These are pretty huge functions anyway.
Same.
Same.
LU-8980 debug: redefine CDEBUG to use tracing ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TODO: 1) Look at debug upcalls 2) Test/verify/update userspace helpers 3) Clean up more code 4) Validate LBUG, LASSERT 5) Write kernel doc comments for everything 6) Make sure various userspace settings actually work 7) Fix CDEBUG_LIMIT/CDEBUG_LIMIT_LOC ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The custom Lustre debugging infrastruction should be refactored to use existing kernel debugging infrastructure. We should aim to: 1) Improve the current developer experience: Writing code for Lustre shouldn't be made harder. Existing userspace debugging tools should still work and should be improved. 2) Maintain or improve performance: Lustre is a high performance filesystem, not a low performance one. 3) Significantly reduce divergence with upstream: The custom Lustre debugging must go. The code in libcfs and various Lustre subsystem must be refactored. The first step towards that is pushing all debug message into the trace log. This will allow use to retain the features of current Lustre debugging while significantly reducing the need for custom code. This patch removes old Lustre debugging code at the same time. Also, it implements the minimum userspace code needed to make Lustre debugging tools still function. Test-Parameters: fortestonly Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: I8004049eb97a3fdc9a5725aa8402355107494950
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-5 crashed | RHEL 8.8/x86_64 | ran 6 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% | session |
LU-14717 osd-ldiskfs: set readcache_max_filesize properly When set readcache_max_filesize with a negative value from the proc/sysfs interface, we should set it with maximal value OSD_MAX_CACHE_SIZE. Signed-off-by: Qian Yingjin <qian@ddn.com> Change-Id: If5d41211b2b1016a70f470f3242a17f8d5c9d3b8
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | CentOS 7.0/x86_64 | ran 8 tests. 1 tests failed: sanity. | session |
LU-11234 lod: add data placement policy (DPP) for OST pools
This patch provides a mechanism to place files into different pools according
to filename, jobid, fsuid, fsgid, projid and client nid. filename and jobid
support the qualifier '*'. Fsuid, fsgid, projid and client nid support range
expression. This feature is useful when Lustre is built up with different type
of devices, such as OSTs composed of SSDs and disks. To use this feature, the
same type of OSTs firstly make up one pool and DPP rules are added to
the system. Then, when handling file creation, MDT checks the operation
according to the predefined DPP rules, and put the file's object(s) into the
corresponding pool.
The usage of the rule is similar to NRS TBF. Commands for the rule are like:
Add a rule named "rule_sourcecode" according to which filename matching "*.c"
or "*.h" will be put into the pool named "pool0"
lctl set_param lod.*.dpp=\
"add rule_sourcecode pool={pool0} fname={*.h *.c}"
Add a rule named "rule_vip_users" according to which files with uid = 500 or
uid = 100 will be put into the pool named "pool1"
lctl set_param lod.*.dpp=\
"add rule_vip_users pool={pool1} uid={500 1000}"
Add a rule named "rule_vip_groups" according to which files with gid = 500 or
gid = 1000 will be put into the pool named "pool2"
lctl set_param lod.*.dpp=\
"add rule_vip_groups pool={pool2} gid={500 1000}"
Add a rule named "rule1" according to which files with projid between 500 and
600 or between 800 and 1000 will be put into the pool named "pool2"
lctl set_param lod.*.dpp=\
"add rule1 pool={pool2} projid={500-600 800-1000}"
Add a rule named "vip_client" according to which files creation from client
with nid of 10.0.0.200@tcp will be put into the pool named "pool3"
lctl set_param lod.*.dpp=\
"add vip_client pool={pool3} nid={10.0.0.200@tcp}"
It also supports complex rules. The following command will add a rule which
will put files that match any condition of 1) its uid is 500 and gid is 1000,
or 2) it has a suffix of ".h" or ".c" into the pool named "pool4"
lctl set_param lod.*.dpp=\
"add rule2 pool={pool4} uid={500}&gid={1000},fname={*.c *.h}"
Delete a rule named "rule1"
lctl set_param lod.*.dpp="del rule1"
This patch also combines the command parse functions that are shared with NRS TBF
and pcc codes.
Change-Id: Ie4876a78adcc561f79005817433a7bbdf5fbc65b
Signed-off-by: Teddy Zheng <teddy@ddn.com>
Signed-off-by: Li Xi <lixi@ddn.com>
LU-10026: Configuration for compression support and lz4 module backport This patch adds build system changes for compression: - If lz4 is not available in the kernel (< 3.11), we build a private module for it. - Always build compression module except when ldiskfs is enabled. - An option cl_compression, settable via lctl, enables or disables compression. Change-Id: I7f843ed7ca822a3f3246bd5c3e4ccb6e6f0ec90f Test-Parameters: forbuildonly, fstype=zfs Signed-off-by: Anna Fuchs <anna.fuchs@informatik.uni-hamburg.de>
LU-11380 utils: split llapi_fid2path() in three functions Split llapi_fid2path() into separate llapi_lufid2path() to avoid hoop jumping in the next patch that adds llapi_lufid2parent(). Add helper llapi_fsname_open() to open a descriptor on a filesystem by fsname or directory for llapi_lufid2path() and other functions. Use it in "lfs fid2path" to fix bug when passed a non-mount directory. Add ability to run a single subtest of llapi_fid_test with the "-o" option, or to exclude a single test with "-e" to speed up debugging. Signed-off-by: Andreas Dilger <adilger@whamcloud.com> Change-Id: I05abfaf888a5474d62feebab4e8db543b93ebbe5
| unique failing test | history |
|---|---|
| sanity1@ldiskfs+DNE:test_39j | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_64f | seen in 37 other reviews |
| sanity2@ldiskfs+DNE:test_133c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_398g | seen in 13 other reviews |
| sanity1@zfs:test_42e | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@zfs:test_45 | seen in 4 other reviews |
| sanity-benchmark@ldiskfs+DNE:test_fsx | seen in 17 other reviews |
| sanity-benchmark@ldiskfs+DNE:test_fsx_partial_punch | seen in 8 other reviews |
| sanity-dom@ldiskfs+DNE:test_fsx | seen in 7 other reviews |
| sanity-dom@zfs:test_fsx | seen in 7 other reviews |
| sanity-dom@zfs:test_42e | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-dom@zfs:test_4 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-flr@ldiskfs+DNE:test_70a | seen in 63 other reviews |
| sanity-flr@zfs:test_70a | seen in 53 other reviews |
| sanity-hsm@zfs:test_3 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanityn@ldiskfs+DNE:test_16k | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanityn@ldiskfs+DNE:test_18 | seen in 1 other review |
| sanityn@zfs:test_16a | seen in 3 other reviews |
| sanityn@zfs:test_16b | seen in 3 other reviews |
| sanityn@zfs:test_16k | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanityn@zfs:test_18 | seen in 1 other review |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 9.3 / x86_64 | ran 4 tests. 1 tests failed: sanity. | session |
| review-dne-part-4 | RHEL 9.3 / x86_64 | ran 9 tests. 2 tests failed: sanity-flr, sanity-dom. | session |
| review-dne-part-5 | RHEL 9.3 / x86_64 | ran 6 tests. 2 tests failed: sanityn, lustre-rsync-test. | session |
| review-dne-part-6 | RHEL 9.3 / x86_64 | ran 6 tests. 1 tests failed: replay-single. | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.9 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-1 crashed | RHEL 8.9 / x86_64 | ran 6 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-4 | RHEL 8.9 / x86_64 | ran 9 tests. 1 tests failed: sanity-dom. | session |
| review-dne-zfs-part-5 | RHEL 8.9 / x86_64 | ran 6 tests. 2 tests failed: sanityn, lustre-rsync-test. | session |
| review-dne-zfs-part-6 | RHEL 8.9 / x86_64 | ran 6 tests. 1 tests failed: replay-single. | session |
| review-dne-zfs-part-7 | RHEL 8.9 / x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
| review-ldiskfs | RHEL 9.3 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.9 / x86_64, SLES 15.5 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.9 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.9 / x86_64, RHEL 9.3 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-zfs | RHEL 8.9 / x86_64 | ran 10 tests. 2 tests failed: replay-single, sanity-flr. | session |
LU-13419 osc: Improve speed of enter_cache_try When doing writes to many files, one bottleneck on a client currently seems to be the grant code, specifically spinning in the lock around: osc_enter_cache_try The contention is *just* on osc_enter_cache_try, so there's no obvious way to refactor the lock, etc. Instead, we can look at where time is going in the function. Two things that stand out: obd_dirty_pages is an atomic, and expensive: In my perf tracing, the add_return to this is 50% of the time in this function. This can be replaced with a percpu_counter. These benchmark #s are with the earlier version of the patch, which mistakenly replaced the atomic with a bare unsigned long. I'm not currently able to benchmark the percpu_counter, but it should be similar. mpirun -np 36 $IOR -o $LUSTRE -w -t 1M -b 2G -i 1 -F That's 36 processes on one client, writing to separate files. Before patch: 5942 MiB/s After patch: 14950 MiB/s Looking in perf, the change is huge: I go from spending 60% of the time in osc_enter_cache_try to around 30%, but that's while moving 2.3x the amount of data per second. Signed-off-by: Patrick Farrell <paf0187@gmail.com> Change-Id: If5a69b906c6b56786e6a06dccc723781591419e8
LU-10973 lnet: Support autotest integration Add the following features for better autotest integration: 1. Print progress lines to a file to allow autotest to monitor progress. Make the path to the file configurable. 2. Split the results into suites for more user friendly display in maloo 3. Store the configuration file in the LUTF config to allow the LUTF to use the environment variables 4. Allow running multiple suites from the auster command line ex: --suite dlc,dynamic-nids 5. Allow running LUTF from build directory Test-Parameters: trivial Signed-off-by: Amir Shehata <ashehata@whamcloud.com> Change-Id: I9c1877768d885d975f4065f4930eba2fa8a11f94
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | CentOS 8.3/x86_64 | ran 7 tests. 2 tests failed: runtests, replay-dual. | session |
| review-dne-part-4 | CentOS 8.3/x86_64 | ran 9 tests. 1 tests failed: sanity-flr. | session |
| review-dne-part-5 | CentOS 8.3/x86_64 | ran 6 tests. 1 tests failed: sanityn. | session |
| review-dne-zfs-part-4 | CentOS 8.3/x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
| review-zfs | CentOS 8.3/x86_64 | ran 8 tests. 1 tests failed: sanity-quota. | session |
LU-15030 osp: add debugfs for sync progress During sync between MDT and OSTs, it could need much more time if the load on OST is very high, it will be better to have some some kind of debugfs interface to know the sync progress and make sure the sync is moving forward. Signed-off-by: Hongchao Zhanng <hongchao@whamcloud.com> Change-Id: Id24f3a481c5d28b7dc9714a80905541c88cf0f5a
| unique failing test | history |
|---|---|
| lustre-rsync-test@ldiskfs+DNE:test_2c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| lustre-rsync-test@zfs:test_2c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-flr@ldiskfs+DNE:test_70 | NEW 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_70 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_51 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@zfs:test_51 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | RHEL 8.6/x86_64 | ran 7 tests. 2 tests failed: sanity-sec, sanity-lfsck. | session |
| review-dne-part-4 | RHEL 8.6/x86_64 | ran 9 tests. 1 tests failed: sanity-flr. | session |
| review-dne-selinux-ssk-part-2 | CentOS 8.5/x86_64 | ran 5 tests. 1 tests failed: sanity-sec. | 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. 2 tests failed: sanity-sec, sanity-lfsck. | session |
| review-dne-zfs-part-4 | CentOS 8.5/x86_64 | ran 9 tests. 1 tests failed: sanity-flr. | 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 |
| review-zfs | CentOS 8.5/x86_64 | ran 8 tests. 2 tests failed: sanity-flr, sanity-quota. | session |
LU-15979 llite: restore S_NOSEC in ll_update_inode()
ll_update_inode() is to set S_NOSEC (if needed) after permission
update with help of inode_has_no_xattr() having inode->i_rwsem held.
Without that { creat(); fstat(); write(); } executes to eviction
favorable case:
cl_io_loop
cl_io_lock <- LDLM lock is taken here
cl_io_start
vvp_io_write_start
...
__generic_file_aio_write
file_remove_privs
security_inode_need_killpriv
...
ll_xattr_get_common
...
mdc_intent_lock <- enqueue RPC is sent here
If enqueue rpc is delayed, the client may get evicted as not
cancelling lock taken in cl_io_lock.
ll_update_inode() is called without inode->i_rwsem locked for regular
file but one case:
vfs_setxattr()
inode_lock(inode);
..
ll_xattr_set()
ll_setstripe_ea()
ll_lov_setstripe_ea_info()
ll_intent_file_open()
ll_prep_inode()
ll_update_inode()
where ll_update_inode() is called with inode->i_rwsem locked.
In order to be able to detect this case MDS_OPEN_SETXATTR flag is added.
Test to illustrate the issue is added.
The fix does not help for not NOSEC files.
Uncommenting chmod command in the test makes it to fail with eviction.
Test-Parameters: testlist=replay-dual env=ONLY=34,ONLY_REPEAT=100
Change-Id: Ie9e32d03402027f47381edddbd5cb3fb75023d59
HPE-bug-id: LUS-10989
Signed-off-by: Vladimir Saveliev <vladimir.saveliev@hpe.com>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne | RHEL 9.3/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
LU-16560 utils: add test to crosscheck lfs find and statx btimes Added test 56eab that verifies if the lfs find -printf formatted btimes (human readable and epoch) match with statx btimes. Test-Parameters: trivial Signed-off-by: Anjus George <georgea@ornl.gov> Change-Id: I9c6201f8adfa100c9462722416f5deec1db70ccc
| failed enforced test | platform | detail | |
|---|---|---|---|
| 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 |
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
(defect?) I'm not sure this is safe? If tcd_type is one value on entry, but then the in_irq() or irqs_disabled() values change, then the lock/unlock methods will be different, which may e bad? I don't know that level of the kernel well. Why is the value from cfs_trace_buf_idx_get() not correct? If the IRQ state can change from there to here, what is to prevent it changing again? Often the IRQ state changing unexpectedly is because of stack overflow clobbering the task struct, but I don't know the situation here. The preferred solution IMHO is to get tcd_type correct from the start. Failing that, if we find IRQ state has changed in the middle, then tcd_type should be updated to ensure the unlock is the same as the lock. This might cause issues if the page gets put back into a different list, but that is something I think needs to be fixed anyway, see EX-8998 for details.
I think the comment about cfs_trace_buf_idx_get() is relevant and important. Changing cfs_trace_buf_idx_get() so that if irqs_disabled(), it selects CFS_TCS_TYPE_IRQ. That should fix the problem a lot more cleanly.
LU-14282 libcfs: refine use of locks when in softirq Earlier versions of the kernel (before v4.15) output a warning if detecting a use of spin_unlock_bh while in softirq with irqs disabled. This can currently happen when generating debug messages from softirq, e.g. in kiblnd_conn_addref. Change cfs_trace locking logic to use regular spin_lock in this case. Test-Parameters: testlist=sanity Signed-off-by: Serguei Smirnov <ssmirnov@whamcloud.com> Change-Id: I3395fd26b151b14f6ba14ef6b3d39168ef70a1c5
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 crashed | RHEL 9.3 / x86_64 | ran 9 tests. 1 tests failed: sanity-lfsck. %% THIS TEST SESSION CRASHED %% | session |
This (and also below) is a little odd. If timeout is -1 - so nothing in set_requests lists, then timeout is 1. If timeout is zero - all requests have expired - them timeout is 0. It would make sense to me for those to both be the same. Could we make it " < 0 ? 0 : timeout" ??
Yes I think that should be fine.
Hmm. this seems to be a problem.
LU-15073 ptlrpc: An expired request isn't marked timedout New requests can be added to pc_set. It will receive wakups and timeout can never occur. Perform check for expired requests on each round before ptlrpcd_check(). HPE-bug-id: LUS-8784 Signed-off-by: Andriy Skulysh <c17819@cray.com> Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: I46f7ab1812601b1c3a78b62a41a578cdac568bd5
Ping, reviewers
(style) more natural abbreviation would be `priv_thresh`, or just `thresh` to fit into 89 columns below
LU-11509 ldlm: scale LFRU sample window from lru_size lfru_sample_window_size is the number of lock insertions sampled before LFRU recomputes priv_score_threshold from max_freq. It controls how the promotion gate adapts after metadata bursts without filling the priv list with one-touch locks. Previously the window was LDLM_DEFAULT_LRU_SIZE / 10 (10 * num_cpus), set only at namespace creation. On large clients the sample period was too long to promote valuable locks before they were displaced; on small clients it was too short and tending to chased transient churn. It also ignored the lru_size and was not refreshed at runtime. This patch addresses the issue by periodically recalculating the window size based on current lru size, setting it to ns_nr_unused / 10 and clamping it between 32 and 160, the promotion gate now dynamically adapts to changing workloads. Use LDLM_LFRU_PRIV_DEMOTE_THRESH (64) to avoid batch priv demotion oscillation while the cache is still filling. And a benchmark is performed, refer #62863 for the code. 30/70 hot/cold access, 800/16000 files, lru_size=2400. Both arms are LFRU; only the sample window changes. The old window is 10*ncpu (640 on 64 cores). The new window is clamp(nr_unused/10, 32, 160), i.e. based on LRU size and closer to the workload. Pin lfru_sample_window_size to 640 vs 160. Small-CPU mixed runs already show LFRU ~6% ahead of LRU. On large-CPU boxes the ncpu-based window updates too slowly and LFRU looks like LRU; sizing from LRU size keeps that lead. 16-CPU, 4 procs, 10 rounds: LRU-sized 160 cut enqueue ~4% vs ncpu-sized 640: | Test Run | ncpu-640 | Time | lru-160 | Time | Improvement | | 1 | 113401 | 116s | 107994 | 113s | 4% | | 2 | 113880 | 113s | 107608 | 112s | 5% | | 3 | 113507 | 112s | 108381 | 111s | 4% | Priv under the LRU-sized window settled near the 30% cap (~700 of 2400). sanity/124e/124f/124h, set llite.*.enable_statahead_fname=0 with the intention to disable `stat()` randomness, to reduce flakiness. Test-Parameters: testlist=sanity env=ONLY=124e,124f,ONLY_REPEAT=100 Test-Parameters: testlist=sanity env=ONLY=124g,ONLY_REPEAT=200 Test-Parameters: clientdistro=el10.1 serverdistro=el10.1 testlist=sanity env=ONLY=124g,ONLY_REPEAT=200 Signed-off-by: Keguang Xu <kxu@ddn.com> Change-Id: I2dfdca5a58c71a2d9ab9fe60795c5db60587b4ce
| unique failing test | history |
|---|---|
| sanityn@ldiskfs+DNE:test_108a | seen in 28 other reviews |
pinging for review
LU-19365 nodemap: allow dynamic IPv6 subranges
Test 72e failed because IPv6 nidmask insertion treated an identical
dynamic child range as a duplicate and returned EEXIST. The same path
also did not return an enclosing range for a true child subrange.
For dynamic large-NID ranges, select the innermost enclosing nidmask and
return it as the parent. Use the same longest-prefix rule when classifying
NIDs and preserve EEXIST for a duplicate range in the same nodemap. IPv4
CIDR nodemap handling is unchanged.
Assisted-by: Codex:5.6-Sol
Fixes: e9278b8da163 ("LU-17431 nodemap: make dynamic nodemaps hierarchical")
Test-Parameters: trivial testlist=sanity-sec env=ONLY=72e \
env=FORCE_LARGE_NID=true,LOAD_MODULES_REMOTE=true
Signed-off-by: Manish Regmi <mregmi@ddn.com>
Change-Id: I0f2ca4323492cf1700eda391e290a9e4ee9af1da
LU-19932 osc: allow killing a write waiting on an extent
A process writing to a file can block indefinitely in
osc_extent_wait() while an extent it needs is in flight to an
unresponsive server, with no way to kill it. Make that wait abortable
on the two paths that queue a page, osc_extent_find() and
osc_queue_async_io(), which hand the error back to the writer.
The wait stays uninterruptible wherever the caller goes on to flush,
discard or truncate the pages, which must not happen on top of an
incomplete drain: osc_cache_wait_range() for osc_lock_flush() and the
fsync drain, osc_cache_writeback_range(), osc_object_invalidate(), and
the truncate handshake between osc_extent_release() and
osc_cache_truncate_start(), which has to reach OES_TRUNC before
osc_extent_truncate() asserts on it. That is what LU-2779 made this
wait uninterruptible for. osc_queue_dio_pages() stays uninterruptible
for its own reason: returning early would leave its pages counted in
the DIO sync anchor.
The hang reported in LU-19932 is in that fsync drain and is not one of
the ones this makes killable. Making the drain killable would not fix
it either: the writer returns into filemap_write_and_wait_range(),
which then waits uninterruptibly in folio_wait_writeback() for the
same pages, since cl_page_make_ready() marks every page of a write RPC
PG_writeback. Measured against an OST stalled with
OBD_FAIL_OST_BRW_PAUSE_BULK, SIGKILL does not free a writer from that
second wait.
Only the second wait becomes abortable, the one entered after the
initial 600s wait has already reported the extent as stalled. An
ordinary wait for an extent that is merely still in flight must not be
cut short by a SIGALRM or a SIGINT.
An mmap store reaches osc_queue_async_io() through page_mkwrite(),
which maps an interrupted wait to VM_FAULT_SIGBUS. Use a killable
wait for mkwrite so a caught SIGTERM cannot cause an unexpected
SIGBUS. After the initial 600s timeout, fatal signals can still abort
this wait; caught signals remain pending until the wait completes.
Normal writes retain the abortable wait. This avoids introducing a
refault, which needs the kernel-mode fault case worked out: a fault
taken from inside a syscall does not dequeue the signal and would
re-execute rather than end the syscall.
Release the current page's dirty-cache reservation if the wait in
osc_queue_async_io() fails. The page has not joined the extent yet,
so RPC completion cannot release its per-OSC and global dirty-page
accounting. This also covers the existing RPC-error exit.
osc_extent_wait() returns only 0 or a negative errno. The leftover
jiffies from wait_event_idle_timeout() must not reach the callers:
osc_queue_async_io() only calls osc_extent_find() when rc is zero, and
on a non-zero rc walks the extent pointer it has just released.
Simplify ldlm_completion_ast() to only call l_wait_event_abortable()
once instead of in two separate branches to avoid code duplication.
Simplify osc_extent::oe_rc usage to only hold 0 (success) or a
negative errno. Storing the number of pages there isn't used for
anything, and it complicates its usage elsewhere.
Fixes: 26345bee6b04 ("LU-2779 osc: osc_extent_wait() shouldn't be interruptible")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Signed-off-by: Vitaliy Kuznetsov <vkuznetsov@ddn.com>
Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools
Change-Id: I140bdd6cdea3ccd985b457ee4b6bf415a542c669
(style) This isn't a bug, but the subject is 71 characters, above the ~64 the Lustre commit rules ask for. Something like "LU-20726 obdclass: validate param name in class_set_global()" (59) would fit, if the patch is refreshed.
This commit message would benefit from explaining what code uses `class_set_global()`. Is that during processing of config log parameters? It doesn't explain this in the Jira ticket either.
(style) Extra blank line in sign off block
(style) Not a bug, but now that `eq` exists this round-trip through `value` is leftover from the old code. `off = eq - param;` says "length of the name" directly, and could move up next to the declaration.
This guard closes the off == 0 case, but the prefix match itself is untouched, so a truncated name still lands on the wrong attribute. `lctl set_param -P time=10` gives off == 4 and strncmp("timeout", "time=10", 4) == 0, so `timeout` gets set; `at_=5` picks up `at_min` the same way.
That is the same failure the commit describes (zero length is just the degenerate case), and LU-20726 is titled "Fix Invalid Parameter Matching". Would a length check close it for good?
if (strlen(lustre_attrs[i]->name) == off &&
!strncmp(lustre_attrs[i]->name, param, off))
Pre-existing since a74b2b5bce71, so not a reason to block this patch - but it seems in scope for the ticket.
Seems reasonable to fix. I'm don't think that matching the first prefix is something we want to allow.
LU-20726 obdclass: reject invalid parameter names in class_set_global()
class_set_global() assumes that the input parameter contains an '='
and has a non-empty name. When the parameter starts with '=', the
calculated name length is zero, causing strncmp() to always return
a match and select the first attribute in lustre_attrs[].
Additionally, when '=' is missing, strchr() returns NULL, resulting
in invalid pointer arithmetic when calculating the value pointer.
Reject parameters without '=' or with an empty name by returning
-EINVAL.
Fixes: a74b2b5bce71 ("LU-9431 obd: resolve config log sysfs issues")
Signed-off-by: Chakshu Kansal <ckansal@ddn.com>
Change-Id: Ic3b8fe56181f66cff420facb4d1c37925b694dd7
The component tag says `utils`, but nothing in the diff is under lustre/utils/ or lnet/utils/. The bulk of the change is lustre/llite/ (the new ll_tmpfile()), plus lustre/mdt/, lustre/mdc/, lustre/lmv/ and the uapi header. Should this be `llite`? The summary also doesn't name the new symbol, so `git log --grep ll_tmpfile` won't find this later.
The body is a single line that restates the subject and marks the patch "fortestonly". There's no statement of what the patch does or why, and none of the individual changes are accounted for: the new `MDS_NNN` wire value, `LUSTRE_OPC_TMPFILE`, `vol_file_name()`, the LUSTRE_OPC_TMPFILE arms in ll_prep_md_op_data(), the -ENOTDIR relaxation in mdt_finish_open(), and the console-message changes in dcache.c / namei.c / llite_lib.c / lmv_obd.c / mdc_lib.c / mdt_open.c. As it stands a reader can't tell which hunks are intended and which are development leftovers. Could the body explain the design (why the tmpfile is created as a volatile file, why the server needs to accept O_DIRECTORY) and drop the hunks that aren't part of it? (typo) "futuree" and "fortestonly".
`Test-Parameters: trivial` doesn't fit a change that touches both the client VFS path and the MDT open path; the second line already asks for the real test, so the `trivial` line looks like it should go.
This also changes what the client puts on the wire and how mdt_finish_open() reacts to it, so interop coverage would be useful, e.g.
Test-Parameters: testlist=sanity env=ONLY=63d serverversion=2.15.5
(defect) The body is a single line and does not describe the change. Nothing here accounts for the new MDS_NNN wire enum value, the MDT-side relaxation of the O_DIRECTORY check in mdt_finish_open(), the new vol_file_name() helper, the LUSTRE_OPC_TMPFILE plumbing through ll_prep_md_op_data(), or any of the debug logging changes in dcache.c/namei.c/llite_lib.c/lmv_obd.c/mdc_lib.c/mdt_open.c. Each hunk should be explained, and the introductory paragraph should say what the patch accomplishes and why before describing how. "fortestonly" is also a typo, and it reads as a statement that this revision is not meant to land. If that is the case, marking the change WIP in Gerrit would make it clearer to reviewers.
(style) "Test-Parameters: trivial" asks for reduced test coverage, which does not fit a change that adds a new VFS method and alters an MDT-side open check; it also sits oddly next to the testlist line right below. Since the MDT behaviour changes, an interop run against an older server would be worth requesting, e.g. "Test-Parameters: testlist=sanity serverversion=2.15.6".
(style) The body is a single line that restates the subject, with "(fortestonly)" suggesting this revision is not meant to land. Several hunks are not accounted for by it: the new MDS_NNN wire enum value, the mdt_finish_open() -ENOTDIR relaxation, and the CDEBUG->CERROR conversions in dcache.c, namei.c, mdc_lib.c, lmv_obd.c and mdt_open.c. Could the message open with what the patch accomplishes and why, and explain each behaviour-changing hunk? The debug conversions in particular read as leftovers from a working tree rather than something intended for the patch.
(defect) A one-line body leaves most of the diff unaccounted for. The mdt_finish_open() -ENOTDIR relaxation, the new MDS_NNN wire enum value, the CDEBUG->CERROR conversions in ll_intent_release()/ll_intent_lock()/ll_create_it(), and the prints in lmv_locate_tgt() and mdc_*_pack() are all unexplained - are they meant to be part of this patch? An opening paragraph on what O_TMPFILE gives users and how volatile files are being reused to implement it would help, naming ll_tmpfile() and LUSTRE_OPC_TMPFILE so the change is findable by git log later. (typo) "fortestonly".
(minor) This changes what the client puts on the wire at open and adds a matching check on the MDT, so an interop run against a released server would be worth requesting, e.g. `Test-Parameters: testlist=sanity serverversion=2.17 env=ONLY=63d`. As it stands nothing exercises a new client against an older MDT.
(style) The body reads as a work-in-progress status note rather than a description of the change: it lists what is done and what is left, but never says what the patch actually does, how the existing volatile-file mechanism is being reused, or why the server side has to change. The rule of thumb is that the body describes the change against master and leaves no hunk in the diff unexplained. Nothing here accounts for the new MDS_NNN entry in enum mds_open_flags, the MDS_OPEN_VOLATILE / MDS_OPEN_DIRECTORY rewrite in ll_kernel_to_mds_open_flags(), or the relaxed -ENOTDIR check in mdt_finish_open().
(minor) `trivial` looks too weak for a patch that adds a value to an on-wire enum and changes mdt_open.c. The second line does not add coverage either - every new or modified subtest is already looped by the default review sessions. Since the server-side flag handling changes, an interop run against a released major would be worth asking for, e.g. `Test-Parameters: serverversion=2.16`.
`MDS_NNN` isn't referenced anywhere in the tree, and mds_pack_open_flags() only translates a fixed whitelist of flags, so this value never reaches the wire. Should it be dropped until the tmpfile flag is actually wired up, or given its real name now? If it stays, the rest of `enum mds_open_flags` is covered by wirecheck.c (`CHECK_VALUE_64O`) and by the generated `LASSERTF`s in lustre/utils/wiretest.c and lustre/ptlrpc/wiretest.c; this value isn't added to any of them.
(defect) MDS_NNN is never referenced anywhere in the tree, and mds_pack_open_flags() in lustre/mdc/mdc_lib.c translates a fixed whitelist of flags, so bit 020000000 is dropped and never reaches the wire. As written this adds a permanently dead value to a UAPI enum with a placeholder name. If a real MDS_TMPFILE flag is wanted later it needs mds_pack_open_flags() taught about it plus matching CHECK_VALUE_64O() in wirecheck.c and regenerated LASSERTF() in both wiretest.c copies. Until then, dropping the entry seems better than landing it. (typo) "futuree".
LU-9512 llite: O_TMPFILE support O_TMPFILE support (fortestonly) What is done till now - move to d_tmpfile - works on 4.18, 5.x and 6.x kernel What is still todo - cleanup debug statements (required until final) - Run full maloo. (Still holding back until close to final version) - AI reviews still left. Test-Parameters: trivial Test-Parameters: testlist=sanity env=ONLY=63d Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Change-Id: I74b44bf2e4cfac10fef09d32679b104e83020b36
| unique failing test | history |
|---|---|
| sanity2@ldiskfs+DNE:test_63c | seen in 4 other reviews |
(minor) The message says Data-on-MDT components are exempted because they "never support P2P DMA", but the code does the opposite: lsme_is_dom() only selects bounds = 1 and the DoM target's import is then consulted exactly like an OST's. Should this sentence be dropped or reworded to match?
(minor) The comment doesn't describe the test. lle_valid is set in lov_init_composite() from lov_pattern_supported() + lov_supported_comp_magic() + !(lsme_flags & LCME_FL_STALE); an uninstantiated component still gets lle_valid = 1. What actually keeps this loop off an uninstantiated component is lle_raid0.lo_nr staying 0 (and lle_dom.lo_dom staying NULL) because lco_init() was skipped. Worth rewording on a refresh so the next reader doesn't rely on the guarantee stated here.
(defect) lov_pattern() only masks off LOV_PATTERN_F_MASK, so this equality matches plain RAID0 alone. Overstriped components are LOV_PATTERN_RAID0|LOV_PATTERN_OVERSTRIPING, EC parity adds LOV_PATTERN_PARITY and compressed adds LOV_PATTERN_COMPRESS - all three pass lov_pattern_supported(), and lov_init_composite() gives them raid0_ops with a fully populated lle_raid0.lo_sub[]. They land in the else branch and no target inside them is ever interrogated. With the osc_io_init() check gone, a file created with `lfs setstripe -C` on a non-capable OST now extracts P2P pages and fails halfway through osc_dio_submit() with -EOPNOTSUPP, which is the partial-I/O case the patch is removing and which osc_io_init() used to catch. Would a `lov_pattern(lsme->lsme_pattern) & LOV_PATTERN_RAID0` test cover these instead?
(defect) Is ld_obd ever set on this device? lle_raid0.lo_sub[] and lle_dom.lo_dom hold lovsub objects, and lovsub_object_init() shows what their lo_dev is:
struct lovsub_device *dev = lu2lovsub_dev(obj->lo_dev);
Those lovsub devices are created by cl_type_setup(env, &ld->ld_site, &lovsub_device_type, ...) in lov_device_init()/lov_mdc_dev_init(), which never assigns ld_obd; lu_device_init() memsets the struct, and ld_obd is only set on a device that actually backs an obd_device (obd_setup() and osc_device_alloc()/mdc_device_alloc()).
So obd is NULL for every sub-object here, imp is NULL, and ci_p2pdma_unsupported is set on the first stripe of every DIO. cl_dio_pages_init() then never passes ITER_ALLOW_P2PDMA, and every P2P direct I/O takes the -EFAULT - the feature is off everywhere.
The obd lives one layer down: lu_object_next(&subobj->co_lu)->lo_dev->ld_obd is the OSC (or MDC for DoM) device, both of which do set ld_obd. lov_init_raid0() also already reaches the same target as lov_tgt(dev->ld_lov, oinfo->loi_ost_idx)->ltd_exp.
LU-20438 clio: eagerly evaluate P2P DMA capability via layout
Evaluating P2P DMA support per-stripe sequentially inside cl_io_loop via
osc_io_init() suffers from partial-IO discovery failure on heterogeneous
storage pools. Specifically, if a file's first stripe supports P2P DMA
but a subsequent stripe does not, ll_direct_IO will submit successfully,
map ZONE_DEVICE memory for the first chunk, and then fail abruptly midway
resulting in an unexpected -EFAULT and a non-atomic file state.
This patch cleanly shifts the capability interrogation from the OSC loop
up to the LOV composite initialization phase (lov_io_init_composite).
By looping through the entire layout initially (safely exempting
Data-on-MDT components which never support P2P DMA), we guarantee
ci_p2pdma_unsupported is set before cl_dio_pages_init runs on the
first slice, thereby ensuring an immediate and graceful error before
any I/O is dispatched.
Fixes: 83142c39b087 ("LU-20438 clio: Enable P2P DMA in client Direct I/O path")
Signed-off-by: Shivaji Kant <shivajikant@google.com>
Change-Id: Ic798f885fdf5767f6d97277952d5fa650b499851
| unique failing test | history |
|---|---|
| sanity-lfsck@zfs:test_18c | seen in 26 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-5 | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
(minor) The valid range now starts at 0, but at_min never actually holds 0 after this patch - class_at_min_set() treats it as a reset token and the resulting value is >= 5 (or the auto-tuned value). The lowest value at_min can be observed at is still 1. at_max.4 handles the same shape by keeping its Valid Range at at_min..3600 and describing at_max=0 separately in the DESCRIPTION, which this page already does for at_min=0.
The exact formula doesn't need to be documented in the man page.
(minor) class_update_at_min_from_clients() is defined in class_obd.c and only called from there and lprocfs_status_server.c, and it has no EXPORT_SYMBOL - so any module outside obdclass that picks it up from this header fails to load with an unknown symbol. This is the same point raised earlier about at_bounds_lock: an obdclass-internal declaration would be better placed in a new lustre/obdclass/obdclass_internal.h than in the tree-wide header. The lock was made static, but the helper took its place here.
(minor) Is losing the ability to set at_min=0 on a client-only build intended? Before this patch static_uintvalue_store() and param_set_int() both stored 0 verbatim, and obd_at_get()/obd_at_measure() treat at_min == 0 as "no lower bound on the AT estimate". Now every write path funnels through here, so 0 becomes 5 and at_min can never hold 0 again on either build. On a server that is the documented unpin behaviour, but on a client there is no auto-tuning to re-enable, so `lctl set_param at_min=0` just silently substitutes a different value than the admin asked for. at_min.4 only describes at_min=0 in the server auto-scaling context.
(minor) stack_trap unwinds LIFO, so this at_min=0 runs before the at_min=$orig_at_min registered just above it, and the last thing the test does is write a non-zero at_min - which re-pins it. mds1 is left with auto-tuning disabled for the rest of the session even though the test's intent was to restore the original (unpinned) state. Swapping the two registrations, or just registering `set_param at_min=0` after the expected_clients restore, would leave the server back where it started.
LU-12064 obdclass: auto-scale at_min based on expected clients On servers, the global at_min default can now be automatically derived from the expected_clients tunable as the number of connected clients grows, using the formula (ilog2(expected_clients+7) - 3) * 5/2, clamped to [5, 60] seconds and never exceeding at_max. The expected_clients and global at_min tunables now use module_param_cb handlers, and the sysfs at_min attribute gets a matching store callback, so both entry points validate updates and coordinate automatic tuning through shared helpers. class_expected_clients_update() gains an allow_lower flag to distinguish administrator writes from automatic updates: manual changes may both increase and decrease expected_clients, while automatic updates from tgt_update_max_clients() only increase it as the maximum observed client count grows. If at_min is written manually to a non-zero value, either via lctl set_param or through the corresponding kernel module parameter, the value is considered pinned and automatic scaling from expected_clients no longer updates it. Writing at_min=0 unpins it, immediately recalculating at_min from the current expected_clients value. The pin/unpin logic is consolidated in the class_at_min_set() helper, called from both the sysfs and module parameter write paths. Signed-off-by: Chakshu Kansal <ckansal@ddn.com> Change-Id: I5c42da4343c1ca62b2fd20f7f40e997a356e6b4f
(nit) Neither this nor nrs_tbf_key2str() writes through the key, and the ntt_str() callbacks already take a const struct nrs_tbf_key *. Worth making both take const while the signature is being changed anyway.
(minor) Can this branch ever return something different from READ_ONCE(head->th_dyn_type_mask)? When nac_count > 0 the default rule is started with tr_type_flags = nac_allowed_mask (nrs_tbf_startup()), it is linked on th_list for the whole life of the head, and nrs_type_allowed_check() forces every other rule's type to be one of the nac_types[] entries, each of which is a subset of nac_allowed_mask. So nrs_tbf_dyn_type_mask_update() always leaves th_dyn_type_mask exactly equal to nac_allowed_mask. If that is the intent, a short note saying the two are the same would help; otherwise the early return reads as if the masks can diverge.
(minor) The last sentence doesn't seem to match the caller. nrs_tbf_res_get() reaches nrs_class_rule_rematch() precisely for a bucket whose rule is out of date, and then hands the request to that same bucket:
rule = nrs_class_rule_rematch(head, req);
if (rule != cli->tc_rule)
nrs_tbf_cli_reset(head, rule, cli);
...
*resp = &cli->tc_res;
So the bucket is re-pointed at the newly matched rule and keeps serving requests rather than being left to the LRU shrinker. The part about not rehashing a linked bucket is the reason for the local key and reads fine; it is the "takes no new request" claim that looks off.
LU-20090 nrs: use allowed types for class bucket lookup
The rule list holds every rule of a class head, so a rule match
costs O(N). A policy with many rules spends too much time there.
The allowed classification types give a second path. The TBF
scheduler builds the key of a request from the allowed types and
finds the class bucket by hash. The classification then costs O(1)
for each allowed type. The default rule takes the finest grained
type, which holds every allowed type bit. Without that type the
scheduler gives a request the rate of the default rule.
An "allow=" list makes the type of the default rule the union of
every allowed type. A "change default rate=N" command then gives N
RPC/s to each live tuple of that union. The command no longer gives
N RPC/s to each NID. An administrator who tunes the default rate
must read the allowed type list first.
The key of a class bucket is also its hash key. A write to the key
of a live bucket makes the hash position stale. The removal then
fails, and the LRU shrinker frees a bucket that the table still
holds. The re-match path therefore matches into a local key.
The hash path only helps a policy with many rules. The
"tbf_dyn_rule_thresh" module parameter holds the rule count that
starts it, and the default value is 8.
A start command that fills every allowed type entry and then names a
policy type of its own returns -E2BIG. A free entry lets the command
add the type of the policy to the allowed type list. A plain rule of
that type therefore needs no "allow=" entry. That rule keeps the
behavior of a head with no "allow=" list.
The patch also makes the cleanup of test_77k, test_77kh and
test_77ki reliable.
Add sanityn/test_77t{d,f}, and the -E2BIG case in test_77tc.
Test-Parameters: trivial testlist=sanityn env=ONLY=77
Signed-off-by: Yingjin Qian <qian@ddn.com>
Assisted-by: ClaudeCode:Opus-5
Change-Id: If67f9afc6693310d17ce69c1b1c417ffccbf0b9c
Why do we need this? I don't think somebody will use that.
Please note that current TBF has UID|GID|PROJID|JobID|Opcode|NID 6 sub types in total, that means it can have 2^6 -1 = 63 combinations. In the future, we will add more sub types such as nodemap, OST index, which will increase the total combinations reach 255. Without any allowed permission, it may result that lookup from class hash table will need 64 search in worst, that maybe have negative impact on the lookup performance. Thus to reduce the lookup overhead, we limit the maximum allowed combinations with the limit of 16.
"Why do we need this? I don't think somebody will use that." The allowed-type list bounds the lookup cost of the dynamic classifier. Without it, nrs_tbf_req_classify() must probe every combination of the enabled sub types. Six sub types give 63 combinations today. The planned nodemap and OST-index types raise that to 255. The cap of 16 holds the worst-case probe count at 16 hash lookups per request.
(minor) Is a set of 16 reachable in practice? The policy argument is capped at 255 bytes (NRS_POL_ARG_MAX, enforced in nrs_policy_start_locked()), and that budget also has to carry the head type and `classify=dynamic`. The 16 shortest distinct combinations already cost 243 of those bytes; a more usual set over nid/uid/gid/jobid/opcode runs to roughly 270 and is refused with -EINVAL and "arg ... is too long" before the allow= parser sees it. If the patch is refreshed, saying that the byte budget is the practical ceiling would make this match what an admin can actually configure. Small wording while here: "is defined with 16" reads as "is defined as 16", and "most of real use cases" as "most real use cases".
(style) This isn't a bug, but the message doesn't say which service refused the rule, and an OSS or MDS runs TBF on several of them. __nrs_tbf_cli_debug() in this file already prints "%s.%d NRS: ..." from nrs_pol2svc(pol)->srv_name and nrs_pol2cptid(pol), and policy is in hand here. Worth matching if the patch is refreshed.
LU-20090 nrs: add allowed dynamic classification types for TBF
Add allowed dynamic classification types for NRS TBF scheduler.
It is set during the TBF startup. i.e.
lctl set_param \
nrs_policies="tbf nid classify=dynamic allow=nid allow=nid+opcode"
The allowed dynamic classification types can be shown by:
lctl get_param -n ost.OSS.ost_io.nrs_tbf_allowed_types
The allowed types are sorted in descending order of the type
granularity. The admission test of a rule compares the type of the
rule against each allowed type for exact equality. The test reads no
order and no prefix. A rule of type "nid" therefore needs an
"allow=nid" entry of its own, even under "allow=nid+opcode". The sort
order serves the later class bucket lookup patch.
The function nrs_tbf_parse_cmd() now gives the error code of the
parser to the caller. The function does not force -EINVAL. A bad
"allow=" value then keeps its own error code.
The type to string helper now has a reentrant form that takes a
buffer. The new error message reaches an administrator, so it uses
that form. The per-CPU buffer stays for the debug logs.
Add a test case sanityn/77tc to verify that only rules with
allowed classification types can be added.
Test-Parameters: trivial testlist=sanityn env=ONLY=77
Signed-off-by: Yingjin Qian <qian@ddn.com>
Assisted-by: ClaudeCode:Opus-5
Change-Id: Ia2705a64f1347485da4159268c8925c20eedcdd6
(minor) One more behaviour-changing hunk isn't covered here: nrs_tbf_startup() now seeds the default rule with `rs_valid_type = head->th_type_flag & NRS_TBF_FLAG_VALID`. That is what decides the granularity of traffic no user rule matches (and what test_77tB exercises), so a sentence on it would round the paragraph out.
(minor) This guard looks carried over from nrs_tbf_cli2str_r(), where skipping a type with no key printer makes sense. Here only ntt_name is printed, so whether the type has an ntt_str callback has no bearing on the output. Every entry in nrs_tbf_types[] sets ntt_str today, so nothing is lost right now. But a field added later without a key printer would silently drop out of the `type=` string, and a rule made only of such fields would dump as `type=`. Would dropping the check be simpler?
(suggestion) Now that the classify key is passed in, could the static branch use it too, the way the dynamic branch two lines above does?
memcpy(&cli->tc_key, key, sizeof(cli->tc_key));
rule = nrs_tbf_rule_match(head, &cli->tc_key);
nrs_tbf_req_classify() already built this exact key with the same head->th_type_flag mask for the nrs_tbf_cli_find() lookup. For a uid/gid/projid policy the rebuild re-runs nrs_tbf_id_cli_set(), including the req_capsule_init()/req_capsule_extend() fallback that re-parses the request body, on every class-bucket miss. It would also make `req` unused here.
The comment on the dynamic branch argues a second build can produce a different key; if that is a concern it applies to the static head as well, where a differing key would mean the class is inserted under a key that the lookup will never find.
(minor) nrs_class_def_rate doesn't exist anywhere in the tree at this commit, so the second sentence reads as a forward reference to a later patch in the chain. Could the comment just say what tbf_rate is here (the ptlrpc module parameter that seeds the default rule's rate) and leave the series out of it?
(style) Not a bug, but test_77tB() and test_77tb() both put the version gate on the first line of the body while this one sits below six `local` declarations, one of which shells out to osts_nodes(). If the patch is refreshed, moving the gate to the top would match the other two and the rest of the suite.
LU-20090 nrs: add dynamic granularity classifier for TBF
The NRS TBF scheduler uses a static classifier. The policy start
command sets the classifier type, and the type holds until the
policy stops. A rule of another classifier type cannot start.
The dynamic granularity classifier lets the type change for each
rule. The scheduler derives the class type of a rule from the match
conditions of that rule. A dynamic rule can use any classification
field, and the policy does not need to classify on that field first.
The rule dump adds a "type=" field, so a user can read the derived
type.
The head keeps a mask of the types of the live rules. The key of a
dynamic head holds only the fields in that mask.
The rule command now saves the valid type of the command. One head
then does not leak its type into the command of the other head.
The function nrs_tbf_id_cli_set() now zeros each ID field that the
rule does not match. That zeroing also fixes the static classifier.
A "uid" policy reads the uid and the gid of a request, and the key
held both. One uid under two gids then got two class buckets, and
each bucket enforced the whole rule rate. A "gid" policy had the
same defect through the uid.
The rule stop path now takes th_rule_lock around the list removal.
The removal ran with no lock against the list walks of
nrs_tbf_rule_match() and nrs_tbf_rule_dump_all().
Add sanityn/test_77t{B,h,b}.
Fixes: 3408489c96ba ("LU-20090 nrs: use fixed size key for NRS TBF class bucket")
Test-Parameters: trivial testlist=sanityn env=ONLY=77
Signed-off-by: Yingjin Qian <qian@ddn.com>
Assisted-by: ClaudeCode:Opus-5
Change-Id: Ie817ea1f714c0e087eb25ec72d1477cd5e2948e2
Hi Yingjin, I spent the day reviewing this patch set (LU-20090). A few questions: Do we really need dynamic? I get that static has a limitation it can't work around, but is it really worth it? Also, about performance: the code already falls back to a simple linear rule match when there are few rules (nrs_dynamic_class_rule_match, default threshold 8). The whole hash-lookup-first path, and the rule sequence numbers added in this patch, only kick in for hundreds or thousands of rules. I don't think that's realistic; no admin is going to add that many rules by hand. If we assume the rule count is always small, the simple linear match is enough and we could drop the complex path (and this patch) entirely. (And even that "optimized" path still walks the rule list in nrs_tbf_rule_match_seq, so it isn't really O(1) anyway.)
The reason why we need dynamic is about the TBF type granluarity. i.e. If TBF type is "nid", then each client has a 1 corresponding class bucket. But if TBF type is "nid+uid+gid+projid+opcode", then a client may have (2^5 - 1 = 31) class buckets. When the cluster has a large number of nodes (more than 1000), the total class buckets will reach 1000 So that's the reason why we need the dynamic classification. Please note in the cluster product cluster it already configured with thousands of rules for the TBF scheduler.
Thanks for you reviewing!
"even that 'optimized' path still walks the rule list in nrs_tbf_rule_match_seq, so it isn't really O(1) anyway" Correct. The number of rules newer than the matched class bucket's rule bounds the walk, not the total rule count. The hash lookup replaces a full list scan on every request. The per-type rule lists in 66704 bound the walk further. "If we assume the rule count is always small, the simple linear match is enough" The rule count is not always small. Some sites already run thousands of TBF rules. The dynamic classifier also multiplies the bucket count: a nid+uid+gid+projid+opcode type gives up to 31 buckets per client. A 1000-node cluster then reaches tens of thousands of buckets.
LU-20090 nrs: add static and dynamic classify conf for TBF Add a static classify setting and a dynamic classify setting to the TBF policy. Under the static strategy, every rule takes the global classification type of the policy. Under the dynamic strategy, the scheduler takes the class type of a rule from the conditions of that rule. The dynamic classifier itself arrives in a later patch. The administrator sets the strategy at policy start. The strategy does not change at run time: # lctl set_param \ ost.OSS.ost_io.nrs_policies="tbf nid+opcode classify=dynamic" # lctl set_param \ ost.OSS.ost_create.nrs_policies="tbf uid classify=static" # lctl get_param ost.OSS.ost_io.nrs_tbf_classify reg_classify:dynamic hp_classify:dynamic # lctl get_param ost.OSS.ost_create.nrs_tbf_classify ost.OSS.ost_create.nrs_tbf_classify=reg_classify:static A start command now carries the classify key. The maximum length of a policy argument therefore grows from 16 bytes to 256 bytes. The command structures lose the TBF prefix. Later patches share them with a second policy. "struct nrs_tbf_cmd" becomes "struct nrs_cmd". The field prefixes "tc_" and "ts_" become "nc_" and "rs_". The patch also repairs the 77k cleanup paths. A plain EXIT trap and an undefined trap variable let TBF rules survive into the next test. The helpers now register with stack_trap, and they tolerate a rule stop under the fifo policy. Add sanityn/test_77ta. Test-Parameters: trivial Test-Parameters: testlist=sanityn env=ONLY=77 Signed-off-by: Yingjin Qian <qian@ddn.com> Change-Id: Ia6d4ebc8705e67421b60eabc5cea54f1de23952a
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-5 crashed | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% | session |
LU-20676 llite: hash qstr in ll_iget_for_nfs()
QSTR_INIT() only sets .name and .len, so the ".lustre" and "fid" qstrs
used by ll_iget_for_nfs() have hash 0, and d_lookup() never matches
the VFS dentry. Then, every open_by_handle_at()/NFS decode of
LU_DOT_LUSTRE_FID or LU_OBF_FID d_add()s a fresh alias hashed under
bucket 0 that no path lookup can find.
To fix this issue, use try_lookup_noperm() instead of the open-coded
hash 0 qstr + d_lookup(). Once the hash is correct, it can return a
cached negative dentry that path lookup created, so drop it to match
a cache miss. On a fileset mount, it can also return a positive dentry
for a user-created ".lustre" directory, so verify the FID of a cached
positive dentry against LU_DOT_LUSTRE_FID and drop it if it doesn't
match. Also mark the FID-instantiated dentries valid with
d_lustre_revalidate() after d_add(), but only on a real filesystem
root mount; on a fileset/subdirectory mount, a valid cached .lustre
alias would let any user reach any FID via $MNT/.lustre/fid/[FID],
bypassing the subtree restriction.
Finally, extend llapi_fid_test test31 to open .lustre and .lustre/fid
via the VFS before decoding LU_OBF_FID, so the cache-hit branch in
ll_iget_for_nfs() is exercised by sanity.sh test_154g.
Test-Parameters: testlist=sanity env=ONLY=154g
Fixes: 52a97b4490 ("LU-8585 llite: add special fid handling for fhandle API")
Signed-off-by: Emoly Liu <emoly@whamcloud.com>
Change-Id: I8bdee04d321d8a13916b839814c4435833ee620a
LNET_SELFTEST_GENL_VERSION should match the LST_FEATS_MASK? I do agree this change makes sense since the features only matter for the initial session setup.
I don't see why we need or would want to tie the two together. The interface version should be free to move independent of new feature bits. The clean fix is to send the features as an explicit attribute of the session request and reply. That change also lets lst show the feature mask of the console. It needs a kernel-side attribute and a compatibility path, so I prefer to do it in a separate patch.
The reason for querying the session_features returned was to handle the case of a newer lst being used against a older kernel that lacks a request feature. How will lst know if the kernel doesn't support a feature?
The read never gave lst that information. The reply carries the Netlink family version, and not the features. The console builds the reply with `genlmsg_put(msg, ..., &lst_family, ...)`. That call stamps `hdr->version` with `lst_family.version`, which is `LNET_SELFTEST_GENL_VERSION`. The value is `0x1` for every reply, and it does not depend on the request. `yaml_parser_get_reader_proto_version()` returns that field. Thus the old code set `session_features` to 1 after each `new_session`, whatever the user asked for. lst learns of a console that lacks a feature from the error. A mask with an unknown bit fails in `lstcon_session_new()` with `-EINVAL`. lst prints "new session creation failed". The ioctl fallback in `jt_lst_new_session()` sends the same mask in `lstio_ses_feats` and gets the same `-EINVAL`. The console creates no session. Therefore lst cannot run a test with a feature that the console does not know. lst learns of a test node that lacks a feature at `lst add_group`. The `add_group` path is unchanged. `LSTIO_NODES_ADD` returns the negotiated mask in `lstio_grp_featp`. The console gets that mask from the `mksn` replies in `lstcon_sesnew_stat_reply()`. lst then prints the "compatible mode" warning. For `EPROTO` it prints the message that asks the user to set `LST_FEATURES.` A session downgrade over Netlink needs a features attribute in the reply. I can add one in a follow-on patch if you prefer a downgrade to an error.
LU-20513 selftest: page-size agnostic simple check
The LST_BRW_CHECK_SIMPLE pattern writes the magic value at the first
and at the last __u64 of each page of the bulk buffer. The two nodes
of a test can have different page sizes. Then they do not agree on
the marked offsets, and the node with the smaller page size reports
bulk data corruption.
For example, a 1MiB transfer from a node with 64KiB pages to a node
with 4KiB pages. The sender writes the magic value at offset 0 and at
offset 65528 of each 64KiB page. The receiver looks for the magic
value at offset 4088 of the buffer, and does not find it. Every such
transfer fails.
Put the markers at a fixed stride in the bulk buffer, and not at page
boundaries. The stride is 4096 bytes, which is the smallest supported
page size. Thus each page of each node gets at least one marker. Put
another marker at the end of the buffer to detect a short transfer.
All the offsets are relative to the buffer. Thus the two nodes agree
on them for all page sizes.
This also makes the markers agree when the two nodes use a different
start offset in the bulk buffer.
The marker positions are visible on the wire. Thus add the session
feature LST_FEAT_BULK_STRIDE, and keep the former positions when the
session does not have this feature. A test node that does not know
the feature rejects the session in sfw_make_session(). The user sees
this at lst add_group, which tells the user to select the features
with the LST_FEATURES environment variable.
The console takes the version of a Netlink session request as the
feature mask of the new session. But lst sent the version of the
Netlink interface. Thus the session got the features LST_FEAT_BULK_LEN
only, and LST_FEATURES had no effect. Send the selected features, and
keep them when the console accepts the request. The reply carries the
version of the Netlink interface, and not the features.
The LST_BRW_CHECK_NONE and LST_BRW_CHECK_FULL patterns do not change.
Extend lnet-selftest.sh to validate check=none/simple/full
Assisted-by: Claude:claude-opus-5
Fixes: fe651f6b21a4 ("LU-521 lnet: make LST support variable page size")
Test-Parameters: trivial
Test-Parameters: clientdistro=rocky9.5 clientarch=aarch64 serverarch=x86_64 testlist=lnet-selftest
Signed-off-by: Chris Horn <chorn@ddn.com>
Change-Id: I27be7f5c0bfe3787a491c6d75aef762b5db498fd
LU-17044 ptlrpc: add TBF minrate floor scheduling The TBF rule model can currently express only one rate. Normal rules treat rate as a ceiling and realtime rules treat it as both floor and ceiling, so one rule cannot say "guarantee G RPC/s but cap at L RPC/s". That makes it impossible to reserve RPC bandwidth for a loaded class without either removing the cap or moving the class onto a dedicated realtime rule. Extend the existing heap-based scheduler with a second token bucket per class for minimum-rate accounting. The existing bucket continues to enforce the configured rate ceiling, while the new bucket tracks saved minrate credit for classes that are falling behind their guaranteed share. That floor credit boosts heap priority; the ceiling is enforced separately at dequeue, so a floor-prioritized class still throttles to its rate. Floor credit is bounded so that an idle class can recover its guaranteed share after becoming active under load without accumulating enough priority to starve other traffic. Add a tbf_mindepth parameter (default -1, meaning adaptive) that controls the maximum number of saved guaranteed tokens for any rule with a floor (explicit minrate or legacy realtime). The adaptive default is 8x the floor rate for realtime rules and 2x the floor rate for non-realtime rules. For legacy realtime, the floor rate is the configured rate itself. Operators can override this to a fixed value to tune how much priority an idle class accumulates before re-entering the scheduler under load. Add an explicit minrate= parameter to TBF rules and thread it through the parser, rule update paths, and rule dumps. start and change commands can now configure both floor and ceiling, change ... minrate=0 clears an explicit floor, and get_param shows the effective range as "min-max". Reject invalid combinations where the floor exceeds the ceiling. Because the rule model is shared, the new parameter works across the existing TBF rule types. Two issues found during testing/review and are fixed here: - nrs_tbf_cli_reset_value() updated to set ti_deadline = now so that a rate or rule change does not leave a stale past deadline that would give the reset client an unfair heap advantage over other eligible clients. - ptlrpc_nrs_req_throttling_nolock() adjusted so that when a policy is stopping or inactive during a runtime policy switch, its throttle gate does not prevent queued requests from draining. Without this, a policy change can stall the service partition until the old policy finishes stopping, because the throttle flag was set globally and checked without regard to which policy owns the queued work. Three new sanityn tests cover the minrate= parameter. 77t and 77u check parsing, start/change, input validation, etc. 77v is a live functional test: - Throttle OST to known max rate via OBD_FAIL_PTLRPC_PAUSE_REQ. - Measure baseline rate under congestion. - Set minrate TBF rule for secondary UID running under load. - Assert protected UID hits within 10% of its floor while background load still gets headroom. - Repeat with realtime=1 to cover realtime-minrate interaction. - Repeat with legacy realtime rule (no explicit minrate) Heap comparison and dequeue changes: The single scheduler heap now uses a two-tier comparison. When either class being compared has accumulated floor tokens, both are ranked by their min-bucket deadlines; otherwise they are ranked by max-bucket (ceiling) deadlines. This asymmetry is the mechanism by which floor credit boosts scheduling priority while keeping floor-ineligible classes on the normal ceiling path. The comparator adds two strict tiebreakers beyond deadline and check_time -- head request sequence number and pointer address -- so that classes with equal refreshed deadlines cannot oscillate indefinitely (resolving a pre-existing TODO in the old comparator). The dequeue path (nrs_tbf_req_get) takes a single frozen ktime_get() snapshot and runs a retry loop bounded by min(binheap_size + 1, NRS_TBF_REFRESH_MAX_PASSES) to lazily refresh stale per-class token state before selecting the heap root. NRS_TBF_REFRESH_MAX_PASSES is a small constant (currently 32). If the loop exhausts its pass budget without converging, it arms the throttle timer at the current root's deadline and returns NULL, deferring to the next dequeue. This replaces the old recursive self-call that realtime mode used when a refreshed class moved off the root. Per-dequeue cost is O(log n) in the common case, hard-capped at O(NRS_TBF_REFRESH_MAX_PASSES * log n) in the worst case. Floor bucket initialization: Both legacy realtime rules (without minrate=) and explicit minrate rules cap saved floor credit at tr_min_depth (the adaptive nrs_tbf_min_depth value, or tbf_mindepth when set). Sizing the cap from the floor rate, rather than from tr_max_depth, gives a class enough room to accumulate overdue token credit when it has been losing the heap to another class with older queued requests, so the realtime deadline-in-the-past mechanism can actually pull it back to the front. Legacy realtime rules additionally start with a small preloaded floor bucket (ti_ntoken = tr_max_depth) to preserve existing behavior where rate acts as both floor and ceiling. Explicit minrate rules start with zero floor tokens because the heap comparator treats any non-zero floor token count as a priority signal: when either class in a comparison has floor tokens, both are ranked on their min-bucket deadlines. If a newly created minrate class started with preloaded floor tokens it would immediately jump ahead of all non-floor traffic in the heap without having actually fallen behind its guaranteed share. Starting empty ensures that floor priority is only earned while a class is genuinely being underserved. Realtime flag interaction with explicit minrate: When a rule combines realtime=1 with minrate=, the max (ceiling) bucket loses realtime token semantics and operates as a normal capped bucket: its deadline advances forward by one token interval after each service. Only the min (floor) bucket retains realtime scheduling, where overdue saved tokens keep its deadline in the past to prioritize catching up. This means "realtime applies to the lower bound and rate remains the hard cap." Test-Parameters: trivial Test-Parameters: testlist=sanityn,conf-sanity Test-Parameters: testlist=sanityn env=ONLY=77v,ONLY_REPEAT=30 Signed-off-by: Chris Horn <chris.horn@hpe.com> Change-Id: I779e63cd84b7a9ca99b54bbe8df8616de77fc770
(style) can this fit on previous line?
LU-20078 osc: call osc_extent_tree_dump() without object lock held
The panic of next_extent() in osc_extent_tree_dump() is caused by:
- osc_extent_tree_dump() walks the extent rbtree without holding
object lock: osc_object_lock().
- LU-19014 added a new debug call to osc_extent_tree_dump() in
osc_cache_writeback_range() for the IO_PRIO_DIRTY_EXCEEDED path.
- next_extent() assumes the passed exctent is still in the tree
and asserts on RB_EMPTY_NODE(); This is reasonable for normal
tree walkers under the object lock, but unsafe for an unlocked
debug dump.
Fix it by removing osc_extent_tree_dump() added by LU-19014.
Also fix similar osc_extent_tree_dump() call in osc_enter_cache()
by holding the object lock around it.
Fixes: c413d2ede5 ("LU-19014 memcg: fix client hang in balance_dirty_page()")
Signed-off-by: Yingjin Qian <qian@ddn.com>
Change-Id: I7802d951f1c01d92a9240e7b4d395104b52c8969
(minor) The body mentions the test_74 -> test_74a rename, but not that the `MDS1_VERSION < 2.4.93` skip is dropped at the same time. Worth a few words so the hunk isn't a surprise.
(minor) The body covers the locking rework, but not two behavior changes that come with it in ldlm_flock_deadlock(): the nid the final owner/nid comparison uses, and the new exp_flock_hash NULL guard on the co-nid exports. Both change when a client sees -EDEADLK, so a sentence each would help.
(minor) Sitting next to cfs_hash_for_each_cb_t these read as generic walk-control values, but the two iterators do not agree on what a non-zero return means. cfs_hash_for_each_tight() does `goto out` and really stops. cfs_hash_for_each_key() only does `break` on the inner `hlist_for_each`, and cfs_hash_for_each_bd() then continues into bds[1], which is a live bucket while a rehash is in flight. ldlm_flock_lookup_lock_cb() stays correct only because of its own flcb_found re-entry guard at the top. Could a short comment here say which iterators honour STOP, or could cfs_hash_for_each_key() be made to leave both buckets? CFS_HASH_WALK_CONTINUE has no users anywhere in the tree.
(minor) This busy-waits with res->lr_lock held and preemption disabled - ldlm_process_flock_lock() runs under lock_res_and_lock(), and lock_res() is a plain spin_lock(). It also sits inside the unbounded `while (1)` chain walk, so the total spin is hops * fail_val ms. sanityn/74b uses fail_val=100, which is harmless for the 2-3 hop chain it builds, but a long wait-for chain or a larger fail_val would hold lr_lock long enough to trip the soft-lockup watchdog. Would CFS_FAIL_ONCE, or pausing only on the first hop, still give the test the window it needs?
Since this subtest is being modified and subject to review-dne-subtest-change testing anyway, please fix this version check to use `((... >= ...)) ||` and use the full `git describe` hash for the relevant change. Or maybe 2.5 is old enough that the version check can just be removed, since we don't really need interop testing before 2.10 anymore (even that is unlikely).
This should describe why the test is being skipped.
(minor) describe why this version is needed
The tree is at 2.17.54 right now, so a server built with this patch will report 2.17.54 or 2.17.55 and this gate will skip test_74b on exactly the first builds that carry the fix. Should this be 2.17.55?
(minor) If the MDS is remote and dsh is unavailable, this do_nodes fails silently and the test still runs the flocks_test 4 loop to completion without any fault injection, i.e. it passes without exercising the race. Other tests in this suite guard with `remote_mds_nodsh && skip "remote MDS with nodsh"`; checking the return here would also work.
(style) The convention is to name the fault-injection point above the set_param, so a reader doesn't have to look up the hex:
#define OBD_FAIL_LDLM_FLOCK_DEADLOCK_PAUSE 0x330
(minor) Nothing kills these two churn loops if the test aborts early. `error()` in test-framework.sh does report_error() then exit 1, so a failing `flocks_test 4` skips the `wait $pid1 $pid2` below and both subshells keep spawning `flocks_test 6` on $DIR2 until churn_end, up to ~50s into the following subtests and the suite's $MOUNT2 cleanup.
The rest of the suite registers the kill, e.g. sanityn.sh:1234:
stack_trap "kill $pid 2> /dev/null" ERR
Something like `stack_trap "kill $pid1 $pid2 2>/dev/null || true"` after pid2 is set would cover it.
LU-20516 ldlm: fix flock deadlock-detection state races
The deadlock-detection walk finds the blocked lock of the next
owner in the chain with cfs_hash_lookup(), which drops the
flock-hash bucket lock before returning, and only then reads
blocking_owner and blocking_export of the found lock. Those
fields are rewritten by ldlm_flock_blocking_link()/unlink() under
the resource lock of the request lock, which the walk does not
hold. A racing relink corrupts the walk in two ways: it
overwrites blocking_export between the walk's hs_get and hs_put,
which both read the live field, so one export leaks a reference
and another is put while still in use; and its
atomic_set(blocking_refs, 0) discards the reference the walk
still holds, so the walk's put later reaches zero and clears the
blocking state of the meanwhile re-hashed lock.
Instead of taking the found lock out of the hash, read it in
place: replace cfs_hash_lookup() with cfs_hash_for_each_key(),
whose callback runs under the bucket lock, and there snapshot
blocking_owner and the blocking export's NID. The walk carries
only those values from hop to hop and holds no lock or export
references at all. Since cfs_hash_add()/del() take the same
bucket lock, the blocking state is now written only while the
lock is unhashed: link sets it (taking a blocking_export
reference) before cfs_hash_add() and unlink clears it (dropping
the reference) after cfs_hash_del(). blocking_refs and the
export refcounting in the hs_get/hs_put callbacks become
unnecessary and are removed. Two behavior notes: the final
cycle check now compares the owner and NID of the same hop (it
paired the advanced owner with the previous hop's NID before),
and exports without a flock hash are skipped in the walk.
Add OBD_FAIL_LDLM_FLOCK_DEADLOCK_PAUSE, pausing the walk between
hops while it holds only the snapshotted values, and sanityn
test_74b racing deadlock detection against blocking-state
relinks; with the pause the race crashes servers without this
fix within seconds (test_74 is renamed to test_74a).
Assisted-by: ClaudeCode:Fable-5
Test-Parameters: testlist=sanityn env=ONLY=74b,ONLY_REPEAT=5
Fixes: 2c7a41a5c595 ("LU-1157 ldlm: replace waiting flock lists by hashes")
Signed-off-by: Sohei Koyama <skoyama@ddn.com>
Signed-off-by: Yang Sheng <ys@whamcloud.com>
Change-Id: If5ad3aba7b2276394b3b06bde62a80c46fa3f431
(suggestion) This isn't a bug, but it is the only place in the tree that shadows a kernel symbol name with a macro, and it leaks well beyond llite: osd_internal.h pulls this header in, so every osd-ldiskfs object gets the rename too. The existing pattern in lustre_compat/linux/fs.h is to give the fallback inline the kernel's own name inside the #ifndef, e.g. d_make_persistent(). Naming this one security_inode_listsecurity() directly and dropping the #define would keep call sites reading naturally while removing the macro entirely. Alternatively the file's other convention works too: compat_security_file_alloc()/compat_security_file_free() are called by their compat_ names at the call sites rather than being aliased.
(style) The lustre_compat include lands between linux/types.h and linux/xattr.h, which splits the kernel include group. Elsewhere in llite the lustre_compat/ headers come after the linux/ block (see file.c, which keeps linux/* together and then lists lustre_compat/linux/uio.h and lustre_compat/linux/dcache.h).
LU-20434 build: Compatibility updates for kernel v7.2 Linux commit v7.1-rc1-1-gf71ece9712b7 security,fs,nfs,net: update security_inode_listsecurity() interface security_inode_listsecurity() now updates the buffer pointer and remaining size in place and returns 0 or -errno instead of the copied length. Use the new calling convention in llite and provide a compat wrapper for older kernels. Test-Parameters: trivial Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: I46fb6f3a768f7f5b2fffe67dfcca0c186a6a6964
LU-19634 kernel: update SLES15 SP6 [6.4.0-150600.23.78.1] Update SLES15 SP6 kernel to 6.4.0-150600.23.78.1 for Lustre client. Lustre-change: https://review.whamcloud.com/62719 Lustre-commit: fe51801d4497fc1b5dafebf8608601e3fd526284 Test-Parameters: trivial fstype=ldiskfs mdtcount=4 mdscount=2 \ clientdistro=sles15sp6 serverdistro=el8.10 testlist=sanity Test-Parameters: optional fstype=ldiskfs mdtcount=4 mdscount=2 \ clientdistro=sles15sp6 serverdistro=el8.10 testgroup=full-dne-part-1 Test-Parameters: optional fstype=ldiskfs mdtcount=4 mdscount=2 \ clientdistro=sles15sp6 serverdistro=el8.10 testgroup=full-dne-part-2 Test-Parameters: optional fstype=ldiskfs mdtcount=4 mdscount=2 \ clientdistro=sles15sp6 serverdistro=el8.10 testgroup=full-dne-part-3 Change-Id: Idde44055208a61519185fd38341c53dd9a4dfec4 Signed-off-by: Jian Yu <yujian@whamcloud.com>
LU-20266 kernel: update RHEL 9.7 [5.14.0-611.55.1.el9_7] Update RHEL 9.7 kernel to 5.14.0-611.55.1.el9_7 for Lustre client. Lustre-change: https://review.whamcloud.com/65920 Lustre-commit: TBD (from 17408dda24eb80820252d868003ae5c5c97b0782) Test-Parameters: trivial fstype=ldiskfs mdtcount=4 mdscount=2 \ clientdistro=el9.7 serverdistro=el8.10 testlist=sanity Test-Parameters: optional fstype=ldiskfs mdtcount=4 mdscount=2 \ clientdistro=el9.7 serverdistro=el8.10 testgroup=full-dne-part-1 Test-Parameters: optional fstype=ldiskfs mdtcount=4 mdscount=2 \ clientdistro=el9.7 serverdistro=el8.10 testgroup=full-dne-part-2 Test-Parameters: optional fstype=ldiskfs mdtcount=4 mdscount=2 \ clientdistro=el9.7 serverdistro=el8.10 testgroup=full-dne-part-3 Change-Id: I463660fa411189bbf3f8e9395b496e5d406bf22f Signed-off-by: Jian Yu <yujian@whamcloud.com>
LU-20330 kernel: update RHEL 8.10 [4.18.0-553.129.1.el8_10] Update RHEL 8.10 kernel to 4.18.0-553.129.1.el8_10. Lustre-change: https://review.whamcloud.com/66460 Lustre-commit: TBD (from ddca7c1f47b49e5c9be1d195e8923aca07f16f6d) Test-Parameters: trivial fstype=ldiskfs mdtcount=4 mdscount=2 \ clientdistro=el8.10 serverdistro=el8.10 testlist=sanity Test-Parameters: optional fstype=zfs mdtcount=4 mdscount=2 \ clientdistro=el8.10 serverdistro=el8.10 testlist=sanity Test-Parameters: optional fstype=ldiskfs mdtcount=4 mdscount=2 \ clientdistro=el8.10 serverdistro=el8.10 testgroup=full-dne-part-1 Test-Parameters: optional fstype=ldiskfs mdtcount=4 mdscount=2 \ clientdistro=el8.10 serverdistro=el8.10 testgroup=full-dne-part-2 Test-Parameters: optional fstype=ldiskfs mdtcount=4 mdscount=2 \ clientdistro=el8.10 serverdistro=el8.10 testgroup=full-dne-part-3 Test-Parameters: optional fstype=zfs mdtcount=4 mdscount=2 \ clientdistro=el8.10 serverdistro=el8.10 testgroup=full-dne-zfs-part-1 Test-Parameters: optional fstype=zfs mdtcount=4 mdscount=2 \ clientdistro=el8.10 serverdistro=el8.10 testgroup=full-dne-zfs-part-2 Test-Parameters: optional fstype=zfs mdtcount=4 mdscount=2 \ clientdistro=el8.10 serverdistro=el8.10 testgroup=full-dne-zfs-part-3 Change-Id: I38c6acb97e29d4ec21336d1f904f3349af640992 Signed-off-by: Jian Yu <yujian@whamcloud.com>
| unique failing test | history |
|---|---|
| replay-single1@ldiskfs+DNE:test_80c | seen in 5 other reviews |
LU-20465 utils: replace random() with getrandom() Replace random() with getrandom() to avoid the need to seed it first. For that purpose, add cfs_random() to libcfs/util/string.h, a static inline wrapper that returns a random 32-bit value and cannot fail. Values from cfs_random() are suitable for unique file names and group lock ids, but must not be used for cryptographic purposes. Signed-off-by: Sebastien Buisson <sbuisson@ddn.com> Change-Id: I6ca164a89a3ef5e9c4e9f55d8a98dc2c1581d798
(typo) Joining the first two fragments here leaves the old double space at the next split point, so the message still prints "dir = %lu/%u, name = ..." with two spaces. Dropping the leading space from the following " name = " fragment would fix it, the same way the "i %u,start_blocks" case in osd_io.c was handled earlier in this series.
(typo) "furtuer" -> "future", while this comment is being re-indented anyway. It is the only occurrence left in the tree.
LU-20310 osd-ldiskfs: fix remaining checkpatch.pl warnings ... via checkpatch.pl --fix-inplace. Test-Parameters: trivial Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: I003e53c209e56f571f475e9e93081c14f39ce098
(minor) This is pre-existing and not something the patch introduced, but the loop indexes with `i` while the body always writes element 0, so only `cs_pages_state[0]` is ever reset:
for (i = 0; i < ARRAY_SIZE(s->cs_pages_state); ++i)
atomic_set(&s->cs_pages_state[0], 0);
It is harmless today because both callers (vvp_device_alloc() and echo_site_init()) get a zeroed struct, so the remaining counters are already 0. Since the loop line is being touched here anyway, `[i]` could be fixed in passing, or split out if this patch should stay purely cosmetic.
(style) Not a bug, but the reflow left `cur_offset` dangling on a line of its own. It fits on the next continuation line with the rest of the arguments:
CDEBUG(D_OTHER, "cur_offset %llu, chunk_offset %llu, buf_offset %u, rc = %d\n",
cur_offset, (__u64)chunk_offset, buf_offset, rc);
LU-20310 obdclass: fix remaining checkpatch.pl warnings (1/2) ... via checkpatch.pl --fix-inplace. Covers files cl_io.c through llog_swab.c. Test-Parameters: trivial Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: I792054b46986669d7324c61a424f21b61b5f90be
| unique failing test | history |
|---|---|
| sanity2@ldiskfs+DNE:test_63c | seen in 1 other review |
| sanity3@zfs:test_907 | seen in 51 other reviews |
(suggestion) get_fe_device() was the only decoder for the low 17 bits of fe_device. The client writes that field with set_fe_device_stripenr() in lov_object.c and a userspace caller reads it back after asking for FIEMAP_FLAG_DEVICE_ORDER, so the reader was always expected to live outside this tree. get_fe_stripenr() survives only because lov_object.c happens to reuse it for its own resume logic. After this, an installed-header user can still get the stripe number but has to open-code `fe->fe_device & 0x1ffff` for the OST index. Worth keeping the pair together?
This now becomes a design question vs Test-Parameters: trivial. -1 (not blocking the patch) to be on safe side considering James + AI comment. If this is to be removed, i will very quickly change it. Otherwise LGTM.
(minor) Not a bug, but lmv_is_restriping() in lustre/include/lustre_lmv.h open-codes exactly this:
return lmv_hash_is_splitting(cpu_to_le32(lmv->lmv_hash_type)) ||
lmv_hash_is_merging(cpu_to_le32(lmv->lmv_hash_type));
It even converts lmv_hash_type twice. Switching that caller over to lmv_hash_is_restriping() may be a better outcome than deleting the helper, and it mirrors how lmv_hash_is_layout_changing() is kept.
(suggestion) Same shape as the fe_device case. hsm_set_cl_event() is called only from mdd/mdt, and nothing in the tree ever reads the event bits back, so hsm_get_cl_event() is unused by design rather than by accident - it is the accessor a changelog consumer needs. Also note hsm_get_cl_flags() and hsm_get_cl_error() immediately below have no in-tree callers either and are being kept, so "no caller in this tree" is not quite the criterion actually applied here. Removing only the event getter leaves the family incomplete.
LU-16518 misc: remove unused uapi header helpers
... since they are no longer used. fid_seq_is_special(),
get_fe_device(), set_fe_device(), set_fe_stripenr(),
lu_extent_is_whole(), lmv_hash_is_restriping() and
hsm_get_cl_event() were never called since they were first
introduced. The last caller of ostid_set_seq_llog() was
removed a long time ago.
Fixes: 79d06b6fac3d ("LU-2240 mds: Assign special fid sequence to root.")
Fixes: 409719608cf0 ("LU-11848 lov: FIEMAP support for PFL and FLR file")
Fixes: b879bbc27db5 ("LU-9771 flr: lfs setstripe to create a new mirror")
Fixes: 2e2b16c28bcf ("LU-11025 dne: support directory restripe")
Fixes: 2e0ad6d40070 ("b=15599 hsm infrastructure")
Fixes: d0b3e251ad5d ("LU-2158 lvfs: remove llog_lvfs.c and other lvfs code from llog")
Test-Parameters: trivial
Signed-off-by: Timothy Day <timday@thelustrecollective.com>
Change-Id: I2002d56cbc7c8039b24fc808a5dfb1f29c2afdc6
(style) The message accounts for the two helpers, the mnt_idmap/nop_mnt_idmap aliases and the four shims that move out of llite_internal.h, but most of the new header is not mentioned: FS_ALLOW_IDMAP, i_user_ns(), file_mnt_idmap(), the vfsuid_t / from_vfsuid() / ia_vfsuid compat, capable_wrt_inode_uidgid(), ll_vfs_iop_setattr(), and the LL_IOP_*/LL_XATTR_SET/LL_DEFINE_MKDIR trampolines - roughly 200 of the 344 new lines. None of those has a user in the tree yet, so no build exercises them on any kernel. Could the message at least describe what each group is for, so a reader can tell the unexplained hunks from the intended ones?
(defect) mapped_fsuid()/mapped_fsgid() are not new in v5.17 - only their move into <linux/mnt_idmapping.h> and the second argument are. From v5.13 through v5.16 <linux/fs.h> already carries:
static inline kuid_t mapped_fsuid(struct user_namespace *mnt_userns)
{
return kuid_from_mnt(mnt_userns, current_fsuid());
}
LC_HAVE_MAPPED_FSUID probes with mapped_fsuid(NULL, NULL), which is a hard error on those kernels, so HAVE_MAPPED_FSUID stays undefined and this block then redefines the same name with a different prototype. Since the header is pulled in by obd.h and lustre_compat/linux/fs.h, doesn't that fail to compile in every translation unit on 5.15.0-88 (Ubuntu 22.04), which lustre/ChangeLog lists as a primary client kernel? SLES15 SP4/SP5 (5.14.21) look exposed too. The probe needs to distinguish the one-argument form rather than treat its absence as "no mapped_fsuid at all".
On v5.12, the one version where this shim really is needed, the direction also looks inverted: the kernel spelled it kuid_from_mnt() = KUIDT_INIT(from_kuid(mnt_userns, kuid)), whereas kuid_into_mnt() = make_kuid(mnt_userns, __kuid_val(kuid)) is the opposite mapping (it is what i_uid_into_mnt() uses). That only diverges once an idmapped mount can exist over Lustre, which is exactly what the rest of this series is heading towards.
(minor) 8b7ca4c0bbb2 is not in mainline, and the ->mkdir() return-type change is v6.14, not v6.19: config/lustre-core.m4 already documents it as v6.14-rc4-9-g88d5baf69082 above LC_HAVE_IOPS_MKDIR_RETURNS_DENTRY. The history list at the top of this file also tags two different commits (a793d79ea3e0 and a1ec9040a2a9) as v5.17-rc1-136-g, so at least one of those counts is wrong as well.
(defect) v6.2 looks like a gap here. It has struct mnt_idmap and nop_mnt_idmap and its ->getattr() takes struct mnt_idmap *, so HAVE_MNT_IDMAP_ARG is set and idmap really is a struct mnt_idmap * - but v6.2's mapped_fsuid() still takes struct user_namespace *:
static inline kuid_t mapped_fsuid(struct user_namespace *mnt_userns,
struct user_namespace *fs_userns)
The fs{g,u}id helpers were only ported to mnt_idmap in v6.3, by c14329d39f2d ("fs: port fs{g,u}id helpers to mnt_idmap"). LC_HAVE_MAPPED_FSUID still passes on v6.2 (both arguments are NULL), so no shim is generated and this call passes the wrong pointer type; v6.2's KBUILD_CFLAGS has -Werror=incompatible-pointer-types, and an uncalled static inline in a header is still type-checked, so every file including obd.h would fail to build.
Would a separate probe on the first argument's type work, with the v6.2 case going through mnt_idmap_owner() from <linux/mount.h>?
LU-20264 obd: add lustre_current_fsuid/fsgid() helpers Add helpers that map current's fsuid/fsgid through a mount idmap into the filesystem's user namespace and return the numeric id as it should appear on the wire. A NULL idmap means identity mapping (&nop_mnt_idmap) and a NULL fs_userns defaults to &init_user_ns. These helpers are written against the current mainline idmapped-mount API, but Lustre still builds against v4.18 (RHEL8), which predates all of it: <linux/mnt_idmapping.h> and mapped_fsuid() arrived in v5.17, vfsuid_t and the i_uid_into_vfsuid() helpers in v6.0, and "struct mnt_idmap" itself only in v6.2. Add lustre_compat/linux/mnt_idmapping.h reconstructing the modern spelling down to v4.18, along with the configure checks it needs, and include it from obd.h. The mnt_idmap/nop_mnt_idmap type aliases move there from lustre_compat/linux/fs.h, and the inode_permission(), generic_permission(), simple_setattr() and setattr_prepare() shims move there from llite_internal.h. These will be used by the following patches to plumb struct mnt_idmap [1] through the client RPC paths. [1] https://www.kernel.org/doc/html/latest/filesystems/idmappings.html Test-Parameters: trivial Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: I00c5068103144a6ebd293140e305c4c66a6a6964
Not a bug, but the name no longer describes what this does. It isn't finding a delimiter any more, it answers "does this fragment continue the param value?", which is also what the rewritten kernel-doc now says. Something like lmd_param_continues() would read better at the call site if the patch is refreshed.
A NID list fragment doesn't always carry an '@'. Bracketed address expressions are valid nidstrings and contain commas, e.g. `failover.node=192.168.10.[8,10,12]@tcp` (see the `192.168.10.[8,10,12-16]@tcp` example in Documentation/man8/lst.8, and cfs_expr_list_parse() which strsep()s the bracket body on ',').
mount.lustre_tgt turns every ldd_params entry into `param=<entry>`, so with that failover.node value lustre_parse_monolithic() sees:
s1 = "param=failover.node=192.168.10.[8"
opts = "10,12]@tcp,svname=..."
The first fragment is "10", which has no '@', so this returns false and the rest of the NID is left behind. entry is then "failover.node=192.168.10.[8" and lmd_validate_param() rejects it (unbalanced '['), giving -EINVAL and "invalid mount string format". Before this patch match_token("10") returned LMD_NUM_MOUNT_OPT, the fragment was absorbed, and the mount worked.
A two-group form such as `192.168.[10,12].[8,10]@tcp` breaks the same way, and `10.0.0.[2,10]@tcp,10.0.1.[2,10]@tcp` silently drops the second NID instead of erroring.
Would it work to keep the '@' test but also treat the fragment as a continuation while the value accumulated so far has an unclosed '['? lmd_validate_param() already tracks exactly that bracket state.
LU-9325 obdclass: do not absorb mount options into param= value
lmd_find_delimiter() treated any comma-separated token that is not
a known server option as a continuation of a param= value, so any
backend mount options following a param= option (e.g.
errors=remount-ro) were glued into lmd_params and stripped from the
string saved as lmd_opts, silently dropping them and registering
garbage parameters with the MGS.
A param value only spans a comma when it is a NID list split by the
option parser, so require a "@" in the fragment before treating it
as a continuation.
Test-Parameters: trivial
Fixes: 415fa27540 ("LU-9325 obdclass: use match_table for server mount options")
Signed-off-by: Timothy Day <timday@thelustrecollective.com>
Change-Id: I5f1615b6cc1fe6fde67f25c9b815eca96a6a6964
spin_lock is a heavy memory barrier while smp_store_release is a light weight barrier. You don't need to do both.
spin_lock is an acquire memory barrier. smp_store_release is a release memory barrier. spin_unlock is also a release memory barrier. So if the wake_up_process were after the spun_unlock, we could store NULL in sai_task without an explicit memory barrier. (That doesn't mean we should - I haven't thought about it enough. It just means we could. The important point is we need a release between the store of null and the wake_up_process())
I am afraid with the shared stat()-ahead support (i.e. mdtest shared stat() workload), lli->lli_sai may be NULL without holding lli_sa_lock. See the patch: https://review.whamcloud.com/c/fs/lustre-release/+/51592
It seems strange to get a spinlock just for an LASSERT()?
We should either use the correct lock or remove the LASSERT().
LU-17707 llite: ensure statahead task and info are valid A spin lock should be held when checking lli_sai A RELEASE is needed to ensure sai_task is correctly seen by the statahead thread. HPE-bug-id: LUS-12236 Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: Ifa4b5a3bf65520d1bc42710223400074ea588b8d
| unique failing test | history |
|---|---|
| sanity2@ldiskfs+DNE:test_133a | seen in 2 other reviews |
| sanity-hsm@zfs:test_254b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
BUILD
LU-20310 ec: fix remaining checkpatch.pl warnings ... via checkpatch.pl --fix-inplace. Test-Parameters: trivial Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: If03d70e6c67bbb583274009cfdfd473e4f07516d
(minor) LU-20485 is titled "Use LLVM automatic reference counting" and is filed as an Improvement. This patch is not ARC adoption, it is a refcount-leak fix in the MDT HSM llog paths. Is that the intended ticket, or should a fix like this get its own LU bug so it can be tracked for the maintenance branches?
(minor) This looks like a bug fix rather than a cleanup, so a Fixes: tag would help decide which maintenance branches need it.
The leaked loc_refcount is not just memory: llog_cleanup() ends in l_wait_event_abortable(olg->olg_waitq, llog_group_ctxt_null(olg, idx)), and olg_ctxts[idx] is only cleared once __llog_ctxt_put() drops the count to zero. So a thread that raced mdd_hsm_actions_llog_fini() setting loc_handle = NULL can stall MDT teardown.
Suggested:
Fixes: 612f27788166 ("LU-3339 mdt: HSM on disk actions record")
That covers both mdt_hsm_cdt_actions.c sites. The mdt_hsm_cdt_agent.c one arrived later, in 07f6a59ad713 ("LU-18556 hsm: optimize llog record modification"), if you want a second tag.
(style) This isn't a bug, but llog_ctxt_put() already returns early when passed NULL, so the check doesn't need splitting in two:
if (!lctxt || !lctxt->loc_handle) {
llog_ctxt_put(lctxt);
RETURN(-ENOENT);
}
That is the shape sub_updates_write() and sub_declare_updates_write() already use in lustre/target/update_trans.c for the same ctxt/handle pair. Same applies to mdt_hsm_agent_modify_record().
This is true. This looks a bit nicer - I ought to refresh this.
(minor) mdt_agent_record_add() already has a putctxt: label that does exactly this put, so GOTO(putctxt, rc = -ENOENT) would avoid duplicating the cleanup. rc still reaches the return through free:, and the D_TRACE CDEBUG then reports the failure too.
LU-20485 mdt: drop ctxt if we have a NULL handle If we have a valid ctxt, but NULL handle - we have to drop the ctxt before returning an error. Test-Parameters: trivial Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: I1c0c11e6f86054631b5192733a8e2b456deaa183
| unique failing test | history |
|---|---|
| sanity2@ldiskfs+DNE:test_63c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
A few claims here don't match the code. "via the table-driven netlink framework": this file doesn't use lustre_nl_obd_ops / lustre_obd_nl_start()/dump()/done() from the previous patch - start/dump/done are hand-rolled here. Is there a reason the framework doesn't fit, and could that reason be stated instead? "QSD reports per-slave usage and grant state": qsd_collect_acct_obj() sets qne_granted/qne_hardlimit/qne_softlimit to 0 and the dump only emits kbytes/inodes for "acct" records, so no grant state is reported. "Add new quota genetlink families" is plural, but only the "lquota" family is added. The qsd_config.c hunk that drops `static` from qfs_list/qfs_list_lock also isn't mentioned - worth a sentence saying why the QSD list has to become module-visible.
Tab alignment is off on this entry compared to its neighbours; same for the LUSTRE_QUOTA_ATTR_MANAGER and LUSTRE_QUOTA_ATTR_QTYPE lines in the doc comment above.
This isn't a bug, but these two prototypes are already in lquota_internal.h, which is what lquota_lib.c includes - so the copies here are unused. The preceding patch put mdd_netlink_init()/fini() only in mdd_internal.h. If they do stay, note that lquota is server-only (obj-$(CONFIG_LUSTRE_FS_SERVER) in lustre/Makefile), so they belong inside the HAVE_SERVER_SUPPORT block just below rather than above it.
(style) This isn't a bug, but appending breaks the alphabetical order of the list - qmt_netlink.o belongs before qmt_pool.o, and qsd_netlink.o before qsd_reint.o.
(minor) No #ifndef/#define guard here, so including this header twice in one translation unit redefines enum lustre_quota_attrs, struct quota_nl_entry and the typedef. The neighbouring private headers all have one (_QMT_INTERNAL_H, _QSD_INTERNAL_H). It also leans on its includers for GENRADIX(), MAX_OBD_NAME and LOV_MAXPOOLNAME; pulling in <linux/generic-radix-tree.h> and the lustre headers directly would make it self-contained.
(typo) There is nothing above this line, and no other GENRADIX typedef in the tree, so the "changelog typedefs above" reference doesn't resolve. Did this mean to point at another file?
(style) This isn't a bug, but neither name says which side of quota it belongs to, while everything else in this directory carries its file prefix (qmt_*, qsd_*, lquota_*). Something like qmt_nl_collect_glb() and qsd_nl_collect_acct() would sort with their neighbours and make the QMT/QSD split visible at the call sites in lquota_nl_start().
Both collect calls materialise every record before a single byte is sent, and the entry count here is unbounded - one struct quota_nl_entry (~208 bytes) per quota ID, per pool, per type on the QMT, plus one per ID per type on every QSD. A filesystem with a large project or user ID space turns an unprivileged dump request into hundreds of MB of GFP_KERNEL allocations, held for the life of the dump. It also means qmt_pool_lock and qfs_mutex are each held across a full on-disk index scan, blocking pool teardown and qsd_fini() for the duration. Has collecting incrementally from .dumpit (resuming the index iterator per message) been considered instead?
This return path can't paginate. netlink_dump() only calls .dumpit again while the previous return was positive; returning 0 ends the dump and returning a negative value ends it with that errno in NLMSG_DONE. So once the skb fills up the whole dump fails with EMSGSIZE rather than continuing in the next message. Nothing sets cb->min_dump_alloc either, so the skb is NLMSG_GOODSIZE (~1 page). At roughly 150 bytes per record that is on the order of 25 quota entries before the dump breaks - lustre_device_list_dump() and lustre_obd_nl_start() both pre-size min_dump_alloc for exactly this reason, and even U16_MAX won't cover a real quota table. Returning msg->len when the buffer fills (state is already carried in gql_index) would let the dump span messages.
(suggestion) Selecting the attribute layout with a strcmp() on the record-type string is easy to get wrong later: anything that isn't exactly "global" silently formats as an accounting record. A small enum in struct quota_nl_entry, with the string derived only when it goes on the wire, would make the two cases explicit and drop the per-record compare.
(suggestion) With no .parallel_ops, the genl core runs .start/.dumpit/.done inside genl_lock() (genl_lock_start(), genl_lock_dumpit()), so the collection here holds the global genl mutex and serialises every other generic netlink user on the node, not just lquota. lnet_family sets .parallel_ops = true, and the handlers here already do their own locking - could this family set it as well?
class_obd_devs_count() returns the number of registered devices, not the highest index in obd_devs, so indexing 0..count-1 skips devices whenever the xarray is sparse. __xa_alloc() in class_register_device() always picks the lowest free slot, so unregistering any device (an OST deactivation, a target unmount, a client mount/unmount on the same node) leaves a hole and drops the tail index out of range. If the QMT happens to be at that index, the dump silently reports no global quota at all.
The idiom used everywhere else, including lustre_obd_nl_start() added earlier in this series, is:
obd_device_lock();
obd_device_for_each(idx, obd) { ... }
obd_device_unlock();
LU-19768 quota: add quota genetlink family Add new quota genetlink families that expose per-pool and per-slave quota usage via the table-driven netlink framework. QMT reports pool-level grants and limits while QSD reports per-slave usage and grant state through genradix arrays. TLC-bug-id: TLU-56 Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: Ibb3bedaefc8c78f2f2b52d593fe0d6e080658cb9
The body describes this as a pure move of the osd_obj_seq/map routines, but one hunk is not a move: osd_ost_fini() loses `osd->od_ost_map = NULL;` while its callers are not updated to compensate. Worth calling out in the message (see the comment on osd_compat.c).
The message says the routines move "to a dedicated osd.ko kernel module" and then argues why a module is preferable to a static library, but no such module is built by this patch. lustre/osd/osd_lib.c is symlinked into lustre/osd-ldiskfs/ and lustre/osd-wbcfs/ and added to osd_ldiskfs-objs / osd_wbcfs-objs, so the code is compiled into each OSD .ko separately, and nothing is EXPORT_SYMBOL'd. lustre/Makefile's obj-m list is unchanged, and lustre/osd/ has no Makefile. That is the static-library approach, which is what the discussion on this change settled on. Could the message be refreshed to describe what the patch actually does, so the reasoning in it doesn't read as describing a different implementation?
Looking that this I wonder if we can move the sysfs / debugfs handling to here.
osd/ isn't a separate module, so it wouldn't help.
(style) line length of 83 exceeds 80 columns
(style) wrap at 80 columns can be trivially fixed, and maybe expanded on a bit.
"on-disk structure definitions" doesn't describe what is here - struct osd_obj_seq and struct osd_obj_map hold only in-memory state (dentry pointers, a rwlock, a list head, a mutex). Nothing in this header is an on-disk format. This line also still exceeds 80 columns and still lacks the fuller description that was asked for on patchset 8; both look unaddressed in the current revision.
This isn't a bug today, but <linux/rwlock.h> is not meant to be included directly - it errors out unless __LINUX_SPINLOCK_H is already defined. It compiles here only because <linux/dcache.h> two lines up happens to pull in <linux/spinlock.h> first, so a future reshuffle of these includes would break the build. Every other header in the tree that needs a lock type uses <linux/spinlock.h> (lustre/include/obd.h, cl_object.h, range_lock.h, ...); this is the only <linux/rwlock.h>.
This comment sits above an int and doesn't describe it. It looks like it was meant for the mutex in struct osd_obj_map (om_dir_init_mutex, which has no comment at all). Since the struct is being re-documented in a new header, it would be a good time to move or drop it.
These are now global symbols with fairly generic names, in a header on the default include path. osd-zfs already has its own static osd_seq_find_locked()/osd_seq_find() with different prototypes (lustre/osd-zfs/osd_oi.c:394 and :406), taking struct osd_seq_list rather than struct osd_obj_map. Nothing breaks today because osd-zfs doesn't include this header, but osd-zfs is presumably the next consumer, and including <osd.h> there would give "static declaration follows non-static declaration". Would a prefix tied to the type help, e.g. osd_obj_map_seq_find() / osd_obj_map_seq_free()? Related: osd_ost_fini() reads oddly now that it takes a struct osd_obj_map and there is no matching osd_ost_init() in the library - osd_obj_map_fini() or osd_obj_map_free() would say what it does.
The tree already has a mechanism for compiling a shared .c into a module from another directory, without generating files. lnet/libcfs/Makefile does:
include $(src)/../../lustre_compat/Makefile
libcfs-y += $(patsubst %,../../lustre_compat/%,$(module_objs))
The same shape here would be `osd_ldiskfs-objs += ../osd/osd_lib.o`, with no symlink and no generated source. Any reason to prefer the symlink?
As written the rule leaves an untracked lustre/osd-ldiskfs/osd_lib.c symlink in the source tree after a build. It matches no .gitignore pattern, so `git status` is dirty afterwards, and it is not in clean-files so `make clean` leaves it behind. If the symlink is kept, it should at least be gitignored and cleaned.
Smaller point: `ln -sf ../osd/osd_lib.c $@` hardcodes the link target rather than using `$<`, so the recipe and the prerequisite can drift apart.
The old osd_ost_fini() ended with `osd->od_ost_map = NULL;`. The library version takes the map by pointer and cannot do that, and none of the three call sites here were updated, so `dev->od_ost_map` is left pointing at freed memory.
On an OST, osd_obj_map_init()'s second error path frees the map and returns without clearing the field:
rc = osd_index_backup_dir_init(env, dev);
if (rc) {
osd_ost_fini(dev->od_ost_map); /* freed */
if (mdt_init) /* false when od_is_ost */
osd_mdt_fini(dev);
}
I could not find a path that dereferences the stale pointer today - osd_device_init0() goes straight to out_wq and osd_device_alloc() frees the whole osd_device - so this doesn't look like a live use-after-free. But it does drop an invariant the old code held.
It is also worth noting what currently hides this in osd_obj_map_fini(): the field only ends up NULL because osd_mdt_fini() contains a long-standing typo and assigns `osd->od_ost_map = NULL;` where it means od_mdt_map. So correctness of the new code depends on a bug elsewhere. Could the call sites just do `dev->od_ost_map = NULL;` after osd_ost_fini()?
Same as the osd-ldiskfs copy of this rule: it generates an untracked, un-cleaned symlink in the source tree, and the tree already has a no-symlink pattern for this (lnet/libcfs/Makefile including lustre_compat/Makefile). Also, nothing in osd-wbcfs calls the osd_lib.c routines yet, so this only adds dead code to osd_wbcfs.ko for now. Is it worth wiring osd-wbcfs up in the same patch, or waiting until the consumer lands?
Would it be better to call this directory `osd-lib` or `osd-shared` or `osd-generic` or similar?
LU-18813 osd: setup library to share code ... starting with osd_obj_seq/map routines. These will be eventually used by osd-wbcfs as well - so move them to a dedicated osd.ko kernel module. A new kernel module is desirable (versus a static library) so that we preserve the ability to load multiple OSDs at the same time. Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: Iad23cba0e624a003cc0b2f28dc08420b618cdf10
I agree extent_replace should be removed. But please keep extent_prev_lock.
I can mark it unused. But why keep it?
Does it trigger the unused warning? It may be used for some cases for optimization.
It triggers a custom static checker I use: https://github.com/tim-day-387/ktest/tree/master/cplugin. But if I mark it unused, I can update the check to ignore __maybe_unused functions.
LU-16518 ldlm: remove unused extent rbtree helpers
... since they are no longer used. extent_prev_lock() and
extent_replace() were never called after being introduced.
Fixes: 0cf356c4e427 ("LU-11085 ldlm: optimise extent locks with identical extent")
Test-Parameters: trivial
Signed-off-by: Timothy Day <timday@thelustrecollective.com>
Change-Id: Ie1f7162b1023c0e396951136b45da532520a742e
(typo) "sets"
But in the error case, won't the error code be bounded by -4095 in the kernel?
How can len be > INT_MAX when it is < 0 a few lines above?
(style) no need for else after GOTO, which also removes one indent on the next line
What range of negative numbers can be returned here?
(style) no need for else after GOTO
LU-17000 lnet: Fix overflow return in lnet_net_cmd
In case nla_strscpy fails. It seets rc = len.
Since rc is int and len is ssize_t, it could
lead to overflow. This patch checks if the
return len is a valid int range and then safely
casts and assigns to rc. In case it is out of
INT min/max range it sets ERANGE to rc.
CoverityID: 429517 ("Overflowed return value")
Test-Parameters: trivial testlist=sanity-lnet
Fixes: 8f8f6e2f3 ("LU-10003 lnet: use Netlink to support old and new NI APIs")
Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com>
Change-Id: I293cfb559fc8e33d84ce012bf072c5b5299ec074
LU-19249 build: Compatibility updates for kernel v6.16
Linux commit v6.15-rc1-5-g06c567403ae5
Use try_lookup_noperm() instead of d_hash_and_lookup() outside \
of VFS
Provide try_lookup_noperm() and lookup_noperm for older kernels.
Linux commit v6.15-rc6-233-g7d0f0f061531
mm: move folio_index to mm/swap.h and remove no longer needed \
helper
Drop folio_index and use folio->index directly.
Linux commit v6.15-13744-g41cb08555c41
treewide, timers: Rename from_timer() to timer_container_of()
Provide timer_container_of for older kernels when is not defined.
Linux commit v6.15-rc6-297-gacc53a0b4c15
mm: rename page->index to page->__folio_index
Access page index either via folio->index or calculated using
folio_index_page()
Lustre-commit: 59d84ec3ffb83a938f13e0c93ad5c87ec2a0d258
Lustre-change: https://review.whamcloud.com/60619
Test-Parameters: optional fstype=ldiskfs mdtcount=4 mdscount=2 \
clientdistro=el10.1 serverdistro=el9.7 testgroup=full-dne-part-1
Test-Parameters: optional fstype=ldiskfs mdtcount=4 mdscount=2 \
clientdistro=el10.1 serverdistro=el9.7 testgroup=full-dne-part-2
Test-Parameters: optional fstype=ldiskfs mdtcount=4 mdscount=2 \
clientdistro=el10.1 serverdistro=el9.7 testgroup=full-dne-part-3
Test-Parameters: optional fstype=zfs mdtcount=4 mdscount=2 \
clientdistro=el10.1 serverdistro=el9.7 testgroup=full-dne-zfs-part-1
Test-Parameters: optional fstype=zfs mdtcount=4 mdscount=2 \
clientdistro=el10.1 serverdistro=el9.7 testgroup=full-dne-zfs-part-2
Test-Parameters: optional fstype=zfs mdtcount=4 mdscount=2 \
clientdistro=el10.1 serverdistro=el9.7 testgroup=full-dne-zfs-part-3
Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com>
Change-Id: I25d4eec9a047a6e3aa796d9327d0857842c9c0ba
Reviewed-by: Timothy Day <timday@amazon.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Signed-off-by: Gian-Carlo DeFazio <defazio1@llnl.gov>
Can you explain why this was failing with test_407: [ 4409.955942] Lustre: DEBUG MARKER: mdc.lustre-MDT0000-mdc-*.mds_server_uuid in FULL state after 0 sec [ 4412.609493] LustreError: 334693:0:(lov_object.c:1358:lov_layout_change()) lustre-clilov-ffff992a85a30800: cannot apply new layout on [0x200004a55:0x2ee:0x0] : rc = -22 [ 4412.609837] LustreError: 334694:0:(vvp_io.c:1888:vvp_io_init()) lustre: refresh file layout [0x200004a55:0x2ee:0x0] error -22. [ 4412.613926] LustreError: 334693:0:(lov_object.c:1358:lov_layout_change()) Skipped 2 previous similar messages [ 4417.309788] LustreError: 336574:0:(lov_object.c:1358:lov_layout_change()) lustre-clilov-ffff992a85a30800: cannot apply new layout on [0x200004a55:0x2ee:0x0] : rc = -22 [ 4417.312757] LustreError: 336574:0:(lov_object.c:1358:lov_layout_change()) Skipped 1 previous similar message [ 4417.314686] LustreError: 336574:0:(lcommon_cl.c:196:cl_file_inode_init()) lustre: failed to initialize cl_object [0x200004a55:0x2ee:0x0]: rc = -22
LU-10606 hsm: store HSM xattr as a basic layout A closer coupling between the HSM archive state and Lustre File Level Redundancy (FLR) can make PCC and HSM management more consistent with the management of other replicas in the file system. Stroing HSM as a layout (FLR component of the file) can obtain the following benefits: - Consolidate the HSM with PFL/FLR/composite layouts to give a flexibility way to combine these features; - Migration, FLR mirroring resync and HSM data movement all could be done through a user-space copytool; - Allow multiple HSM copies (e.g. Tape, S3, another POSIX copy), which would also be useful for file versioning, flexible archiving; - Allow PCC-RW mirror to be kept at the same as regular file mirror, by marking the regular file mirror(s) stale instead of releasing them; - Possibly keep partial file components in the HSM, for limiting restore extents or for PFL layouts. This patch implements the basic framework to store HSM xattr as a basic layout component. Test-Parameters: clientcount=3 testlist=sanity-pcc,sanity-hsm Signed-off-by: Qian Yingjin <qian@ddn.com> Change-Id: Ic48d5bc3c3254e8654c64e615b49ae698638a707
| unique failing test | history |
|---|---|
| sanity-quota@ldiskfs+DNE:test_48 | seen in 44 other reviews |
cast i_ino to (u64) to ensure matches with 7.1+
cast i_ino to (u64) to ensure matches with 7.1+
LU-20373 build: py3 updates for kernel v7.1
Update python configure checks:
v7.0-rc6-4-g14a51045e10d3'
get rid of busy-waiting in shrink_dcache_tree()
Drops d_u{} union from dcache, it is now anonymous
v7.0-rc5-146-g4e1d77a8f382a
folio_batch: rename pagevec.h to folio_batch.h
Provide a compat include for folio_batch.h that includes
pagevec.h and defines PAGEVEC_SIZE when it is missing.
v7.0-rc1-1-g96fefcabf340f
vfs: widen inode hash/lookup functions to u64
In libiam and osd_oi change:
struct osd_inode_id.oii_ino to u64
cast i_ino to (u64) to ensure older kernels align with upstream
Test-Parameters: trivial
Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com>
Change-Id: If046b6f9df0ec890a6e023b01c4f4a763419be46
LU-12756 lnet: Refactor lnet_find_route_locked Return type changed from lnet_route to lnet_peer_ni. lnet_find_route_locked() has been renamed to lnet_select_lpni_to_remote_net() to better reflect its purpose in choosing the best lnet_peer_ni of a router that can forward the message to the specified remote LNet. Test-Parameters: trivial Signed-off-by: Chris Horn <hornc@cray.com> Change-Id: I37878e407699e99679868e0d9d83014df2de7de0
do we *REALLY* need this as part of kernel code vs doing it in in the tools when the log is looked at/processed (which happens a lot less frequently)? Also this is mislabeled as utils, but this patch is all kernel code, zero utils?
> do we REALLY need this as part of kernel code vs doing it in in the tools when the log is looked at/processed (which happens a lot less frequently)? I will see if this can be done in userspace. The reason for this was, Debug logs are often consumed immediately, Having the decoded ioctl immediately readable without post-processing is valuable. In normal operation, this code is a no-op and does not affect the ioctl path at all, only when debug flags are explicitly enabled. As such, both are infrequent. > Also this is mislabeled as utils, but this patch is all kernel code, zero utils? Yes, Agree. Should have been libcfs and not utils.
debug logs are not consumed immediately. They are stored in a binary buffer (to save on processing that's alredy expensive as it is without adding any additional formatted prints) and usually are never read. When they ARE read, you are using either lctl debug_kernel command that reads the buffer, interprets the binary data, sorts it and then outputs. Or you are using something like debug_daemon that writes the binary buffers to a file that you are then passing through something like lctl debug_file that again does the pretty formatting from binary dumps, sorts and outputs the result. The third path is you have something trigger a debug log dump (dump_on_xxx like a timeout or eviction or whataver) and then you are going to process it with lctl debug_file too. I am not aware of anything that would just look into the raw binary dumps of the logs, what's the usecase I am missing?
I Agree. Lustre debug logs are not plain text - they are binary buffers. You're right - for normal Lustre debug consumption, this belongs in userspace. Will move it to userspace.
Oleg, is the objection to this patch based on the use of an on-stack buffer? I don't see the harm in making the debug logs more readable, and decoding these numbers is always annoying. IMHO, it would be relatively safe to return the symbolic ioctl name with a static buffer to the caller, to avoid the on-stack allocation, then it would have zero impact unless `D_VFSTRACE` debugging is enabled. The risk is low of many threads calling ioctls at the same time, and if that happens it would typically be the same ioctl, and the numeric value is still in the log in case of confusion.
the objection is extra processing at log time. I'd rather the processing is to shift to lctl dk/df time. Same usability as this patch, less actual runtime overhead in the kernel. D_IOCTL is in the default debug mask. But I guess I missed that we also have CERROR where the message is output straight into the kernel console log. there's whole one place like that in lustre/lmv/lmv_obd.c
I don't think ioctl() calls are in a performance critical path anywhere? The `cmd2ioctl()` function is not called if the CDEBUG() mask is not set, so this adds no overhead in that case. In general default debug masks are not set if they are in any common code paths, so I don't think this will add any measurable runtime overhead. My preference would be to have this inline in the debug logs rather than having to do it in post-processing.
(minor) this should be changed to print %x regardless, since decoding the decimal value by hand is ugly
LU-19888 libcfs: filter & print ioctl() request with full command
Currently, D_IOCTL debug just prints full command integer number.
This patch filters out ioctl integer number to IORW string and
adds to the the debug log for easy debug log reading.
This patch introduces no functional changes to ioctl() handling.
Before:
$ lfs osts
(dir.c:1991:ll_dir_ioctl()) VFS Op:inode=[0x200000007:0x1:0x0]
(ffff88800ca1ae10) cmd=800866a8 arg=7ffce147942c
After:
$ lfs osts
(dir.c:1991:ll_dir_ioctl()) VFS Op:inode=[0x200000007:0x1:0x0]
(ffff888033dda790) cmd=800866a8 (_IOR('f', 168, 8)) arg=7fff3073ab4c
Test-Parameters: trivial
Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com>
Change-Id: I18d0e85855a2de5a348da3df2e86bce4067ee11f
LU-1158 idl: introduce struct lu_times for timestamp grouping Group the mtime/atime/ctime triples in struct obdo, struct mdt_body, struct ost_lvb, struct ost_lvb_v1, struct lu_attr and struct cl_attr into a shared struct lu_times. The on-wire order (mtime, atime, ctime) is preserved, so the packed size and offset of each wire structure is unchanged. Existing call sites continue to reference the fields by their original names (e.g. o_mtime, mbo_mtime, lvb_mtime, la_mtime, cat_mtime) via compatibility macros, so this patch is a pure refactor with no behavior change. The motivation is to prepare the tree for the nanosecond timestamp conversion in LU-1158 by making per-field changes mechanical: later patches can introduce helpers that operate on struct lu_times and swap sec->ns handling in a single place instead of across dozens of call sites, which keeps conflict surface small and each patch reviewable. Test-Parameters: trivial Signed-off-by: Sohei Koyama <skoyama@ddn.com> Change-Id: I3e7975c12448ecc7f5e67e83bbe19241bebf0d20
(style) This should be up below "units.h". Headers should be in order of: - system - standard - lustre and alphabetical within each section. As such, the lustre_disk.h inclusion should be moved after lustre_cfg.h, and limits.h should also be moved up after getopt.h.
It seems inefficient to initialize and run a yaml parser for every line of text just to find a string, and possibly multiple times per line if there are multiple values. Something like `strstr(record, key)` to find the key, check for and skip the following `:` and whitespace and optional quote, then continue until trailing quote (if quoted) or next whitespace (if unquoted) before copying into the return value buffer. That is executing a few lines of code vs. probably 1000 LOC using the libyaml parser to do this.
Is seems super inefficient to call yaml_llog_get_value() three times in this function to just extract three strings from a line of text.
LU-15174 utils: use libyaml for llog YAML record parsing Replace hand-rolled strstr/sscanf parsing in lustre/utils/obd.c with libyaml to handle both quoted and unquoted YAML scalar values transparently. This prepares for a follow-up patch that adds proper YAML quoting to kernel-side llog output (class_config_yaml_output). The current string-based parsing in llog_poollist_cb() is fragile: it relies on exact character offsets and spacing that break when the output format changes. The libyaml event-based parser handles both plain and quoted scalars without any format assumptions. Add yaml_llog_get_value() helper that extracts a value for a given key from a YAML flow mapping record, following the pattern already used in lustre_cfg.c:yaml_get_limit_uid(). Test-Parameters: testlist=conf-sanity Signed-off-by: Sohei Koyama <skoyama@ddn.com> Change-Id: I2881a418b55f753591245b509d92d221ac39412a
We really should use the Netlink interface. Once its not net namespace aware and second there is a limit to how many interfaces you can disable at a time compared to Netlink.
The two "goto select_ni" above could mean we select an NI that has been disabled. Administratively disabled should probably be the first check as it is a human operator telling us explicitly not to use an interface.
`default: return 0;` reports success on an unrecognized or malformed option. getopt_long returns '?' for both an unknown flag and a known flag missing its argument, so e.g. `lnetctl net disable --net tcp --bogus` or `lnetctl net disable --net` exits 0 having done nothing. Return an error here (e.g. `return -EINVAL;`) so invalid invocations fail. The test_229 negative cases only exercise *missing* options, not this path.
I should have a test case that ensures that a ping from a disabled interface or to a disabled interface fails.
LU-19822 lnet: interfaces can be manually disabled Implement lnetctl disable/enable to allow admins to selectively block traffic on LNet interfaces. Currently, the only way to manually disable an LNet interface is to delete it. An lnetctl tunable would give admins a network agnostic method to temporarily block traffic to a subset of clients or block certain routes. This patch also implements the needed kernel infrastructure. When an interface is disabled, sends are routed over the other available interfaces (if available). recv are dropped outright. Test-Parameters: trivial Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: I2387ef98f265b3fa77a5b8a22413a5c29b4c627f
I am somewhat uneasy about these changes even if they appear to work now.
The real fix IMHO is to make OBD_FREE() not accept a size argument. Size isn't needed. The allocator should know how big the pointer is already. We could use ksize(), for example.
the only reason we had the size argument so we can sidestep the allocator and have our own accounting of what was allocated/freed, so we can display our own statistic of memory use and of suspected leaks (but it's not foolproof too!). Alternative would be storing the size somewhere? (how much can we trust ksize to be exact?_ If we thing current in-kernel allocator is good enough we can probably do away with a lot of this functionality.
kmalloc itself uses ksize (or rather, the internal version of the same function). We don't need to store the size anywhere. If you look at the implementations:
```
#define OBD_FREE_PTR(ptr) OBD_FREE(ptr, sizeof(*(ptr)))
#define OBD_FREE(ptr, size) \
do { \
if (likely(ptr)) { \
OBD_FREE_PRE(ptr, size, "kfreed"); \
kfree(ptr); \
POISON_PTR(ptr); \
} \
} while (0)
```
We could just redefine `OBD_FREE_PTR` to `OBD_FREE(ptr, ksize(ptr))` and convert everything to `OBD_FREE_PTR`.
Newer kernels (6.12?) have fancy leak detection built-in. But it'll be a while until everyone using Lustre is that up-to-date.
Interestingly, the upstream kernel is going in the same direction - https://lwn.net/Articles/1062856
I have a similar concern as Oleg about using `ksize()` only in `OBD_FREE*()` since that might be the _object_ size and may be larger than the size that was originally passed to `OBD_ALLOC*()`. If this *always* used `ksize()` for the accounting that would at least be consistent. I would also be OK with getting rid of the built-in memory leak detection and use the kernel detection *IFF* it was wired in to run all the time (at the very minimum during testing) so that we have some chance of keeping the code with no/minimal leaks during operation. Today it is a test failure if there is a memory leak, and while that isn't 100% preventing any leak from landing, at least it is visible during testing and not only after running systems continually for a hundred hours at a customer and trying to debug it.
hm... is this really correct? What if some compilers decide to calculate the lcfg->XXX arguments first? (e.g. imagine OBD_FREE is a function - then this must be calculated before we jump in)
@green@whamcloud.com, I'm not sure what your concern is here? The `OBD_FREE*()` macros are all checking if `ptr` is non-NULL, and since they are macros, the `size` argument cannot be evaluated until after that happens:
```
#define OBD_FREE(ptr, size) \
do { \
if (likely(ptr)) { \
OBD_FREE_PRE(ptr, size, "kfreed"); \
kfree(ptr); \
POISON_PTR(ptr); \
} \
} while (0)
```
`lustre_cfg_len()` value definitely needs to be calculated before the memory is freed, or it would be dereferencing freed memory. That is also OK because `size` is only used *before* the memory is freed, and not afterward.
similar concern here.
LU-18141 mgs: don't check for NULL before free'ing The common free'ing macros already check for NULL, so we don't need to explicitly check this beforehand. The patch has been generated with the coccinelle script below. @@ expression E; @@ - if (E != NULL) ( OBD_FREE_PTR(E); | OBD_FREE(E, ...); | LIBCFS_FREE(E, ...); | CFS_FREE_PTR(E); | CFS_FREE_PTR_ARRAY(E, ...); ) Test-Parameters: trivial Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: Ie6ae568738264444be9703e856254a0470e85f7b
LU-16335 mdt: skip target check for rm_entry For "lfs rm_entry", target may not exist, sanity check of it may fail thus causes rm_entry fail. Add sanity 832. Lustre-commit: ae98c5fdaaf37daeb328b7110cbcf42754752c9d Lustre-change: https://review.whamcloud.com/49329 Signed-off-by: Lai Siyao <lai.siyao@whamcloud.com> Change-Id: I824c7581af05c7494cf03c0c9bc999ca1abfec01 Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Reviewed-by: Qian Yingjin <qian@ddn.com> Reviewed-by: James Simmons <jsimmons@infradead.org> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
| unique failing test | history |
|---|---|
| sanity-quota@zfs+DNE:test_12b | seen in 19 other reviews |
| sanity-quota@zfs+DNE:test_17 | seen in 23 other reviews |
| sanity-quota@zfs+DNE:test_25 | seen in 17 other reviews |
| sanity-quota@zfs+DNE:test_33 | seen in 23 other reviews |
| sanity-quota@zfs+DNE:test_34 | seen in 23 other reviews |
| sanity-quota@zfs+DNE:test_37 | seen in 23 other reviews |
| sanity-quota@zfs+DNE:test_38 | seen in 23 other reviews |
| sanity-sec@zfs:test_25b | seen in 31 other reviews |
This patch could run with `Test-Parameters: trivial` if it is refreshed.
LU-17000 lnet: refactor lnet_net_show_dump Refactor lnet_net_show_dump() to improve readability and reduce function size from ~360 lines to ~160 lines. Changes: - Add lnet_ni_dump_ctx struct to hold shared dump state - Extract lnet_ni_dump_one_msg_stats() helper for message stats (send/recv/drop) - eliminates code duplication - Extract lnet_ni_dump_health_stats() helper for health statistics - Extract lnet_ni_dump_tunables() helper for net tunables - Extract lnet_ni_format_cpts() helper for CPT list formatting with proper buffer overflow checking - Extract lnet_ni_dump_extended() to handle all verbosity-dependent NI dumping with linear control flow instead of goto-based skipping The refactoring eliminates goto labels (skip_msg_stats, skip_udsp) by restructuring the verbosity-based logic into clear conditional blocks. Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: I210f78fdf201a416f16733bc5ba4afdf45e92065
I am not entirely convinced the LASSERT() is failing to do the job of verify the extra big_lov is not abused.
Also adding an extra alloc/free for every pass ... possibly would it be better to add another generic buffer to: struct mdt_thread_info {} ?
Abusing big_lov did seem like a very obscure case and would require pfid or pfid_name to be larger than 128 bytes in the current code. The intention for the change is to prevent future unintended use. Seemed like an unlikely event that pfid or pfid_name does not fit in 128 bytes. The extra alloc and free is only if the xattr was greater than 128 bytes - so I chose not to add another generic buffer. If the size is likely to be greater than 128 bytes, then if would make sense to add another generic buffer.
Seems like this block should be added to mdt_thread_info_reset()
Right - that was patch 1. Since mdt_thread_info_reset is also called from mdt_batch, would it then end up NULLing these values before the buffers are freed in thread_fini?
I see in the first rev, it was in mdt_thread_info_reset(). But this made it so mdt_key_fini() would never find the pointers. Would this also cause a memory leak if these weren't freed yet?
LU_KEY_INIT(mdt, struct mdt_thread_info); So info was allocated with __GFP_ZERO, so this is probably not needed and the de-constructor is mdt_key_fini(), so if these are not NULL here then probably memory is leaked? From Documentation/osd-api.txt: A component (like device or library) can register its own descriptor (see LU_KEY_INIT macro) and then every new thread will be populating the environment with buffers described.
The comments on Line 4750-4753 - at the top of xattr_thread_info_init indicated that the info structure is not zeroed. If info was allocated with __GFP_ZERO, then we don't need these changes.
When mdt_thread_info is first allocated in mdt_key_init() (defined by LU_KEY_INIT), it's OBD_ALLOC_PTR() which has __GFP_ZERO. So it'll be zeroed at first.
There seems to be some confusion about the lifetime of mdt_thread_info vs mdt_thread_info_init init only resets a minimal amount of the info struct upon each request. mdt_thread_info is not alloc()'d with each call and has a much longer lifetime which is why the buffers prefer to be grown and not free()'d until much later.
Thanks Shaun. This does help clarify and makes sense as to why we don't need to initialize those variables. In the latest patch (patch4) - I've switched to using a generic buffer for pfid and pfid_name.
warning: sparse:symbol 'mdt_big_generic_xattr_get' was not declared. Should it be static?
This warning is valid. Also, there’s some amount of code duplication here with the other xattr fetch function. I wonder if we could avoid that by using an lu_buf in thread info, and having a common function that accepts info/object/name/lu_buf?
Will fix the warning, was waiting for additional comments before uploading a new patch. While there is some code duplication between mdt_big_generic_xattr_get and mdt_big_xattr_get, there is value to distinguishing between a generic method that does not store the values returned on md_attr, whereas the latter is specific to stripe get, and those attributes can be stored in md_attr. Trying to refactor these to be one routine will be harder to read. The allocated (or reallocated) memory pointers are stored in lu_buf->buf AND pointers off the thread info.
mdt_big_xattr_get() is doing the exact same thing as mdt_big_generic_xattr_get(), except that it changes which buffer is uses depending on the xattr name. Presumably we could do something like:
int mdt_big_xattr_get(struct mdt_thread_info *info, struct mdt_object *o,
const char *name)
{
struct lu_buf *my_buf;
if (strcmp(name, XATTR_NAME_LMV) == 0) {
my_buf = info->mti_big_lmv_lu_buf;
} else if (strcmp(name, XATTR_NAME_LOV) == 0) {
my_buf = info->mti_big_lov_lu_buf;
} else {
my_buf = info->mti_big_generic_lu_buf;
}
rc = __mdt_big_xattr_get(info, o, my_buf);
return rc;
}
I think that logic would be a lot clearer.
We never define or check mti_big_generic_used. The other fields have a check like this. I noticed that mti_big_lov_used is set incorrectly. mdt_big_xattr_get() uses mti_big_lov if the xattr is not XATTR_NAME_LMV. But mti_big_lov_used is set if the xattr is XATTR_NAME_LOV. So the xattr is XATTR_NAME_FOOBAR - mti_big_lov will get used but mti_big_lov_used will not get set. We should fix this as well.
mti_big_lov_used, and mti_big_lmv_used are set specifically when we get the stripes associated with XATTR_NAME_LOV or XATTR_NAME_LMV and are subsequently checked. The generic buffer can be used with any "name", and no specific data is saved, so there was no use for mti_big_generic_used.
Change the format string instead of casting.
Same.
I still think it'd be useful to have an LASSERT(info->mti_big_generic_used == 0).
These could all be lu_buf?
These are not lu_bufs. lu_buf->buf is set to these values after the memory is allocated and pointed to by these fields.
They aren't currently, but they probably should be. An lu_buf is just a pointer and a size. A lot of the code handling mti_big_lov/lmv/acl/generic seems to be reimplementing lu_buf methods for no reason.
LU-19094 mdt: Use a new generic mti big buffer to get pfid Added new generic big buffer, and use that when getting pfid and pfid_name, to avoid any potential overwrite conflicts since the big lov and big lmv buffers are saved in mdt_attr pointers. Refactored the code to use lu_buf in thread info instead of using mti_big_*, and mti_big_*size. This allows using the lu_buf methods to allocate and free. Signed-off-by: Vandana Rungta <vrungta@amazon.com> Change-Id: I8b3922c5409138db872b4819b2c4e7023613dd56
| unique failing test | history |
|---|---|
| sanity-sec@zfs:test_25b | seen in 12 other reviews |
Is the '<' correct?
Oh, no this is not correct.
LU-9641 mdt: Add kernel doc style for MDT (4) This patch converts existing functional comments to kernel doc style comments and removes '/**' for comments which is not meant to be a kernel-doc comment Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Change-Id: I2673917fc660ba8ec7d5b9ed63376c3f882c83dc
| unique failing test | history |
|---|---|
| conf-sanity1@zfs:test_24a | seen in 1 other review |
| conf-sanity1@zfs:test_24b | seen in 1 other review |
| recovery-small@ldiskfs+DNE:test_18c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| replay-single2@ldiskfs+DNE:test_100a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanityn@zfs:test_51c | seen in 2 other reviews |
LU-18595 osd-ldiskfs: use local fake file for iteration
LU-13783 introduced the alloc_file_pseudo() for directory iteration.
It leads to many file descriptors for a kernel and a special
logic to drop it LU-16973.
One of the reason of alloc_file_pseudo() was a security_alloc() call.
However we could initialize iteration like kernel and skip
security checks for a pseudo files.
Lustre-change: https://review.whamcloud.com/57574
Lustre-commit: 642009da4e03a7f56694a368a7e4ea3584428e02
HPE-bug-id: LUS-12253
Fixes: b0f150eba4c2 ("LU-13783 osd-ldiskfs: use alloc_file_pseudo to create fake files")
Signed-off-by: Alexander Boyko <alexander.boyko@hpe.com>
Change-Id: I67d95d84913520b088578923841065e5b1d8b6df
Reviewed-by: Andrew Perepechko <andrew.perepechko@hpe.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
| unique failing test | history |
|---|---|
| sanity1@zfs:test_27cc | seen in 2 other reviews |
| sanity1@zfs:test_27ce | seen in 2 other reviews |
| sanity-lfsck@ldiskfs+DNE:test_11b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-pfl@ldiskfs+DNE:test_21b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-pfl@ldiskfs+DNE:test_23e | seen in 3 other reviews |
| sanity-pfl@zfs:test_20a | seen in 8 other reviews |
| sanity-pfl@zfs:test_20b | seen in 2 other reviews |
LU-17848 osd-zfs: remove osd_ladvise()/falloc() These are implemented as stub functions that return EOPNOTSUPP. Remove the functions and add a check in the corresponding dt functions instead. Test-Parameters: trivial Test-Parameters: trivial fstype=zfs Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: I6fad0a9ca8b07e3d09701e71773dc896a3845b9e Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/55608 Tested-by: jenkins <devops@whamcloud.com> Tested-by: Maloo <maloo@whamcloud.com> Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Reviewed-by: James Simmons <jsimmons@infradead.org> Reviewed-by: Oleg Drokin <green@whamcloud.com> Lustre-change: https://review.whamcloud.com/55608 Lustre-commit: f1b39460a4712aa670567c8204b943f4423e6126 Signed-off-by: Dominique Martinet <asmadeus@codewreck.org>
| unique failing test | history |
|---|---|
| conf-sanity2@ldiskfs+DNE:test_49a | seen in 3 other reviews |
| replay-single1@zfs:test_90 | seen in 1 other review |
| sanity2@ldiskfs+DNE:test_64e | seen in 7 other reviews |
| sanity2@ldiskfs+DNE:test_64f | seen in 7 other reviews |
| sanity-pfl@ldiskfs+DNE:test_20c | seen in 1 other review |
| sanity-quota@zfs:test_13 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@zfs:test_52 | seen in 1 other review |
| sanity-sec@zfs:test_59b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
LU-16973 osd: adds SB_KERNMOUNT flag During umount mntput() is called. It uses delayed_mntput() function, and it could take much time to finish. A block device is occupied during delayed work. [ 8753.941980] Lustre: server umount XXX complete [ 8800.129136] sysrq: SysRq : Trigger a crash PID: 319306 TASK:XXXX CPU: 2 COMMAND: "kworker/2:0" #0 __schedule at ffffffff9754e1d4 #1 preempt_schedule_common at ffffffff9754e6fa #2 _cond_resched at ffffffff9754e72d #3 invalidate_mapping_pages at ffffffff96e72da5 #4 invalidate_bdev at ffffffff96f5d13c #5 ldiskfs_put_super at ffffffffc1c82e34 [ldiskfs] #6 generic_shutdown_super at ffffffff96f1bdcc #7 kill_block_super at ffffffff96f1bed1 #8 deactivate_locked_super at ffffffff96f1b784 #9 cleanup_mnt at ffffffff96f3b86b Let's use SB_KERNMOUNT flag during mount, it leads to synchronous mntput(). It also calls flush_delayed_fput during umount to finish delayed fput. Lustre-change: https://review.whamcloud.com/51731 Lustre-commit: eff11c8ce1f89f30dcc5af88b67b3d6c15a631a6 HPE-bug-id: LUS-11629 Signed-off-by: Alexander Boyko <alexander.boyko@hpe.com> Change-Id: Ia6729f6cbac85c3626562e946a4b96665a143714 Reviewed-by: Andrew Perepechko <andrew.perepechko@hpe.com> Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Reviewed-by: James Simmons <jsimmons@infradead.org> Reviewed-by: Neil Brown <neilb@suse.de> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-8 | RHEL 9.3/x86_64 | ran 4 tests. 1 tests failed: replay-dual. | session |
LU-10499 pcc: wait for in-progress attaches when remove PCC When remove a PCC backend from a client, it should wait for all in-progress attaches finished. Otherwise, it results in the failure of the PCC backend umount operation. The reason is that the PCC copy is referenced in the kernel, not used by any applications in user space and the tool "lsof" can not check whether the target PCC backend is used or not. EX-bug-id: EX-8027 Change-Id: I05b268e75841f9f17e77819ed20c85c78d7c6ad6 Signed-off-by: Qian Yingjin <qian@ddn.com>
| unique failing test | history |
|---|---|
| sanity2@ldiskfs+DNE:test_63a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_63b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_64a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_64c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@ldiskfs+DNE:test_64d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
There is also lr_lvb_mutex, do we need two separate mutex for the same resource? A mutex is 32 bytes vs. only 4 bytes for a spinlock.
Should lr_mutex and lr_lock be a union? Either we are confident that only one will be used at a time, or we have a bigger problem that they will not provide exclusion if different threads on the same node will be using different locks for the same resource.
(style) extra space before "="
LU-4801 ldlm: use mutex instead of spinlock on server side resources Since server side processing of resources during granting is potentially very cpu-intensive, it well might be that spinlock is improper choice and by using mutex we allow other threads to do something useful instead. Change-Id: I05129f07d32914ce68c30416f71ab92a4c581c53 Signed-off-by Oleg Drokin <oleg.drokin@intel.com>
| unique failing test | history |
|---|---|
| sanity2@zfs:test_63a | seen in 5 other reviews |
LU-12682 llite: make undeletable property generic As part of Gerrit change #35856 foreign symlink files/dirs had the property of being undeletable using unlink/rmdir, in order to avoid losing reference to external objects by mistake. This patch makes this property generic and available to any Lustre file/dir. Signed-off-by: Bruno Faccini <bruno.faccini@intel.com> Change-Id: I252ac6edba506b3f866c74cdd7b90ae6747adaf2
LU-14758 ptlrpc: add timer for distributed transactions
Add a timer "tdtd_timer" for distributed transactions, if a
distributed transaction doesn't commit in time (3 * OBD_TIMEOUT),
dump the transaction to console to help understand what went wrong.
Besides, if a committed distributed transaction failed to get
canceled, also print warning on console.
Add a tunable to dump the first distributed transaction to console:
"lctl set_param mdt.<MDTDEV>.distribute_txn_dump=1"
Signed-off-by: Lai Siyao <lai.siyao@whamcloud.com>
Change-Id: Ifa9a56ed031d9e12658743200108631441e16f7b
(style) prefer (( ... )) for numeric comparisons
(style) prefer (( ... ))
Do we have equivalent nodemap-based root squash tests somewhere? It would also be useful to update the LOM to indicate that this set_param/conf_param mechanism is deprecated and to use nodemap instead (preferably referencing a section that explains the details of how to do it).
We do. See for instance sanity-sec test_15 and test_17. Regarding LOM, let's discuss in dedicated patch #46740.
Is it possible to create a test to test that we can still modify legacy root squash settings? Perhaps using a fail_loc to disable the new check? I get this slight nervous feeling testing only one direction that we might break this in some distant future :)
To be clear 'using a fail loc to disable the new check' so we can create the legacy setting for testing
It makes sense, I will add this fail_loc and update the test.
LU-15656 sec: deprecate legacy root squash The legacy root squash mechanism relies on 2 parameters: - the root_squash parameter specifies the UID and GID to which the root user is squashed when accessing the Lustre file system; - the nosquash_nids parameter specifies the set of clients to which root squash does not apply. This legacy mechanism has become redundant with the ability provided by the nodemap feature to implement root squash, in a much more flexible way. Sor for new file systems, prevent setting the root_squash and nosquash_nids parameters. For upgraded file systems, maintain the ability to change the already set values. Signed-off-by: Sebastien Buisson <sbuisson@ddn.com> Change-Id: I439f2ad2272592da73066c7f8edf8b7a360a2286
spin_unlock() without spin_lock()?
LU-17022 obdclass: start converting obd flags to a bitmap struct obd_device has multiple single-bit flags. This usage is not normal in Linux and requires a spinlock when there is any chance of concurrent access. This makes access from bh or irq context awkward as all spinlock need to be protected. It is more normal to declare an unsigned long, or a bitmap, and use set_bit, clear_bit, test_bit, etc. This patch starts the process with obd_attached and obd_set_up becoming flags OBDF_ATTACHED and OBDF_SET_UP. In one case test is followed by setting the flag to zero. This is now done with test_and_clear_bit(), so the lock isn't needed. Test-Parameters: trivial Signed-off-by: Mr NeilBrown <neilb@suse.de> Change-Id: Id9a5c323cf088bf2cf4f94c8e81739053c959e8f
It would probably be useful to grab the time at the start, and add a single CWARN() at the end that prints the number of loops and elapsed time, so that this is useful even without kunit?
I was thinking about adding the timing check to the kunit test itself i.e. returning a KUNIT_FAIL() when things take too long.
Good that you have added this in. Back in the day we were even looking at printing the CDEBUG messages without any printk formatting (doing *all* of the binary->ASCII conversion in "lctl" when the debug log was converted/sorted) because the number formatting itself was showing on the CPU profiles. That effort was abandoned because tracking the printk formats vs. the binary dump was too complex to get right in the end, but it is still useful to understand the performance overhead of this.
The performance overhead of formatting seems huge. I ran this test with 1 billion statements. It took about 3 minutes 40 seconds with current debugging. It took the same amount of time with the most recent rev of my tracing patch (which still uses printf formatting). If you remove that single printf and have the tracepoint output a string literal, outputting 1 billions statements takes 0.5 seconds. The upstream implementation of trace_printk has some clever tricks to avoid useless formatting. We should be able to take advantage of that to get real performance improvements without any huge refactors.
Yes, the CDEBUG() macro is not evaluating the format string unless the message will actually be saved/printed (the cfs_cdebug_show() check before calling libcfs_debug_msg()).
I should probably restore this afterwards.
LU-17242 debug: CDEBUG performance testing To ensure that performance doesn't degrade from debugging changes, we must test performance. We do this by timing a kernel module. In the future, this test may be converted to use the kunit framework. But that change is far too large for this patch. This test was not added to the test package. I don't expect this test to be generally useful - it serves a very narrow goal. Test-Parameters: trivial Test-Parameters: testlist=sanity env=ONLY=62,ONLY_REPEAT=10,SLOW=yes Test-Parameters: testlist=sanity env=ONLY=62,ONLY_REPEAT=10,SLOW=yes Test-Parameters: testlist=sanity env=ONLY=62,ONLY_REPEAT=10,SLOW=yes Test-Parameters: testlist=sanity env=ONLY=62,ONLY_REPEAT=10,SLOW=yes Test-Parameters: testlist=sanity env=ONLY=62,ONLY_REPEAT=10,SLOW=yes Test-Parameters: testlist=sanity env=ONLY=62,ONLY_REPEAT=10,SLOW=yes Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: I273429b700bae080310994ff5e2a8e5a05b58eb5
I thought it made sense to have the OST inode checking be its own test, rather than add it into check_seq_oid(), so that it can easily test multiple settings for the parameter. Right now I've duplicated the logic of parsing "lfs getstripe" output to get the object's filename -- do you think would it be worthwhile to try to refactor this so that the 2 tests call some common function do to this?
does this need "skip parallel run"? I saw that the check_seq_oid() test (27z) has it. I wasn't sure if that's because the usage of "sync" might interfere with other tests, or something.
LU-13031 ofd: add jobid xattr to ost object
This stores the jobid of the process that creates an object in an
extended attribute in the OST inode for that object. The name of the
extended attribute is determined by a new sysfs parameter
"obdfilter.*.job_xattr". The default value is "user.job". A value of
"NONE" means that the jobid will not be stored.
This builds on 23a2db28dcf1 ("LU-13031 jobstats: store jobid in xattr
when files are created"), which stores the jobid in the MDT inode
for the file. Note that the jobid need not be the same on the MDT
inode and the OST inodes, because the process that creates a file
might not be the same process that performs the initial write to a
given stripe.
Signed-off-by: Thomas Bertschinger <bertschinger@lanl.gov>
Change-Id: I9ab1aa394def3869c8d87a252bd9f95962f214f6
LU-14315 tests: Increase fsx iteration to improve coverage Test-suite sanityn.sh test_16* is already running 2500 iterations of fsx. To increase coverage particularly for fallocate() call increase iteration from 2500 to 10000. Although this increases the runtime sightly it also greatly increase the coverage for the fsx runs. Runtime For testcase 16a fstype=ldiskfs --------------------------------------- Iteration:2500 Runtime:150s Iteration:10000 Runtime:350s Runtime For testcase 16a fstype=zfs --------------------------------------- Iteration:500 Runtime:40s Iteration:6000 Runtime:520s Test-Parameters: trivial testlist=sanityn Test-Parameters: fstype=zfs testlist=sanityn Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Change-Id: Idb04b7d52e58c7df56580604ddfefd80f38fc989
LU-18169 llite: wait unstable pages to be committed during umount The client must wait unstable pages to be committed to the stable storage during umount. If a data OBD is in disconnected state during umount, the client will wait for a certain time (30 seconds, by default) at most, and then force to deactive the OBD to cleanup the uncommitted unstable pages. Otherwise, it will fail the replay-single.sh/test_89. Signed-off-by: Qian Yingjin <qian@ddn.com> Change-Id: I307b5e6063f6d726e5f84018ebeecd58bac860ab
LU-17043 enc: fix osd lookup cache for long encrypted names
Fix osd lookup cache to support files with long encrypted names.
Those encrypted names can be up to 256 bytes, not NUL terminated.
Lustre-change: https://review.whamcloud.com/52016
Lustre-commit: e16d5d7d6fb274b22a76fcd5858849215550d4e0
Fixes: 29f8eb2a67 ("LU-16405 osd: lookup cache")
Signed-off-by: Sebastien Buisson <sbuisson@ddn.com>
Change-Id: Ica2329c8a0990395307a14fe9bb9d43db3b364ed
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
LU-16385 obdlcass: stop MGC before MGS drops a reference to MGC when MGS is being umounted so that MGC doesn't try to disconnected from a missing MGS which can take long and hurt HA. Lustre-change: https://review.whamcloud.com//49378 Lustre-commit: 817184a9788ae399dcd5cf53ae7c9801e4778a43 Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Change-Id: Ib15f1ca56c47201bf6e29c12b3f81a11e55944ca Reviewed-by: Mikhail Pershin <mpershin@whamcloud.com> Reviewed-by: James Simmons <jsimmons@infradead.org> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
LU-16235 hsm: check CDT state before adding actions llog
Don't allow HSM requests to be added to the actions llog when
cdt_state is in CDT_STOPPED/CDT_STOPPING as the CDT is unavailable, or
in CDT_INIT as any HSM requests in the llog may not have been fully
processed and so cdt_last_cookie may not have been set appropriately,
otherwise a colliding cookie value can be reused in
mdt_agent_record_add() and the assertions in
cdt_agent_record_hash_add() can be triggered:
"ASSERTION( carl0->carl_cat_idx == carl1->carl_cat_idx ) failed"
"ASSERTION( carl0->carl_rec_idx == carl1->carl_rec_idx ) failed"
Requests needed to implement the Remove Archive on Last Unlink (RAoLU)
policy are allowed when the CDT is shutdown, as those are safe
operations. They are also allowed during CDT initialization, even
though this can lead to the assertions being triggered, as doing so
maintains administrator expectations regarding file archives always
being removed when the RAoLU policy is enabled. This could possibly be
improved by e.g. failing when mdt_handle_last_unlink() is not able to
add an HSM remove request, or saving the requests in an llog so they
can be sent if the CDT is available later.
For the same reason, the llog needs to be processed before setting
cdt_state to CDT_RUNNING in the coordinator thread.
Lustre-change: https://review.whamcloud.com/48842
Lustre-commit: fe5706e0c19f96e4f821790004f05ab265002e9d
Change-Id: I4b5f5ee22f74827b31d8ed5917a8fc16e35d1f16
Signed-off-by: Nikitas Angelinas <nikitas.angelinas@hpe.com>
HPE-bug-id: LUS-8231, LUS-11064
Fixes: e26d7cc3 ("LU-14399 hsm: process hsm_actions in coordinator")
Reviewed-by: James Simmons <jsimmons@infradead.org>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
| unique failing test | history |
|---|---|
| replay-single@zfs:test_39 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| replay-single@zfs:test_41 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| replay-single@zfs:test_42 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lfsck@zfs:test_11b | seen in 1 other review |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-5 | RHEL 8.10 / x86_64 | ran 8 tests. 1 tests failed: lustre-rsync-test. | session |
LU-13048 mdd: allow release after a non-blocking migrate lfs setstripe -i0 file lfs hsm_archive file lfs migrate -n -i1 file lfs hsm_release file These actions lead to "Cannot send HSM request ...: Operation not permitted". This happens because of data version mismatch. This error is returned by mdt_hsm_release() when the data versions are not the same. This patch only corrects the non-blocking migrations. mdd_swap_layouts is updated to check and update the HSM archive version when possible. The new and old data versions are added as arguments to this function. If the old data version does not match the data version in the HSM attribute, we don't update the HSM attribute because we don't know what caused the inconsistency. During a swap between a volatile and a regular file, if both objects have an HSM xattr, mdd_swap_layouts was called from the MDT HSM layer (release and restore). In this case, we want to swap the HSM xattr (previously done using SWAP_LAYOUTS_MDS_HSM as a last argument to mdd_swap_layouts). If only the regular file has an HSM attribute, mdd_swap_layouts was called after a migration (blocking or not). In this case, we want to update the HSM archive version only if the file is not dirty and if the new data version is provided. Also, this patch removes the CL_LAYOUT event that was emitted for a release. Since a CL_HSM event with HE_RELEASE flag is also emitted, the CL_LAYOUT is unecessary. For "lfs swap_layouts", the operation is denied on 2 files with HSM xattr (HSM xattr swap will cause inconsistencies). With non-HSM file and archived file, the operation is allowed but the dirty flag is set on the HSM file. Add lustre_swab_close_data_special() to swab close_data fields inside the union (specific to some types of close). Add regression test sanity-hsm 607a, 607b and 607c. Lustre-change: https://review.whamcloud.com/49236 Lustre-commit: 94d02e5774cc0d9ca5c3c34d21c2698ab89f3a6d Test-Parameters: clientversion=2.15.4 testlist=sanity-hsm Test-Parameters: serverversion=2.15.4 testlist=sanity-hsm env=EXCEPT="114 409a" Test-Parameters: testlist=sanity-hsm env=ONLY=607,ONLY_REPEAT=15 Signed-off-by: Courrier Guillaume <guillaume.courrier@cea.fr> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com> Change-Id: I6e90131235f96255b636eea366ad0cef5f4f0b19 Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Reviewed-by: James Simmons <jsimmons@infradead.org>
LU-10499 pcc: abort data copy when clear PCC backend This patch adds an option "--abort" for "lctl pcc del|clear" command tools. With this option, the user will first set ATTACH_ABORTING flag on all in-progress attaching files, and then wait for them to abort the attache when remove a PCC backend from a client. Add sanity-pcc/test_108 to verify it. EX-bug-id: EX-8236 Change-Id: I4e2f3ec8866e9af45f4524a9f45ee418ef4cb5be Signed-off-by: Qian Yingjin <qian@ddn.com>
LU-10499 pcc: add wait option when remove a PCC backend In this patch, we add a "wait" option for the PCC tool when remove PCC backend from a client: lctl pcc del --wait $MOUNT $pcc_path lctl pcc clear --wait $MOUNT With this option, the caller must wait for all in-progress attaches finished when remove the PCC backend from a client. EX-bug-id: EX-8027 Change-Id: Ic8386329087a7129b0583fa823cbb50673893d0d Signed-off-by: Qian Yingjin <qian@ddn.com>
LU-10499 pcc: add --wait option for PCC detach command This patch adds "--wait" option for PCC detach command. PCC detach with this option must wait for in-progress attach on this file finished. Add sanity-pcc/test_107 to verify it. EX-bug-id: EX-8027 Change-Id: I63d52d514884b15a7b534d0f03deee441a12d3f1 Signed-off-by: Qian Yingjin <qian@ddn.com>
LU-10499 pcc: abort in-progress attach by PCC detach command A user may want to abort in-progress attach for some purposes such as freeing space for PCC backend. To support this operation, we add an "abort" option for PCC detach command to abort the in-progress attach. EX-bug-id: EX-8236 Change-Id: I49fb1c42838f8d7e9728a5c4c6f3d60e959b233b Signed-off-by: Qian Yingjin <qian@ddn.com>
LU-10499 pcc: wait for attach finished for detach command When detach a file from a PCC backend, this file may be still attaching state. At this time, we add a flag to wait for the attach finished (PCC_DEATCH_FL_ATTACHING_WAIT). After that, retry the detach. EX-bug-id: EX-8027 Change-Id: If85d95be744e3f7d6a07f880e78de5b68b579ed6 Signed-off-by: Qian Yingjin <qian@ddn.com>
LU-10499 utils: show pin information in 'lfs pcc state' command If xattr lustre.pin exists, show its content in 'lfs pcc state' command. EX-5249 utils: don't complain for missing lustre.pin Don't print an error when running "lfs pcc status" against an older server without the "lustre.pin" xattr returns EOPNOTSUPP. Was-Change-Id: Iab235b8be497386752915baeb31347cf8137eed0 EX-bug-id: EX-5249 Test-Parameters: trivial Change-Id: I867ea3b246fc3b7d10e166d754c081c8afc462d5 Signed-off-by: Lei Feng <flei@whamcloud.com> Signed-off-by: Andreas Dilger <adilger@whamcloud.com>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-8 | RHEL 9.3/x86_64 | ran 4 tests. 1 tests failed: replay-dual. | session |
LU-10499 pcc: open file for detach O_RDONLY llapi_pcc_detach_file is rdwr, but should just be rdonly. This means files can be attached but not detached if the client is mounted rdonly. The fix is just to open the file in detach with O_RDONLY. EX-bug-id: EX-7389 Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: I3e289ab52ff760a8ab84a209b968109517953b52
LU-10499 pcc: asynchronous PCCRO attach command support
Currently PCCRO attach via the command "lfs pcc attach" will block
during the data copying.
There is a requirement that this command can also do data copy
asynchronously. Thus we add an option "--async|-A" to the command
which will not block while the file data is being fetched.
Add sanity-pcc/test_{103, 104} to verify that it works correctly.
EX-bug-id: EX-6373
Change-Id: I6f31190c8b9e9b9876b34f8e484c6c8b7f16b6db
Signed-off-by: Qian Yingjin <qian@ddn.com>
LU-10499 pcc: output valid state for valid cached files There are two cases where the command 'lfs pcc state' reports 'none' for PCC status of a file: - File has not been cached at all into PCC. When the file is read, data will come from remote Lustre filesystem. - File was cached into PCC but system cache dropped on client later (e.g. 'sysctl -w vm.drop_caches=3'). When file is read, file layout version needs to be compared against remote file system. And if verion is matching, data will com from PCC. This patch adds a valid flag to distinguish between these two states. For the latter case, the command 'lfs pcc state' will output as follows: $ lfs pcc state /mnt/lustre/f105.sanity-pcc file: /mnt/lustre/f105.sanity-pcc, type: none, flags: valid Add sanity-pcc/test_105 to verify it works as expected. EX-bug-id: EX-7449 Test-Parameters: trivial testlist=sanity-pcc Change-Id: I1d729bfe550b1bde0e78e8b3ec8217cd598fb64c Signed-off-by: Qian Yingjin <qian@ddn.com>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-subtest-change | RHEL 9.3/x86_64 | ran 3 tests. 1 tests failed: sanity-pcc. | session |
LU-10499 pcc: add threshold to determine direct I/O during attach This patch adds the threshold tunable parameter to determine doing direct I/O or buffered I/O for data copying during attach: llite.*.pcc_dio_attach_threshold The default value is same as direct I/O size: 32MiB. And the usage of the parameter "pcc_dio_attach_size_mb" is deprecated, and use "pcc_dio_attach_iosize_mb" instead. EX-6682 build: add json-c-devel into lustre-dkms.spec.in While installing client DKMS package, json-c-devel package is required. This patch adds the package requirement into lustre-dkms.spec.in. Was-Change-Id: I72f7e23a8c1ec9edecfc69b2e8dda758f215b4e2 EX-6713 doc: man pages for asynchronous PCCRO attachment This patch updates the man pages for asynchronous PCCRO attachment for "lfs pcc attach -A" command. Was-Change-Id: I7757a9d0b66a3586abdc9053b73d69944561ffbd Test-Parameters: trivial EX-bug-id: EX-6468 EX-6682 EX-6713 Change-Id: I393d6a06523303e749192ba9978449c3d75886ae Signed-off-by: Qian Yingjin <qian@ddn.com>
| unique failing test | history |
|---|---|
| sanity-sec@zfs:test_7 | seen in 13 other reviews |
LU-12756 lnet: Restrict lnet_select_pathway to path selection Remove logic from lnet_select_pathway() that doesn't involve path selection. This code is moved to lnet_send(). Signed-off-by: Chris Horn <hornc@cray.com> Change-Id: If751e7119e7727ac9bc642ea5c5ca12b0cbf8270
LU-12756 lnet: Refactor lnet_select_pathway Refactor code to remove duplication. Get rid of send_data struct. A path is comprised of a local network interface (lnet_ni) through which we will send a message, and a (remote) peer network interface (lnet_peer_ni) to which we will send the message. The peer NI either belongs to the final destination or it can belong to a gateway (a.k.a LNet router). We need to distinguish between these situtions, so this information is also part of the path definition. As such, lnet_select_pathway is responsible for defining these three things: - The local NI - The peer NI - Whether the peer NI belongs to a router The path is recorded in the appropriate fields of the lnet_msg object. Test-Parameters: trivial Signed-off-by: Chris Horn <hornc@cray.com> Change-Id: Ie26def4fac0b2cfd67bf134fa7343c3ab5d46587
LU-12257 lnet: Add msg pointer address to debug messages Debug and error messages may be more useful in debugging problems if they include the address of relevant lnet_msg structs. Add this information to existing debug and error messages. Test-Parameters: trivial Signed-off-by: Chris Horn <hornc@cray.com> Change-Id: I49dd92c7a173964da792a4a67c5654f69e1d603d
LU-20162 obdclass: pin debugfs entries pin debugfs entries so a racing umount blocks awaiting for them to get closed/release and only then release internal structures those debugfs entries may access. Test-Parameters: fortestonly fstype=zfs Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Change-Id: Id049cf6e9d2767de5e0b197b184ae36940583411
| unique failing test | history |
|---|---|
| sanity-lnet@ldiskfs+DNE:test_164 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lnet@zfs:test_164 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity-lnet. | session |
| review-dne-subtest-change | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity-lnet. | session |
| review-dne-zfs-subtest-change | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity-lnet. | session |
(typo) "was ignore" -> "was ignored".
A little `is_nid_intf(intf, flags)` helper would avoid duplicating the logic here and on line 2229.
(defect) lustre_lnet_parse_interfaces() unconditionally does `nw_descr->nw_id = libcfs_str2net(<net after '@'>)`, so parsing the `nid:` value here overwrites the nw_id already set from `net type:`. For a block like
net type: tcp1
nid: X@tcp2
nw_id becomes tcp2, then `net = libcfs_net2str(nw_id)` and yaml_lnet_config_ni() emit `net type: tcp2` with `nid: X@tcp2`. The requested tcp1 is silently discarded and the NI is created on tcp2 rather than the config being rejected.
This also means the new guard in lnet_dyn_add_ni() (api-ni.c:4034, `nid_net != net_id`) can never fire for tool-generated input: because net_id is derived from the same nw_id the nid overwrote, they always match by the time the request reaches the kernel. So the check whose comment says it catches "nid: IP@tcp2 with net type: tcp1" is unreachable for exactly that case. Worth either rejecting the mismatch in the parser or not overwriting nw_id when `net type:` was already given.
(Serguei raised this on an earlier patchset; it still applies to the current revision.)
(defect) nid_intf and real_intf keep only the last matching entry, but nw_intflist can hold the descriptors of several NIs. handle_net_config_sequence() only flushes a block when map_depth reaches 0, so every entry of one net's "local NI(s)" sequence accumulates into the same list before yaml_lnet_config_ni() is called once.
For
net:
- net type: tcp
local NI(s):
- nid: 192.168.0.1@tcp
interfaces:
0: eth0
- nid: 192.168.0.2@tcp
interfaces:
0: eth1
the list is [192.168.0.1@tcp, eth0, 192.168.0.2@tcp, eth1], so nid_intf ends up as 192.168.0.2@tcp and both emitted NIs carry that nid: eth0 is paired with eth1's address, and the second NI repeats the same nid. lnet_inet_select() rejects the first one with -EINVAL because eth0 does not own that address, so the whole import fails.
A block that mixes a nid-only NI with an interfaces-only NI is merged into a single NI request for the same reason.
This is reachable outside import too: `lnetctl net add --nid a@tcp --if eth0,eth1` builds the same list and now emits a@tcp twice.
Since `lnetctl export` (without --backup) prints nid: for every NI and the man page states export output can be fed back to import, a multi-rail net that round-tripped before this patch stops working. Should the nid be paired with the interface of its own "local NI(s)" entry rather than picking one nid for the whole net?
I'd recommend to add a test where the "net type" and the net specified in the nid do not match. Currently it looks like "net type" may get silently overwritten in lustre_lnet_parse_interfaces(), so the following may get accepted (it should fail): - net type: tcp1 - nid: 192.168.122.40@tcp2
It is done in https://review.whamcloud.com/c/fs/lustre-release/+/66707 because it was fixed there.
typo net -> nid?
typo nid. -> nid
(typo) "inteface" -> "interface".
LU-19624 lnetctl: import respects explicit nids When importing a net config, "nid:" was ignored. Consequently, it was not possible to mix IPv4 and IPv6 since IP version depended only on "--large" option from configuration step. With this patch, lnetctl will consider "nid:" when importing and keep IP version. This patch adds some tests to check correct behavior, but also to check that the imported file is coherent: nid has the right net and nid represent the right interface. Assisted-By: Claude Sonnet 4.5 <noreply@anthropic.com> Test-Parameters: trivial testlist=sanity-lnet Signed-off-by: Cyril Bordage <cbordage@whamcloud.com> Change-Id: I3767f9b46c98864b736c313f90f6afd93f283860
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-arm retesting | RHEL 8.10 / x86_64, Rocky 9.8 / aarch64 | ran 8 tests. 1 tests failed: lnet-selftest. | session |
why don't use a list_move ?
(style) externs should be avoided in .c files
(style) I'm not sure why this is being declared the line before the function itself?
(style) `ptlrpc_request_addref()`
(style) consistent `{ ... }` on both branches of if-else block
(style) `ptlrpc_request_addref()`
(style) consistent `{...}` on both branches
LU-19869 ptlrpc: OBD_FREE_LARGE_ATOMIC() in ptlrpc_free_bulk() ptlrpc_free_request() may result in vfree() which must not be called with a spinlock held as it can sleep - use OBD_FREE_LARGE_ATOMIC() instead. Test-Parameters: fortestonly Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Change-Id: I7260f68974184e4b3061911ea670dd152a8355b8
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | RHEL 9.7 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
| review-dne-zfs-part-5 failed 2× | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
| review-ldiskfs-arm | RHEL 8.10 / x86_64, Rocky 9.8 / aarch64 | ran 8 tests. 1 tests failed: lnet-selftest. | session |
LU-20433 utils: fix 'lfs find ! -m MDTIDX' negation
LU-16622 unified the handling of the lfs-find -m/-i/-O options into
a single case, but in doing so it dropped the
'param.fp_exclude_mdt = !!neg_opt;' assignment that used to live
inside the 'if (c == "m")' block.
The MDT matcher in check_mdt_match() (liblustreapi_pfind.c) still
reads fp_exclude_mdt, so with it always 0 a negated MDT-index query
loses its negation: 'lfs find ! -m MDTIDX' returns the files ON <idx>
instead of those NOT on it (exactly what 'lfs find -m MDTIDX'
returns). The -i and -O paths use fp_exclude_obd and are unaffected.
Restore the fp_exclude_mdt assignment to the MDT block and move
'param.fp_exclude_obd' to the else block for OSTs so that they can
be set independently. Add sanity test_56vb to exercise the negation
on a DNE filesystem.
Fixes: 70d8107c48ab ("LU-16622 utils: 'lfs find --ost' supports index range")
Assisted-by: ClaudeCode:Fable-5.1
Signed-off-by: Sohei Koyama <skoyama@ddn.com>
Change-Id: I80ff23f5678c3a9cffe7648db1c873c918647110
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-4 | RHEL 9.7 / x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
| review-dne-zfs-part-1 | RHEL 10.1 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-2 | RHEL 9.8 / x86_64 | ran 11 tests. 1 tests failed: sanity-sec. | session |
| review-zfs | RHEL 8.10 / x86_64 | ran 8 tests. 1 tests failed: sanity-quota. | session |
The autoconf test added here needs both DMU_DIRECTIO and DMU_UNCACHEDIO, and the comment next to it in lustre-build-zfs.m4 calls it a "ZFS 2.4 check". If DMU_UNCACHEDIO only appeared in 2.4, then HAVE_DMU_DIRECT stays undefined on 2.3 and the whole feature compiles out there, which does not match "As of OpenZFS 2.3". Should the uncached-IO probe be a separate test so 2.3 still gets plain direct IO?
This says the mechanism has no granularity and that "standard" means direct IO is only done when requested, and further down that the default behavior is unchanged unless direct=always is set. osd_dmu_use_direct() does something different: under ZFS_DIRECT_STANDARD it returns B_TRUE unconditionally when od_nonrotational is set, and otherwise whenever the IO or file size crosses od_writethrough_max_iosize / od_readcache_max_iosize / od_readcache_max_filesize. Combined with the new od_nonrotational auto-detection at mount, an existing pool can switch to direct IO for all OST traffic without any property change. Can the message describe the actual "standard" policy?
(typo) "advantge" -> "advantage". Also "honor these setting" a few lines up reads better as "these settings".
Several user-visible hunks are not described here: the new `readcache_max_io_mb` and `writethrough_max_io_mb` sysfs tunables, the automatic od_nonrotational detection (which also changes the OS_STATFS_NONROT flag reported to clients), the widening of `lnb_dio` to 2 bits in lustre/include/obd.h, and the new folio_lock()/folio_unlock() around the cached dio folios. Could the body cover those, or should any of them be split out?
This is osd-zfs only, and the default CI run is ldiskfs. Worth adding a `Test-Parameters: fstype=zfs ...` line so the new paths actually get exercised before landing.
You might find https://review.whamcloud.com/c/fs/lustre-release/+/57453/1 interesting. We can wire up ZFS DIO to be per-IO, similar to what ldiskfs does.
(style) `flags2` is set but never used, which will warn. The other tests in this file add a `(void) flag;` for exactly this - or just use it in one of the calls below.
(minor) The field is now tri-valued (0 none, 1 direct/fake folio, 2 unaligned - use DMU_UNCACHEDIO), but the comment still only describes the TLS-page meaning, and value 2 is not a TLS page at all. Worth spelling the three values out here since osd-ldiskfs also uses this field.
(minor) This comment is now stale - od_nonrotational is no longer "only set if explicitly set by the user", osd_mount() computes it. Worth updating while the behavior is changing.
The unlock happens after the put. folio_alloc() in osd_dio_get_folio() leaves a single reference, so folio_put() here frees the folio and folio_unlock() then touches freed memory. Even with the order swapped, PG_locked is in PAGE_FLAGS_CHECK_AT_FREE, so freeing a still-locked folio trips "BUG: Bad page state". The unlock has to come before the put.
What I think we want is to only return that this is a non-rotational pool when there are no rotational devices (at all) in the vdev hierarchy. The vd_nonrot value is propagated to the top-level parents, so I think something like this should work (untested):
```
static int
osd_detect_nonrotational(spa_t *spa)
{
vdev_t *rvd = spa->spa_root_vdev;
for (int i = 0; i < rvd->vdev_children; i++) {
vdev_t *vd = rvd->vdev_child[i];
if (vd->vdev_islog || vd->vdev_ishole)
continue;
if (vd->vdev_nonrot == B_FALSE)
return (B_FALSE);
}
return (B_TRUE);
}
```
This function was the biggest change compared to the earlier version of ZFS DIO. I think this is correct, but this needs a second look.
LU-14407 osd-zfs: add basic direct IO support
As of OpenZFS 2.3 direct IO is supported. This functionality allows
the zfs-osd to optionally bypass the ARC cache and perform the I/O
directly to the storage. This may improve performance when using a
fast flash based pool or large disk based pool.
The new "direct" dataset property can be used to enable direct IO
for the OSD. When set to "always" the DMU_DIRECTIO flag will always
be passed to the new DMU interface to request direct IO. When set
"disabled" direct IO will never be requested.
This initial mechanism provides no granularity so the long term
intent is to extend Lustre to only request direct IO when it makes
sense. This way the property can be left at its default value of
"standard" which indicates direct IO should only be done when
requested. However, supporting the "always" and "disabled" values
is important to make sure Lustre datasets honor these setting in
the same way as the ZFS Posix Layer. Hopefully, we'll be able to
take advantage of some of the existing Lustre/ldiskfs tunings to
control when direct IO should be performed.
The behavior of the existing DMU interfaces used by Lustre has not
been changed for OpenZFS 2.1. This means versions of Lustre without
this change can still be built against OpenZFS 2.1. They will simply
not be able to take advantge of the direct IO support.
Furthermore, new versions of Lustre with this change are compatible
with all OpenZFS releases. Again the default behavior will remain
unchanged unless the "direct=always" dataset property is manually set.
For reference, the new ZFS interfaces which can be used to request
direct IO by passing the DMU_DIRECTIO flag are the following:
- dmu_read_abd()
- dmu_write_abd()
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: MigeljanImeri <mimeri@lanl.gov>
Change-Id: I5a651a196f716feac671b71010733ea129543d38
LU-13428 llite: correct sync_file_range arguments OBD_OBJECT_EOF is a 64 bit unsigned value, but loff_t used for fsync is a signed value, so LLONG_MAX is actually the maximum allowed size for fsync/cl_sync_file_range. Several callers passed OBD_OBJECT_EOF as the end of a whole-file sync, which is -1 once stored in the signed loff_t of cl_fsync_io. The OSC only copes with that because osc_io_fsync_start() maps the value back to CL_PAGE_EOF and osc_cache_writeback_range() special-cases the wrapped end. The -1 also goes out on the wire unchanged: osc_fsync_ost() copies it into o_blocks, and the OST hands it to vfs_fsync_range() as the end offset, where an end below the start means nothing is synced. Correct all cl_sync_file_range() callers to use LLONG_MAX instead of OBD_OBJECT_EOF, reject a negative start or end with an error message so a caller cannot silently reintroduce the same mistake, and drop the OBD_OBJECT_EOF mapping in osc_io_fsync_start(), which nothing can reach any more. Test-Parameters: envdefinitions=SLOW=yes,ENABLE_QUOTA=yes clientcount=2 osscount=1 ostcount=8 mdscount=2 mdtcount=4 fstype=zfs testlist=racer,racer,racer Test-Parameters: envdefinitions=SLOW=yes,ENABLE_QUOTA=yes clientcount=2 osscount=1 ostcount=7 mdscount=1 mdtcount=1 fstype=zfs testlist=racer,racer,racer Assisted-by: ClaudeCode:claude-fable-5-1 Assisted-by: ClaudeCode:claude-opus-5 Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: I71175d92f71c2f7e9f0b3df855e60db921b8acc3
(minor) The body doesn't mention that the accepted input shape for a 'net:' block gets stricter: 'local NI(s):' is now mandatory, and 'interfaces:'/'nid:' directly under 'net type:' are rejected instead of accepted. That is a user-visible change to what an existing hand-written yaml file may contain, so it would be good to state it here.
(style) This isn't a bug, but the rename drops the per-struct prefix that `ip2nets_net`/`ip2nets_ip_ranges` had; `net` and `ip_ranges` are generic enough that a grep for either is not very useful. Something like `l2n_net`/`l2n_ip_ranges` would keep the convention while still being shorter than before.
(style) Not a bug, but the continuation is still aligned for the old, shorter `init_ip2nets_tunables(` name; it no longer lines up with the open paren. Same for the caller-side wrapping if the patch is refreshed.
(defect) cur_ni is only ever allocated in the MAPPING_START branch guarded by !is_ip2nets_sequence, so for an ip2nets sequence it is always NULL and every rule that lists interfaces now fails here with -EINVAL.
ip2nets:
- net-spec: tcp
interfaces:
0: eth0 <- "'interfaces' only valid inside 'local NI(s):'"
ip-range:
0: "*.*.*.*"
That is the form documented in the header comment just above the function (unchanged by this patch), the form lustre_lnet_match_ip_to_intf() expects, and the form the new test_172 uses, so `lnetctl import` of an ip2nets file looks like it now just errors out.
Should the guard be restricted to the net: path, with ip2nets still parsing into net_config.net.nw_intflist? e.g.
if (!cur_ni && !is_ip2nets_sequence)
... reject ...
list = cur_ni ? &cur_ni->nie_descr.nw_intflist :
&net_config.net.nw_intflist;
LU-20000 lnetctl: bad CPTs/tunables during import
This is for netlink API. This fixes the same issues as for the old API
and uses the same tests.
ip2nets is also fixed but has some limitations: the format doesn't
allow to specify different tunables/cpts for interfaces in the same
net. If, at some point, it is needed, we will have to extend the
format.
Assisted-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Test-Parameters: trivial testlist=sanity-lnet
Fixes: 1b3c10b835ca ("LU-19386 lnet: use ip2nets handler for net sequence")
Signed-off-by: Cyril Bordage <cbordage@whamcloud.com>
Change-Id: I101c7a320d325413c387c5a15ac33ca8eff3e4a8
(suggestion?) It would be easier to parse this from scripts if the delays were named differently, rather than always `delay_sec:`, like `reconnect_sec:` and `replay_req_sec:` and `replay_lock_sec:`. However, if that is worse for the YAML consumer to parse then it's OK to leave as-is.
LU-18681 target: extend recovery stats to all phases
Commit 9fa50dbba6 measured only the reconnect phase of target
recovery. Extend the same counters to req_replay and lock_replay so
that a slow recovery can be attributed to the phase that caused it.
Widen the existing parameters rather than adding a parallel set per
phase, and drop the now-inaccurate phase from their names:
recovery_reconnect_histogram -> recovery_histogram
recovery_reconnect_top -> recovery_top
exports/<nid>/reconnect_delay -> exports/<nid>/recovery_delay
recovery_reconnect_top_n -> recovery_top_n (module parameter)
Each now reports all three phases. target_recovery_thread() stamps the
req_replay and lock_replay transitions, and target_recovery_phase_tally()
records the client's delay behind the same filesystem-client gate used
before, so server-to-server connections stay out of the statistics.
Delays are measured from the start of recovery, so a later phase
includes the time spent in the earlier ones, and the difference between
two of them is the time the client spent in between.
Rename the man pages to match, and add replay-ost-single.sh test_13 to
cover the OST side.
Test result:
```
obdfilter.lustre-OST0000.recovery_histogram=
recovery_start: 1787621490
req_replay_start: 1787621532
lock_replay_start: 1787621533
recovery_finish: 1787621533
recovery_time: 43
reconnect_delay_seconds_samples: 4
client_reconnect_histogram:
- { phase_sec: 1, clients: 3, pct: 75, cum_pct: 75 }
- { phase_sec: 64, clients: 1, pct: 25, cum_pct: 100 }
req_replay_delay_seconds_samples: 4
client_req_replay_histogram:
- { phase_sec: 1, clients: 4, pct: 100, cum_pct: 100 }
lock_replay_delay_seconds_samples: 4
client_lock_replay_histogram:
- { phase_sec: 1, clients: 4, pct: 100, cum_pct: 100 }
```
Signed-off-by: Jinshan Xiong <jinshan.xiong@gmail.com>
Change-Id: I5a8e2374c4754d5a7c090143f65d6db0a376a150
| failed enforced test | platform | detail | |
|---|---|---|---|
| full-dkms failed 4× | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
LU-20704 build: Fix O2IBDIR path matching
The "$" in "${O2IBDIR}$" applies only to the last pattern, so
"/ofa_kernel" matched as a plain substring and could select a
wrong path such as /usr/src/ofa_kernel-<version>, an unconfigured
source tree. EXTRA_OFED_CONFIG then pointed there and the OpenIB
gen2 compile test failed.
Match /ofa_kernel and /openib only as complete path components,
i.e. followed by "/" or the end of the line.
dkms.mkconf and debian/dkms.conf.in open-code the same detection,
so sync them, including the /usr/src/ofa_kernel fallback and -d
check from commit 6c93398e6e3d: without it paths comes out empty
and dkms.conf would register in-kernel-o2iblnd instead of o2iblnd.
Fixes: 3a7930e63c15 ("LU-16050 build: replace ofed_info with dpkg/rpm")
Test-Parameters: trivial testgroup=full-dkms
Signed-off-by: Xiao Yang <xyang@ddn.com>
Change-Id: Iff704e84818f1e4e3a398c9addacf0fe1a71194b
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-5 | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
| review-ldiskfs-arm | RHEL 8.10 / x86_64, Rocky 9.8 / aarch64 | ran 6 tests. 1 tests failed: sanity. | session |
These references should all be `Fixes:` lines.
Same
(minor) The body presents the shallow search as the whole solution, but the patch also changes the failed: path in cYAML_build_error() to clear *root instead of the local r. That is the part that actually stops the caller from touching the freed tree - the shallow search only removes one way of reaching failed:, and an allocation failure in the cYAML_create_object()/create_number()/create_string() calls below still gets there. Worth a sentence so the hunk isn't a surprise to a reader.
(minor) test_171 imports one net entry containing two `local NI(s)` entries, not several net entries. The lookup that used to stray is done on the local-NI sequence item:
while (cYAML_get_next_seq_item(local_nis, &local_ni) != NULL) {
intf = cYAML_get_object_item(local_ni, "interfaces");
so the neighbour whose value got picked up is the next NI under the same net, not the following net entry. The failure description near the top says "the following net entry" too. Since the test was reworked to the local-NI form, could the wording follow it?
(minor) The cYAML_build_error() hunk fixes a second, independent bug. `r` is just a local copy of `*root`, so `cYAML_free_tree(r); r = NULL;` has always left the caller holding a freed tree - jt_import() then does cYAML_print_tree2file(stderr, err_rc) plus cYAML_free_tree(err_rc) at `err:`, and llapi_pcc_yaml_cb_helper() does the same. That is reachable from any of the cYAML_create_object()/create_number()/create_string() failures below, not only from the `goto failed` the recursive lookup could reach, and it did not come from c906ab9c88ef. A second trailer would point at where it started:
Fixes: 0f753ead66cb ("LU-2456 lnet: DLC user space Configuration library")
This was asked for on patchset 4 (on the line that then carried the LU-20479 reference); the reference was dropped instead of being turned into a Fixes: line.
This long AI-generated comment is unnecessary. There is no value to describing how the code used to be broken, but is no longer that way.
Comments should describe the existing code and non-obvious issues or requirements, so something like:
Only search the direct children of the parent to avoid matching
unrelated nested nodes with the same name.
or similar.
(minor) "the current level" reads as the parent's sibling chain, which is precisely what this patch stops searching. Since pinning the semantics down is the point of the change, something like "searches the parent node itself and its direct children" leaves no room for that reading.
Similarly, it isn't useful to document in the code/test how it used to be broken, that can stay in the commit message. If we don't keep the AI comments under control the code will eventually be 10 lines of comment for every line of code and filled with useless old trivia instead of being helpful to the reader.
(minor) The * lands in the filename instead of acting as a glob: assignment doesn't expand it, and by the time cat > $yfile runs there is nothing to match, so the file is created literally as $TMP/sanity-lnet-171-*.yaml. It also becomes an "ambiguous redirect" the moment a second file matches the pattern. $TMP/sanity-lnet-$testnum.yaml would do what's intended and is still covered by cleanup_testsuite().
(defect) -eq isn't an arithmetic operator, so this is a syntax error rather than a comparison:
$ nids=1; (( $nids -eq 1 )) || echo fail
bash: ((: 1 -eq 1 : arithmetic syntax error (error token is "1 ")
fail
(( )) returns non-zero on the error, so error "expected exactly 1 NI ..." fires on every run and test_171 fails with or without the cyaml.c fix - which also means the fix has no working regression coverage. (( nids == 1 )) is the form used elsewhere in the suite.
LU-20595 lnet: cYAML_get_object_item() back to shallow search
cYAML_get_object_item() was originally implemented
to search only the direct children of the given node.
A previous change turned it into a recursive search
that also walks into child and sibling subtrees.
This can return an unrelated nested node that happens to
share the same name as the requested key, e.g. an "add" entity
under an "ni" error node matching the "add" command.
This caused two kinds of failures:
1. Misconfiguration in lnetctl:
an entry missing a key could silently pick up
the value of a neighbouring or nested node with the same name
(e.g. the "interfaces" value of the following net entry).
2. A use-after-free in cYAML_build_error():
the recursive search could return a nested error entry
instead of the command node. Since
cYAML_create_seq_item() only handles CYAML_TYPE_ARRAY, control
fell through to the "goto failed" branch, which frees the error
tree and prints "fatal: out of memory", seen while running
"lnetctl import --old-api".
The solution is to restore the shallow search.
Only the direct children of the parent node are examined,
keeping the self-match on the parent node in the function,
as cYAML_get_object_child() don't have it.
Currently all call sites expect the direct-child semantics,
none rely on the recursive behaviour.
The failed: path in cYAML_build_error() is fixed as well.
Freed error tree through local copy "r" and set *root = NULL.
So to avoid the later jt_import() print and free the same tree
again and cause a use_after_free error.
Add sanity-lnet test_171 which imports a YAML with several
net entries where the first one is missing the "interfaces" key,
verifying that the following entry's "interfaces" value
is not picked up and the import succeeds.
Fixes: c906ab9c88ef ("LU-7734 lnet: configuration fixes")
Signed-off-by: Xiyang Wang <xiwang@ddn.com>
Change-Id: I27f2213dbdf6d2c2c5388f2eda3f7d2bc75edc73
| unique failing test | history |
|---|---|
| sanity-slow@ldiskfs+DNE:test_255c | seen in 1 other review |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-zfs | RHEL 8.10 / x86_64 | ran 8 tests. 1 tests failed: sanity-quota. | session |
The body opens mid-sentence as a continuation of the subject, so the patch has no statement of what it accomplishes and why before it describes how. Could it start with a short paragraph along the lines of "cfs_cpt_bind_workqueue() relied on apply_workqueue_attrs(), which is not exported ..."? Several parts of the diff aren't accounted for: - the new cfs_cpt_wq_cpu(), cfs_cpt_queue_work(), cfs_cpt_queue_delayed_work() and cfs_cpt_mod_delayed_work() helpers are not named anywhere, so this is hard to find later with `git log -S` - the swi_init_workitem() signature change and the new swi_cpt field in struct swi_workitem - the removal of compat_alloc_workqueue_attrs()/compat_free_workqueue_attrs()/compat_apply_workqueue_attrs() from lustre_compat/symbols.c - most importantly, that max_active changes meaning (per-pool to per-CPU) for every workqueue created through cfs_cpt_bind_workqueue() A `Test-Parameters:` line covering lnet-selftest would also be useful here given the change affects the LST work schedulers.
A second consequence of the bound workqueue: max_active is applied per pool_workqueue, and a bound wq has one per CPU where an unbound wq has one per node. So `nthrs` silently turns from a system/node-wide ceiling into a per-CPU ceiling, multiplying effective concurrency by the CPU count. That hits obd_zombid (cfs_cpt_number()), ll-readahead-wq and tgt_nid_notifier (1) - see the tgt_mount.c comment.
"The @tbl/@cpt the caller binds to here must match what it later passes to cfs_cpt_queue_work()" describes a binding this function no longer performs - `tbl` and `cpt` are now unused and the body is just alloc_workqueue() plus ERR_PTR() wrapping. Should the unused parameters be dropped, and the name changed to something that doesn't claim a CPT binding?
Dropping WQ_UNBOUND makes this a per-CPU workqueue, and cfs_cpt_wq_cpu() below returns the queueing CPU whenever it is inside the partition. So work now runs on the CPU that submitted it rather than being spread over the partition's cores by the scheduler. That looks like it undoes what the callers wanted. ll-readahead-wq is sized `cfs_cpt_weight(cfs_cpt_tab, CFS_CPT_ANY) >> 1` and exists so the reader thread doesn't do the readahead itself - kickoff_async_readahead() even says "allowing the user thread to do fast i/o" - but the work item now lands on the reader's own CPU. lst_test_wq[i] is sized `cfs_cpt_weight(cpt) - 1` for the same reason and gets confined the same way. Would keeping WQ_UNBOUND and still calling queue_work_on() work better? For an unbound wq the cpu argument selects the pool for that CPU's node/pod, so you keep the partition affinity and still get parallelism across its cores, with no need for apply_workqueue_attrs().
This isn't a bug, but a one-line note on why raw_ is used here (the result is only a placement hint, so migration between the read and queue_work_on() is harmless) would save the next reader a trip to check whether preemption is disabled.
This check can't fire. cfs_cpt_cpumask() returns `&cptab->ctb_cpumask` or `&cptab->ctb_parts[cpt].cpt_cpumask` on SMP, and the !CONFIG_SMP stub returns cpu_online_mask - never NULL. It also doesn't protect against a NULL @tbl, since in that case cfs_cpt_cpumask() hands back a small non-NULL offset and cpumask_test_cpu() faults on the next line anyway. Dropping it would be clearer.
cpumask_any_and() is `#define`d to cpumask_first_and(), so the "fall back to any online CPU in the partition" in the comment above is really "always the lowest-numbered online CPU". With a bound workqueue every caller outside the partition then funnels onto that one CPU. cpumask_any_and_distribute() would match the comment's intent.
srpc_serv_is_framework(scd->scd_svc) is evaluated twice in adjacent ternaries. If the patch is refreshed, a local `bool fw = srpc_serv_is_framework(scd->scd_svc);` would read better and keep the two selections obviously in step.
"CFS_CPT_ANY items ... are left to the core" doesn't match cfs_cpt_wq_cpu(): for CFS_CPT_ANY it uses cptab->ctb_cpumask, which normally contains the current CPU, so it returns raw_smp_processor_id() rather than WORK_CPU_UNBOUND. Framework RPCs on lst_serial_wq get a concrete CPU like everything else.
tgt_nu_wq is created with nthrs 1, which used to mean at most one NID-update work item in flight. With the workqueue now bound, max_active 1 is per-CPU, so up to num_online_cpus() of these can run at once. lnet_notify_net_update() invokes the callbacks under ln_api_mutex, so a net delete and a subsequent net add are queued in order, but if they are queued from different CPUs they now execute concurrently. Two tgt_nid_notifier() runs each send a full NID snapshot via tgt_nids_notify(), so the MGS/targets can end up with the older snapshot last. Was losing that serialization intended?
(minor) This patch removes the last user of this header from this file - compat_alloc_workqueue_attrs()/compat_free_workqueue_attrs()/compat_apply_workqueue_attrs() are gone, and nothing left here touches __flush_workqueue() or HAVE_FLUSH___WORKQUEUE. If the patch is refreshed, the include can go too.
LU-18687 misc: use bound workqueues ... and adjusted callers to schedule work in a CPT aware manner, so we don't need unexported symbols from Linux. Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: Ia15e62d11d362ecccafb6cadd1c19853c00d0f6e
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
(minor) The bullet list covers most of the diff, but the LCFG_HDR_SIZE() rewrite in lustre_cfg.h has no matching entry. That one is a different complaint from the seven listed: offsetof() with a runtime array index is not a constant expression in C++, so offsetof(struct lustre_cfg, lcfg_buflens[(count)]) is rejected outright rather than warned about. Worth a bullet so the hunk isn't read as unrelated. Same for the arr_tail rename in lustre_idl.h, which the body mentions only as the cause of the g++ error.
(minor) Is the rename needed? Once hai_data[] is gone under C++, arr_hai is a complete type and a member after it is legal again; keeping the name as arr_tail compiles clean under both g++ and gcc with -Wall -Werror. Nothing in the tree references the field either way. This is an installed uapi header, so the rename is an API change for out-of-tree consumers, and arr_do_not_use no longer says the field is the llog_rec_tail. Would keeping arr_tail and moving the warning into the comment work as well, e.g. "record tail, for sizeof() only - arr_hai is variable length so the real tail is not here"?
(typo) pre-existing, but since this line is being touched anyway: "for_sizezof_only" should be "for sizeof() only".
Adding evidence to the open question above about dropping the flexible array under C++.
This header already carries a C++ spelling for exactly this case, at the top of the file:
#ifndef DECLARE_FLEX_ARRAY
#ifdef __cplusplus
#define DECLARE_FLEX_ARRAY(T, member) T member[0]
and it is already used for other variable-length members here and in lustre_idl.h. `char hai_data[0]` is not a flexible array member, so it can sit before `arr_do_not_use` inside `struct llog_agent_req_rec` without the g++ error described in the commit message, and `sizeof(struct hsm_action_item)` stays 72 either way.
So `DECLARE_FLEX_ARRAY(char, hai_data)` looks like it would fix the same build error while keeping the member visible to C++ callers. As written, a C++ translation unit sees a different `struct hsm_action_item` than a C one, and `offsetof(struct hsm_action_item, hai_data)` - which wiretest.c and wirecheck.c both use - has no C++ equivalent. Would that spelling work here?
c++ can't handle flex array? Is this safe to do?
No, the issue is that `struct hsm_action_item` is included inside `struct llog_agent_req_rec` as arr_hai field:
```
struct llog_agent_req_rec {
struct llog_rec_hdr arr_hdr; /**< record header */
__u32 arr_status; /**< status of the request */
/* must match enum
* agent_req_status
*/
__u32 arr_archive_id; /**< backend archive number */
__u64 arr_flags; /**< req flags */
__u64 arr_compound_id; /** < compound cookie,
* ignored
*/
__u64 arr_req_create; /**< req. creation time */
__u64 arr_req_change; /**< req. status change time */
struct hsm_action_item arr_hai; /**< req. to the agent */
struct llog_rec_tail arr_tail; /**< record tail for_sizezof_only */
} __attribute__((packed));
```
The c++ compiler complains here about `arr_tail` defined after `arr_hai` because of the variable sized struct: accessing directly to arr_tail is not safe.
`arr_tail` is never reached, this is only used for sizeof():
```
int mdt_agent_record_add(const struct lu_env *env, struct mdt_device *mdt,
__u32 archive_id, __u64 flags,
struct hsm_action_item *hai)
{
struct obd_device *obd = mdt2obd_dev(mdt);
struct coordinator *cdt = &mdt->mdt_coordinator;
struct llog_ctxt *lctxt = NULL;
struct llog_agent_req_rec *larr;
int rc;
int sz;
ENTRY;
sz = llog_data_len(sizeof(*larr) + hai->hai_len - sizeof(*hai)); <-------
OBD_ALLOC(larr, sz);
....
}
```
I can't modify the `struct llog_agent_req_rec` because of the existing codes that might use it. So here, I decide to implement this like changelog: the variable part of hai is accessed via an helper functions (`hai_data()` and `hai_data_len()`). But But I keep the flexible array in C for the existing codes that uses it (like the rust API wrapper, robinhood, HPSS, phobos...).
I’m not concerned with the existing HSM code in C++ since it doesn’t compile.
(style) this isn't a bug, but the comment terminator lost its space: "(variable length)*/" reads better as "(variable length) */".
warn: lustre_assert_wire_constants():argument 4 to %lld specifier is cast from pointer
warn: lustre_assert_wire_constants():argument 4 to %lld specifier is cast from pointer
(nit) the subtest description still says only "packaged headers can be compiled", which no longer says what the test now covers. Something like "packaged headers can be compiled as C and C++" would show the added coverage in the test output.
LU-20601 utils: make Lustre headers c++ compatible C++ compilers did not like some of the C idioms used in the Lustre headers: - C++ checks the types of enums more forcefully than is done in C. - signed vs unsigned comparisons will generate a warning under g++ - "invalid suffix on literal" warning: Lustre is not trying to generate a new literal identifier - implicit "void*" conversion to non-void pointer - integer narrowing conversion - const char* conversion - void pointers arithmetic This patch removes the hai_data[] flexible array from hsm_action_item struct in C++ builds. Since hsm_action_item is embedded in the llog_agent_req_rec struct, the C++ compiler raises an error because the arr_tail field is defined after arr_hai. To maintain access to the variable-sized data, inline functions hai_data() and hai_data_len() are introduced. Update sanity 400b test to verify C++ compilation of Lustre/LNet headers. Test-Parameters: testlist=sanity env=ONLY=400b Signed-off-by: Etienne AUJAMES <eaujames@ddn.com> Change-Id: I3366441e896da9bc3428d499fcc4f6b9566a1cf5
| unique failing test | history |
|---|---|
| runtests-ssk@ldiskfs+SharedKey:test_1 | seen in 100 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 failed 2× | RHEL 9.7 / x86_64 | ran 1 tests. 1 tests failed: node-provisioning. %% NODE-PROVISIONING FAILED MULTIPLE TIMES FOR custom %% http | session |
| review-dne-selinux-ssk-part-2 failed 2× | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
(minor) The description here is inverted with respect to the code. lod_parse_striping() and lod_use_defined_striping() gate the compress-field copy on LOV_PATTERN_COMPRESS in lmm_pattern, not on LCME_FL_COMPRESS, and lod_generate_lovea() already serialised llc_compr_* before this patch - what it gains here is setting LCME_FL_COMPRESS. Worth rewording so the flag is described as an output of these paths rather than the input condition.
The concern is accurate with regards to both `lod_use_defined_striping()` and `lod_parse_striping()`. Both do their work of decoding fields only if LOV_PATTERN_COMPRESS is set. I've amended the commit message to reflect that.
(minor) lod_adjust_compr_chunk_size() has no RPC-size check and no clamp: it only decrements lum_bits until the chunk fits in and divides the stripe size. There is also no COMPR_CHUNK_MAX_BITS anywhere in the tree.
COMPR_CHUNK_MAX_BITS comes from the next Change-Id: Ic36946738c3463fd862aeca4ee2e2c2ed85eff84. In order to avoid unexpected churn, the decision is to keep the shape of the series in the same order as it was originally made. It will only be a bit reworded in the commit message.
(defect) This inheritance claim does not match lfs.c. Each -E runs comp_args_to_layout() and then setstripe_args_init_inherit(), which preserves only stripe_size, stripe_count, pool_name, mirror_count and first_comp - lsa_compr_type/lsa_compr_lvl/lsa_compr_chunk_size are reset by the setstripe_args_init() call inside it. So
lfs setstripe -E 1M -Z lz4 -E eof file
compresses only the first component. Either the inheritance needs implementing in setstripe_args_init_inherit(), or this sentence and the matching text in lfs-setstripe.1 should be dropped.
(defect) There is no LL_COMPR_TYPE_UNCHANGED in the patch. What lustre_user.h actually gains is the whole enum ll_compr_type (NONE..ZSTD plus MAX) and '#define COMPR_LEVEL_MAX 31', neither of which is mentioned. A couple of other hunks are also unaccounted for: the new compress block in lod_declare_layout_add() (the 'lfs setstripe --component-add' path) and the LL_COMPR_TYPE_NONE change in lod_declare_layout_set().
(style) This block repeats the 'lfs getstripe' description already given above and reads like a second commit message that got appended. Could it be folded into the earlier bullet?
Ack. Will fold
(minor) There is no 'interop' suite under lustre/tests/, and this is the only 'testlist=interop' in the tree's history. Since lod_generate_lovea() now persists LCME_FL_COMPRESS in lcme_flags, an interop run against an older server seems worth requesting explicitly, e.g. 'Test-Parameters: testlist=sanity-pfl serverversion=2.16.0'.
Prefer `serverversion=2.17` to minimize unrelated interop failures.
@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.
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.
(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.
weird but in my man output it looks ok.
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.
Done. Added the missing .TP before the --compress-type|--compr-type entry.
Should be fixed if patch is refreshed.
(defect) setstripe has no --compress-type/--compr-type or --compress-level/--compr-level. Its long_opts only gain 'compress'/'compr' (-Z) and 'compress-chunk'; --compress-type and --compress-level are getstripe options and take no argument there. As written these two entries send the reader to 'lfs setstripe: unrecognized option'.
(minor) --compr-chunk is not accepted by setstripe either - only 'compress-chunk' is in the long_opts table. Conversely -Z's real alias --compr isn't documented above.
(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.
(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?
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 LCME_FL_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 LCME_FL_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).
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.
- 'lfs getstripe' gains --compress-type, --compress-level, and
--compress-chunk options to print individual compress parameters.
- 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:
- New LL_COMPR_TYPE_UNCHANGED enum value in the uapi header plus
corresponding wirecheck.c/wiretest.c entries.
- 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.
Example:
$ lfs setstripe -Eeof -Z lz4:5 --compress-chunk=512 <file>
* 'lfs getstripe' to show compress component parameters
Display component's compression parameters if possible.
--compress-type|--compr-type
Print only the compress type if possible.
--compress-level|--compr-level
Print only the compress level if possible.
--compress-chunk|--compr-chunk
Print only the compress chunk size in KiB if possible.
Example:
$ lfs getstripe <file>
lcme_compr_type: lz4
lcme_compr_lvl: 5
lcme_compr_chunk_kb: 512
lmm_pattern: raid0,compress
Test-Parameters: testlist=interop
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: Ife0382469cbc5099e0c6dc96534bb169ddeff61e
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
(minor) The body describes the handler migration and the wbe_* removal, but a few hunks change behavior and aren't mentioned: - cl_object.h and llite_lib.c drop the HAVE_MAPPING_SET_FOLIO_ORDER_RANGE gating of FGF_FOLIO_MAX_ORDER/FGF_FOLIO_MAX_SIZE and LL_SBI_LARGE_FOLIOS - ll_write_end() loses its `#ifdef SB_I_CGROUPWB` guard - ll_invalidate_folio() gains the OBD_FAIL_LLITE_PAGE_INVALIDATE_PAUSE block that used to exist only in ll_invalidatepage() - the HAVE_RELEASEPAGE_WITH_INT / RELEASEPAGE_ARG_TYPE handling and the `(void *)` cast on .releasepage are dropped Could these get a sentence each, or be split out? Also, the path in the second line is include/lustre_compat/linux/fs.h, not include/lustre_compat/fs.h.
(minor) This is keyed off mapping_set_folio_order_range(), but fgf_set_order() itself is older: it is in include/linux/pagemap.h from v6.7, while mapping_set_folio_order_range() only appears in v6.12. So on v6.7..v6.11 - which covers the 6.8 and 6.11 kernels - this macro replaces a working kernel helper with a stub, tree-wide, for everything that reaches lustre_compat.h. Harmless for the one caller in rw26.c today, since Lustre never turns on large folios on those kernels. But a later caller that wants the real thing gets 0 back with no build error to point at it. The compat helpers just above avoid that by keeping a Lustre name (ll_aops_read, ll_aops_release, ...). If the patch is refreshed, could this be an ll_fgf_set_order() wrapper, or a stub gated on its own HAVE_FGF_SET_ORDER test, rather than shadowing the kernel symbol? A name saying what it does would also read better than _safe.
(minor) With the HAVE_MAPPING_SET_FOLIO_ORDER_RANGE guard gone here and around FGF_FOLIO_MAX_ORDER in cl_object.h, kernels that cannot do large folios now set LL_SBI_LARGE_FOLIOS and ll_folio_max = 8. The IO paths are unaffected (mapping_set_folio_order_range() and fgf_set_order() are no-op stubs there), but llite.*.large_folios reads 1 and llite.*.folio_order_max reads 8 on a client that only ever allocates order-0 folios, and folio_order_max_store() will accept up to 8. Should these two tunables still reflect what the kernel can actually do?
(style) Not a bug, but the continuation lines still line up with the old `static int ll_write_begin(` opening paren, so they now sit one column past `int ll_write_begin_kiocb(` - column 26 instead of 25. Same one-off in ll_write_end_kiocb() below and in both declarations in llite_internal.h; the copies in lustre_compat/linux/fs.h and the memfs_write_end_kiocb() ones are aligned correctly. Worth straightening if the patch is refreshed for anything else.
LU-18687 build: move aops compat code into fs.h Migrate the aops handlers into compat specific handlers in include/lustre_compat/fs.h This also allows us to kill the wbe_* macros Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun@tancheff.com> Change-Id: I900a1e73a44a3ce3abd387a5c573e8d7e9bad57f
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-2 | RHEL 10.1 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
(defect) refcount_inc() cannot take a counter back up from 0. It WARNs ("addition on 0; use-after-free") and pins the counter at REFCOUNT_SATURATED, after which refcount_dec_and_test() never returns true again.
qpi_ref is resurrected from 0 by design:
qmt_pool_destroy() qmt_pool_lookup()
qpi_putref() -> 0 down_read(qmt_pool_lock)
qmt_pool_free() pool still on qmt_pool_list
down_write(...) blocks qpi_getref() /* 0 -> 1 */
The getref in qmt_pool_lookup()/qti_pools_add() runs under the read lock while the pool is still linked, so it strictly precedes the list_del_init() in qmt_pool_free().
Once saturated the pool is never freed, so the lu_device_get() taken in qmt_pool_alloc() is never dropped, and the lu_device_fini() LASSERTF(ld_ref == 0) LBUGs when the MDT is unmounted.
Would refcount_inc_not_zero() in the lookup path (skipping a pool that is already dead, and dropping the recheck in qmt_pool_free()) work here, or should qpi_ref stay atomic_t?
(minor) With atomic_read() this caught a count that had already gone negative. refcount_dec_and_test() saturates rather than going negative, and refcount_read() returns unsigned int, so a corrupted counter now reads as a large positive and the assert passes. If it is being kept so an over-put produces a crash dump rather than a warning, it no longer covers that case.
(style) This isn't a bug, but refcount_read() returns unsigned int, so %u matches this field better than %d.
(defect) This recheck is only reachable after refcount_dec_and_test() already returned true, so it can only fire when another thread took a reference in the window before list_del_init() above - exactly the 0 -> 1 transition refcount_t forbids (see qmt_internal.h). The comparison also changes meaning: refcount_read() is unsigned, so "> 0" is now just "!= 0". A saturated counter reads as a large positive and takes this early exit, leaking the pool rather than freeing it.
LU-16796 quota: Change struct qmt_pool_info to use refcount_t This patch changes struct qmt_pool_info to use refcount_t instead of atomic_t Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Change-Id: Ia33fafab3dbb86ff72b8c3d26b6fb2a27b334cf4
LU-10499 pcc: Add dio support for data copy during attach
PCC attach performance is bottlenecked by single threaded
buffered I/O performance. We could do multi-threading, but
multi-threaded buffered I/O to one file has a very low
performance ceiling. In order to significantly speed up
PCC attach performance, we need to switch to DIO.
DIO cannot be done from kernel memory due to various
restrictions, so we call out to a usermode helper.
Note that the helper uses open by fid because given a
file pointer, it's not possible to reliably generate the
path to a file on Lustre due to container namespace issues.
Specifically, the path used by the user may not work for
our helper program due to namespace differences. So we
must use open by fid for the Lustre side of the copy.
This patch improves attach performance from about 1 GiB/s
to about 5 GiB/s. This performance figure includes time to
read the data from Lustre *and* to write it out to PCC.
---
EX-5014 pcc: avoid deadlock during DIO open attach on rhel7
The Maloo testing fails with sanity-pcc/45 due to the following
deadlock on rhel7 kernel:
ll_fid_path_cop D ffff9a32db5eb180 0 10783 10782 0x00000080
Call Trace:
schedule_preempt_disabled+0x29/0x70
__mutex_lock_slowpath+0xc7/0x1d0
mutex_lock+0x1f/0x2f
lookup_slow+0x33/0xa7
link_path_walk+0x80f/0x8b0
path_openat+0xae/0x5a0
do_filp_open+0x4d/0xb0
do_sys_open+0x124/0x220
SyS_open+0x1e/0x20
dd D ffff9a32fb5b6300 0 10779 10755 0x00000080
Call Trace:
wait_for_completion+0xfd/0x140
call_usermodehelper_exec+0x179/0x1a0
call_usermodehelper+0x40/0x60
pcc_copy_data_dio+0x267/0x340 [lustre]
pcc_attach_data_archive+0x6ff/0xe80 [lustre]
pcc_readonly_attach+0x3d2/0xad0 [lustre]
pcc_readonly_attach_sync+0x205/0x260 [lustre]
pcc_file_open+0x798/0xdd0 [lustre]
ll_atomic_open+0xd80/0x1780 [lustre]
do_last+0xa53/0x1340
path_openat+0xcd/0x5a0
do_filp_open+0x4d/0xb0
do_sys_open+0x124/0x220
SyS_open+0x1e/0x20
This only happened on el7 kernel which uses mutex for inode locking.
During ->ll_atomic_open(), the kernel will take this mutex on the
parent inode. However, when copy data via the user space helper
program ll_fid_path_copy, it will also try to obtain this mutex
lock on the parent inode during lookup, resulting in deadlock.
Was-Change-Id: I384c7b1979d93183b86bbde311d29a50346a8d56
EX-5014 pcc: minor fixes for parameter checks
Improve console message when out-of-range pcc_dio_attach_size_mb
values are supplied.
Fix sanity-pcc test_49b to allow future limit changes
Was-Change-Id: I2bf7d0bf564c954318980f7a09d8713a70f37db9
EX-6193 pcc: dio attach failed on non-blksz-aligned file
PCC attach failed due to do DIO copy on files with blksz unligned
file size.
The reason is that the copy tool ll_fid_path_copy fails on
non-blksize-aligned file for PCC backend (such as a local Ext4
file system) using direct I/O.
In this path, it fixes this bug by falling back from direct I/O to
buffered I/O mode when copy the tail non-blksize-aligned file
part.
Was-Change-Id: I5287563029269032a91397c0094e2ccede73b9b1
EX-6399 pcc: add tunable parameter for PCC attach thread
Currently the max number of kernel threads doing asynchronous
attach is a hard code value (1024 by default).
In this patch, we make it a tunable parameter:
llite.*.pcc_max_attach_thread_num
Was-Change-Id: Ic59c15af935dd8dff586fa6be3939d4322c136d5
EX-8236 pcc: abort data copy via ll_fid_path_copy
For data copying via ll_fid_path_copy in direct I/O mode in user
space, the client calls llapi_pcc_state_fd() to obtain the file
PCC state. If it is marked with PCC_STATE_FL_ATTACH_ABORTING, the
data copy process ll_fid_path_copy exits immediately.
To reduce the overhead of these check, we do not check for each
data copy iter, instead, we do a check for certain times of I/Os
(32 times by default). For I/O size of 32MiB, it will be checking
1 times per second at 1GiB/s. There should be some time-lag
before the copy tool quits finally.
Was-Change-Id: I20631e5481a7e97d7a1ed0729bcd269ef6248a2c
Test-Parameters: clientdistro=el8.9 mdscount=2 mdtcount=4 testlist=sanity-pcc env=ONLY=45,ONLY_REPEAT=10
EX-bug-id: EX-5014 EX-6399 EX-6193 EX-8236
Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com>
Signed-off-by: Qian Yingjin <qian@ddn.com>
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Change-Id: Idb2a12296c3e4778763c9b576bbb0ecd2570a458
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-5 | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: recovery-small. | session |
This should use: #ifndef DCACHE_PAR_LOOKUP?
what the shared lock is protecting? IMHO this can be done without inode loc.
Removing this lock now scales file creation performance for a shared directory from multiple clients on a single node. Is it okay to remove this VFS lock?
Have you benchmarked with this patch? If so, could you please share the performance data. The patch is mostly OK but with some minor places needing to refine according to comments.
OK, the performance data was shared in Jira. https://jira.whamcloud.com/browse/LU-17295
should this be called before unlock?
is this assertion still valid? maybe a specific test should be created against this race.
If we don't lock inode, this can be removed. And This can be applied to all parent directory locking code on client side since we reply on MDT locking.
IMHO it should be like this:
#ifdef HAVE_INODE_LOCK_SHARED
if (open_flags & O_CREAT)
inode_unlock(dir);
else
inode_unlock_shared(dir);
#else
inode_unlock(dir);
#endif
Do we really need lli_create_rwsem as we only acquire read lock on it... With or without it the results are same.
You’re absolutely right, Yingjin. I realized (after your comment) that lli_create_rwsem has no effect in this patchset 33, and moreover I found a pattern that can cause a deadlock (unfortunately). ``` PID A (fallocate / O_CREAT → ll_atomic_open): holds i_rwsem exclusive → acquires lli_create_rwsem (read) → releases i_rwsem → MDS RPC → tries to reacquire i_rwsem exclusive via inode_lock(dir) → blocks PID B (setfattr → path lookup): walk_component → acquires i_rwsem shared → __lookup_slow → d_alloc_parallel → waits for PID A’s parallel lookup to complete → blocks Deadlock: PID A: holds the parallel lookup → needs i_rwsem exclusive PID B: holds i_rwsem shared → needs the parallel lookup to complete ``` This is the structural reason why i_rwsem cannot be dropped in ll_atomic_open().
I think d_lookup_done should be put in the end of atomic_open() and the server has already granted the DLM lock to the client.
Otherwise, the dentry may be raced and deleted by unlink or rename() operation?
The patch that called d_lookup_done() at the end of atomic_open() caused a deadlock in the racer test, so it was not pushed....
Where do you put d_lookup_done()? I'd suggest to put here (Line 1582) before inode_lock() or Line 1577 before release the granted lock.
LU-17295 llite: parallel creates via d_lookup_done VFS holds parent i_rwsem exclusive for O_CREAT, serializing all creates in the same directory. This bottlenecks HPC workloads that create many files in a shared directory. In ll_atomic_open(), release i_rwsem to allow parallel MDS RPCs for concurrent file creates. Immediately call d_lookup_done() on the dentry to clear DCACHE_PAR_LOOKUP set by the VFS d_alloc_parallel() before entering atomic_open. Without this, any process calling d_alloc_parallel() for the same filename will block in d_wait_lookup() while holding i_rwsem, causing an ABBA deadlock when ll_atomic_open() tries to re-acquire i_rwsem at the end. The MDS provides create atomicity via LDLM locks, so client-side dentry serialization through PAR_LOOKUP is not needed. The VFS atomic_open() wrapper also calls d_lookup_done() after we return, but that is a no-op since the flag is already cleared. Signed-off-by: Sohei Koyama <skoyama@ddn.com> Signed-off-by: Qian Yingjin <qian@ddn.com> Change-Id: I5101bb8b108817e6facaafc7d28b497245fc3024
| failed enforced test | platform | detail | |
|---|---|---|---|
| full-dkms failed 2× | RHEL 8.10 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
(minor) The body covers the Architecture change, the -g flag, the configure-stamp dependencies, the install-data-local switch and the mv list, but not the new `rm -rf $(CURDIR)/debian/$(DKMS_PKG)/lib` in the DKMS rule. Worth a sentence saying it undoes the module-install side effect of install-data-local, otherwise it reads as an unrelated hunk.
(minor) This second Fixes: tag looks like it points at the wrong commit. 4ff30bece1 touched no file under debian/, and its config/Makefile.dkms-deb is a verbatim move of the dkms-debs recipe out of autoMakefile.am - the dpkg-buildpackage line and the mv list are byte-identical to what was in autoMakefile.am before it. None of the four things this patch changes (control.main Architecture, -g, the configure-stamp dependencies, install-data-local) live in code that 4ff30bece1 introduced.
The header install had already been broken before it: `AC_CONFIG_FILES` never generated an `include/Makefile`, so `$(MAKE) install -C include` could not work from the moment 9bb1727422 ("LU-18687 build: sync header location") collapsed the two `-C lustre/include` / `-C lnet/include` calls into it. If a second tag is wanted, that is probably the one:
Fixes: 9bb1727422 ("LU-18687 build: sync header location")
The first tag (8cf1563a7c) does check out - it removed lustre/include/Makefile.am and so broke `install -C lustre/include`.
(minor) After the rebase described just above, does this patch still fix anything these two tags point at? The body says 377ce8531a already landed the header-installation fix and that this revision no longer touches it, and nothing in the diff is header related any more. What is left is a change to which packages `make dkms-debs` emits and to the `Architecture:` field of `lustre-client-modules-dkms`. That target produced working DKMS packages before this patch, so this reads as a build-scope/packaging cleanup rather than a fix for a breakage either referenced commit introduced. If that is right, both Fixes: lines can be dropped. If one is still meant to apply, it would help to say in the body what remains broken.
(suggestion) install-data-local is an automake hook, and in autoMakefile.am it is not headers-only - the `if MODULES` half creates $(modulefsdir)/$(modulenetdir) and copies every .ko found under lustre/, ldiskfs/ and lnet/ into them. Modules are enabled here (configure runs with --with-linux), so a `./configure && make && make dkms-debs` tree will have the whole module set copied into the staging dir just to be deleted again two lines below. A small dedicated target in autoMakefile.am (say install-headers, holding just the three header loops) would decouple the DKMS package from whatever else install-data-local grows later.
(minor) This cleanup silently depends on modulefsdir/modulenetdir starting with /lib - they are derived from `moduledir="/lib/modules/${LINUXRELEASE}/${KMP_MODDIR}"` in config/lustre-build-linux.m4. That holds today, but if that path ever moves under /usr/lib the stale .ko files would ship inside the DKMS package instead. A comment naming the reason would help, or better, don't create them in the first place (see the note above).
(minor) With build-indep reduced to configure-stamp, nothing is compiled during the build phase of a `-g` run any more, so this rule's `$(MAKE) install DESTDIR=.../_tmp_` a few lines down becomes the first thing that compiles the tree. automake resolves `install` through `install-am: all-am`, so lib/, lnet/utils/, lustre/utils/ and lustre/tests/ all get built right there. Two side effects of that move: - build-stamp used `$(MAKE) -C $(BUILDDIR) $(PMAKEARGS)`; this call has no `$(PMAKEARGS)`, so the whole userspace build is now single-threaded. - dpkg-buildpackage runs binary-indep under fakeroot (no Rules-Requires-Root in debian/control), so the compile now happens under fakeroot too, whereas before it ran in the plain build phase. Would it be cleaner to give build-indep its own stamp that does the `$(MAKE) $(PMAKEARGS)` and leave this rule to just stage and package?
LU-20232 build: dkms-deb should only build dkms packages
Make the lustre-client-modules-dkms package Architecture: all,
since the DKMS package ships source and builds modules on the
target host rather than shipping prebuilt binaries.
Build only the arch-independent packages (source + DKMS) for
the dkms-debs target: pass -g to dpkg-buildpackage, depend
on configure-stamp instead of build-stamp for build-indep and
the source/DKMS binary rules. Trim the mv list to the packages
that are actually produced.
Rebased on top of 377ce8531a ("LU-20232 dkms: restore dkms-debs
target"), which already fixes DKMS header installation via a
different mechanism; this patch no longer touches that part.
Test-Parameters: trivial testgroup=full-dkms
Fixes: 8cf1563a7c ("LU-18876 build: remove Lustre header autoMakefiles")
Fixes: 4ff30bece1 ("LU-18687 build: refactor the top-level Makefile")
Signed-off-by: Timothy Day <timday@thelustrecollective.com>
Change-Id: I287da7cff8e743b84e7e5d7f1344bdcee325db1c
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-7 failed 2× | RHEL 9.7 / x86_64 | ran 6 tests. 1 tests failed: sanity-ec. | session |
The "Before change" record shows `ef=0x33`, but 0x33 already includes CLFE_PROJID (0x20), which does not exist before this patch. Should that read `ef=0x13` (CLFE_UIDGID|CLFE_NID|CLFE_NID_BE)?
mdd_llog_record_calc_size() also gained a `type` argument and now adds CLFE_OPEN / CLFE_XATTR to the declared record size. That is independent of projid: before this patch a CL_SETXATTR / CL_GETXATTR declare computed llog_data_len(24 + 144) = 168, while the record written by mdd_changelog_data_store_by_fid() is 24 + 144 + sizeof(struct changelog_ext_xattr) = 424 bytes, so the declared length was short by 256 bytes. Could the commit message say that this hunk fixes the under-declared record length for the OPEN/XATTR record types? It is a separate fix and would deserve its own `Fixes:` tag if split out.
(we need to add ) CL_PROJID = 25?
No, this enum is for changelog type. e.g: ``` 07RMDIR 06:25:21.451572548 2026.06.12 0x1 t=[0x2000013a1:0x7f7d:0x0] j=rmdir.0 ``` CL_RMDIR = 7 is the changelog type. But here we don't add a new type but a new field that can be added for every types.
Yes. We need to change the commit message for this.
(add here as well) NOPEN, "PROJID", ? So, we can have ability to mdd.<MDT>.changelog_mask=+PROJID ?
(suggestion) Once CLFE_PROJID ships, changelog_extra_field_size(CLFE_PROJID) is frozen at 4 bytes forever, so this struct can never grow without burning a second CLFE_* bit. Would a reserved word now be worth it?
struct changelog_ext_projid {
__u32 cep_projid;
__u32 cep_padding;
};
changelog_ext_nid carries `extra`/`padding` for the same reason, and it would also leave room for the file attribute flags (immutable, projinherit, ...) that were discussed on an earlier patch set and then dropped.
We did not asked for projid field (otherwise, changelog_trim() will remove projid field to provide a compatible record for old client).
(style) Not a bug, but the name reads like a getter while the return value is 0/-ENOENT, so all three call sites end up as `if (!mdd_changelog_projid(...))` meaning "a projid was found" - which reads backwards.
A boolean would say what the call sites actually mean:
if (mdd_changelog_get_projid(env, type, &projid))
xflags |= CLFE_PROJID;
(style) This returns 0 / -ENOENT but every caller uses it as a predicate (`if (!mdd_changelog_projid(...))`). A `bool` return and a name that reads like a getter (mdd_changelog_get_projid()) would make the call sites easier to read. The `else if (parent && (parent->la_valid & LA_PROJID)) p = 0;` branch also assigns a value `p` already holds; it only exists to pick 0-vs-ENOENT, which a comment would make clearer.
This record is for `vic`, but the projid ends up being `obj`'s. mdd_changelog_data_store() only passes the FID down, and mdd_changelog_projid() reads MDD_ENV_VAR(env, cattr), which mdd_xattr_set() filled from `md_obj` (the source file) before calling mdd_xattr_split(). Chain: `lfs mirror split --mirror-id N src -f dst` -> LL_LEASE_LAYOUT_SPLIT -> mdt_close_handle_layouts() (mdt_open.c:2386, `mdt_object_child(o)` is src) -> mdd_xattr_set() -> mdd_la_get(obj, cattr) -> mdd_xattr_split() -> the two CL_LAYOUT records here. `dst` is opened at a user-supplied path in mirror_split() (lfs.c:2843), so it can live under a directory with a different project. Nothing in mdd_xattr_split() copies the projid across, unlike mdd_xattr_merge() which sets vic's projid from cattr first, so the record for `dst` reports src's project. Should the projid be read from the object the record names?
Please check the https://review.whamcloud.com/28251. The computed offset is not correct.
Alright, It have been sometime, I will check this. Will get back with findings.
Is this the problem you see? Currently, projid is moved after XATTR. Since this is part of XATTR it should be moved along with XATTR and not after. I will get this changed.
Please check https://review.whamcloud.com/c/fs/lustre-release/+/28251/22/lustre/include/uapi/linux/lustre/lustre_user.h#1504
e.g: xattr_mov should be unchanged:
```
max_xattr_mov = sizeof(struct changelog_ext_rename) +
sizeof(struct changelog_ext_jobid) +
sizeof(struct changelog_ext_extra_flags) +
sizeof(struct changelog_ext_uidgid) +
sizeof(struct changelog_ext_nid) +
sizeof(struct changelog_ext_openmode);
```
But now with:
```
xattr_mov = (char *)rec +
changelog_rec_offset(
(enum changelog_rec_flags)
(crf_wanted & CLF_SUPPORTED),
(enum changelog_rec_extra_flags)
(cref_want & ~CLFE_XATTR))
```
You get:
```
max_xattr_mov = sizeof(struct changelog_ext_rename) +
sizeof(struct changelog_ext_jobid) +
sizeof(struct changelog_ext_extra_flags) +
sizeof(struct changelog_ext_uidgid) +
sizeof(struct changelog_ext_nid) +
sizeof(struct changelog_ext_openmode) +
sizeof(struct changelog_ext_projid);
```
So you should update all the *_mov to unset CLFE_PROJID:
```
xattr_mov = (char *)rec +
changelog_rec_offset(
(enum changelog_rec_flags)
(crf_wanted & CLF_SUPPORTED),
(enum changelog_rec_extra_flags)
(cref_want & ~(CLFE_XATTR|CLFE_PROJID)))
```
Notes here to help the syntax:
```
cref_want & ~(CLFE_XATTR|CLFE_PROJID) == cref_want & (CLFE_XATTR - 1)
```
So you can use something like this to avoid those kind of errors in the future:
```
#define CLFE_PROJID_MASK = (CLFE_PROJID - 1)
#define CLFE_XATTR_MASK = (CLFE_XATTR - 1)
...
#define CLFE_UIDGID_MASK = (CLFE_UIDGID - 1)
...
uidgid_mov = (char *)rec +
changelog_rec_offset(
(enum changelog_rec_flags)
(crf_wanted & CLF_SUPPORTED),
(enum changelog_rec_extra_flags)
(cref_want & CLFE_UIDGID_MASK));
```
Etienne, you are correct and thanks for the detail explaination! Added CLFE_BEFORE_MASK macro as you have mentioned. Done
This is correct, I added this in PS41. But this masked out all PROJID. That is reason we see the failure now, IMO. I am checking.
Before
```
$ bpftrace -e 'kprobe:changelog_trim_rec { printf("rec: %p, crf_want: %d, cref_want: %d\n", arg0, arg1, arg2); }'
Attaching 1 probe...
rec: 0xffff888010368010, crf_want: 12288, cref_want: 32
rec: 0xffff8880103680c0, crf_want: 12288, cref_want: 32
```
After
```
$ bpftrace -e 'kprobe:changelog_trim_rec { printf("rec: %p, crf_want: %d, cref_want: %d\n", arg0, arg1, arg2); }'
Attaching 1 probe...
rec: 0xffff93c473000010, crf_want: 12288, cref_want: 0
rec: 0xffff93c4730000b8, crf_want: 12288, cref_want: 0
```
(style) Not a bug, but this leaves a double blank line before the `is_rmentry_supported` block.
LU-15372 mdd: Add projid in Changelog This patch adds projid support into Changelog. Projid would be printed under section "projid=". # touch /mnt/lustre/f1 Before change: 01CREAT 0x0 t=[0x200000401:0x7:0x0] j=touch.0 ef=0x33 u=0:0 nid=0@lo p=[0x200000401:0x5:0x0] f1 After change: 01CREAT 0x0 t=[0x200000402:0x4:0x0] j=touch.0 ef=0x33 u=0:0 nid=0@lo projid=7200 p=[0x200000402:0x3:0x0] f1 This patch introduces the mdd_key_exit() callback to reset the la_valid flag for all attributes used in the MDD thread context, ensuring these attributes can be safely used to determine project IDs. Add regression test sanity 160z and update 160u to handle the new changelog format. This needs project quota enabled for ZFS. restore_project_quota(), project_quota_enabled() have been added in test-framework.sh for this purpose. Test-Parameters: testlist=sanity clientversion=2.15 env=ONLY=160 Test-Parameters: testlist=sanity serverversion=2.15 env=ONLY=160 Test-Parameters: testlist=sanity env=ONLY=160z,ONLY_REPEAT=20 Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com> Change-Id: Ie716fd812e2cb3e24c7a5cd04a1ec43b31eb4c23
| unique failing test | history |
|---|---|
| sanity3@zfs:test_907 | seen in 57 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
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.
(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.
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?
(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?
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
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
(minor) Two hunks aren't accounted for by the body. COMPR_GET_CHUNK_SIZE() in lustre_user.h gains argument parentheses and a 1U base. That is a real hardening of the macro, but nothing in the message mentions it. llapi_layout_compress_set() gains a type range check that makes the function return -1/EINVAL for inputs it previously accepted. That is a behaviour change to a public liblustreapi entry point and deserves a line. Are both meant to ride along in this patch?
(minor) This isn't a bug today, but the two arguments are treated asymmetrically: `lvl` is masked with 0x0f, `bits` isn't. The matching accessor LLCH_CHUNK_LUM_BITS() does mask on the way out.
LLCH_LEVEL_AND_CHUNK(3, 16) -> (16 << 4) | 3 == 259
The result is an int, so the overflow only disappears when it's stored into the __u8 llch_level_and_chunk, and the header then decodes as chunk_lum_bits 0 (64 KiB) rather than anything detectable. Valid chunk_lum_bits is 0..10 so no current caller can hit it, but masking `bits` the same way as `lvl` would keep the macro self-contained.
(minor) Documentation/man3/llapi_layout_compress_set.3 doesn't seem to be updated to match. Its ERRORS section lists EINVAL only for the stripe_size/chunk_size cases, and DESCRIPTION enumerates the valid `type` values without saying that an out-of-range type or the new LL_COMPR_TYPE_UNCHANGED sentinel is now rejected. Should the man page change land in the same patch?
(style) Not a bug, but the first test can never decide the branch on its own: LL_COMPR_TYPE_UNCHANGED is 255 and LL_COMPR_TYPE_MAX is 8, so `type >= LL_COMPR_TYPE_MAX` already covers the sentinel. Keeping it reads as documentation, but a reader has to work that out.
LU-10026 csdc: add ll_compr_hdr structure It is an important structure for CSDC feature. Will be used in the next patches. Also adds: - LL_COMPR_TYPE_UNCHANGED enum value (used to signal that the compression type should not be changed on update). - LL_LZ4FAST_MAX_LEVEL define (15: the largest value the 4-bit stored level field can hold for the LZ4FAST algorithm). - LLCH_FL_COMPR_CSUM / LLCH_FL_HDR_CSUM flags in llch_flags to signal checksum presence explicitly (a crc32 of 0 is ambiguous otherwise). - wirecheck: pin COMPR_CHUNK_MIN_BITS, COMPR_CHUNK_MAX_BITS, and LL_LZ4FAST_MAX_LEVEL values. Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: I26f2fc7c0212f1a4cad36805c75aa766d6aed548
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
(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?
(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?
(style) extra blank line. Also z1..z4 here, and `expect` in test_100d, are not declared `local`.
(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.
(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.
(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.
(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.
(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?
(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.
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
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-5 crashed | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% | session |
(minor) This says the gate is the presence of bdi_dev_name(), added by 68f23b8906 and picked up in RHEL 8.6, but the new configure test probes backing_dev_info.dev_name, which is a different commit: 6bd87eec23cb ("bdi: add a ->dev_name field to struct backing_dev_info", v5.7).
68f23b8906's bdi_dev_name() still returns dev_name(bdi->dev), so it alone is not the property the patch relies on. The two commits also end up attributed to each other between here and the config/lustre-core.m4 comment.
Would it be clearer to say the gate is the cached dev_name copy, and to re-check the RHEL 8.6 claim against that commit rather than against 68f23b8906?
(minor) The sha and the quoted subject belong to different commits. 6bd87eec23cb is Christoph Hellwig's "bdi: add a ->dev_name field to struct backing_dev_info"; "memcg: fix a crash in wb_workfn when a device disappears" is 68f23b8906 (Ted Ts'o, v5.6). The next line then credits 6bd87eec23cb with adding bdi_dev_name(), which 68f23b8906 did. The rest of the sentence (the worker keeping its own copy of the name) does describe 6bd87eec23cb correctly, so only the subject and that one clause need fixing.
(minor) The test compiles a reference to the dev_name field, but the macro, the configure message and the AC_DEFINE description all say bdi_dev_name(). Those are separable: v5.6 has the function without the cached field, and only the field makes the name outlive device_unregister().
Since the name is what someone reads when they later decide whether the test is right, a name that disagrees with the test invites "correcting" it to probe the function and quietly losing the property the patch depends on. LC_HAVE_BDI_DEBUG_STATS just below is the model here:
[if 'struct backing_dev_info' has 'dev_name' field]
Renaming to HAVE_BDI_DEV_NAME_FIELD would make the C-side guards say what they mean too.
There has to be a better way then this ifdef mess.
``` #if !defined(SB_I_PERSB_BDI) && !defined(HAVE_BDI_DEV_NAME) #define SB_I_CGROUPWB 0 #endif ``` ?
(suggestion) Is this branch needed? bdi_debug_register() creates the stats file as a child of debug_dir:
bdi->debug_dir = debugfs_create_dir(name, bdi_debug_root);
bdi->debug_stats = debugfs_create_file("stats", 0444, bdi->debug_dir, ...);
so debugfs_remove_recursive(bdi->debug_dir) in the #else already takes the stats file with it on kernels that have the field. That makes "restore the debug_stats removal that pre-v5.3 kernels need" in the commit message hard to back up.
Dropping it would also leave LC_HAVE_BDI_DEBUG_STATS with no users at all - this is its only one - so the configure test could go too.
(minor) Not something this patch introduces, but both branches touch fields that only exist under CONFIG_DEBUG_FS:
#ifdef CONFIG_DEBUG_FS
struct dentry *debug_dir;
struct dentry *debug_stats;
#endif
With CONFIG_DEBUG_FS=n the HAVE_BDI_DEBUG_STATS test fails too, so the #else is what gets compiled, and bdi->debug_dir is not a member. The patch narrows the affected range (it now needs HAVE_BDI_DEV_NAME as well), but v5.7-v5.10 without debugfs still won't build. Worth wrapping in #ifdef CONFIG_DEBUG_FS while these lines are being rewritten?
This looks like the only real issue, the others are largely cosmetic.
LU-19805 llite: unregister client BDI on pre-5.11 kernels
Repeated client mount/umount eventually fails with:
sysfs: cannot create duplicate filename '/devices/virtual/bdi/fs-ffffa08a8a808000'
kobject_add_internal failed for fs-ffffa08a8a808000 with -EEXIST
llite: Unable to mount <unknown>: rc = -17
ll_fill_super() names the per-superblock BDI after the superblock
address (ll_get_cfg_instance()), so that name is only unique for as
long as the BDI does not outlive the superblock.
LU-16954 set SB_I_CGROUPWB on the Lustre superblock. Every cgroup
bdi_writeback created for the mount takes a reference on the BDI in
wb_init(), and those references are only dropped by bdi_unregister()
via cgwb_bdi_unregister(). Kernels older than v5.11 have no
SB_I_PERSB_BDI, so generic_shutdown_super() only calls bdi_put():
release_bdi() cannot run while a cgwb holds a reference, and the cgwbs
are not killed because that only happens from bdi_unregister(). The
BDI and its sysfs node therefore stay behind after umount, and the next
mount that gets a struct super_block back at the same address fails
with -EEXIST.
LU-16954 compensated for this by unregistering the BDI device from
ll_put_super(). LU-17745 disabled that for kernels which still have
backing_dev_info.debug_stats (before commit v5.2-rc3-11-g2d146b924e),
since RHEL 8.2 crashed in wb_workfn(), called dev_name(wb->bdi->dev)
with no NULL check. That was fixed by commit v5.5-5400-g68f23b8906
("memcg: fix a crash in wb_workfn when a device disappears"), which
added bdi_dev_name(), and which RHEL picked up in 8.6. The condition
that matters is therefore not the absence of debug_stats but presence
of bdi_dev_name(): on RHEL 8.6 and later the explicit unregister is
safe, and without it every mount/umount cycle strands a BDI.
Key the unregister off a new HAVE_BDI_DEV_NAME test and restore the
debug_stats removal that pre-v5.3 kernels need. Only ask for cgroup
writeback where the BDI can be unregistered again, so kernels with
neither SB_I_PERSB_BDI nor bdi_dev_name() do not strand BDIs either.
That affects RHEL 8.0 through 8.5, and SLES15 SP2/SP3, Ubuntu 20.04.
This removes the sysfs name collision. On pre-v5.11 kernels the BDI
itself is still only freed once the memory cgroups referencing it go
away; a module has no exported way to break that cycle.
Reproduced on a RHEL 8.10 client booted with cgroup v2 (memory and io
controllers) by mounting, writing a file from a non-root cgroup, and
unmounting in a loop: without the patch the mount fails after ~10
iterations and one /sys/class/bdi/<fsname>-<address> entry is stranded
per cycle; with it, 100 iterations pass leaving none. No regression
test is added, because triggering the failure requires cgroup v2 with
both the memory and io controllers on a client kernel older than v5.11,
which no autotest client configuration provides, and a test that cannot
fail without the fix is worse than none.
Test-Parameters: clientdistro=el8.10 testlist=conf-sanity
Test-Parameters: clientdistro=ubuntu2404 testlist=conf-sanity
Fixes: facff17860 ("LU-17745 llite: fix the umount panic due to BDI unregister")
Fixes: dcc1dd39a6 ("LU-16954 llite: add SB_I_CGROUPWB on super block for cgroup")
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Assisted-by: ClaudeCode:Opus-4.8 llm_code_and_review_tools
Change-Id: I7cfbc98da727bc8ddb53c9282f62c666f5d5d929
LU-18687 build: normalize C flags in kernel Makefiles Kernel code should only be allowed to #include code that it needs. Restrict the #include paths to the greatest degree possible. Correct the order of include flags. Test-Parameters: trivial Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: I8b35b99767f7ea41cc3c590bf35089fb81a1bf2c
lustre/llite/file.c: parse ll_file_ioctl():error: Function too hairy. Giving up. 14 seconds warn: ll_file_ioctl():Function too hairy. No more merges.
LU-17916 dbg: force build with in-kernel crypto Force build with in-kernel crypto. Test-Parameters: forbuildonly Signed-off-by: Sebastien Buisson <sbuisson@ddn.com> Change-Id: I0943412d7b42cbdcb50271bb0bf728425ed4fb3d
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne-arm | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 5 tests. 1 tests failed: sanity. | session |
LU-11433 lnet: move wire constant checks into wiretest.c Move lnet_assert_wire_constants() out of api-ni.c into a dedicated wiretest.c file, following the same pattern as used by Lustre wire constant checks. Update lnet/utils/wirecheck.c to generate the standalone LNet wiretest coverage and add missing checks for LNet wire-visible structures and constants, including NID, message header, ping metadata, acceptor, and counters. Test-Parameters: trivial testlist=sanity-lnet Signed-off-by: Sonia Sharma <sonia.sh.sharma@oracle.com> Change-Id: I57dbdbde8f1b1a5398231e0f325a00662016697e
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-5 | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
ldlm/ldlm_lockd.c: error: ldlm_init():uninitialized symbol 'rc'.
The body only describes the new family, but the patch also reworks the existing cleanup labels in ldlm_init(): the #endif moves so ldlm_interval_tree_slab is now destroyed on client builds too, ldlm_glimpse_work_kmem gains a teardown, and the return value changes shape. Could the body explain that rework so it doesn't read as an unrelated hunk?
ldlm/ldlm_lockd.c: error: ldlm_init():uninitialized symbol 'rc'.
(defect) `le_ns` is cached for the whole dump, but nothing pins the namespace - `class_incref()` only keeps the `obd_device` allocation alive.
For a server target the namespace is freed from precleanup, not from the final decref:
class_cleanup() -> obd_precleanup() -> ldto_device_fini()
-> ofd_device_fini() -> ofd_fini() -> ldlm_namespace_free_post()
Other obd references are still held at that point, and `OBDF_SET_UP` is only cleared after `class_cleanup()` returns, so the device still passes the collect filter the whole time.
`ldlm_namespace_free_post()` frees `ns_stats` inside `ldlm_namespace_debugfs_unregister()`, then sleeps in `ldlm_namespace_sysfs_unregister()` (`wait_for_completion(&ns->ns_kobj_unregister)`) before `kfree(ns->ns_name)` and `OBD_FREE_PTR(ns)`. A dump that lands in that window reaches `lustre_nl_put_dataset(msg, NULL, ...)` and dereferences `stats->ls_num`; after the free completes every `ns->` read below is a use-after-free. `ofd_fini()` also leaves `obd->obd_namespace` pointing at the freed namespace until the line after `ldlm_namespace_free_post()`, so `ldlm_filter_target()` and the `strscpy()` above can read `ns->ns_name` after it is gone.
`ldlm_pools_recalc()` already has the pattern for this - take `ns->ns_lock`, skip the namespace if `LDLM_NS_STOPPING` is set, otherwise `ldlm_namespace_get()` - with the bz21519 / LU-499 comment explaining why the refcount must not be taken on a namespace being freed. Should collect/release use `ldlm_namespace_get()`/`ldlm_namespace_put()` rather than relying on the obd refcount?
(defect) `lno_min_alloc` is left unset, so `lustre_obd_nl_start()` never assigns `cb->min_dump_alloc` and the dump runs in a single NLMSG_GOODSIZE-class skb. `lustre_obd_nl_dump()` returns `rc`, not `msg->len`, so netlink treats the callback as finished after one pass - when the entries stop fitting, `genlmsg_put()` fails and the dump ends with -EMSGSIZE plus whatever happened to fit. Rough per-entry cost here is the namespace name, seven u32s, a padded u64 and three nested `LDLM_NSS_*` datasets, around 470 bytes, on top of ~800 bytes for the key table. That is roughly 6 namespaces in a 4K skb and ~33 with libnl's default 16K receive buffer, while a client carries one namespace per MGC/MDC/OSC. The existing dumps avoid this either by sizing the buffer up front (`STATS_MSG_MIN_SIZE`, `DEVICE_KEY_TABLE_PACKET_SIZE`) or by returning `msg->len` and resuming (`lustre_device_list_dump()` with `gdl_start`). Could this do one of the two? `lnc_index` already survives across calls, so returning `msg->len` would resume correctly - though `first` would then need to be per-skb instead of `lnc_index == 0`, since the HDR attribute has to open each message.
(minor) `lustre_ldlm_dump()` and `lustre_ldlm_done()` forward to the framework unchanged, so `ldlm_genl_ops` could point `.dumpit`/`.done` straight at `lustre_obd_nl_dump`/`lustre_obd_nl_done`. Only `.start` needs a wrapper, to bind `&ldlm_ops`.
(style) This isn't a bug today, but the new header has no `#ifndef`/`#define` guard, so a second include would redefine `enum lustre_ldlm_attrs`. Cheap to add while the file is new.
(minor) Nothing in this file appears to use anything from `lustre_kernelcomm.h` - `ldlm_netlink_init()`/`ldlm_netlink_fini()` come from the local `kernelcomm.h`. Is this include needed?
(minor) `lru_size` is ns_nr_unused here, but ldlm.namespaces.*.lru_size shows ns_max_unused whenever LRU resize is off, and the current unused count is already exposed as lock_unused_count. Reusing lru_size for a different field next to the existing parameters is easy to misread - lock_unused_count for this one, and lru_size for the ns_max_unused attribute below, would line up with what admins already know.
(style) This isn't a bug, but ldlm_release(), ldlm_collect(), ldlm_dump_one(), ldlm_list, ldlm_keys, ldlm_ops and struct ldlm_entry are very generic for the ldlm namespace - ldlm_release() in particular reads like a lock-release helper. If the patch is refreshed, an ldlm_nl_ prefix would also make them consistent with the lustre_ldlm_* handlers further down, which use a different prefix within the same file.
(defect) This reports ns_max_age in seconds, but the long-standing ldlm.namespaces.*.lru_max_age parameter is milliseconds - lru_max_age_show() uses ktime_to_ms() and lru_max_age_store() scales a bare number by NSEC_PER_MSEC. Same name, 1000x different value, and any setting below one second reports 0 here. Should this use ktime_to_ms() so the two agree? The kernel-doc for LUSTRE_LDLM_ATTR_LRU_MAX_AGE says "seconds" as well.
(defect) lustre_nl_put_dataset() allocates one attribute per non-zero counter (`nla_nest_start(msg, base_attr + cnt++)`), and ns_stats holds three counters - LDLM_NSS_LOCKS, LDLM_NSS_LRU_PRIV_HITS, LDLM_NSS_LRU_HITS - so this can emit attribute types 11, 12 and 13. The key table only describes 11: ldlm_list.lkl_maxattr is LUSTRE_LDLM_ATTR_MAX, and lnet_genl_parse_list() walks 1..lkl_maxattr consuming one entry of ldlm_keys[] per NLA_NESTED key, so only LUSTRE_LDLM_ATTR_LOCK_STATS gets a name and only one &stats_dataset_list is sent. Types 12 and 13 fall outside the advertised table, so everything past the first counter can't be mapped back to a key on the receiving side. The obdclass stats path handles this by growing the table (LUSTRE_STATS_ATTR_MAX + stats->ls_num + 1 keys, with one &stats_dataset_list per counter). LDLM_NSS_LAST is fixed at 3 here, so could the table just declare LOCK_STATS, +1 and +2 and list &stats_dataset_list three times?
LU-19768 ldlm: add LDLM genetlink family Add a new ldlm genetlink family that exposes per-namespace lock statistics (contention, LRU, timeouts, and lock stats) via the table-driven netlink framework introduced in the previous patches. TLC-bug-id: TLU-56 Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: I55bf842919d2cfd922f8050c11869ac962c57814
target/kernelcomm.c: warning: sparse:symbol 'lustre_export_done' was not declared. Should it be static?
target/kernelcomm.c: warning: sparse:symbol 'lustre_export_done' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_start' was not declared. Should it be static?
target/kernelcomm.c: warning: sparse:symbol 'lustre_export_done' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_start' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_dump' was not declared. Should it be static?
target/kernelcomm.c: warning: sparse:symbol 'lustre_export_done' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_start' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_dump' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_done' was not declared. Should it be static?
target/kernelcomm.c: warning: sparse:symbol 'lustre_export_done' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_start' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_dump' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_done' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_export_start' was not declared. Should it be static?
target/kernelcomm.c: warning: sparse:symbol 'lustre_export_done' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_start' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_dump' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_done' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_export_start' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_export_dump' was not declared. Should it be static?
The body lists recovery status, OBD parameters, job stats and BRW stats, but the patch also adds TARGET_CMD_EXPORTS with lustre_export_start()/_dump()/_done(). Could the exports command be described here too? The uAPI header also gains LDLM_GENL_NAME/enum ldlm_nl_commands, MDD_GENL_NAME/enum mdd_nl_commands and LQUOTA_GENL_NAME/enum lquota_nl_commands, none of which are mentioned or used. Are those meant to be in this patch?
target/kernelcomm.c: warning: sparse:symbol 'lustre_export_done' was not declared. Should it be static?
target/kernelcomm.c: warning: sparse:symbol 'lustre_export_done' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_start' was not declared. Should it be static?
target/kernelcomm.c: warning: sparse:symbol 'lustre_export_done' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_start' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_dump' was not declared. Should it be static?
target/kernelcomm.c: warning: sparse:symbol 'lustre_export_done' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_start' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_dump' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_done' was not declared. Should it be static?
target/kernelcomm.c: warning: sparse:symbol 'lustre_export_done' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_start' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_dump' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_obd_params_done' was not declared. Should it be static? target/kernelcomm.c: warning: sparse:symbol 'lustre_export_start' was not declared. Should it be static?
LU-19768 target: add netlink stats Add server-side netlink handlers for exporting target statistics via generic netlink. This introduces a new target_family with commands for recovery status, OBD parameters, job stats, and BRW stats. The OSD layers (ldiskfs and zfs) wire their brw_stats into dt_device so the netlink handlers can collect them. The job_stat struct is moved to the header for netlink access. TLC-bug-id: TLU-56 Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: I7357690440427ef636df9d20d84bd489cd4f79fa
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-1 | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
The message says the state is exposed "via the table-driven netlink framework", but this file does not use it - there is no lustre_nl_obd_ops descriptor and .start/.dumpit/.done are hand-rolled rather than routed through lustre_obd_nl_start()/lustre_obd_nl_dump()/lustre_obd_nl_done(). ldlm_netlink.c in the preceding patch does use the framework, so the wording is confusing here. If the reason is that the framework calls ops->collect() under obd_device_lock() and collection here has to sleep in llog_cat_process(), that is worth saying explicitly in the message.
This isn't a bug, but the size is hard-coded with the constant only in a comment. CHANGELOG_USER_NAMELEN_FULL is available from uapi/linux/lustre/lustre_idl.h; using it keeps the strscpy() in changelog_collect_user_cb() from silently truncating if the constant ever grows. (lustre_user.h has the same literal, but that one can't include lustre_idl.h - this header can.)
(style) The object list is otherwise alphabetical; kernelcomm.o reads better ahead of mdd_acl.o than between mdd_lproc.o and mdd_object.o.
error: changelog_nl_collect():'mdd' dereferencing possible ERR_PTR()
(defect) Can userspace decode more than one user per MDT here? The nested attributes are emitted at `LUSTRE_CHANGELOG_ATTR_USERS + u`, i.e. 4, 5, 6 ..., but `changelog_list.lkl_maxattr` is `LUSTRE_CHANGELOG_ATTR_MAX` (4), so the key table sent by lnet_genl_send_scalar_list() only describes attributes 1..4.
lnet_genl_parse_list() emits props for `count = 1; count <= lkl_maxattr` only, and the reader side walks `for (i = 1; i < keys.lkl_maxattr; i++)` over the table it was given (liblnetconfig_netlink.c). Attribute 5 onwards has no key entry, so the second and later users of an MDT are dropped.
lustre_stats_dump() hits the same problem with `LUSTRE_STATS_ATTR_DATASET + i` and solves it by building an extended key list at dump time:
count = LUSTRE_STATS_ATTR_MAX + stats->ls_num;
start->lkl_maxattr += stats->ls_num - 1;
for (i = LUSTRE_STATS_ATTR_MAX + 1; i <= start->lkl_maxattr; i++)
start->lkl_list[i] = ...DATASET props...;
Should the changelog key table be grown the same way, sized from the largest `cne_num_users` collected?
Separately, `LUSTRE_CHANGELOG_ATTR_USERS + u` is unbounded, and nla_nest_start() ORs in NLA_F_NESTED - past 0x3fff the index runs into the nla type flag bits.
(minor) Nothing ever sends on this multicast group - there is no genlmsg_multicast()/genl_notify() call in mdd. Registering it publishes a "changelog" group name that userspace can subscribe to and then never hear anything on. Is it meant to be wired up in a later patch, or can it be dropped until there is a notification to send?
(style) This isn't a bug, but the header has no `#ifndef _MDD_KERNELCOMM_H`/`#define`/`#endif` guard - mdd_internal.h and every other private mdd header has one, and a second include of this file would be a redefinition error. It is also not self-contained: `GENRADIX` comes from <linux/generic-radix-tree.h> and `MAX_OBD_NAME` from obd.h, both of which only happen to be reachable today because obd_class.h -> lustre_net.h -> lib-types.h pulls them in first.
(typo) There is no mdd_netlink.c - these live in kernelcomm.c.
Can this loop miss devices? `obd_devs` is a DEFINE_XARRAY_ALLOC and class_unregister_device() does __xa_erase() plus atomic_dec(&obd_devs_count), so populated indices are not guaranteed to be dense in [0, class_obd_devs_count()). Concretely, with two MDTs on one node: MDT0's devices take indices 0..N and MDT1's take N+1..M. After `umount` of MDT0, the count drops back to roughly N but MDT1's mdd device still sits above it, so class_num2obd(i) returns NULL for every i in range and the dump reports nothing. obd_device_for_each()/obd_device_for_each_start() (xa_for_each) is what the rest of obdclass uses for exactly this reason.
class_num2obd() is a bare `xa_load(&obd_devs, dev_no)` - it takes no lock and returns no reference. Every other iteration site holds obd_device_lock() (see class_name2obd(), lustre_obd_nl_start()@lustre/obdclass/kernelcomm.c:1320, lustre_health_dump()@:1187), and ldlm_collect() additionally does class_incref() before letting go of the lock. Here the obd is dereferenced (obd_flags, obd_type->typ_name, obd_lu_dev, obd_name) and then handed to llog_get_context()/llog_cat_process(), which sleeps on llog I/O, with no reference held. A concurrent `lctl cleanup`/umount reaches class_free_dev() -> obd_device_free(), which is an immediate slab free with no RCU grace period, so this looks like a use-after-free rather than just a stale read. The pattern in lustre_health_dump() applies: take obd_device_lock(), class_incref(), drop the lock, do the sleeping work, class_decref().
error: changelog_nl_collect():'mdd' dereferencing possible ERR_PTR()
Should this check CLM_INIT_DONE before using `ctxt->loc_handle`? Every other changelog llog consumer in mdd does - mdd_changelog_users_seq_show()@lustre/mdd/mdd_lproc.c:209 and mdd_changelog_size_seq_show()@:247 both return -ENXIO when the flag is clear, and mdd_changelog_recalc_mask() takes mdd_changelog_mutex. llog_setup() for LLOG_CHANGELOG_USER_ORIG_CTXT happens at mdd_device.c:556 but loc_handle is only assigned by the llog_open_create() that follows at :567, so for the whole duration of that create (and llog_init_handle() after it) the context is registered with loc_handle still NULL. mdd_prepare() runs from server_start_targets() long after class_setup() has set OBDF_SET_UP, so the obd is already visible to this loop during that window. llog_cat_process() -> llog_cat_process_or_fork() dereferences `cat_llh->lgh_hdr` on its first line, so a dump landing in that window is a NULL dereference. The teardown side has the same exposure: mdd_changelog_fini() does llog_cat_close(env, ctxt->loc_handle) then llog_cleanup(env, ctxt) under mdd_changelog_mutex, which this path does not take.
LU-19768 mdd: add MDD/changelog genetlink family Add a new MDD genetlink family that exposes per-MDT changelog consumer state via the table-driven netlink framework. The dump handler iterates MDD devices and reports per-consumer details (endrec index, idle time, event mask) through genradix arrays. TLC-bug-id: TLU-56 Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: I3ae11dc2a992bc5cd9911e51fec8148cfb1dcfed
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | RHEL 9.7 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
| review-dne-zfs-part-5 crashed | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% | session |
(style) The body is the KASAN splat plus this paragraph, and it never states what the bug actually is or what the patch does. Something like: `tail_len` is read from disk and is only bounded by `chunk_size`, but `dt_read()` can return fewer than `chunk_size` bytes, so `last_rec = tail - tail_len + sizeof(*tail)` can land before `buf`. Also, "error handling path" doesn't quite fit - the faulting computation is in the normal last-record-of-block parsing, not in error handling.
(defect) This fixes a real out-of-bounds read, so it should carry a Fixes: tag. The unbounded computation dates back to the original OSD llog implementation, which had `last_rec = (char *)buf + rc - le32_to_cpu(tail->lrt_len)` with no bound on `lrt_len` at all:
Fixes: 0d43b8d1b0d6 ("LU-1302 llog: llog over OSD primitives")
If you'd rather point at the current shape of the code, 8047d75a5b66 ("LU-18218 llog: catalog lgh_lock refactoring") is the commit that introduced `tail_len` and bounded it against `chunk_size` only, which is what leaves the short-read case unprotected.
(minor) Should this bound be `LLOG_MIN_REC_SIZE` rather than `sizeof(*last_rec)`? The rest of the llog code treats 24 bytes as the smallest possible record footprint - `llog_verify_record()` rejects `lrh_len < LLOG_MIN_REC_SIZE`, and `llog_process_thread()` stops its loop at `buf + chunk_size - LLOG_MIN_REC_SIZE`. As written, a `tail_len` of 0..15 leaves `last_rec` pointing at something that cannot be a record but still passes. Related: the check covers the 16-byte header, but `lustre_swab_llog_rec(last_rec)` on the next line goes well beyond it - for CHANGELOG_REC/CHANGELOG_USER_REC/UPDATE_REC it locates the record tail as `(char *)rec + rec->lrh_len - sizeof(*tail)` and swabs it, and `lrh_len` here is unvalidated on-disk data. Validating `tail_len` itself (>= LLOG_MIN_REC_SIZE, and no larger than `(char *)tail + sizeof(*tail) - (char *)buf`) would bound the whole record instead of just its header.
Should this just go to the next llog block instead aborting processing?
LU-20450 llog: out-of-bounds read in llog_osd_next_block() When running llog kunit test subtest 12 on osd-wbcfs, I see the following KASAN warning: BUG: KASAN: slab-out-of-bounds in llog_osd_next_block+0x1368/0x3080 [obdclass] Read of size 4 at addr ffff88811c54b036 by task lctl/1349 Call Trace: dump_stack_lvl+0x52/0x80 print_address_description+0x77/0x1f0 print_report+0x58/0x70 ? llog_osd_next_block+0x1368/0x3080 [obdclass] kasan_report+0xa2/0xd0 ? llog_osd_next_block+0x1368/0x3080 [obdclass] llog_osd_next_block+0x1368/0x3080 [obdclass] llog_process_thread+0xdd7/0x4f70 [obdclass] ? entry_SYSCALL_64_after_hwframe+0x4b/0x53 ? task_work_add+0x177/0x210 llog_process_or_fork+0x656/0xc90 [obdclass] ? llog_cat_process+0x30/0x30 [obdclass] llog_cat_process_or_fork+0x780/0xdb0 [obdclass] ? llog_cat_process+0x30/0x30 [obdclass] ? llog_cancel_rec_cb+0x450/0x450 [llog_test] llog_cat_process+0x24/0x30 [obdclass] llog_test_12+0x13ee/0x2d90 [llog_test] llog_run_tests+0x443a/0x5ad0 [llog_test] ? get_random_u32+0x51/0x470 llog_test_device_init+0x6e8/0xa20 [llog_test] obd_setup+0x54d/0x950 [obdclass] class_setup+0xc7d/0x10e0 [obdclass] class_process_config+0x2edb/0x7cb0 [obdclass] class_handle_ioctl+0x1f4d/0x3440 [obdclass] obd_class_ioctl+0x1f6/0x3c0 [obdclass] __x64_sys_ioctl+0x961/0xe00 ? _copy_to_user+0x3d/0x60 ? __x64_sys_rt_sigaction+0x107/0x140 do_syscall_64+0xcf/0x3a0 entry_SYSCALL_64_after_hwframe+0x4b/0x53 While this is likely due to a gap in the osd-wbcfs implementation, this appears to surface a real bug in the error handling path in the llog code. Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: I00fdd7395ee32634b59a3b630b4807ff7830a987
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne-arm | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 5 tests. 1 tests failed: sanity. | session |
The body only describes the pinning effect, but the diff also adds a whole /O directory hierarchy (osd_ondisk.c with simple_mkdir(), osd_ost_init(), osd_seq_load(), osd_obj_map_insert()/osd_obj_map_delete()) and two new helpers in osd_handler.c, osd_fld_lookup() and fid_is_on_ost(). Could the body say that OST/llog objects are now linked into an O/<seq>/dN tree modelled on osd-ldiskfs, and that this is what pins them? As written most of the 557 added lines are unexplained.
osd_fld_lookup() is defined in osd_handler.c, not osd_handle.c. Same for the /* osd_procfs.c */ comment above: osd_wbcfs_procfs_init()/_fini() live in osd_lproc.c.
fid_is_on_ost() returns 1 for fid_is_last_id(), so LAST_ID objects go through osd_obj_map_insert() and end up as O/<seq>/d0/0. The layout documented at the top of osd_ondisk.c (and built by osd-ldiskfs) puts them at O/<seq>/LAST_ID. osd_oi_insert() in osd-ldiskfs checks fid_is_last_id() first and routes to osd_obj_spec_insert(); that check has no counterpart here.
If osd_obj_map_insert() fails (d_alloc() returning -ENOMEM, or osd_seq_load() failing to allocate/create O/<seq>/dN), rc is returned but the inode created by __osd_create() is left in place: oo_inode is set and __osd_object_init() has already set LOHA_EXISTS.
So dt_create() reports failure while dt_object_exists() is true, and a retry for the same FID hits the -EEXIST at the top of this function. osd-ldiskfs osd_create() unwinds this case explicitly:
set_bit(LU_OBJECT_HEARD_BANSHEE, ...loh_flags);
loh_attr &= ~LOHA_EXISTS;
clear_nlink(inode); iput(inode); obj->oo_inode = NULL;
Should the same rollback happen here?
SUBSYSTEM_DEBUG is not a thing; every other file in this directory uses DEBUG_SUBSYSTEM. libcfs_debug.h defaults DEBUG_SUBSYSTEM to S_UNDEFINED, so all CDEBUG/CERROR/ENTRY output from this file is filed under the undefined subsystem and "lctl set_param subsystem_debug=osd" will not collect it.
The guard looks inverted relative to osd-ldiskfs simple_mkdir(), which returns early when dd_rdonly is set and only fixes the mode when it actually differs:
if (unlikely(osd->od_dt_dev.dd_rdonly))
RETURN(dchild);
if ((old_mode & S_IALLUGO) != (mode & S_IALLUGO))
...fixup...
As written the mode is rewritten only when the device is read-only, and never when it is writable, so the comment above does not match the code.
This frees osd->od_ost_map, but od_ost_map is only assigned on the success path below; osd comes from OBD_ALLOC_PTR() in osd_device_alloc(), so it is still NULL here. OBD_FREE() is a no-op on NULL, so this leaks the ost_map allocated above whenever simple_mkdir("O") fails.
Should it be OBD_FREE_PTR(ost_map)?
This isn't a bug, but @obj is never used in this function (only mentioned in the TODO comment below), and simple_mkdir() never uses its @env either. If the patch is refreshed, consider dropping the unused parameters.
LU-18813 osd-wbcfs: store and pin OST objects in MemFS In this patch, we store and pin OST objects in MemFS. Thus, the OST objects will not be evicted from cache by the cache shrinker (i.e. the command "echo 3 > /proc/sys/vm/drop_caches") Test-Parameters: trivial Signed-off-by: Yingjin Qian <qian@ddn.com> Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: I53f0abca2577cdb15f34df5fa44f55aa57ae96ca
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne-arm | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 5 tests. 1 tests failed: sanity. | session |
You don't think it is worthwhile to keep the osd_ prefix? The osd.h is a system-wide header and not a great place to start adding OSD-specific code. Also, this function is too large for a static inline. I think there should be a "library" for the shared code of the OSs. At least "osd_common.h" and "osd_common.c" that is linked in to each OSD (via symlinks) rather than a separate library since only one OSD is ever likely to be used at any time on a system.
> You don't think it is worthwhile to keep the osd_ prefix? It's not really an OSD function IMO - it's just mapping between two non-OSD structs. > The osd.h is a system-wide header and not a great place to start adding OSD-specific code. Also, this function is too large for a static inline. I put this next to the "struct niobuf_local" definition, which I thought made sense. > I think there should be a "library" for the shared code of the OSs. At least "osd_common.h" and "osd_common.c" that is linked in to each OSD (via symlinks) rather than a separate library since only one OSD is ever likely to be used at any time on a system. I can do that. I'll push this to lustre/osd/ and maybe link into obdclass. I think multiple OSDs would be used. I know some vendors mix ldiskfs/ZFS at least. It's desirable to be able to test these combinations on a local node.
I'd disagree, local_niobuf is a structure representing how OSD sees data, mostly in terms of buffers.
(style) The file description still scopes this header to "/O directory" definitions, which no longer covers the niobuf/lnb mapping declaration added below. The matching comment at the top of lustre/osd/osd_lib.c has the same problem. If the patch is refreshed, consider broadening both to say they hold code shared between OSD implementations.
(suggestion) This isn't a bug, but the new name reads backwards from what the function does. There is no niobuf input here - the inputs are a plain byte range (offset, len) - and no pages come out either, since lnb_page is explicitly set to NULL for every entry. What it really does is fill an lnb array from a range. Something like osd_map_range_to_lnbs() or osd_init_lnbs() would describe that more accurately.
(style) Every other function in this file has a kernel-doc block; this one has none. Now that it is a shared interface declared in osd.h, the contract is worth spelling out - in particular that -EOVERFLOW is returned once maxlnb entries have been filled, and that *nrpages still holds the partial count on that path (both callers just propagate rc and drop it).
(minor) This assertion previously lived in osd_io.c, which sets:
#define DEBUG_SUBSYSTEM S_OSD
osd_lib.c doesn't define DEBUG_SUBSYSTEM, so libcfs_private.h falls back to S_UNDEFINED and the record produced by LASSERTF() is no longer tagged as osd. Adding a DEBUG_SUBSYSTEM S_OSD define at the top of osd_lib.c would restore that (osd_ost_fini()'s ENTRY/EXIT is in the same situation today).
On a related note, both original copies wrapped this in ENTRY/RETURN and the shared one uses a plain return - was dropping the D_TRACE tracing of the mapping loop intended?
I don't really think that this should be a *separate* module, but just a library that is linked into the existing osd-* modules. I don't think saving a few KiB of code is going to make a difference (and independent modules have their own overhead) since running multiple OSDs on a single server is extremely uncommon. IMHO, the main benefit of osd-lib is from code/maintenance reduction.
I think this is leftover from a previous iteration of the patch. In the current series, it's not a separate module.
LU-17848 osd: deduplicate osd_map_remote_to_local() Mapping between niobuf_local is done for both osd-wbcfs and osd-ldiskfs. Copy the function to lustre/osd/ to be shared by both OSDs. Rename it to osd_map_niobuf_to_pages() to be clearer. Test-Parameters: trivial Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: I02df99d2363485946130ee4c8973359cfaae8c5d
| unique failing test | history |
|---|---|
| sanity-slow@ldiskfs+DNE:test_64b | seen in 2 other reviews |
| sanity-lfsck@ldiskfs+DNE:test_42 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_37 | seen in 2 other reviews |
| sanity-sec@ldiskfs+DNE:test_39 | seen in 2 other reviews |
| sanity-sec@ldiskfs+DNE:test_40 | seen in 2 other reviews |
| sanity-sec@ldiskfs+DNE:test_41 | seen in 2 other reviews |
| sanity-sec@ldiskfs+DNE:test_42 | seen in 2 other reviews |
| sanity-sec@ldiskfs+DNE:test_43 | seen in 2 other reviews |
| sanity-sec@ldiskfs+DNE:test_45 | seen in 2 other reviews |
| sanity-sec@ldiskfs+DNE:test_46 | seen in 3 other reviews |
| sanity-sec@ldiskfs+DNE:test_47 | seen in 2 other reviews |
| sanity-sec@ldiskfs+DNE:test_48a | seen in 2 other reviews |
| sanity-sec@ldiskfs+DNE:test_49 | seen in 2 other reviews |
| sanity-sec@ldiskfs+DNE:test_50 | seen in 2 other reviews |
| sanity-sec@ldiskfs+DNE:test_52 | seen in 4 other reviews |
| sanity-sec@ldiskfs+DNE:test_56 | seen in 1 other review |
| sanity-sec@ldiskfs+DNE:test_57 | seen in 1 other review |
| sanity-sec@ldiskfs+DNE:test_58 | seen in 1 other review |
| sanity-sec@ldiskfs+DNE:test_59a | seen in 3 other reviews |
| sanity-sec@ldiskfs+DNE:test_59b | seen in 1 other review |
| sanity-sec@ldiskfs+DNE:test_59c | seen in 1 other review |
| sanity-sec@ldiskfs+DNE:test_60 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_62 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@ldiskfs+DNE:test_65 | seen in 1 other review |
| sanity-sec@zfs:test_39 | seen in 2 other reviews |
| sanity-sec@zfs:test_40 | seen in 2 other reviews |
| sanity-sec@zfs:test_41 | seen in 2 other reviews |
| sanity-sec@zfs:test_42 | seen in 2 other reviews |
| sanity-sec@zfs:test_43 | seen in 2 other reviews |
| sanity-sec@zfs:test_45 | seen in 2 other reviews |
| sanity-sec@zfs:test_46 | seen in 2 other reviews |
| sanity-sec@zfs:test_47 | seen in 2 other reviews |
| sanity-sec@zfs:test_48a | seen in 2 other reviews |
| sanity-sec@zfs:test_49 | seen in 2 other reviews |
| sanity-sec@zfs:test_50 | seen in 2 other reviews |
| sanity-sec@zfs:test_52 | seen in 4 other reviews |
| sanity-sec@zfs:test_59a | seen in 3 other reviews |
| sanity-sec@zfs:test_59b | seen in 1 other review |
| sanity-sec@zfs:test_60 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-sec@zfs:test_65 | seen in 1 other review |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 failed 2× | RHEL 8.10 / x86_64 | ran 11 tests. 5 tests failed: sanity-pfl, lnet-selftest, pjdfstest, sanity-sec, sanity-lfsck. | session |
| review-dne-part-2 failed 2× | RHEL 9.7 / x86_64 | ran 11 tests. 5 tests failed: sanity-pfl, lnet-selftest, pjdfstest, sanity-sec, sanity-lfsck. | session |
| review-dne-part-3 failed 2× | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-3 failed 2× | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-7 failed 2× | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-part-7 failed 2× | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanity-pcc. | session |
| review-dne-selinux-ssk-part-2 failed 2× | RHEL 8.10 / x86_64 | ran 5 tests. 2 tests failed: sanity-selinux, sanity-sec. | session |
| review-dne-zfs-part-2 failed 2× | RHEL 8.10 / x86_64 | ran 11 tests. 4 tests failed: sanity-pfl, lnet-selftest, pjdfstest, sanity-sec. | session |
| review-dne-zfs-part-3 failed 2× | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-7 failed 2× | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity-pcc. | session |
| review-ldiskfs-ubuntu failed 2× | RHEL 8.10 / x86_64, Ubuntu 24.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
Several hunks are not accounted for by the body, which makes it hard to tell what is deliberate: - LC_FSCRYPT_OPS_INODE_INFO_OFFS and the new `lli_crypt_info` field (Linux v6.17-rc1-2-g93221de31a8df) are not mentioned at all. - the new llcrypt_prepare_new_inode()/llcrypt_set_context() calls in ll_dir_setdirstripe(), which change how the encryption context reaches the MDS. - dropping `.max_namelen` from lustre_cryptops. - the llcrypt_d_revalidate() signature change for HAVE_D_REVALIDATE_WITH_INODE_NAME. - FSCRYPT_CONTENTS_ALIGNMENT / LL_CRYPTO_BLOCK_SIZE. - the ll_get_dummy_policy() restructuring. Could the body cover each of these, or the independent ones be split into their own changes? The Fixes: tag itself checks out (sha and subject match 048e2cc7d2d5).
(typo) the AC_DEFINE description says fscrypt_parse_test_dummy_encryption() but this defines HAVE_FSCRYPT_ADD_TEST_DUMMY_KEY.
(typo) this `#else` and the `#endif` below it are labelled with CRYPTO_DUMMY_CONTEXT, but the condition being closed is HAVE_FSCRYPT_DUMMY_POLICY.
Should this branch keep `.max_namelen = NAME_MAX,`? fscrypt_operations::max_namelen only disappeared in 5.16, and configure still allows in-kernel fscrypt down to 5.4 (LC_FSCRYPT_SUPPORT only probes for struct fscrypt_policy_v2). On 5.4-5.15 the field ends up 0 and fscrypt_setup_filename() then rejects every name with -ENAMETOOLONG. Same question for the CONFIG_LL_ENCRYPTION definition below.
(style) `pgno` is s32 everywhere else in this API - llcrypt_encrypt_pagecache_blocks()/llcrypt_decrypt_pagecache_blocks() in include/lustre_compat/linux/llcrypt.h, brw_page.bp_pgno, cl_folio_pgno() - and llcrypt_finalize_bounce_page() just below uses s32 too. Using s16 here silently narrows the caller's value; could these use s32 for consistency?
On kernels without the folio variant this hands a tail page to fscrypt, which dereferences `page->mapping`:
struct page *fscrypt_encrypt_pagecache_blocks(struct page *page, ...)
{
const struct inode *inode = page->mapping->host;
Tail pages of a large folio do not carry `mapping`, so any `pgno > 0` looks like a NULL/garbage dereference rather than an encryption of the intended page. bp_pgno is set unconditionally from cl_folio_pgno() in osc_prep_async_page(), so a direct-IO write whose user buffer is backed by a large folio reaches here with a non-zero value. The decrypt helper below has the same issue for kernels before 6.3. Should these fall back to an error, or use fscrypt_encrypt_block_inplace()/the block helpers when pgno is non-zero?
This turns llcrypt_inherit_context() into a constant 0 for every kernel from 5.10 on, but only ll_dir_setdirstripe() was converted to the prepare_new_inode()/set_context() pair. The two remaining callers are not:
ll_lookup_it() namei.c:1224
ll_new_node_prepare() namei.c:1832
Both rely on it to fill op_data->op_file_encctx before md_create(). With it stubbed out, op_file_encctx stays NULL, the create RPC carries no encryption context, and ll_new_node_finish() then calls ll_set_encflags(inode, NULL, 0, true), whose preload leg goes to llcrypt_prepare_readdir() and fails. So creating a file or symlink in an encrypted directory fails after the object has already been created on the MDS. Should namei.c be converted in the same patch?
`.max_namelen = NAME_MAX` is dropped here for every configuration: CRYPTO_MAX_NAMELEN expands to nothing in all three of its definitions (lustre_crypto.h lines 50, 60 and 273). It is also listed twice in this initializer, which suggests one of the two was meant to carry the value.
For the default embedded-llcrypt build the field still exists and is read:
llcrypt_setup_filename()
-> llcrypt_fname_encrypted_size(dir, iname->len,
lsi->lsi_cop->max_namelen, ...)
with max_namelen now 0, `if (orig_len > max_len) return false;` fires for any non-empty name, so llcrypt_setup_filename() returns -ENAMETOOLONG for every name in an encrypted directory once the key is loaded.
This runs after md_create() and ll_prep_inode(), so the encryption context no longer rides along with the create RPC as it did via llcrypt_inherit_context() above. llcrypt_set_context() is called with a non-NULL inode, which takes the second leg of ll_set_context() and issues a separate md_setxattr(XATTR_CREATE); its comment says that leg "should only be used when explicitly setting a new encryption policy on an existing, empty directory". If that setxattr fails the GOTO leaves an already-created, unencrypted directory on the MDS. Would calling llcrypt_prepare_new_inode()/llcrypt_set_context(NULL, op_data) before md_create() keep the old single-RPC behaviour? The ll_set_encflags() call further down also still reads op_data->op_file_encctx, which is now NULL on this path.
This break-on-success is keyed off HAVE_FSCRYPT_OPS_LEGACY_NAME (6.7+), but the call it guards is the parse above, which exists from 5.19. On 5.19-6.6 a successful parse falls straight into the warning chain and prints "Error processing option ... [0]". Worse on 6.3-6.6, where HAVE_FSCRYPT_ADD_TEST_DUMMY_KEY is also gone (fscrypt_add_test_dummy_key() was dropped in 6.3): nothing resets err, control reaches `err = -1` and ll_options() returns it, so `-o test_dummy_encryption` always fails the mount. On 5.19-6.2 the opposite happens: a parse failure is reported, then `err = llcrypt_add_test_dummy_key(sb, policy)` overwrites it, and that returns 0 when dummy_policy->policy is NULL - so a bad test_dummy_encryption= value is silently accepted. Should this be the same `if (!err) break;` that the else branch has, placed directly after the parse call?
(style) new console messages are expected to end with `: rc = %d\n` rather than `[%d]`, and the continuation `err);` is indented two tabs past the string instead of one.
LU-20108 sec: updates for in-kernel crypto
Linux commit v5.18-rc2-4-g218d921b581ea
fscrypt: add new helper functions for test_dummy_encryption
Splits fscrypt_set_test_dummy_encryption() into
fscrypt_parse_test_dummy_encryption() and
fscrypt_add_test_dummy_key()
Linux commit v6.2-rc2-19-g51e4e3153ebc3
fscrypt: support decrypting data from large folios
A page of data in a large folio can be decrypted.
Linux commit v6.2-rc6-5-g097d7c1fcb8d4
fscrypt: clean up fscrypt_add_test_dummy_key()
Drops fscrypt_add_test_dummy_key()
Linux commit v6.6-rc3-1-g5970fbad1036d
fscrypt: make it clearer that key_prefix is deprecated
Linux commit v6.6-rc3-2-g40e13e18168fd
fscrypt: make the bounce page pool opt-in instead of opt-out
Linux commit v6.6-rc3-4-g7a0263dc904f3
fscrypt: replace get_ino_and_lblk_bits with just has_32bit_inodes
Linux commit v6.6-rc3-5-g5b11888471806
fscrypt: support crypto data unit size less than filesystem block
size
Some struct fscrypt_operations members added and changed.
Linux commit v6.14-rc1-18-g59b59a943177e
fscrypt: Change fscrypt_encrypt_pagecache_blocks() to take a folio
fscrypt_encrypt_pagecache_blocks can accept a folio and return a
bounce page of encrypted data.
Fixes: 048e2cc7d2 ("LU-15420 sec: handle simple fscrypt changes for 5.15 kernels")
Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com>
Change-Id: I684edf03f728667a364041adabe18fdb493340fd
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-4 crashed | RHEL 10.1 / x86_64 | ran 11 tests. 1 tests failed: sanity-dom. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-5 | RHEL 9.7 / x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
(style) The body only motivates the per-cpu counter case, but two of the three gated readers, lock_reclaim_threshold_mb and lock_limit_mb, read plain __u64 globals that cannot crash. Could the message explain why those are gated as well? It would also help later git log searches to name the symbols: the new field is init_state, and the attribute that actually crashes is lock_granted_count.
(defect) This fixes a crash, so it should carry a Fixes: tag. The window was opened when lock_granted_count first exposed ldlm_granted_total from ldlm_proc_setup(), which ran long before ldlm_reclaim_setup() did the percpu_counter_init().
Fixes: 33b55f223a42 ("LU-6529 ldlm: improve proc interface of lock reclaim")
(style) Not a bug, but every other field in struct ldlm_state carries the struct's prefix: ldlm_cb_service, ldlm_cancel_service, ldlm_client, ldlm_bl_pool. If the patch is refreshed, ldlm_init_state would match. The enum tag and the member name can coexist, since C keeps tag and member namespaces separate.
(minor) this should be annotated as `unlikely()` since it would only ever be true at setup and cleanup time.
(minor) it probably would generate less code to conditionally print the value instead of having two separate scnprintf() calls:
```
return scnprintf(buf, PAGE_SIZE, "%llu\n",
likely(ldlm_state->init_state == LDLM_INIT_ALL) ?
ldlm_reclaim_threshold_mb : 0);
```
(minor) ldlm_reclaim_threshold_mb and ldlm_lock_limit_mb are plain __u64 globals, so reading them early cannot crash; gating them only changes what userspace sees. 0 is also a meaningful value for these two tunables, since both store handlers treat 0 as "disabled", so during the ldlm_cleanup() window a monitoring tool now reads "reclaim disabled" rather than the configured value. lock_reclaim_threshold_count and lock_limit_count expose the same two settings in lock units and are left ungated, so the two views disagree in that window. Would it be simpler to leave these two alone and gate only lock_granted_count? Same comment applies to lock_limit_mb_show().
(defect) Some evidence for the barrier question already raised on this line. This plain store can become visible before percpu_counter_init()'s store to ldlm_granted_total.counters on arm64/ppc64; a reader then passes the check in lock_granted_count_show() and calls per_cpu_ptr(NULL, cpu), which is the same access the patch is trying to prevent. percpu_counter_init()'s internal spin_unlock() does not help, since it is a release barrier for the stores before it, not for this later one. A barrier here alone would not be enough either. The read side has only a control dependency from the flag load to the counter load, and control dependencies do not order loads, so the reader can still load fbc->counters ahead of init_state. smp_store_release() here paired with smp_load_acquire() at the three read sites is what would order both ends.
probably some kind of mb() is needed just before this line?
(defect) Clearing the flag here does not close the teardown race, because ldlm_reclaim_cleanup() is the very next statement:
ldlm_state->init_state = LDLM_INIT_NONE;
ldlm_reclaim_cleanup(); /* percpu_counter_destroy() */
A reader that already passed the check in lock_granted_count_show() is still inside percpu_counter_sum_positive() when free_percpu(fbc->counters) runs, so __percpu_counter_sum() walks freed per-cpu memory, and after fbc->counters is set to NULL it walks per_cpu_ptr(NULL, cpu).
What actually drains in-flight show() calls is sysfs_remove_group(), and that does not run until roughly 35 lines further down. Moving sysfs_remove_group() above ldlm_reclaim_cleanup() would close it properly and make the flag unnecessary on this side.
ldlm_cleanup() runs from ldlm_put_ref() on the last target umount, so a monitoring agent polling /sys/fs/lustre/ldlm/ reaches this.
LU-19824 ldlm: don't allow sysfs reads before ldlm is setup If you attempt to access per_cpu counters before they are initialized, you may crash. To avoid this, short-circuit sysfs read in LDLM until LDLM is properly setup. This is tracked by a new field in ldlm_state. Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: I96dad1d36f9d6dd6fac425009ea91ab71d75fecf
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-5 | RHEL 8.7/x86_64 | ran 6 tests. 1 tests failed: sanityn. | session |
| review-dne-zfs-part-1 | RHEL 8.7/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
LU-6142 llite: simplify flock initialization
flock locks always have fl_start and fl_end initialised to 0 and
OFFSET_MAX, so the fields can be unconditionally copied into
flock.l_flock.
Since Linux 3.16 Commit 130d1f956ab3 ("locks: ensure that fl_owner is
always initialized properly in flock and lease codepaths"), the
fl_owner field is correctly initialised so it too can be copied
directly. On older kernels we still need to provide an explicit
value.
So improve the sanity checking and return EINVAL rather than using
LASSERT(). lustre shouldn't crash if some other calls us wrongly.
Signed-off-by: Mr NeilBrown <neilb@suse.de>
Change-Id: I4d49b328430266c0a9aeba7d62ccefc7258cd8a4
| unique failing test | history |
|---|---|
| sanityn@ldiskfs+DNE:test_71a | seen in 3 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
(style) The body never names the new symbol. Spelling out ll_posix_acl_to_xattr() would make this findable with `git log --grep` later. It would also help to record what actually went wrong - LU-20461 is a stack corruption in ll_set_acl(), not a compiler diagnostic - so the severity is visible from the message alone.
We are intentionally using the upstream Linux API directly rather than defining an ll_ wrapper. As part of Lustre upstreaming efforts, we want the modules in lnet/ and lustre/ to use the latest kernel APIs natively rather than relying on inline #ifdef or ll_ thin wrappers. What compiler error or warning do you see?
You can look the LU-20461 for detail. Anyway, It is not so hard to be fixed, but really tricky to trace. So i think we need verify carefully if doing in this way.
What kernel version were you using? Would you expect that kernel to have posix_acl_to_xattr() natively? Or would it need compat_posix_acl_to_xattr()?
(defect) In this branch the rename is a no-op - ll_posix_acl_to_xattr() expands to exactly the call the three callers already made. So it isn't clear this can explain or fix the LU-20461 crash.
The disassembly in the ticket shows ll_set_acl() calling the kernel's old 4-arg posix_acl_to_xattr() with new-style arguments: %rdx is &value_size on the stack, %ecx is 0xc40 (GFP_NOFS), there is no kmalloc() ahead of it, and `value` ends up holding the int return (CR2 = 0x1c at the following memcpy). That is the unexpanded source-level call, i.e. HAVE_POSIX_ACL_TO_XATTR_ALLOC_BUFFER was defined against a kernel that has the old prototype.
The other explanation doesn't hold: all three call sites reach this header unconditionally (llite/acl.c -> llite_internal.h -> lustre_compat.h, and osd_internal.h -> lustre_compat.h), so with the old macro in place the compat wrapper could not have been silently skipped.
If that's right, the defect is in the detection, not the name. The conftest leans on -Werror turning -Wint-conversion into an error; a hard type error is harder to lose:
void *(*p)(struct user_namespace *, const struct posix_acl *,
size_t *, gfp_t) = posix_acl_to_xattr;
Could you confirm whether config.h in that build had HAVE_POSIX_ACL_TO_XATTR_ALLOC_BUFFER set (or whether the modules were built against different kernel headers than the running kernel)?
(minor) With the posix_acl_to_xattr redefinition gone, the escape hatch that came with it is dead: config/lustre-core.m4:3707 still AC_DEFINEs old_posix_acl_to_xattr(), and nothing in the tree has ever called it. Worth dropping in the same patch. It could not have worked anyway - config.h is included first, so old_posix_acl_to_xattr(a, b, c, d) expanded to posix_acl_to_xattr(a, b, c, d), which this header's macro then rewrote back into compat_posix_acl_to_xattr() with the arguments in the wrong roles.
LU-20461 acl: Add a prefix for posix_acl_to_xattr
The compiler might be confused by defining a macro
with the same name. So add a prefix to avoid such an issue.
Fixes: f85a7cf4c8d3 ("LU-20133 build: Compatibility updates for kernel v7.0")
Signed-off-by: Yang Sheng <ys@whamcloud.com>
Change-Id: I535f589bde085e0c8e1f6081f24d7c2cd261db5c
| unique failing test | history |
|---|---|
| recovery-small@zfs:test_115b | seen in 23 other reviews |
| recovery-small@zfs:test_120 | seen in 14 other reviews |
| sanity-lnet@zfs:test_290 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lnet@zfs:test_291 | seen in 1 other review |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne | RHEL 8.10 / x86_64 | ran 5 tests. 2 tests failed: sanity-lnet, sanity. | session |
| review-ldiskfs-dne | RHEL 9.7 / x86_64 | ran 5 tests. 2 tests failed: sanity-lnet, sanity. | session |
| review-ldiskfs-dne-arm | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 5 tests. 2 tests failed: sanity-lnet, sanity. | session |
This is moving a lot of socklnd specific code out of LNet. After this, the lnet_inet*_enumerate() family of functions are the largest offenders.
We might have to think about backward compatibility for these tunables.
accept_backlog is definitely tuned by large sites. You also need to update sanity-lnet 290/291
LU-20412 ksocklnd: move lib-socket and acceptor to the LND
... since the other LNDs that used these interfaces have
been gone for a long time. The functions for enumerating
ethernet interfaces have been moved to lnet/lnet/enumerate.c
for now. Remove all unneeded EXPORT_SYMBOL().
We now no longer start the acceptor thread if socklnd is
not loaded.
Fixes: 8be9e4136965 ("LU-6209 lnet: Delete all obsolete LND drivers")
Test-Parameters: trivial
Signed-off-by: Timothy Day <timday@thelustrecollective.com>
Change-Id: Ide7c66685ec3a0a81a08f1e6a3348a9ebd102589
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity-sec. | session |
(minor) "Augment"?
Auggie is Augment's cli tool you can run in a terminal, much better than mucking around with vs code and such: https://docs.augmentcode.com/cli/overview
Not properly aligned.
Better would be
if (!lnd || !lnd->lnd_nl_get || !lnd->lnd_keys)
return rc;
It removed one level of indentation and the checkpatch issue below.
LU-19769 lnet: simplify lnet_net_show_dump This is 100% agent-refactoring using auggie and whatever default model they use underneath. 1. Reduced Function Size: The main function went from ~363 lines to ~142 lines (61% reduction) 2. Created 7 Helper Functions: • lnet_ni_format_cpts() - Formats CPT list as a string • lnet_ni_show_basic_info() - Outputs NID, status, and interface info • lnet_ni_show_stats() - Outputs basic send/recv/drop statistics • lnet_ni_show_msg_stats_type() - Outputs detailed message statistics • lnet_ni_show_health_stats() - Outputs health monitoring statistics • lnet_ni_show_tunables() - Outputs network and LND tunables • lnet_ni_show_extended() - Orchestrates all extended information output 3. Improved Code Quality: • Reduced nesting depth from 6 to 4 levels • Better separation of concerns • Each function has a single, clear responsibility • Comprehensive documentation for all helper functions • Improved error handling and propagation 4. Reusability Analysis: • Several helper functions (CPT formatting, basic info, stats, health stats) can be reused in other parts of the codebase • The message stats function is specific to network interface dump but follows a pattern that could be applied to similar functions like lnet_peer_ni_show_dump() Change-Id: I0843206c84da5f53c48550ef1ec047a3c50b39f9 Signed-off-by: Oleg Drokin <green@whamcloud.com>
| failed enforced test | platform | detail | |
|---|---|---|---|
| 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-selinux-ssk-part-2 crashed | RHEL 8.10 / x86_64 | ran 9 tests. 3 tests failed: sanity-selinux, sanity-sec, recovery-small. %% THIS TEST SESSION CRASHED %% | session |
LU-17671 libcfs: track each OBD_ALLOC() and dump leaked ones when a module is being unloaded Test-Parameters: fortestonly Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Change-Id: Ia499928bde821cc3a6b558a175b0e279bdfc68fa
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-3 | CentOS 8.3/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
LU-15485 lprocfs: preallocate all lprocfs_stats Allocating the stats as-needed leads to fragmentation. lprocfs_alloc_stats() preallocates only for IRQ_SAFE stats. It does this so that it doesn't have to try to allocate memory in an interrupt handler. When the stats are allocated as-needed, this can lead to fragmentation. Change lprocfs_alloc_stats() to preallocate all stats. HPE-bug-id: LUS-642 Signed-off-by: Ann Koehler <amk@cray.com> Signed-off-by: Chris Horn <chris.horn@hpe.com> Change-Id: Iaed09f6763fe53e273672829bece417c9370a15e
NB: the `ignore` keyword is even stronger, in that Jenkins won't even try to build the patch if it is only posted for review/reference
LU-19410 utils: lnetdump Implement a tool to capture LNet packet dumps using eBPF. Test-Parameters: forbuildonly Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: I9b19e59ec758de19d95a09fb291066414cf6bf8e
I don't understand why test_910 and test_911 need to be explicitly skipped here? These are new tests being added by this patch, so they should be skipped automatically by the subtest itself based on the server version or testing for the sparse_read option. Also, it looks like test_60g interop is only an issue with servers <2.13. If that is not done properly in this patch, then it will just cause all other interop testing to fail for these subtests in the future.
The 2.16 client will not even have test_910 and test_911 in the sanity.sh script, so listing those subtests here is unnecessary.
Cyril, can you please post a rebased version of the patch and I will try to get someone else to do a code review to see if they can spot the bugs you are trying to find.
I think I found the problems. I have a patch in mind. I am testing my theory and I need be sure it is the best way.
Is sd_md_start initialized somewhere?
In lnet_md_sparse_save_bitmap. Did I miss something?
It seems like sd_hole_length could be 0, are we guaranteed not to come here then? Because otherwise it'll overflow.
hole_length is used on clients and only when we have holes, so sd_hole_length will be always greater than 0. But if we have a "small" page, sd_hole_length could be smaller that sizeof(sd_layout). So, I changed the type.
(style) this comment doesn't explain what "sro_threshold" is, except to say that it is the threshold for SRO... Better to just name the variable well:
```
unsigned int bd_sparse_read_threshold_pages;
```
and don't have a comment at all. It is a _bit_ long for my liking, but has the benefit that the usage can be found along with all the other places where "sparse_read_threshold" is used.
I have added what SRO is
(style) spaces around that `*`
(style) `pb_sparse_read_threshold_4kb`
(style) renaming this to `pb_sparse_read_threshold_4kb` would make it more clear to users what it is for.
If it is necessary to check that imp is not NULL here, is it enough to only check the rq_type and rq_reqmsg above?
From what I saw, yes it is enough because we have the import in this case.
Is this safe? Is bd_nob_transferred always at least the layout struct size?
It is int, so it is not a problem if it less than zeroes. It will represent the shift we need to apply to the quantity of received data.
What *is* fed in to the high bits in this case? Is it doing sign-extending? Does that make sense for unsigned arguments?
I am not sure whether I got your question right about sign extension… Anyway, this function shrunk the bitmap, that is why we don't need to add 0s. Does that answer your question?
Then I don't understand why this duplicate function is needed? Shift right will always zero-fill the top bits, so it doesn't seem different from the "trunc" version here?
Compared to vanilla function, we don't have the memset part. The reason is that here we have "have a shrunk bitmap of size nbits-shift" instead of size nbits.
(style) adding tests at the end is prone to repeated conflicts as other patches are landing. Better to use some intermediate test number to avoid this (e.g. test_119d).
LU-16897 lnet: sparse read optimization (SRO) When a sparse file is read, pages representing holes are built with zeroes and sent. Sparse read optimization (SRO) will prevent sending zeroes through network. When an OSS wants to send an LNet message containing pages coming from holes, md is remapped to skip holes and an LNET_MSG_PUT_SPARSE is sent to share the new mapping with hole locations. When the client receives this message, it does the remapping and ACK. Then, the server will send the remapped data as usual. SRO works at ptlrpc and LNet level, leaving lnd code untouched. It requires the patch on the client and the OSSs. If the OSS or the client does not have the patch, SRO will simply be disabled. SRO is configured per client (one value for each OST): $ lctl set_param osc.*.sparse_read_threshold_kb=<uint> If the value is 0, SRO is simply disabled. If the value is greater, it defines the threshold for the minimum number of sparse pages needed (on the client) in an LNet message to have the optimization enabled. The value in kiB is rounded up to correspond to a multiple of PAGE_SIZE. Indeed, since SRO increases the number of messages shared between the OSS and the client, it won't be always productive. Thus, the threshold can be tuned depending on the environment. Test-Parameters: testlist=sanity serverversion=2.16 env=SANITY_EXCEPT="65i 65j 65k 65l 65n 65o 65p 65q 65r 66 69 73 77a 77b 77c 77d 77g 77k 77l 78 81a 81b 99 101b 101c 101d 101g 101h 101i 101j 101m 102b 102c 102d 102f 102i 102j 102k 102m 102n 102s 102t 103b 103e 103f 104a 104d 105a 105b 105c" Test-Parameters: testlist=sanity clientversion=2.16 env=SANITY_EXCEPT="0d 119p 230b" Test-Parameters: testlist=sanity,sanity-flr env=SPARSE_READ_THRESHOLD=1 Test-Parameters: testlist=sanity env=ONLY="910 911" clientarch=aarch64 clientdistro=el9.5 Signed-off-by: Cyril Bordage <cbordage@whamcloud.com> Change-Id: I81ed101ee2a774866c03a5d44526e00ab96b210e
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | RHEL 9.5 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: recovery-small. | session |
I don't see shared variables here. Please, describe there and how obj->do_index_ops is shared
obj->do_index_ops is a cross-thread shared variable in Lustre’s dt_try_as_dir lazy initialization mechanism: one thread assigns values to the OSD-layer and LOD-layer obj->do_index_ops in sequence (OSD first, then LOD) via lod_index_try/osd_index_try, while other threads check the LOD-layer obj->do_index_ops—if it is non-null, they assume the OSD-layer is also initialized (and skip assignment), which relies on the implicit assumption that the assignment order is visible across threads. This works on x86 (strong memory ordering) where the assignment sequence is preserved in cross-thread visibility, but on ARM (weak memory ordering), the shared obj->do_index_ops variable’s visibility is reordered: other threads may see the LOD-layer obj->do_index_ops as non-null (from another thread’s assignment) yet the OSD-layer as null, breaking the assumption and causing errors, as the shared variable’s cross-thread visibility does not maintain the intended assignment order. Insert a read barrier between the two read operations to guarantee the ordering.
Liu Qinfei, thank for the explantion
LU-16246 osd-ldiskfs: ensure r/w ordering of do_index_ops Add smp_rmb() in lod_lookup() to guarantee ordered reads of obj->do_index_ops and next->do_index_ops variables on ARM platform. Add smp_wmb() in osd_index_try() to ensure ordered assignment of dt->do_index_ops variable on ARM platform. Both barriers prevent potential out-of-order execution issues specific to ARM architecture. Signed-off-by: liuqinfei <lucas.liuqinfei@huawei.com> Signed-off-by: luo rixin <luorixin@huawei.com> Change-Id: If27c4770c3c84560e51de955849364846661252d
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-2 | RHEL 8.10 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
| review-dne-zfs-part-5 | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
LU-20163 ptlrpc: debugfs entries in ptlrpc we should register debugfs entries after all the internal structures (like NRS) have been initialized and unregister before any internal structures are released. should fix problem like this: watchdog: BUG: soft lockup - CPU#7 stuck for 22s! [lctl:47830] irq event stamp: 0 hardirqs last enabled at (0): [<0000000000000000>] 0x0 softirqs last disabled at (0): [<0000000000000000>] 0x0 CPU: 7 PID: 47830 Comm: lctl Tainted: G W O 5.14.0 #17 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), Call Trace: <IRQ> __pv_queued_spin_lock_slowpath+0x242/0x2b0 do_raw_spin_lock+0x8f/0xa0 ptlrpc_lprocfs_nrs_policies_seq_show+0x13c/0x900 [ptlrpc] seq_read_iter+0x100/0x460 seq_read+0x131/0x160 full_proxy_read+0x4b/0x70 vfs_read+0x8e/0x3b0 ksys_read+0x50/0xc0 do_syscall_64+0x38/0xe0 Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Change-Id: I2039c43b294aa1698fe4e2b6d343f2310f6ea5aa Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | RHEL 9.5 / x86_64 | ran 11 tests. 1 tests failed: sanity-lnet. | session |
| review-dne-zfs-part-2 | RHEL 8.10 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
One major problem with this patch that the "large NID" is not *only* an IPv6 NID of 16-byte IOv6+4-byte network number=20 bytes, but potentially any other size NID as well, so this would shift the offset of all of these messages and break the protocol if some other size NID was used. It doesn't make sense to need a new protocol revision every time that a new NID size is used. The size of the NID is encoded into struct lnet_nid itself, including IPv4 NIDs (which have "size 0", with implicit +8 bytes to the size), so it would be better to rework this patch to allow a variable sized "struct lnet_nid" and then use the NID size to calculate the offset of the rest of the message buffers.
Hi, Are you proposing that we use `struct lnet_nid` directly in `struct kib_immediate_msg` for `ibim_hdr` (with length determined by NID size), rather than separate `struct lnet_hdr_nid4`/`lnet_hdr_nid16` types? Implementing this variable‑size NID scheme for full IPv6@o2ib support would require refactoring `struct kib_msg` and related code — fields would need dynamic offset‑based access, and we’d need to address potential alignment and memory‑allocation issues. Thanks!
I'm not advocating to do a massive restructuring of the code immediately, but I think it would be preferable to move in the right direction to handling variable-sized NIDs. There is already code in this patch to partly handle this, but for only two fixed NID sizes. These could be replaced with checking nid_size from the NID to determine the offsets.
Rather than reserving separate version numbers up to 15, it would be better to just consider these three bits (0x0010, 0x0001, 0x0002) used for the old "version" but change the version into a compatibility but mask instead of sequential version numbers (which are not very flexible). Then use 0x0004 (or 0x0020) to mean "LARGE_NID" and check for this bit independent of the version number. It would be nice to rename "VERSION_2=0x0002" to be related to the reason this new protocol version was added. Something like "MAP_ON_DEMAND", but I don't think there is a separate meaning for the 0x0010 bit. It should just be a sanity check and always be set, and verified in the places that are currently checking for _V1 or _V2. That avoids issues with the new "LARGE_NID" bit being set, since this bit can just be checked independently. Since V1 is extremely old (V2 was added in 2009) it doesn't really make sense to keep compatibility with that version anymore, and it could just be dropped.
Oh, I see. You mean keeping the previous 3 bits as the old version field and using the remaining 13 bits as new feature extension bits, with "LARGE_NID" needing only 1 of them. A related thought: an incrementing version number scheme is typically tied to connection and version negotiation—for example, a message with a higher version number may remain forward compatible to some extent with messages of lower versions. If that kind of version negotiation isn’t needed, we can use feature bits instead. Thanks!
We still need version interoperability, but unlike the incrementing version numbers we can explicitly choose to remove support for old features selectively as needed, or never. This has worked extremely well for Lustre protocol interoperability negotiation, since we can have short-lived "features" that are only determining if the peer has a particularly impactful bug fix, but can be quickly deprecated, while some features remain permanently negotiable if they do not need to be enabled all the time (hypothetically like compression or encryption at the LNet level, not that we would implement that).
"MSG3" is not a good name for this. Better to name it after what it means, "LARGE_NID" or similar.
Sure, we should use a feature‑oriented naming. Thanks!
The mag_version field should be renamed to msg_features and users updated appropriately.
Hi, are you suggesting to replace the `ibm_version` field in `struct kib_msg` with a new `ibm_features` field, implemented as a bit‑field, to free up bits for extensions? Thanks!
IMHO, these only V_1/V_2 checks should be replaced with "version & IBLND_MSG_VERSION_CHECK", where it is checking the 0x10 bit and nothing else, then let the rest of the bits define features.
Oh, I see, Thanks!
All of this "is_msg3" passing is unnecessary, IMHO. It should be possible to pass the msg_features field to these functions and check if the LARGE_NID bit is set, then CALCULATE the message SIZE based on the size of the NID.
Sounds great! Thanks!
This should not really be an LASSERT. It is OK to check that the actual version numbers stay the same, but not that the current version is always V2.
Yes, it seems this is mainly checking some constants. `IBLND_MSG_VERSION` is like an alias for `IBLND_MSG_VERSION_2`, serving as a simpler default for V2. If a new VERSION is introduced later, `IBLND_MSG_VERSION` might either be unnecessary or should point to the new default VERSION.
LU-18318 lnet: Add lnet routing between IPv6 tcp and o2ib Typical cross-network forwarding scenario: A <-o2ib(IPv4)-> R <-tcp(IPv6)-> B Add kib_msg immediate/get/putreq msg3 to support nid16(IPv6). An ipv4@o2ib NIs will use msg3 for ipv6@tcp6 traffic, and keep previous version msg for ipv4@tcp to preserve performance and compatibility. Signed-off-by: Xinxia Qu <xqu@ddn.com> Change-Id: Ife74e8baffaa18a9ea4fdf648ab00979bd89122f
| unique failing test | history |
|---|---|
| conf-sanity1@zfs+DNE:test_24a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity1@zfs+DNE:test_24b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity2@zfs:test_41b | seen in 2 other reviews |
| conf-sanity2@zfs:test_41c | seen in 2 other reviews |
| conf-sanity2@zfs:test_42 | seen in 2 other reviews |
| conf-sanity2@zfs:test_43a | seen in 2 other reviews |
| conf-sanity2@zfs:test_43b | seen in 2 other reviews |
| conf-sanity2@zfs:test_44 | seen in 2 other reviews |
| conf-sanity2@zfs+DNE:test_50h | seen in 1 other review |
| conf-sanity2@zfs+DNE:test_50i | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_1n | seen in 3 other reviews |
| ost-pools@zfs:test_11 | seen in 3 other reviews |
| ost-pools@zfs:test_15 | seen in 3 other reviews |
| ost-pools@zfs:test_16 | seen in 3 other reviews |
| ost-pools@zfs:test_19 | seen in 3 other reviews |
| ost-pools@zfs:test_20 | seen in 3 other reviews |
| ost-pools@zfs:test_21 | seen in 3 other reviews |
| ost-pools@zfs:test_22 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_23a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_23b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_24 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_27 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs:test_28 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| ost-pools@zfs+DNE:test_15 | seen in 3 other reviews |
| ost-pools@zfs+DNE:test_16 | seen in 3 other reviews |
| ost-pools@zfs+DNE:test_20 | seen in 3 other reviews |
| ost-pools@zfs+DNE:test_21 | seen in 3 other reviews |
| sanityn@zfs:test_39d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64 | ran 7 tests. 2 tests failed: lnet-selftest, sanity. | session |
| review-ldiskfs-dne | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
LU-16011 lnet: remove LBUG() in srpc_client_rpc_expired()
We shouldn't crash just because an RPC expired.
Lustre-change: https://review.whamcloud.com/55785
Lustre-commit: edc9b7f5204a7a3979a8e69c075f55fdaab6ad4f
Fixes: e5026380 ("LU-16011 lnet: use preallocate bulk for server")
Test-Parameters: trivial
Test-Parameters: testgroup=review-ldiskfs-arm testlist=sanity-lnet,lnet-selftest
Signed-off-by: Timothy Day <timday@amazon.com>
Change-Id: Ia4e9bf7f688b2920c91444f57f7a7da2b1f89a67
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Chris Horn <chris.horn@hpe.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
LU-8395 lnet: Limit total number of lnet-selftest threads On densely cored systems, lnet-selftest can create too many scheduler threads. This patch limits the total thread count to 64 regardless of CPU parititioning. Signed-off-by: Doug Oucharek <doug.s.oucharek@intel.com> Change-Id: I4012a321fcfc607bf17ffaad50e17268a1acc56f
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-4 | CentOS 8.3/x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
LU-15069 llite: Clean up bit shift for assert There is a bizarre comment which says we're not converting pages to bytes yet to save cost in checking an assert, but we do that conversion immediately after the assert *and* it requires doing a similar shift in the assert. This is quite strange - clean it up. Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: Id2bb4e6910276537d807828a9a33439dea054c3b
LU-8330 wiretest: Add IOCTL checking to wiretest Add IOCTL checking (to ensure they don't change) to wiretest, but don't add to ptlrpc ASSERTS. Doing this, showed that the OBD_IOC_GET_MNTOPT doesn't work in user-space as mntopt_t isn't defined in user-space and throws an error if the appropriate header is included. This type is an enum, so should be the same as a long. Change-Id: I6edf4c8bdd501a62cc7214ad14d3bb92822ffb99 Signed-off-by: Nathaniel Clark <nclark@whamcloud.com>
| unique failing test | history |
|---|---|
| conf-sanity4@ldiskfs+DNE:test_153b | seen in 1 other review |
| conf-sanity4@ldiskfs+DNE:test_161b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity4@ldiskfs+DNE:test_162 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity4@zfs:test_161b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity4@zfs:test_162 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-3 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-3 | RHEL 9.5 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-3 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
(typo) "libcfs"
(style) align continued lines after first '(' on previous line, so that the conditionals are visually separated from the code
(style) checks should be packed on as few lines as possible
(minor) please rename this subtest like `test_161a() # was test_161`, otherwise "test_161" and "test_161b" cannot be run independently of each other.
It would be useful if this tested 8 or 16 NIDs, which is common in production systems (4 failover hosts, 2 or 4 NIDs each)
It might be better to make up a "more fake" address, in case the "+10" address is live and in use? That might result in the mount trying a totally unrelated test cluster.
It would also be useful to confirm that mounting with `mgsname@nettype:/fsname` results in `mgsname` automatically being shown in the `/proc/mounts` output in the multi-DNS case. That was added in patch https://review.whamcloud.com/59934 ("LU-16738 utils: add mgsname mount option for custom hostname display"), and _should_ allow `mount` and `df` to list the symbolic hostname for the MGS instead of a list of NIDs, which make the output much cleaner and easier to understand.
LU-19412 libcfs: DNS multi-address name resolution
When mount.lustre is doing DNS name resolution (e.g. "mount -t lustre
mgsnode@tcp:/testfs /mnt/testfs") the mgsnode hostname is looked up
via DNS (or other service) and may return multiple NIDs to the caller.
However, mount.lustre only uses the first IP address returned.
It would be useful to use all of the NIDs returned from the DNS
hostname lookup to locate the MGS, as if they were all listed on the
command-line.
To do so, we added a new function lbcfs_strnids alongside the old
libcfs_strnid in nidstr.h
int libcfs_strnid(struct lnet_nid *nid, const char *str);
int libcfs_strnids(struct lnet_nid *nids, int alen, int *nr,
int *nf, const char *str);
The new libcfs_strnids function makes use of the addition of two new
function pointers to netstrfns:
int (*nf_str2addrs)(const char *str, int nob, __u32 *addrs,
int alen, int *nr, int *nf);
int (*nf_str2addrs_size)(const char *str, int nob,
__be32 *addrs, size_t *addr_size,
size_t asize, int *nr, int *nf);
For an illustration of the result, see the following example:
> getent ahostsv4 rocky9
192.168.105.20 STREAM rocky9
192.168.105.20 DGRAM
192.168.105.20 RAW
192.168.105.30 STREAM
192.168.105.30 DGRAM
192.168.105.30 RAW
> mount -t lustre rocky9@tcp:/lustre /mnt/lustre
> lctl get_param mgc.MGC192.168.105.20@tcp.import
mgc.MGC192.168.105.20@tcp.import=
import:
name: MGC192.168.105.20@tcp
target: MGS
state: FULL
connect_flags: [ version, mgs_nidlist, barrier,
adaptive_timeouts, full20, imp_recov, bulk_mbits, second_flags,
reply_mbits, large_nid ]
connect_data:
flags: 0xa000011001002060
instance: 0
target_version: 2.17.50.192
import_flags: [ pingable, connect_tried ]
connection:
failover_nids: [ "0@lo", "192.168.105.30@tcp" ]
nids_stats:
"0@lo": { connects: 1, replied: 1, uptodate: uptodate,
sec_ago: 29146 }
"192.168.105.30@tcp": { connects: 0, replied: 0,
uptodate: unknown, sec_ago: never }
current_connection: "0@lo"
connection_attempts: 1
generation: 1
in-progress_invalidations: 0
idle: 3 sec
Test-Parameters: testlist=conf-sanity env=ONLY=161b,ONLY_REPEAT=20
Signed-off-by: Louis-Marie Nicolas <lnicolas@ddn.com>
Change-Id: Icf09a7bcf4b4eae399525c01a31f710d04bd2015
LU-19938 lnet: CONFIG_MEM_ALLOC_PROFILING support Support CONFIG_MEM_ALLOC_PROFILING by wrapping our allocators in alloc_hooks. We may need to update other functions as well. Test-Parameters: forbuildonly Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: I0263ead8233800aa0eb14ba4c466974d471d3380
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: recovery-small. | session |
| review-ldiskfs-ubuntu failed 2× | RHEL 8.10 / x86_64, Ubuntu 22.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-sec. | session |
hm, I thought this was a partial revert of the prior patch, but it's not. So why are you opencoding l_wait_event_abortable here? just to better match the timeout case?
Yeah, just to match. There was actually a l_wait_event_abortable_timeout() at one point. Probably should revive that?
or a timeout occurs?
Double checking this: * Returns: * 0 if the @condition evaluated to %false after the @timeout elapsed, * 1 if the @condition evaluated to %true after the @timeout elapsed, * the remaining jiffies (at least 1) if the @condition evaluated * to %true before the @timeout elapsed, or -%ERESTARTSYS if it was * interrupted by a signal. So almost right, just need to handle the return codes better. We should probably double check the other wait_events.
looking at it some more, I think you misunderstood what's going on here. The ldlm_expired_completion_wait() is going to either cancel the lock by invalidating the import on a client or for a server do the whole "waiting indefinitely" because if we are waiting on another server thread, we cannot really just stop waiting on another server lock. In here you make it always obey the timeout which breaks the infinite wait on server locks logic I think?
If you look at the original code before https://review.whamcloud.com/c/fs/lustre-release/+/35985, we were doing a single l_wait_event() which would timeout. There was no infinite wait at all unless NO_TIMEOUT was set. You can see the original macros in https://review.whamcloud.com/c/fs/lustre-release/+/37729. In fact, we never did a second wait at all. If the lock wasn't granted or cancelled after timeout, we gave up.
Well, it's kinda convoluted I guess. ldlm_expired_completion_wait() prints "lock timed out (enqueued at %lld, %llds ago); not entering recovery in server code, just going back to sleep" though it of course does nto ever go back to sleep? Neil replaced a single populate lwi (that's based on timeout / no timeout) with two and the second one is sorta infinite where previously it was not. But the end result is probably the same - the thread that waits for the lock sleeps indefinitely anyway until the lock is granted if the conflicting lock is a server lock and if it's not (and esp. on the client) the ldlm_expired_completion_wait() makes sure the lock is cancelled sooner rather than later anyway?
The new code can deadlock, but the old code didn't seem to have this issue. https://review.whamcloud.com/c/fs/lustre-release/+/55550 is trying to fix a similar problem, although I think we ought to restore the old behavior - instead of the approach in that patch.
what's the deadlock scenario you have in mind? The code is supposed to deadlock even in the old original approach for a lock that's helf by another server thread Looking at 55550 I guess this seeems somewhat related, but the information provided is very little.
The deadlock was observed on a production host - 6 or so threads stuck in ldlm_completion_ast() for > 1200 seconds. MDS was not responsive. None of the locks set LDLM_FL_NO_TIMEOUT, so I looked at the code and noticed that a indefinite sleep was introduced in a previous patch. > The code is supposed to deadlock even in the old original approach for a lock that's helf by another server thread From my reading, absent LDLM_FL_NO_TIMEOUT, the original code wouldn't be stuck in ldlm_completion_ast() indefinitely?
LU-19025 ldlm: ldlm_completion_ast() may never timeout
ldlm_completion_ast() may never timeout, even without NO_TIMEOUT.
One of the waits in this function has no timeout. So we might:
wait_event_idle_timeout()
-> ldlm_expired_completion_wait()
-> l_wait_event_abortable()
This will not continue until the lock is granted/canceled, or until
an allowlisted signal is sent. On the server, this could hang forever.
A previous version of Lustre had timeouts on both waits.
Fix this by using wait_event_interruptible_timeout() instead.
Also, enhance the signal blocking code to mirror the style in the
upstream kernel (Ceph, in this case).
Fixes: 366959b8cba5 ("LU-10467 ldlm: convert waiting in ldlm_completion_ast()")
Signed-off-by: Timothy Day <timday@amazon.com>
Change-Id: I58e4849efeb1e1bde24e77a5c66f0b0a654fd76e
| unique failing test | history |
|---|---|
| sanity-lnet@ldiskfs+DNE:test_150 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lnet@ldiskfs+DNE:test_510 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lnet@zfs:test_150 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lnet@zfs:test_510 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-lnet. | session |
| review-dne-zfs-subtest-change | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity-lnet. | session |
| review-ldiskfs-dne | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
| review-ldiskfs-dne | RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
LU-18741 lnet: Alternative Names Policy interface names lnetctl doesn't recognize alternative names. Added netlink interface to be able to read alternative name. The priority is interface name, link name the possible alternative names. Alternative names are available since Rocky 8.5. Test-Parameters: trivial Signed-off-by: Frank Sehr <fsehr@whamcloud.com> Change-Id: I701aacd57f0b3d2cccf46830665ab25df6d73229
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-part-1 | RHEL 9.5 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-part-2 | RHEL 8.10 / x86_64 | ran 13 tests. 1 tests failed: sanity-sec. | session |
| review-dne-part-2 | RHEL 9.5 / x86_64 | ran 13 tests. 1 tests failed: sanity-sec. | session |
| review-dne-part-5 | RHEL 8.10 / x86_64 | ran 7 tests. 2 tests failed: recovery-small, lustre-rsync-test. | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity-sec. | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-5 | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: recovery-small. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, SLES 15.5 / x86_64 | ran 7 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, RHEL 9.5 / x86_64 | ran 7 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 |
LU-19223 shrinkers: Add nr_scanned to all shrinkers If the Lustre shrinkers can't free any pages but don't set nr_scanned, they may be called forever by the kernel - see do_shrink_slab() in the kernel. Add nr_scanned support to the remaining Lustre shrinkers: - LDLM pools server and client shrinkers - Lu site shrinker - Page pools shrinkers Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: Ica35a0dabe1dce78fd3cd29174ef142a965be824
| unique failing test | history |
|---|---|
| conf-sanity4@zfs:test_122b | seen in 3 other reviews |
| recovery-small@zfs+DNE:test_10d | seen in 2 other reviews |
| recovery-small@zfs+DNE:test_18a | seen in 1 other review |
| recovery-small@zfs+DNE:test_18b | seen in 2 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
LU-16157 lnet: lst read-outside of allocation lnet_selftest want a some parameters from userspace, but it never sends. It caused a read of outside of allocation like BUG: KASAN: slab-out-of-bounds in lstcon_testrpc_prep+0x19e7/0x1bb0 Read of size 4 at addr ffff8888bbaa866c by task lt-lst/6371 lustre-change: https://review.whamcloud.com/48547 lustre-commit: 222fbed52e02122c752fcb7fca153e9d8fe487bf Test-Parameters: trivial testlist=lnet-selftest Signed-off-by: Alexey Lyashkov <alexey.lyashkov@hpe.com> Change-Id: I2a98e60c4be65c49fa9da4b418e50f1c7309b69d Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Reviewed-by: James Simmons <jsimmons@infradead.org> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 crashed | RHEL 7.6/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-2 | RHEL 7.6/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. | session |
| review-dne-part-3 crashed | RHEL 7.6/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-4 crashed | RHEL 7.6/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-1 crashed | RHEL 7.6/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-2 crashed | RHEL 7.6/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-3 crashed | RHEL 7.6/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-4 crashed | RHEL 7.6/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | RHEL 7.6/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
| review-zfs crashed | RHEL 7.6/x86_64 | ran 2 tests. 1 tests failed: lustre-initialization. %% THIS TEST SESSION CRASHED %% | session |
LU-3496 oss: rename OST_* RPC opcodes to OSS_* For consistency with MDS_* RPC opcodes, and the thought that the RPC opcodes relate to the remote OSS node more than the target, rename the OST_* constants to their OSS_* equivalents, along with RQF_OST_* and OBD_FAIL_OST_* definitions. Fix up other RPC opcode declarations to avoid typedefs. Signed-off-by: Andreas Dilger <adilger@whamcloud.com> Change-Id: I83e98e2778276de91856c5b944396f27773ebbe5
| unique failing test | history |
|---|---|
| conf-sanity3@ldiskfs+DNE:test_122a | NEW 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_123F | seen in 1 other review |
| conf-sanity3@ldiskfs+DNE:test_123G | NEW 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_135 | seen in 1 other review |
| conf-sanity3@ldiskfs+DNE:test_153a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-3 | RHEL 9.3/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-5 | RHEL 9.3/x86_64 | ran 6 tests. 1 tests failed: sanityn. | session |
LU-17022 obdclass: cleanup obd_device refcounting With the removal of lu_ref, class_incref()/decref() are now only thin wrappers around kref. So remove them. Replace all of the various obd_device freeing functions with a single obd_device_free() function. Cleanup some of the kref usage so that obd_device_free() can be call when the last reference is dropped. This is more in line with other usages of kref. Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: I165798ef973bad7c37d3af814af0b635a08a1082
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| custom-1002 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| custom-1004 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: pjdfstest. | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
I was didn't find that this has been added. :)
IMHO all the time fields don't need to be renamed, so that the patch size can be much smaller.
xxx_time is epoch seconds. xxx_time_ns is epoch nanoseconds. xxx_time_nsec is nanosecond part of timeval. On the other hand, renaming var names causes compiling error and helps to find any potential mis-using.
(minor) It is a bit confusing that all of these fields have been named "ns" when they may hold seconds when communicating with older peers. It would be useful to add a comment like:
__s64 lvb_mtime_ns; /* seconds before 2.16.0 */
for all of these fields.
Done
This struct should not be changed.
Add padding fields to keep the size of struct unchanged.
You should place some padding fields after this field to keep the size of mdt_body unchanged.
Remove this field to keep the size of ost_lvb?
I don't see place this is called.
Should align with tab.
This line is too long.
This makes sense because: 1) bash recgonizes "000000008" as invalid oct number; 2) touch xxx.000000008 is not touch xxx.8. It is safer to keep nanosecond a 9-digits string and compare them with [[ ]].
LU-1158 general: support nanosecond timestamps Change most s64 timestamps in memory from epoch seconds to epoch nanoseconds. Change the variable names from xxx_(a/m/c)time to xxx_(a/m/c)time_ns to indicate this change. struct ost_lvb, mdt_body and obdo are special. They support nanosecond timestamps by adding additional xxx_a/m/ctime_nsec fields. These time_nsec fields are only the nanosecond part of timestamps. Original xxx_a/m/ctime is kept as the epoch seconds. They are treated differently because they don't have regular pack/unpack functions, or sometime they are dereferenced from message body directly without packing/unpacking. Also rename obdo.o_ioepoch to o_padding_3 because this field was unused since commit v2_7_50_0-38-gd5d5b349f23e and was never used in production. To cooperate with client/server without this change, OBD_CONNECT_NANOSEC_TIME connection flag is enabled. Only if both client and server support the flag, the connection has this flag. When a time_ns field is packed to connection without OBD_CONNECT_NANOSEC_TIME flag, time_ns should be converted from nanosecond to second so that peer client/server can recieve epoch seconds as before. Opposite coverting happens during unpacking timestamps from connection without OBD_CONNECT_NANOSEC_TIME flag. Now the a/m/c timestamps of lustre file/dir should have non-zero nsec fields. Change sanity.sh/test_39 series test cases to check nsec field in timestamps. Remove utimensat_08 from pjdfstest ALWAYS_EXCEPT list for new clients and servers. Old client without nanosecond timestamps supporting should be able to work with this version of server reporting only seconds. Old server without nanosecond timestamps supporting should be able to work with this version of client reporting only seconds. Signed-off-by: Lei Feng <flei@whamcloud.com> Test-Parameters: testlist=sanity serverbuildno=4607 serverjob=lustre-master Test-Parameters: testlist=sanity clientbuildno=4607 clientjob=lustre-master Test-Parameters: testlist=pjdfstest Test-Parameters: testlist=pjdfstest serverbuildno=4607 serverjob=lustre-master Test-Parameters: testlist=pjdfstest clientbuildno=4607 clientjob=lustre-master Change-Id: I231ef0315a47f4587f917e197c36e3e321c8a58a
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 crashed | RHEL 9.3/x86_64 | ran 9 tests. 2 tests failed: replay-dual, mds-survey. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-3 crashed | RHEL 9.3/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-4 crashed | RHEL 9.3/x86_64 | ran 11 tests. 1 tests failed: mmp. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-5 | RHEL 9.3/x86_64 | ran 6 tests. 1 tests failed: sanityn. | session |
| review-dne-part-6 crashed | RHEL 9.3/x86_64 | ran 6 tests. 1 tests failed: replay-single. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-8 | RHEL 9.3/x86_64 | ran 4 tests. 1 tests failed: replay-dual. | session |
| review-dne-zfs-part-2 crashed | RHEL 8.9/x86_64 | ran 9 tests. 1 tests failed: mds-survey. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-3 crashed | RHEL 8.9/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-5 crashed | RHEL 8.9/x86_64 | ran 6 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-6 crashed | RHEL 8.9/x86_64 | ran 6 tests. 1 tests failed: replay-single. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | RHEL 8.9/x86_64 | ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | RHEL 9.3/x86_64 | ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | RHEL 8.9/x86_64, RHEL 9.3/x86_64 | ran 7 tests. 2 tests failed: sanity-lnet, sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | RHEL 8.9/x86_64, SLES 15.5/x86_64 | ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-zfs crashed | RHEL 8.9/x86_64 | ran 10 tests. 1 tests failed: replay-single. %% THIS TEST SESSION CRASHED %% | session |
(defect?)I tried passing env after obtaining it with lu_env_find() and it did not work for me. I am not sure if this is correct?
I think it's context dependent - although I'm not super familiar with how these lu_env are working. Based on the message below, it crashing in one scenario at least.
Instead of kref - we can still convert to refcount_t (only for places that require env context). It is still a win-win, and a direct conversion. Thoughts?
I went with kref to get the automatic free when the last reference is dropped. This patch is mostly intended to support the OSD cleanups in https://review.whamcloud.com/c/fs/lustre-release/+/55705/4. I'll have to dive into why this is crashing. Hopefully nothing major.
LU-18162 lu: convert to lu_device to use kref
Convert lu_device to use kref for ld_ref. Several subsystems
don't take proper references on the lu_device - so add
lu_device_get() and lu_device_put() calls where needed.
Add wrappers for ldto_device_{alloc,init,fini,free}(). This
enables us to grab references between init/fini and make
assertions about callers.
Move lu_device_get() and lu_device_put() to the lu_device.h
header. These functions are stubs and ought to be inline
rather than complete EXPORT'ed functions.
Implement ldto_device_next() to enable the different layers of
Lustre to navigate the lu_site without the benefit of calling
ldto_device_free() directly.
Update lu_site_print() to accept an `int` rather than an
`atomic_t`. This is a requirement for the kref conversion.
Signed-off-by: Timothy Day <timday@amazon.com>
Change-Id: I0a29af160c1a5c681d8a3887f2574246afe76248
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 9.4 / x86_64 | ran 4 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 |
Perhaps we could use an already existing request format? Curious if anyone else has thoughts.
I don't think we should have a dedicated RPC just to set this one bit.
LU-18615 mdt: setup protocal for super hide This is the first patch to implement "lfs hide [path]". With this cmd, [path] will be hidden from directory listing "ls -a". Similar to .lustre. We mark a file/directory as hidden by setting a one-bit flag in the lma_compact of trusted.lma. Here in this patch, we reset this bit as LMAC_HIDDEN = 0x00000080 in enum lma_compat. The "lfs hide [path]" cmd will be run from a lustre client. Therefore, this patch also reserves the new ptlrpc req_format to be sent between clients and MDSs. 1. We reserve "MDS_HIDE = 65" in "enum mds_cmd" 2. We "#define OBD_FAIL_MDS_HIDE_NET 0x2410" We also provide the new req_format "RQF_MDS_HIDE" in this patch. Signed-off-by: Zanhua Huang <zanhua@amazon.com> Change-Id: I797ae49d74c95fac7aa765ed83cda0c4603a7aa3
LU-4801 ldlm: Do not call ldlm_reprocess_all from enqueue ldlm_handle_enqueue0 seems to be always calling ldlm_reprocess_all for the lock resource hich iseems to be excessive and a waste of resources. Move the call to the cancel case for cancel on block locks. Change-Id: Ie380497866b83a81cb099777bb4c94936c6bd91a Signed-off-by: Oleg Drokin <oleg.drokin@intel.com>
LU-6657 mgs: eviction notifier In suppress ping environment the evicted client is not able to recover from evicted state until an access goes to the server which has evicted the client. This patch provides a new feature for client to recover from evicted state in ping-less environment though it works well with pinger. Signed-off-by: Hiroya Nozaki <nozaki.hiroya@jp.fujitsu.com> Change-Id: I6475ce8dd1506d6e8f9e2405fab6a94ee25f9df1
LU-7722 build: add --no-initramfs to weak-modules In most of cases, Lustre modules are not necessary for initramfs. Thus, regenerating initramfs in scripts of RPMs is a waste of time. This patch adds --no-initramfs argument to weak-modules command in the scripts of RPMs by default. --enable-initramfs could be used to change this behavior when configuring. Signed-off-by: Li Xi <lixi@ddn.com> Change-Id: I3e490f9cacfd74619d774e44729cdbfc8c60db1c
LU-8145 libcfs: add dump debug trace on error support As we can not monitoring the debug trace all the time, especially when the error will happen. So here we add dump trace on error support, that will trigger the trace dump thread if it is not started. Change-Id: I57b5a7d94512e21d98cc25b4c0392690d01bbd37 Signed-off-by: Gu Zheng <gzheng@ddn.com>
LU-8192 nodemap: modify lctl to allow non-contiguous nm ranges This patch modifies the nodemap_add_range and nodemap_del_range lctl commands to accept the full LNET range syntax. Signed-off-by: Kit Westneat <kit.westneat@gmail.com> Change-Id: Iec7e9115f745be3ba623f640e183076bfd072ccc
LU-9914 lnet: gracefully handle peers with too many NIs The lnet_interfaces_max tunable governs the upper bound on the number of interfaces (NIs) this node thinks any node in the cluster can have (including itself). It is tunable to provide a "soft" upper bound as opposed to hard-coded one. When a peer with too many NIs shows up, peer discovery ends up stuck in a loop because the Push/Ping data it sends fails the validation check against the number of interfaces. This is undesirable behavior even though it implies that the node is misconfigured. To prevent peer discovery from getting stuck like this, make the following changes: - lnet_ping_info_validate() does not check against lnet_interfaces_max - its callers keep track of the number of NIs the peer claims to have in lp_data_nnis. - but lnet_peer_push_event() will drop a Push with too many NIs, and force a Ping - while lnet_discovery_event_reply() will also drop a Ping Reply with too many NIs, and set lp_ping_error to ensure discovery stops - and lnet_peer_is_uptodate() will signal that rediscovery (prompted by LNET_PEER_REDISCOVER) should skip a peer that has too many NIs. - lnet_discovery_event_reply() will emit an error message suggesting that lnet_interfaces_max should be increased. It remains up to the administrator to judge whether the suggested value is realistic or sign of a problem. - lnet_ping_target_setup() now has to explicitly check whether the node itself has more NIs than lnet_interfaces_max. This is still something you are not supposed to do. Signed-off-by: Olaf Weber <olaf.weber@hpe.com> Change-Id: I4e9ec42d320893ef8a85e84e75ccf54518f446fd
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | CentOS 7.0/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-dne-part-3 | CentOS 7.0/x86_64 | ran 5 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-4 | CentOS 7.0/x86_64 | ran 10 tests. 1 tests failed: sanity-quota. | session |
| review-dne-zfs-part-1 | CentOS 7.0/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
LU-10704 open: fetch LOOKUP lock for normal open This is done on both sides: 1. MDT take LOOKUP on normal open. 2. client revalidate dentry for atomic_open(). Signed-off-by: Lai Siyao <lai.siyao@intel.com> Change-Id: Ia91697d15303cf6ce8723816ed5a0473a559e36a
LU-11286 osp: Add an entry to show statfs state from OST Add a sys entry to dump the statfs results from OST; also fix a problem in 'lfs df' for statfs. Signed-off-by: Jinshan Xiong <jinshan.xiong@uber.com> Signed-off-by: Andreas Dilger <adilger@whamcloud.com> Change-Id: I4795e94be3876aea21ede8fa1a9f8dc1ffab13f3
LU-8365 ldiskfs: fix wrong logic of stream allocation The stream allocation has been changed in upstream. But looks like some logic different than original. The stream allocation should just be used in group preallocation and we should update goal every time to keep stream allocation closer last position. Signed-off-by: Yang Sheng <ys@whamcloud.com> Change-Id: Id3e4b52cf05badd7027f841b6a1f887bed6fe8a7
| unique failing test | history |
|---|---|
| conf-sanity-slow@zfs:test_69 | NEW unique failure for this branch in the last 30 days, but was seen 0 times across 0 other branches 0 reviews |
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
| unique failing test | history |
|---|---|
| sanity-quota@zfs+DNE:test_12b | seen in 11 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 crashed | CentOS 8.3/x86_64 | ran 12 tests. 3 tests failed: recovery-small, sanityn, sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-2 failed 2× crashed | CentOS 8.3/x86_64 | ran 16 tests. 2 tests failed: mds-survey, ost-pools. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-4 crashed | CentOS 8.3/x86_64 | ran 14 tests. 2 tests failed: sanity-pfl, replay-single. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-selinux crashed | CentOS 8.3/x86_64 | ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-selinux-ssk crashed | CentOS 8.3/x86_64 | ran 8 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-ssk | CentOS 8.3/x86_64 | ran 5 tests. 3 tests failed: sanity-sec, recovery-small, sanity. | session |
| review-dne-zfs-part-2 crashed | CentOS 8.3/x86_64 | ran 16 tests. 2 tests failed: sanity-pcc, mds-survey. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-4 crashed | CentOS 8.3/x86_64 | ran 10 tests. 1 tests failed: insanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs crashed | CentOS 8.3/x86_64 | ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs-ubuntu crashed | CentOS 8.3/x86_64, Ubuntu 20.04/x86_64 | ran 8 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
LU-11817 lnet: add timing statistics Calculate the max and average time of 1. LNet Message sends: from the point a message is sent to the LND till the point the tx credits are returned 4. LND queue: from the point a tx is queued on an internal queue until the point it's posted for send. 2. LND tx: from the point a message is put on the wire till the point tx is completed 3. LND rx: from the point LND is notified that a message arrived to the point message rx processing is completed Timing statistics are disabled by default and can be enabled on demand. Signed-off-by: Amir Shehata <ashehata@whamcloud.com> Change-Id: I2f829858f99780a94640cdd9cc1a60de4bdaebce
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | CentOS 7.0/x86_64 | ran 11 tests. 1 tests failed: sanity-pcc. | session |
LU-12421 lfs: fix ladvise range lfs ladvise mistakenly treats ranges like 0-1M as [0-1M], requesting action on 0,1045876, but this is actually 1M+1. We just need to subtract 1 from 'end' to reflect that ranges are [x,y), not [x,y]. This is easiest to test with lockahead, as incorrect ranges show up when requesting adjacent locks, such as 0-1M and 1M-2M. Add a general set of simple lfs ladvise lockahead tests. Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: Iad065316d166383356c2910d6604736b07029d8e
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-101 | CentOS 7.0/x86_64, RHEL 8.0/x86_64 | ran 3 tests. 1 tests failed: lnet-selftest. | session |
LU-0000 test: testing LST on el8 Test potential fix Test-Parameters: fortestonly testlist=lnet-selftest clientdistro=el8 serverdistro=el7.6 Change-Id: I346145d22e8268e5dc6f580ac0f8cf479093101c Signed-off-by: Minh Diep <mdiep@whamcloud.com>
LU-12782 llite: Convert attr lock to rwlock Under some shared file workloads, the cl_object_attr_lock ends up 'hot'. Because it is a spinlock which is often used only for reading, it can easily be converted to an rwlock. This should show up in some shared file workloads, notably shared file reading. Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: I50d6f04f31eeea3ab5af58a1b6b56c1d4cfc7093
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | CentOS 7.0/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-1 | CentOS 7.0/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | CentOS 7.0/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-arm | CentOS 7.0/x86_64, CentOS 8.0/aarch64 | ran 5 tests. 1 tests failed: sanity. | session |
LU-10968 hsm: encapsulate copyaction_private hsm_copyaction_private is allocated and populated by the llapi_hsm_action_begin call, which shouldn't be changed. In order to add more info to the structure, create a set of get/set methods, and use them. The first new method will be for archive_id. Signed-off-by: Ben Evans <bevans@cray.com> Test-Parameters: testlist=sanity-hsm Cray-bug-id: LUS-5990 Change-Id: I3e23a5093ed6d6b528e8d41d06f31479d531683b
| unique failing test | history |
|---|---|
| conf-sanity2@ldiskfs+DNE:test_52 | NEW unique failure for this branch in the last 30 days, and was seen 5 times across 1 other branches 1 reviews |
| conf-sanity2@ldiskfs+DNE:test_53a | seen in 3 other reviews |
| conf-sanity2@ldiskfs+DNE:test_53b | seen in 3 other reviews |
| conf-sanity2@ldiskfs+DNE:test_54a | seen in 2 other reviews |
| conf-sanity2@ldiskfs+DNE:test_54b | seen in 3 other reviews |
| conf-sanity2@ldiskfs:test_52 | NEW unique failure for this branch in the last 30 days, and was seen 4 times across 1 other branches 1 reviews |
| conf-sanity2@ldiskfs:test_53a | seen in 3 other reviews |
| conf-sanity2@ldiskfs:test_53b | seen in 3 other reviews |
| conf-sanity2@ldiskfs:test_54a | seen in 2 other reviews |
| conf-sanity2@ldiskfs:test_54b | seen in 3 other reviews |
| sanity1@ldiskfs+DNE:test_56ab | NEW unique failure for this branch in the last 30 days, and was seen 7 times across 1 other branches 1 reviews |
| sanity1@ldiskfs:test_56ab | NEW unique failure for this branch in the last 30 days, and was seen 6 times across 1 other branches 1 reviews |
| sanity-lfsck@ldiskfs+DNE:test_16 | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| sanity-lfsck@ldiskfs:test_16 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_3a | NEW unique failure for this branch in the last 30 days, and was seen 5 times across 1 other branches 1 reviews |
| sanity-quota@ldiskfs+DNE:test_3b | NEW unique failure for this branch in the last 30 days, and was seen 5 times across 1 other branches 1 reviews |
| sanity-quota@ldiskfs+DNE:test_3c | NEW unique failure for this branch in the last 30 days, and was seen 5 times across 1 other branches 1 reviews |
| sanity-quota@ldiskfs+DNE:test_5 | NEW unique failure for this branch in the last 30 days, and was seen 5 times across 1 other branches 1 reviews |
| sanity-quota@ldiskfs+DNE:test_6 | NEW unique failure for this branch in the last 30 days, and was seen 5 times across 1 other branches 1 reviews |
| sanity-quota@ldiskfs+DNE:test_7a | NEW unique failure for this branch in the last 30 days, and was seen 5 times across 1 other branches 1 reviews |
| sanity-quota@ldiskfs+DNE:test_7b | NEW unique failure for this branch in the last 30 days, and was seen 5 times across 1 other branches 1 reviews |
| sanity-quota@ldiskfs+DNE:test_7c | NEW unique failure for this branch in the last 30 days, and was seen 5 times across 1 other branches 1 reviews |
| sanity-quota@ldiskfs+DNE:test_12a | seen in 2 other reviews |
| sanity-quota@ldiskfs+DNE:test_17 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs:test_3a | NEW unique failure for this branch in the last 30 days, and was seen 4 times across 1 other branches 1 reviews |
| sanity-quota@ldiskfs:test_3b | NEW unique failure for this branch in the last 30 days, and was seen 4 times across 1 other branches 1 reviews |
| sanity-quota@ldiskfs:test_3c | NEW unique failure for this branch in the last 30 days, and was seen 4 times across 1 other branches 1 reviews |
| sanity-quota@ldiskfs:test_5 | NEW unique failure for this branch in the last 30 days, and was seen 4 times across 1 other branches 1 reviews |
| sanity-quota@ldiskfs:test_6 | NEW unique failure for this branch in the last 30 days, and was seen 4 times across 1 other branches 1 reviews |
| sanity-quota@ldiskfs:test_7a | NEW unique failure for this branch in the last 30 days, and was seen 4 times across 1 other branches 1 reviews |
| sanity-quota@ldiskfs:test_7b | NEW unique failure for this branch in the last 30 days, and was seen 4 times across 1 other branches 1 reviews |
| sanity-quota@ldiskfs:test_7c | NEW unique failure for this branch in the last 30 days, and was seen 4 times across 1 other branches 1 reviews |
| sanity-quota@ldiskfs:test_12a | seen in 2 other reviews |
| sanity-quota@ldiskfs:test_17 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
LU-12916 osd: use writeback cache in ldiskfs this is a proto to play with the idea: the cache is used in all the cases, the writes aren't synchronous. all delayed writes are counted under "delayed_writes" in osd-ldiskfs.*.stats in pages TODO: 1) direct sync IO from private buffers 2) sync IO + wait from pageceche set PG_writeback, drop from IO completion wait in osd_trans_stop() 3) sync IO w/o wait from pagecache set PG_writeback, drop from IO completion 4) no IO, just copy into pagecache mark pages/buffers dirty define policy for 1-4 Test-Parameters: fortestonly testlist=sanity,sanityn,sanity-benchmark Test-Parameters: fortestonly testlist=sanity,sanityn,sanity-benchmark Test-Parameters: fortestonly testlist=sanity,sanityn,sanity-benchmark Test-Parameters: fortestonly testlist=sanity,sanityn,sanity-benchmark Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Change-Id: Iabe362aa9ab777b2cac8c6a244415b899cbf2744
| unique failing test | history |
|---|---|
| sanity-quota@zfs+DNE:test_12b | seen in 70 other reviews |
| sanityn@zfs+DNE:test_39d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-4 failed 2× | CentOS 7.0/x86_64 | ran 12 tests. 1 tests failed: replay-single. | session |
LU-12991 lnet: remove rspt zombie list Add a direct pointer to the MD in the rspt and increment the md_refcount to account for this use. When an MD is unlinked detach the rspt from the MD, that will cause the md_refcount to be decremented and the pointer from the rspt to the MD NULLed out. The next time the monitor thread runs it'll see that rspt with a NULL MD pointer and free it. When response times out the MD is detached from the rspt and the md_refcount decremented. If the MD is unlinkable, then it'll be freed by the call to lnet_md_unlink(). Otherwise we'll call lnet_md_finalize() which will send an unlink event callback. When a response is received and the MD is unlinkable, then the MD is detached from the rspt. This will result in an rspt with the md_pointer NULL, which will be freed the next time it's encountered by the monitor thread. Removing the rspt zombie list simplifies the management of the rspt blocks. Signed-off-by: Amir Shehata <ashehata@whamcloud.com> Change-Id: I9c9a3c8b23032307d1c3badaa8d3a51a4e98e137
| unique failing test | history |
|---|---|
| sanity-sec@zfs:test_15 | seen in 7 other reviews |
| sanity-sec@zfs:test_18 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-1 | CentOS 7.0/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | CentOS 7.0/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
LU-13329 libcfs: catch improper failloc race cleanup If we are resetting a failloc race and there's a waiter, then it would not be woken up which is obviously not a state we want to be in. Change-Id: I97eccbacb6a04358e2cf2b42c28c402067bc20ca Signed-off-by: Oleg Drokin <green@whamcloud.com>
| unique failing test | history |
|---|---|
| sanity-quota@zfs+DNE:test_12b | seen in 100 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-3 | CentOS 7.0/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-1 | CentOS 7.0/x86_64 | ran 8 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-4 | CentOS 7.0/x86_64 | ran 10 tests. 3 tests failed: sanity-quota, sanity-pfl, replay-single. | session |
LU-13625 socklnd: bind socket to correct IP addr choose_ipv4_src() can end up choosing the wrong IP address if the destination IP address is on the same subnet as one of the other IP's assigned to the device. This will force the passive side of the socket to look up that other IP address, create the wrong NID. All LNet messages to the active will then be dropped. The socklnd should honor the specifications provided by LNet. Signed-off-by: Amir Shehata <ashehata@whamcloud.com> Change-Id: Iad8246a737b923638d775f253934b5b70a795d60
LU-10973 lnet: lustre log parser Added a log parser utility. It parses dlm, rpctrace and net logs. It is able to generate a sequence diagram showing the communication between the client and the servers. It can also generate a YAML file containing all RPC sends and receives in the parsed log. This aids in debugging logs as well as enabling test scripts which verify specific behavior. Some of the LNet logging was modified to add information which the parser can use. Test-Parameters: trivial Signed-off-by: Amir Shehata <ashehata@whamcloud.com> Change-Id: I507cc0e7e63ccde79ea4be9b459a1898550713de
| unique failing test | history |
|---|---|
| recovery-small@zfs:test_155 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity2@zfs:test_311 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-4 | RHEL 9.3 / x86_64 | ran 9 tests. 1 tests failed: sanity-flr. | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.9 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-1 | RHEL 8.9 / x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.9 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
LU-10360 mgs: Mount to dynamically added networks This feature adds the ability for clients to mount servers on networks or NIDs which has been dynamically added post server bring up. As an example, servers can initially be configured with a tcp network. Then a new network can be added after the servers are mounted using lnetctl: lnetctl net add --net tcp441 --if eth1 A new client which has not mounted the file system yet and only exists on the tcp441 network, can then successfully mount the file system on tcp441 network. This is accomplished as follows: The MGS registers with LNet for updates whenever a newly added network or NID are dynamically added to LNet or when through discovery LNet finds out about an update to a peer's NID list. The notification causes the MGS to update its Imperative Recovery log with the new NIDs. After updating the IR log, a notification is sent to the clients currently mounting the FS. When new clients connect to the MGS, the IR log is sent to the client. The client then uses that IR log to create connections instead of relying only on the llog, which would be out of date at this point. NOTE: This feature relies on LNet dynamic discovery feature. Test-Parameters: fortestonly Signed-off-by: Amir Shehata <ashehata@whamcloud.com> Change-Id: I1cc82917f2d407e7f6e18b6bf206568a35c5d2d5
| failed enforced test | platform | detail | |
|---|---|---|---|
| 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 |
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
LU-15003 sec: test native fscrypt Test native fscrypt. Change-Id: I28caaa57f3c7c479ae192716aed3fbddae700f6a Test-Parameters: fortestonly clientdistro=ubuntu2004 serverdistro=el8.5 trivial testlist=sanity-sec Signed-off-by: Sebastien Buisson <sbuisson@ddn.com>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne | CentOS 8.5/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
(minor) I see that "lctl get_param -y" is not (yet) documented in the usage message. Also, "lctl get_param" doesn't have a long "-y/--yaml" option, but it should. Also, long options "-F/--format/--classify", "-n/--no-name", "-N/--no-value", "-R/--recursive" should be added.
Good catch. I didn't notice either of those issues.
LU-16663 tests: add yaml testing wrappers for utils Add tester for lfs, lctl YAML output. Use this tester on a number of common sanity tests. This will improve YAML test coverage, while not requiring a large number of custom test cases to be made. Test-Parameters: trivial Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: I4679003ce7ee670b2a4a6aaf31c289e4e2aa86be
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-1 | RHEL 8.8/x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-zfs | RHEL 8.8/x86_64 | ran 8 tests. 1 tests failed: sanity-quota. | session |
LU-8802 obd: add strong locking to OBD lifecycle management
The OBD lifecycle code can race in certain conditions.
This is most noticable for class_{attach,detach,setup,cleanup}
and class_{incref,decref}. Implement a new global lock,
obd_lifecycle_management_lock, to stop these different
functions from racing. This lock can reliably prevent
the crashing seen in patch 51895 (caused by attempting
to setup and teardown the same OBD device in different
threads).
OBD devices are setup infrequently, so the potential for
lock contention is low. The time to setup about 10,000
OBD devices is around 10 seconds, with or without this
patch.
Lockless versions of certain functions have been
provided, since certain OBD cleanup and setup
routines must call some of these class_* functions.
Further, class_{attach,detach,setup,cleanup} have
been un-exported to make it harder to abuse these
functions. They were only used in a small number
of places.
Signed-off-by: Timothy Day <timday@amazon.com>
Change-Id: I4b0242b5d37de58fd67578edd3c624a3b971cbfe
| unique failing test | history |
|---|---|
| conf-sanity2@zfs:test_46b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity2@zfs:test_46b | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1002 | RHEL 8.9/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
LU-17327 tests: add test case for online MDT/OST addition Add conf-sanity test_46b for adding MDTs and OSTs online to a live Lustre filesystem that is under load. Alternate adding MDTs and OSTs until the config limit is reached, while copying directory trees into two different mountpoints. There should be no errors hit by rsync, and the new MDTs and OSTs should (eventually) be used by the copied directories. Test-Parameters: trivial Test-Parameters: testlist=conf-sanity env=ONLY=46b,ONLY_REPEAT=5 mdtcount=8 mdscount=4 Test-Parameters: testlist=conf-sanity env=ONLY=46b,ONLY_REPEAT=20 mdtcount=4 mdscount=2 Change-Id: Ib471c76ffffb0205ce2eee5d1e43867566eb2f41 Signed-off-by: Jian Yu <yujian@whamcloud.com>
LU-17391 rust: simple OBD API bindings Implement simple rust bindings for OBD API along with a simple OBD device demonstrating them. This was tested on Ubuntu 23.04 with the officially distributed rust bindings. https://rust-for-linux.com/ https://discourse.ubuntu.com/t/ubuntu-kernel-is-getting-rusty-in-lunar/34977 Test-Parameters: forbuildonly Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: I32ab4d085f19dc2347738ef6d3b8194f4e1c09c4
| unique failing test | history |
|---|---|
| sanity-sec@zfs:test_8 | seen in 19 other reviews |
| sanity-sec@zfs:test_21 | seen in 2 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | CentOS 7.0/x86_64 | ran 6 tests. 1 tests failed: sanityn. | session |
| review-dne-part-4 | CentOS 7.0/x86_64 | ran 10 tests. 1 tests failed: sanity-pfl. | session |
LU-4801 ldlm: use mutex for resource locks for flock resources Since flocks have a lot of heavy processing under resource lock, use a mutex for the lock to allow other users some CPU. Change-Id: I253aad02f4199fc6489f7ff197a812b7ecdd0619 Signed-off-by: Oleg Drokin <oleg.drokin@intel.com>
LU-13108 lustre: Improve ptlrpc_async_args union This patch improves union ptlrpc_async_args by replacing magic number used in member by a more meaningful #define. Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.super@gmail.com> Change-Id: Ib7f7e3111e6ae8607f05ba8ef0a4970c921164eb
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 9.3/x86_64 | ran 4 tests. 1 tests failed: sanity. | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.9/x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.9/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 |
| review-ldiskfs | RHEL 8.9/x86_64, RHEL 9.3/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
Is the LUSTRE environment variable also inherited by the system() command that is run? At first I was thinking "you can't just use '$LUSTRE' in the string!" but since the system command is executed by the shell it should work OK? Alternately, since this is already calling getenv() it could save the returned pointer and print it into the cmd string directly.
It works. For example: [centos@ip-172-31-20-187 lustre-release]$ LUSTRE=fizzbuzz ./lustre/utils/lfs help migrate man: fizzbuzz/doc/lfs-migrate.*: No such file or directory No manual entry for fizzbuzz/doc/lfs-migrate.* You can do the same thing in python, which is super helpful for integrating with shell scripts.
Does this interfere with tab completion of commands?
This code is only invoked when you run the `help` command, so it shouldn't interfere with shell completion.
This block doesn't seem to work, causing sanity.sh to fail. Even locally, this seems wrong. Also, this will need to be updated once the man pages are relocated.
LU-4959 parser: make help work like git The git help subcommand displays the man page for the given subcommand. Currently, the Lustre tools (lfs, lctl, lnetctl, lst) that use the parser in libcfs only return a small help text. This patch changes the parser to first make an attempt to display a related man page before falling back to the old help text. The implementation is inspired by git, but differs in a few ways. It is best-effort, it assumes that the user has 'man' available, and has some Lustre specific parsing. Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: I912e7c7e8439a822da0fb2e82f160adb9eaac589
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.8/x86_64 | ran 4 tests. 2 tests failed: conf-sanity, sanity. | session |
| review-ldiskfs-dne | RHEL 8.8/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-dne-arm | RHEL 8.8/aarch64, RHEL 8.8/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
LU-17373 tests: Improve do_nodes() to use no_dsh for local nodes On a client/server setup and starting cluster using llmount.sh. do_nodes() is called with both client and server. Under do_nodes() both local nodes and remote nodes make ssh calls. This patch improves do_nodes() to use 'no_dsh'(local calls, no ssh) calls when making calls to local node. The call to remote node continues as usual. Test-Parameters: trivial testlist=sanity,conf-sanity Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Change-Id: I2e45547d5bfcda6ffc17a3b990b9bf75f5d3f6d8
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne | RHEL 9.3/x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
My intention was to pick some new suffix that showed the file was a Lustre file layout and YAML. It could be ".lfl", but this should be lower-case and bold, instead of uppercase.
so you think this one is good to leave as is? I guess YAML_TEMPLATE_FILE already sort of hints the intended format is YAML?
Well, there are a million possible contents for a YAML file, but I was thinking if there is a specific ".lyl" Lustre YAML Layout file extension that it might be easier to reference these in other tools/docs/etc.
LU-18110 doc: lfs setstripe manpage refers to filename I checked online and .LYL file extension is not really a thing, I think .YML is what is meant here? Test-Parameters: trivial Change-Id: Ic8e62a926370e29ae13ad3960e95110b773adb0e Signed-off-by: Oleg Drokin <green@whamcloud.com>
| unique failing test | history |
|---|---|
| replay-single@zfs:test_65a | seen in 31 other reviews |
| sanity-hsm@zfs:test_251 | seen in 2 other reviews |
| sanity-hsm@zfs:test_254b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-3 | RHEL 9.3/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-5 | RHEL 9.3/x86_64 | ran 6 tests. 1 tests failed: recovery-small. | session |
| review-ldiskfs | RHEL 9.3/x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
LU-18246 zfs: fix for colocated client deadlock Some HSM solutions for Lustre use a client on the MDT to create directories and files. In case of small sized instances and during memory pressure, the allocations from ZFS could trigger a deadlock during an inline memory free by calling Lustre mdc APIs. The threads got stuck waiting for RPCs. To avoid this, use spl_fstrans_mark and spl_fstrans_unmark to disable inline memory reclaim. This is based on suggestion from the openZFS community - https://github.com/openzfs/zfs/issues/15786. Signed-off-by: Jeya ganesh babu Jegatheesan <jeyaga@amazon.com> Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: If42b9c32eea026386b0ddb5b9c65d5c9f1406652
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-7 failed 2× | RHEL 8.9/x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
LU-10499 pcc: add lctl pcc abort command to abort attaches This patch adds a new PCC command "lctl pcc abort [--wait|-w] [--detach|-d] <$LUSTRE_MNTPT> [$PCCROOT]". --wait|-w: wait all in-flight attaches aborted. --detach|-d: detach the PCC copies when scan the PCC backend. It can be used to abort in-progress attaches for a given PCC backend. It does not remove the PCC backend from a client. Add sanity-pcc/test_109 to verify it. EX-bug-id: EX-8971 Change-Id: Ib7152f7418aa1beb840919e98bf8de53c99b5c54 Signed-off-by: Qian Yingjin <qian@ddn.com>
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-7 | RHEL 8.9/x86_64 | ran 4 tests. 1 tests failed: sanity-pcc. | session |
LU-10499 pcc: parallel data copy for attach This patch parallelize the data copying work for pcc attach by using multiple threads in the ll_fid_path_copy helper. Nvidia provided performance numbers for this from their environment. This was with 4 MiB I/O size, they reported speed was similar but *slightly* lower at larger block sizes. This is probably an EXT4 limitation since Lustre speed scales with those larger sizes. (As PCC attach is a copy from Lustre to EXT4.) This is for attaching a single 2 TiB file, they also reported no performance regression for datasets with many small files. threads: 1 2 4 8 speed: 4 GiB/s 7.8 GiB/s 14.1 GiB/s 15.2 GiB/s Performance improved only very slightly past 8 threads, and 4 threads is clearly the sweet spot for performance. EX-bug-id: EX-7585 Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: Iffbb3892cfb5b2e71afe15d03f9aec9c84975092
| unique failing test | history |
|---|---|
| sanity-lnet@zfs:test_204 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lnet@zfs:test_205 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lnet@zfs:test_206 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lnet@zfs:test_207 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lnet@zfs:test_209 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-4 | CentOS 8.5/x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
| review-ldiskfs | CentOS 8.5/x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
| review-ldiskfs-arm | CentOS 8.5/aarch64, CentOS 8.5/x86_64 | ran 6 tests. 1 tests failed: sanity-lnet. | session |
| review-ldiskfs-ubuntu | CentOS 8.5/x86_64, Ubuntu 20.04/x86_64 | ran 6 tests. 1 tests failed: sanity-lnet. | session |
LU-14041 lnet: display CPT timing from lnetctl added command: lnetctl set percpt_time_stats_enable [0|1] to enable capturing per cpt time statistics and lnetctl percpt_time_stats show to dump per cpt timing stats Signed-off-by: Cyril Bordage <cbordage@whamcloud.com> Change-Id: I30699b204efca7920d6fdca690ea7024a9e9adb0
| unique failing test | history |
|---|---|
| sanity-hsm@ldiskfs+DNE:test_260b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-hsm@ldiskfs+DNE:test_260c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-hsm@zfs:test_260b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-hsm@zfs:test_260c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-101 | CentOS 7.0/x86_64 | ran 3 tests. 1 tests failed: sanity-hsm. | session |
| review-dne-part-1 | RHEL 7.8/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-dne-part-2 | CentOS 7.0/x86_64 | ran 11 tests. 2 tests failed: sanity-pcc, sanity-hsm. | session |
| review-dne-part-3 | CentOS 7.0/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-selinux | CentOS 7.0/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-1 | RHEL 7.8/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-2 | CentOS 7.0/x86_64 | ran 11 tests. 2 tests failed: sanity-pcc, sanity-hsm. | session |
| review-dne-zfs-part-3 | CentOS 7.0/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-4 | CentOS 7.0/x86_64 | ran 10 tests. 1 tests failed: sanity-quota. | session |
| review-ldiskfs | CentOS 7.0/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-arm | CentOS 8.0/aarch64, RHEL 7.8/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
LU-13384 hsm: create new copytool interface The current copytool interface has a combination of opaque and visible data, which increases, rather than hides complexity. This seeks to make a parallel interface for start, end and progress which is simpler. The new interface uses the files that are being operated on as the targets for the IOCTL, rather than the root directory. lhsmtool_posix: New mode which takes an input file of work. This new file is specified with the -F option. Each line is a new action for the copytool to perform, and the FIDs to use. These are handled by ct_restore_v2, ct_archive_v2 and ct_migrate_v2 which use the new llapi interface to operate. A new line in a work file looks like: ARCHIVE [0x200000403:0xd:0x0] [0x200000403:0xd:0x0] MIGRATE [0x200000403:0xd:0x0] [0x200000407:0xf:0x0] RESTORE [0x200000403:0xd:0x0] [0x200000403:0xd:0x0] Signed-off-by: Ben Evans <jevans@cray.com> Cray-bug-id: LUS-6843 Test-Parameters: env=COORDINATOR=external testlist=sanity-hsm Change-Id: I4e22aad88f137a5d28c6565b74231750ee50e939
| unique failing test | history |
|---|---|
| conf-sanity2@ldiskfs+DNE:test_43a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity2@ldiskfs+DNE:test_44 | seen in 2 other reviews |
| conf-sanity2@ldiskfs+DNE:test_50i | seen in 2 other reviews |
| conf-sanity2@zfs:test_43a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| conf-sanity2@zfs:test_43b | seen in 2 other reviews |
| conf-sanity2@zfs:test_44 | seen in 2 other reviews |
| sanity-quota@ldiskfs+DNE:test_0 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_1a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_1b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_1c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_1d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_1e | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_1f | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_1g | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_1h | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_3a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_3b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_3c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_5 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_6 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_7a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_7b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_7c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_7d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_7e | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_8 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_10 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_11 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_12a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_12b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_13 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_17 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_18 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_19 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_21 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_22 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_23 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_24 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_30 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_41 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_56 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_60 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_67 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_68 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_69 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_71a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_71b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@ldiskfs+DNE:test_72 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_0 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_1a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_1b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_1c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_1d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_1e | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_1f | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_1g | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_3a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_3b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_3c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_5 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_6 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_7a | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_7b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_7c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_7d | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_8 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_10 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_11 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_13 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_17 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_18 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_19 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_21 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_22 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_24 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_30 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_41 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_56 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_60 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_68 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_69 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs:test_72 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-3 | CentOS 8.3/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-4 | CentOS 8.3/x86_64 | ran 10 tests. 1 tests failed: sanity-quota. | session |
| review-dne-selinux-ssk | CentOS 8.3/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-3 | CentOS 8.3/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-4 | CentOS 8.3/x86_64 | ran 10 tests. 1 tests failed: sanity-quota. | session |
| review-zfs | CentOS 8.3/x86_64 | ran 8 tests. 1 tests failed: sanity-quota. | session |
LU-14674 test: change PERM_CMD to "lctl set_param -P" "lctl set_param -P" was meant as a transition from conf_param. Signed-off-by: Li Xi <lixi@ddn.com> Change-Id: Iaa291cbef1b9ad0b022322b3f6f43fc72105a6f4
LU-10973 lnet: fix path issues in scripts running lutf This is a test patch that attempts to fix the lutf start up scripts to be able to use paths that work properly when run in the lustre build environment as well as after being installed. Test-Parameters: @lnet Test-Parameters: fortestonly Signed-off-by: Serguei Smirnov <ssmirnov@whamcloud.com> Signed-off-by: Amir Shehata <ashehata@whamcloud.com> Change-Id: Ia3c2bf7bc904a7a35e25e11edbdf37a6e7280dd7
| unique failing test | history |
|---|---|
| sanity-lnet@zfs:test_204 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lnet@zfs:test_205 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lnet@zfs:test_206 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lnet@zfs:test_207 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-lnet@zfs:test_209 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs+DNE:test_12b | seen in 10 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 crashed | CentOS 8.3/x86_64 | ran 12 tests. 3 tests failed: recovery-small, sanityn, sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-part-2 crashed | CentOS 8.3/x86_64 | ran 20 tests. 4 tests failed: large-scale, mds-survey, sanity-scrub, ost-pools. %% THIS TEST SESSION CRASHED | session |
| review-dne-part-4 crashed | CentOS 8.3/x86_64 | ran 12 tests. 1 tests failed: replay-single. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-selinux crashed | CentOS 8.3/x86_64 | ran 7 tests. 1 tests failed: sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-selinux-ssk crashed | CentOS 8.3/x86_64 | ran 10 tests. 2 tests failed: recovery-small, sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-ssk | CentOS 8.3/x86_64 | ran 5 tests. 3 tests failed: sanity-sec, recovery-small, sanity. | session |
| review-dne-zfs-part-1 crashed | CentOS 8.3/x86_64 | ran 10 tests. 2 tests failed: sanityn, sanity. %% THIS TEST SESSION CRASHED %% | session |
| review-dne-zfs-part-2 crashed | CentOS 8.3/x86_64 | ran 16 tests. 2 tests failed: mds-survey, ost-pools. %% THIS TEST SESSION CRASHED %% | session |
| review-ldiskfs retesting crashed | CentOS 8.3/x86_64 | ran 7 tests. 2 tests failed: sanity-lnet, 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-lnet. | session |
| review-ldiskfs-ubuntu failed 2× crashed | CentOS 8.3/x86_64, Ubuntu 20.04/x86_64 | ran 8 tests. 2 tests failed: sanity-lnet, sanity. %% THIS TEST SESSION CRASHED %% | session |
LU-11817 lnet: display time stats from lnetctl added command: lnetct set time_stats_enable [0|1] to enable capturing time statistics and lnetctl time_stats show to dump timing stats Signed-off-by: Amir Shehata <ashehata@whamcloud.com> Change-Id: Id7a542fbcc9fc4533b33f63dab764f91469aa0ac
LU-12890 hsm: perform mirror sync through HSM Perform lfs mirror sync using HSM data mover Move lfs_mirror_resync_file into liblustreapi, change API to take an open file handle, rather than a path. Call from both lfs and lhsmtool_posix. Create test in sanity-hsm Signed-off-by: Ben Evans <bevans@cray.com> Test-Parameters: testlist=sanity-hsm sanity-flr Cray-bug-id: LUS-6392 Change-Id: I60cd4e72249aa1add4689bc60aeb71782095f917
LU-10026: Compress data on client with lz4 Send compressed over network. The option L_CSERVER determines whether to decompress the chunks on the server. Otherwise (L_CCLIENT) data will be passed compressed to ZFS, stored compressed by ZFS, and decompressed by ZFS when read. Change-Id: I083ec5dd7a61f37727f253897a850dacde55bd90 Test-Parameters: forbuildonly Signed-off-by: Anna Fuchs <anna.fuchs@informatik.uni-hamburg.de>
LU-10026: Prepare structures for compression - chunk descriptor will be sent over network - contains "metadata" for every chunk Change-Id: I6d90f25e1b61166192df8790fd65e0bc23077bf8 Test-Parameters: forbuildonly fstype=zfs Signed-off-by: Anna Fuchs <anna.fuchs@informatik.uni-hamburg.de>
LU-10026: Handle compression by server Either decompress data by server (previously compressed by client) and store uncompressed or pass through compressed to ZFS. Passing through requires patched ZFS version; for testing purposes commented out. Read unaffected. Change-Id: I594d0cd42f0a99557518c87da5fd8f3344173f69 Test-Parameters: tests=sanity Signed-off-by: Anna Fuchs <anna.fuchs@informatik.uni-hamburg.de>
LU-8329 wiretest: Add ioctl struct definitions In addition to ioctl calls form LU-8330, this checks the structures passed into the ioctls. Test-Parameters: trivial Change-Id: Id7fc2fa2d8b0d48bf111c238d644cf6398979248 Signed-off-by: Nathaniel Clark <nclark@whamcloud.com>
LU-6877 osc: cast cl_max_pages_per_rpc to 64bit. There is a potential overflow as cl_max_pages_per_rpc is a 32bit type. So cast it to 64bit before shift. Signed-off-by: Yang Sheng <yang.sheng@intel.com> Change-Id: Id252d507e270f051a9d643f180aa7fcbcf752a97
| unique failing test | history |
|---|---|
| sanity-lfsck@zfs:test_18c | seen in 25 other reviews |
| sanity-scrub@ldiskfs+DNE:test_9 | seen in 5 other reviews |
This is false.
These modules do not compile on newer kernels (6.18, at least). I think it should be possible to build without these.
just as the smatch implies this should really be IS_ERR, I don't think filp_open can return NULL?
smatch highlighted it in the past and it was still not addressed, but this looks like an inconsistency and should be && even though I guess all parts evaluate to 0 or 1
Oleg, I looked into this. For all three comments of yours, this is still exactly the same in the kernel today: https://github.com/torvalds/linux/blob/master/lib/lz4/lz4_decompress.c However, this discussion did come up on the kernel mailing list as well where the maintainer explained why & is used over && since smatch also flagged it there. There is a comment (line 147-148) on this here because of it. Basically, this is for performance reasons where it is noticeably beneficial in hot code segments. There are actually several points (very briefly, I linked the detailed discussion below): 1. `&&` indroduces a serial dependency but it is better for style. `&` can be executed in parallel 2. Too many densely packed branches impact the micro-op cache 3. A denser pack of branches impacts branch prediction In summary, they argue that it is _generally_ better to use `&` over `&&` (iff conditions permit it) but it only matters in very hot code segments, which this is. Much more detailed source: https://lore.kernel.org/all/D4762145-BBC5-4574-BF68-8C1A3AF41D98@fb.com/
is this likely really just for the first part of this statement, or for the whole while condition (and the parenthesis is then misplaced)
hmm, I'm not an expert in this code here, but this looks to be correct. IIUC, likely() here is only used for the safety/bounds check which looks to be an over-read guard when there is fewer of 15 bytes (`RUN_MASK` as the safety margin?) of input left. I guess, a valid input is generally considered the common case and thus `likely`. `s == 255` is deciding whether we iterate further. That part is variable and should not be included in the `likely` statement.
LU-10026 lustre: add lz4 and lz4hc kernel modules lz4 and lz4hc kernel modules implement compression according to the lz4 and lz4hc algorithms respectively, through the kernel Crypto API. lz4 module provides 2 cipher drivers under the generic name 'lz4': * lz4-lustre-generic of type compression * lz4-lustre-scomp of type scomp lz4hc module provides 2 cipher drivers under the generic name 'lz4hc': * lz4hc-lustre-generic of type compression * lz4hc-lustre-scomp of type scomp lz4 and lz4hc kernel module sources are copied from linux v6.1-rc5, and renamed to llz4.c and llz4hc.c respectively to avoid name collisions. Use of vmalloc has been changed to kvmalloc since it is faster in most cases. They implement the Crypto API interface, and rely on the lz4/lz4hc kernel library for compression implementation. They have been modified to grok a compression acceleration/level, as read from the top 4 bits of the crypto_tfm flags, and pass it to the underlying library. The lz4/lz4hc library sources are also copied from linux v6.1-rc5 and built statically, so lz4_compress, lz4_decompress and lz4hc_compress sources have been "de-modulified", and EXPORT_SYMBOLs removed. Headers have also been copied from linux v6.1-rc5 for consistency, and source files modified to include the copied headers instead of the system headers. All aforementioned sources are located in the lustre_compat/crypto/lz4 directory. The lz4/lz4hc modules are built only if the kernel does not provide them. This is verified by checking if the CONFIG_CRYPTO_LZ4 and CONFIG_CRYPTO_LZ4HC kernel config options are defined. This patch provides unit testing of several compression modules, such as lz4, lz4hc, lzo and gzip. This is done via a new test kernel module kcompr.ko, and new sanity test_84. File lustre/tests/kernel/kcompr.c contains examples of how to call the compression/decompression routines. EX-7998 lustre: Fix build with crypto_tfm_ctx on kernel 6.2 In recent kernels, commit e634ac4 "crypto: api - Add crypto_tfm_ctx_dma" moved crypto_tfm_ctx into algapi.h. So this file must be included from lustre_crypto.h. Was-Change-Id: If10f721355da3e58ca541c17615e978334e8d718 EX-7683 utils: always try to use our own lz4/lz4hc lz4/lz4hc provided by the kernel do not grok a compression level. The built-in lz4/lz4hc do, so always build them as dedicated kernel modules llz4.ko and llz4hc.ko, with the same .cra_name but with a slightly higher .cra_priority = 110, so that they are preferred over the in-kernel modules if any. And try to manually load the llz4/llz4hc kernel modules when a file requires compression with the corresponding alg. This is a "one-shot" try that allows us to prefer our modules that has level support, but continues to at least compress/decompress files even if our own modules are not available. Was-Change-Id: I0bdf267f998e21df81e460250a653aed34e3215d EX-bug-id: EX-6275 Test-Parameters: testlist=sanity env=ONLY=84 Signed-off-by: Sebastien Buisson <sbuisson@ddn.com> Signed-off-by: Artem Blagodarenko <ablagodarenko@ddn.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: I74ce95ff18194c6052d291588d7e8c79596a7f23
(style) The body only describes the new script, but roughly half the diff is a build-system conversion that isn't mentioned: every `obj-m` becoming `obj-$(CONFIG_*)`, the new Kconfig files, the `CONFIG_LNET_O2IBLND` -> `CONFIG_LNET_XPRT_IB` rename, the new `LUSTRE_OOT_BUILD` gate around the `lustre_compat` objects in lnet/libcfs/Makefile, and the `zfs_incdir`/`spl_incdir` restructure in lustre/osd-zfs/Makefile. Those all change the out-of-tree build, so it would help to say what changed and why. The `CBI_WITH_O2IB`/`CBI_WITH_GNI`/`CBI_WITH_KFI`/`CBI_WITH_EFA`/`CBI_WITH_LDISKFS`/`CBI_WITH_ZFS` knobs the script introduces are also worth naming here, since they are the only way to get anything beyond ksocklnd/wbcfs.
Ping Andreas, James, Shaun
To keep with history of upstream CONFIG_LNET_XRPT_IB ?
(defect) This line makes the in-kernel LND get built in configurations where it previously wasn't, and I think it breaks `make modules`.
`lnet/klnds/Makefile` uses the same symbol for the in-kernel tree:
obj-$(CONFIG_LNET_XPRT_IB) += in-kernel-o2iblnd/
Previously that was `CONFIG_LNET_O2IBLND`, exported only under `@BUILT_IN_KO2IBLND_TRUE@`. Now `EXTERNAL_KO2IBLND=yes, BUILT_IN_KO2IBLND=no` also sets it, and that combination is reachable — config/lustre-lnet.m4 forces `BUILT_IN_KO2IBLND="no"` when MOFED is found without `--enable-multiple-lnds`, and again when the kernel has no usable in-kernel rdma headers.
In that configuration `lnet/klnds/in-kernel-o2iblnd/` holds only a Makefile; its sources are generated by `make sources -C lnet/klnds/in-kernel-o2iblnd`, which the top-level Makefile drives from `SOURCE_SUBDIRS := $(LUSTRE_BUILT_IN_KO2IBLND_NT) ...` — empty here. So `__modules` descends into a directory whose `ko2iblnd-objs` have no .c files and no kbuild rule to make them.
Would it work to keep a separate symbol for the in-kernel tree (only under `@BUILT_IN_KO2IBLND_TRUE@`) and use `CONFIG_LNET_XPRT_IB` just for `lnet/klnds/o2iblnd/`?
(minor) `CBI_WITH_O2IB`, `CBI_WITH_GNI`, `CBI_WITH_KFI`, `CBI_WITH_EFA`, `CBI_WITH_LDISKFS` and `CBI_WITH_ZFS` are the script's whole configuration interface, but they appear only in code comments — `cbi_usage()` doesn't list them and neither does the commit message. Could they be documented in the usage text?
(minor) `KPATH` is assigned here and again in `cbi_clean()`, but nothing reads it. Leftover?
(minor) A bare `exit` here means a wrong argument count or a bad path exits 0, so a caller or CI job can't tell success from a usage error. `exit 1` on the error paths would help. Routing the text through `less -F` also makes `copy-builtin help` need a pager and stops it being pipeable; a plain `cat`/heredoc to stderr is probably enough for a five-line message. The text also doesn't show that `clean` takes the tree argument.
Looks like we can copy over zfs and ldiskfs. Well at least ZFS can run. I doubt ldiskfs will work :-(
Yuck. We shouldn't need to copy compat stuff to the kernel tree.
(minor) Nothing generates or consumes `undef.h`: configure only declares `AC_CONFIG_HEADERS([config.h])`, and the only two references to `undef.h` in the tree are this line and the matching `rm -f` in `clean_linux()`. The `|| true` hides that it never copies anything. Leftover from an earlier layout?
(defect) These three lines fix up the shims that use `#include_next`, but two of them are missed.
`headers_clone()` drops `include/lustre_compat` into `$KERNEL_DIR/include`, so a shim is found in the very same -I directory as the kernel header it wants to chain to. `#include_next` then has nothing left to search:
include/lustre_compat/linux/module.h: #include_next <linux/module.h>
include/lustre_compat/linux/bio.h: #include_next <linux/bio.h>
`lnet/libcfs/module.c` includes `<lustre_compat/linux/module.h>` unconditionally, and libcfs is always copied, so `net/lnet/libcfs/module.c` should fail with "fatal error: linux/module.h: No such file or directory". `<lustre_compat/linux/bio.h>` is the same situation in `lustre/osd-ldiskfs/osd_io.c` for `CBI_WITH_LDISKFS`.
Adding `module` and `bio` to this list would make them match slab/workqueue/kallsyms. Are those two just an oversight?
(minor) Every other `$KERNEL_DIR` use in the script is quoted, but this command substitution is not, so a kernel path containing whitespace splits into bogus `find` arguments. It also means an empty result would turn into `find` with no path operand, i.e. `find .`, and `sed -i` would rewrite the Lustre source tree in place. Collecting the dirs into an array and passing `"${dirs[@]}"` would avoid both.
LU-18876 build: copy-builtin It's useful, for the upstreaming effort, distribution packagers, and general development, to be able to build the Lustre kernel modules natively as part of the Linux build. Some projects (such as openZFS) have a script to automatically port their kernel modules to the Linux tree. Lustre should have the same. This patch implements such a script. Test-Parameters: trivial Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: I8fdbddd0d522f848541ae80f4873f8af1c957dc4
| unique failing test | history |
|---|---|
| sanity2@ldiskfs+DNE:test_160g | seen in 3 other reviews |
| sanity-slow@ldiskfs+DNE:test_255c | seen in 4 other reviews |
LU-16518 llite: fix -Wunused-but-set-variable warning
In ll_lookup_it(), lsi is only used in the CONFIG_LL_ENCRYPTION
branch, so it is set but unused otherwise. Drop the local and
dereference s2lsi() at the point of use, mirroring the
HAVE_LUSTRE_CRYPTO branch below it.
Test-Parameters: trivial
Fixes: 09c558d16f0a ("LU-14677 sec: migrate/extend/split on encrypted file")
Signed-off-by: Timothy Day <timday@thelustrecollective.com>
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools
Change-Id: I6dfc06abb0bafd1f9a63063e8564a2426a6a6964
LU-20411 lnet: fix unlock without lock in drop_rule_match
The da_drop_all path jumps to drop_matched without taking dr_lock,
but that path updates rule->dr_stat and unconditionally releases
dr_lock afterwards. Take the lock before the goto.
Found by CONFIG_WARN_CONTEXT_ANALYSIS.
Test-Parameters: trivial
Fixes: deb31c2ffa ("LU-11470 lnet: drop all rule")
Signed-off-by: Timothy Day <timday@thelustrecollective.com>
Change-Id: Ia13f219c31a8a9cfb469c69635d1c62a6a6a6964
(minor) Same underlying point as above: osd-ldiskfs does not agree between the two paths either. osd_ea_lookup_rec() has no equivalent of filldir's local-root substitution, so it falls through to osd_ea_fid_get() and answers the OSD root, while the iterator answers /ROOT itself.
Done
It wouldn't be bad to make osd-ldiskfs report a consistent value as well.
This whole paragraph about the version check is unnecessary.
If test_102 fails regularly without this patch, do we need a new test case for it?
Wouldn't `ls -li` work just as well?
Would it be better to make this value consistent between ZFS and ldiskfs (and WBC) rather than fixing the stale value but leaving it returning a different value?
(style) this can use the bash built-in enumeration `{1..10}` instead of calling an external function
LU-20501 osd-zfs: fix stale FID on generated ".." entries
ZFS does not store "." and ".." on disk, so osd-zfs generates them in
osd_dir_it_rec() and gets the ".." FID from osd_find_parent_fid(): from
the directory's linkEA, or failing that from the FID of the dnode named
by SA_ZPL_PARENT. For the objects created directly under the OSD root
neither works. They have no linkEA, and their SA_ZPL_PARENT does not
name the OSD root even though osd_dir_insert() writes it there when it
adds "..": osd_object_create() leaves oo_parent at the OI ZAP that
indexes the object when the creation hint carries no parent, and the
late SA init replaces the whole attribute set, oo_parent included, at
the end of the same transaction. The OI ZAP carries no LMA, so
osd_get_fid_by_oid() returns -ENOENT for it. On a freshly formatted MDT
here the ROOT directory is dnode 525, its SA_ZPL_PARENT is 24 (an oi.N
ZAP), and the OSD root is dnode 34.
That branch only skipped setting LUDA_FID and left lde_fid untouched, so
".." kept whatever the recycled dirent page happened to contain.
Instrumenting the value showed it varying between the correct FID, zero,
wild values such as [0xfcaae7467e00fcaa:0xc834a400:0x450008], and real
FIDs of unrelated objects. That is how LU-20501 handed ll_get_name() a
".." entry whose FID matched the child being looked up.
Report the OSD root. It is the real parent -- ROOT and update_log_dir
are entries in its ZAP -- and it is what osd-ldiskfs answers for the same
objects through dt_lookup(), where osd_ea_lookup_rec() falls through to
osd_iget_fid() and that maps the LMA-less root inode to
lu_local_obj_fid(OSD_FS_ROOT_OID). That FID is in FID_SEQ_LOCAL_FILE, so
lfsck_find_mdt_idx_by_fid() always resolves it to the local target and
the LFSCK takes the idx == lfsck_dev_idx() path, where ".." is a no-op.
osd-ldiskfs does not give one answer here, so there is no single
behaviour to match: its iterator disagrees with its own lookup.
do_osd_ldiskfs_filldir() substitutes the directory's own FID whenever a
dirent points at the ldiskfs superblock root, so through readdir /ROOT's
".." reads back as /ROOT itself, and osd_ea_fid_get() is never reached
for it. A client therefore sees a different ".." inode number at the
mount root on zfs than on ldiskfs. That divergence is accepted: the OSD
root is where these objects actually live, and both values are local, so
the LFSCK behaves identically either way.
osd_dir_lookup() is left alone, so on zfs dt_lookup(dir, "..") still
answers -ENODATA for these objects while the iterator now answers. No
current consumer hits that: mdd_is_parent() short-circuits on
mdd_is_root(), and the LFSCK's dt_lookup_dir(child, dotdot) tolerates
-ENODATA. Making the lookup answer would feed the LFSCK a parent FID
where it currently gets nothing, which wants its own patch and its own
validation.
Tracing every -ENOENT through a full sanity-lfsck run on a 2-MDT DNE
filesystem finds exactly three objects reaching this branch, all direct
children of the OSD root:
lustre-MDT0000 [0x200000007:0x1:0x0] FID_SEQ_ROOT, the fs root
lustre-MDT0000 [0x20000000a:0x0:0x0] FID_SEQ_UPDATE_LOG_DIR
lustre-MDT0001 [0x20000000a:0x1:0x0] FID_SEQ_UPDATE_LOG_DIR
.lustre/fid reaches it too, but only through a client readdir: the LFSCK
never opens it, since FID_SEQ_DOT_LUSTRE is below FID_SEQ_NORMAL and
lfsck_master_oit_engine() drops objects that are neither norm nor igif.
Gate that answer on the iterated object's own FID, not on the parent
dnode: SA_ZPL_PARENT does not name the OSD root for these objects, it
names the OI ZAP that indexes them, so testing the dnode against
osd->od_root never matches. osd_find_parent_fid() returns -ENOENT for
any object whose linkEA is unreadable and whose SA_ZPL_PARENT names an
LMA-less dnode, which also covers DNE remote directories and striped
shards; the OSD root is not their parent, so only ROOT and
update_log_dir take that arm.
Everything else reaching this branch reports the object itself. That is
not a claim about the parent; it is the value that leaks nothing, asserts
nothing false, and stays local, so lfsck_find_mdt_idx_by_fid() resolves
to this target and the LFSCK dotdot check is a no-op. It is marked
LUDA_UNKNOWN to document that, the same way the sibling
osd_get_fid_by_oid() failure below is marked. The flag is documentation
only: readdir does not gate on it -- ll_dir_read() builds the d_ino from
lde_fid whatever the flags say, and mdd_dir_page_build() only consults
LUDA_FID to spot .lustre and packs the entry either way -- and the LFSCK
reads lde_fid regardless of any flag, which is why the value has to be
sane and local rather than merely unmarked.
Zeroing lde_fid is not usable here. A zero FID on ".." is a defined
value: lfsck_namespace_assistant_handler_p1() reads it as "parent
unknown" and flags LNTF_CHECK_PARENT. The fs root is scanned by the
namespace LFSCK -- lfsck_master_oit_engine() lets li_global_root_fid
through the filter that drops purely local objects -- so a zeroing
scheme would raise that flag on the root on every scan.
The sibling case is left alone: when osd_get_fid_by_oid() fails for an
ordinary entry further down, lde_fid is likewise left unwritten under
LUDA_UNKNOWN. Neither a stale FID nor a zero one is benign for the
LFSCK there -- it can misrepair either way, adding a link naming an
unrelated object or taking the dangling path -- so choosing a value for
it wants its own patch. The companion llite patch covers that path from
the client side, by ignoring any entry without LUDA_FID. For the ".."
entries this branch produces the same client guard is never reached:
do_nfs_get_name_filldir() drops "." and ".." by name before it looks at
the flags.
sanity test_913 covers it: it reads the ".." d_ino of the mount root
through getdents64() ten times over dropped caches and requires a stable,
non-zero value. On zfs it also requires that value to differ from ".",
so a gate that stopped matching the root and let it fall to the self-FID
arm would be caught too; that half is not checked on ldiskfs, where the
filldir substitution above makes the root its own parent by design. On
an unpatched ZFS MDT the value is 0 half the time and
5188147320583553024 the rest; with the patch it is 144115188092633101
every time. The new dirent_ino helper is needed because stat(2) -- and
so ls(1), find(1) and $LFS path2fid -- resolves ".." through the VFS,
which at a mount root answers with the mountpoint's parent instead of
what the OSD put in the entry.
Its version gate names 2.17.58, the newest tag: a build carrying this
patch reports 2.17.58_N and runs the test, while every older MDS -- the
2.17.55 and 2.17.56 ZFS servers where the value is 0 about half the time
included -- skips it. The gate cannot tell an unpatched 2.17.58_N server
from a patched one, so an interop run pinned to an older build of this
same branch would still run it; the release branches interop normally
pins to are all below 2.17.58.
Validated on a ZFS DNE cluster (2 MDT, 2 OST) with the companion llite
patches, tracing both arms of the gate: the fs root and both
update_log_dir objects take the OSD root, .lustre/fid reports itself, and
no zero FID is emitted. sanityn test_102a fails 5/30 without the patches;
with them full sanity-lfsck passes 73/73, sanity test_154f passes, and
test_102a passes 29/30 -- the one failure being the unrelated "stat data
mismatch" (LU-15842), not an ESTALE.
Fixes: 0780fde4d415 ("LU-3573 osd-zfs: Only advance zap cursor as needed")
Test-Parameters: fstype=zfs mdscount=2 mdtcount=4 testlist=sanityn env=ONLY=102a,ONLY_REPEAT=200
Test-Parameters: mdsfilesystemtype=zfs mdtfilesystemtype=zfs ostfilesystemtype=zfs testlist=sanity,sanity-lfsck
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools
Change-Id: I0e999b877991e3c784d3f38a8d43ada0d99e7c44
| unique failing test | history |
|---|---|
| sanity-slow@zfs:test_255c | seen in 2 other reviews |
(minor) LU-20501 is filed as "sanityn test_102: ZFS check_fhandle_syscalls d102.sanityn.stripe/subdir fail, open_by_handle_at error: Stale file handle", and this change only alters behaviour under IS_ENCRYPTED(inode) - for a plain directory the emitted name is ent->lde_name, so container_of() already produced exactly the entry this patch now passes down. So the failure the ticket describes is unaffected. The body notes that test_102 uses unencrypted directories, but never says outright that this does not fix the reported failure. Worth stating that explicitly, or filing this under its own ticket, so LU-20501 isn't read as resolved.
(minor) "the listed suites" doesn't have an antecedent - there is no Test-Parameters: line in this message and no suites are named anywhere in it. Was a Test-Parameters: line meant to be added here (sanity-sec, sanityn), or should the sentence just say the readdir change is covered by the normal review suites?
LU-20501 llite: do not derive the dirent from the emitted name
ll_get_name() recovers the directory entry it is examining with
container_of() on the name pointer its filldir gets, which is only valid
while that name points into the lu_dirent. ll_dir_read() has not
guaranteed that since encrypted directories were added: for those it
emits the name out of the separate llcrypt_fname_alloc_buffer()
allocation, so the derived "lu_dirent" starts 32 bytes before an
unrelated slab object and lde_fid is read out of bounds.
Tracing the two pointers on an encrypted directory shows the derived
entry landing at name - 0x20 for every entry, with the FID read back out
of the neighbouring allocation -- in one run
[0xffff998306137fe0:0x6137fe0:0xffff9983], a kernel pointer being
compared as a FID. A plain directory in the same mount never diverges.
Pass the lu_dirent being emitted down from ll_dir_read() so the filldir
works from the entry itself rather than from pointer arithmetic on a name
it does not own. The whole entry rather than just its FID, because the
companion llite patch also has to read lde_attrs to tell whether lde_fid
means anything. The pointer is live only for the duration of the
dir_emit() call, which is where its only consumer runs; the folio holding
it is unmapped once ll_dir_read()'s loop is done.
Drop the (filldir_t) cast on .ctx.actor while here:
ll_nfs_get_name_filldir() already has that prototype under both
FILLDIR_TYPE variants, so the cast only hid the type check, and no other
.actor assignment in the tree casts.
This does not fix the failure LU-20501 was filed for. ll_dir_read()
emits ent->lde_name for a plain directory, so container_of() already
recovered exactly the entry this patch passes down; only the
IS_ENCRYPTED() path changes behaviour, and sanityn test_102 (the existing
open-by-handle test) uses unencrypted directories. This fixes the
out-of-bounds read only.
NFS export of an encrypted directory works after this only when the
parent inode is already warm on the mount doing the reconnect.
ll_get_name() calls ll_dir_read() without llcrypt_prepare_readdir(),
which ll_iterate() does before the same call, so the crypt info has to
have been loaded by something else -- search_inode_for_lustre() starts
with an ilookup5() and llcrypt_setup_filename() loads the info for every
lookup inside the directory. Measured on a dummy-encrypted mount: with
the parent walked first, check_fhandle_syscalls passes 3/3; with
drop_caches and the LDLM LRU cleared so the inode is instantiated cold,
0/3, because ll_fname_disk_to_usr() then emits the no-key base64 form
that reconnect_path()'s lookup_one_len() cannot resolve. Adding
llcrypt_prepare_readdir() there returns -ENODATA on a cold
NFS-instantiated inode, so the cold case needs its own fix.
sanityn test_102b covers it: it remounts both clients with
test_dummy_encryption, walks the directory on the second mount so the
parent's crypt info is loaded, and resolves a handle for a subdirectory
inside it. It fails without this patch ("check_fhandle_syscalls on an
encrypted dir failed") and passes with it. The cold-inode case is left
uncovered on purpose, since it still fails for the reason above.
The new test goes in beside a bare test_102 rather than renaming that one
to test_102a here, so that autotest's review-*-subtest-change groups do
not put test_102 -- which fails on ZFS DNE roughly one session in ten on
master, the failure this ticket is about -- into a 30-minute repeat loop
against a patch that does not fix it. The companion llite patch, which
does fix it, carries the rename.
Fixes: 4d38566a004f ("LU-13717 sec: filename encryption")
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools
Change-Id: Ic0380a640740ced90acd41004f8ff9652f25b8bd
| unique failing test | history |
|---|---|
| sanityn@zfs:test_43k | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
(minor) "covers all three" looks a bit strong for the lu_dirent_type_get() case. The loop advances with lu_dirent_next(), i.e. by lde_reclen, which is equally server-supplied and is not validated against the end of the folio, so the type word can still be read past the page even when namelen <= NAME_MAX. The other two consumers do look covered.
(suggestion) The ll_dir_read() hunk affects every readdir, not just ZFS. Since the encoded-name path is ldiskfs-only, a run with fstype=ldiskfs testlist=sanity-sec would exercise it. And now that get_name() keys off a server-set LUDA_FID, an interop run against an older server build (serverjob/serverbuildno) would cover the mixed-version case the last paragraph describes.
(defect) For an encrypted directory, lde_namelen on the wire is the critically-encoded ciphertext length, not the length of the name that gets emitted, so it can legitimately exceed NAME_MAX and those entries then vanish from readdir.
osd_ldiskfs_filldir() encodes the on-disk name whenever the directory has LUSTRE_ENCRYPT_FL (osd_handler.c:7358), and critical_encode() escapes 6 of the 256 byte values, so a 255-byte ciphertext name arrives at roughly 261 bytes. llcrypt caps the ciphertext at max_namelen = NAME_MAX (llite/crypto.c:659), so 255 is a normal, reachable length.
ll_fname_disk_to_usr() critical_decode()s before decrypting, so the presented name still fits the NAME_MAX buffer today. Should the bound apply to the emitted name (the !IS_ENCRYPTED branch, or the decoded length) rather than to the raw wire length?
sanity-sec test_46 creates 255-byte names in an encrypted directory on ldiskfs, then runs
stat $scrambleddir/*
rm -rf $scrambleddir/*
With this check those entries never reach filldir, so the glob matches nothing and the following rmdir fails on ENOTEMPTY.
For the do_nfs_get_name_filldir() memcpy(), the check could live there instead, where the NAME_MAX + 1 buffer actually is.
LU-20501 llite: skip dot/dotdot in NFS get_name
sanityn test_102a intermittently fails on ZFS DNE with a spurious ESTALE
from open_by_handle_at() of a striped subdirectory:
open_by_handle_at(subdir) error: Stale file handle
The handle decodes fine. The ESTALE comes out of the NFS reconnect:
reconnect_one() finds the disconnected dentry's parent, calls
exportfs_get_name() (ll_get_name()) to get the child's name in that
parent, then lookup_one() on it. ll_get_name() returned "..", so
lookup_one("..") failed -EACCES, and exportfs_decode_fh() converts any
decode error into -ESTALE.
ll_get_name() walks the parent's dirents with do_nfs_get_name_filldir(),
matching each lde_fid against the child FID. It matches "." and ".."
like any other name, and it does not check LUDA_FID, which is what tells
it whether lde_fid is meaningful at all.
On ZFS the ".." entry of the filesystem root has no dependable FID:
osd-zfs osd_dir_it_rec() computes it with osd_find_parent_fid(), which
returns -ENOENT at the root, and that path left lde_fid untouched, so it
kept whatever the recycled dirent page held. Instrumenting the root's
".." FID showed it varying per run between the correct root FID, zero,
wild values such as [0xfcaae7467e00fcaa:0xc834a400:0x450008], and real
FIDs of unrelated objects -- and when it happened to equal the child FID
being searched, ll_get_name() returned "..".
Skip "." and ".." outright. A child is never reached through those
names, so they are never a valid answer here regardless of what lde_fid
holds. The generic get_name() has the same guards and hit the same bug:
filldir_one() in fs/exportfs/expfs.c has long bounded the name at
NAME_MAX, and 9473c4450e9c ("exportfs: fix the fallback implementation
of the get_name export operation") added the dot/dotdot skip for exactly
this reason -- matching "." or ".." makes the following lookup fail. It
is absent from the 6.8 tree here and present in 6.12.
Also skip any entry the server did not mark LUDA_FID. lde_fid is only
defined when that flag is set, and mdd_dir_page_build() already tests it
before reading the field. osd-zfs has a second path that leaves lde_fid
unwritten for an ordinary name: when osd_get_fid_by_oid() fails it marks
the entry LUDA_UNKNOWN and returns without setting the FID. The name
check above does not cover that one, and matching its stale FID would
return a name the child does not have. Skipping is the safe failure --
ll_get_name() reports "not found" rather than a wrong name.
Bound the name length while here. do_nfs_get_name_filldir() memcpy()s
namelen bytes into lgd_name, which is ll_get_name()'s caller buffer --
exportfs_decode_fh_raw()'s char nbuf[NAME_MAX + 1] -- and lde_namelen
comes straight off the wire with nothing on the client bounding it, since
mdc_adjust_dirpages() only rewrites lde_reclen. ll_getname_data gains
lgd_sbi so the report can name the device, as console messages are
expected to.
The check belongs here rather than in ll_dir_read(). There, namelen is
lde_namelen for every entry, and for an encrypted directory that is the
critically-encoded ciphertext length, which legitimately exceeds NAME_MAX
(osd_ldiskfs_filldir() stores critical_chars() of the name, and llcrypt
caps the ciphertext itself at NAME_MAX); bounding it at the source drops
those entries from readdir entirely. By the time the filldir runs the
encrypted name has been decoded into a NAME_MAX buffer, so this branch
can only fire for a plain directory -- which is exactly the case where
nothing has bounded the value.
The server side is fixed separately by the companion osd-zfs patch,
which reports the OSD root instead of leaving lde_fid unwritten. These
guards are worth keeping regardless: neither depends on the FID value,
so they also protect a new client talking to an unfixed server.
The existing open-by-handle test is renamed test_102a here, where the
parent patch added test_102b beside it. It belongs in this patch rather
than that one: renaming a subtest is what makes autotest's
review-*-subtest-change groups run it in a repeat loop, and test_102 is
the test this failure is about -- it fails on ZFS DNE in roughly one
master session in ten, so a loop against a patch that does not fix it
only produces a Verified-1. Here the loop runs against the fix.
Validated on a ZFS DNE cluster (2 MDT, 2 OST) together with the osd-zfs
patch: sanityn test_102a fails 5/30 without the two patches and
passes 30/30 with them; full sanity-lfsck passes 73/73; sanity test_154f
passes.
Fixes: 96a5daa0c08d ("LU-163 MDS returns 32/64-bit dir name hash according to client type")
Test-Parameters: optional fstype=zfs mdscount=2 mdtcount=4 testlist=sanityn env=ONLY=102a,ONLY_REPEAT=200
Test-Parameters: optional serverversion=2.16 testlist=sanityn env=ONLY=102a,ONLY_REPEAT=30
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools
Change-Id: I0b9854525a165780e505db977a89f91c6d11b705
LU-17000 tests: make leak_finder see OBD_FREE_LARGE
OBD_FREE_LARGE() tags its D_MALLOC line "kvfree", which the
leak_finder.pl regexp cannot split into a known prefix and verb:
"kv" is not an accepted prefix and no accepted verb starts with
"v". The "couldn't parse" fallback only fires when the verb is
preceded by a separator, so the line is dropped with no diagnostic
at all and every OBD_FREE_LARGE() free (over 150 call sites)
leaves its allocation unpaired and reported as a leak by
conf-sanity test_39.
Accept a "kv" prefix and rename the tag to "kvfreed" to match
kfreed/vfreed/slab-freed; the regexp still parses "kvfree" from
older Lustre builds. Also let the fallback report an unknown tag
glued to its verb, rather than dropping the line silently.
Test-Parameters: trivial
Fixes: 94b21a46bfa1 ("LU-18687 obd: don't always use vfree_atomic")
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools
Change-Id: If037cf0f7c6f13a644610b03e081d4cece908fc3
LU-17000 lnet: fix arg order in cfs_expr_list_values() error
cfs_expr_list_values() prints "Number of values %d exceeds max
allowed %d" with (max, count), so the two numbers come out the wrong
way round: a two-value CPT list on a single-CPT node reports "Number
of values 1 exceeds max allowed 2". Pass them as declared.
Fixes: 19ec037c0a94 ("LU-56 libcfs: move range expression parser to libcfs")
Test-Parameters: trivial
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools
Change-Id: Id7c66d1707bd6db41a19130ac14542ee71f92821
(minor) The two tests are not quite the same. capable(CAP_FOWNER) evaluates the capability against init_user_ns, whereas inode_owner_or_capable() uses ns_capable(current_user_ns(), CAP_FOWNER) and additionally requires the owner uid to be mapped in that namespace:
ns = current_user_ns();
if (vfsuid_has_mapping(ns, vfsuid) && ns_capable(ns, CAP_FOWNER))
return true;
So a task holding CAP_FOWNER only inside a non-init user namespace can now set explicit timestamps on a file it does not own, as long as the owner uid is mapped into that namespace; previously that returned -EPERM here. It also matches what setattr_prepare() already allowed, so the net effect is that llite stops being stricter than the VFS. That seems like the intent, but could the message state the behavior change instead of describing the test as identical?
(minor) nop_mnt_idmap is the "ignore any idmapping" sentinel, so this call is not idmap-aware yet - it always checks the raw inode uid. The real idmap is available one frame up: ll_setattr() takes struct mnt_idmap *map and already feeds it to setattr_prepare(map, de, attr), then drops it in ll_setattr_raw(de, attr, xvalid, false). ll_xattr_set_common() already passes its map straight into inode_owner_or_capable(). Given the ticket, would it be better for ll_setattr_raw() to take the mnt_idmap and pass it here, with the two direct callers in file.c (ll_hsm_import(), ll_file_futimes_3()) supplying &nop_mnt_idmap?
Is this done in a latter patch?
Yeah, I believe so.
LU-20264 llite: use inode_owner_or_capable() Replace the open-coded fsuid + CAP_FOWNER check in ll_setattr_raw() with inode_owner_or_capable(), which performs the same test and is idmap-aware. Test-Parameters: trivial Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: I021f8c379b46678ec01a142b027b146f86a013fd
(minor) This bullet reads as a delta from an earlier revision of this patch rather than a change against master. obd_nid_stats_insert() and its retry loop are introduced here; master's obd_nid_stats_get() has no retry and never sleeps, so there is no pre-existing bug being fixed. If the patch is refreshed, dropping this line (or folding it into the description of the new retry path) would keep the message describing the change against master.
(minor) The GC pass only runs every PET_GC_PERIOD (60s) in ping_evictor_main(), so reclaim actually happens somewhere in [TIMEOUT, TIMEOUT + 60) seconds and any value below 60 behaves much like 60 - pinger.c calls this "the effective lower bound on nid_stats_idle_time". Since the documented valid range starts at 0/1, it would help an admin to say here that entries are reclaimed on a 60 second scan and not at exactly TIMEOUT.
(style) This isn't a bug, but the wordiness noted on an earlier patchset was only trimmed at the three flagged spots; the largest blocks are still here. 22 lines of memory-model narration for an atomic_inc_return()/test_bit() pair (and similar blocks at the top of ldebugfs_nid_stats_clear_seq_write(), ldebugfs_exp_export_seq_show() and obd_nid_stats_insert()) is well beyond what the surrounding file does. Something like "increment before testing OBDF_STOPPING; atomic_inc_return() orders the two and pairs with the smp_mb() in class_cleanup()" carries the same information. Worth shortening only if the patch is refreshed for another reason.
LU-20357 obdclass: clear idle NID statistics on server Introduce configurable nid_stats_idle_time per target device to automatically garbage collect stale NID statistics structures that remain idle with no active exports, preventing memory and debugfs bloat in high-churn cloud environments. High-Level Design: - **Idle NID Stats Tracking**: When a client disconnects, its export is cleaned up. If no other exports are using the same NID, the corresponding NID statistics structure (`nid_stat`) is marked as "idle" and moved to an idle list. - **Background Purging**: The ping evictor thread (ping_evictor_main()) periodically scans the idle list. The thread's wait loop is converted from wait_event_idle() to a 60-second timed wait to trigger periodic scans. If an entry has been idle for longer than the configurable `nid_stats_idle_time` timeout, it is evicted from the hash table and freed, along with its associated debugfs files. Key Implementation Details: - Added `obt_nid_stats_idle_time` configuration parameter per target. - Added `nid_last_idle` timestamp to `struct nid_stat` to track idle duration. - Idle entries are moved to `obd_nid_stats_idle` list during export cleanup. - Target devices are marked in `obd_devs` xarray for efficient scanning by the ping evictor thread. - Reimplemented the `exports.clear` debugfs interface to clear active stats and immediately evict idle stats. - Added `idle_seconds` output to `exports/*/export` debugfs files to show how long the NID has been idle. - Renamed `obd_nid_stats_get()/obd_nid_stats_put()` to `obd_nid_stats_insert()/obd_nid_stats_remove()` to better reflect their hash table operations. - Fixed a potential Use-After-Free by moving NID stats hash destruction from class_cleanup() to class_free_dev(). - Fixed a race causing EEXIST on debugfs creation by destroying the debugfs entry before removing the nid_stat from the hash table in obd_nid_stats_remove(). - Fixed a bug where obd_nid_stats_insert() could sleep under RCU read lock when retrying by releasing the RCU lock before sleeping. - Free `nid_stat` with OBD_FREE_RCU(), as entries are now freed while clients may be traversing the hash table, and a reader must not walk into reclaimed memory. - Added `mdt.exports.clear`/`obdfilter.exports.clear` man pages for the pre-existing `exports.clear` interface reimplemented here. Signed-off-by: Jinshan Xiong <jinshanx@google.com> Change-Id: I511de0c1205105708e9aa89fe9f1cff915dbe2b8
(minor) "Allocate order 0 folios on the buffered I/O path" doesn't seem to have code behind it. ll_read_ahead_page(), ll_io_zero_page() and ll_write_begin() all take whatever order __filemap_get_folio() defaults to, which was already 0 before this patch; no call site passes an explicit order and fgf_set_order()/FGF_GET_ORDER never appear in the tree. Would "keep allocating order 0 folios" (or dropping the sentence) describe the change more accurately?
(typo) The reworded sentence lost a word: "cp_folio is not a held in system cache". Maybe "is not held in the system cache"?
(minor) Both arms of this `#if` produce the same call - `page_folio(page)` is `#define page_folio(page) (page)` in the !HAVE___FILEMAP_GET_FOLIO arm of lustre_compat/linux/folio.h. If the patch is refreshed, `return do_read_folio(file, page_folio(page));` on its own would do.
(typo) There is no vmpage in this function any more; the variable being put here is `folio`.
(typo) The parameter became `struct folio *folio`, but the kernel-doc still documents `@vmpage: struct page that has error`, and the `@inode` line and the sentence below still refer to vmpage. kernel-doc will warn that the documented name is not a parameter. Other kernel-doc blocks in this patch (cl_page_find(), cl_page_alloc()) were updated, so this one looks like it was just missed.
(typo) `cdp_pages` is the old field name; it became `cdp_folios` in this patch. This is the last mention of the old name left in the tree.
LU-17916 clio: switch to struct folio Switch cl_page from struct page and page based API to struct folio and the folio API. Allocate order 0 folios on the buffered I/O path and for the DIO bounce buffer. User pages used for DIO can be embedded in large folios so add support for identifying and tracking the page number inside a large folio from user pages. Introduce cl_page_batch* and clarify oti_cl_batch as pending cl_page objects available for cl_commit_cbt to release additional grant space in osc_queue_async_io(), other users of oti_fbatch are moved to their respective local stack. HPE-bug-id: LUS-12384 Signed-off-by: Shaun Tancheff <shaun@tancheff.com> Change-Id: I2c2554d3f5feaf7ec205f4b239bebf688140d874
| unique failing test | history |
|---|---|
| sanity1@zfs:test_56ab | seen in 12 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-zfs-part-5 failed 2× | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
(minor) This paragraph describes the new code but not the bug. The old osd_invalidate_partial_page() looked up i_size_read(inode) >> PAGE_SHIFT rather than the @offset it was handed, which only matched for the osd_execute_truncate() caller; osd_execute_fallocate() passes old_size, so on a growing fallocate the wrong folio was invalidated and the old-EOF jbd buffers were left behind.
Since the patch carries a Fixes: tag, could the body name the affected caller and the consequence? As written the reader cannot connect the tag ("llog to continue if broken") to anything in the diff.
(defect) This shim only lands in the !HAVE___FILEMAP_GET_FOLIO arm, but filemap_lock_folio() and __filemap_get_folio() did not arrive together.
v5.16 pagemap.h: __filemap_get_folio(), filemap_get_folio()
v5.17 pagemap.h: same - still no filemap_lock_folio()
v5.18 pagemap.h: filemap_lock_folio() added
LC_HAVE___FILEMAP_GET_FOLIO keys off the v5.16 commit (3f0c6a07fee6), so on v5.16/v5.17 the shim is compiled out and the kernel has no filemap_lock_folio() either. osd_drop_preallocated_space() and osd_invalidate_partial_folio() then hit an implicit declaration and an int-to-pointer assignment.
That window is not hypothetical for this file: lustre-build-ldiskfs.m4 maps any mainline release in [5.10, 6.1) to 5.10.0-ml.series, so osd-ldiskfs does build there, and the !HAVE_INVALIDATE_FOLIO arm of osd_jbd_invalidate_folio() with fpgptr() exists precisely for real-folio kernels below v5.18.
A dedicated LC_HAVE_FILEMAP_LOCK_FOLIO test would also be more robust than HAVE___FILEMAP_GET_FOLIO against vendor kernels that backport the folio API piecemeal.
LU-17916 osd-ldiskfs: prefer jbd2_journal_invalidate_folio()
Use folio API to interact with jbd2 in kernels which support
struct folio.
This also drops folio alloc when getting cache pages, since
there is nothing to truncate when the folio is not in the
system cache.
In osd_invalidate_partial_folio() the offset containing the page
to be invalidated is passed, use it to find and lock the folio
containing the PAGE_SIZE hole that will be invalidated.
Previously i_size() was being used to find the folio and the
identified offset was ignored.
Fixes: 63ee4af3bb0 ("LU-19620 obdclass: llog to continue if broken")
Signed-off-by: Shaun Tancheff <shaun@tancheff.com>
Change-Id: Iae187e3acbf2ebf3a2b99768d09916928c5c62ce
(style) Not a bug, but '{/usr}' is a third notation for the same path in this patch - obd_mount.c uses /usr/sbin/mount.lustre[_tgt] and the commit message uses [/usr]/sbin. Worth settling on the bracket form.
Also, "or install" reads as an alternative to "use '-t lustre_tgt'", but installing the helper on its own changes nothing here - this warning only fires for a '-t lustre' mount. Something like "use '-t lustre_tgt' (needs [/usr]/sbin/mount.lustre_tgt installed)" states the dependency instead.
(minor) The helper is installed into $(rootsbindir), which config/lustre-core.m4 hard-codes to /sbin, and lustre.spec.in ships it as /sbin/mount.lustre[_tgt]. So /usr/sbin/ only resolves on usr-merged systems; on a split-/usr distro there is nothing at that path and the admin is sent to look in the wrong place.
The commit message itself writes it as [/usr]/sbin - could the messages use that same form? Same for the new text on 1617, and 1361 mixes both ("/sbin/mount.lustre" then "/usr/sbin/mount.lustre[_tgt]") inside one string.
(minor) This also flips the return from -EINVAL to -ENODEV, which the commit message doesn't mention - is that deliberate, or just fallout from matching the -ENODEV on the !devname path? It is reachable from `mount -t lustre_tgt dev mnt` with no helper installed and no -o options, and mount(8) turns ENODEV into "unknown filesystem type 'lustre_tgt'". That reads as if the type isn't registered, when it plainly is (we got here from its parse_monolithic). EINVAL made mount(8) print "... missing codepage or helper program ...", which is closer to what this message is trying to say.
LU-20695 utils: fix mount.lustre_tgt fallback
If target filesystem is mounted with `mount -t lustre_tgt` but the
kernel does not support the `lustre_tgt` fstype, or the mount helper
[/usr]/sbin/mount.lustre_tgt is not installed, fall back to using
the `lustre` fstype for the mount.
Fix deprecation check to work before 2.20.53 instead of the reverse.
Fix `update_mtab_entry()` to record actual fstype that was used.
Improve error messages related to /sbin/mount.lustre_tgt usage.
Test-Parameters: trivial
Fixes: d3ea87a17f ("LU-16738 utils: fix auto mgsname= mount option")
Fixes: 4b2eca7095 ("LU-12514 utils: try lustre_tgt filesystem for mount")
Signed-off-by: Andreas Dilger <adilger@thelustrecollective.com>
Change-Id: I37914d70668899ec1fd3bdb2f45724b827b0ff18
(suggestion) Nothing under lustre/osd-zfs/ ever calls lprocfs_counter_add() with LPROC_OSD_GET_PAGE or LPROC_OSD_NO_PAGE, and lprocfs_stats_seq_show() returns early for any counter whose lc_count is still 0, so these two can never show up in osd-zfs.*.stats. The commit message says the same thing. Given nothing was ever lost on the zfs side, is there a reason to register them here rather than leave the osd-zfs hunks out? They are two dead enum slots plus the per-CPU counter space for them. This isn't a bug, so only worth doing if the patch is refreshed anyway.
probably worthwhile to avoid adding new code that we need to remove anyway?
LU-17916 osd: restore get_page stats for compatibility
The folio conversion renamed the "get_page" and "get_page_failures"
counters in osd-ldiskfs.*.stats and osd-zfs.*.stats to "get_folio"
and "get_folio_failures". Those names are a user-visible interface:
anything parsing the stats file by counter name simply stops finding
its counter after an upgrade, with no error.
Register the old names again alongside the new ones and account both,
so existing consumers keep working while new ones can follow the folio
naming. In osd-ldiskfs both counters sample the same events: the time
spent acquiring the buffers of one read/write prep, and the failures to
obtain a folio for the page cache. Folios there are order 0, so one
failed folio is exactly one failed page; if osd_get_folio() ever asks
for a higher order, get_page_failures has to be scaled by the number of
pages in the requested folio. In osd-zfs neither counter has ever been
sampled, so both stay absent from the file as before.
The old names are restored without a LUSTRE_VERSION_CODE gate on
purpose: a timebomb would drop them again on a date no consumer
tracks, which is the breakage this patch exists to undo.
Test-Parameters: trivial
Fixes: d9b67be7148d ("LU-17916 osd: prefer folio of order 0")
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Change-Id: Iabe35ab8a26a367979eaee8ad5d9fdf6cadc6486
Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools
LU-18687 build: shrinker_debugfs_path to compat shrinker.h Prepare shrinker_debugfs_path() callers to deal with a NULL path Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun@tancheff.com> Change-Id: Ia68eb073989d4e45d926b52c32b43540a85a6db0
I am not so sure about the version ifdef gate, normally I hate those, but what do you think otherwise?
LU-18687 uapi: keep OBD_IOC_GETNAME_OLD visible to userspace
llapi_ioctl() retries with OBD_IOC_GETNAME_OLD when a pre-2.14.52
client module answers ENOTTY, but the macro lives in a kernel-only
header that lustre/utils stopped including, so the case compiled out
and the fallback silently disappeared. Split the define the way the
neighbouring compat opcodes are, so userspace sees it until 2.18.53.
Test-Parameters: trivial
Fixes: 9bb172742291 ("LU-18687 build: sync header location")
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools
Change-Id: I7530a317dbfb37aab7b5f68f94ed03e950aef864
(minor) The subject promises "__init and __exit", but nothing in this diff adds, removes or changes an __exit annotation. That looks deliberate: every fini in obdclass (cl_global_fini(), lu_global_fini(), class_procfs_clean(), obd_zombie_impexp_stop(), ...) is reachable from the error unwind inside obdclass_init(), so marking any of them __exit would create an .init.text -> .exit.text reference. Worth either dropping "and __exit" from the subject, or saying in the body why none of the cleanup functions can take it. The body could also stand to say what the change buys (the annotated text is discarded once the module finishes loading) and, per the house rules, name at least a couple of the functions so the change is findable via git log later.
ugh, so I have claude look at this to make an alternative patch and it devcided that we actually cannot add __exit annotation because obdclass_init calls them all on error exit path and call to .exit.text from .init.text is not really allowed?
I wonder if we should change something in that area?
HEre's the full proposed commit message that should give you an idea of the extent of changes:
LU-20315 obdclass: add missing __init annotations
Annotate the obdclass startup helpers and their prototypes __init so
the kernel discards their text once the module is loaded:
lu_global_init(), cl_global_init(), obd_init_caches() and most of the
rest of the obdclass_init() sequence. obd_pool_init() is left alone,
it is EXPORT_SYMBOL'ed.
No fini can take __exit: obdclass_init() calls all of them from its
error unwind, which would make an .init.text to .exit.text reference.
Wht's the thinking here? accept that reworked code, drop it at all or make some deeper rework?
Omitting the exit annotations is fine, IMHO. We can update the commit message to reflect that we are only adding init annotations. I think we should add annotations that reflect the reality of the code as it exists today. I don't think we should refactor stuff just to add annotations.
(suggestion) cl_env_percpu_init() has exactly one caller, cl_global_init() at line 1189, which this patch just made __init. Since the patch is sweeping obdclass for missing annotations, this static helper could take __init as well.
(style) The definition gets __init here, but the prototype in lustre/include/cl_object.h:2695 keeps the bare declaration. Same for the other ten:
dt_global_init() dt_object.h:2643
obd_zombie_impexp_init() obd_class.h:143
cfs_hash_init() obd_class.h:176
obd_init_caches() obd_class.h:2007
class_procfs_init() obd_class.h:2101
lu_global_init() lu_object.h:1480
lu_ucred_global_init() md_object.h:711
libcfs_kkuc_init() lustre_kernelcomm.h:213
class_handle_init() lustre_handles.h:51
llog_info_init() llog_internal.h:62
include/linux/init.h asks for the annotation on the prototype too, and the libcfs half of this ticket already follows that (llcrypt_private.h carries "extern int __init llcrypt_init_keyring(void);"). Without it a new caller in another translation unit gets no signal at the call site and only trips a modpost section mismatch at link time.
Fair complaint.
I should fix this.
LU-20315 obdclass: fix up __init and __exit ... to functions that need these annotations. Test-Parameters: trivial Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: Ifdf0e4df0d2ca107defdbf11fd7fcf7db725115b
| unique failing test | history |
|---|---|
| conf-sanity2@zfs:test_50h | seen in 2 other reviews |
| sanity-quota@zfs+DNE:test_1k | seen in 10 other reviews |
master-next testing flagged this as sanity lnet test 228 and subsequent test failures https://testing.whamcloud.com/test_sets/cd0ac3f1-3391-4a88-b775-017f35e65e83
test_228 loads lnet_selftest and drives it through $LSTSH; it fails first with LST returned non-zero rc = 254. 230/231/232 then fail with lnetctl lnet unconfigure failed 240 — i.e. LNet cannot be torn down because the selftest session was left behind. The delta contains 9cd74ef309 LU-20104 lnet: fix selftest session teardown and BRW bugs, which rewrites lnet/selftest/{framework,console,conrpc,rpc,brw_test}.c — exactly the code test_228 exercises and exactly the teardown 230–232 trip over
Test 230 failure with unconfigure did happen once in the past in regular master, but the lst rc 254 is still unexplained.
Somebody please take a look into this, marking as verified -1 until then.
test_228 has failed the same way on master:
https://testing.whamcloud.com/sub_tests/791c5c0b-c57c-4daa-ad41-1ef24b33880c
2026-08-26, lustre-master #4752, rev 9db228beb24a, clients 2.17.57.79 / RHEL 9.7 against 2.16.1.2 servers — a tree with no LU-20104 in any patchset (65198 is still open against master). Identical signature:
Run batch RPC failed on 0-1000200@<27:61450>: Unknown error -110
sanity-lnet test_228: @@@@@@ FAIL: LST returned non-zero rc = 254
Same mechanism too, not just the same message. From that run's debug logs, all within 1 ms — console 10.240.22.132@tcp, routers 10.240.28.145 and 10.240.30.63:
console: ksocknal_process_transmit()) Host 10.240.28.145 reset our connection while we were sending
ksocknal_process_transmit()) Host 10.240.30.63 reset our connection while we were sending
srpc_lnet_ev_handler()) LNet event status -5 type 5, RPC errors 1..8
router: ksocknal_launch_packet()) No usable routes to 12345-10.240.22.132@tcp
lnet_health_check()) ...28.145@tcp->...22.132@tcp: PUT: REMOTE_ERROR
lnet_peer_ni_add_to_recoveryq_locked()) ...22.132@tcp added to recovery queue ... health: 900
lnet_notify()) ...28.145@tcp notifying ...22.132@tcp: down
On that run the hostname sort made both routers the 2.16.1 nodes and both LST endpoints unpatched master clients, so the selftest traffic never touched a node carrying this change in any form. Both routers reset the console simultaneously, which is why it has no peer not alive drops — the console had no path left at all.
Two more, both master-next: #1006 on 08-29 (PS20) and #1012 on 09-05 (PS21, the one you reported). Same message, same 30 s Start→Stop LST gap = LST_TRANS_TIMEOUT.
What happens, from the #1012 logs. The selftest layer completed cleanly on both sides — vm33 (2.16.1, unpatched) finished the batch-run RPC and sent its reply (Server RPC ... service batch service ... status SWI_STATE_DONE:0). Router 10.240.42.74 took that reply as a routed PUT and dropped it:
ksocknal_launch_packet()) No usable routes to 12345-10.240.42.72@tcp
lnet_health_check()) ...74@tcp->...72@tcp: PUT: REMOTE_ERROR (status -113)
lnet_notify()) ...74@tcp notifying ...72@tcp: down
lnet_post_send_locked()) Dropping message for 12345-...72@tcp: peer not alive
ksocknal_launch_packet() only reaches that CNETERR when the peer_ni has no conn and no conn_cb that could make one. The router's peer for the console was created by an inbound connection (source port 1023), so once that TCP connection died there was nothing to reconnect with: the send failed -EHOSTUNREACH immediately instead of queueing. The console then timed out at LST_TRANS_TIMEOUT and lst returned -2 → 254. What tore down the TCP connection isn't in the logs at the captured debug mask.
230/231/232 "unconfigure failed 240" is fallout, not a second bug: error() in test_228 skips cleanup_router_test, the only thing that rmmods lnet_selftest, so LNet stays referenced and unconfigure returns -EBU
(minor) This exit is also taken on a pending fatal signal, not only on the deadline, but the message always reports the full bound.
timeout -k 10 $(lst_end_session_timeout) $LST end_session
in the new teardown tests ends in SIGKILL, so giving up after a couple of seconds gets logged as "gave up after 100s". The ses_rpc_counter wait below has the same wording. If the patch is refreshed, worth telling the two exits apart.
(minor) lstcon_rpc_trans_postwait() already ends with lstcon_rpc_trans_stat(trans, lstcon_trans_stat()), and that function memsets the stat and recomputes it from the same tas_rpcs_list. ses_mutex is held across both, so nothing in between can change the result. Is the second call needed, or is it a leftover? lstcon_batch_stop() reads the counters straight after postwait without repeating it.
LU-20104 lnet: fix selftest session teardown and BRW bugs
Split the server srpc_ev into srpc_bulkev and srpc_replyev. The
shared event was reused for the bulk MD and then the reply MD, so
a late bulk UNLINK landed on the rewritten reply event and
double-completed a recycled RPC, causing the list_add corruption
reported by James Simmons. Server bulk-PUT and reply completions
now advance only on the final (unlinked) event.
Order teardown so client-side batches drain before the session is
deactivated. Set ses_shutdown before the batch-stop loop, where
lstcon_rpc_trans_postwait() first drops ses_mutex, or a concurrent
end_session frees the batches the loop is walking.
Post test RPCs under tsi_lock. sfw_run_test() dropped it between
publishing the RPC on tsi_active_rpcs and posting it, so
sfw_stop_batch() could abort it in between and trip
srpc_post_rpc()'s !crpc_aborted assertion.
Bound the console teardown drain, which waited forever under
ses_mutex in an uninterruptible sleep. On expiry the session is
left inert rather than half-destroyed, and the failure now reaches
the caller. lst show_session reports an inert session instead of
dumping it as healthy. The bound clears the LND as well as
rpc_timeout: LNetMDUnlink() only flags an MD the LND still holds, so
a bound below the LND timeout gives up on a drain that was about to
complete and leaves the session inert for no reason.
Derive the node-side drain bound from lnet_get_lnd_timeout() rather
than rpc_timeout: LNetMDUnlink() only flags a busy MD, so an
aborted RPC holding in-flight bulk is not reclaimed until the LND
gives up. SESEND gets a matching bound so the console stops
abandoning nodes that are still quiescing. A node that still
fails to drain in time now reports ETIMEDOUT to end_session
instead of being silently deactivated. Module unload keeps an
unbounded drain.
Drop the lstcon_session_end() call on the session-create failure
path. On -EEXIST it tore down the live session the caller had
declined to force-end; on any other failure ses_state is still
LST_SESSION_NONE, which lstcon_session_end() asserts against.
Fix BRW wire validation in brw_client_init(): reject an offset
outside the first page instead of silently masking it, allocate
bulk with off+len, and reject off+len > LNET_MTU. Separately,
reject len == 0 and a zero or oversized v0 blk_npg, either of
which reached srpc_alloc_bulk() and tripped
LASSERT(bulk_npg > 0 && bulk_npg <= LNET_MAX_IOV).
Add lnet-selftest.sh tests for teardown stress, BRW offset edge
cases and the workqueue race. They are reproducers: a node without
this fix does not survive the teardown they drive, so they skip
unless every node in the session carries it. Guarding the console
alone is not enough - the crash lands on the peer.
They also join the existing LU-19364 exclusion under FORCE_LARGE_NID.
lst add_group rejects IPv6 NIDs, which is why smoke was already
excluded there, so any test that builds a session fails setup.
Test-Parameters: testlist=lnet-selftest,sanity-lnet
Fixes: e502638050a6 ("LU-16011 lnet: use preallocate bulk for server")
Fixes: efcef00cb304 ("LU-5718 lnet: add offset for selftest brw")
Signed-off-by: Robert Read <rread@thelustrecollective.com>
Change-Id: I8025abd76528f96e3b1835c6119a7b677b9fb677
(minor) This new sentence is right - the background threads only exist for the automatic PCC-RO attach done from ll_file_open()->pcc_file_open()->pcc_try_readonly_open_attach()->pcc_do_readonly_attach(). But it now sits under the paragraph's opening sentence, which says the copy threads are started "to perform the lfs-pcc-attach(1) operation". An explicit `lfs pcc attach` goes LL_IOC_PCC_ATTACH->pcc_ioctl_attach()->pcc_readonly_attach_sync(), which never starts a thread and never touches pccs_attach_thread, so this tunable has no effect on it. The wrong attribution is pre-existing (it came in with the page), but since this patch is making the DESCRIPTION accurate, would it be worth saying the threads are used for automatic PCC-RO attach at open(2) time rather than for lfs-pcc-attach(1)?
(nit) %zd is the right conversion for the ssize_t now, but `ret` is only an errno when it is negative - on success it is the number of bytes copied by pcc_copy_data(), so "rc = 268435456" reads oddly. If the patch is refreshed anyway, something like "copied %zd bytes" or splitting the success/error wording would match what is actually being printed.
LU-10499 pcc: fix attach thread limit debug and man page
The CDEBUG that reports the attach thread limit forcing a
synchronous attach sits in the file-size branch of
pcc_do_readonly_attach(), so it prints for every file below
pccs_async_threshold and never for the case it describes. Move
it into the thread-limit branch, which is the one an admin needs
to see when an attach silently becomes synchronous inside open(),
and print the active attach count next to the limit, since the
count can legitimately run past the limit by the number of
threads attaching concurrently.
pcc_attach_data_archive() prints the ssize_t returned by
pcc_copy_data() with %llu, so an error return renders as a huge
unsigned value instead of the negative errno. Use %zd.
In llite.pcc_attach_thread_max.4, give the first example its
missing .EX, correct the second example to set
pcc_attach_thread_max rather than enable_setstripe_gid, resolve
the "Added in commit" placeholder, and say that the limit is
advisory and that attaches past it run synchronously inside
open(). Also align the continuation lines of the
pcc_attach_thread_max sysfs handlers with the open parenthesis.
Test-Parameters: trivial
Fixes: 91063238818f ("LU-10499 pcc: Limit attach queue depth")
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools
Change-Id: I8144474943d581a4061d4741c703cdda4aae974a
LU-20612 lnet: "peer set --state" keeps peer
An "lnetctl peer set --nid <nid> --state <state>" is treated as an
implicit "peer del" since no "peer ni" nor health was sent.
A simple way to reproduce that is:
lnetctl peer show --nid $nid
lnetctl peer set --nid $nid --state $state
lnetctl peer show --nid $nid # empty
This is fixed by letting NLM_F_REPLACE case exclude peer deletion (as
it was for NLM_F_CREATE).
Fixes: 8a0fdfa0b281 ("LU-10391 lnet: migrate peer NI control to Netlink")
Test-Parameters: trivial testlist=sanity-lnet
Signed-off-by: Cyril Bordage <cbordage@whamcloud.com>
Change-Id: I35903d6adee2290e72db5ddd2cf068abd6e432b0
(suggestion) Is LU-19536 the right ticket for this one? That ticket is "fault_in_iov_iter_readable() with a spinlock held" and its description is about ll_direct_IO() faulting in the user iovec while holding csd_lock, which this patch doesn't touch. This is a pure dead-code removal in the LOV/OSC submit paths, so a separate cleanup ticket (or a note in LU-19536 explaining the link) would make it easier to find later.
(suggestion) This is the last DIO assumption left in lov_io_submit(), and the patch's own premise says it can no longer hold: every page that reaches here now comes from a cl_page_list, and the only CPT_TRANSIENT pages in the tree are built by ll_direct_rw_pages() into a cl_dio_pages, which goes to lov_dio_submit() instead. So an empty page arriving here would be CPT_CACHEABLE and this would LBUG.
In practice the branch looks unreachable too - lov_page_init_empty() does SetPageUptodate(), and all four submit paths (ll_readpage(), ll_read_ahead_page(), ll_prepare_partial_page(), ll_io_zero_page()) skip uptodate pages before queueing. If so the whole block is dead and could go with the rest of the DIO leftovers.
The comment is stale either way: cl_page_prep() here was removed by 169f076ae0 ("LU-13814 clio: remove cl_page_prep for transients").
Should be cleaned up in a later patch
(minor) Not a bug, but with `dio` dropped the only remaining value in this message is `ext->oe_srvlock`, and the enclosing condition is `dlmlock == NULL && !ext->oe_srvlock` - so it always prints `srvlock: 0`. If the patch is refreshed, either drop that field or print something that varies, e.g. `oe_rw`.
Should be done in a separate path
LU-19536 osc: remove dead DIO handling from sync path Since LU-13814 routed DIO through cio_dio_submit() and cl_dio_pages, DIO pages no longer reach lov_io_submit(), osc_io_submit(), or osc_queue_sync_pages(). The DIO-specific branches left in the ordinary page-list path are therefore dead. Remove the stale DIO handling from the LOV submit path, so that it always groups pages by stripe, and drop the sync_io anchor setup from osc_queue_sync_pages(), whose oe_csd is only consumed for unaligned DIO writes. The branch in osc_io_submit() is not DIO-specific: it tests for cp_type == CPT_TRANSIENT. Transient pages have no page cache state and are never owned by an io, so they must not be passed to cl_page_prep(), and osc_prep_async_page() has already set their async flags. Keep that handling and rename the local from "dio" to "transient" to say what it tests, and keep deriving oe_dio from OBD_BRW_NOCACHE so that transient extents stay out of overlapping RPC merges. Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Signed-off-by: Vitaliy Kuznetsov <vkuznetsov@ddn.com> Signed-off-by: Marc Vef <mvef@whamcloud.com> Change-Id: I63711a7f3bc3699680e1c09d3349291ccebb75ec
LU-18231 odb: add a TODO to remove the spinlock for odb_flags Now that all modifications of the odb_flag bits are done using atomic set/clear/test functions we may not need the protection of the spinlock in every situation. That is out of scope for this patch series but is something that we can consider in the future. Add a TODO that we can remove some of the uses of this spinlock in a future series. Test-Parameters: trivial Signed-off-by: Ronnie Sahlberg <rsahlberg@whamcloud.com> Change-Id: I30d880b46247374092d9c592554651c35ecda93d
| unique failing test | history |
|---|---|
| sanityn@zfs+DNE:test_102 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
LU-20479 utils: fix use-after-free in cYAML_build_error
cYAML_build_error() locates the command node with
cYAML_get_object_item(), which searches the tree recursively. The
commands are direct children of the error root, but the entities
below them are not, so the recursive search can return an entity
that happens to share a name with the command being looked up. It
then finds a node that is not a sequence and takes the failure
path, which frees the error tree, reports "fatal: out of memory"
and leaves the caller's pointer dangling, because that path clears
a local variable rather than *root. The caller goes on to build
further errors into, and finally print, freed memory.
The error trees built by the liblnetconfig YAML handlers are long
lived enough to hit this. lnetctl uses those handlers whenever the
Netlink API is bypassed - "lnetctl import --old-api", which
sanity-lnet test_170 relies on, and the fallbacks taken when the
Netlink socket cannot be allocated or its parser cannot be
initialized.
Importing a config whose conns_per_peer is out of range trips it.
handle_yaml_config_ni() rejects the value and builds a "ni" command
holding an "add" entity. The "global" section that follows is then
configured with the "add" command, so the recursive lookup finds
the "add" entity of the earlier "ni" error rather than a command,
and lnetctl frees the error tree and then segfaults while reporting
the settings it applied.
That pair is not the only way in. "net", "peer" and "set" are each
used as both a command and an entity name, and the interfaces error
in handle_yaml_config_ni() builds the same "ni"/"add" shape, so
this was reachable before the conns_per_peer check was added.
Look the command up among the direct children of the error root,
and clear the caller's pointer when the tree is freed.
Fixes: c906ab9c88ef ("LU-7734 lnet: configuration fixes")
Assisted-by: Claude:claude-opus-4.8
Test-Parameters: trivial
Signed-off-by: Chris Horn <chorn@ddn.com>
Change-Id: Ibcaffcd7227accd233b299392f983575d9c6bad4
LU-17000 lmv: use a plain goto for the create retry path lmv_locate_tgt_create() has no rc and new_tgt: unconditionally reassigns tgt, so GOTO(new_tgt, -EAGAIN) only made the D_TRACE log claim the function was leaving with -EAGAIN when it was not. Use a plain goto, as the retry paths elsewhere in this file already do. Test-Parameters: trivial Signed-off-by: Oleg Drokin <green@whamcloud.com> Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools Change-Id: I1581178a9842c5e7b433babb4963bfcffcebfb9b
Which is better? The error messages of libnl or the error messages of strerror(). I went with the libnl ones.
We could set data->error = -errno;
According to libnl library code nl_syserr2nlerr() maps NLE_NOMEM to ENOBUFS. So if rc is a -NLE_* error then the correct thing to do is data->errmsg = nl_geterror(rc); data->error = -errno; NLE_NOMEM is broken for you?
Yes I never set data->error :-(
This is why I told Alexey
we need to allocate large cb->min_dump_alloc. Otherwise we get this retry loops. Ugh what a mess.
LU-19404 lnet: retry netlink dump on ENOBUFS
lnetctl net show -v and other DLC netlink dumps can fail
transiently with exit 234, empty output, and a cYAML error
claiming "errno: 0" / "Out of memory" on a host with plenty of
free memory. A rerun succeeds.
lnet_net_show_start() sets cb->min_dump_alloc = U16_MAX, requiring
an order-5 alloc_skb() per dump chunk. Above
PAGE_ALLOC_COSTLY_ORDER this fails under memory fragmentation
regardless of available memory, stalling the dump with ENOBUFS.
libnl reports this as NLE_NOMEM ("Out of memory"), and the read
handler never records an errno for it, hence "errno: 0". The
dump is unrecoverable on that socket; only a fresh request
recovers.
Retry the whole request on a fresh socket, bounded with
exponential backoff, when a dump-mode request fails with
ENOBUFS/ENOMEM. Report the real errno instead of libnl's
conflating NLE_NOMEM text.
Adds sanity-lnet test_306, which reproduces the failure reliably
under concurrent `lnetctl net show -v` plus discovery churn.
Fixes: fff650726b2b ("LU-13642 lnet: Allow dynamic IP specification")
TLC-bug-id: TLU-226
Signed-off-by: Minh Diep <mdiep@thelustrecollective.com>
Change-Id: I6906afe6cca3f80b556152a94ed627d6b75631e9
LU-9639 ldlm: Add kernel doc style for LDLM (6) This patch converts existing functional comments to kernel doc style comments and removes '/**' for comments which is not meant to be a kernel-doc comment Also correct the ldlm_process_flock_lock() description: it runs under the resource lock rather than the namespace lock, its conflict scan is over the locks already granted on the resource, and its return value is an iterator verdict. Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Signed-off-by: Oleg Drokin <green@whamcloud.com> Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools Change-Id: Ie20f2650887718a571ba639bd1420a7a76f87d3d
(minor) The message says the patch "removes '/**' for comments which is not meant to be a kernel-doc comment", but this patch has no such hunk — all four blocks are '/**' comments being converted into real kernel-doc. That sentence looks carried over from patch (1) of the series. Could it be dropped here so the body matches the diff?
LU-19844 osd-zfs: Add kernel doc style for osd-zfs (5) This patch converts existing functional comments in osd_io.c and osd_xattr.c to kernel doc style comments. osd_bufs_get_read() returns the number of local niobufs filled, not 0, so document that per the dbo_bufs_get() contract in dt_object.h. Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Signed-off-by: Oleg Drokin <green@whamcloud.com> Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools Change-Id: If8aea2457659c688b2dfcd4cc8d3d0a808ad3918
(typo) "lcok" -> "lock".
(minor) Same `[out]` question as @contended_locks. ldlm_extent_internal_policy_granted() only ever shrinks this extent — `new_ex->end = min(new_ex->end, START(lck) - 1)` and the `new_ex->start == req_start && new_ex->end == req_end` early break both read the incoming value. The caller ldlm_extent_policy() has to seed it with `{ 0, OBD_OBJECT_EOF }` first. Worth documenting it as in/out with that precondition rather than as a pure output.
(minor) Two things read oddly here. `[out]` suggests the callee only writes it, but ldlm_extent_compat_queue() does `*contended_locks += check_contention` and then reads it back in `ldlm_check_contention(req, *contended_locks)`. The caller relies on that: ldlm_process_extent_lock() zeroes the variable once and passes the same one to the granted-queue call and then the waiting-queue call, so the second call accumulates onto the first. Marking it in/out would describe the contract better. Also, "locks that are waiting" doesn't quite match — on the granted-queue path the count comes from ldlm_extent_compat_cb(), which bumps it for conflicting *granted* locks. Something like "running count of conflicting locks used for contention detection" is closer.
(typo) "lcok" -> "lock" here too.
(defect) This block has no `Return:` section, but the function returns LDLM_ITER_CONTINUE, LDLM_ITER_STOP, or a negative rc via the `out:` label. Running scripts/kernel-doc over the patched file still reports:
No description found for return value of 'ldlm_process_extent_lock'
It is the only kernel-doc warning left in the file after this patch, so adding a `Return:` list here would make the file clean.
(minor) The commit message says the patch removes `/**` from comments that aren't meant to be kernel-doc, but this one and the matching one on ldlm_extent_unlink_lock() are still `/**`. kernel-doc silently ignores them, so they end up looking like documentation that never gets parsed. Convert them or drop to `/*`?
Two things about this line, neither a bug. -EAGAIN isn't really tied to group locks - it is driven by LDLM_FL_BLOCK_NOWAIT / LDLM_FL_SPECULATIVE, and the plain-extent paths reach it too (`if (!work_list || (*flags & LDLM_FL_SPECULATIVE))` on the granted tree, and the `spec_contention` goto in the waiting-queue walk). "such as" makes it survive, but naming the flags would be more useful. More importantly, every negative return goes through `destroylock:`, which unlinks @req from the resource and calls ldlm_lock_destroy_nolock(). Since a Return: list is being added anyway, worth saying that @req is destroyed on that path so a reader knows not to touch it.
This description is inherited from the old \param text, but since the line is being rewritten anyway: struct ldlm_prolong_args has no timeout field (the timeout comes from ptlrpc_export_prolong_timeout(arg->lpa_req, false)), and lpa_extent is never read here - only ldlm_resource_prolong() uses it, to bound the extent_search(). What this function actually touches is lpa_export, lpa_req, lpa_locks_cnt and lpa_blocks_cnt.
"conflicting lock queue" only covers half of what this list carries here. `grant_work` aliases `work_list` whenever `intention != LDLM_PROCESS_ENQUEUE`, and `ldlm_grant_lock(lock, grant_work)` then puts a completion-AST work item for `lock` itself onto it. In the LDLM_PROCESS_RESCAN branch both compat_queue calls pass NULL, so the only thing that ever lands on `work_list` there is `lock`'s own CP AST - never a conflicting lock. ldlm_reprocess_queue() relies on exactly that when it splices to the CP_AST list vs. the BL_AST list. Something like "list collecting AST work items: blocking ASTs for conflicting locks, plus the completion AST for @lock when @intention is not LDLM_PROCESS_ENQUEUE" would describe it. The same phrase on ldlm_extent_compat_queue() is fine - it really is only conflicting locks there.
LU-9639 ldlm: Add kernel doc style for LDLM (5) This patch converts existing functional comments to kernel doc style comments and removes '/**' for comments which is not meant to be a kernel-doc comment. ldlm_extent.c is now clean under contrib/scripts/kernel-doc -none -Wreturn -Wall. Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Signed-off-by: Oleg Drokin <green@whamcloud.com> Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools Change-Id: Id9b20c82c81665c986d2b2def1fa37620353c187
| unique failing test | history |
|---|---|
| sanity2@ldiskfs+DNE:test_64h | seen in 17 other reviews |
LU-17000 ldlm: clear the sysfs pointers in ldlm_cleanup()
ldlm_cleanup() unregisters ldlm_ns_kset, ldlm_svc_kset and ldlm_kobj
but leaves the globals set, so a second ldlm_setup() that fails
before reassigning them unregisters already freed objects. Clear
them, as ldlm_debugfs_cleanup() right below already does for its own
dentries.
Test-Parameters: trivial
Fixes: 1196bd199e7c ("LU-8066 ldlm: move /proc/fs/lustre/ldlm to sysfs")
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools
Change-Id: I00043f47d6bfa562ec90fd4c387bc823cdfc726d
(style) The body is a sentence fragment continuing the subject; the house rules ask for an opening paragraph stating what the patch accomplishes before saying how. It also no longer covers the whole diff: the comment rewording in mdt_hsm_cdt_start() is a hand edit, not something --fix-inplace produces. Worth a line saying that some of checkpatch's automatic fixes were adjusted by hand.
This should not be removed, IMO. OR to avoid deadlock when start is made through sysfs, whose entries are created by the coordinator thread Just pausing +1 for this.
(minor) checkpatch's repeated-word check fires on kernel-doc `\param <name> <description>` whenever the description opens with the parameter name, and the automatic fix drops the description word rather than the duplicate name. Here "parent parent object" becomes "parent object", so `parent` is now documented only as "object". The same auto-fix already had to be reverted by hand in mdt_hsm_cdt_start(), where it deleted a whole comment line. Can this one be restored too?
ugh, I think this is a pretty valid complaint. (and all the other ones below)
(minor) Same repeated-word auto-fix on kernel-doc: "mdt mdt device" became "mdt device", so the description for `mdt` is now just "device". Restoring "mdt device" keeps the doc intact and does not reintroduce a real warning.
(minor) Same as in mdt_enable_cos() just above - the `mdt` description lost its leading word to the repeated-word auto-fix.
LU-20310 mdt: fix remaining checkpatch.pl warnings ... via checkpatch.pl --fix-inplace. Test-Parameters: trivial Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: Id7dfe406de0813c38244e393a4a15ec0dcbfd15f
(style) Another partially merged string - "(component size)\n" is still on its own line. Not a bug, just incomplete; a second --fix-inplace pass joins it.
(style) This isn't a bug, but the string is still split: only the first two fragments got merged, leaving DFID stranded at the start of a continuation line. Same half-merge at lines 7312 and 7713. A second --fix-inplace pass coalesces the rest (it merges one adjacent pair per run).
(typo) While this string is being rewritten anyway: "does not covers" -> "does not cover". The trailing DEXT is also left alone on the next line; folding it in reads better.
LU-20310 lod: fix remaining checkpatch.pl warnings ... via checkpatch.pl --fix-inplace. Test-Parameters: trivial Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: I05eb56bf377e947e654de8424e5c0f47609975ec
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne-arm | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 5 tests. 1 tests failed: sanity. | session |
LU-20246 tests: handle small test nodes with ncpt < 2
sanity-lnet/170 should not fail with -ERANGE when node is configured
with less than 2 cpu partitions.
Test-Parameters: trivial testlist=sanity-lnet
Fixes: 18bc6c4a54 ("LU-20000 lnetctl: bad CPTs/tunables during import")
Signed-off-by: Shaun Tancheff <shaun@tancheff.com>
Change-Id: I2abf7ad256c05403b149935927ceaccbc600a1b7
| unique failing test | history |
|---|---|
| sanity-quota@ldiskfs+DNE:test_1b | seen in 17 other reviews |
include_next perhaps?
According to git commit ed7b6b4f6e915cb0bc52d0000bcc63168867b6ac upstream we don't need this if we are using SB_I_CGROUPWB. I just looked and SB_I_CGROUPWB has been around since 4.1 so we don't need the ifdef anymore for SB_I_CGROUPWB as well in fs.h. Looks like this can be dropped.
We could test this and place this in config.h instead.
Note this was removed with git commit 2841808f35eebfd07150333f3af3007cb2904a09 upstream. This is only needed for wb_stat_mod() handling which is not used by lustre and also was removed upstream. If we do want to wb stats there is a newer way to do it but I don't know it off the top of my head. We can remove the wb_stats handling as well.
This is break when porting to upstream.
LU-18687 build: Move LL_BDI_CAP_FLAGS compat backing-dev.h Move LL_BDI_CAP_FLAGS and the removed flags to backing-dev.h LL_BDI_CAP_FLAGS can be removed for upstream linux. Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: I5ef5befb629d48bf67757a24f4a441dbe9dea1a6
| unique failing test | history |
|---|---|
| sanity-lfsck@ldiskfs+DNE:test_18c | seen in 5 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne | RHEL 8.10 / x86_64 | ran 7 tests. 1 tests failed: sanity. | session |
The body only describes the #include_next shadowing, but a fair number of hunks do something else and aren't mentioned: - the `iov_iter_is_pipe()` guards deleted from `ll_hybrid_bio_dio_switch_check()`, `ll_file_io_generic()` and `ll_direct_IO()` - `iov_iter_is_aligned()` replaced by `iov_iter_alignment()` in `ll_iov_iter_is_unaligned()` - `ll_xa_insert()` replaced by `xa_insert()` in nrs_orr.c - `LASSERT(!mmap_write_trylock())` replaced by `mmap_assert_write_locked()` in `our_vma()` - dropping `HAVE_GENL_DUMPIT_INFO_FAMILY` / `compat_genl_info` and using `&lustre_family` directly - moving `VFS_MKDIR_DELEGATE()`/`ll_vfs_mkdir()`/`ll_vfs_getattr()` into lustre_compat.h, and the new `DTTOIF()` and `PROC_OWNER()` definitions Could these be called out, and the behaviour-changing ones split into separate patches? The `build:` component tag also doesn't really fit hunks that change llite I/O and ptlrpc NRS behaviour.
This is how I think lustre_compat headers should be used.
Please don't remove this
Why?
I'm split this change off into another patch.
This file is now a pure pass-through to the kernel header - as is include/lustre_compat/linux/xarray.h. Worth deleting both and letting callers include the real headers? In the same vein, the patch removes LIBCFS_GENL_DUMPIT_INFO_FAMILY but leaves behind autoconf tests whose macros no longer have a single user: HAVE_IN_DEV_FOR_EACH_IFA_RTNL (config/lustre-lnet.m4), HAVE_ENUM_ITER_PIPE and HAVE_IOV_ITER_IS_ALIGNED (config/lustre-core.m4).
The `#include_next` is unconditional, so on a kernel that predates `<linux/mmap_lock.h>` (v5.8) preprocessing fails here and the `#ifndef HAVE_MMAP_LOCK` block below can never be compiled. Either the fallback is dead and can go, or the include needs guarding the way net/netdev_lock.h does it. Related: `our_vma()` in lustre/llite/llite_mmap.c now calls `mmap_assert_write_locked()`, which also only exists from v5.8, so it depends on the same assumption. Note that unlike the old `LASSERT()`, `mmap_assert_write_locked()` is a no-op unless CONFIG_DEBUG_VM is set.
In an out-of-tree build `<linux/proc_fs.h>` a few lines above always resolves to the lustre_compat shim, which defines `PROC_OWNER` in both arms of its `#ifdef HAVE_PROC_OPS`. So this `#ifndef` can never fire, and the comment's "builds that do not see the shim" case doesn't exist in this tree. If it ever did fire on a pre-5.6 kernel it would be worse than dead code: `PROC_OWNER(THIS_MODULE)` at line 867 would silently expand to nothing, dropping `.owner` from the `file_operations` and letting the module unload while a /proc file is open. Could this just be dropped (or made an `#error`) rather than a silent no-op?
This duplicates the `DTTOIF()` already in include/lustre_compat/linux/fs.h, which this file pulls in via `<linux/fs.h>` at the top - so the `#ifndef` is always false. It also depends on `S_DT_SHIFT`, which only that same shim defines. One home for the macro would be less confusing.
Dropping the pipe check here changes behaviour on every kernel before v6.4, where ITER_PIPE still exists (RHEL8/RHEL9, SLES15, and mainline < 6.4 are all in that set). `pcc_file_splice_read()` -> `generic_file_splice_read()` builds an ITER_PIPE iterator and calls `->read_iter`, so `ll_file_read_iter()` does get a pipe iterator here. Once `count` reaches `ll_hybrid_io_read_threshold_bytes` the switch now sets IOCB_DIRECT on it, which is exactly what the removed check was preventing. If the intent is that ITER_PIPE no longer matters, could the compat `iov_iter_is_pipe()` be kept (it was three lines under `#ifndef HAVE_ENUM_ITER_PIPE`) until the pre-6.4 kernels are dropped?
Same concern as the hybrid-switch hunk: parallel DIO was explicitly disabled for pipe iterators because that path returns -EIOCBQUEUED, and `is_parallel_dio = !is_aio` now enables it for them on pre-6.4 kernels.
Both comment blocks here now describe code that no longer exists - there is no pipe rejection left, and nothing "returns 0 here". They read as if they belong to the `if (unaligned && ...)` below them, which they don't. More importantly, with the `iov_iter_is_pipe(iter)` early return gone, a splice/sendfile read from an O_DIRECT file on a kernel that still has ITER_PIPE reaches `ll_direct_rw_pages()` and `iov_iter_get_pages_alloc2()` instead of falling back to buffered I/O - which is what the comment says must not happen.
`generic_file_splice_read()` uses a synchronous kiocb, so returning -EIOCBQUEUED to it surfaces as an error to `splice()`/`sendfile()` rather than being completed later. The `!iov_iter_is_pipe(iter)` term that used to guard this was the reason the pipe case returned 0 further up.
`ll_xa_insert()` existed only to fold -EEXIST into -EBUSY for kernels older than v5.0 (fd9dc93e3623 "XArray: Change xa_insert to return -EBUSY"). The retry below still only tests for -EBUSY. On any supported kernel whose `xa_insert()` still returns -EEXIST, a lost insert race no longer does `goto try_again` - it frees `orro` and returns the error, `nrs_resource_get()` turns that into NULL, and the request silently falls back to the FIFO policy instead of TRR. Has that been confirmed impossible on the oldest supported kernel (the RHEL8 XArray backport)? If so, the commit message is the place to say it. Unrelated nit: the continuation line is no longer aligned with the open paren after the rename.
LU-18687 build: normalize lustre_compat headers lustre_compat headers should not appear in core kernel code. Instead, they should shadow native linux headers using #include_next. Test-Parameters: trivial Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: If39a50a1fd663875d51c73cd7313fccf965620e2
LU-20418 build: Move core pre-v5.19 checks to ksym checks Move checks for: HAVE_SET_POSIX_ACL_USER_NS FOLIO_MEMCG_LOCK_EXPORTED HAVE_FOLIO_MEMCG_LOCK_STATIC HAVE_KIOCB_COMPLETE_2ARGS HAVE_ACCOUNT_PAGE_DIRTIED HAVE_ACCOUNT_PAGE_DIRTIED_EXPORT HAVE_FOLIO_MEMCG_LOCK HAVE_COPY_PAGE_FROM_ITER_ATOMIC HAVE_FOLIO_BATCH HAVE_SECURITY_DENTRY_INIT_WITH_XATTR_NAME_ARG HAVE_DELETE_FROM_PAGE_CACHE HAVE_INVALIDATE_FOLIO HAVE_BIO_SET_DEV HAVE_FAULT_IN_IOV_ITER_READABLE HAVE___FILEMAP_GET_FOLIO HAVE_BI_BDEV HAVE_DIRTY_FOLIO HAVE_ALLOC_INODE_SB HAVE_USER_NAMESPACE_ARG HAVE_GET_ACL_RCU_ARG HAVE_FILEATTR_GET Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: I5aaac5bffe98f3409407c773d9529b1e797858a2
when I have this in master net, the build fails with:
make[1]: Entering directory '/home/green/bk/linux-5.14.0-570.58.1.el9_6'
CC [M] /home/green/git/lustre-release/lustre/obdclass/llog.o
In file included from /home/green/git/lustre-release/lustre/include/lprocfs_status.h:29,
from /home/green/git/lustre-release/lustre/include/obd_support.h:27,
from /home/green/git/lustre-release/lustre/include/obd_class.h:20,
from /home/green/git/lustre-release/lustre/include/lustre_log.h:34,
from /home/green/git/lustre-release/lustre/obdclass/llog.c:29:
/home/green/git/lustre-release/include/lustre_compat/linux/sysfs.h:14: warning: "ATTRIBUTE_GROUPS" redefined
14 | #define ATTRIBUTE_GROUPS(_name) static struct attribute *_name##_groups = _name##_attrs
|
In file included from ./include/linux/kobject.h:20,
from /home/green/git/lustre-release/lustre/include/obd_class.h:19,
from /home/green/git/lustre-release/lustre/include/lustre_log.h:34,
from /home/green/git/lustre-release/lustre/obdclass/llog.c:29:
./include/linux/sysfs.h:159: note: this is the location of the previous definition
159 | #define ATTRIBUTE_GROUPS(_name) \
|
In file included from /home/green/git/lustre-release/include/linux/libcfs/libcfs_private.h:24,
from /home/green/git/lustre-release/lustre/include/obd_support.h:24,
from /home/green/git/lustre-release/lustre/include/obd_class.h:20,
from /home/green/git/lustre-release/lustre/include/lustre_log.h:34,
from /home/green/git/lustre-release/lustre/obdclass/llog.c:29:
/home/green/git/lustre-release/lustre/obdclass/llog.c: In function ‘llog_init_handle’:
/home/green/git/lustre-release/include/lustre_compat/linux/vmalloc.h:11:39: error: too many arguments to function ‘__vmalloc’
11 | #define __compat_vmalloc(size, flags) __vmalloc(size, flags, PAGE_KERNEL)
| ^~~~~~~~~
/home/green/git/lustre-release/lustre/include/obd_support.h:889:17: note: in expansion of macro ‘__compat_vmalloc’
889 | __compat_vmalloc(size, GFP_NOFS | __GFP_ZERO) : \
| ^~~~~~~~~~~~~~~~
/home/green/git/lustre-release/lustre/include/obd_support.h:902:10: note: in expansion of macro ‘__OBD_VMALLOC_VERBOSE’
902 | __OBD_VMALLOC_VERBOSE(ptr, NULL, 0, size)
| ^~~~~~~~~~~~~~~~~~~~~
/home/green/git/lustre-release/lustre/include/obd_support.h:915:17: note: in expansion of macro ‘OBD_VMALLOC’
915 | OBD_VMALLOC(ptr, size); \
| ^~~~~~~~~~~
/home/green/git/lustre-release/lustre/obdclass/llog.c:420:9: note: in expansion of macro ‘OBD_ALLOC_LARGE’
420 | OBD_ALLOC_LARGE(llh, chunk_size);
| ^~~~~~~~~~~~~~~
In file included from ./include/asm-generic/io.h:994,
from ./arch/x86/include/asm/io.h:349,
from ./include/linux/scatterlist.h:9,
from ./include/linux/kfifo.h:42,
from ./include/linux/tty_port.h:5,
from ./include/linux/tty.h:12,
from /home/green/git/lustre-release/include/linux/libcfs/libcfs_debug.h:19,
from /home/green/git/lustre-release/lustre/include/obd_support.h:23,
from /home/green/git/lustre-release/lustre/include/obd_class.h:20,
from /home/green/git/lustre-release/lustre/include/lustre_log.h:34,
from /home/green/git/lustre-release/lustre/obdclass/llog.c:29:
./include/linux/vmalloc.h:148:14: note: declared here
148 | extern void *__vmalloc(unsigned long size, gfp_t gfp_mask) __alloc_size(1);
| ^~~~~~~~~
In file included from /home/green/git/lustre-release/include/linux/libcfs/libcfs_private.h:24,
from /home/gree
It's difficult to test these patches sufficiently beforehand, because Janitor refuses to build them: ``` Lustre Gerrit Janitor Cannot detect any functional changes in this patch ```
(defect) The second argument is `bool val`, but the kernel prototype is `int val`:
static inline int ip6_sock_set_addr_preferences(struct sock *sk, int val)
The escaped regex therefore matches no kernel, so HAVE_IP6_SET_PREF is never defined. The old LIBCFS_IP6_SET_PREF test called `ip6_sock_set_addr_preferences(NULL, 0)` and was arg-type-agnostic, so it detected the function. On a kernel that still has `kernel_setsockopt` and also provides this inline (vendor backport / 5.8 merge window), the fallback in include/lustre_compat/net/tcp.h now compiles too, giving a redefinition of `ip6_sock_set_addr_preferences`. The sibling HAVE_IP_SET_TOS check uses `int val` correctly; this should be `int val`.
LU-20418 build: Move libcfs pre-v5.10 checks to ksym checks Move checks for: HAVE_CACHE_DETAIL_WRITERS HAVE_GENL_DUMPIT_INFO_FAMILY HAVE_IP6_SET_PREF HAVE_IP_SET_TOS HAVE_KALLSYMS_LOOKUP_NAME HAVE_KERNEL_SETSOCKOPT HAVE_KEY_NEED_UNLINK HAVE_KOBJ_TYPE_DEFAULT_GROUPS HAVE_NR_UNSTABLE_NFS HAVE_NR_UNSTABLE_NFS_DEPRECATED HAVE_PROC_OPS HAVE_SEC_RELEASE_SECCTX_1ARG HAVE_TCP_SOCK_SET_KEEPCNT HAVE_TCP_SOCK_SET_KEEPINTVL HAVE_TCP_SOCK_SET_QUICKACK HAVE_USER_UID_KEYRING HAVE_VMALLOC_2ARGS Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: Id530a1c47b6e178e024bd8010b4b6661d34ff3b9
when I have this in master-next on top of master, the build fails with
/home/green/git/lustre-release/lustre/osd-ldiskfs/osd_internal.h: In function ‘bdev_integrity_enabled’:
/home/green/git/lustre-release/lustre/osd-ldiskfs/osd_internal.h:1815:36: error: implicit declaration of function ‘bdev_get_integrity’ [-Werror=implicit-function-declaration]
1815 | struct blk_integrity *bi = bdev_get_integrity(bdev);
| ^~~~~~~~~~~~~~~~~~
/home/green/git/lustre-release/lustre/osd-ldiskfs/osd_internal.h:1815:36: warning: initialization of ‘struct blk_integrity *’ from ‘int’ makes pointer from integer without a cast [-Wint-conversion]
/home/green/git/lustre-release/lustre/osd-ldiskfs/osd_internal.h:1795:36: error: ‘BLK_INTEGRITY_NOVERIFY’ undeclared (first use in this function); did you mean ‘HAVE_BLK_INTEGRITY_NOVERIFY’?
1795 | #define INTEGRITY_READ(flag) (!(BLK_INTEGRITY_NOVERIFY & (flag)))
| ^~~~~~~~~~~~~~~~~~~~~~
/home/green/git/lustre-release/lustre/osd-ldiskfs/osd_internal.h:1821:24: note: in expansion of macro ‘INTEGRITY_READ’
1821 | if (rw == 0 && INTEGRITY_READ(bi->flags))
| ^~~~~~~~~~~~~~
/home/green/git/lustre-release/lustre/osd-ldiskfs/osd_internal.h:1795:36: note: each undeclared identifier is reported only once for each function it appears in
1795 | #define INTEGRITY_READ(flag) (!(BLK_INTEGRITY_NOVERIFY & (flag)))
| ^~~~~~~~~~~~~~~~~~~~~~
/home/green/git/lustre-release/lustre/osd-ldiskfs/osd_internal.h:1821:24: note: in expansion of macro ‘INTEGRITY_READ’
1821 | if (rw == 0 && INTEGRITY_READ(bi->flags))
| ^~~~~~~~~~~~~~
LD [M] /home/green/git/lustre-release/ldiskfs/ldiskfs.o
libtool: link: rm -fr .libs/liblustreapi.a .libs/liblustreapi.la .libs/liblustreapi.lai
libtool: link: (cd .libs/liblustreapi.lax/libcfs.a && ar x "/home/green/git/lustre-release/lustre/utils/../../lib/libcfs/.libs/libcfs.a")
/home/green/git/lustre-release/lustre/osd-ldiskfs/osd_internal.h:1796:36: error: ‘BLK_INTEGRITY_NOGENERATE’ undeclared (first use in this function)
1796 | #define INTEGRITY_WRITE(flag) (!(BLK_INTEGRITY_NOGENERATE & (flag)))
| ^~~~~~~~~~~~~~~~~~~~~~~~
/home/green/git/lustre-release/lustre/osd-ldiskfs/osd_internal.h:1824:24: note: in expansion of macro ‘INTEGRITY_WRITE’
1824 | if (rw == 1 && INTEGRITY_WRITE(bi->flags))
| ^~~~~~~~~~~~~~~
LU-20418 build: Move libcfs early checks to ksym checks Move checks for: HAVE_LINUX_BIO_INTEGRITY_HEADER HAVE_LINUX_BLK_INTEGRITY_HEADER HAVE_MMAP_LOCK Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: Ic7bab998a5ed235e4870791598f3435f0593171c
LU-20418 build: Move core early checks to ksym checks Move early checks for: HAVE_GRAB_CACHE_PAGE_WRITE_BEGIN_WITH_FLAGS HAVE_INVALIDATE_LOCK HAVE_LOCKS_LOCK_FILE_WAIT HAVE_STRUCT_LSM_CONTEXT HAVE_WB_STAT_MOD Move check for: HAVE_GRAB_CACHE_PAGE_WRITE_BEGIN Drop the early pass now that all early checks are ksym Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: I1f997b8597949b12e0e170887486ce0811f89b68
LU-20418 build: Move core pre-v7.1 checks to ksym checks Move checks for: HAVE_INODE_JUST_DROP HAVE_MEMDESC_FLAGS_T PAGE_FLAGS HAVE_DENTRY__D_NAME HAVE_FILE__F_PATH HAVE_VFS_MKDIR_DELEGATE HAVE_INODE_STATE_READ HAVE_VFS_CREATE_DELEGATE HAVE_ILOOKUP5_NOWAIT_ISNEW HAVE_FILEMAP_ALLOC_FOLIO_NUMA HAVE_KILL_LITTER_SUPER HAVE_D_MAKE_PERSISTENT HAVE_POSIX_ACL_TO_XATTR_ALLOC_BUFFER Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: Ic0d14173c3c3ddaac4aeb096fab82d0e1f2386cd
LU-20418 build: Move core pre-v6.12 checks to ksym checks Move checks for: HAVE_FLUSH___WORKQUEUE HAVE_INODE_GET_CTIME HAVE_COPY_FOLIO_FROM_ITER_ATOMIC HAVE_MMAP_WRITE_TRYLOCK HAVE_GENERIC_FILEATTR_HAS_MASK_ARG HAVE_GROUP_INFO_USAGE_AS_REFCOUNT HAVE_NSPROXY_COUNT_AS_REFCOUNT HAVE_INODE_GET_MTIME_SEC HAVE_SHRINKER_ALLOC HAVE_DENTRY_D_CHILDREN HAVE_GENERIC_ERROR_REMOVE_FOLIO HAVE_STRUCT_FILE_LOCK_CORE HAVE_CSUM_TYPE_BLK_INTEGRITY HAVE_FOLIO_MEMCG_LOCK_STATIC Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: I4fae08aefc51beb260035af8ba568c8f6e2a4afb
LU-20418 build: Move core pre-v6.6 checks to ksym checks Move checks for: HAVE_ACL_WITH_DENTRY HAVE_BIO_ADD_FOLIO HAVE_CLASS_CREATE_WITH_MODULE HAVE_ENUM_ITER_PIPE HAVE_FILEMAP_SPLICE_READ HAVE_FILLDIR_USE_CTX_RETURN_BOOL HAVE_FOLIO_BATCH_REINIT HAVE_FOLIO_MAPCOUNT HAVE_GET_RANDOM_U32_AND_U64 HAVE_GET_RANDOM_U32_BELOW HAVE_GET_USER_PAGES_WITHOUT_VMA HAVE_IOP_GET_INODE_ACL HAVE_IOV_ITER_IOVEC HAVE_MNT_IDMAP_ARG_GETATTR HAVE_MNT_IDMAP_ARG_GET_ACL HAVE_PAGEVEC HAVE_POSIX_ACL_TYPE HAVE_SG_SET_FOLIO HAVE_U64_CAPABILITY HAVE___IOV_MEMBER Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: I63059934626f123bcf4cb588a55adb2763719797
@ashehata@whamcloud.com Wouldn't these functions and a few functions below this also be needing the comment blocks?
Anjus, yes. Ideally, all function with EXPORT_SYMBOLS(...) should have kernel-doc describing the function. Which is mostly taken care off. Some may be missed, like this which you have pointed out. Also, for OSC, IMO, you should tag Andreas/Patrick/Bobi.
LU-9642 osc: Add kernel doc style for OSC (2) This patch converts existing functional comments to kernel doc style comments and removes '/**' for comments which is not meant to be a kernel-doc comment Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Change-Id: I2b0d155c0777b70a2044dba5f65608764a88b48e
(style) should be named `ll_d_ancestor()` so that it is more clear where it came from (minor) should have a configure check for d_ancestor() export in case that is changed in upstream kernels.
(defect) This is OK for testing, but it isn't helpful to print this on the server console every time that someone passes the wrong arguments to `mv`. This should *at the very most* be CWARN(), but probably be a CDEBUG() since it could happen during normal operation and there isn't anything "wrong" with the filesystem that the admin needs to fix.
note it's client console, but the usefullness is still questionable.
(defect) this is accessing "new" and "inode" after `dput(new)` and `iput(inode)` above. This should be printed first
ah yes. thanks!
seems not, new dentry (which is actually the "old" dentry found by the alias search, but the naming comes from d_splice_alias) has an extra ref from the search,
sorry. wrong reply :-) Andreas, your comment is right.
LU-20085 llite: client vfs rename hang ll_splice_alias doesn't try to reuse an existing dir alias if its name is not equal to the new one. It leads to a deadlock during rename when VFS tries to lock inodes to both names/dentries, the same inode getting locked twice. The code makes an exception for accessing Lustre ROOT inode by .lustre/fid/<ROOT_FID>, but doesn't allow the same for .lustre and .lustre/fid, these objects became not accessible by their FIDs using .lustre/fid/, the corresponding test case gets disabled. HPE-bug-id: LUS-13174 Signed-off-by: Alexander Zarochentsev <alexander.zarochentsev@hpe.com> Change-Id: I280c016208ecdc529d7735abb36dba3dc3d15df9
LU-9646 lov: Add kernel doc style for LOV (3) This patch converts existing functional comments to kernel doc style comments and removes '/**' for comments which is not meant to be a kernel-doc comment Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Change-Id: Iab02ad42250207a279d07ff3dd1ea92648537699
| unique failing test | history |
|---|---|
| sanity-hsm@zfs:test_254b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
LU-9650 mdc: Add kernel doc style for MDC (2) This patch converts existing functional comments to kernel doc style comments and removes '/**' for comments which is not meant to be a kernel-doc comment Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Change-Id: I72c5f143d93aff45916352b15c5cdfaa5e445119
LU-16051 o2iblnd: detect link state to set fatal error on ni To avoid selecting lnet ni which corresponds to a downed link for sending, add a mechanism for detecting ip-layer link events in o2iblnd. On ip link up/down events, find corresponding ni and toggle ni_fatal_error_on flag. This complements the existing mechanism for ib-layer link event handling. Lustre-change: https://review.whamcloud.com/48644 Lustre-commit: 30d73908087d5b2f0b18cce95826c4825c030ad4 Test-Parameters: trivial Signed-off-by: Serguei Smirnov <ssmirnov@whamcloud.com> Change-Id: I4720cd0a7bc577a522c7d40b54f821a4c12b670f Reviewed-by: Frank Sehr <fsehr@whamcloud.com> Reviewed-by: Chris Horn <chris.horn@hpe.com> Reviewed-by: Cyril Bordage <cbordage@whamcloud.com> Reviewed-by: James Simmons <jsimmons@infradead.org> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
| unique failing test | history |
|---|---|
| sanity-quota@zfs+DNE:test_1e | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs+DNE:test_1f | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-quota@zfs+DNE:test_1i | NEW unique failure for this branch in the last 30 days, and was seen 1 times across 1 other branches 1 reviews |
LU-18644 socklnd: make link state detection namespace-aware Check the network namespace of the device in the event against the namespace associated with the ni and ignore events from non-matching namespaces Lustre-change: https://review.whamcloud.com/57808 Lustre-commit: b4748cb4684f5b2594d127b29f3876f07bd077ee Test-Parameters: trivial testlist=sanity-lnet Signed-off-by: Serguei Smirnov <ssmirnov@whamcloud.com> Reviewed-by: James Simmons <jsimmons@infradead.org> Reviewed-by: Chris Horn <chris.horn@hpe.com> Reviewed-by: Frank Sehr <fsehr@whamcloud.com> Reviewed-by: Adam Peace <adam.peace@microsoft.com> Reviewed-by: Oleg Drokin <green@whamcloud.com> Signed-off-by: Sonia Sharma <sonia.sh.sharma@oracle.com> Change-Id: I9698950497721a3eb3b0e161e59c2db778091138
LU-13903 build: Always include OpenSFS UAPI headers Various utils code including util/parser.c and util/nidstrings.c include files from the lnet,lustre/uapi directory, but that is not included in CPPFLAGS when configured with --disable-modules. There is no need to isolate the assignment to that case - we can safely add these directories unconditionally. Test-Parameters: trivial Signed-off-by: Mr NeilBrown <neilb@suse.de> Change-Id: I9974ad78ccabe84b1a0054c41bbc017503be231c
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-part-1 | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-part-2 | RHEL 8.10 / x86_64 | ran 21 tests. 6 tests failed: sanity-pfl, sanity-lnet, sanity-sec, sanity-lfsck, runtests, replay-dual. | session |
| review-dne-part-2 | RHEL 9.7 / x86_64 | ran 21 tests. 6 tests failed: sanity-pfl, sanity-lnet, sanity-sec, sanity-lfsck, runtests, replay-dual. | session |
| review-dne-part-3 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-3 | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-4 | RHEL 8.10 / x86_64 | ran 17 tests. 5 tests failed: sanity-quota, sanity-hsm, sanity-flr, mmp, insanity. | session |
| review-dne-part-4 | RHEL 9.7 / x86_64 | ran 17 tests. 5 tests failed: sanity-quota, sanity-hsm, sanity-flr, mmp, insanity. | session |
| review-dne-part-5 | RHEL 8.10 / x86_64 | ran 7 tests. 2 tests failed: sanityn, recovery-small. | session |
| review-dne-part-5 | RHEL 9.7 / x86_64 | ran 7 tests. 2 tests failed: sanityn, recovery-small. | session |
| review-dne-part-6 | RHEL 8.10 / x86_64 | ran 6 tests. 2 tests failed: ost-pools, replay-single. | session |
| review-dne-part-6 | RHEL 9.7 / x86_64 | ran 6 tests. 2 tests failed: ost-pools, replay-single. | session |
| review-dne-part-7 | RHEL 8.10 / x86_64 | ran 9 tests. 3 tests failed: sanity-scrub, sanity-pcc, large-scale. | session |
| review-dne-part-7 | RHEL 9.7 / x86_64 | ran 9 tests. 3 tests failed: sanity-scrub, sanity-pcc, large-scale. | session |
| review-dne-part-8 | RHEL 8.10 / x86_64 | ran 6 tests. 2 tests failed: replay-dual, replay-vbr. | session |
| review-dne-part-8 | RHEL 9.7 / x86_64 | ran 6 tests. 2 tests failed: replay-dual, replay-vbr. | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-selinux-ssk-part-2 | RHEL 8.10 / x86_64 | ran 9 tests. 3 tests failed: sanity-selinux, sanity-sec, recovery-small. | 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 21 tests. 6 tests failed: sanity-pfl, sanity-lnet, sanity-sec, sanity-lfsck, runtests, replay-dual. | session |
| review-dne-zfs-part-3 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-4 | RHEL 8.10 / x86_64 | ran 17 tests. 5 tests failed: sanity-quota, sanity-hsm, sanity-flr, mmp, insanity. | session |
| review-dne-zfs-part-5 | RHEL 8.10 / x86_64 | ran 7 tests. 2 tests failed: sanityn, recovery-small. | session |
| review-dne-zfs-part-6 | RHEL 8.10 / x86_64 | ran 6 tests. 2 tests failed: ost-pools, replay-single. | session |
| review-dne-zfs-part-7 | RHEL 8.10 / x86_64 | ran 9 tests. 3 tests failed: sanity-scrub, sanity-pcc, large-scale. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, RHEL 9.7 / x86_64 | ran 7 tests. 2 tests failed: sanity-lnet, sanity. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 24.04 / x86_64 | ran 10 tests. 3 tests failed: sanity-sec, sanity-lnet, sanity. | session |
| review-zfs | RHEL 8.10 / x86_64 | ran 16 tests. 5 tests failed: sanity-lsnapshot, insanity, replay-single, sanity-flr, sanity-quota. | session |
LU-20101 osp: release procfs entries early to prevent concurrent access to the internal structures being freed in parallel umount process. Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Change-Id: I9bc9e2d782fd6d4b1a0f64b0d28d8b7558de3d49
LU-9636 ofd: Add kernel doc style for OFD (5) This patch converts existing functional comments to kernel doc style comments and removes '/**' for comments which is not meant to be a kernel-doc comment Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Change-Id: I98ef715f8d0cd37842540ff586c5b481458ddfad
| unique failing test | history |
|---|---|
| recovery-small@zfs:test_155 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
LU-9636 ofd: Add kernel doc style for OFD (6) This patch converts existing functional comments to kernel doc style comments and removes '/**' for comments which is not meant to be a kernel-doc comment Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Change-Id: Ie82da73be03be0a64a108060267ccb234e7038e6
LU-9644 target: Add kernel doc style for target (3) This patch converts existing functional comments to kernel doc style comments and removes '/**' for comments which is not meant to be a kernel-doc comment Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Change-Id: I11f7f09aacafec5045e08976df6f152bbd7c3b96
LU-9644 target: Add kernel doc style for target (7) This patch converts existing functional comments to kernel doc style comments and removes '/**' for comments which is not meant to be a kernel-doc comment Test-Parameters: trivial Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Change-Id: I8261aa798029c5b422878b29ba62aa4b1350eb1b
LU-14171 ldlm: fix wrong lock in __ldlm_del_waiting_lock
In __ldlm_del_waiting_lock(), when the head of the
waiting_locks_list is removed and the timer is recalculated
for the next lock, the delta computation incorrectly uses
the removed lock's timestamp instead of the next lock's.
The condition correctly checks next->l_callback_timestamp,
but the delta assignment uses lock->l_callback_timestamp
(the lock being removed). Since the removed lock's callback
has already arrived, its timestamp is at or before the
current time, making delta zero or negative. This causes
the timer to fire immediately, expiring the next lock
prematurely and leading to unnecessary client evictions.
Fix by using next->l_callback_timestamp in the delta
calculation, consistent with waiting_locks_callback().
Lustre-change: https://review.whamcloud.com/63845
Lustre-commit: 614580008484b1169ee8da627bef11571c2cc3df
Fixes: e150810faa5b ("LU-12931 timers: correctly offset mod_timer.")
Test-Parameters: trivial
Signed-off-by: Sohei Koyama <skoyama@ddn.com>
Change-Id: Idcecc1d882ccbdd458fc69f24b7684578bd7a776
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Andreas Dilger <adilger@thelustrecollective.com>
Reviewed-by: Yang Sheng <ys@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
LU-19922 mdc: free procfs entries early so that they are release before anydata procfs can access like stats. Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com> Change-Id: I3b63b2a4a77c6b356127ab96eebb7e0441215d26
| unique failing test | history |
|---|---|
| sanity-lnet@ldiskfs+DNE:test_255 | seen in 1 other review |
| sanity-lnet@zfs:test_255 | seen in 1 other review |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | RHEL 8.10 / x86_64 | ran 11 tests. 1 tests failed: sanity-lnet. | session |
| review-dne-part-2 | RHEL 9.5 / x86_64 | ran 11 tests. 1 tests failed: sanity-lnet. | session |
| review-dne-zfs-part-2 | RHEL 8.10 / x86_64 | ran 11 tests. 1 tests failed: sanity-lnet. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, RHEL 9.5 / 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-lnet. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 24.04 / x86_64 | ran 6 tests. 1 tests failed: sanity-lnet. | session |
LU-19918 lnet: fix lnetctl import segfault with NID ranges
Handle route blocks in jt_import with a dedicated handler instead of
passing raw YAML events to the kernel via netlink. The kernel's
lnet_route_cmd() cannot parse NID range expressions (e.g.
10.52.0.[131-134]@o2ib4) in the gateway field, causing a segfault.
The new handle_route_sequence() parses route YAML entries and calls
yaml_lnet_route() for each one, which properly expands NID ranges via
lustre_lnet_parse_nid_range() before sending individual NIDs to the
kernel. This matches the behavior of the CLI path (lnetctl route add)
which already worked correctly with NID ranges.
This is a regression from 2.15 introduced when commit 56af81e1aa
(LU-10391) moved route handling in jt_import from the old ioctl API to
the netlink path without NID range expansion.
sanity-lnet test_255b exercises importing a route config with NID
range syntax in the gateway field.
Fixes: 56af81e1aa ("LU-10391 lnet: update Netlink commands functionality")
Signed-off-by: Kilian Cavalotti <kilian@stanford.edu>
Signed-off-by: Stephane Thiell <sthiell@stanford.edu>
Change-Id: I4a4c1b955487474acf10d01bc117850aea9119b4
LU-18260 o2iblnd: fix race between REJ vs kiblnd_connd
This patch fixes a possible race between CM_EVENT_REJECTED and
kiblnd_connd().
kiblnd_connd() set connection state to IBLND_CONN_DISCONNECTED
before removing the QP. So if CM_EVENT_REJECTED is received in this
time windows, it will cause the following crash:
Workqueue: ib_cm cm_work_handler [ib_cm]
all Trace:
<TASK>
dump_stack_lvl+0x34/0x48
panic+0x100/0x2d2
lbug_with_loc.cold+0x18/0x18 [libcfs]
kiblnd_cm_callback+0x108d/0x10b0 [ko2iblnd]
cma_cm_event_handler+0x1e/0xb0 [rdma_cm]
cma_ib_handler+0x8d/0x2e0 [rdma_cm]
cm_process_work+0x22/0x190 [ib_cm]
cm_rej_handler+0xdf/0x260 [ib_cm]
cm_work_handler+0x47f/0x4d0 [ib_cm]
process_one_work+0x1e8/0x390
worker_thread+0x53/0x3d0
kthread+0x124/0x150
ret_from_fork+0x1f/0x30
</TASK>
Lustre-change: https://review.whamcloud.com/56518
Lustre-commit: TBD (4c92a401be1e0a66f747a4bb68036f5f65753088)
Test-Parameters: trivial testlist=sanity-lnet
Fixes: 0b8c18d ("LU-17480 o2iblnd: add a timeout for rdma_connect")
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
Change-Id: I2d04433eb51e1a6862b788a89e127d8abb24b8a9
| unique failing test | history |
|---|---|
| sanity2@zfs:test_272a | seen in 5 other reviews |
LU-17400 uapi: Fix incorrect snamelen return value
The sname char array is limited by the struct
changelog_rec.cr_namelen value and has no '\0' character allocated
to it, so strlen() will overrun the char array till it finds the next
'\0' char.
This issue can be seen on the client side when "lfs changelog"
is run and 08RENME record types are present.
Pointer arithmetic was used between sname and name to avoid the
GCC 11 warnings mentioned in 6331eadbd6.
Added Andreas's safety/range check code to changelog_rec_sname.
Lustre-change: https://review.whamcloud.com/53624
Lustre-commit: b8f4a96b5ebd5cd35747b0a061277d02d46e7a4c
Fixes: 6331eadbd6 ("LU-15420 uapi: avoid gcc-11 -Werror=stringop-overread")
Signed-off-by: Josh Samuelson <josh@1up.unl.edu>
Change-Id: Ie0817dfdd1d02e06b9399e66f1affaadb9e156c4
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Timothy Day <timday@amazon.com>
Reviewed-by: Arshad Hussain <arshad.hussain@aeoncomputing.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: xinliang <xinliang.liu@linaro.org>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
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>
LU-14301 client: use EOPNOTSUPP instead of ENOTSUPP Don't return NFS-specific error code ENOTSUPP back to userspace, instead use EOPNOTSUPP. ENOTSUPP does not print a useful error message from strerror() if it is hit by an application. Lustre-change: https://review.whamcloud.com/51511 Lustre-commit: ffd2fc1e17822c013d7790cc8247361c567792af Signed-off-by: Andreas Dilger <adilger@whamcloud.com> Signed-off-by: Gian-Carlo DeFazio <defazio1@llnl.gov> Change-Id: Iabd07b31069737e8ee7ca2382fd8cff6143ebbe5 Reviewed-by: Neil Brown <neilb@suse.de> Reviewed-by: jsimmons <jsimmons@infradead.org>
| unique failing test | history |
|---|---|
| conf-sanity4@zfs:test_122b | seen in 5 other reviews |
| recovery-small@ldiskfs+DNE:test_24b | seen in 2 other reviews |
| sanity3@ldiskfs+DNE:test_812a | seen in 1 other review |
| sanity3@ldiskfs+DNE:test_812b | seen in 1 other review |
| sanity3@ldiskfs+DNE:test_812c | seen in 1 other review |
| sanity3@ldiskfs+DNE:test_816 | seen in 1 other review |
| sanity3@ldiskfs+DNE:test_818 | seen in 1 other review |
| sanity2@zfs:test_133d | seen in 4 other reviews |
LU-16973 ptlrpc: flush delayed file desc if idle
The use of alloc_file_pseudo() allocates a real file descriptor,
so fput() will use a deferred cleanup for the descriptor, either
when the thread "finishes the syscall" (which never happens for
kernel threads), or a unmount time. This accumulates too many
file descriptors (millions) on a busy system.
Instead of waiting to cleanup these file descriptors at unmount
time, call flush_delayed_fput() to clean them up when a ptlrpcd
thread becomes idle before it goes to sleep.
For kernels 3.6 and later when flush_delayed_fput() was first added,
and before kernel 5.4 when it was EXPORT_SYMBOL'd, grab a pointer
to the function with kallsyms_lookup_name() so it can be called.
Delete LN_CONFIG_STRSCPY_EXISTS reference that generates configure
warnings, since this check was renamed and moved to libcfs.
Lustre-change: https://review.whamcloud.com/51805
Lustre-commit: 2feb4a7bb01c5e98763a62fb0bd64edf933c95de
Fixes: b0f150eba ("LU-13783 osd-ldiskfs: use alloc_file_pseudo to create fake files")
Signed-off-by: Andreas Dilger <adilger@whamcloud.com>
Change-Id: I24a08f9568d7d636a69672c5c3132ab25b292407
Reviewed-by: Neil Brown <neilb@suse.de>
Reviewed-by: Andrew Perepechko <andrew.perepechko@hpe.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Alexander Boyko <alexander.boyko@hpe.com>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
LU-14295 o2iblnd: update default peer_credits value Update the peer_credits/peer_credits_hiw/concurrent_sends default values to 32/16/64 respectively, as these are the optimal values performance wise. The default peer_credits is used for socklnd as well. Therefore this patch will update the default socklnd peer_credits to 32 as well, which is desirable. Test-Parameters: trivial testlist=sanity-lnet Signed-off-by: Amir Shehata <ashehata@whamcloud.com> Change-Id: I0e7b7064b42b30629930af63706577117fc99a45
| unique failing test | history |
|---|---|
| conf-sanity2@ldiskfs+DNE:test_56a | seen in 26 other reviews |
| conf-sanity2@ldiskfs+DNE:test_57a | seen in 26 other reviews |
| conf-sanity2@ldiskfs+DNE:test_57b | seen in 26 other reviews |
LU-19080 shrinker: make ll_shrinker_create() compilable ll_shrinker_create() does not compile with not defined HAVE_SHRINKER_ALLOC, e. g. for 5.14.0-503.40.1.el9.x86_64. Signed-off-by: Vladimir Saveliev <vladimir.saveliev@hpe.com> Change-Id: I386ef2954a0c211d4bc179a169710fd2cb1bd216
Having a single list and spinlock could have noticeable contention on a many-core system, often 256+ cores today. This could have an array of LRUs (e.g. based on hash/modulo of inode number) with an array of spinlocks, like "struct blockgroup_lock", which is sized large enough to minimize contention, but not so large that it is one lock per core.
Linux already use single list to store all the inodes sb->s_inodes (protected by a single lock). But I think that the last patch implementation prevent most of the application overheads.
LU-14408 llite: add a Lustre inode cache shrinker This provides a way to shrink the unused inode cache (inodes not covered by LDLM locks) for a Lustre superblock. The following command will drop all the unused inodes for <fsname>: # lctl set_param llite.<fsname>-*.inode_cache=clear The following command will disable the unused inode cache: # lctl set_param llite.<super>.inode_cache=0 # lctl get_param -n llite.<super>.inode_cache max_cached_mb: 0 max_cached_cnt: 0 unused_inode_mb: 0 unused_inode_cnt: 0 The following command will enable the inode cache without limit: enabled: 1 # lctl set_param llite.<super>.inode_cache=1 or # lctl set_param llite.<super>.inode_cache=unlimited # lctl get_param llite.<super>.inode_cache max_cached_mb: unlimited max_cached_cnt: unlimited unused_inode_mb: 0 unused_inode_cnt: 100 The following command will limit the unused inode cache to 5MiB: # lctl set_param llite.<super>.inode_cache=5M # lctl get_param -n llite.<super>.inode_cache max_cached_mb: 5 max_cached_cnt: 3450 unused_inode_mb: 0 unused_inode_cnt: 100 Add regression tests: sanity 433b, 433c and 433d. Test-Parameters: clientdistro=ubuntu2204 testlist=sanity env=ONLY=433 Test-Parameters: clientdistro=el9.4 testlist=sanity env=ONLY=433 Test-Parameters: clientdistro=el8.10 testlist=sanity env=ONLY=433 Signed-off-by: Etienne AUJAMES <eaujames@ddn.com> Change-Id: I93554e8bc32b55d234fc255abdfee8743a0e3dc0
LU-16565 llite: Remove ldlm is,set,clear macros
Replaces ldlm_{is,set,clear} macros with the direct flag
names.
The patch has been generated with the coccinelle script in
contrib/cocci/ldlm_flags.cocci.
Test-Parameters: trivial
Signed-off-by: Timothy Day <timday@amazon.com>
Change-Id: I7a3c639c1c961e8e7a36049dd945e228310c81bd
LU-5570 lnet: check router aliveness timestamp In current LNet, peer aliveness timestamp is only recorded for peers on routers, this patch changes this and also record aliveness of routers on regular nodes, so lnet can check aliveness timestamp of routers before sending message, avoid to choose router which has old aliveness timestamp and could be potentially dead or congested. Please check this patch for history of it: http://review.whamcloud.com/11748 Signed-off-by: Liang Zhen <liang.zhen@intel.com> Change-Id: I57874d6305d5d18faeff7452fc9ae95f04c43fdd
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-3 | CentOS 7.0/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-2 crashed | CentOS 7.0/x86_64 | ran 12 tests. 1 tests failed: sanity-hsm. %% THIS TEST SESSION CRASHED %% | session |
| review-zfs | CentOS 7.0/x86_64 | ran 8 tests. 1 tests failed: conf-sanity. | session |
LU-10003 tests: replace lctl with lnetctl for lnet Replace lctl [net|list_nids|ping] with the appropriate lnetctl commands Signed-off-by: Amir Shehata <amir.shehata@intel.com> Change-Id: I51f324df42eaa6a1ac7d59374db67a373e3ee6e5
LU-10669 lnet: do not assert in lnet_msg_detach_md() There appears to be a scenario where lnet_msg_detach_md() can be called twice on the same msg/md pair. Print out more information about the message and the md instead of asserting. Signed-off-by: Amir Shehata <amir.shehata@intel.com> Change-Id: I54813d1db89f55a20833fbbe5d3248014375cb93
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-2 | CentOS 7.0/x86_64 | ran 10 tests. 1 tests failed: sanity-scrub. | session |
| review-dne-zfs-part-2 | CentOS 7.0/x86_64 | ran 10 tests. 1 tests failed: sanity-sec. | session |
LU-11735 lnd: clean up fmr/FastReg condition First patch to do some minor cleanup around selecting which memory registration to use. Previously we used a bool, now we use an enum in case there are different types of memory registration to support in the future. Signed-off-by: Amir Shehata <ashehata@whamcloud.com> Change-Id: I0979c87dbd14f77cba4f2c45d8e54508bcc1f090
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-4 | CentOS 8.3/x86_64 | ran 10 tests. 1 tests failed: sanity-quota. | session |
LU-12885 mdc: remove flags argument from pack functions Remove the flags argument from mdc_pack_body() and mdc_getattr_pack() functions. All of the callers explicitly pass 0 to the functions, except mdc_xattr_common() which gets 0 directly from mdc_getxattr(), while mdc_setxattr() passes opcode = MDS_REINT and does not call mdc_pack_body() in this case. Rename the xattr_flags to make it clear what kind of flags they are. Signed-off-by: Andreas Dilger <adilger@whamcloud.com> Change-Id: I5d0ab202f1405e2aa4269020d8d274e69a3ebbe5
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-selinux-ssk-part-1 | CentOS 8.3/x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-1 | CentOS 8.3/x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-2 | CentOS 8.3/x86_64 | ran 7 tests. 1 tests failed: replay-dual. | session |
EXA-4252 debian: remove mpi dependency in debs Remove mpi-default-bin and mpi-default-dev dependencies for all debian packages except lustre-tests Change-Id: I28145d47598d0bf449351f40215236adbb3565e9 Signed-off-by: ldouriez <ldouriez@ddn.com>
| unique failing test | history |
|---|---|
| replay-dual@zfs:test_26 | seen in 1 other review |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-3 | CentOS 8.3/x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
LU-15501 obdclass: cli access in obd_set_max_rpcs_in_flight racy also in obd_set_max_mod_rpcs_in_flight. Parallel osc teardown can set cli->import to NULL causing a NULL pointer dereference. Protect access with cli_sem Change-Id: Ia128ff5895be2ec037f09e07d0395889b9861148 Signed-off-by: Oleg Drokin <green@whamcloud.com>
LU-16053 build: osd-zfs use parallel configure macros The infrastructure to parallelize the kernel configure checks was added in LU-13485 but has only been lightly used. Update the OpenZFS configure checks to make use of the new macros. This reduces the time for these checks to a few seconds. As part of this change the ZFS configure output has also been standardized across all checks. Tested with OpenZFS 2.0.7 and 2.1.5 releases on RHEL 8.6. Test-Parameters: trivial Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: I5be09dce191c1d69bfa8434a716e0d9e75c53344
| unique failing test | history |
|---|---|
| sanity2@zfs+DNE:test_230n | seen in 26 other reviews |
I think you should be passing in a 'struct sockaddr', not a 'struct lnet_nid'. That would remove James' complaint about passing LNET_NET_ANY.
Sounds good. Thanks
LU-13642 lnet: Allow static IP specification Allows selecting an interface by specifying an IP address(NID) in the lustre.conf (lnet.conf) file or as parameter in the module start. example: networks=tcp1(1.2.3.4) The change does not have any effect on current configurations. Changes for IPV6 are included, but not activated and tested. Further IPV6 changes are not integrated. For further reference please read IP specification in LNet https://wiki.whamcloud.com/display/LNet/IP+specification+in+LNet Test-Parameters: trivial Signed-off-by: Frank Sehr <fsehr@whamcloud.com> Change-Id: I8c6eed84d621abcc87507f90b84f3f8892739907
LU-16858 build: remove flock config option flock'ing can be turned on and off at mount time, so a configure option to change the default behavior is rather odd and is not actually used. So let's remove it. Note despite the slightly confusing phrasing in the code, flock is *on* by default and this lets you change the mount time default to off. So this patch is not changing the 'normal' runtime flock behavior. test-parameters: trivial Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: If2706506135264f501c6cbc6243ed449f9792605
LU-16858 build: Remove checksum config option Lustre is never built without checksum support and it can be disabled at runtime if needed. Remove the config option. Unlike some of the config removals, this one required almost no changes, so I've marked it trivial. test-parameters: trivial Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: I04ea24a8a8ae1d41e70113438b8a7abaa6826231
| failed enforced test | platform | detail | |
|---|---|---|---|
| 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 6 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-5 crashed | RHEL 8.7/x86_64 | ran 6 tests. 1 tests failed: sanityn. %% THIS TEST SESSION CRASHED %% | session |
| review-zfs crashed | RHEL 8.7/x86_64 | ran 10 tests. 2 tests failed: replay-single, sanity-quota. %% THIS TEST SESSION CRASHED %% | session |
So you are not removing this config check? ;-)
Huh, I wonder how this got lost in pushing the patch up... Weird.
LU-14639 build: Remove disable-lru-resize config The lru-resize feature is disabled at runtime by setting lru_resize to 0. If it is compiled out or disabled at mount time, then it can never be enabled without recompiling or remounting. Disabling it like this doesn't offer any advantages, and and all customers disabling it are setting lru_size manually already. Let's remove the extra ways to disable lru-resize to avoid confusion and possible bugs. This patch also removes checks in the tests which verify the client and server have lru-resize support. Servers have had lru-resize support for several years, and with this patch, it becomes impossible to build clients without it either. Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: I801b9eb8cf280e37bc81b3adade7973e295d151f
LU-17022 obdclass: rename obd_dev_lock to obd_devs_lock obd_dev_lock locks all devs, not just one. And the same is the same of that of a lock in struct obd_device - which can be confusing. So rename to obd_devs_lock. Test-Parameters: forbuildonly Signed-off-by: Mr NeilBrown <neilb@suse.de> Change-Id: I562b5535ed9b4528705f9e030375577ea5fa0fcb
LU-11824 build: Optionally package LNDs in their own RPM For Lustre vendors, it is desirable to maintain a single set of packages for a given build that will be used for all kind of hardware. However, some LNDs can bring external dependencies which are not wanted on some node. For example, the o2ib LND built against Mellanox OFED will bring dependencies on the Mellanox OFED kernel modules, thus requiring with the current packaging to install Mellanox OFED even on the nodes which will only use Ethernet (and not even have IB hardware installed). This patch adds a configure and RPM build time option to package chosen LNDs in their own RPM, binding the dependencies to only the specific LND package. The --with-separate_lnds=o2ib option at configure time (followed by make rpms) or --define 'separate_lnds o2ib' at rpmbuild time will remove the ko2iblnd kernel module from the kmod-lustre package and create an additional kmod-lustre-lnd-o2ib package with the o2ib LND. Several LNDs can be listed at once (separated spaces), in which case each listed LND will be packaged in its own RPM. When the option is not specified, the current behavior remains (packaging all built LNDs in the same kmod-lustre RPM). Signed-off-by: Sebastien Piechurski <sebastien.piechurski@atos.net> Change-Id: I169edb40ebbcfc8c4bcb75e1a56a28bf437f5c9b Test-Parameters: trivial
LU-18227 ldiskfs: refresh Ubuntu 22.04 5.15 Refresh Ubuntu 5.15 ldiskfs kernel, tested with 5.15.0-122-generic Update ext4-data-in-dirent.patch and ext4-prealloc.patch and create a new series for 22.04 Test-Parameters: trivial Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: I5b8f3ebbaf31c07322a818c151c9f9e939bdf0b0
LU-15509 lnet: Ping buffer ref leak in lnet_peer_data_present
lnet_peer_merge_data() and lnet_peer_set_primary_data() are
responsible for dropping the reference on the ping buffer that is
taken by lnet_peer_push_event() and lnet_discovery_event_reply().
However, there are some error paths in lnet_peer_data_present()
where we do not call either lnet_peer_merge_data() or
lnet_peer_set_primary_data(). In these cases, we need to drop
the reference on the ping buffer otherwise it will leak.
Lustre-change: https://review.whamcloud.com/46431
Lustre-commit: 4de9793654ec1b2f08d93f74f7391c4245ab8769
Fixes: 0f1aaad4c1b ("LU-9480 lnet: implement Peer Discovery")
HPE-bug-id: LUS-10715
Test-Parameters: trivial testlist=sanity-lnet
Signed-off-by: Chris Horn <chris.horn@hpe.com>
Signed-off-by: Olaf Faaland <faaland1@llnl.gov>
Change-Id: I36ba0017caa9d6ce139f94090912496f14eda626
Reviewed-by: Andriy Skulysh <andriy.skulysh@hpe.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Serguei Smirnov <ssmirnov@whamcloud.com>
Reviewed-by: Cyril Bordage <cbordage@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
LU-10499 tests: use smaller files in sanity-pcc/103+104 Running fallocate is fast, but the actual PCC data copy may be slow. Use smaller test files for sanity-pcc test_103 and test_104 to speed up testing, and also wait longer in case the copy is slow. Add some extra debugging on failure so we can see the file attach state on failure, in case there is something wrong with the parsing. EX-8466 tests: limit 'cmp' output in sanity-pcc.sh Limit the number of lines printed by 'cmp' when there is an error comparing two files. Often the files are multiple MB in size, and printing 1-32M lines of output when the test fails is not useful. Instead, print the first 66000 lines of output by default, which is enough to see a full 64KiB plus some lines to see if more than 64KiB of data is incorrect. This is controlled by the CMP_LINES variable. Was-Change-Id: I80f4d5d3460d531ab63788185a2c88e79415a801 EX-bug-id: EX-8671 EX-8466 Test-Parameters: trivial testlist=sanity-pcc Test-Parameters: testlist=sanity-pcc env=ONLY=103,ONLY_REPEAT=100 Test-Parameters: testlist=sanity-pcc env=ONLY=104,ONLY_REPEAT=100 Signed-off-by: Andreas Dilger <adilger@whamcloud.com> Change-Id: I09f159810a778b8ef2bab93d0e2869237a3ebbe5
| unique failing test | history |
|---|---|
| sanityn@ldiskfs+DNE:test_80b | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
LU-9839 clio: lov active ios accounting fix ASSERT(atomic_read(&lov->lo_active_ios)==0) is triggered due to a bug in active_ios accounting. For some cl_io_init(,CIT_MISC,,) calls increment the lov_active_ios counter is not protected by the layout lock. So the checks for active_ios != 0 are racy and not preventing another thread from starting new cl_io and incrementing the active_ios counter after any check but before the assertion. The lov_active_ios counter increment should be done under the same condition as taking the layout type lock. The ci_type=CIT_MISC and ci_ignore_layout=1 should not be used in ll_dom_finish_open() as the I/O doesn't come "from the osc layer" and may race with a layout change. Lustre-change: https://review.whamcloud.com/51638 Lustre-commit: 5bc1dd825b700677b002a43463a463c3ccb665ec HPE-bug-id: LUS-11628 Signed-off-by: Alexander Zarochentsev <alexander.zarochentsev@hpe.com> Change-Id: I35fda85b968b847a87e73dd36bbb1648c744d62c Reviewed-by: Mikhail Pershin <mpershin@whamcloud.com> Reviewed-by: James Simmons <jsimmons@infradead.org> Reviewed-by: Patrick Farrell <pfarrell@whamcloud.com> Reviewed-by: Vitaly Fertman <vitaly.fertman@hpe.com>
| unique failing test | history |
|---|---|
| sanity-flr@ldiskfs+DNE:test_203 | seen in 1 other review |
| sanity-flr@ldiskfs+DNE:test_204e | seen in 1 other review |
LU-15722 osd-ldiskfs: fix write stuck for 64K PAGE_SIZE
This fixes below IO write stuck issue:
-----
[606895.151765] LustreError:
334886:0:(ofd_io.c:1389:ofd_commitrw_write()) lustre-OST0000: restart IO
write too many times: 10000
[606895.207345] LustreError:
334886:0:(ofd_io.c:1389:ofd_commitrw_write()) Skipped 8 previous similar
messages
-------
Which goes into an infinite loop:
ofd_commitrw_write()->osd_write_commit()->osd_ldiskfs_map_inode_pages()
->ldiskfs_map_blocks()->ofd_commitrw_write()
The cause is that:
For 64K PAGE_SIZE blocks allocation/mapping. m_lblk should be the
first un-allocated block if m_lblk points at an already allocated
block when create = 1, ldiskfs_map_blocks() will just return with
already allocated blocks and without allocating any new requested
blocks for the extent.
This stuck issue won't happen on 4K PAGE_SIZE. Because for
PAGE_SIZE = blocksize case, if m_lblk points at an already
allocated block it will point at an un-allocated block in next
restart transaction, because the already mapped block/page will
be filtered out in next restart transaction via flag
OBD_BRW_DONE in osd_declare_write_commit().
Lustre-commit: 48ccf2db8495344e1d0c39f8bed0969279e29db4
Lustre-change: https://review.whamcloud.com/47004
Change-Id: Iadba0be8875a15a2e2f158ec9571f5ece5637ae0
Signed-off-by: Xinliang Liu <xinliang.liu@linaro.org>
Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Signed-off-by: Xinliang Liu <xinliang.liu@linaro.org>
LU-15722 osd-ldiskfs: fix write stuck for 64K PAGE_SIZE
This reverts a previous commit for large PAGE_SIZE to fix a stuck IO
issue in another way.
One more ldiskfs_map_blocks() can't fix the write stuck for PAGE_SIZE
> BLOCK_SIZE. It still gets stuck in some tests like sanity-dom fsx.
Because each time ldiskfs_map_blocks() lookup it only return a
continuous range physical blocks. If a page has multiple continuous
range blocks, then it needs multiple ldiskfs_map_blocks() lookups to
find out all the already mapped blocks.
The fixed idea here is to record the already written blocks of the
start page and skip them at the next write retry.
This also fix and cleanup osd_mark_page_io_done() when start_blocks
is non-zero.
Lustre-commit: 176ea3a4599ede8b1a0c91506dcd34bc162f2959
Lustre-change: https://review.whamcloud.com/47563
Fixes: 176ea3a4599e ("LU-15722 osd-ldiskfs: fix IO write gets stuck for 64K PAGE_SIZE")
Change-Id: I9c14d5d0aa23e81837dacb01d050c091e6a79148
Signed-off-by: Xinliang Liu <xinliang.liu@linaro.org>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Alexey Lyashkov <alexey.lyashkov@hpe.com>
Signed-off-by: Xinliang Liu <xinliang.liu@linaro.org>
| unique failing test | history |
|---|---|
| sanity-scrub@ldiskfs+DNE:test_12 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
LU-17308 mgs: move pool_cmd check to the kernel Several checks for pool_cmd need to be done before touching the MGS configuration. e.g: the following case should be denied before adding a destroy record in the MGS configurations: - The pool does not exist - The pool is not empty (OSTs still in the pool) This work is done in userspace (check_pool_cmd) by checking the client lov parameters for pools. But nothing guarantees those parameters to be in sync. So, only the MGS configuration should be trusted for that. This patch move those checks in the kernel. There are several reasons for this: - It guarantees the pool configurations consistency even if an external tool is used. - For standalone MGS, it limits the overhead of reading the configuration several times. This patch add a "-n|--nowait" option for pool_cmd to skip waiting for pool updates on the clients. This is useful when doing a lot of pool_cmd in a raw. And this avoids cancelling clients CONFIG lock each times (because of mgc_requeue_timeout_min). e.g: lctl pool_destroy -n lustre.old lctl pool_new -n lustre.test lctl pool_add -n lustre.test OST0001 ... lctl pool_add lustre.test OST0010 check_pool_cmd_result() is modified to compute the client wait delay with mgc_requeue_timeout_min. Add a regression test "ost-pools 2f". Lustre-change: https://review.whamcloud.com/53202 Lustre-commit: ce824977a212d243e15cf07e52a91984841f9b17 Test-Parameters: testlist=ost-pools Test-Parameters: testlist=ost-pools Test-Parameters: testlist=ost-pools env=ONLY=2f,ONLY_REPEAT=50 Test-Parameters: testlist=ost-pools env=ONLY=2f,ONLY_REPEAT=50 Signed-off-by: Etienne AUJAMES <eaujames@ddn.com> Change-Id: Ifbc49b5667bf17253716052a7480114936c65149 Reviewed-by: Guillaume Courrier <guillaume.courrier@cea.fr> Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Reviewed-by: James Simmons <jsimmons@infradead.org>
I think you meant. if (test_bit(OBDF_RECOVERING, lock->l_export->exp_obd->obd_flags))
LU-17022 obdclass: convert recovery flags to bit ops obd_recovering:1, /* there are recoverable clients */ obd_abort_recovery:1, /* abort client and MDT recovery */ obd_abort_mdt_recovery:1, /* abort recovery between MDTs */ are now OBDF_RECOVERING, /* there are recoverable clients */ OBDF_ABORT_RECOVERY, /* abort client and MDT recovery */ OBDF_ABORT_MDT_RECOVERY,/* abort recovery between MDTs */ This allows us to remove some locking. In a couple of places the lock also covers code where obd_recovery_timeout or obd_recovery_start are updated. As these fields are also updated or accessed without any locking, the coverage here must be accidental rather than intentional, and can be removed. Test-Parameters: trivial Signed-off-by: Mr NeilBrown <neilb@suse.de> Change-Id: I66ec78683162dc4c9d3e26606fd7cc5f977901dc
| unique failing test | history |
|---|---|
| sanity-hsm@ldiskfs+DNE:test_255 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne | RHEL 8.8/x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-dne-arm | RHEL 8.7/aarch64, RHEL 8.8/x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
LU-16893 libcfs: Remove force_sig usage from lfsck
The lfsck pool of kernel threads uses force_sig() to signal
the worker threads to stop. A signal is used here as the
lfsck workers may be waiting in various, and possibly
nested, states.
As force_sig() has been removed let us simply enable SIGINT
to be passed to the worker threads using send_sig().
Lustre-change: https://review.whamcloud.com/51470
Lustre-commit: b876e22466a83dacfbbbeb90d841dc917a793666
Test-parameters: trivial testlist=sanity-lfsck,lfsck-performance
HPE-bug-id: LUS-11670
Fixes: db9f9543ec ("LU-12634 libcfs: force_sig() removed task parameter")
Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com>
Change-Id: Ibf6a67f43687960b3eff9cb9a7c7dc8b1be1da63
Reviewed-by: James Simmons <jsimmons@infradead.org>
Reviewed-by: Neil Brown <neilb@suse.de>
Signed-off-by: Xinliang Liu <xinliang.liu@linaro.org>
| unique failing test | history |
|---|---|
| sanity-pfl@zfs:test_20c | seen in 6 other reviews |
| sanity-pfl@zfs:test_20d | seen in 6 other reviews |
| sanity-pfl@zfs:test_20e | seen in 6 other reviews |
| sanity-pfl@zfs:test_21a | seen in 6 other reviews |
| sanity-pfl@zfs:test_21b | seen in 6 other reviews |
| sanity-pfl@zfs:test_22a | seen in 6 other reviews |
| sanity-pfl@zfs:test_22b | seen in 6 other reviews |
| sanity-pfl@zfs:test_22c | seen in 6 other reviews |
| sanity-pfl@zfs:test_23a | seen in 6 other reviews |
| sanity-pfl@zfs:test_23b | seen in 6 other reviews |
| sanity-pfl@zfs:test_23c | seen in 6 other reviews |
| sanity-pfl@zfs:test_23d | seen in 6 other reviews |
| sanity-pfl@zfs:test_23e | seen in 6 other reviews |
| sanity-pfl@zfs:test_23f | seen in 6 other reviews |
| sanity-pfl@zfs:test_25 | seen in 6 other reviews |
(defect) this env var is unknown
LU-13343 gss: no sec flavor on loopback connection When using a local client, i.e. a client mounted on a server node, there is no benefit from a security standpoint to enforce an SSK or KRB flavor, since the data does not go over the network. So force the 'null' security flavor for connections on 0@lo, independently of the currently defined srpc flavor. Lustre-change: https://review.whamcloud.com/46704 Lustre-commit: e3e91ea95fd96a5eafc598e3812390b4cbac05c3 Signed-off-by: Sebastien Buisson <sbuisson@ddn.com> Change-Id: If25d69bb1e67735cb0544ca954e49175f7471248 Reviewed-by: Aurelien Degremont <adegremont@nvidia.com> Reviewed-by: Andreas Dilger <adilger@whamcloud.com> Reviewed-by: James Simmons <jsimmons@infradead.org>
LU-8585 llapi: use open_by_handle_at in llapi_open_by_fid
Reimplement llapi_open_by_fid() to use llapi_fid_to_handle() and
open_by_handle_at(2) rather than using ioctl(). This works for
opens on subdirectory mountpoints, unlike ".lustre/fid/<fid>".
This patch also adds llapi_open_by_fid_at() which is similar to
llapi_open_by_fid() except that it takes an open directory file
descriptor or AT_CWD rather than a path as its first argument.
[AD:
- Move get_root_*() functions over to a new liblustreapi_root.c
file in expectation of further enhancements to that code.
- Cache an open file handle on the root directory so repeated
calls to llapi_open_by_fid() and llapi_fid2path() do not need
to search for and open the same root directory path many times.
- Add man pages for newly-added functions.
This reduces the system calls for llapi_fid_test significantly:
original patched
14511 4315 total opens
64807 34067 total syscalls
]
There may still be a need to have a fallback from open_by_handle_at()
to using ".lustre/fid/<FID>" to open the fid (if available), but
that can be added if this initial patch does not test well. The
open_by_handle_at() method avoids reopening the "fid/" directory
each time (though this fd could also be cached), but it has the
drawback that it reconnects dentries to the root directory each time.
Lustre-change: https://review.whamcloud.com/36603
Lustre-commit: bdf7788d19985bb7abf2385add15f1d67f3d01e4
Signed-off-by: Quentin Bouget <quentin.bouget@cea.fr>
Change-Id: I8a4904c996389da2b0894cd9fac639a398607535
Signed-off-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Jian Yu <yujian@whamcloud.com>
Reviewed-by: Emoly Liu <emoly@whamcloud.com>
Reviewed-by: James Simmons <jsimmons@infradead.org>
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
LU-15759 libcfs: debugfs file_operation should have an owner If debugfs a file is open when unloading the libcfs/lnet module, it produces a kernel Oops (debugfs file_operations callbacks no longer exist). Crash generated with routerstat (/sys/kernel/debug/lnet/stats): [ 1449.750396] IP: [<ffffffffab24e093>] SyS_lseek+0x83/0x100 [ 1449.750412] PGD 9fa14067 PUD 9fa16067 PMD d4e5d067 PTE 0 [ 1449.750428] Oops: 0000 [#1] SMP [ 1449.750883] [<ffffffffab7aaf92>] system_call_fastpath+0x25/0x2a [ 1449.750897] [<ffffffffab7aaed5>] ? system_call_after_swapgs+0xa2/0x13a This patch adds an owner to debugfs file_operation for libcfs and lnet_router entries (/sys/kernel/debug/lnet/*). The following behavior is expected: $ modprobe lustre $ routerstat 10 > /dev/null & $ lustre_rmmod rmmod: ERROR: Module lnet is in use Can't read statfile (ENODEV) [1]+ Exit 1 routerstat 10 > /dev/null $ lustre_rmmod Note that the allocated 'struct file_operations' cannot be freed until the module_exit() function is called, as files could still be open until then. Lustre-change: https://review.whamcloud.com/47335 Lustre-commit: b2dfb4457f0f1e56f3df448cf67ac97e728f4417 Signed-off-by: Mr NeilBrown <neilb@suse.de> Change-Id: Ia0920313e0c2a4b6cdc875fed08221e174a12a73 Reviewed-by: Etienne AUJAMES <eaujames@ddn.com> Reviewed-by: James Simmons <jsimmons@infradead.org> Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
LU-15093 libcfs: Check if param_set_uint_minmax is provided Linux kernel v5.15 commit 2a14c9ae15a38148484a128b84bff7e9ffd90d68 moved param_set_uint_minmax to common code. Lustre-change: https://review.whamcloud.com/45214 Lustre-commit: 3337e9fe920b260e34ff62c0840279ea6bff34ca HPE-bug-id: LUS-10469 Test-Parameters: trivial Signed-off-by: Chris Horn <chris.horn@hpe.com> Change-Id: Ifd1d72ae531f0f6c7cd96cc28fbc07c8a8b70886
LU-12756 lnet: Refactor lnet_handle_lo_send Replace the send_data argument. Rename the function to lnet_prep_msg_for_lolnd to better reflect what is accomplished by this routine. Test-Parameters: trivial Signed-off-by: Chris Horn <hornc@cray.com> Change-Id: I56de8ae8f6bb5802e35362a7e3c0bdd6e7a1c4f3
LU-12756 lnet: Switch lnet_handle_lo_send to void function This function only returns LNET_CREDIT_OK. Switch it to void and adjust callers. Test-Parameters: trivial Signed-off-by: Chris Horn <hornc@cray.com> Change-Id: I17d3cff0d70bd347c3b6cb76dcf1f0f9f8aac75c
LU-15583 build: Update ZFS version to 2.1.2 Update ZFS version to 2.1.2. The changes are listed in: https://github.com/openzfs/zfs/releases/tag/zfs-2.1.2 Change-Id: If7c81a4b1fe13e29eea1c277b896223f5c06b31a Signed-off-by: Jian Yu <yujian@whamcloud.com>
what's zerooffset? we have zero hits in the entirety of the codebase and commit messages.
(minor) A few hunks aren't covered by the description. The rewrite of lov_pattern_supported(), lov_pattern_available() and lov_pattern_supported_normal_comp() is not just a mechanical bitmask conversion - it widens what each accepts (see the lustre_user.h comment). That is server-side layout validation, so it deserves a sentence. The lov_ea.c dump_lsm() change adds a new field to a debug print and isn't mentioned at all - was that meant to be part of this patch? Also, the subject tag is `llapi:`, but roughly half the diff is in the uapi header and lustre/lov/, which the servers compile too. The "zerooffset" question raised on the previous revision is still open; there's no zerooffset handling in this diff (or anywhere in the tree).
Did we ever get a confirmation this is not going to affect application api / old/new library linked apps problems?
(defect) Changing LLAPI_LAYOUT_RAID0 from 0 to 0x40 and requiring the RAID0 bit alongside LLAPI_LAYOUT_OVERSTRIPING breaks applications compiled against the older header, which is the concern raised on earlier revisions and still not addressed. Two concrete failures against the new liblustreapi:
/* old header: LLAPI_LAYOUT_OVERSTRIPING == 0x4 */
llapi_layout_pattern_set(l, LLAPI_LAYOUT_OVERSTRIPING);
llapi_layout_supported(0x4) is false because the RAID0 bit is clear, so this now returns -1/EOPNOTSUPP where it used to succeed. The test32() change in llapi_layout_test.c is exactly that break.
/* old header: LLAPI_LAYOUT_RAID0 == 0 */
llapi_layout_pattern_get(l, &p);
if (p == LLAPI_LAYOUT_RAID0) ...
p is now 0x40, and an overstriped component returns 0x44 instead of 0x4, so the comparison silently stops matching. liblustreapi is a versioned shared library and this is a source and binary incompatible change with no soname bump or compat path.
The suggestion from the earlier review - keep LLAPI_LAYOUT_RAID0 at 0 and introduce a separate settable bit - would avoid both, as would accepting a bare LLAPI_LAYOUT_OVERSTRIPING in llapi_layout_pattern_set().
(minor) A couple of things on the two new exported functions. Neither has a doc comment, unlike the rest of this header, and there is no Documentation/man3 page for either. llapi_layout_pattern_set.3 / llapi_layout_pattern_get.3 also still say "the only supported RAID pattern is RAID0" and document LLAPI_LAYOUT_RAID0 as a plain value, which no longer matches the bitmask semantics. The names read as operating on `struct llapi_layout`, like the rest of the llapi_layout_* family, but both take a bare pattern bitmask. Something like llapi_layout_pattern_supported() and llapi_layout_string_to_pattern() would be less surprising. The declaration calls the out parameter `layout` while the definition calls it `pattern`; `pattern` is the accurate one. The rest of the pattern API uses uint64_t rather than unsigned long long.
This should be giving a checkpatch error.
(defect) This is an installed public header, so an unconditional BIT() definition lands in the namespace of every application that includes it, and collides with any application (or other kernel-uapi header) that defines its own. lustreapi_internal.h already guards its copy with `#ifndef BIT`, which is what the earlier review asked for here too and is still not done. BIT() also doesn't appear anywhere in this header - is the definition needed at all in this patch?
(defect?) These three helpers don't just get rewritten in bitmask form, they get more permissive, and nothing in the commit message covers it. lov_pattern_supported()/lov_pattern_available() previously accepted exactly RAID0, RAID0|OVERSTRIPING, RAID0|PARITY, RAID0|COMPRESS and MDT. Masking with LOV_PATTERN_RAID0_VALID now also lets through RAID0|OVERSTRIPING|PARITY, RAID0|COMPRESS|PARITY, RAID0|COMPRESS|OVERSTRIPING and all three at once. Given the comment above says "current client IO only understand these patterns", is client IO actually able to handle overstriped EC, for instance? lov_pattern_supported_normal_comp() (line 859) picks up LOV_PATTERN_COMPRESS via LOV_PATTERN_RAID0_VALID_NORM, which it never accepted before. That changes lod_fix_desc_pattern()/lov_fix_desc_pattern() so a filesystem-wide default pattern of RAID0|COMPRESS is now accepted with no compression parameters attached, and changes lfsck_layout_verify_header() so compressed components stop returning -EOPNOTSUPP. Both may well be the right thing, but they look like separate changes from the llapi rework.
I would assume that the old `LLAPI_LAYOUT_RAID0 = 0` value would also be accepted? Otherwise, this will introduce a compatibility issue. Even so, this means that applications using the new library would break with ones compiled using the old headers. Maybe a better option would be to add `LLAPI_LAYOUT_RAID0_SET = 0x0000040ULL` that can be set and checked in the code, but still keep the `LLAPI_LAYOUT_RAID0 = 0` value for compatibility for a few years.
(style) should use `#ifndef BIT`
(style) spurious blank line
(style) `layout %x layout_gen %u` is missing the comma separator that every other field in this format string has, and has a doubled space.
LU-18461 llapi: replace pattern with bitmask use a bitmask as llapi_pattern, to simplify overstripe / zerooffset handing. Fix usage a LOV_PATTERN_PARITY on the userspace (llapi) code. Signed-off-by: Alexey Lyashkov <alexey.lyashkov@hpe.com> Change-Id: I29a6943af1f58ed3834076d3bb3d618dd6b83983
LU-20184 nrs: extend TBF rate to support bandwidth (BPS) mode
The NRS TBF scheduler enforces a rate in IOPS alone. On an OSS with
variable I/O sizes, IOPS is a poor proxy for the resource of a
class. 100 writes of 4 KiB cost much less than 100 writes of 4 MiB.
Extend TBF with a bandwidth mode (BPS). A rule can name its rate in
bytes per second. The enforcement reads the I/O size of each read
request and write request. The default unit is MiB/s:
nrs_tbf_rule="start r1 projid={100} bps=5MB/s"
nrs_tbf_rule="start r1 projid={100} bps=5"
nrs_tbf_rule="start r1 projid={100} rate=5MiB/s"
The "iops=" key sets an IOPS rate. A rule can limit both dimensions:
nrs_tbf_rule="start r1 projid={100} iops=1000 bps=5MB/s"
The rule dump appends a "bps=" field for a BPS rule. The prefix of
the line does not change, so a reader of an IOPS rule keeps its
behavior.
A start command that pairs "realtime=" with "bps=" returns
-EOPNOTSUPP. A change command with "rate=" on a BPS rule replaces
the byte rate with an IOPS rate. A rate of zero, or a rate at or
above LPROCFS_NRS_RATE_MAX, now returns -ERANGE instead of -EINVAL.
Add sanityn/test_77u{a,b,c,d}.
e.g. the rules below limit the read BPS to 5 MiB/s and write BPS to
15 MiB/s.
nrs_tbf_rule="start nidrd nid={0@lo}&opcode={ost_read} bps=5"
nrs_tbf_rule="start nidwr nid={0@lo}&opcode={ost_write} bps=15"
With I/O size varying from 4KiB to 1MiB, the performance is shown as
follows (The unit is MB/s):
blksz 4KiB 64KiB 128KiB 256KiB 1MiB
write 5.7 14.6 14.8 15.3 15.7
read 4.6 5.0 5.1 5.2 5.3
Test-Parameters: trivial testlist=sanityn env=ONLY=77
Signed-off-by: Yingjin Qian <qian@ddn.com>
Assisted-by: ClaudeCode:Opus-5
Change-Id: I359e23faedd2a09d3249c1a36038396d9780293a
LU-20742 scripts: don't read stdin when given input files
lnet_legacy2yaml falls through to sys.stdin.read() whenever no inline
positional argument is present, even when -i/-r/-n/-m supplied the
input. The comment above the check states the intended condition
("no inline and no files") but the code only tests args.inline.
Interactively this is harmless: isatty() is true and the read is
skipped. Under a test harness stdin is an inherited pipe whose write
end is never closed, so the read never sees EOF and the script hangs
forever. sanity-lnet test_606 blocked in pipe_read() for over four
hours; nine further tests in that suite (615, 616, 617, 618, 619, 620,
621, 622, 626) pass file flags without a positional argument and wedge
the same way, so the suite never completes.
Gate the stdin read on the absence of file sources. All four file
options are declared action='append', so each is None when unused.
The file sources are consumed before this block and accumulate into
the same lists, so gating only the stdin read cannot lose
file-supplied data.
Correct the man page and the script's usage block to match. Both
described input as "any combination" of inline argument, file options
and stdin, which no longer holds once stdin is a fallback:
lnet_legacy2yaml -i ip.rules < extra.conf
now ignores extra.conf instead of appending it. A hang is strictly
worse than an ignored redirect, and a pipe with data pending is not
reliably distinguishable from a pipe nobody will ever write to, but
the documented contract should say which one wins.
TLC-bug-id: TLU-260
Test-Parameters: trivial
Fixes: f82fd8a83dfe ("LU-19502 scripts: add lnet_legacy2yaml conversion utility")
Signed-off-by: Minh Diep <mdiep@thelustrecollective.com>
Change-Id: I0799be811a6b1da1565706efc765ca6654362301
Signed-off-by: Minh Diep <mdiep@thelustrecollective.com>
(style) A few hunks aren't accounted for by the description. Could the body also cover: - the new `lfd_sa_started` bit and the ll_ioctl_ahead()/ll_deauthorize_statahead_advise() race it closes (the text only names start_statahead_thread() and ll_deauthorize_statahead()) - moving kthread_create_on_node() above the pattern/ctx setup in both start_statahead_thread() and ll_ioctl_ahead(), and the new out_stop/out_free/out_put labels - pulling `lli_sa_enabled = 1` inside lli_sa_lock in ll_statahead_enter() - the change in how long the thread lingers after the scan finishes (see the comment on the wait loop in ll_statahead_thread()) As it stands a reader can't tell which of these are intentional.
(defect) This is described as fixing race conditions, so it should carry a Fixes: trailer. The sai_task/smp_store_release() protocol being replaced here came in with:
Fixes: b977caa2dc7d ("LU-15660 statahead: statahead thread doesn't stop")
Worth confirming that is the right target before adding it.
(typo) "This cleanups the way" reads oddly - "This cleans up ...". Same paragraph: "It avoids to handle" -> "It avoids handling". Further down, "races in stataheads threads" should be "statahead threads", and `sa_get` should be `sa_get()` per the commit-comment convention for function references.
(minor) A few hunks aren't accounted for by the message, and it's not obvious which are deliberate: - sa_pattern_list_detect() gains an `if (*first < 0) return false;` check. is_first_dirent() can return -errno, so this is an independent bug fix worth naming (or splitting out). - sa_pattern_fname_detect() gains an early `dname->len >= sizeof_field(...)` bail. - The `lfd_sa_started` bit and the ll_statahead_started()/__debug_agl_hint() split. - start_statahead_thread() drops the "once we start statahead thread failed, disable statahead" block at the out: label (see the inline comment there). - The "LIST => FNAME no wakeup" CERROR in ll_statahead_thread() is removed.
(style) This isn't a bug, but the body starts straight in on the implementation and never says what goes wrong today. The ticket describes orphan statahead threads that keep the dentry/inode pinned and hang umount, and none of that appears here. Could the first paragraph state the symptom and the race that produces it, before the list of new helpers? As written the message reads as a changelog of the refactor rather than a description of the bug being fixed, which makes it hard to judge later whether a given branch needs the backport.
@green@whamcloud.com has also been working on fixing this code under LU-18838 and LU-20359. Do you have a reliable reproducer for statahead issues that you could test against his patches?
@adilger@thelustrecollective.com I don't have a specific reproducer for master, I can try to mess up lli_sa_enabled or play with SHARED but these is more complex
(minor) lfd_sa_started is written under lli_sa_lock, but it shares an unsigned int with lfd_hsm_agent_registered, which ll_ioctl_hsm_ct_start() sets with no lock held:
lustre/llite/dir.c: lfd->lfd_hsm_agent_registered = !(lk->lk_flags & LK_FLG_STOP);
Both are dir-fd ioctls on the same lfd, so a compiler-generated read-modify-write of that word from the HSM path can drop the lfd_sa_started store. That is the store the new -EALREADY guard in ll_ioctl_ahead() depends on to stop a second LU_LADVISE_AHEAD from overwriting lfd->fd_sai and leaking the first sai reference.
Giving the flag its own storage (or bringing the HSM write under the same lock) would make the lock actually protect it.
(suggestion) The "one sax reference per sai" rule this relies on is not recorded anywhere in struct ll_statahead_info - it is inferred from lli->lli_sax at put time. That makes the contract easy to break: a sai put before its ctx is published silently drops nothing, and one put after lli_sax has been replaced would drop a stranger's reference. It also means the error paths in start_statahead_thread()/ll_ioctl_ahead() must use ll_sai_free() rather than ll_sai_put(), which is only enforced by convention. Storing the ctx in the sai (sai_ctx) and putting that instead would make the ownership explicit and let ll_sai_put() work regardless of what lli_sax currently points at.
This now clears lli_opendir_key for every pattern; before it was only cleared for ADVISE/FNAME. For a LIST statahead that ends before closedir() this desynchronizes the key from the still-open handle, and the new `lli_opendir_key != key` guard in ll_deauthorize_statahead() then makes close() a no-op.
Concretely, with `ls -l` on an open dir:
ll_statahead_by_list() -> sa_low_hit() -> rc = -EFAULT
ll_statahead_thread() -> ll_sai_put() -> ll_sax_put()
sax_refcount 1 -> 0, lli_sax = NULL, lli_opendir_key = NULL,
lli_stat_pid = 0, lli_sa_pattern = NONE
(LIST is not in the ADVISE|FNAME test above, so lli_sa_enabled stays 1)
The dir is still open, lli_sa_enabled is still 1 and lli_sax is NULL, so the next stat() goes through sa_pattern_fname_detect() and starts a second (FNAME) thread. At close(), ll_file_release() sees neither `lli_opendir_key == lfd` nor `lfd->fd_sai`, so ll_deauthorize_statahead() is not called at all, and nothing ever sets SA_THR_STOPPING for that thread.
It then only exits when its window fills and ll_sa_thread_wait_event() times out (ll_sa_timeout, 30s), holding dget(sai_dentry) and the ctx's igrab(dir) and keeping ll_sa_running non-zero the whole time - which is what ll_put_super() waits on. Pre-patch, ll_sax_put() kept lli_opendir_key for LIST, so close() reached ll_deauthorize_statahead(), cleared lli_sa_enabled, and every scan loop dropped out on its next iteration.
Would keeping the old conditional here (or letting ll_deauthorize_statahead() fall through to ll_sa_reset_locked() when lli_opendir_key is already NULL) restore the pairing?
This isn't a bug, but the name reads as the counterpart of ll_sax_get(dir) while it silently only returns the sai owned by `current`. Callers like ll_revalidate_statahead() and __debug_agl_hint() depend on that filter, so something like ll_sai_get_current() (or a pid argument) would make the contract visible at the call site.
This isn't a bug, but the lock no longer buys anything here: ctx is only used as a boolean after the unlock, so the value can change the moment the lock is dropped, and the pointer itself is left stale. debug_agl_hint() does its own lookup under the lock anyway, so a plain read would say the same thing more honestly.
(style) This isn't a bug, but `func` and `line` are never used in the body - either drop them from the prototype and the debug_agl_hint() macro, or print them in the CDEBUG.
LU-20443 llite: fix statahead race conditions
Replace smp barrier-based synchronization on sai_task and unsafe
access to lli_sa_enabled with an atomic state machine (sai_task_state
with SA_THR_STOPPED/RUNNING/STOPPING states).
Introduce centralized thread state management helpers:
- ll_sa_thread_should_stop(): check if thread should stop
- ll_sa_thread_stop(): transition thread to STOPPING state
- ll_sa_thread_stopall_locked(): stop all threads for a directory
- ll_sa_thread_wait_stop(): wait for thread to reach STOPPING state
- ll_sa_thread_wait_consumer(): wait for stat process to consume
entries
Clean up reference counting:
- ll_sai_put() now automatically releases sax reference
- Remove lli_sai field, using lli_sax->sax_sai_list for all cases
- Add ll_sai_get() to obtain a ref on the sai of the current process
- Add ll_sax_install() for atomic context installation
Fix race conditions:
- Between start_statahead_thread() and ll_deauthorize_statahead()
- Add lfd_sa_started flag to prevent duplicate statahead hints
- Stale state prevention via ll_sa_reset_locked()
- Use-after-free in revalidate_statahead_dentry() when sa_get()
returns -EINVAL
The @sai struct is revalidated via sa_revalidate_sai() before thread
start to ensure the parent directory hasn't been closed or reopened by
another thread.
Fixes: b977caa2dc7d ("LU-15660 statahead: statahead thread doesn't stop")
Test-Parameters: optional testlist=racer
Test-Parameters: optional testlist=racer
Test-Parameters: testlist=sanity env=ONLY=123
Signed-off-by: Etienne AUJAMES <eaujames@ddn.com>
Change-Id: I3e4ffc991795029057326982513b7a270f1238ad
LU-20688 scripts: Make llmountcleanup.sh also remove ec.ko
After llmountcleanup.sh is called all loaded and
'dependent' modules should be removed. However,
ec.ko since it not dependent was not touched and
left un-removed. This patch makes llmountcleanup.sh
removes ec.ko also. Note that ec.ko is a recent
feature in Lustre. If modified lustre_rmmod is
called on older version which do not have ec.ko this
operation turns no-op and is harmless.
Also, note, that llmountcleanup.sh is not touched by
this patch - the change is in lustre/scripts/lustre_rmmod,
which llmountcleanup.sh reaches indirectly via
cleanupall -> unload_modules -> unload_modules_local.
Testing steps:
--------------
$ llmount.sh
...
$ llmountcleanup.sh
Verification Before patch:
--------------------------
$ lsmod | grep -wE "libcfs|ec|lustre|ldiskfs"
ec 81920 0
Verification After patch:
-------------------------
$ lsmod | grep -wcE "libcfs|ec|lustre|ldiskfs"
0
Test-Parameters: trivial
Fixes: 047347170b8a ("LU-12189 ec: code to add support for M to N parity")
Signed-off-by: Arshad Hussain <arshad.hussain@aeoncomputing.com>
Change-Id: Ia9eeeb90204b342f0b53415dbec497f2de8d68cf
| unique failing test | history |
|---|---|
| sanity-scrub@ldiskfs+DNE:test_23 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-scrub@ldiskfs+DNE:test_24 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-scrub@ldiskfs+DNE:test_25 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity-scrub@ldiskfs+DNE:test_26 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
(style) In 'LU-20591 target: iterate objects on OST and MDT' the Change-Id: comes before the Signed-off-by:, which usually means the Lustre commit-msg hook is not installed. The other two commits in the series have the conventional order. The series is also authored under two different addresses, jinshan.xiong@gmail.com on the first and third commits and jinshanx@google.com on the second, while every Signed-off-by is the google.com one.
(typo) Four timestamps, not three: the item carries lsii_atime, lsii_btime, lsii_ctime and lsii_mtime, and the struct listing further down shows all four.
(minor) LU_SCRUB_ITER_RES_EOF is undocumented here, even though it is the only way a caller can tell a walk that reached the end of the device from one that stopped early or was turned away with -EBUSY. Worth listing alongside LU_SCRUB_ITER_RES_SKIPPED.
(minor) For a man page added in the same patch as the function, this should carry the most recent parent tag (2.17.57) rather than a git describe of an unlanded commit. The exact hash can be filled in once it lands.
(minor) This adds ~175 lines describing one sub-command inside lctl.8. The convention for lctl sub-commands is a page of its own, lctl-iterate-objects.8, cross-referenced from here, so that 'man lctl-iterate-objects' works and lctl.8 stays an index.
(style) This isn't a bug, but there is already fid_seq_is_mdt0() for this comparison, and fid_seq_is_mdt() folds it together with the fid_seq_is_norm() line below.
error: ofd_scrub_iter_rec():'fo' dereferencing possible ERR_PTR()
(defect) Turning osd_scrub_start() away with -EBUSY changes what a client sees when an OI inconsistency is hit during a walk.
osd_fid_lookup() does:
rc1 = osd_scrub_start(env, dev, flags);
if (rc1 && rc1 != -EALREADY)
GOTO(out, result = -EREMCHG);
so an RPC that would previously have triggered the scrub and returned the retryable -EINPROGRESS now fails hard with -EREMCHG. The osd-zfs side has the same shape in osd_index.c, where rc is overwritten by the osd_scrub_start() return and -EBUSY becomes the lookup result.
The iterator only lives for one ioctl, but a full 'lctl iterate_objects' run holds it back to back for most of the walk, so the window is not small in practice. Should the -EBUSY be confined to an explicitly requested scrub start and the RPC-triggered path fall back to -EINPROGRESS?
(defect) Is this assertion still guaranteed on the DOIF_NOSCRUB path? Before this patch osd_otable_it_init() always went through scrub_start(), and scrub_thread_prep() clears os_partial_scan before it sets os_running, so load() could rely on it being 0. With noscrub, scrub_start() is skipped entirely and nothing clears the flag. os_partial_scan is only reset in scrub_thread_prep() and osd_scrub_join(); scrub_thread_post() leaves it set, and the partial-scan loop in osd_inode_iteration() exits with it still 1 on SCRUB_NEXT_EXIT, SCRUB_NEXT_CRASH and SCRUB_NEXT_FATAL. A partial scan that ended that way leaves os_partial_scan == 1 with os_running == 0 for the life of the mount, which is exactly the state the noscrub iterator is allowed to start in, and it LBUGs here.
(minor) The noscrub arm of this looks dead: osd_otable_it_load() sets ooi_pos = hash + 1 unconditionally, and scrub_iterate_objects() always calls load(). Was the intent to cover a caller that skips load()?
(style) New subtests normally take a large round number with gaps (test_100, test_200) so that patches landing in parallel do not collide on the same numbers. 23 through 30 immediately after test_22 is likely to conflict. Also, test_23 creates 2048 files and test_28 creates 2560, and neither removes them; test_24, test_29 and test_30 already rm -rf $tdir, so the same stack_trap here would keep the filesystem from growing across the suite.
(defect) None of test_23 through test_31 gate on the server version, so an interop run against a server without OBD_IOC_SCRUB_ITER fails here instead of skipping. Something like
(( $OST1_VERSION >= $(version_code 2.17.58) )) ||
skip "need OST >= 2.17.58 for lctl iterate_objects"
at the top of each test body, with the MDT variant where the test drives mds1.
LU-20591 target: iterate objects on OST and MDT Add the OBD_IOC_SCRUB_ITER ioctl so that user space can enumerate the objects that a target holds. Both OFD and MDT implement it on top of the OSD object table iterator, which already knows how to walk a device and to resume from a cookie. That iterator was so far only used by OI scrub and LFSCK, and starting it also started the scrub thread. Add a DOIF_NOSCRUB flag that skips that: this is a read only walk and it must not repair anything. An iterator that did not start the scrub must not stop it either, so osd_otable_it_fini() now leaves the scrub alone in that case, where it would otherwise silently abort a scrub that was already running. A NOSCRUB iteration and an OI scrub further refuse to run at the same time and return -EBUSY, because the two would throttle each other through the preload window. A single call examines at most SCRUB_ITER_MAX_SCAN entries. Without such a budget a device holding only a handful of user objects would be walked from end to end inside one ioctl, keeping the iterator, and therefore OI scrub and LFSCK, busy for an unbounded time. A call can consequently come back with no object at all before the device has been fully walked, so the end of the walk is reported explicitly with LU_SCRUB_ITER_RES_EOF rather than inferred from an empty batch. The iterator is built and torn down inside each call, which is what lets a scrub start between two batches instead of waiting out a whole walk. The walk resumes from the cookie it was left at, so llapi_obj_iterate() hands that cookie back to its caller: a walk that was stopped, interrupted or turned away with -EBUSY can carry on from where it stopped rather than from the beginning of the device. The cookie only moves once a batch has been handed to the callback, so resuming repeats at most one batch and never skips an object. Recreating the iterator costs about 15us per call, and the preload window it fills is 64 entries, so a batch below that reads entries it then throws away. Measured over 20033 objects on one OST, a walk takes 0.03s at a batch of 64 or more and 0.34s at a batch of 1. An object that cannot be read is left out of the result, which a caller cannot tell from an object that was never there, so such a walk comes back marked with LU_SCRUB_ITER_RES_SKIPPED. Per object metadata is optional and is selected with the LU_SCRUB_ITER_REQ_* flags, so a caller that only wants FIDs does not pay for reading anything else, and what the target managed to collect comes back in LU_SCRUB_ITER_FL_*. There is one flag per extra read rather than one per field, because the size, the blocks, the four timestamps and the ownership of an object all come out of a single read of it, while its parent FID costs a read of its extended attributes. A flag the target does not know is refused rather than ignored, since metadata that comes back quietly missing cannot be told from metadata the object does not have. The parent FID of an MDT object lives in its linkEA, which is far too expensive to read for every object of a device, so LU_SCRUB_ITER_REQ_PARENT is rejected with -EOPNOTSUPP there. An item keeps room in reserve for the attributes a later version may report, and the caller says how large an item it expects: the size of an item is how both sides divide up the buffer, so two sides that disagree about it would read the result as something else entirely. Only the objects that user space can see are reported: the OST leaves out its local metadata files such as LAST_ID, the quota files and the llogs, and the MDT reports the regular files that have a normal FID only. An IGIF FID is not enough there: the OSD builds one out of the inode number and generation for the local files it has no FID of its own for, CONFIGS/mountdata for one, and nothing tells such a FID apart from the FID of a file inherited from a 1.8 filesystem. The walk itself is shared between the two targets in scrub_iterate_objects(), with a per target callback that filters an entry and fills in its metadata. Add llapi_obj_iterate() and 'lctl iterate_objects' on top of the ioctl, and document both under Documentation/. How many objects a single call fetches is left to the caller of the library function, which is what test_28 varies; test_23 to test_27 in sanity-scrub.sh cover the rest, test_29 that a walk can be resumed where it stopped and test_30 that one survives the objects under it being unlinked. Test-Parameters: testlist=sanity-scrub Change-Id: I47dceaf73031221c662c5cdd2b21d1bd667c87eb Signed-off-by: Jinshan Xiong <jinshanx@google.com>
LU-20628 lnet: do not assert on an odd selftest bulk size
brw_fill_page() asserted the length was a multiple of __u64 above
the early return for the patterns that write nothing, so any brw
test with a size= that is not a multiple of 8 LBUGged the test
node before a request went out, the default check=none included.
Assert only where the pattern is written, and reject an odd size
for the checked patterns in brw_client_init() and, since brw_len
also arrives over the wire, in brw_server_handle().
lst now refuses check=full and check=simple with an odd size= that
it used to pass down to the kernel, and the two dead end == NULL
guards that sat in front of that test are gone. lnet-selftest.sh
runs three more brw cases with an odd size=.
Test-Parameters: trivial testlist=lnet-selftest
Fixes: efcef00cb304 ("LU-5718 lnet: add offset for selftest brw")
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools
Change-Id: I76128c3d9e3bfce8fcde25bc1403c8b66160c9c0
(minor) This makes a refused BRW request reach srpc_server_rpc_done() with srpc_bulk still set, and brw_server_handle() has already installed brw_server_rpc_done() before its early returns. Since srpc_status is 0 on this path, the callback takes the success branch:
CDEBUG(D_NET, "Transferred %d pages bulk data %s %s\n",
blk->bk_niov, blk->bk_sink ? "from" : "to", ...);
srpc_init_bulk() was never called for this request, so bk_niov/bk_sink still hold whatever the previous RPC on this recycled srpc_server_rpc left there, and the log claims a transfer that never happened. Debug-only, but it is misleading in exactly the interop case this patch is about. Worth having brw_server_rpc_done() bail out when the reply status is non zero?
LU-20342 lnet: no selftest bulk after a refused request
Since the BRW service began preallocating its bulk descriptor, a
handler that refused a request left rpc->srpc_bulk set, so
srpc_handle_rpc() asserted, and would otherwise have run a bulk
transfer for a request it had just refused. Send the reply
straight away instead; the client already unlinks its own bulk
when the reply status is non zero. The version mismatch branch
above had the same problem with no assertion to catch it.
A brw check=discard test against a server too old to know that
flag panics that server today.
Test-Parameters: trivial testlist=lnet-selftest
Fixes: e502638050a6 ("LU-16011 lnet: use preallocate bulk for server")
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools
Change-Id: Id57db19ea45d2899d641a815cc85700a22c8f91d
(defect) `len` still isn't required to be a multiple of BRW_MSIZE here, while `off` is checked just above. brw_fill_page() asserts on both, and that LASSERT sits before the pattern early-return, so it fires for every check= mode:
LASSERT(off % BRW_MSIZE == 0 && len % BRW_MSIZE == 0);
lst_get_bulk_param() only rejects `size=` <= 0 or > LNET_MTU, and lstcon_bulkrpc_v1_prep() copies blk_size straight into blk_len, so `lst add_test ... brw read size=100` reaches brw_client_prep_rpc()->brw_fill_bulk()->brw_fill_page() with len=100 and LBUGs the client node. The same brw_len goes on the wire, so brw_server_handle()->brw_fill_bulk() LBUGs the responder node too.
LU-20628 is filed as "crashes the test node for unvalidated size= and off= parameters" - is the size= half meant to be a separate patch, or should `len % BRW_MSIZE != 0` be rejected in this same block?
(suggestion) check=full is the right choice here, but it may be worth noting why the other checked modes aren't covered. With a non-zero off the client descriptor is fragmented as (page0, off, PAGE_SIZE-off), (page1, 0, ...), while brw_server_handle() always does srpc_init_bulk(bulk, 0, brw_len), so the responder fragments from zero. brw_fill_page()/brw_check_page() write and verify the magic at each *fragment's* first and last __u64, so for LST_BRW_CHECK_SIMPLE the two sides disagree about where those words are and a read reports "Bulk data is corrupted" for a perfectly good transfer. Not introduced here - it dates back to the original off= support - but it was masked by the crash this patch fixes, so `lst add_test ... brw read check=simple off=8` becomes a spurious failure rather than an LBUG. Worth a follow-up ticket?
LU-20628 lnet: size selftest bulk to cover the offset
srpc_alloc_bulk() sized the page vector from the length alone, so a
brw test whose off= pushed the data across one more page walked past
the end of the allocation in srpc_init_bulk(), and a zero length
asserted. The offset is again an argument, and brw_client_init()
rejects an out of range page count rather than leaving it to an
assertion.
brw_client_prep_rpc() derived a second page count from an unmasked
blk_offset, which disagreed with the descriptor for any off= of a
page or more; take it from bk_niov instead.
lnet-selftest.sh had never passed off=, so the smoke batch now runs
two checked cases with an offset.
Test-Parameters: trivial testlist=lnet-selftest
Fixes: e502638050a6 ("LU-16011 lnet: use preallocate bulk for server")
Fixes: efcef00cb304 ("LU-5718 lnet: add offset for selftest brw")
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools
Change-Id: I440a0774c990b2b71861118b31be47aae857af8f
(suggestion) this isn't a bug, but LU-20559 is filed against the obd2obt() obt_magic assertion when destroying exports of a failed mount, and this paragraph says the change needs neither that crash nor the rest of the series. It also has its own Fixes: commit and an unrelated failure mode. Would a separate ticket be a better home, so the backport scope of the two doesn't get conflated?
LU-20559 target: keep client bitmap updates out of assertions
tgt_client_add() and tgt_client_free() update lut_client_bitmap from
inside the condition of a LASSERTF(). With --disable-libcfs-assert
LASSERTF() expands to ((void)sizeof!!(cond)), so neither the set nor
the clear is evaluated at all and the bitmap stops tracking anything.
The clear side leaks: the slot stays set for the life of the target
while tgt_client_new() hands out a fresh index for each new client.
The set side corrupts. tgt_clients_data_init() calls tgt_client_add()
once per occupied last_rcvd slot at mount, so with the set gone every
recovered client's bit stays clear. tgt_client_new() then takes
find_first_zero_bit() == 0 and gives that index to a new client while
a recovering export still owns it: both get the same ted_lr_idx and
ted_lr_off and write over each other's lsd_client_data.
Do the bitmap operation first and assert on its result. The clear
side also tests lut_client_bitmap rather than asserting on it, because
the dereference below it would otherwise happen in exactly the builds
where the assertion is gone, on a pointer this series shows can be
NULL.
This is independent of the rest of the series and of the crash it
fixes - it needs neither, and neither needs it.
Fixes: a32c87805ffb ("LU-18155 misc: use LASSERT/F instead of if () LBUG()")
Signed-off-by: Oleg Drokin <green@whamcloud.com>
Assisted-by: ClaudeCode:Opus-5 llm_code_and_review_tools
Change-Id: Ie8b233b19cd385cab92058acaafbc603bf35165e
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-part-1 | RHEL 10.1 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-part-3 | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-part-4 | RHEL 9.7 / x86_64 | ran 9 tests. 1 tests failed: sanity-dom. | session |
| review-dne-part-4 | RHEL 10.1 / x86_64 | ran 9 tests. 1 tests failed: sanity-dom. | session |
| review-dne-part-5 | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-1 | RHEL 10.1 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| 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. 2 tests failed: sanity-sec, sanity-lfsck. | session |
| review-dne-zfs-part-3 | RHEL 9.7 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-3 | RHEL 10.1 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. | session |
| review-dne-zfs-part-4 | RHEL 9.7 / x86_64 | ran 9 tests. 1 tests failed: sanity-dom. | session |
| review-dne-zfs-part-4 | RHEL 10.1 / x86_64 | ran 9 tests. 1 tests failed: sanity-dom. | session |
| review-dne-zfs-part-5 | RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
| review-ldiskfs | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, RHEL 9.7 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-arm | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 6 tests. 1 tests failed: sanity. | session |
| review-ldiskfs-ubuntu | RHEL 8.10 / x86_64, Ubuntu 24.04 / x86_64 | ran 6 tests. 1 tests failed: sanity. | session |
To be honest, I wouldn't call `ll_dcompare()` "very similar" to `d_same_name()`. Yes, they both start the same (compare name length and name string), but there several other checks in there that play a significant role with handling races between clients modifying the file in parallel.
Along with the in-tree "racer" code that is throwing garbage at the VFS, the "simul" test (https://github.com/llnl/simul) is stress-testing concurrent operations on the same directory and could be used to test this change.
Unfortunately, "racer" is flakey right now and not passing consistently, but it might still be worthwhile to run before/after tests to see if the _nature_ of the failures change (e.g. crash vs. hang). Of course, fixing "racer" would also be good.
The "simul" test _should_ always be passing, but I see it is being skipped for a large number of sessions. I filed LU-20259 about that, but in the meantime you should be able to run a session with something like:
Test-Parameters: testlist=parallel-scale env=ONLY=simul,simul_REP=100,simul_THREADS=8 clientdistro=ubuntu2404
I ported simul to our tree: https://review.whamcloud.com/c/fs/lustre-release/+/65894. I can take a look at the racer issues as well.
This was raised on patchset 1 and the text is unchanged, so repeating it with a bit more detail: the part of ll_dcompare() that has no counterpart in d_same_name() is exactly the part this patch has to re-implement - the d_lustre_invalid()/d_mountpoint()/d_in_lookup() handling. And it is not re-implemented equivalently: a name that failed d_compare() left the stale dentry alone and let ll_splice_alias()->ll_find_alias() reuse it, while a 0 from d_revalidate() makes the VFS d_invalidate() it first. Could the body describe that change of failure mode rather than calling it a move of "the special revalidation logic"?
The Test-Parameters line suggested on patchset 1 for the concurrent-access stress coverage still isn't here:
Test-Parameters: testlist=parallel-scale env=ONLY=simul,simul_REP=100,simul_THREADS=8 clientdistro=ubuntu2404
This was raised on patchset 1 and the wording is unchanged, so passing on some evidence for it.
ll_dcompare() was not only reachable from ->d_revalidate() paths. d_same_name() consults parent->d_op->d_compare(), so every d_lookup() went through it - including the ones llite makes itself, which never call ->d_revalidate():
ll_migrate() file.c:5897
LL_IOC_PCC_STATE dir.c:2857
sa_statahead() statahead.c:1059
So "very similar to the default" understates it: the invalid-dentry filtering was a property of d_lookup() for the whole module, and the replacement only covers the VFS revalidate path. Could the body describe which behaviour is preserved and which is dropped?
Interesting. Neil some time back tried this but never got it to work.
Do you have a reference to his previous work I can look at?
https://review.whamcloud.com/24175. It was revert right after landing. Broke conf-sanity 32.
Strangely, I had written a comment referencing this patch as well after I was spelunking in this code (`git log --patch lustre/llite/namei.c | grep -A30 -E "^commit|ll_dcompare"`), but I seem to have lost it when I saved my comments. Definitely this is a tricky area of code.
My suggestion in that other lengthy comment was to set `sb->s_encoding`, as this will bypass the `DCACHE_OP_COMPARE` check in `ovl_weird_dentry()`. It doesn't look hard to set a legitimate UTF-8 encoding value:
```
#if IS_ENABLED(CONFIG_UNICODE)
sb->s_encoding = utf8_load(UNICODE_AGE(12, 1, 0));
#endif
```
AFAICS setting `s_encoding` doesn't seem to have any other effect in the VFS if the case-insensitive `generic_ci_dentry_ops` are not installed on the file and `S_CASEFOLD` is not set on the directory. Consider this "preparing for case-insensitivity".
While this may (or may not) be a long-term solution, it is relatively harmless and should allow the later overlayfs patches to make progress while this one (likely) will take longer to get right.
The later patches (RENAME_*) don't have any dependency on this patch. So they could land independently of this one. s_encoding is an interesting idea. But I'd prefer to work on improving the testing until were comfortable removing d_compare. Neil's previous patch seemed to mostly pass testing, so that gives me some hope that the work required isn't huge.
The comment says the check can "only definitively reject here when there is no inode", and that returning 0 for a positive invalid dentry is what breaks the overlayfs case - but the condition below has no d_inode test, so it fires for positive dentries too. ovl_revalidate_real() will turn that 0 into -ESTALE exactly as described. Was the `!dentry->d_inode` term meant to stay in the condition, or is the comment left over from an earlier version? Worth noting the two readings are not equivalent for non-overlayfs use either: with the inode test, a positive dentry whose LOOKUP lock was revoked reports valid, so a name renamed/replaced on another client keeps resolving to the old inode until the operation itself fails.
Returning 0 here makes the VFS call d_invalidate() on the dentry (lookup_fast(), lookup_dcache(), __lookup_slow() all do `if (!status) d_invalidate(dentry)`). For a positive dentry, d_invalidate() unhashes it, calls shrink_dcache_parent(), then loops on d_walk(..., find_submount) calling detach_mounts() on every mounted descendant.
d_lustre_invalidate() is not a "this name is gone" signal - ll_lock_cancel_bits() calls ll_prune_aliases() on any MDS_INODELOCK_LOOKUP|PERM cancellation, including a plain LRU cancel. So:
mount --bind /tmp /mnt/lustre/dir/sub
lctl set_param ldlm.namespaces.*mdc*.lru_size=clear
ls /mnt/lustre/dir
looks like it would silently unmount the bind mount. The `!d_mountpoint(dentry)` term only covers the dentry itself, not mounts below it. Under ll_dcompare() none of this happened: the invalid dentry was simply skipped and ll_find_alias() re-used the same object, with its children and mounts intact.
The same path also drops the whole cached subtree on each such lookup, and unhashing conflicts with the deliberate choice in ll_getattr_dentry() not to d_drop() an invalidated dentry so that getcwd() keeps working.
Is `!d_in_lookup(dentry)` reachable? That term was needed in ll_dcompare() because d_alloc_parallel() compares against the in-lookup hash via d_same_name(), but ->d_revalidate() is never called on an in-lookup dentry: __lookup_slow() and lookup_open() both test d_in_lookup() before calling it, and __d_lookup{,_rcu}() cannot return one since __d_add()/__d_splice_alias() clear DCACHE_PAR_LOOKUP before rehashing.
Not a bug, but as written it reads as though the parallel-lookup exclusion is still being enforced here.
Is the d_mountpoint() term reachable? DCACHE_MOUNTED is only set by d_set_mounted() on a mounted-on dentry, which is always positive, so `!dentry->d_inode` already implies `!d_mountpoint(dentry)`. Not a bug, but it reads as though the mountpoint case from ll_dcompare() is still being honoured here when it can never be evaluated.
error: ll_revalidate_dentry():we previously assumed 'dentry->d_inode' could be null (see line 240)
Dropping .d_compare also changes what plain d_lookup() returns, and llite has three internal callers that use the result directly without ->d_revalidate().
ll_migrate() (file.c:5897) is the concrete one:
dchild = d_lookup(file_dentry(file), &qstr);
if (dchild) {
if (dchild->d_inode)
child_inode = igrab(dchild->d_inode);
dput(dchild);
}
if (!child_inode) {
rc = ll_get_fid_by_name(parent, name, namelen, NULL, &child_inode);
With ll_dcompare() an invalid dentry never matched, so this always fell through to ll_get_fid_by_name(), i.e. a server lookup by name. Now an invalid dentry matches and the fallback is skipped.
ll_prune_aliases() marks aliases invalid on any MDS_INODELOCK_LOOKUP cancel and only d_prune_aliases() the unused ones, so a referenced dentry (cwd, cached children, open file) stays hashed and invalid. If another client renamed the name over a new object in the meantime, child_inode is the old object while mdt_migrate_lookup() resolves rr_name on the server and migrates the new one. The client then sets op_fid3, inode_lock()s, ll_lease_open()/ll_data_version() flushes, and on success clear_nlink()s the wrong inode.
The other two are less severe but the same root cause: the LL_IOC_PCC_STATE handler (dir.c:2857) reports state for a stale inode instead of falling back to ll_get_fid_by_name(), and sa_statahead() (statahead.c:1059) takes sa_revalidate() (getattr by fid on the stale inode) where it used to take sa_lookup() (lookup by name).
The new ->d_revalidate() check cannot cover these - they never reach it. Should these sites gain an explicit d_lustre_invalid() test before using the dcache result?
LU-20253 llite: remove d_compare() for overlayfs support To support overlayfs, Lustre must not implement DCACHE_OP_COMPARE. Otherwise, ovl_dentry_weird() will block the overlayfs mount with an error like: 'filesystem on lower not supported'. Lustre's custom d_compare() is very similar to the default d_compare() operation implemented by the kernel. Hence, remove Lustre's reimplementation and move the special revalidation logic. Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: Iedd9b9ed837ae4b0db50770da30a80f140d427bb
| unique failing test | history |
|---|---|
| sanity1@ldiskfs+DNE:test_56od | seen in 1 other review |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne-arm | RHEL 8.10 / x86_64, Rocky 9.5 / aarch64 | ran 7 tests. 1 tests failed: sanity. | session |
Is this needed anymore now that 67351 landed?
Yes. This patch fixes a different type of issue.
LU-20422 obdclass: allow cfs_hash locks to specify subclass
This way, we can silence recursive locking warnings from lockdep.
WARNING: possible recursive locking detected
...
mdt00_001/383 is trying to acquire lock:
ffff88823c483018 (&new_bkts[i]->hsb_lock.rw){++++}-{3:3}, at: cfs_hash_del+0xd0/0x2d0
but task is already holding lock:
ffff88823c339e18 (&new_bkts[i]->hsb_lock.rw){++++}-{3:3}, at: cfs_hash_del+0x97/0x2d0
...
dump_stack_lvl+0x54/0x70
print_deadlock_bug+0x27c/0x290
__lock_acquire+0x11b4/0x2830
? __lock_acquire+0x5d3/0x2830
? cfs_hash_del+0xd0/0x2d0
lock_acquire+0xd5/0x290
? cfs_hash_del+0xd0/0x2d0
? cfs_hash_bd_from_key+0x2b/0xc0
_raw_write_lock+0x33/0x40
? cfs_hash_del+0xd0/0x2d0
cfs_hash_del+0xd0/0x2d0
ldlm_lock_destroy_internal+0x19e/0x2f0
ldlm_lock_destroy+0x83/0x110
ldlm_lock_enqueue+0x161/0x950
? _raw_write_unlock+0x2d/0x50
? cfs_hash_add+0x247/0x2b0
ldlm_handle_enqueue+0x9c0/0x1410
tgt_enqueue+0xbd/0x260
tgt_request_handle+0x1297/0x1990
? obd_export_timed_fini+0xa2/0xb0
ptlrpc_main+0x2b7d/0x3ac0
? lockdep_hardirqs_on+0x7a/0x110
? __pfx_ptlrpc_main+0x10/0x10
kthread+0x11b/0x140
? __pfx_kthread+0x10/0x10
ret_from_fork+0x1a5/0x370
? __pfx_kthread+0x10/0x10
ret_from_fork_asm+0x1a/0x30
Test-Parameters: trivial
Signed-off-by: Timothy Day <timday@thelustrecollective.com>
Change-Id: Ice4b6a9f1ec6782ff7544909d807362b2c03f83b
| unique failing test | history |
|---|---|
| conf-sanity3@ldiskfs+DNE:test_78 | seen in 1 other review |
| sanity-lfsck@ldiskfs+DNE:test_45 | seen in 1 other review |
| sanity-quota@ldiskfs+DNE:test_13 | seen in 1 other review |
| sanity-quota@ldiskfs+DNE:test_86 | seen in 15 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-dne-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-part-1 | RHEL 9.5 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-part-2 | RHEL 8.10 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
| review-dne-part-2 | RHEL 9.5 / x86_64 | ran 11 tests. 1 tests failed: sanity-lfsck. | session |
| review-dne-part-4 | RHEL 8.10 / x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
| review-dne-part-4 | RHEL 9.5 / x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
| review-dne-part-6 | RHEL 8.10 / x86_64 | ran 6 tests. 1 tests failed: replay-single. | session |
| review-dne-part-6 | RHEL 9.5 / x86_64 | ran 6 tests. 1 tests failed: replay-single. | session |
| review-dne-selinux-ssk-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-1 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| review-dne-zfs-part-4 | RHEL 8.10 / x86_64 | ran 9 tests. 1 tests failed: sanity-quota. | session |
| review-dne-zfs-part-5 | RHEL 8.10 / x86_64 | ran 5 tests. 1 tests failed: sanityn. | session |
| review-dne-zfs-part-6 | RHEL 8.10 / x86_64 | ran 6 tests. 1 tests failed: replay-single. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, RHEL 9.5 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
| review-ldiskfs | RHEL 8.10 / x86_64, SLES 15.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. 2 tests failed: sanity-sec, sanity. | session |
| review-zfs | RHEL 8.10 / x86_64 | ran 10 tests. 2 tests failed: replay-single, sanity-quota. | session |
Close. For upstream it should be ONFIG_LUSTRE_FS_DEBUG_PAGESTATE_TRACKING.
LU-19061 debug: restore --enable-pgstate-track Statistics on cl_page tracking of folios in system cache. This also fixes KASAN errors related to use after free and a crash when checking stats during umount. Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: Ic84c7839b4a8ee5c74bf0249cf4920b0bf491561
I would put this reference as a `Fixes:` line, which is more consistent with other patches, and the omission of osd-wbcfs from that patch could be considered a bug.
(style) Two hunks aren't accounted for by the description. osd_read()/osd_write() now set `inode->i_flags |= S_PRIVATE | S_NOSEC`, which permanently disables LSM/IMA on the object. That's a behaviour change worth a sentence, especially since the ldiskfs change did it in osd_iget2()/osd_mkfile()/osd_inode_setattr() rather than in the IO path. The `wbcfs_flush_descriptors_cnt` tunable also disappears; worth naming it so the removal is findable later. Also, this doesn't actually mirror LU-19388's structure: that one added `struct file oti_file` to osd_thread_info and a shared osd_get_filp_for_inode() helper, while this open-codes the file twice on the stack. If that divergence is deliberate (osd-wbcfs has no osd_thread_info), saying so would help.
(style) Raised on patchset 2 and still open: this reference reads better as a Fixes: line, since leaving osd-wbcfs out of the original change is arguably the bug being fixed.
Fixes: bdb39e8390c4 ("LU-19388 osd: remove calls to alloc_file_pseudo()")
(style) Removing osd_flush_fput() left a double blank line here.
(style) Double blank line left behind by the osd_alloc_file_pseudo() removal.
(suggestion) This puts roughly 400 bytes (struct file plus struct dentry) on the stack in a path that already runs deep under ptlrpc, and it's duplicated in osd_write(). LU-19388 avoided that by parking `struct file oti_file` in osd_thread_info and sharing osd_get_filp_for_inode(). osd-wbcfs has no osd_thread_info yet, but a small shared helper would at least keep the two copies from drifting.
(minor) This is an unlocked read-modify-write on `i_flags`. osd_attr_set() takes `obj->oo_guard` for writing around osd_inode_setattr(), which assigns the whole word:
inode->i_flags = ll_ext_to_inode_flags(attr->la_flags) | S_NOCMTIME;
A concurrent osd_read()/osd_write() can read the old word and store it back, dropping whatever flags that setattr just changed. Following the ldiskfs change and ORing S_PRIVATE into osd_inode_setattr() plus the inode-creation path would avoid both the race and re-doing this on every IO.
(defect) Can this oops? `dentry` is a zeroed stack object, so `d_sb` is NULL, and f_mode here has neither FMODE_NONOTIFY nor FMODE_PATH. On 6.10 through 6.16:
kernel_read() -> rw_verify_area(READ, ...)
-> fsnotify_file_area_perm(file, MAY_READ, ...) /* passes, MAY_READ */
-> fsnotify_file(file, FS_ACCESS_PERM)
and fsnotify_file() does
if (file->f_mode & (FMODE_NONOTIFY | FMODE_PATH))
return 0;
path = &file->f_path;
if (mask & ALL_FSNOTIFY_PERM_EVENTS &&
!fsnotify_sb_has_priority_watchers(path->dentry->d_sb, ...))
FS_ACCESS_PERM is in ALL_FSNOTIFY_PERM_EVENTS, so `path->dentry->d_sb` is read and fsnotify_sb_info() dereferences it. 6.12 is an in-tree build target (lustre/kernel_patches/targets/6.12-rhel10.0.target), and CONFIG_FANOTIFY_ACCESS_PERMISSIONS is on in the enterprise configs. The path is reached from llog_osd_read_header()/seq_store_read() -> dt_read() -> osd_read().
alloc_file_pseudo() used to hide this: d_alloc_pseudo() set d_sb from the mount and made the dentry its own parent, so IS_ROOT() held. Setting `dentry.d_sb = inode->i_sb;` and `dentry.d_parent = &dentry;` restores both. Adding FMODE_NONOTIFY, as osd_get_filp_for_inode() does in osd-ldiskfs, would short-circuit fsnotify entirely.
The write side at the bottom of the file has the same uninitialised dentry; MAY_WRITE returns early from fsnotify today, so only the read path trips it, but the two should probably be fixed together.
LU-18813 osd-wbcfs: remove calls to alloc_file_pseudo() Duplicate the work of "LU-19388 osd: remove calls to alloc_file_pseudo()" but for osd-wbcfs. fput() which we need to call after alloc_file_pseudo() doesn't release file struct right away and postponed jobs to release it may create a massive load to system interrupting regular Lustre processing. The reason for using alloc_file_pseudo() was due to the removal of kallsyms_lookup_name(). The function iterate_dir() will crash unless security_file_alloc() and security_file_free() are not called. Now that Lustre uses kprobes to export functions we can unwind the work of LU-13783. Test-Parameters: trivial Signed-off-by: Timothy Day <timday@thelustrecollective.com> Change-Id: I378babbd6ec42c0f5ba6f3b6f74ccabb458dde01
LU-13847 test: add sanity test_64f() to ALWAYS_EXCEPT sanity test_64f() fails some non zero percent of the time and no one is working on it so add it to ALWAYS_EXCEPT. Test-Parameters: trivial testlist=sanity Signed-off-by: John L. Hammond <jhammond@whamcloud.com> Change-Id: Iafc080502fe4c9f2b7be8a95f268953296d8a1e3
| unique failing test | history |
|---|---|
| conf-sanity2@ldiskfs+DNE:test_73e | NEW unique failure for this branch in the last 30 days, and was seen 2 times across 1 other branches 1 reviews |
| conf-sanity2@zfs:test_73e | NEW unique failure for this branch in the last 30 days, and was seen 2 times across 1 other branches 1 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: conf-sanity. This build will be scored -1 since fortestonly was specified. | session |
LU-19692 test: track portal leak attempt to reproduce Test-Parameters: fortestonly testlist=conf-sanity env=ONLY=73,ONLY_REPEAT=10 Signed-off-by: Mikhail Pershin <mpershin@whamcloud.com> Change-Id: Ie1b9f16b5049483879437a5ab7a42caefbf1ea25
This file doesn't exist. We should point to the correct file.
LU-19584 lraft: import Raft code Import Raft implementation from https://github.com/willemt/raft (v0.7.0-57-ge428eeb) to Lustre, which will be used to implement fault-tolerant service. Test-Parameters: trivial Signed-off-by: Lai Siyao <lai.siyao@whamcloud.com> Change-Id: I1de9861f7fab9afcde5a63c932ef9651618aafc1
This patch is a improvement even if it does do "There are a lot of places in Lustre where we use more than one atomic operation where one will do".
IMO, to change read + check for zero then increment like below... ASSERT(atomic_read(&lp->lpni_refcount) > 0); atomic_inc(&lp->lpni_refcount); is to change to LASSERT(atomic_inc_not_zero(&hdev->ibh_ref)); since we do not want to always increment. But only increment if the value is not zero. Else it is error condition
same...
this looks correct
this is definitely a win... others also
LU-10013 llite: Atomic usage cleanups There are a lot of places in Lustre where we use more than one atomic operation where one will do. The compiler can't fix this for us, since usage of atomics is mostly exempt from optimization. This patch cleans up many of those cases. In a few places, this has a measurable benefit. (lu_object_get can use atomic_inc_return for the ASSERT, and this nets a few % improvement on single process reads). The change to osc_update_pending is expected to net a few % on shared file workloads. Signed-off-by: Patrick Farrell <paf@cray.com> Change-Id: Ie2b0b4a7fac4e544a66746c95e496071765070a3
LU-19162 lnet: implement simple LNet block driver Implement a simple block device on-top of LNet. This is implemented as two drivers: lnet_host.ko (client) and lnet_target.ko (server). The target allocates an array of pages and registers them as passive RDMAs. The host registers a block device and devices block requests to the target as LNetGet() and LNetPut(). There is a one-to-one mapping between O_DIRECT block IOs and LNet network requests. The LNet block driver aims to implement the simplest LNet service possible. With some additional optimization, this could serve as an alternative to LNet selftest. Test-Parameters: ignore Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: Ic8968d37a76021939dcf082191598d7ca23c738a
LU-19238 tests: Ensure dir updates are visible This is a test for the actual fix. Change-Id: I238171bc60586b8ae2a2d7d185b9c4ac3b70d48d Test-Parameters: trivial testlist=parallel-scale-nfsv4,parallel-scale-nfsv3 Signed-off-by: Oleg Drokin <green@whamcloud.com>
LU-0000 lov: initial client support Initial client support for EC layouts. A step towards allowing actually creating EC layouts. Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: I0e2a5d59df04ba6f7053d889cb5f204048edf8d7
LU-0000 lod: initial implementation This is an initial and partially incorrect implementation, which I'll be tearing up a bit until we can actually get layout creation to work. Signed-off-by: Patrick Farrell <pfarrell@whamcloud.com> Change-Id: I229b5751b60f8078e22dbb4ed3e2e205d3e4c9a1
| unique failing test | history |
|---|---|
| recovery-small@zfs:test_155 | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| review-ldiskfs-dne | RHEL 9.3 / x86_64 | ran 5 tests. 1 tests failed: sanity. | session |
LU-16565 ldlm: [3] Remove ldlm is,set,clear macros
Replaces ldlm_{is,set,clear} macros with the direct flag
names.
The patch has been generated with the coccinelle script in
contrib/cocci/ldlm_flags.cocci.
Test-Parameters: trivial
Signed-off-by: Timothy Day <timday@amazon.com>
Change-Id: Ib4000fb9e0c36160d41c398393be6136b48dc6ce
| unique failing test | history |
|---|---|
| sanity-hsm@ldiskfs+DNE:test_600 | seen in 3 other reviews |
| sanity-hsm@ldiskfs+DNE:test_604 | seen in 3 other reviews |
| sanity-hsm@zfs:test_600 | seen in 3 other reviews |
| sanity-hsm@zfs:test_604 | seen in 3 other reviews |
LU-10391 mdt: extend downcall to handle large nids A new version of the downcall structure is created - with a new magic number - which can hold large nids. If all the nids used are nid4, then we use the original structure for max backward compatibility. Kernel accepts both formats. Test-Parameters: fortestonly testlist=sanity serverversion=2.15 Test-Parameters: testlist=conf-sanity serverversion=2.15 Test-Parameters: testlist=sanity clientversion=2.15 Test-Parameters: testlist=conf-sanity clientversion=2.15 Signed-off-by: Mr NeilBrown <neilb@suse.de> Change-Id: I60cf1b5917a59692322871b454213bbcd282a3dd
LU-16374 ldiskfs: implement backup/restore of enc files Add new dev/testing commands to lctl to perform backup and restore of encrypted files at the ldiskfs level: - lctl fscrypt backup - lctl fscrypt restore ldiskfs is patched to support reading encrypted files without the encryption key, and also creating new files and writing to them without the encryption key. The backup phase (lctl fscrypt backup) consists in copying the source directory or file to a backup folder. A file is opened with O_CIPHERTEXT | O_DIRECT flags and content is copied. Then attributes and xattrs are copied. The restore phase (lctl fscrypt restore) consists in copying back a file or directory to ldiskfs. A file is opened with O_TMPFILE flag in addition to O_CIPHERTEXT | O_DIRECT, to create a temp file. After restoring attributes and xattrs, the file is linked to the namespace atomically, with its actual encrypted name. For directories we simply use rename, as links on directories are not possible. Add sanity-sec test_65 to exercise backup/restore at the ldiskfs level via the lctl fscrypt backup/restore commands. This patch only supports rhel8. Signed-off-by: Sebastien Buisson <sbuisson@ddn.com> Change-Id: I981a1c543819b3b097f41e4812fa82ef059e0a0c
| unique failing test | history |
|---|---|
| sanity1@ldiskfs+DNE:test_55c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
| sanity1@zfs:test_55c | NEW unique failure for this branch in the last 30 days, and was seen 0 times across 0 other branches 0 reviews |
LU-16763 obdclass: crash Lustre with OBD devices Spawn a bunch of threads trying to register and unregister the same OBD device. Lustre does not like this. Test-Parameters: trivial testlist=sanity env=ONLY=55c Signed-off-by: Timothy Day <timday@amazon.com> Change-Id: I58e59b13c37e7935c0b24d19c8637cd6462e4282
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| custom-1002 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
| custom-1003 | RHEL 8.10 / x86_64 | ran 3 tests. 1 tests failed: sanity. | session |
sotre/store
LU-18813 osd-wbcfs: store/pin LAST_ID and local files into MemFS The local files with the fid seq of "FID_SEQ_LOCAL_FILE" and the "LAST_ID" for O/<seq> hierarchy should also be created and pinned in MemFS. Thus they will not evict from memory under the memory pressure or manual cache shrinking command. Test-Parameters: trivial Test-Parameters: trivial Test-Parameters: testlist=sanity fstype=wbcfs mdscount=1 mdtcount=1 osscount=1 ostcount=1 Test-Parameters: testlist=sanity fstype=wbcfs mdscount=1 mdtcount=1 osscount=4 ostcount=1 Test-Parameters: testlist=sanity fstype=wbcfs combinedmdsmgs=false standalonemgs=true mdscount=1 mdtcount=1 osscount=1 ostcount=1 Test-Parameters: testlist=sanity fstype=wbcfs combinedmdsmgs=false standalonemgs=true mdscount=1 mdtcount=1 osscount=4 ostcount=1 Signed-off-by: Yingjin Qian <qian@ddn.com> Change-Id: I1bbf768f0467fff16b12896db3f4f329ae11c7f4
LU-9119 lnet: enable/disable multi-rail Add the ability to turn on and off multi-rail from user space. A module parameter has been added for the same purpose. When multi-rail is off, peers discovering the node see it as non-multi-rail. Test-Parameters: trivial Signed-off-by: Amir Shehata <amir.shehata@intel.com> Change-Id: I60f0fbb8d1b95297819bb0975bac31f1e8a5c60e
| unique failing test | history |
|---|---|
| sanity-lnet@zfs:test_207 | seen in 4 other reviews |
| failed enforced test | platform | detail | |
|---|---|---|---|
| custom-1001 | RHEL 8.8/x86_64 | ran 3 tests. 1 tests failed: sanity-lnet. | session |
| review-ldiskfs-dne | RHEL 8.8/x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
| review-ldiskfs-dne-arm | RHEL 8.8/aarch64, RHEL 8.8/x86_64 | ran 5 tests. 1 tests failed: sanity-lnet. | session |
LU-10391 lnet: Add helpers for netlink initialization Remove some code duplication with helper routines for initalizing the netlink/yaml API. Test-Parameters: trivial testlist=sanity-lnet Signed-off-by: Chris Horn <chris.horn@hpe.com> Change-Id: I57fd64a37dbbde0428c26aa430e41986dba0b07b
LU-10973 lnet: api_check_route works if no route We can use api_check_route with exception set to false even if there is no configured route. Test-Parameters: @lnet Signed-off-by: Cyril Bordage <cbordage@whamcloud.com> Change-Id: Ib19180234b70b33dbd9f0af7ee66c978c8ddb508
LU-18664 target: set proper kthread state The function distribute_txn_commit_batchid_update() reports a __might_sleep() issue due to distribute_txn_commit_thread() potentially calling it while in an idle state. Get the current state before distribute_txn_commit_batchid_update(), switch to TASK_RUNNING, and restore the state [likely TASK_IDLE] to avoid skipping the subsequent schedule() and allowing other threads to proceed. In the case where distribute_txn_commit_batchid_update() failed it will retry when the kernel scheduler runs the thread again. To ensure the task is rescheduled use an increasing timeout, max at 30s. Test-Parameters: testlist=sanity env=ONLY=60g,ONLY_MINUTES=30 Signed-off-by: James Simmons <jsimmons@infradead.org> Signed-off-by: Shaun Tancheff <shaun.tancheff@hpe.com> Change-Id: If9ae5ac47ec4eb24f87bc2a6bf78d3134136be6f Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/57860 Tested-by: jenkins <devops@whamcloud.com> Tested-by: Maloo <maloo@whamcloud.com> Reviewed-by: Shaun Tancheff <shaun@tancheff.com> Reviewed-by: Oleg Drokin <green@whamcloud.com> Reviewed-by: Alex Zhuravlev <bzzz@whamcloud.com>
LU-8066 quota: fix invalid YAML format
The quota seq file displays information in YAML format but that
format is invalid. It's a simple fix for the first entry to be
a proper YAML mapping.
Test-Parameters: trivial
Fixes: 294aa9cb666c ("LU-1842 quota: add quotactl support on qmt")
Signed-off-by: James Simmons <jsimmons@infradead.org>
Change-Id: Ia10a9a877d6fc21fcb0d43a95ef935f294efd609
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/68016
Reviewed-by: Andreas Dilger <adilger@thelustrecollective.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Arshad Hussain <arshad.hussain@aeoncomputing.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
LU-18687 build: cleanup compat_** usage We create compat_** wrappers to support Lustre with newer kernel changes. We can rework this so the Lustre core code can drop compat_* and use the standard kernel function name. With kallsyms we have to be careful so compat_* is not seen as the same as the function we attempting to manually export. Without COMPAT_BUILD the export symbols were not handled properly. For two exception this is not the case. One is for module_init() and module_exit() we keep the compat_* handling. The second is for struct genl_info which didn't have a genl_family field until later kernels. In the cleanup move NUM_CACHEPAGES macro from libcfs.h to lustre_net.h since only lustre code uses it. Test-Parameters: trivial Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: I59dbd2fab9f857981fc067794a095f084c26630d Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/67917 Tested-by: Maloo <maloo@whamcloud.com> Reviewed-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Reviewed-by: Andreas Dilger <adilger@thelustrecollective.com> Reviewed-by: Oleg Drokin <green@whamcloud.com> Tested-by: jenkins <devops@whamcloud.com>
LU-18876 build: changes needed for dropping into kernel tree Update the code so we can drop into the Linux kernel tree and it should be buildable. Tested against a 5.9+ kernel. Some of the changes needed for this: 1) cleanup simple configure options that behave similar to Kconfig We can do the same thing with mount options and tunables. Leave the pinger handling since it more complicated and should be handled in another patch. In the process cleanup left over ENABLE_LU_REF which is gone. 2) Break up linux-misc.h into matching kernel headers. 3) move cfs_time_seconds() to libcfs.h which is needed when copying to kernel tree without compat layer. 4) Rename LNET_DUMP_ON_PANIC to CONFIG_LNET_DUMP_ON_PANIC for upstreaming efforts. 5) Update lctl tool for debug handling for libcfs module move. 6) CPT module handling was in compat which is missing for the native Linux build except for whats in LNet lib-cpt.c. lib-cpt.c is optional code (CONFIG_SMP) which means certain expected items could go missing. Move all the CPT hard requirements back to libcfs core code. 7) Changes needed for native 5.9 kernel support. a) Support debugfs_lookup_and_remove() b) bring back task macros. Signed-off-by: James Simmons <jsimmons@infradead.org> Change-Id: Ie3abc1cc279f368993f0b3ff5d13e81591525921 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/66409 Reviewed-by: Arshad Hussain <arshad.hussain@aeoncomputing.com> Reviewed-by: Timothy Day <timday@thelustrecollective.com> Tested-by: Maloo <maloo@whamcloud.com> Reviewed-by: Oleg Drokin <green@whamcloud.com> Tested-by: jenkins <devops@whamcloud.com>