All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: [jlayton:ceph-fscrypt-size 38/40] fs/ceph/caps.c:4189:43: error: incompatible type for argument 3 of 'parse_fscrypt_fields'
Date: Wed, 25 Aug 2021 02:59:39 +0800	[thread overview]
Message-ID: <202108250232.C2AxNGcn-lkp@intel.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 13790 bytes --]

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux.git ceph-fscrypt-size
head:   a17ec2cafbd2fc0e04e8787810bec64849190db2
commit: 43bdcb97d537c60bc43663c0219a76701332618e [38/40] ceph: handle fscrypt fields in cap messages from MDS
config: i386-randconfig-a006-20210824 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
        # https://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux.git/commit/?id=43bdcb97d537c60bc43663c0219a76701332618e
        git remote add jlayton https://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux.git
        git fetch --no-tags jlayton ceph-fscrypt-size
        git checkout 43bdcb97d537c60bc43663c0219a76701332618e
        # save the attached .config to linux build tree
        mkdir build_dir
        make W=1 O=build_dir ARCH=i386 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 fs/ceph/super.h:29,
                    from fs/ceph/caps.c:13:
   fs/ceph/crypto.h:6: error: unterminated #ifndef
       6 | #ifndef _CEPH_CRYPTO_H
         | 
   In file included from fs/ceph/caps.c:16:
   fs/ceph/crypto.h:6: error: unterminated #ifndef
       6 | #ifndef _CEPH_CRYPTO_H
         | 
   In file included from include/linux/ceph/osdmap.h:7,
                    from include/linux/ceph/osd_client.h:14,
                    from include/linux/ceph/libceph.h:24,
                    from fs/ceph/super.h:22,
                    from fs/ceph/caps.c:13:
   fs/ceph/caps.c: In function 'parse_fscrypt_fields':
>> include/linux/ceph/decode.h:71:5: error: lvalue required as left operand of assignment
      71 |   v = ceph_decode_32(p);    \
         |     ^
   fs/ceph/caps.c:4058:2: note: in expansion of macro 'ceph_decode_32_safe'
    4058 |  ceph_decode_32_safe(p, end, &len, bad);
         |  ^~~~~~~~~~~~~~~~~~~
>> include/linux/ceph/decode.h:71:5: error: lvalue required as left operand of assignment
      71 |   v = ceph_decode_32(p);    \
         |     ^
   fs/ceph/caps.c:4061:2: note: in expansion of macro 'ceph_decode_32_safe'
    4061 |  ceph_decode_32_safe(p, end, &len, bad);
         |  ^~~~~~~~~~~~~~~~~~~
   fs/ceph/caps.c: In function 'ceph_handle_caps':
>> fs/ceph/caps.c:4189:43: error: incompatible type for argument 3 of 'parse_fscrypt_fields'
    4189 |   int ret = parse_fscrypt_fields(&p, end, &extra_info);
         |                                           ^~~~~~~~~~~
         |                                           |
         |                                           struct cap_extra_info *
   fs/ceph/caps.c:4053:76: note: expected 'struct cap_extra_info' but argument is of type 'struct cap_extra_info *'
    4053 | static int parse_fscrypt_fields(void **p, void *end, struct cap_extra_info extra)
         |                                                      ~~~~~~~~~~~~~~~~~~~~~~^~~~~
   fs/ceph/caps.c: In function 'ceph_encode_dentry_release':
   fs/ceph/caps.c:4640:15: error: implicit declaration of function 'ceph_encode_encrypted_fname'; did you mean 'ceph_encode_dentry_release'? [-Werror=implicit-function-declaration]
    4640 |    int ret2 = ceph_encode_encrypted_fname(dir, dentry, *p);
         |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~
         |               ceph_encode_dentry_release
   cc1: some warnings being treated as errors


vim +/parse_fscrypt_fields +4189 fs/ceph/caps.c

  4027	
  4028	#ifdef CONFIG_FS_ENCRYPTION
  4029	static int parse_fscrypt_fields(void **p, void *end, struct cap_extra_info *extra)
  4030	{
  4031		u32 len;
  4032	
  4033		ceph_decode_32_safe(p, end, extra->fscrypt_auth_len, bad);
  4034		if (extra->fscrypt_auth_len) {
  4035			ceph_decode_need(p, end, extra->fscrypt_auth_len, bad);
  4036			extra->fscrypt_auth = kmalloc(extra->fscrypt_auth_len, GFP_KERNEL);
  4037			if (!extra->fscrypt_auth)
  4038				return -ENOMEM;
  4039			ceph_decode_copy_safe(p, end, extra->fscrypt_auth,
  4040						extra->fscrypt_auth_len, bad);
  4041		}
  4042	
  4043		ceph_decode_32_safe(p, end, len, bad);
  4044		if (len == sizeof(u64))
  4045			ceph_decode_64_safe(p, end, extra->fscrypt_file_size, bad);
  4046		else
  4047			ceph_decode_skip_n(p, end, len, bad);
  4048		return 0;
  4049	bad:
  4050		return -EIO;
  4051	}
  4052	#else
  4053	static int parse_fscrypt_fields(void **p, void *end, struct cap_extra_info extra)
  4054	{
  4055		u32 len;
  4056	
  4057		/* Don't care about these fields unless we're encryption-capable */
  4058		ceph_decode_32_safe(p, end, &len, bad);
  4059		if (len)
  4060			ceph_decode_skip_n(p, end, len, bad);
> 4061		ceph_decode_32_safe(p, end, &len, bad);
  4062		if (len)
  4063			ceph_decode_skip_n(p, end, len, bad);
  4064		return 0;
  4065	bad:
  4066		return -EIO;
  4067	}
  4068	#endif
  4069	
  4070	/*
  4071	 * Handle a caps message from the MDS.
  4072	 *
  4073	 * Identify the appropriate session, inode, and call the right handler
  4074	 * based on the cap op.
  4075	 */
  4076	void ceph_handle_caps(struct ceph_mds_session *session,
  4077			      struct ceph_msg *msg)
  4078	{
  4079		struct ceph_mds_client *mdsc = session->s_mdsc;
  4080		struct inode *inode;
  4081		struct ceph_inode_info *ci;
  4082		struct ceph_cap *cap;
  4083		struct ceph_mds_caps *h;
  4084		struct ceph_mds_cap_peer *peer = NULL;
  4085		struct ceph_snap_realm *realm = NULL;
  4086		int op;
  4087		int msg_version = le16_to_cpu(msg->hdr.version);
  4088		u32 seq, mseq;
  4089		struct ceph_vino vino;
  4090		void *snaptrace;
  4091		size_t snaptrace_len;
  4092		void *p, *end;
  4093		struct cap_extra_info extra_info = {};
  4094		bool queue_trunc;
  4095	
  4096		dout("handle_caps from mds%d\n", session->s_mds);
  4097	
  4098		/* decode */
  4099		end = msg->front.iov_base + msg->front.iov_len;
  4100		if (msg->front.iov_len < sizeof(*h))
  4101			goto bad;
  4102		h = msg->front.iov_base;
  4103		op = le32_to_cpu(h->op);
  4104		vino.ino = le64_to_cpu(h->ino);
  4105		vino.snap = CEPH_NOSNAP;
  4106		seq = le32_to_cpu(h->seq);
  4107		mseq = le32_to_cpu(h->migrate_seq);
  4108	
  4109		snaptrace = h + 1;
  4110		snaptrace_len = le32_to_cpu(h->snap_trace_len);
  4111		p = snaptrace + snaptrace_len;
  4112	
  4113		if (msg_version >= 2) {
  4114			u32 flock_len;
  4115			ceph_decode_32_safe(&p, end, flock_len, bad);
  4116			if (p + flock_len > end)
  4117				goto bad;
  4118			p += flock_len;
  4119		}
  4120	
  4121		if (msg_version >= 3) {
  4122			if (op == CEPH_CAP_OP_IMPORT) {
  4123				if (p + sizeof(*peer) > end)
  4124					goto bad;
  4125				peer = p;
  4126				p += sizeof(*peer);
  4127			} else if (op == CEPH_CAP_OP_EXPORT) {
  4128				/* recorded in unused fields */
  4129				peer = (void *)&h->size;
  4130			}
  4131		}
  4132	
  4133		if (msg_version >= 4) {
  4134			ceph_decode_64_safe(&p, end, extra_info.inline_version, bad);
  4135			ceph_decode_32_safe(&p, end, extra_info.inline_len, bad);
  4136			if (p + extra_info.inline_len > end)
  4137				goto bad;
  4138			extra_info.inline_data = p;
  4139			p += extra_info.inline_len;
  4140		}
  4141	
  4142		if (msg_version >= 5) {
  4143			struct ceph_osd_client	*osdc = &mdsc->fsc->client->osdc;
  4144			u32			epoch_barrier;
  4145	
  4146			ceph_decode_32_safe(&p, end, epoch_barrier, bad);
  4147			ceph_osdc_update_epoch_barrier(osdc, epoch_barrier);
  4148		}
  4149	
  4150		if (msg_version >= 8) {
  4151			u32 pool_ns_len;
  4152	
  4153			/* version >= 6 */
  4154			ceph_decode_skip_64(&p, end, bad);	// flush_tid
  4155			/* version >= 7 */
  4156			ceph_decode_skip_32(&p, end, bad);	// caller_uid
  4157			ceph_decode_skip_32(&p, end, bad);	// caller_gid
  4158			/* version >= 8 */
  4159			ceph_decode_32_safe(&p, end, pool_ns_len, bad);
  4160			if (pool_ns_len > 0) {
  4161				ceph_decode_need(&p, end, pool_ns_len, bad);
  4162				extra_info.pool_ns =
  4163					ceph_find_or_create_string(p, pool_ns_len);
  4164				p += pool_ns_len;
  4165			}
  4166		}
  4167	
  4168		if (msg_version >= 9) {
  4169			struct ceph_timespec *btime;
  4170	
  4171			if (p + sizeof(*btime) > end)
  4172				goto bad;
  4173			btime = p;
  4174			ceph_decode_timespec64(&extra_info.btime, btime);
  4175			p += sizeof(*btime);
  4176			ceph_decode_64_safe(&p, end, extra_info.change_attr, bad);
  4177		}
  4178	
  4179		if (msg_version >= 11) {
  4180			/* version >= 10 */
  4181			ceph_decode_skip_32(&p, end, bad); // flags
  4182			/* version >= 11 */
  4183			extra_info.dirstat_valid = true;
  4184			ceph_decode_64_safe(&p, end, extra_info.nfiles, bad);
  4185			ceph_decode_64_safe(&p, end, extra_info.nsubdirs, bad);
  4186		}
  4187	
  4188		if (msg_version >= 12) {
> 4189			int ret = parse_fscrypt_fields(&p, end, &extra_info);
  4190			if (ret)
  4191				goto bad;
  4192		}
  4193	
  4194		/* lookup ino */
  4195		inode = ceph_find_inode(mdsc->fsc->sb, vino);
  4196		ci = ceph_inode(inode);
  4197		dout(" op %s ino %llx.%llx inode %p\n", ceph_cap_op_name(op), vino.ino,
  4198		     vino.snap, inode);
  4199	
  4200		mutex_lock(&session->s_mutex);
  4201		inc_session_sequence(session);
  4202		dout(" mds%d seq %lld cap seq %u\n", session->s_mds, session->s_seq,
  4203		     (unsigned)seq);
  4204	
  4205		if (!inode) {
  4206			if (op == CEPH_CAP_OP_FLUSH_ACK)
  4207				pr_info("%s: can't find ino %llx:%llx for flush_ack!\n",
  4208					__func__, vino.snap, vino.ino);
  4209			else
  4210				dout(" i don't have ino %llx\n", vino.ino);
  4211	
  4212			if (op == CEPH_CAP_OP_IMPORT) {
  4213				cap = ceph_get_cap(mdsc, NULL);
  4214				cap->cap_ino = vino.ino;
  4215				cap->queue_release = 1;
  4216				cap->cap_id = le64_to_cpu(h->cap_id);
  4217				cap->mseq = mseq;
  4218				cap->seq = seq;
  4219				cap->issue_seq = seq;
  4220				spin_lock(&session->s_cap_lock);
  4221				__ceph_queue_cap_release(session, cap);
  4222				spin_unlock(&session->s_cap_lock);
  4223			}
  4224			goto flush_cap_releases;
  4225		}
  4226	
  4227		/* these will work even if we don't have a cap yet */
  4228		switch (op) {
  4229		case CEPH_CAP_OP_FLUSHSNAP_ACK:
  4230			handle_cap_flushsnap_ack(inode, le64_to_cpu(msg->hdr.tid),
  4231						 h, session);
  4232			goto done;
  4233	
  4234		case CEPH_CAP_OP_EXPORT:
  4235			handle_cap_export(inode, h, peer, session);
  4236			goto done_unlocked;
  4237	
  4238		case CEPH_CAP_OP_IMPORT:
  4239			realm = NULL;
  4240			if (snaptrace_len) {
  4241				down_write(&mdsc->snap_rwsem);
  4242				ceph_update_snap_trace(mdsc, snaptrace,
  4243						       snaptrace + snaptrace_len,
  4244						       false, &realm);
  4245				downgrade_write(&mdsc->snap_rwsem);
  4246			} else {
  4247				down_read(&mdsc->snap_rwsem);
  4248			}
  4249			spin_lock(&ci->i_ceph_lock);
  4250			handle_cap_import(mdsc, inode, h, peer, session,
  4251					  &cap, &extra_info.issued);
  4252			handle_cap_grant(inode, session, cap,
  4253					 h, msg->middle, &extra_info);
  4254			if (realm)
  4255				ceph_put_snap_realm(mdsc, realm);
  4256			goto done_unlocked;
  4257		}
  4258	
  4259		/* the rest require a cap */
  4260		spin_lock(&ci->i_ceph_lock);
  4261		cap = __get_cap_for_mds(ceph_inode(inode), session->s_mds);
  4262		if (!cap) {
  4263			dout(" no cap on %p ino %llx:%llx from mds%d\n",
  4264			     inode, ceph_ino(inode), ceph_snap(inode),
  4265			     session->s_mds);
  4266			spin_unlock(&ci->i_ceph_lock);
  4267			if (op == CEPH_CAP_OP_FLUSH_ACK)
  4268				pr_info("%s: no cap on %p ino %llx:%llx from mds%d for flush_ack!\n",
  4269					__func__, inode, ceph_ino(inode),
  4270					ceph_snap(inode), session->s_mds);
  4271			goto flush_cap_releases;
  4272		}
  4273	
  4274		/* note that each of these drops i_ceph_lock for us */
  4275		switch (op) {
  4276		case CEPH_CAP_OP_REVOKE:
  4277		case CEPH_CAP_OP_GRANT:
  4278			__ceph_caps_issued(ci, &extra_info.issued);
  4279			extra_info.issued |= __ceph_caps_dirty(ci);
  4280			handle_cap_grant(inode, session, cap,
  4281					 h, msg->middle, &extra_info);
  4282			goto done_unlocked;
  4283	
  4284		case CEPH_CAP_OP_FLUSH_ACK:
  4285			handle_cap_flush_ack(inode, le64_to_cpu(msg->hdr.tid),
  4286					     h, session, cap);
  4287			break;
  4288	
  4289		case CEPH_CAP_OP_TRUNC:
  4290			queue_trunc = handle_cap_trunc(inode, h, session,
  4291							&extra_info);
  4292			spin_unlock(&ci->i_ceph_lock);
  4293			if (queue_trunc)
  4294				ceph_queue_vmtruncate(inode);
  4295			break;
  4296	
  4297		default:
  4298			spin_unlock(&ci->i_ceph_lock);
  4299			pr_err("ceph_handle_caps: unknown cap op %d %s\n", op,
  4300			       ceph_cap_op_name(op));
  4301		}
  4302	
  4303	done:
  4304		mutex_unlock(&session->s_mutex);
  4305	done_unlocked:
  4306		iput(inode);
  4307	out:
  4308		ceph_put_string(extra_info.pool_ns);
  4309		kfree(extra_info.fscrypt_auth);
  4310		return;
  4311	
  4312	flush_cap_releases:
  4313		/*
  4314		 * send any cap release message to try to move things
  4315		 * along for the mds (who clearly thinks we still have this
  4316		 * cap).
  4317		 */
  4318		ceph_flush_cap_releases(mdsc, session);
  4319		goto done;
  4320	bad:
  4321		pr_err("ceph_handle_caps: corrupt message\n");
  4322		ceph_msg_dump(msg);
  4323		goto out;
  4324	}
  4325	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 35799 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: Jeff Layton <jlayton@kernel.org>
Cc: kbuild-all@lists.01.org, linux-kernel@vger.kernel.org
Subject: [jlayton:ceph-fscrypt-size 38/40] fs/ceph/caps.c:4189:43: error: incompatible type for argument 3 of 'parse_fscrypt_fields'
Date: Wed, 25 Aug 2021 02:59:39 +0800	[thread overview]
Message-ID: <202108250232.C2AxNGcn-lkp@intel.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 13420 bytes --]

tree:   https://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux.git ceph-fscrypt-size
head:   a17ec2cafbd2fc0e04e8787810bec64849190db2
commit: 43bdcb97d537c60bc43663c0219a76701332618e [38/40] ceph: handle fscrypt fields in cap messages from MDS
config: i386-randconfig-a006-20210824 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce (this is a W=1 build):
        # https://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux.git/commit/?id=43bdcb97d537c60bc43663c0219a76701332618e
        git remote add jlayton https://git.kernel.org/pub/scm/linux/kernel/git/jlayton/linux.git
        git fetch --no-tags jlayton ceph-fscrypt-size
        git checkout 43bdcb97d537c60bc43663c0219a76701332618e
        # save the attached .config to linux build tree
        mkdir build_dir
        make W=1 O=build_dir ARCH=i386 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 fs/ceph/super.h:29,
                    from fs/ceph/caps.c:13:
   fs/ceph/crypto.h:6: error: unterminated #ifndef
       6 | #ifndef _CEPH_CRYPTO_H
         | 
   In file included from fs/ceph/caps.c:16:
   fs/ceph/crypto.h:6: error: unterminated #ifndef
       6 | #ifndef _CEPH_CRYPTO_H
         | 
   In file included from include/linux/ceph/osdmap.h:7,
                    from include/linux/ceph/osd_client.h:14,
                    from include/linux/ceph/libceph.h:24,
                    from fs/ceph/super.h:22,
                    from fs/ceph/caps.c:13:
   fs/ceph/caps.c: In function 'parse_fscrypt_fields':
>> include/linux/ceph/decode.h:71:5: error: lvalue required as left operand of assignment
      71 |   v = ceph_decode_32(p);    \
         |     ^
   fs/ceph/caps.c:4058:2: note: in expansion of macro 'ceph_decode_32_safe'
    4058 |  ceph_decode_32_safe(p, end, &len, bad);
         |  ^~~~~~~~~~~~~~~~~~~
>> include/linux/ceph/decode.h:71:5: error: lvalue required as left operand of assignment
      71 |   v = ceph_decode_32(p);    \
         |     ^
   fs/ceph/caps.c:4061:2: note: in expansion of macro 'ceph_decode_32_safe'
    4061 |  ceph_decode_32_safe(p, end, &len, bad);
         |  ^~~~~~~~~~~~~~~~~~~
   fs/ceph/caps.c: In function 'ceph_handle_caps':
>> fs/ceph/caps.c:4189:43: error: incompatible type for argument 3 of 'parse_fscrypt_fields'
    4189 |   int ret = parse_fscrypt_fields(&p, end, &extra_info);
         |                                           ^~~~~~~~~~~
         |                                           |
         |                                           struct cap_extra_info *
   fs/ceph/caps.c:4053:76: note: expected 'struct cap_extra_info' but argument is of type 'struct cap_extra_info *'
    4053 | static int parse_fscrypt_fields(void **p, void *end, struct cap_extra_info extra)
         |                                                      ~~~~~~~~~~~~~~~~~~~~~~^~~~~
   fs/ceph/caps.c: In function 'ceph_encode_dentry_release':
   fs/ceph/caps.c:4640:15: error: implicit declaration of function 'ceph_encode_encrypted_fname'; did you mean 'ceph_encode_dentry_release'? [-Werror=implicit-function-declaration]
    4640 |    int ret2 = ceph_encode_encrypted_fname(dir, dentry, *p);
         |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~
         |               ceph_encode_dentry_release
   cc1: some warnings being treated as errors


vim +/parse_fscrypt_fields +4189 fs/ceph/caps.c

  4027	
  4028	#ifdef CONFIG_FS_ENCRYPTION
  4029	static int parse_fscrypt_fields(void **p, void *end, struct cap_extra_info *extra)
  4030	{
  4031		u32 len;
  4032	
  4033		ceph_decode_32_safe(p, end, extra->fscrypt_auth_len, bad);
  4034		if (extra->fscrypt_auth_len) {
  4035			ceph_decode_need(p, end, extra->fscrypt_auth_len, bad);
  4036			extra->fscrypt_auth = kmalloc(extra->fscrypt_auth_len, GFP_KERNEL);
  4037			if (!extra->fscrypt_auth)
  4038				return -ENOMEM;
  4039			ceph_decode_copy_safe(p, end, extra->fscrypt_auth,
  4040						extra->fscrypt_auth_len, bad);
  4041		}
  4042	
  4043		ceph_decode_32_safe(p, end, len, bad);
  4044		if (len == sizeof(u64))
  4045			ceph_decode_64_safe(p, end, extra->fscrypt_file_size, bad);
  4046		else
  4047			ceph_decode_skip_n(p, end, len, bad);
  4048		return 0;
  4049	bad:
  4050		return -EIO;
  4051	}
  4052	#else
  4053	static int parse_fscrypt_fields(void **p, void *end, struct cap_extra_info extra)
  4054	{
  4055		u32 len;
  4056	
  4057		/* Don't care about these fields unless we're encryption-capable */
  4058		ceph_decode_32_safe(p, end, &len, bad);
  4059		if (len)
  4060			ceph_decode_skip_n(p, end, len, bad);
> 4061		ceph_decode_32_safe(p, end, &len, bad);
  4062		if (len)
  4063			ceph_decode_skip_n(p, end, len, bad);
  4064		return 0;
  4065	bad:
  4066		return -EIO;
  4067	}
  4068	#endif
  4069	
  4070	/*
  4071	 * Handle a caps message from the MDS.
  4072	 *
  4073	 * Identify the appropriate session, inode, and call the right handler
  4074	 * based on the cap op.
  4075	 */
  4076	void ceph_handle_caps(struct ceph_mds_session *session,
  4077			      struct ceph_msg *msg)
  4078	{
  4079		struct ceph_mds_client *mdsc = session->s_mdsc;
  4080		struct inode *inode;
  4081		struct ceph_inode_info *ci;
  4082		struct ceph_cap *cap;
  4083		struct ceph_mds_caps *h;
  4084		struct ceph_mds_cap_peer *peer = NULL;
  4085		struct ceph_snap_realm *realm = NULL;
  4086		int op;
  4087		int msg_version = le16_to_cpu(msg->hdr.version);
  4088		u32 seq, mseq;
  4089		struct ceph_vino vino;
  4090		void *snaptrace;
  4091		size_t snaptrace_len;
  4092		void *p, *end;
  4093		struct cap_extra_info extra_info = {};
  4094		bool queue_trunc;
  4095	
  4096		dout("handle_caps from mds%d\n", session->s_mds);
  4097	
  4098		/* decode */
  4099		end = msg->front.iov_base + msg->front.iov_len;
  4100		if (msg->front.iov_len < sizeof(*h))
  4101			goto bad;
  4102		h = msg->front.iov_base;
  4103		op = le32_to_cpu(h->op);
  4104		vino.ino = le64_to_cpu(h->ino);
  4105		vino.snap = CEPH_NOSNAP;
  4106		seq = le32_to_cpu(h->seq);
  4107		mseq = le32_to_cpu(h->migrate_seq);
  4108	
  4109		snaptrace = h + 1;
  4110		snaptrace_len = le32_to_cpu(h->snap_trace_len);
  4111		p = snaptrace + snaptrace_len;
  4112	
  4113		if (msg_version >= 2) {
  4114			u32 flock_len;
  4115			ceph_decode_32_safe(&p, end, flock_len, bad);
  4116			if (p + flock_len > end)
  4117				goto bad;
  4118			p += flock_len;
  4119		}
  4120	
  4121		if (msg_version >= 3) {
  4122			if (op == CEPH_CAP_OP_IMPORT) {
  4123				if (p + sizeof(*peer) > end)
  4124					goto bad;
  4125				peer = p;
  4126				p += sizeof(*peer);
  4127			} else if (op == CEPH_CAP_OP_EXPORT) {
  4128				/* recorded in unused fields */
  4129				peer = (void *)&h->size;
  4130			}
  4131		}
  4132	
  4133		if (msg_version >= 4) {
  4134			ceph_decode_64_safe(&p, end, extra_info.inline_version, bad);
  4135			ceph_decode_32_safe(&p, end, extra_info.inline_len, bad);
  4136			if (p + extra_info.inline_len > end)
  4137				goto bad;
  4138			extra_info.inline_data = p;
  4139			p += extra_info.inline_len;
  4140		}
  4141	
  4142		if (msg_version >= 5) {
  4143			struct ceph_osd_client	*osdc = &mdsc->fsc->client->osdc;
  4144			u32			epoch_barrier;
  4145	
  4146			ceph_decode_32_safe(&p, end, epoch_barrier, bad);
  4147			ceph_osdc_update_epoch_barrier(osdc, epoch_barrier);
  4148		}
  4149	
  4150		if (msg_version >= 8) {
  4151			u32 pool_ns_len;
  4152	
  4153			/* version >= 6 */
  4154			ceph_decode_skip_64(&p, end, bad);	// flush_tid
  4155			/* version >= 7 */
  4156			ceph_decode_skip_32(&p, end, bad);	// caller_uid
  4157			ceph_decode_skip_32(&p, end, bad);	// caller_gid
  4158			/* version >= 8 */
  4159			ceph_decode_32_safe(&p, end, pool_ns_len, bad);
  4160			if (pool_ns_len > 0) {
  4161				ceph_decode_need(&p, end, pool_ns_len, bad);
  4162				extra_info.pool_ns =
  4163					ceph_find_or_create_string(p, pool_ns_len);
  4164				p += pool_ns_len;
  4165			}
  4166		}
  4167	
  4168		if (msg_version >= 9) {
  4169			struct ceph_timespec *btime;
  4170	
  4171			if (p + sizeof(*btime) > end)
  4172				goto bad;
  4173			btime = p;
  4174			ceph_decode_timespec64(&extra_info.btime, btime);
  4175			p += sizeof(*btime);
  4176			ceph_decode_64_safe(&p, end, extra_info.change_attr, bad);
  4177		}
  4178	
  4179		if (msg_version >= 11) {
  4180			/* version >= 10 */
  4181			ceph_decode_skip_32(&p, end, bad); // flags
  4182			/* version >= 11 */
  4183			extra_info.dirstat_valid = true;
  4184			ceph_decode_64_safe(&p, end, extra_info.nfiles, bad);
  4185			ceph_decode_64_safe(&p, end, extra_info.nsubdirs, bad);
  4186		}
  4187	
  4188		if (msg_version >= 12) {
> 4189			int ret = parse_fscrypt_fields(&p, end, &extra_info);
  4190			if (ret)
  4191				goto bad;
  4192		}
  4193	
  4194		/* lookup ino */
  4195		inode = ceph_find_inode(mdsc->fsc->sb, vino);
  4196		ci = ceph_inode(inode);
  4197		dout(" op %s ino %llx.%llx inode %p\n", ceph_cap_op_name(op), vino.ino,
  4198		     vino.snap, inode);
  4199	
  4200		mutex_lock(&session->s_mutex);
  4201		inc_session_sequence(session);
  4202		dout(" mds%d seq %lld cap seq %u\n", session->s_mds, session->s_seq,
  4203		     (unsigned)seq);
  4204	
  4205		if (!inode) {
  4206			if (op == CEPH_CAP_OP_FLUSH_ACK)
  4207				pr_info("%s: can't find ino %llx:%llx for flush_ack!\n",
  4208					__func__, vino.snap, vino.ino);
  4209			else
  4210				dout(" i don't have ino %llx\n", vino.ino);
  4211	
  4212			if (op == CEPH_CAP_OP_IMPORT) {
  4213				cap = ceph_get_cap(mdsc, NULL);
  4214				cap->cap_ino = vino.ino;
  4215				cap->queue_release = 1;
  4216				cap->cap_id = le64_to_cpu(h->cap_id);
  4217				cap->mseq = mseq;
  4218				cap->seq = seq;
  4219				cap->issue_seq = seq;
  4220				spin_lock(&session->s_cap_lock);
  4221				__ceph_queue_cap_release(session, cap);
  4222				spin_unlock(&session->s_cap_lock);
  4223			}
  4224			goto flush_cap_releases;
  4225		}
  4226	
  4227		/* these will work even if we don't have a cap yet */
  4228		switch (op) {
  4229		case CEPH_CAP_OP_FLUSHSNAP_ACK:
  4230			handle_cap_flushsnap_ack(inode, le64_to_cpu(msg->hdr.tid),
  4231						 h, session);
  4232			goto done;
  4233	
  4234		case CEPH_CAP_OP_EXPORT:
  4235			handle_cap_export(inode, h, peer, session);
  4236			goto done_unlocked;
  4237	
  4238		case CEPH_CAP_OP_IMPORT:
  4239			realm = NULL;
  4240			if (snaptrace_len) {
  4241				down_write(&mdsc->snap_rwsem);
  4242				ceph_update_snap_trace(mdsc, snaptrace,
  4243						       snaptrace + snaptrace_len,
  4244						       false, &realm);
  4245				downgrade_write(&mdsc->snap_rwsem);
  4246			} else {
  4247				down_read(&mdsc->snap_rwsem);
  4248			}
  4249			spin_lock(&ci->i_ceph_lock);
  4250			handle_cap_import(mdsc, inode, h, peer, session,
  4251					  &cap, &extra_info.issued);
  4252			handle_cap_grant(inode, session, cap,
  4253					 h, msg->middle, &extra_info);
  4254			if (realm)
  4255				ceph_put_snap_realm(mdsc, realm);
  4256			goto done_unlocked;
  4257		}
  4258	
  4259		/* the rest require a cap */
  4260		spin_lock(&ci->i_ceph_lock);
  4261		cap = __get_cap_for_mds(ceph_inode(inode), session->s_mds);
  4262		if (!cap) {
  4263			dout(" no cap on %p ino %llx:%llx from mds%d\n",
  4264			     inode, ceph_ino(inode), ceph_snap(inode),
  4265			     session->s_mds);
  4266			spin_unlock(&ci->i_ceph_lock);
  4267			if (op == CEPH_CAP_OP_FLUSH_ACK)
  4268				pr_info("%s: no cap on %p ino %llx:%llx from mds%d for flush_ack!\n",
  4269					__func__, inode, ceph_ino(inode),
  4270					ceph_snap(inode), session->s_mds);
  4271			goto flush_cap_releases;
  4272		}
  4273	
  4274		/* note that each of these drops i_ceph_lock for us */
  4275		switch (op) {
  4276		case CEPH_CAP_OP_REVOKE:
  4277		case CEPH_CAP_OP_GRANT:
  4278			__ceph_caps_issued(ci, &extra_info.issued);
  4279			extra_info.issued |= __ceph_caps_dirty(ci);
  4280			handle_cap_grant(inode, session, cap,
  4281					 h, msg->middle, &extra_info);
  4282			goto done_unlocked;
  4283	
  4284		case CEPH_CAP_OP_FLUSH_ACK:
  4285			handle_cap_flush_ack(inode, le64_to_cpu(msg->hdr.tid),
  4286					     h, session, cap);
  4287			break;
  4288	
  4289		case CEPH_CAP_OP_TRUNC:
  4290			queue_trunc = handle_cap_trunc(inode, h, session,
  4291							&extra_info);
  4292			spin_unlock(&ci->i_ceph_lock);
  4293			if (queue_trunc)
  4294				ceph_queue_vmtruncate(inode);
  4295			break;
  4296	
  4297		default:
  4298			spin_unlock(&ci->i_ceph_lock);
  4299			pr_err("ceph_handle_caps: unknown cap op %d %s\n", op,
  4300			       ceph_cap_op_name(op));
  4301		}
  4302	
  4303	done:
  4304		mutex_unlock(&session->s_mutex);
  4305	done_unlocked:
  4306		iput(inode);
  4307	out:
  4308		ceph_put_string(extra_info.pool_ns);
  4309		kfree(extra_info.fscrypt_auth);
  4310		return;
  4311	
  4312	flush_cap_releases:
  4313		/*
  4314		 * send any cap release message to try to move things
  4315		 * along for the mds (who clearly thinks we still have this
  4316		 * cap).
  4317		 */
  4318		ceph_flush_cap_releases(mdsc, session);
  4319		goto done;
  4320	bad:
  4321		pr_err("ceph_handle_caps: corrupt message\n");
  4322		ceph_msg_dump(msg);
  4323		goto out;
  4324	}
  4325	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 35799 bytes --]

             reply	other threads:[~2021-08-24 18:59 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-24 18:59 kernel test robot [this message]
2021-08-24 18:59 ` [jlayton:ceph-fscrypt-size 38/40] fs/ceph/caps.c:4189:43: error: incompatible type for argument 3 of 'parse_fscrypt_fields' kernel test robot

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=202108250232.C2AxNGcn-lkp@intel.com \
    --to=lkp@intel.com \
    --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.