All of lore.kernel.org
 help / color / mirror / Atom feed
* [dhowells-fs:ceph-iter 61/61] fs/ceph/inode.c:1057:9: error: no member named 'min_bshift' in 'struct netfs_inode'
@ 2024-09-07 22:50 kernel test robot
  0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2024-09-07 22:50 UTC (permalink / raw)
  To: David Howells; +Cc: llvm, oe-kbuild-all

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git ceph-iter
head:   6c59f154a1d493b31755ac17326124d804172fb2
commit: 6c59f154a1d493b31755ac17326124d804172fb2 [61/61] ceph: Use netfslib
config: i386-randconfig-016-20240907 (https://download.01.org/0day-ci/archive/20240908/202409080630.VC47MNOG-lkp@intel.com/config)
compiler: clang version 18.1.5 (https://github.com/llvm/llvm-project 617a15a9eac96088ae5e9134248d8236e34b91b1)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240908/202409080630.VC47MNOG-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202409080630.VC47MNOG-lkp@intel.com/

All error/warnings (new ones prefixed by >>):

>> net/ceph/snapshot.c:40:22: warning: cast from 'void (*)(const void *)' to 'void (*)(struct netfs_group *)' converts to incompatible function type [-Wcast-function-type-strict]
      40 |         snapc->group.free = (void (*)(struct netfs_group *))kfree;
         |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   1 warning generated.
--
>> fs/ceph/inode.c:1057:9: error: no member named 'min_bshift' in 'struct netfs_inode'
    1057 |                 ictx->min_bshift = ictx->crypto_bshift;
         |                 ~~~~  ^
   1 error generated.
--
>> fs/ceph/rdwr.c:116:12: error: use of undeclared identifier 'NETFS_RREQ_REPEAT_RMW'
     116 |                         set_bit(NETFS_RREQ_REPEAT_RMW, &ci->netfs.flags);
         |                                 ^
>> fs/ceph/rdwr.c:125:2: error: call to undeclared function 'netfs_subreq_terminated'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
     125 |         netfs_subreq_terminated(subreq, wrote, err);
         |         ^
   fs/ceph/rdwr.c:125:2: note: did you mean 'netfs_read_subreq_terminated'?
   include/linux/netfs.h:468:6: note: 'netfs_read_subreq_terminated' declared here
     468 | void netfs_read_subreq_terminated(struct netfs_io_subrequest *subreq,
         |      ^
>> fs/ceph/rdwr.c:139:42: error: use of undeclared identifier 'inode'
     139 |         struct ceph_inode_info *ci = ceph_inode(inode);
         |                                                 ^
>> fs/ceph/rdwr.c:146:59: error: no member named 'max_len' in 'struct netfs_io_subrequest'
     146 |               subreq->start, subreq->len, subreq->start, subreq->max_len,
         |                                                          ~~~~~~  ^
   include/linux/ceph/ceph_debug.h:47:46: note: expanded from macro 'doutc'
      47 |                  client->monc.auth->global_id, __func__, ##__VA_ARGS__)
         |                                                            ^~~~~~~~~~~
   include/linux/printk.h:589:26: note: expanded from macro 'pr_debug'
     589 |         dynamic_pr_debug(fmt, ##__VA_ARGS__)
         |                                 ^~~~~~~~~~~
   include/linux/dynamic_debug.h:270:22: note: expanded from macro 'dynamic_pr_debug'
     270 |                            pr_fmt(fmt), ##__VA_ARGS__)
         |                                           ^~~~~~~~~~~
   include/linux/dynamic_debug.h:250:59: note: expanded from macro '_dynamic_func_call'
     250 |         _dynamic_func_call_cls(_DPRINTK_CLASS_DFLT, fmt, func, ##__VA_ARGS__)
         |                                                                  ^~~~~~~~~~~
   include/linux/dynamic_debug.h:248:65: note: expanded from macro '_dynamic_func_call_cls'
     248 |         __dynamic_func_call_cls(__UNIQUE_ID(ddebug), cls, fmt, func, ##__VA_ARGS__)
         |                                                                        ^~~~~~~~~~~
   include/linux/dynamic_debug.h:224:15: note: expanded from macro '__dynamic_func_call_cls'
     224 |                 func(&id, ##__VA_ARGS__);                       \
         |                             ^~~~~~~~~~~
   fs/ceph/rdwr.c:167:17: error: use of undeclared identifier 'inode'
     167 |         req->r_inode    = inode;
         |                           ^
   fs/ceph/rdwr.c:168:30: error: use of undeclared identifier 'inode'
     168 |         req->r_mtime    = current_time(inode);
         |                                        ^
>> fs/ceph/rdwr.c:180:7: error: use of undeclared identifier 'assert_ver'
     180 |                 if (assert_ver) {
         |                     ^
   fs/ceph/rdwr.c:182:35: error: use of undeclared identifier 'assert_ver'
     182 |                         req->r_ops[0].assert_ver.ver = assert_ver;
         |                                                        ^
   fs/ceph/rdwr.c:209:38: error: no member named 'max_len' in 'struct netfs_io_subrequest'
     209 |                                       &objnum, &objoff, &subreq->max_len);
         |                                                          ~~~~~~  ^
>> fs/ceph/rdwr.c:266:2: error: use of undeclared identifier 'rreq'
     266 |         rreq->io_streams[0].sreq_max_len = umin(xlen, fsc->mount_options->rsize);
         |         ^
>> fs/ceph/rdwr.c:335:18: warning: unused variable 'iter' [-Wunused-variable]
     335 |         struct iov_iter iter;
         |                         ^~~~
>> fs/ceph/rdwr.c:514:3: error: field designator 'clamp_length' does not refer to any field in type 'const struct netfs_request_ops'
     514 |         .clamp_length           = ceph_netfs_clamp_length,
         |         ~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> fs/ceph/rdwr.c:541:36: error: use of undeclared identifier 'page_snapc'
     541 |                 if (snapc && capsnap->context != page_snapc)
         |                                                  ^
>> fs/ceph/rdwr.c:591:10: error: call to undeclared function 'folio_snap_context'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
     591 |         snapc = folio_snap_context(ceph_fscrypt_pagecache_folio(folio));
         |                 ^
>> fs/ceph/rdwr.c:591:8: error: incompatible integer to pointer conversion assigning to 'struct ceph_snap_context *' from 'int' [-Wint-conversion]
     591 |         snapc = folio_snap_context(ceph_fscrypt_pagecache_folio(folio));
         |               ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> fs/ceph/rdwr.c:629:54: error: too few arguments to function call, expected 3, have 2
     629 |                 snapc = get_oldest_context(mapping->host, &ceph_wbc);
         |                         ~~~~~~~~~~~~~~~~~~                         ^
   fs/ceph/rdwr.c:525:1: note: 'get_oldest_context' declared here
     525 | get_oldest_context(struct inode *inode, struct ceph_writeback_ctl *ctl,
         | ^                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     526 |                    struct ceph_snap_context *folio_snapc)
         |                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> fs/ceph/rdwr.c:656:17: error: use of undeclared identifier 'ceph_dirty_folio'
     656 |         .dirty_folio    = ceph_dirty_folio,
         |                           ^
>> fs/ceph/rdwr.c:657:22: error: use of undeclared identifier 'ceph_invalidate_folio'; did you mean 'netfs_invalidate_folio'?
     657 |         .invalidate_folio = ceph_invalidate_folio,
         |                             ^~~~~~~~~~~~~~~~~~~~~
         |                             netfs_invalidate_folio
   include/linux/netfs.h:459:6: note: 'netfs_invalidate_folio' declared here
     459 | void netfs_invalidate_folio(struct folio *folio, size_t offset, size_t length);
         |      ^
>> fs/ceph/rdwr.c:721:11: error: call to undeclared function 'ceph_direct_read_write'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
     721 |                                 ret = ceph_direct_read_write(iocb, to,
         |                                       ^
   fs/ceph/rdwr.c:721:11: note: did you mean 'ceph_prepare_write'?
   fs/ceph/rdwr.c:196:13: note: 'ceph_prepare_write' declared here
     196 | static void ceph_prepare_write(struct netfs_io_subrequest *subreq)
         |             ^
>> fs/ceph/rdwr.c:724:17: error: use of undeclared identifier 'CHECK_EOF'
     724 |                                         retry_op = CHECK_EOF;
         |                                                    ^
   fatal error: too many errors emitted, stopping now [-ferror-limit=]
   1 warning and 20 errors generated.
--
>> fs/ceph/file.c:1746:15: error: use of undeclared identifier 'ceph_read_iter'; did you mean 'seq_read_iter'?
    1746 |         .read_iter = ceph_read_iter,
         |                      ^~~~~~~~~~~~~~
         |                      seq_read_iter
   include/linux/seq_file.h:110:9: note: 'seq_read_iter' declared here
     110 | ssize_t seq_read_iter(struct kiocb *iocb, struct iov_iter *iter);
         |         ^
>> fs/ceph/file.c:1747:16: error: use of undeclared identifier 'ceph_write_iter'; did you mean 'ceph_write_inode'?
    1747 |         .write_iter = ceph_write_iter,
         |                       ^~~~~~~~~~~~~~~
         |                       ceph_write_inode
   fs/ceph/super.h:1251:12: note: 'ceph_write_inode' declared here
    1251 | extern int ceph_write_inode(struct inode *inode, struct writeback_control *wbc);
         |            ^
>> fs/ceph/file.c:1747:16: error: incompatible function pointer types initializing 'ssize_t (*)(struct kiocb *, struct iov_iter *)' (aka 'int (*)(struct kiocb *, struct iov_iter *)') with an expression of type 'int (struct inode *, struct writeback_control *)' [-Wincompatible-function-pointer-types]
    1747 |         .write_iter = ceph_write_iter,
         |                       ^~~~~~~~~~~~~~~
   3 errors generated.
--
   fs/ceph/crypto.c:545:5: warning: no previous prototype for function 'ceph_fscrypt_decrypt_pages' [-Wmissing-prototypes]
     545 | int ceph_fscrypt_decrypt_pages(struct inode *inode, struct ceph_databuf *dbuf,
         |     ^
   fs/ceph/crypto.c:545:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
     545 | int ceph_fscrypt_decrypt_pages(struct inode *inode, struct ceph_databuf *dbuf,
         | ^
         | static 
   fs/ceph/crypto.c:591:5: error: conflicting types for 'ceph_fscrypt_decrypt_extents'
     591 | int ceph_fscrypt_decrypt_extents(struct inode *inode, struct page **page,
         |     ^
   fs/ceph/crypto.h:160:5: note: previous declaration is here
     160 | int ceph_fscrypt_decrypt_extents(struct inode *inode, struct ceph_databuf *dbuf, u64 off,
         |     ^
   fs/ceph/crypto.c:625:44: error: incompatible pointer types passing 'struct page **' to parameter of type 'struct ceph_databuf *' [-Werror,-Wincompatible-pointer-types]
     625 |                 fret = ceph_fscrypt_decrypt_pages(inode, &page[pgidx],
         |                                                          ^~~~~~~~~~~~
   fs/ceph/crypto.c:545:74: note: passing argument to parameter 'dbuf' here
     545 | int ceph_fscrypt_decrypt_pages(struct inode *inode, struct ceph_databuf *dbuf,
         |                                                                          ^
>> fs/ceph/crypto.c:644:35: error: use of undeclared identifier 'op'
     644 |         struct ceph_sparse_extent *map = op->extent.sparse_ext;
         |                                          ^
>> fs/ceph/crypto.c:645:42: error: use of undeclared identifier 'inode'
     645 |         struct ceph_inode_info *ci = ceph_inode(inode);
         |                                                 ^
   fs/ceph/crypto.c:647:16: error: use of undeclared identifier 'op'
     647 |         u32 ext_cnt = op->extent.sparse_ext_cnt;
         |                       ^
>> fs/ceph/crypto.c:671:45: error: use of undeclared identifier 'page'
     671 |                 fret = ceph_fscrypt_decrypt_pages(inode, &page[pgidx],
         |                                                           ^
   fs/ceph/crypto.c:671:37: error: use of undeclared identifier 'inode'
     671 |                 fret = ceph_fscrypt_decrypt_pages(inode, &page[pgidx],
         |                                                   ^
>> fs/ceph/crypto.c:672:8: error: use of undeclared identifier 'off'
     672 |                                                  off + pgsoff, ext->len);
         |                                                  ^
>> fs/ceph/crypto.c:640:5: warning: no previous prototype for function 'ceph_decrypt_block' [-Wmissing-prototypes]
     640 | int ceph_decrypt_block(struct netfs_io_request *rreq, loff_t pos, size_t len,
         |     ^
   fs/ceph/crypto.c:640:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
     640 | int ceph_decrypt_block(struct netfs_io_request *rreq, loff_t pos, size_t len,
         | ^
         | static 
>> fs/ceph/crypto.c:686:5: warning: no previous prototype for function 'ceph_encrypt_block' [-Wmissing-prototypes]
     686 | int ceph_encrypt_block(struct netfs_io_request *wreq, loff_t pos, size_t len,
         |     ^
   fs/ceph/crypto.c:686:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
     686 | int ceph_encrypt_block(struct netfs_io_request *wreq, loff_t pos, size_t len,
         | ^
         | static 
   3 warnings and 8 errors generated.


vim +1057 fs/ceph/inode.c

   936	
   937	/*
   938	 * Populate an inode based on info from mds.  May be called on new or
   939	 * existing inodes.
   940	 */
   941	int ceph_fill_inode(struct inode *inode, struct folio *locked_folio,
   942			    struct ceph_mds_reply_info_in *iinfo,
   943			    struct ceph_mds_reply_dirfrag *dirinfo,
   944			    struct ceph_mds_session *session, int cap_fmode,
   945			    struct ceph_cap_reservation *caps_reservation)
   946	{
   947		struct ceph_mds_client *mdsc = ceph_sb_to_mdsc(inode->i_sb);
   948		struct ceph_client *cl = mdsc->fsc->client;
   949		struct ceph_mds_reply_inode *info = iinfo->in;
   950		struct ceph_inode_info *ci = ceph_inode(inode);
   951		struct netfs_inode *ictx = netfs_inode(inode);
   952		int issued, new_issued, info_caps;
   953		struct timespec64 mtime, atime, ctime;
   954		struct ceph_buffer *xattr_blob = NULL;
   955		struct ceph_buffer *old_blob = NULL;
   956		struct ceph_string *pool_ns = NULL;
   957		struct ceph_cap *new_cap = NULL;
   958		int err = 0;
   959		bool wake = false;
   960		bool queue_trunc = false;
   961		bool new_version = false;
   962		bool fill_inline = false;
   963		umode_t mode = le32_to_cpu(info->mode);
   964		dev_t rdev = le32_to_cpu(info->rdev);
   965	
   966		lockdep_assert_held(&mdsc->snap_rwsem);
   967	
   968		doutc(cl, "%p ino %llx.%llx v %llu had %llu\n", inode, ceph_vinop(inode),
   969		      le64_to_cpu(info->version), ci->i_version);
   970	
   971		/* Once I_NEW is cleared, we can't change type or dev numbers */
   972		if (inode->i_state & I_NEW) {
   973			inode->i_mode = mode;
   974		} else {
   975			if (inode_wrong_type(inode, mode)) {
   976				pr_warn_once_client(cl,
   977					"inode type changed! (ino %llx.%llx is 0%o, mds says 0%o)\n",
   978					ceph_vinop(inode), inode->i_mode, mode);
   979				return -ESTALE;
   980			}
   981	
   982			if ((S_ISCHR(mode) || S_ISBLK(mode)) && inode->i_rdev != rdev) {
   983				pr_warn_once_client(cl,
   984					"dev inode rdev changed! (ino %llx.%llx is %u:%u, mds says %u:%u)\n",
   985					ceph_vinop(inode), MAJOR(inode->i_rdev),
   986					MINOR(inode->i_rdev), MAJOR(rdev),
   987					MINOR(rdev));
   988				return -ESTALE;
   989			}
   990		}
   991	
   992		info_caps = le32_to_cpu(info->cap.caps);
   993	
   994		/* prealloc new cap struct */
   995		if (info_caps && ceph_snap(inode) == CEPH_NOSNAP) {
   996			new_cap = ceph_get_cap(mdsc, caps_reservation);
   997			if (!new_cap)
   998				return -ENOMEM;
   999		}
  1000	
  1001		/*
  1002		 * prealloc xattr data, if it looks like we'll need it.  only
  1003		 * if len > 4 (meaning there are actually xattrs; the first 4
  1004		 * bytes are the xattr count).
  1005		 */
  1006		if (iinfo->xattr_len > 4) {
  1007			xattr_blob = ceph_buffer_new(iinfo->xattr_len, GFP_NOFS);
  1008			if (!xattr_blob)
  1009				pr_err_client(cl, "ENOMEM xattr blob %d bytes\n",
  1010					      iinfo->xattr_len);
  1011		}
  1012	
  1013		if (iinfo->pool_ns_len > 0)
  1014			pool_ns = ceph_find_or_create_string(iinfo->pool_ns_data,
  1015							     iinfo->pool_ns_len);
  1016	
  1017		if (ceph_snap(inode) != CEPH_NOSNAP && !ci->i_snapid_map)
  1018			ci->i_snapid_map = ceph_get_snapid_map(mdsc, ceph_snap(inode));
  1019	
  1020		spin_lock(&ci->i_ceph_lock);
  1021	
  1022		/*
  1023		 * provided version will be odd if inode value is projected,
  1024		 * even if stable.  skip the update if we have newer stable
  1025		 * info (ours>=theirs, e.g. due to racing mds replies), unless
  1026		 * we are getting projected (unstable) info (in which case the
  1027		 * version is odd, and we want ours>theirs).
  1028		 *   us   them
  1029		 *   2    2     skip
  1030		 *   3    2     skip
  1031		 *   3    3     update
  1032		 */
  1033		if (ci->i_version == 0 ||
  1034		    ((info->cap.flags & CEPH_CAP_FLAG_AUTH) &&
  1035		     le64_to_cpu(info->version) > (ci->i_version & ~1)))
  1036			new_version = true;
  1037	
  1038		/* Update change_attribute */
  1039		inode_set_max_iversion_raw(inode, iinfo->change_attr);
  1040	
  1041		__ceph_caps_issued(ci, &issued);
  1042		issued |= __ceph_caps_dirty(ci);
  1043		new_issued = ~issued & info_caps;
  1044	
  1045		__ceph_update_quota(ci, iinfo->max_bytes, iinfo->max_files);
  1046	
  1047	#ifdef CONFIG_FS_ENCRYPTION
  1048		if (iinfo->fscrypt_auth_len &&
  1049		    ((inode->i_state & I_NEW) || (ci->fscrypt_auth_len == 0))) {
  1050			kfree(ci->fscrypt_auth);
  1051			ci->fscrypt_auth_len = iinfo->fscrypt_auth_len;
  1052			ci->fscrypt_auth = iinfo->fscrypt_auth;
  1053			iinfo->fscrypt_auth = NULL;
  1054			iinfo->fscrypt_auth_len = 0;
  1055			inode_set_flags(inode, S_ENCRYPTED, S_ENCRYPTED);
  1056			ictx->crypto_bshift = ilog2(CEPH_FSCRYPT_BLOCK_SIZE);
> 1057			ictx->min_bshift = ictx->crypto_bshift;
  1058			__set_bit(NETFS_ICTX_ENCRYPTED, &ictx->flags);
  1059		}
  1060	#endif
  1061	
  1062		if ((new_version || (new_issued & CEPH_CAP_AUTH_SHARED)) &&
  1063		    (issued & CEPH_CAP_AUTH_EXCL) == 0) {
  1064			inode->i_mode = mode;
  1065			inode->i_uid = make_kuid(&init_user_ns, le32_to_cpu(info->uid));
  1066			inode->i_gid = make_kgid(&init_user_ns, le32_to_cpu(info->gid));
  1067			doutc(cl, "%p %llx.%llx mode 0%o uid.gid %d.%d\n", inode,
  1068			      ceph_vinop(inode), inode->i_mode,
  1069			      from_kuid(&init_user_ns, inode->i_uid),
  1070			      from_kgid(&init_user_ns, inode->i_gid));
  1071			ceph_decode_timespec64(&ci->i_btime, &iinfo->btime);
  1072			ceph_decode_timespec64(&ci->i_snap_btime, &iinfo->snap_btime);
  1073		}
  1074	
  1075		/* directories have fl_stripe_unit set to zero */
  1076		if (IS_ENCRYPTED(inode))
  1077			inode->i_blkbits = CEPH_FSCRYPT_BLOCK_SHIFT;
  1078		else if (le32_to_cpu(info->layout.fl_stripe_unit))
  1079			inode->i_blkbits =
  1080				fls(le32_to_cpu(info->layout.fl_stripe_unit)) - 1;
  1081		else
  1082			inode->i_blkbits = CEPH_BLOCK_SHIFT;
  1083	
  1084		if ((new_version || (new_issued & CEPH_CAP_LINK_SHARED)) &&
  1085		    (issued & CEPH_CAP_LINK_EXCL) == 0)
  1086			set_nlink(inode, le32_to_cpu(info->nlink));
  1087	
  1088		if (new_version || (new_issued & CEPH_CAP_ANY_RD)) {
  1089			/* be careful with mtime, atime, size */
  1090			ceph_decode_timespec64(&atime, &info->atime);
  1091			ceph_decode_timespec64(&mtime, &info->mtime);
  1092			ceph_decode_timespec64(&ctime, &info->ctime);
  1093			ceph_fill_file_time(inode, issued,
  1094					le32_to_cpu(info->time_warp_seq),
  1095					&ctime, &mtime, &atime);
  1096		}
  1097	
  1098		if (new_version || (info_caps & CEPH_CAP_FILE_SHARED)) {
  1099			ci->i_files = le64_to_cpu(info->files);
  1100			ci->i_subdirs = le64_to_cpu(info->subdirs);
  1101		}
  1102	
  1103		if (new_version ||
  1104		    (new_issued & (CEPH_CAP_ANY_FILE_RD | CEPH_CAP_ANY_FILE_WR))) {
  1105			u64 size = le64_to_cpu(info->size);
  1106			s64 old_pool = ci->i_layout.pool_id;
  1107			struct ceph_string *old_ns;
  1108	
  1109			ceph_file_layout_from_legacy(&ci->i_layout, &info->layout);
  1110			old_ns = rcu_dereference_protected(ci->i_layout.pool_ns,
  1111						lockdep_is_held(&ci->i_ceph_lock));
  1112			rcu_assign_pointer(ci->i_layout.pool_ns, pool_ns);
  1113	
  1114			if (ci->i_layout.pool_id != old_pool || pool_ns != old_ns)
  1115				ci->i_ceph_flags &= ~CEPH_I_POOL_PERM;
  1116	
  1117			pool_ns = old_ns;
  1118	
  1119			if (IS_ENCRYPTED(inode) && size &&
  1120			    iinfo->fscrypt_file_len == sizeof(__le64)) {
  1121				u64 fsize = __le64_to_cpu(*(__le64 *)iinfo->fscrypt_file);
  1122	
  1123				if (size == round_up(fsize, CEPH_FSCRYPT_BLOCK_SIZE)) {
  1124					size = fsize;
  1125				} else {
  1126					pr_warn_client(cl,
  1127						"fscrypt size mismatch: size=%llu fscrypt_file=%llu, discarding fscrypt_file size.\n",
  1128						info->size, size);
  1129				}
  1130			}
  1131	
  1132			ictx->zero_point = size;
  1133			queue_trunc = ceph_fill_file_size(inode, issued,
  1134						le32_to_cpu(info->truncate_seq),
  1135						le64_to_cpu(info->truncate_size),
  1136						size);
  1137			/* only update max_size on auth cap */
  1138			if ((info->cap.flags & CEPH_CAP_FLAG_AUTH) &&
  1139			    ci->i_max_size != le64_to_cpu(info->max_size)) {
  1140				doutc(cl, "max_size %lld -> %llu\n",
  1141				    ci->i_max_size, le64_to_cpu(info->max_size));
  1142				ci->i_max_size = le64_to_cpu(info->max_size);
  1143			}
  1144		}
  1145	
  1146		/* layout and rstat are not tracked by capability, update them if
  1147		 * the inode info is from auth mds */
  1148		if (new_version || (info->cap.flags & CEPH_CAP_FLAG_AUTH)) {
  1149			if (S_ISDIR(inode->i_mode)) {
  1150				ci->i_dir_layout = iinfo->dir_layout;
  1151				ci->i_rbytes = le64_to_cpu(info->rbytes);
  1152				ci->i_rfiles = le64_to_cpu(info->rfiles);
  1153				ci->i_rsubdirs = le64_to_cpu(info->rsubdirs);
  1154				ci->i_dir_pin = iinfo->dir_pin;
  1155				ci->i_rsnaps = iinfo->rsnaps;
  1156				ceph_decode_timespec64(&ci->i_rctime, &info->rctime);
  1157			}
  1158		}
  1159	
  1160		/* xattrs */
  1161		/* note that if i_xattrs.len <= 4, i_xattrs.data will still be NULL. */
  1162		if ((ci->i_xattrs.version == 0 || !(issued & CEPH_CAP_XATTR_EXCL))  &&
  1163		    le64_to_cpu(info->xattr_version) > ci->i_xattrs.version) {
  1164			if (ci->i_xattrs.blob)
  1165				old_blob = ci->i_xattrs.blob;
  1166			ci->i_xattrs.blob = xattr_blob;
  1167			if (xattr_blob)
  1168				memcpy(ci->i_xattrs.blob->vec.iov_base,
  1169				       iinfo->xattr_data, iinfo->xattr_len);
  1170			ci->i_xattrs.version = le64_to_cpu(info->xattr_version);
  1171			ceph_forget_all_cached_acls(inode);
  1172			ceph_security_invalidate_secctx(inode);
  1173			xattr_blob = NULL;
  1174		}
  1175	
  1176		/* finally update i_version */
  1177		if (le64_to_cpu(info->version) > ci->i_version)
  1178			ci->i_version = le64_to_cpu(info->version);
  1179	
  1180		inode->i_mapping->a_ops = &ceph_aops;
  1181	
  1182		switch (inode->i_mode & S_IFMT) {
  1183		case S_IFIFO:
  1184		case S_IFBLK:
  1185		case S_IFCHR:
  1186		case S_IFSOCK:
  1187			inode->i_blkbits = PAGE_SHIFT;
  1188			init_special_inode(inode, inode->i_mode, rdev);
  1189			inode->i_op = &ceph_file_iops;
  1190			break;
  1191		case S_IFREG:
  1192			inode->i_op = &ceph_file_iops;
  1193			inode->i_fop = &ceph_file_fops;
  1194			break;
  1195		case S_IFLNK:
  1196			if (!ci->i_symlink) {
  1197				u32 symlen = iinfo->symlink_len;
  1198				char *sym;
  1199	
  1200				spin_unlock(&ci->i_ceph_lock);
  1201	
  1202				if (IS_ENCRYPTED(inode)) {
  1203					if (symlen != i_size_read(inode))
  1204						pr_err_client(cl,
  1205							"%p %llx.%llx BAD symlink size %lld\n",
  1206							inode, ceph_vinop(inode),
  1207							i_size_read(inode));
  1208	
  1209					err = decode_encrypted_symlink(mdsc, iinfo->symlink,
  1210								       symlen, (u8 **)&sym);
  1211					if (err < 0) {
  1212						pr_err_client(cl,
  1213							"decoding encrypted symlink failed: %d\n",
  1214							err);
  1215						goto out;
  1216					}
  1217					symlen = err;
  1218					i_size_write(inode, symlen);
  1219					inode->i_blocks = calc_inode_blocks(symlen);
  1220				} else {
  1221					if (symlen != i_size_read(inode)) {
  1222						pr_err_client(cl,
  1223							"%p %llx.%llx BAD symlink size %lld\n",
  1224							inode, ceph_vinop(inode),
  1225							i_size_read(inode));
  1226						i_size_write(inode, symlen);
  1227						inode->i_blocks = calc_inode_blocks(symlen);
  1228					}
  1229	
  1230					err = -ENOMEM;
  1231					sym = kstrndup(iinfo->symlink, symlen, GFP_NOFS);
  1232					if (!sym)
  1233						goto out;
  1234				}
  1235	
  1236				spin_lock(&ci->i_ceph_lock);
  1237				if (!ci->i_symlink)
  1238					ci->i_symlink = sym;
  1239				else
  1240					kfree(sym); /* lost a race */
  1241			}
  1242	
  1243			if (IS_ENCRYPTED(inode)) {
  1244				/*
  1245				 * Encrypted symlinks need to be decrypted before we can
  1246				 * cache their targets in i_link. Don't touch it here.
  1247				 */
  1248				inode->i_op = &ceph_encrypted_symlink_iops;
  1249			} else {
  1250				inode->i_link = ci->i_symlink;
  1251				inode->i_op = &ceph_symlink_iops;
  1252			}
  1253			break;
  1254		case S_IFDIR:
  1255			inode->i_op = &ceph_dir_iops;
  1256			inode->i_fop = &ceph_dir_fops;
  1257			break;
  1258		default:
  1259			pr_err_client(cl, "%p %llx.%llx BAD mode 0%o\n", inode,
  1260				      ceph_vinop(inode), inode->i_mode);
  1261		}
  1262	
  1263		/* were we issued a capability? */
  1264		if (info_caps) {
  1265			if (ceph_snap(inode) == CEPH_NOSNAP) {
  1266				ceph_add_cap(inode, session,
  1267					     le64_to_cpu(info->cap.cap_id),
  1268					     info_caps,
  1269					     le32_to_cpu(info->cap.wanted),
  1270					     le32_to_cpu(info->cap.seq),
  1271					     le32_to_cpu(info->cap.mseq),
  1272					     le64_to_cpu(info->cap.realm),
  1273					     info->cap.flags, &new_cap);
  1274	
  1275				/* set dir completion flag? */
  1276				if (S_ISDIR(inode->i_mode) &&
  1277				    ci->i_files == 0 && ci->i_subdirs == 0 &&
  1278				    (info_caps & CEPH_CAP_FILE_SHARED) &&
  1279				    (issued & CEPH_CAP_FILE_EXCL) == 0 &&
  1280				    !__ceph_dir_is_complete(ci)) {
  1281					doutc(cl, " marking %p complete (empty)\n",
  1282					      inode);
  1283					i_size_write(inode, 0);
  1284					__ceph_dir_set_complete(ci,
  1285						atomic64_read(&ci->i_release_count),
  1286						atomic64_read(&ci->i_ordered_count));
  1287				}
  1288	
  1289				wake = true;
  1290			} else {
  1291				doutc(cl, " %p got snap_caps %s\n", inode,
  1292				      ceph_cap_string(info_caps));
  1293				ci->i_snap_caps |= info_caps;
  1294			}
  1295		}
  1296	
  1297		if (iinfo->inline_version > 0 &&
  1298		    iinfo->inline_version >= ci->i_inline_version) {
  1299			int cache_caps = CEPH_CAP_FILE_CACHE | CEPH_CAP_FILE_LAZYIO;
  1300			ci->i_inline_version = iinfo->inline_version;
  1301			if (ceph_has_inline_data(ci) &&
  1302			    (locked_folio || (info_caps & cache_caps)))
  1303				fill_inline = true;
  1304		}
  1305	
  1306		if (cap_fmode >= 0) {
  1307			if (!info_caps)
  1308				pr_warn_client(cl, "mds issued no caps on %llx.%llx\n",
  1309					       ceph_vinop(inode));
  1310			__ceph_touch_fmode(ci, mdsc, cap_fmode);
  1311		}
  1312	
  1313		spin_unlock(&ci->i_ceph_lock);
  1314	
  1315		ceph_fscache_register_inode_cookie(inode);
  1316	
  1317		if (fill_inline)
  1318			ceph_fill_inline_data(inode, locked_folio,
  1319					      iinfo->inline_data, iinfo->inline_len);
  1320	
  1321		if (wake)
  1322			wake_up_all(&ci->i_cap_wq);
  1323	
  1324		/* queue truncate if we saw i_size decrease */
  1325		if (queue_trunc)
  1326			ceph_queue_vmtruncate(inode);
  1327	
  1328		/* populate frag tree */
  1329		if (S_ISDIR(inode->i_mode))
  1330			ceph_fill_fragtree(inode, &info->fragtree, dirinfo);
  1331	
  1332		/* update delegation info? */
  1333		if (dirinfo)
  1334			ceph_fill_dirfrag(inode, dirinfo);
  1335	
  1336		err = 0;
  1337	out:
  1338		if (new_cap)
  1339			ceph_put_cap(mdsc, new_cap);
  1340		ceph_buffer_put(old_blob);
  1341		ceph_buffer_put(xattr_blob);
  1342		ceph_put_string(pool_ns);
  1343		return err;
  1344	}
  1345	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2024-09-07 22:51 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-09-07 22:50 [dhowells-fs:ceph-iter 61/61] fs/ceph/inode.c:1057:9: error: no member named 'min_bshift' in 'struct netfs_inode' kernel test robot

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.