* [dhowells-fs:ceph-iter 81/87] fs/ceph/inode.c:2503:50: warning: variable 'pos' is uninitialized when used here
@ 2026-09-05 0:33 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2026-09-05 0:33 UTC (permalink / raw)
To: David Howells; +Cc: oe-kbuild-all
tree: https://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs.git ceph-iter
head: 376ad9d4942bf11500931178bbeb965348f01057
commit: b761e790c5985b9648236697803fa145e76ee755 [81/87] ceph: Use netfslib [INCOMPLETE]
config: x86_64-allmodconfig (https://download.01.org/0day-ci/archive/20260905/202609050226.lrM92cgN-lkp@intel.com/config)
compiler: clang version 22.1.8 (https://github.com/llvm/llvm-project ca7933e47d3a3451d81e72ac174dcb5aa28b59d1)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260905/202609050226.lrM92cgN-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/202609050226.lrM92cgN-lkp@intel.com/
All warnings (new ones prefixed by >>):
fs/ceph/inode.c:2478:6: warning: variable 'header' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
2478 | if (ret < 0 && ret != -ENODATA)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
fs/ceph/inode.c:2536:15: note: uninitialized use occurs here
2536 | kunmap_local(header);
| ^~~~~~
fs/ceph/inode.c:2478:2: note: remove the 'if' if its condition is always false
2478 | if (ret < 0 && ret != -ENODATA)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2479 | goto out;
| ~~~~~~~~
fs/ceph/inode.c:2472:6: warning: variable 'header' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
2472 | if (ceph_bvecq_insert_frag(dbuf, 0, sizeof(*header), GFP_KERNEL) < 0 ||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2473 | ceph_bvecq_insert_frag(dbuf, 1, PAGE_SIZE, GFP_KERNEL) < 0)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/ceph/inode.c:2536:15: note: uninitialized use occurs here
2536 | kunmap_local(header);
| ^~~~~~
fs/ceph/inode.c:2472:2: note: remove the 'if' if its condition is always false
2472 | if (ceph_bvecq_insert_frag(dbuf, 0, sizeof(*header), GFP_KERNEL) < 0 ||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2473 | ceph_bvecq_insert_frag(dbuf, 1, PAGE_SIZE, GFP_KERNEL) < 0)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2474 | goto out;
| ~~~~~~~~
fs/ceph/inode.c:2472:6: warning: variable 'header' is used uninitialized whenever '||' condition is true [-Wsometimes-uninitialized]
2472 | if (ceph_bvecq_insert_frag(dbuf, 0, sizeof(*header), GFP_KERNEL) < 0 ||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/ceph/inode.c:2536:15: note: uninitialized use occurs here
2536 | kunmap_local(header);
| ^~~~~~
fs/ceph/inode.c:2472:6: note: remove the '||' if its condition is always false
2472 | if (ceph_bvecq_insert_frag(dbuf, 0, sizeof(*header), GFP_KERNEL) < 0 ||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/ceph/inode.c:2469:6: warning: variable 'header' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
2469 | if (!dbuf)
| ^~~~~
fs/ceph/inode.c:2536:15: note: uninitialized use occurs here
2536 | kunmap_local(header);
| ^~~~~~
fs/ceph/inode.c:2469:2: note: remove the 'if' if its condition is always false
2469 | if (!dbuf)
| ^~~~~~~~~~
2470 | goto out;
| ~~~~~~~~
fs/ceph/inode.c:2451:50: note: initialize the variable 'header' to silence this warning
2451 | struct ceph_fscrypt_truncate_size_header *header;
| ^
| = NULL
>> fs/ceph/inode.c:2503:50: warning: variable 'pos' is uninitialized when used here [-Wuninitialized]
2503 | doutc(cl, "hit hole, ppos %lld < size %lld\n", pos, i_size);
| ^~~
fs/ceph/inode.c:2446:12: note: initialize the variable 'pos' to silence this warning
2446 | loff_t pos, orig_pos = round_down(attr->ia_size,
| ^
| = 0
5 warnings generated.
vim +/pos +2503 fs/ceph/inode.c
79f2f6ad878c1f Jeff Layton 2020-09-03 2431
5c64737d253683 Xiubo Li 2022-08-25 2432 /*
5c64737d253683 Xiubo Li 2022-08-25 2433 * Transfer the encrypted last block to the MDS and the MDS
5c64737d253683 Xiubo Li 2022-08-25 2434 * will help update it when truncating a smaller size.
5c64737d253683 Xiubo Li 2022-08-25 2435 *
5c64737d253683 Xiubo Li 2022-08-25 2436 * We don't support a PAGE_SIZE that is smaller than the
5c64737d253683 Xiubo Li 2022-08-25 2437 * CEPH_FSCRYPT_BLOCK_SIZE.
5c64737d253683 Xiubo Li 2022-08-25 2438 */
5c64737d253683 Xiubo Li 2022-08-25 2439 static int fill_fscrypt_truncate(struct inode *inode,
5c64737d253683 Xiubo Li 2022-08-25 2440 struct ceph_mds_request *req,
5c64737d253683 Xiubo Li 2022-08-25 2441 struct iattr *attr)
5c64737d253683 Xiubo Li 2022-08-25 2442 {
38d46409c4639a Xiubo Li 2023-06-12 2443 struct ceph_client *cl = ceph_inode_to_client(inode);
5c64737d253683 Xiubo Li 2022-08-25 2444 struct ceph_inode_info *ci = ceph_inode(inode);
5c64737d253683 Xiubo Li 2022-08-25 2445 int boff = attr->ia_size % CEPH_FSCRYPT_BLOCK_SIZE;
5c64737d253683 Xiubo Li 2022-08-25 2446 loff_t pos, orig_pos = round_down(attr->ia_size,
5c64737d253683 Xiubo Li 2022-08-25 2447 CEPH_FSCRYPT_BLOCK_SIZE);
5c64737d253683 Xiubo Li 2022-08-25 2448 u64 block = orig_pos >> CEPH_FSCRYPT_BLOCK_SHIFT;
e52f99c9eea903 David Howells 2023-08-03 2449 struct bvecq *dbuf = NULL;
5c64737d253683 Xiubo Li 2022-08-25 2450 struct iov_iter iter;
e52f99c9eea903 David Howells 2023-08-03 2451 struct ceph_fscrypt_truncate_size_header *header;
e52f99c9eea903 David Howells 2023-08-03 2452 void *p;
5c64737d253683 Xiubo Li 2022-08-25 2453 int len = CEPH_FSCRYPT_BLOCK_SIZE;
5c64737d253683 Xiubo Li 2022-08-25 2454 loff_t i_size = i_size_read(inode);
5c64737d253683 Xiubo Li 2022-08-25 2455 int got, ret, issued;
5c64737d253683 Xiubo Li 2022-08-25 2456
5c64737d253683 Xiubo Li 2022-08-25 2457 ret = __ceph_get_caps(inode, NULL, CEPH_CAP_FILE_RD, 0, -1, &got);
5c64737d253683 Xiubo Li 2022-08-25 2458 if (ret < 0)
5c64737d253683 Xiubo Li 2022-08-25 2459 return ret;
5c64737d253683 Xiubo Li 2022-08-25 2460
5c64737d253683 Xiubo Li 2022-08-25 2461 issued = __ceph_caps_issued(ci, NULL);
5c64737d253683 Xiubo Li 2022-08-25 2462
38d46409c4639a Xiubo Li 2023-06-12 2463 doutc(cl, "size %lld -> %lld got cap refs on %s, issued %s\n",
5c64737d253683 Xiubo Li 2022-08-25 2464 i_size, attr->ia_size, ceph_cap_string(got),
5c64737d253683 Xiubo Li 2022-08-25 2465 ceph_cap_string(issued));
5c64737d253683 Xiubo Li 2022-08-25 2466
5c64737d253683 Xiubo Li 2022-08-25 2467 ret = -ENOMEM;
e52f99c9eea903 David Howells 2023-08-03 2468 dbuf = bvecq_alloc_chain(2, GFP_KERNEL, false);
e52f99c9eea903 David Howells 2023-08-03 2469 if (!dbuf)
5c64737d253683 Xiubo Li 2022-08-25 2470 goto out;
5c64737d253683 Xiubo Li 2022-08-25 2471
e52f99c9eea903 David Howells 2023-08-03 2472 if (ceph_bvecq_insert_frag(dbuf, 0, sizeof(*header), GFP_KERNEL) < 0 ||
e52f99c9eea903 David Howells 2023-08-03 2473 ceph_bvecq_insert_frag(dbuf, 1, PAGE_SIZE, GFP_KERNEL) < 0)
5c64737d253683 Xiubo Li 2022-08-25 2474 goto out;
5c64737d253683 Xiubo Li 2022-08-25 2475
e52f99c9eea903 David Howells 2023-08-03 2476 iov_iter_bvec_queue(&iter, ITER_DEST, dbuf, 1, 0, len);
b761e790c5985b David Howells 2024-12-05 2477 ret = netfs_unbuffered_read_from_inode(inode, orig_pos, dbuf, len, true);
b761e790c5985b David Howells 2024-12-05 2478 if (ret < 0 && ret != -ENODATA)
5c64737d253683 Xiubo Li 2022-08-25 2479 goto out;
5c64737d253683 Xiubo Li 2022-08-25 2480
e52f99c9eea903 David Howells 2023-08-03 2481 header = kmap_local_bvecq(dbuf, 0);
e52f99c9eea903 David Howells 2023-08-03 2482
5c64737d253683 Xiubo Li 2022-08-25 2483 /* Insert the header first */
e52f99c9eea903 David Howells 2023-08-03 2484 header->ver = 1;
e52f99c9eea903 David Howells 2023-08-03 2485 header->compat = 1;
e52f99c9eea903 David Howells 2023-08-03 2486 header->change_attr = cpu_to_le64(inode_peek_iversion_raw(inode));
5c64737d253683 Xiubo Li 2022-08-25 2487
5c64737d253683 Xiubo Li 2022-08-25 2488 /*
5c64737d253683 Xiubo Li 2022-08-25 2489 * Always set the block_size to CEPH_FSCRYPT_BLOCK_SIZE,
5c64737d253683 Xiubo Li 2022-08-25 2490 * because in MDS it may need this to do the truncate.
5c64737d253683 Xiubo Li 2022-08-25 2491 */
e52f99c9eea903 David Howells 2023-08-03 2492 header->block_size = cpu_to_le32(CEPH_FSCRYPT_BLOCK_SIZE);
5c64737d253683 Xiubo Li 2022-08-25 2493
5c64737d253683 Xiubo Li 2022-08-25 2494 /*
b761e790c5985b David Howells 2024-12-05 2495 * If we hit a hole here, we should just skip filling the fscrypt for
b761e790c5985b David Howells 2024-12-05 2496 * the request, because once the fscrypt is enabled, the file will be
b761e790c5985b David Howells 2024-12-05 2497 * split into many blocks with the size of CEPH_FSCRYPT_BLOCK_SIZE. If
b761e790c5985b David Howells 2024-12-05 2498 * there was a hole, the hole size should be multiple of block size.
5c64737d253683 Xiubo Li 2022-08-25 2499 *
5c64737d253683 Xiubo Li 2022-08-25 2500 * If the Rados object doesn't exist, it will be set to 0.
5c64737d253683 Xiubo Li 2022-08-25 2501 */
b761e790c5985b David Howells 2024-12-05 2502 if (ret != -ENODATA) {
38d46409c4639a Xiubo Li 2023-06-12 @2503 doutc(cl, "hit hole, ppos %lld < size %lld\n", pos, i_size);
5c64737d253683 Xiubo Li 2022-08-25 2504
e52f99c9eea903 David Howells 2023-08-03 2505 header->data_len = cpu_to_le32(8 + 8 + 4);
e52f99c9eea903 David Howells 2023-08-03 2506 header->file_offset = 0;
5c64737d253683 Xiubo Li 2022-08-25 2507 ret = 0;
5c64737d253683 Xiubo Li 2022-08-25 2508 } else {
e52f99c9eea903 David Howells 2023-08-03 2509 header->data_len = cpu_to_le32(8 + 8 + 4 + CEPH_FSCRYPT_BLOCK_SIZE);
e52f99c9eea903 David Howells 2023-08-03 2510 header->file_offset = cpu_to_le64(orig_pos);
5c64737d253683 Xiubo Li 2022-08-25 2511
38d46409c4639a Xiubo Li 2023-06-12 2512 doutc(cl, "encrypt block boff/bsize %d/%lu\n", boff,
38d46409c4639a Xiubo Li 2023-06-12 2513 CEPH_FSCRYPT_BLOCK_SIZE);
295fc4aa7de4b7 Xiubo Li 2023-03-06 2514
5c64737d253683 Xiubo Li 2022-08-25 2515 /* truncate and zero out the extra contents for the last block */
e52f99c9eea903 David Howells 2023-08-03 2516 p = kmap_local_bvecq(dbuf, 1);
e52f99c9eea903 David Howells 2023-08-03 2517 memset(p + boff, 0, PAGE_SIZE - boff);
e52f99c9eea903 David Howells 2023-08-03 2518 kunmap_local(p);
5c64737d253683 Xiubo Li 2022-08-25 2519
5c64737d253683 Xiubo Li 2022-08-25 2520 /* encrypt the last block */
e52f99c9eea903 David Howells 2023-08-03 2521 ret = ceph_fscrypt_encrypt_block_inplace(inode, dbuf->bv[0].bv_page,
5c64737d253683 Xiubo Li 2022-08-25 2522 CEPH_FSCRYPT_BLOCK_SIZE,
fa65058063cbab Eric Biggers 2025-07-09 2523 0, block);
5c64737d253683 Xiubo Li 2022-08-25 2524 if (ret)
5c64737d253683 Xiubo Li 2022-08-25 2525 goto out;
5c64737d253683 Xiubo Li 2022-08-25 2526 }
5c64737d253683 Xiubo Li 2022-08-25 2527
e52f99c9eea903 David Howells 2023-08-03 2528 req->r_dbuf = dbuf;
e52f99c9eea903 David Howells 2023-08-03 2529 req->r_dbuf_len = sizeof(*header);
e52f99c9eea903 David Howells 2023-08-03 2530 if (header->block_size)
e52f99c9eea903 David Howells 2023-08-03 2531 req->r_dbuf_len += CEPH_FSCRYPT_BLOCK_SIZE;
5c64737d253683 Xiubo Li 2022-08-25 2532 out:
38d46409c4639a Xiubo Li 2023-06-12 2533 doutc(cl, "%p %llx.%llx size dropping cap refs on %s\n", inode,
38d46409c4639a Xiubo Li 2023-06-12 2534 ceph_vinop(inode), ceph_cap_string(got));
5c64737d253683 Xiubo Li 2022-08-25 2535 ceph_put_cap_refs(ci, got);
e52f99c9eea903 David Howells 2023-08-03 2536 kunmap_local(header);
e52f99c9eea903 David Howells 2023-08-03 2537 if (ret)
e52f99c9eea903 David Howells 2023-08-03 2538 bvecq_put(dbuf);
5c64737d253683 Xiubo Li 2022-08-25 2539 return ret;
5c64737d253683 Xiubo Li 2022-08-25 2540 }
5c64737d253683 Xiubo Li 2022-08-25 2541
:::::: The code at line 2503 was first introduced by commit
:::::: 38d46409c4639a1d659ebfa70e27a8bed6b8ee1d ceph: print cluster fsid and client global_id in all debug logs
:::::: TO: Xiubo Li <xiubli@redhat.com>
:::::: CC: Ilya Dryomov <idryomov@gmail.com>
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 2+ messages in thread
* [dhowells-fs:ceph-iter 81/87] fs/ceph/inode.c:2503:50: warning: variable 'pos' is uninitialized when used here
@ 2026-09-05 3:07 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2026-09-05 3:07 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: 376ad9d4942bf11500931178bbeb965348f01057
commit: b761e790c5985b9648236697803fa145e76ee755 [81/87] ceph: Use netfslib [INCOMPLETE]
config: hexagon-allmodconfig (https://download.01.org/0day-ci/archive/20260905/202609051157.fouhIIkr-lkp@intel.com/config)
compiler: clang version 24.0.0git (https://github.com/llvm/llvm-project 0edd1b088cc36b4faee80358c925a91e16006258)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260905/202609051157.fouhIIkr-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/202609051157.fouhIIkr-lkp@intel.com/
All warnings (new ones prefixed by >>):
fs/ceph/inode.c:2478:6: warning: variable 'header' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
2478 | if (ret < 0 && ret != -ENODATA)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~
fs/ceph/inode.c:2536:15: note: uninitialized use occurs here
2536 | kunmap_local(header);
| ^~~~~~
fs/ceph/inode.c:2478:2: note: remove the 'if' if its condition is always false
2478 | if (ret < 0 && ret != -ENODATA)
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2479 | goto out;
| ~~~~~~~~
fs/ceph/inode.c:2472:6: warning: variable 'header' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
2472 | if (ceph_bvecq_insert_frag(dbuf, 0, sizeof(*header), GFP_KERNEL) < 0 ||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2473 | ceph_bvecq_insert_frag(dbuf, 1, PAGE_SIZE, GFP_KERNEL) < 0)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/ceph/inode.c:2536:15: note: uninitialized use occurs here
2536 | kunmap_local(header);
| ^~~~~~
fs/ceph/inode.c:2472:2: note: remove the 'if' if its condition is always false
2472 | if (ceph_bvecq_insert_frag(dbuf, 0, sizeof(*header), GFP_KERNEL) < 0 ||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2473 | ceph_bvecq_insert_frag(dbuf, 1, PAGE_SIZE, GFP_KERNEL) < 0)
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2474 | goto out;
| ~~~~~~~~
fs/ceph/inode.c:2472:6: warning: variable 'header' is used uninitialized whenever '||' condition is true [-Wsometimes-uninitialized]
2472 | if (ceph_bvecq_insert_frag(dbuf, 0, sizeof(*header), GFP_KERNEL) < 0 ||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/ceph/inode.c:2536:15: note: uninitialized use occurs here
2536 | kunmap_local(header);
| ^~~~~~
fs/ceph/inode.c:2472:6: note: remove the '||' if its condition is always false
2472 | if (ceph_bvecq_insert_frag(dbuf, 0, sizeof(*header), GFP_KERNEL) < 0 ||
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/ceph/inode.c:2469:6: warning: variable 'header' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
2469 | if (!dbuf)
| ^~~~~
fs/ceph/inode.c:2536:15: note: uninitialized use occurs here
2536 | kunmap_local(header);
| ^~~~~~
fs/ceph/inode.c:2469:2: note: remove the 'if' if its condition is always false
2469 | if (!dbuf)
| ^~~~~~~~~~
2470 | goto out;
| ~~~~~~~~
fs/ceph/inode.c:2451:50: note: initialize the variable 'header' to silence this warning
2451 | struct ceph_fscrypt_truncate_size_header *header;
| ^
| = NULL
>> fs/ceph/inode.c:2503:50: warning: variable 'pos' is uninitialized when used here [-Wuninitialized]
2503 | doutc(cl, "hit hole, ppos %lld < size %lld\n", pos, i_size);
| ^~~
fs/ceph/inode.c:2446:12: note: initialize the variable 'pos' to silence this warning
2446 | loff_t pos, orig_pos = round_down(attr->ia_size,
| ^
| = 0
5 warnings generated.
vim +/pos +2503 fs/ceph/inode.c
79f2f6ad878c1f Jeff Layton 2020-09-03 2431
5c64737d253683 Xiubo Li 2022-08-25 2432 /*
5c64737d253683 Xiubo Li 2022-08-25 2433 * Transfer the encrypted last block to the MDS and the MDS
5c64737d253683 Xiubo Li 2022-08-25 2434 * will help update it when truncating a smaller size.
5c64737d253683 Xiubo Li 2022-08-25 2435 *
5c64737d253683 Xiubo Li 2022-08-25 2436 * We don't support a PAGE_SIZE that is smaller than the
5c64737d253683 Xiubo Li 2022-08-25 2437 * CEPH_FSCRYPT_BLOCK_SIZE.
5c64737d253683 Xiubo Li 2022-08-25 2438 */
5c64737d253683 Xiubo Li 2022-08-25 2439 static int fill_fscrypt_truncate(struct inode *inode,
5c64737d253683 Xiubo Li 2022-08-25 2440 struct ceph_mds_request *req,
5c64737d253683 Xiubo Li 2022-08-25 2441 struct iattr *attr)
5c64737d253683 Xiubo Li 2022-08-25 2442 {
38d46409c4639a Xiubo Li 2023-06-12 2443 struct ceph_client *cl = ceph_inode_to_client(inode);
5c64737d253683 Xiubo Li 2022-08-25 2444 struct ceph_inode_info *ci = ceph_inode(inode);
5c64737d253683 Xiubo Li 2022-08-25 2445 int boff = attr->ia_size % CEPH_FSCRYPT_BLOCK_SIZE;
5c64737d253683 Xiubo Li 2022-08-25 2446 loff_t pos, orig_pos = round_down(attr->ia_size,
5c64737d253683 Xiubo Li 2022-08-25 2447 CEPH_FSCRYPT_BLOCK_SIZE);
5c64737d253683 Xiubo Li 2022-08-25 2448 u64 block = orig_pos >> CEPH_FSCRYPT_BLOCK_SHIFT;
e52f99c9eea903 David Howells 2023-08-03 2449 struct bvecq *dbuf = NULL;
5c64737d253683 Xiubo Li 2022-08-25 2450 struct iov_iter iter;
e52f99c9eea903 David Howells 2023-08-03 2451 struct ceph_fscrypt_truncate_size_header *header;
e52f99c9eea903 David Howells 2023-08-03 2452 void *p;
5c64737d253683 Xiubo Li 2022-08-25 2453 int len = CEPH_FSCRYPT_BLOCK_SIZE;
5c64737d253683 Xiubo Li 2022-08-25 2454 loff_t i_size = i_size_read(inode);
5c64737d253683 Xiubo Li 2022-08-25 2455 int got, ret, issued;
5c64737d253683 Xiubo Li 2022-08-25 2456
5c64737d253683 Xiubo Li 2022-08-25 2457 ret = __ceph_get_caps(inode, NULL, CEPH_CAP_FILE_RD, 0, -1, &got);
5c64737d253683 Xiubo Li 2022-08-25 2458 if (ret < 0)
5c64737d253683 Xiubo Li 2022-08-25 2459 return ret;
5c64737d253683 Xiubo Li 2022-08-25 2460
5c64737d253683 Xiubo Li 2022-08-25 2461 issued = __ceph_caps_issued(ci, NULL);
5c64737d253683 Xiubo Li 2022-08-25 2462
38d46409c4639a Xiubo Li 2023-06-12 2463 doutc(cl, "size %lld -> %lld got cap refs on %s, issued %s\n",
5c64737d253683 Xiubo Li 2022-08-25 2464 i_size, attr->ia_size, ceph_cap_string(got),
5c64737d253683 Xiubo Li 2022-08-25 2465 ceph_cap_string(issued));
5c64737d253683 Xiubo Li 2022-08-25 2466
5c64737d253683 Xiubo Li 2022-08-25 2467 ret = -ENOMEM;
e52f99c9eea903 David Howells 2023-08-03 2468 dbuf = bvecq_alloc_chain(2, GFP_KERNEL, false);
e52f99c9eea903 David Howells 2023-08-03 @2469 if (!dbuf)
5c64737d253683 Xiubo Li 2022-08-25 2470 goto out;
5c64737d253683 Xiubo Li 2022-08-25 2471
e52f99c9eea903 David Howells 2023-08-03 2472 if (ceph_bvecq_insert_frag(dbuf, 0, sizeof(*header), GFP_KERNEL) < 0 ||
e52f99c9eea903 David Howells 2023-08-03 2473 ceph_bvecq_insert_frag(dbuf, 1, PAGE_SIZE, GFP_KERNEL) < 0)
5c64737d253683 Xiubo Li 2022-08-25 2474 goto out;
5c64737d253683 Xiubo Li 2022-08-25 2475
e52f99c9eea903 David Howells 2023-08-03 2476 iov_iter_bvec_queue(&iter, ITER_DEST, dbuf, 1, 0, len);
b761e790c5985b David Howells 2024-12-05 2477 ret = netfs_unbuffered_read_from_inode(inode, orig_pos, dbuf, len, true);
b761e790c5985b David Howells 2024-12-05 2478 if (ret < 0 && ret != -ENODATA)
5c64737d253683 Xiubo Li 2022-08-25 2479 goto out;
5c64737d253683 Xiubo Li 2022-08-25 2480
e52f99c9eea903 David Howells 2023-08-03 2481 header = kmap_local_bvecq(dbuf, 0);
e52f99c9eea903 David Howells 2023-08-03 2482
5c64737d253683 Xiubo Li 2022-08-25 2483 /* Insert the header first */
e52f99c9eea903 David Howells 2023-08-03 2484 header->ver = 1;
e52f99c9eea903 David Howells 2023-08-03 2485 header->compat = 1;
e52f99c9eea903 David Howells 2023-08-03 2486 header->change_attr = cpu_to_le64(inode_peek_iversion_raw(inode));
5c64737d253683 Xiubo Li 2022-08-25 2487
5c64737d253683 Xiubo Li 2022-08-25 2488 /*
5c64737d253683 Xiubo Li 2022-08-25 2489 * Always set the block_size to CEPH_FSCRYPT_BLOCK_SIZE,
5c64737d253683 Xiubo Li 2022-08-25 2490 * because in MDS it may need this to do the truncate.
5c64737d253683 Xiubo Li 2022-08-25 2491 */
e52f99c9eea903 David Howells 2023-08-03 2492 header->block_size = cpu_to_le32(CEPH_FSCRYPT_BLOCK_SIZE);
5c64737d253683 Xiubo Li 2022-08-25 2493
5c64737d253683 Xiubo Li 2022-08-25 2494 /*
b761e790c5985b David Howells 2024-12-05 2495 * If we hit a hole here, we should just skip filling the fscrypt for
b761e790c5985b David Howells 2024-12-05 2496 * the request, because once the fscrypt is enabled, the file will be
b761e790c5985b David Howells 2024-12-05 2497 * split into many blocks with the size of CEPH_FSCRYPT_BLOCK_SIZE. If
b761e790c5985b David Howells 2024-12-05 2498 * there was a hole, the hole size should be multiple of block size.
5c64737d253683 Xiubo Li 2022-08-25 2499 *
5c64737d253683 Xiubo Li 2022-08-25 2500 * If the Rados object doesn't exist, it will be set to 0.
5c64737d253683 Xiubo Li 2022-08-25 2501 */
b761e790c5985b David Howells 2024-12-05 2502 if (ret != -ENODATA) {
38d46409c4639a Xiubo Li 2023-06-12 @2503 doutc(cl, "hit hole, ppos %lld < size %lld\n", pos, i_size);
5c64737d253683 Xiubo Li 2022-08-25 2504
e52f99c9eea903 David Howells 2023-08-03 2505 header->data_len = cpu_to_le32(8 + 8 + 4);
e52f99c9eea903 David Howells 2023-08-03 2506 header->file_offset = 0;
5c64737d253683 Xiubo Li 2022-08-25 2507 ret = 0;
5c64737d253683 Xiubo Li 2022-08-25 2508 } else {
e52f99c9eea903 David Howells 2023-08-03 2509 header->data_len = cpu_to_le32(8 + 8 + 4 + CEPH_FSCRYPT_BLOCK_SIZE);
e52f99c9eea903 David Howells 2023-08-03 2510 header->file_offset = cpu_to_le64(orig_pos);
5c64737d253683 Xiubo Li 2022-08-25 2511
38d46409c4639a Xiubo Li 2023-06-12 2512 doutc(cl, "encrypt block boff/bsize %d/%lu\n", boff,
38d46409c4639a Xiubo Li 2023-06-12 2513 CEPH_FSCRYPT_BLOCK_SIZE);
295fc4aa7de4b7 Xiubo Li 2023-03-06 2514
5c64737d253683 Xiubo Li 2022-08-25 2515 /* truncate and zero out the extra contents for the last block */
e52f99c9eea903 David Howells 2023-08-03 2516 p = kmap_local_bvecq(dbuf, 1);
e52f99c9eea903 David Howells 2023-08-03 2517 memset(p + boff, 0, PAGE_SIZE - boff);
e52f99c9eea903 David Howells 2023-08-03 2518 kunmap_local(p);
5c64737d253683 Xiubo Li 2022-08-25 2519
5c64737d253683 Xiubo Li 2022-08-25 2520 /* encrypt the last block */
e52f99c9eea903 David Howells 2023-08-03 2521 ret = ceph_fscrypt_encrypt_block_inplace(inode, dbuf->bv[0].bv_page,
5c64737d253683 Xiubo Li 2022-08-25 2522 CEPH_FSCRYPT_BLOCK_SIZE,
fa65058063cbab Eric Biggers 2025-07-09 2523 0, block);
5c64737d253683 Xiubo Li 2022-08-25 2524 if (ret)
5c64737d253683 Xiubo Li 2022-08-25 2525 goto out;
5c64737d253683 Xiubo Li 2022-08-25 2526 }
5c64737d253683 Xiubo Li 2022-08-25 2527
e52f99c9eea903 David Howells 2023-08-03 2528 req->r_dbuf = dbuf;
e52f99c9eea903 David Howells 2023-08-03 2529 req->r_dbuf_len = sizeof(*header);
e52f99c9eea903 David Howells 2023-08-03 2530 if (header->block_size)
e52f99c9eea903 David Howells 2023-08-03 2531 req->r_dbuf_len += CEPH_FSCRYPT_BLOCK_SIZE;
5c64737d253683 Xiubo Li 2022-08-25 2532 out:
38d46409c4639a Xiubo Li 2023-06-12 2533 doutc(cl, "%p %llx.%llx size dropping cap refs on %s\n", inode,
38d46409c4639a Xiubo Li 2023-06-12 2534 ceph_vinop(inode), ceph_cap_string(got));
5c64737d253683 Xiubo Li 2022-08-25 2535 ceph_put_cap_refs(ci, got);
e52f99c9eea903 David Howells 2023-08-03 2536 kunmap_local(header);
e52f99c9eea903 David Howells 2023-08-03 2537 if (ret)
e52f99c9eea903 David Howells 2023-08-03 2538 bvecq_put(dbuf);
5c64737d253683 Xiubo Li 2022-08-25 2539 return ret;
5c64737d253683 Xiubo Li 2022-08-25 2540 }
5c64737d253683 Xiubo Li 2022-08-25 2541
:::::: The code at line 2503 was first introduced by commit
:::::: 38d46409c4639a1d659ebfa70e27a8bed6b8ee1d ceph: print cluster fsid and client global_id in all debug logs
:::::: TO: Xiubo Li <xiubli@redhat.com>
:::::: CC: Ilya Dryomov <idryomov@gmail.com>
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2026-09-05 3:07 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-05 3:07 [dhowells-fs:ceph-iter 81/87] fs/ceph/inode.c:2503:50: warning: variable 'pos' is uninitialized when used here kernel test robot
-- strict thread matches above, loose matches on Subject: below --
2026-09-05 0:33 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.