From: kernel test robot <lkp@intel.com>
To: Jeff Layton <jlayton@kernel.org>
Cc: kbuild-all@lists.01.org, ceph-devel@vger.kernel.org
Subject: [ceph-client:wip-fscrypt 38/54] fs/ceph/caps.c:3477:32: error: 'struct ceph_inode_info' has no member named 'fscrypt_auth_len'
Date: Fri, 1 Apr 2022 06:10:14 +0800 [thread overview]
Message-ID: <202204010611.pgdnXxCx-lkp@intel.com> (raw)
tree: https://github.com/ceph/ceph-client.git wip-fscrypt
head: cfa38f9d4169e3837d9a09b015492e9beb9bb8d6
commit: 1927572f5a964fa0e29bbd6fbe742c563ae66946 [38/54] ceph: handle fscrypt fields in cap messages from MDS
config: arm-buildonly-randconfig-r003-20220331 (https://download.01.org/0day-ci/archive/20220401/202204010611.pgdnXxCx-lkp@intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/ceph/ceph-client/commit/1927572f5a964fa0e29bbd6fbe742c563ae66946
git remote add ceph-client https://github.com/ceph/ceph-client.git
git fetch --no-tags ceph-client wip-fscrypt
git checkout 1927572f5a964fa0e29bbd6fbe742c563ae66946
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=arm SHELL=/bin/bash fs/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
In file included from arch/arm/include/asm/bug.h:60,
from include/linux/bug.h:5,
from include/linux/thread_info.h:13,
from include/asm-generic/preempt.h:5,
from ./arch/arm/include/generated/asm/preempt.h:1,
from include/linux/preempt.h:78,
from include/linux/spinlock.h:55,
from include/linux/wait.h:9,
from include/linux/wait_bit.h:8,
from include/linux/fs.h:6,
from fs/ceph/caps.c:4:
fs/ceph/caps.c: In function 'handle_cap_grant':
>> fs/ceph/caps.c:3477:32: error: 'struct ceph_inode_info' has no member named 'fscrypt_auth_len'
3477 | WARN_ON_ONCE(ci->fscrypt_auth_len != extra_info->fscrypt_auth_len ||
| ^~
include/asm-generic/bug.h:166:32: note: in definition of macro 'WARN_ON'
166 | int __ret_warn_on = !!(condition); \
| ^~~~~~~~~
fs/ceph/caps.c:3477:17: note: in expansion of macro 'WARN_ON_ONCE'
3477 | WARN_ON_ONCE(ci->fscrypt_auth_len != extra_info->fscrypt_auth_len ||
| ^~~~~~~~~~~~
>> fs/ceph/caps.c:3478:39: error: 'struct ceph_inode_info' has no member named 'fscrypt_auth'
3478 | memcmp(ci->fscrypt_auth, extra_info->fscrypt_auth,
| ^~
include/asm-generic/bug.h:166:32: note: in definition of macro 'WARN_ON'
166 | int __ret_warn_on = !!(condition); \
| ^~~~~~~~~
fs/ceph/caps.c:3477:17: note: in expansion of macro 'WARN_ON_ONCE'
3477 | WARN_ON_ONCE(ci->fscrypt_auth_len != extra_info->fscrypt_auth_len ||
| ^~~~~~~~~~~~
fs/ceph/caps.c:3479:40: error: 'struct ceph_inode_info' has no member named 'fscrypt_auth_len'
3479 | ci->fscrypt_auth_len));
| ^~
include/asm-generic/bug.h:166:32: note: in definition of macro 'WARN_ON'
166 | int __ret_warn_on = !!(condition); \
| ^~~~~~~~~
fs/ceph/caps.c:3477:17: note: in expansion of macro 'WARN_ON_ONCE'
3477 | WARN_ON_ONCE(ci->fscrypt_auth_len != extra_info->fscrypt_auth_len ||
| ^~~~~~~~~~~~
vim +3477 fs/ceph/caps.c
3371
3372 /*
3373 * Handle a cap GRANT message from the MDS. (Note that a GRANT may
3374 * actually be a revocation if it specifies a smaller cap set.)
3375 *
3376 * caller holds s_mutex and i_ceph_lock, we drop both.
3377 */
3378 static void handle_cap_grant(struct inode *inode,
3379 struct ceph_mds_session *session,
3380 struct ceph_cap *cap,
3381 struct ceph_mds_caps *grant,
3382 struct ceph_buffer *xattr_buf,
3383 struct cap_extra_info *extra_info)
3384 __releases(ci->i_ceph_lock)
3385 __releases(session->s_mdsc->snap_rwsem)
3386 {
3387 struct ceph_inode_info *ci = ceph_inode(inode);
3388 int seq = le32_to_cpu(grant->seq);
3389 int newcaps = le32_to_cpu(grant->caps);
3390 int used, wanted, dirty;
3391 u64 size = le64_to_cpu(grant->size);
3392 u64 max_size = le64_to_cpu(grant->max_size);
3393 unsigned char check_caps = 0;
3394 bool was_stale = cap->cap_gen < atomic_read(&session->s_cap_gen);
3395 bool wake = false;
3396 bool writeback = false;
3397 bool queue_trunc = false;
3398 bool queue_invalidate = false;
3399 bool deleted_inode = false;
3400 bool fill_inline = false;
3401
3402 /*
3403 * If there is at least one crypto block then we'll trust fscrypt_file_size.
3404 * If the real length of the file is 0, then ignore it (it has probably been
3405 * truncated down to 0 by the MDS).
3406 */
3407 if (IS_ENCRYPTED(inode) && size)
3408 size = extra_info->fscrypt_file_size;
3409
3410 dout("handle_cap_grant inode %p cap %p mds%d seq %d %s\n",
3411 inode, cap, session->s_mds, seq, ceph_cap_string(newcaps));
3412 dout(" size %llu max_size %llu, i_size %llu\n", size, max_size,
3413 i_size_read(inode));
3414
3415
3416 /*
3417 * If CACHE is being revoked, and we have no dirty buffers,
3418 * try to invalidate (once). (If there are dirty buffers, we
3419 * will invalidate _after_ writeback.)
3420 */
3421 if (S_ISREG(inode->i_mode) && /* don't invalidate readdir cache */
3422 ((cap->issued & ~newcaps) & CEPH_CAP_FILE_CACHE) &&
3423 (newcaps & CEPH_CAP_FILE_LAZYIO) == 0 &&
3424 !(ci->i_wrbuffer_ref || ci->i_wb_ref)) {
3425 if (try_nonblocking_invalidate(inode)) {
3426 /* there were locked pages.. invalidate later
3427 in a separate thread. */
3428 if (ci->i_rdcache_revoking != ci->i_rdcache_gen) {
3429 queue_invalidate = true;
3430 ci->i_rdcache_revoking = ci->i_rdcache_gen;
3431 }
3432 }
3433 }
3434
3435 if (was_stale)
3436 cap->issued = cap->implemented = CEPH_CAP_PIN;
3437
3438 /*
3439 * auth mds of the inode changed. we received the cap export message,
3440 * but still haven't received the cap import message. handle_cap_export
3441 * updated the new auth MDS' cap.
3442 *
3443 * "ceph_seq_cmp(seq, cap->seq) <= 0" means we are processing a message
3444 * that was sent before the cap import message. So don't remove caps.
3445 */
3446 if (ceph_seq_cmp(seq, cap->seq) <= 0) {
3447 WARN_ON(cap != ci->i_auth_cap);
3448 WARN_ON(cap->cap_id != le64_to_cpu(grant->cap_id));
3449 seq = cap->seq;
3450 newcaps |= cap->issued;
3451 }
3452
3453 /* side effects now are allowed */
3454 cap->cap_gen = atomic_read(&session->s_cap_gen);
3455 cap->seq = seq;
3456
3457 __check_cap_issue(ci, cap, newcaps);
3458
3459 inode_set_max_iversion_raw(inode, extra_info->change_attr);
3460
3461 if ((newcaps & CEPH_CAP_AUTH_SHARED) &&
3462 (extra_info->issued & CEPH_CAP_AUTH_EXCL) == 0) {
3463 umode_t mode = le32_to_cpu(grant->mode);
3464
3465 if (inode_wrong_type(inode, mode))
3466 pr_warn_once("inode type changed! (ino %llx.%llx is 0%o, mds says 0%o)\n",
3467 ceph_vinop(inode), inode->i_mode, mode);
3468 else
3469 inode->i_mode = mode;
3470 inode->i_uid = make_kuid(&init_user_ns, le32_to_cpu(grant->uid));
3471 inode->i_gid = make_kgid(&init_user_ns, le32_to_cpu(grant->gid));
3472 ci->i_btime = extra_info->btime;
3473 dout("%p mode 0%o uid.gid %d.%d\n", inode, inode->i_mode,
3474 from_kuid(&init_user_ns, inode->i_uid),
3475 from_kgid(&init_user_ns, inode->i_gid));
3476
> 3477 WARN_ON_ONCE(ci->fscrypt_auth_len != extra_info->fscrypt_auth_len ||
> 3478 memcmp(ci->fscrypt_auth, extra_info->fscrypt_auth,
3479 ci->fscrypt_auth_len));
3480 }
3481
3482 if ((newcaps & CEPH_CAP_LINK_SHARED) &&
3483 (extra_info->issued & CEPH_CAP_LINK_EXCL) == 0) {
3484 set_nlink(inode, le32_to_cpu(grant->nlink));
3485 if (inode->i_nlink == 0)
3486 deleted_inode = true;
3487 }
3488
3489 if ((extra_info->issued & CEPH_CAP_XATTR_EXCL) == 0 &&
3490 grant->xattr_len) {
3491 int len = le32_to_cpu(grant->xattr_len);
3492 u64 version = le64_to_cpu(grant->xattr_version);
3493
3494 if (version > ci->i_xattrs.version) {
3495 dout(" got new xattrs v%llu on %p len %d\n",
3496 version, inode, len);
3497 if (ci->i_xattrs.blob)
3498 ceph_buffer_put(ci->i_xattrs.blob);
3499 ci->i_xattrs.blob = ceph_buffer_get(xattr_buf);
3500 ci->i_xattrs.version = version;
3501 ceph_forget_all_cached_acls(inode);
3502 ceph_security_invalidate_secctx(inode);
3503 }
3504 }
3505
3506 if (newcaps & CEPH_CAP_ANY_RD) {
3507 struct timespec64 mtime, atime, ctime;
3508 /* ctime/mtime/atime? */
3509 ceph_decode_timespec64(&mtime, &grant->mtime);
3510 ceph_decode_timespec64(&atime, &grant->atime);
3511 ceph_decode_timespec64(&ctime, &grant->ctime);
3512 ceph_fill_file_time(inode, extra_info->issued,
3513 le32_to_cpu(grant->time_warp_seq),
3514 &ctime, &mtime, &atime);
3515 }
3516
3517 if ((newcaps & CEPH_CAP_FILE_SHARED) && extra_info->dirstat_valid) {
3518 ci->i_files = extra_info->nfiles;
3519 ci->i_subdirs = extra_info->nsubdirs;
3520 }
3521
3522 if (newcaps & (CEPH_CAP_ANY_FILE_RD | CEPH_CAP_ANY_FILE_WR)) {
3523 /* file layout may have changed */
3524 s64 old_pool = ci->i_layout.pool_id;
3525 struct ceph_string *old_ns;
3526
3527 ceph_file_layout_from_legacy(&ci->i_layout, &grant->layout);
3528 old_ns = rcu_dereference_protected(ci->i_layout.pool_ns,
3529 lockdep_is_held(&ci->i_ceph_lock));
3530 rcu_assign_pointer(ci->i_layout.pool_ns, extra_info->pool_ns);
3531
3532 if (ci->i_layout.pool_id != old_pool ||
3533 extra_info->pool_ns != old_ns)
3534 ci->i_ceph_flags &= ~CEPH_I_POOL_PERM;
3535
3536 extra_info->pool_ns = old_ns;
3537
3538 /* size/truncate_seq? */
3539 queue_trunc = ceph_fill_file_size(inode, extra_info->issued,
3540 le32_to_cpu(grant->truncate_seq),
3541 le64_to_cpu(grant->truncate_size),
3542 size);
3543 }
3544
3545 if (ci->i_auth_cap == cap && (newcaps & CEPH_CAP_ANY_FILE_WR)) {
3546 if (max_size != ci->i_max_size) {
3547 dout("max_size %lld -> %llu\n",
3548 ci->i_max_size, max_size);
3549 ci->i_max_size = max_size;
3550 if (max_size >= ci->i_wanted_max_size) {
3551 ci->i_wanted_max_size = 0; /* reset */
3552 ci->i_requested_max_size = 0;
3553 }
3554 wake = true;
3555 }
3556 }
3557
3558 /* check cap bits */
3559 wanted = __ceph_caps_wanted(ci);
3560 used = __ceph_caps_used(ci);
3561 dirty = __ceph_caps_dirty(ci);
3562 dout(" my wanted = %s, used = %s, dirty %s\n",
3563 ceph_cap_string(wanted),
3564 ceph_cap_string(used),
3565 ceph_cap_string(dirty));
3566
3567 if ((was_stale || le32_to_cpu(grant->op) == CEPH_CAP_OP_IMPORT) &&
3568 (wanted & ~(cap->mds_wanted | newcaps))) {
3569 /*
3570 * If mds is importing cap, prior cap messages that update
3571 * 'wanted' may get dropped by mds (migrate seq mismatch).
3572 *
3573 * We don't send cap message to update 'wanted' if what we
3574 * want are already issued. If mds revokes caps, cap message
3575 * that releases caps also tells mds what we want. But if
3576 * caps got revoked by mds forcedly (session stale). We may
3577 * haven't told mds what we want.
3578 */
3579 check_caps = 1;
3580 }
3581
3582 /* revocation, grant, or no-op? */
3583 if (cap->issued & ~newcaps) {
3584 int revoking = cap->issued & ~newcaps;
3585
3586 dout("revocation: %s -> %s (revoking %s)\n",
3587 ceph_cap_string(cap->issued),
3588 ceph_cap_string(newcaps),
3589 ceph_cap_string(revoking));
3590 if (S_ISREG(inode->i_mode) &&
3591 (revoking & used & CEPH_CAP_FILE_BUFFER))
3592 writeback = true; /* initiate writeback; will delay ack */
3593 else if (queue_invalidate &&
3594 revoking == CEPH_CAP_FILE_CACHE &&
3595 (newcaps & CEPH_CAP_FILE_LAZYIO) == 0)
3596 ; /* do nothing yet, invalidation will be queued */
3597 else if (cap == ci->i_auth_cap)
3598 check_caps = 1; /* check auth cap only */
3599 else
3600 check_caps = 2; /* check all caps */
3601 cap->issued = newcaps;
3602 cap->implemented |= newcaps;
3603 } else if (cap->issued == newcaps) {
3604 dout("caps unchanged: %s -> %s\n",
3605 ceph_cap_string(cap->issued), ceph_cap_string(newcaps));
3606 } else {
3607 dout("grant: %s -> %s\n", ceph_cap_string(cap->issued),
3608 ceph_cap_string(newcaps));
3609 /* non-auth MDS is revoking the newly grant caps ? */
3610 if (cap == ci->i_auth_cap &&
3611 __ceph_caps_revoking_other(ci, cap, newcaps))
3612 check_caps = 2;
3613
3614 cap->issued = newcaps;
3615 cap->implemented |= newcaps; /* add bits only, to
3616 * avoid stepping on a
3617 * pending revocation */
3618 wake = true;
3619 }
3620 BUG_ON(cap->issued & ~cap->implemented);
3621
3622 if (extra_info->inline_version > 0 &&
3623 extra_info->inline_version >= ci->i_inline_version) {
3624 ci->i_inline_version = extra_info->inline_version;
3625 if (ci->i_inline_version != CEPH_INLINE_NONE &&
3626 (newcaps & (CEPH_CAP_FILE_CACHE|CEPH_CAP_FILE_LAZYIO)))
3627 fill_inline = true;
3628 }
3629
3630 if (ci->i_auth_cap == cap &&
3631 le32_to_cpu(grant->op) == CEPH_CAP_OP_IMPORT) {
3632 if (newcaps & ~extra_info->issued)
3633 wake = true;
3634
3635 if (ci->i_requested_max_size > max_size ||
3636 !(le32_to_cpu(grant->wanted) & CEPH_CAP_ANY_FILE_WR)) {
3637 /* re-request max_size if necessary */
3638 ci->i_requested_max_size = 0;
3639 wake = true;
3640 }
3641
3642 ceph_kick_flushing_inode_caps(session, ci);
3643 spin_unlock(&ci->i_ceph_lock);
3644 up_read(&session->s_mdsc->snap_rwsem);
3645 } else {
3646 spin_unlock(&ci->i_ceph_lock);
3647 }
3648
3649 if (fill_inline)
3650 ceph_fill_inline_data(inode, NULL, extra_info->inline_data,
3651 extra_info->inline_len);
3652
3653 if (queue_trunc)
3654 ceph_queue_vmtruncate(inode);
3655
3656 if (writeback)
3657 /*
3658 * queue inode for writeback: we can't actually call
3659 * filemap_write_and_wait, etc. from message handler
3660 * context.
3661 */
3662 ceph_queue_writeback(inode);
3663 if (queue_invalidate)
3664 ceph_queue_invalidate(inode);
3665 if (deleted_inode)
3666 invalidate_aliases(inode);
3667 if (wake)
3668 wake_up_all(&ci->i_cap_wq);
3669
3670 mutex_unlock(&session->s_mutex);
3671 if (check_caps == 1)
3672 ceph_check_caps(ci, CHECK_CAPS_AUTHONLY | CHECK_CAPS_NOINVAL,
3673 session);
3674 else if (check_caps == 2)
3675 ceph_check_caps(ci, CHECK_CAPS_NOINVAL, session);
3676 }
3677
--
0-DAY CI Kernel Test Service
https://01.org/lkp
reply other threads:[~2022-03-31 22:10 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202204010611.pgdnXxCx-lkp@intel.com \
--to=lkp@intel.com \
--cc=ceph-devel@vger.kernel.org \
--cc=jlayton@kernel.org \
--cc=kbuild-all@lists.01.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.