public inbox for llvm@lists.linux.dev
 help / color / mirror / Atom feed
* [bcachefs:bcachefs-testing 6/6] fs/bcachefs/dirent.c:436:2: error: expected expression
@ 2024-01-22 10:27 kernel test robot
  0 siblings, 0 replies; only message in thread
From: kernel test robot @ 2024-01-22 10:27 UTC (permalink / raw)
  To: Kent Overstreet; +Cc: llvm, oe-kbuild-all, Kent Overstreet

tree:   https://evilpiepirate.org/git/bcachefs.git bcachefs-testing
head:   05b33431c0012466dd40e9949d475adfd45dfc9b
commit: 05b33431c0012466dd40e9949d475adfd45dfc9b [6/6] bcachefs: Subvolumes may now be renamed
config: i386-buildonly-randconfig-001-20240122 (https://download.01.org/0day-ci/archive/20240122/202401221837.UYmBMEZ7-lkp@intel.com/config)
compiler: ClangBuiltLinux clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240122/202401221837.UYmBMEZ7-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/202401221837.UYmBMEZ7-lkp@intel.com/

All errors (new ones prefixed by >>):

>> fs/bcachefs/dirent.c:436:2: error: expected expression
     436 |         bool delete_src = bkey_s_c_to_dirent(old_src).v->d_type == DT_SUBVOL &&
         |         ^
>> fs/bcachefs/dirent.c:443:7: error: use of undeclared identifier 'delete_src'; did you mean 'delete_dst'?
     443 |         if (!delete_src || !bkey_deleted(&new_src->k)) {
         |              ^~~~~~~~~~
         |              delete_dst
   fs/bcachefs/dirent.c:439:7: note: 'delete_dst' declared here
     439 |         bool delete_dst = old_dst.k &&
         |              ^
   fs/bcachefs/dirent.c:449:6: error: use of undeclared identifier 'delete_src'; did you mean 'delete_dst'?
     449 |         if (delete_src) {
         |             ^~~~~~~~~~
         |             delete_dst
   fs/bcachefs/dirent.c:439:7: note: 'delete_dst' declared here
     439 |         bool delete_dst = old_dst.k &&
         |              ^
   3 errors generated.


vim +436 fs/bcachefs/dirent.c

   282	
   283	int bch2_dirent_rename(struct btree_trans *trans,
   284			subvol_inum src_dir, struct bch_hash_info *src_hash,
   285			subvol_inum dst_dir, struct bch_hash_info *dst_hash,
   286			const struct qstr *src_name, subvol_inum *src_inum, u64 *src_offset,
   287			const struct qstr *dst_name, subvol_inum *dst_inum, u64 *dst_offset,
   288			enum bch_rename_mode mode)
   289	{
   290		struct btree_iter src_iter = { NULL };
   291		struct btree_iter dst_iter = { NULL };
   292		struct bkey_s_c old_src, old_dst = bkey_s_c_null;
   293		struct bkey_i_dirent *new_src = NULL, *new_dst = NULL;
   294		struct bpos dst_pos =
   295			POS(dst_dir.inum, bch2_dirent_hash(dst_hash, dst_name));
   296		unsigned src_update_flags = 0;
   297		int ret = 0;
   298	
   299		memset(src_inum, 0, sizeof(*src_inum));
   300		memset(dst_inum, 0, sizeof(*dst_inum));
   301	
   302		/* Lookup src: */
   303		ret = bch2_hash_lookup(trans, &src_iter, bch2_dirent_hash_desc,
   304				       src_hash, src_dir, src_name,
   305				       BTREE_ITER_INTENT);
   306		if (ret)
   307			goto out;
   308	
   309		old_src = bch2_btree_iter_peek_slot(&src_iter);
   310		ret = bkey_err(old_src);
   311		if (ret)
   312			goto out;
   313	
   314		ret = bch2_dirent_read_target(trans, src_dir,
   315				bkey_s_c_to_dirent(old_src), src_inum);
   316		if (ret)
   317			goto out;
   318	
   319		/* Lookup dst: */
   320		if (mode == BCH_RENAME) {
   321			/*
   322			 * Note that we're _not_ checking if the target already exists -
   323			 * we're relying on the VFS to do that check for us for
   324			 * correctness:
   325			 */
   326			ret = bch2_hash_hole(trans, &dst_iter, bch2_dirent_hash_desc,
   327					     dst_hash, dst_dir, dst_name);
   328			if (ret)
   329				goto out;
   330		} else {
   331			ret = bch2_hash_lookup(trans, &dst_iter, bch2_dirent_hash_desc,
   332					       dst_hash, dst_dir, dst_name,
   333					       BTREE_ITER_INTENT);
   334			if (ret)
   335				goto out;
   336	
   337			old_dst = bch2_btree_iter_peek_slot(&dst_iter);
   338			ret = bkey_err(old_dst);
   339			if (ret)
   340				goto out;
   341	
   342			ret = bch2_dirent_read_target(trans, dst_dir,
   343					bkey_s_c_to_dirent(old_dst), dst_inum);
   344			if (ret)
   345				goto out;
   346		}
   347	
   348		if (mode != BCH_RENAME_EXCHANGE)
   349			*src_offset = dst_iter.pos.offset;
   350	
   351		/* Create new dst key: */
   352		new_dst = dirent_create_key(trans, dst_dir, 0, dst_name, 0);
   353		ret = PTR_ERR_OR_ZERO(new_dst);
   354		if (ret)
   355			goto out;
   356	
   357		dirent_copy_target(new_dst, bkey_s_c_to_dirent(old_src));
   358		new_dst->k.p = dst_iter.pos;
   359	
   360		/* Create new src key: */
   361		if (mode == BCH_RENAME_EXCHANGE) {
   362			new_src = dirent_create_key(trans, src_dir, 0, src_name, 0);
   363			ret = PTR_ERR_OR_ZERO(new_src);
   364			if (ret)
   365				goto out;
   366	
   367			dirent_copy_target(new_src, bkey_s_c_to_dirent(old_dst));
   368			new_src->k.p = src_iter.pos;
   369		} else {
   370			new_src = bch2_trans_kmalloc(trans, sizeof(struct bkey_i));
   371			ret = PTR_ERR_OR_ZERO(new_src);
   372			if (ret)
   373				goto out;
   374	
   375			bkey_init(&new_src->k);
   376			new_src->k.p = src_iter.pos;
   377	
   378			if (bkey_le(dst_pos, src_iter.pos) &&
   379			    bkey_lt(src_iter.pos, dst_iter.pos)) {
   380				/*
   381				 * We have a hash collision for the new dst key,
   382				 * and new_src - the key we're deleting - is between
   383				 * new_dst's hashed slot and the slot we're going to be
   384				 * inserting it into - oops.  This will break the hash
   385				 * table if we don't deal with it:
   386				 */
   387				if (mode == BCH_RENAME) {
   388					/*
   389					 * If we're not overwriting, we can just insert
   390					 * new_dst at the src position:
   391					 */
   392					new_src = new_dst;
   393					new_src->k.p = src_iter.pos;
   394					goto out_set_src;
   395				} else {
   396					/* If we're overwriting, we can't insert new_dst
   397					 * at a different slot because it has to
   398					 * overwrite old_dst - just make sure to use a
   399					 * whiteout when deleting src:
   400					 */
   401					new_src->k.type = KEY_TYPE_hash_whiteout;
   402				}
   403			} else {
   404				/* Check if we need a whiteout to delete src: */
   405				ret = bch2_hash_needs_whiteout(trans, bch2_dirent_hash_desc,
   406							       src_hash, &src_iter);
   407				if (ret < 0)
   408					goto out;
   409	
   410				if (ret)
   411					new_src->k.type = KEY_TYPE_hash_whiteout;
   412			}
   413		}
   414	
   415		if (new_dst->v.d_type == DT_SUBVOL)
   416			new_dst->v.d_parent_subvol = cpu_to_le32(dst_dir.subvol);
   417	
   418		if ((mode == BCH_RENAME_EXCHANGE) &&
   419		    new_src->v.d_type == DT_SUBVOL)
   420			new_src->v.d_parent_subvol = cpu_to_le32(src_dir.subvol);
   421	
   422		ret = bch2_trans_update(trans, &dst_iter, &new_dst->k_i, 0);
   423		if (ret)
   424			goto out;
   425	out_set_src:
   426		/*
   427		 * If we're deleting a subvolume we need to really delete the dirent,
   428		 * not just emit a whiteout in the current snapshot - there can only be
   429		 * single dirent that points to a given subvolume.
   430		 *
   431		 * IOW, we don't maintain multiple versions in different snapshots of
   432		 * dirents that point to subvolumes - dirents that point to subvolumes
   433		 * are only visible in one particular subvolume so it's not necessary,
   434		 * and it would be particularly confusing for fsck to have to deal with.
   435		 */
 > 436		bool delete_src = bkey_s_c_to_dirent(old_src).v->d_type == DT_SUBVOL &&
   437			new_src->k.p.snapshot != old_src.k->p.snapshot;
   438	
   439		bool delete_dst = old_dst.k &&
   440			bkey_s_c_to_dirent(old_dst).v->d_type == DT_SUBVOL &&
   441			new_dst->k.p.snapshot != old_dst.k->p.snapshot;
   442	
 > 443		if (!delete_src || !bkey_deleted(&new_src->k)) {
   444			ret = bch2_trans_update(trans, &src_iter, &new_src->k_i, src_update_flags);
   445			if (ret)
   446				goto out;
   447		}
   448	
   449		if (delete_src) {
   450			bch2_btree_iter_set_snapshot(&src_iter, old_src.k->p.snapshot);
   451			ret =   bch2_btree_iter_traverse(&src_iter) ?:
   452				bch2_btree_delete_at(trans, &src_iter, BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE);
   453			if (ret)
   454				goto out;
   455		}
   456	
   457		if (delete_dst) {
   458			bch2_btree_iter_set_snapshot(&dst_iter, old_dst.k->p.snapshot);
   459			ret =   bch2_btree_iter_traverse(&dst_iter) ?:
   460				bch2_btree_delete_at(trans, &dst_iter, BTREE_UPDATE_INTERNAL_SNAPSHOT_NODE);
   461			if (ret)
   462				goto out;
   463		}
   464	
   465		if (mode == BCH_RENAME_EXCHANGE)
   466			*src_offset = new_src->k.p.offset;
   467		*dst_offset = new_dst->k.p.offset;
   468	out:
   469		bch2_trans_iter_exit(trans, &src_iter);
   470		bch2_trans_iter_exit(trans, &dst_iter);
   471		return ret;
   472	}
   473	

-- 
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-01-22 10:28 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-01-22 10:27 [bcachefs:bcachefs-testing 6/6] fs/bcachefs/dirent.c:436:2: error: expected expression kernel test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox