* fs/ntfs3/attrib.c:765:21: warning: use of NULL 'name' where non-null expected [CWE-476]
@ 2022-06-27 3:04 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2022-06-27 3:04 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 45364 bytes --]
::::::
:::::: Manual check reason: "low confidence bisect report"
:::::: Manual check reason: "low confidence static check first_new_problem: fs/ntfs3/attrib.c:765:21: warning: use of NULL 'name' where non-null expected [CWE-476] [-Wanalyzer-null-argument]"
::::::
CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
CC: linux-kernel(a)vger.kernel.org
TO: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 8c23f235a6a8ae43abea215812eb9d8cf4dd165e
commit: 6e5be40d32fb1907285277c02e74493ed43d77fe fs/ntfs3: Add NTFS3 in fs/Kconfig and fs/Makefile
date: 11 months ago
:::::: branch date: 19 hours ago
:::::: commit date: 11 months ago
config: arm-randconfig-c002-20220625
compiler: arm-linux-gnueabi-gcc (GCC) 11.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6e5be40d32fb1907285277c02e74493ed43d77fe
git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git fetch --no-tags linus master
git checkout 6e5be40d32fb1907285277c02e74493ed43d77fe
# save the config file
ARCH=arm KBUILD_USERCFLAGS='-fanalyzer -Wno-error'
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
gcc-analyzer warnings: (new ones prefixed by >>)
| | |
| | (39) ...to here
|......
| 197 | if (err == -ENOSPC && pre) {
| | ~
| | |
| | (40) following 'false' branch...
|......
| 204 | if (err)
| | ~
| | |
| | (41) ...to here
|......
| 207 | if (new_lcn && vcn == vcn0)
| | ~
| | |
| | (42) following 'false' branch...
|......
| 211 | if (!run_add_entry(run, vcn, lcn, flen, opt == ALLOCATE_MFT)) {
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (43) ...to here
|
<------+
|
'attr_make_nonresident': events 44-55
|
| 291 | err = attr_allocate_clusters(sbi, run, 0, 0, len, NULL,
| | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (44) returning to 'attr_make_nonresident' from 'attr_allocate_clusters'
| 292 | ALLOCATE_DEF, &alen, 0, NULL);
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| 293 | if (err)
| | ~
| | |
| | (45) following 'false' branch (when 'err == 0')...
|......
| 296 | if (!rsize) {
| | ~
| | |
| | (46) ...to here
| | (47) following 'false' branch (when 'rsize != 0')...
| 297 | /* empty resident -> non empty nonresident */
| 298 | } else if (!is_data) {
| | ~
| | |
| | (48) ...to here
| | (49) following 'true' branch (when 'is_data != 0')...
|......
| 302 | } else if (!page) {
| | ~
| | |
| | (50) ...to here
| | (51) following 'true' branch (when 'page' is NULL)...
|......
| 305 | page = grab_cache_page(ni->vfs_inode.i_mapping, 0);
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (52) ...to here
| 306 | if (!page) {
| | ~
| | |
| | (53) following 'false' branch...
|......
| 310 | kaddr = kmap_atomic(page);
| | ~~~~~~~~~~~~~~~~~
| | |
| | (54) ...to here
| | (55) calling 'kmap_atomic' from 'attr_make_nonresident'
|
+--> 'kmap_atomic': event 56
|
|include/linux/highmem-internal.h:180:21:
| 180 | static inline void *kmap_atomic(struct page *page)
| | ^~~~~~~~~~~
| | |
| | (56) entry to 'kmap_atomic'
|
'kmap_atomic': event 57
|
|include/linux/mmzone.h:1341:12:
| 1341 | if (!mem_section[SECTION_NR_TO_ROOT(nr)])
| | ^
| | |
| | (57) following 'true' branch...
|
'kmap_atomic': event 58
|
|cc1:
| (58): ...to here
|
'kmap_atomic': event 59
|
| 1372 | unsigned long map = section->section_mem_map;
| | ^~~
| | |
| | (59) dereference of NULL '<unknown>'
|
fs/ntfs3/attrib.c: In function 'attr_set_size':
>> fs/ntfs3/attrib.c:765:21: warning: use of NULL 'name' where non-null expected [CWE-476] [-Wanalyzer-null-argument]
765 | memcmp(le_name(le), name, name_len * sizeof(short))) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'attr_collapse_range': events 1-6
|
| 1688 | int attr_collapse_range(struct ntfs_inode *ni, u64 vbo, u64 bytes)
| | ^~~~~~~~~~~~~~~~~~~
| | |
| | (1) entry to 'attr_collapse_range'
|......
| 1702 | if (!bytes)
| | ~
| | |
| | (2) following 'false' branch (when 'bytes != 0')...
|......
| 1706 | attr_b = ni_find_attr(ni, NULL, &le_b, ATTR_DATA, NULL, 0, NULL, &mi_b);
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (3) ...to here
| 1707 | if (!attr_b)
| | ~
| | |
| | (4) following 'false' branch (when 'attr_b' is non-NULL)...
|......
| 1710 | if (!attr_b->non_res) {
| | ~ ~~~~~~~~~~~~~~~
| | | |
| | | (5) ...to here
| | (6) following 'false' branch...
|
'attr_collapse_range': events 7-12
|
| 1715 | data_size = le64_to_cpu(attr_b->nres.data_size);
|......
| 1727 | if ((vbo & mask) || (bytes & mask)) {
| | ~
| | |
| | (8) following 'false' branch...
|......
| 1732 | if (vbo > data_size)
| | ~
| | |
| | (9) ...to here
| | (10) following 'false' branch (when 'data_size >= vbo')...
|......
| 1735 | down_write(&ni->file.run_lock);
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (11) ...to here
| 1736 |
| 1737 | if (vbo + bytes >= data_size) {
| | ~
| | |
| | (12) following 'true' branch...
|
'attr_collapse_range': event 13
|
|include/linux/compiler-gcc.h:42:45:
| 42 | #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
| | ^~~~~~~~~~~~
| | |
| | (13) ...to here
include/linux/minmax.h:31:27: note: in definition of macro '__cmp_once'
| 31 | typeof(x) unique_x = (x); \
| | ^~~~~~~~
include/linux/compiler_types.h:60:22: note: in expansion of macro '___PASTE'
| 60 | #define __PASTE(a,b) ___PASTE(a,b)
| | ^~~~~~~~
include/linux/compiler-gcc.h:42:29: note: in expansion of macro '__PASTE'
| 42 | #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
| | ^~~~~~~
include/linux/compiler_types.h:60:22: note: in expansion of macro '___PASTE'
| 60 | #define __PASTE(a,b) ___PASTE(a,b)
| | ^~~~~~~~
include/linux/compiler-gcc.h:42:37: note: in expansion of macro '__PASTE'
| 42 | #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
| | ^~~~~~~
include/linux/minmax.h:38:34: note: in expansion of macro '__UNIQUE_ID'
| 38 | __cmp_once(x, y, __UNIQUE_ID(__x), __UNIQUE_ID(__y), op))
| | ^~~~~~~~~~~
include/linux/minmax.h:45:25: note: in expansion of macro '__careful_cmp'
| 45 | #define min(x, y) __careful_cmp(x, y, <)
| | ^~~~~~~~~~~~~
fs/ntfs3/attrib.c:1738:33: note: in expansion of macro 'min'
| 1738 | u64 new_valid = min(ni->i_valid, vbo);
| | ^~~
|
'attr_collapse_range': event 14
|
| 1742 | err = attr_set_size(ni, ATTR_DATA, NULL, 0, &ni->file.run, vbo,
| | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (14) calling 'attr_set_size' from 'attr_collapse_range'
| 1743 | &new_valid, true, NULL);
| | ~~~~~~~~~~~~~~~~~~~~~~~
|
+--> 'attr_set_size': events 15-24
|
| 419 | int attr_set_size(struct ntfs_inode *ni, enum ATTR_TYPE type,
| | ^~~~~~~~~~~~~
| | |
vim +/name +765 fs/ntfs3/attrib.c
be71b5cba2e648 Konstantin Komarov 2021-08-13 408
be71b5cba2e648 Konstantin Komarov 2021-08-13 409 /*
be71b5cba2e648 Konstantin Komarov 2021-08-13 410 * attr_set_size
be71b5cba2e648 Konstantin Komarov 2021-08-13 411 *
be71b5cba2e648 Konstantin Komarov 2021-08-13 412 * change the size of attribute
be71b5cba2e648 Konstantin Komarov 2021-08-13 413 * Extend:
be71b5cba2e648 Konstantin Komarov 2021-08-13 414 * - sparse/compressed: no allocated clusters
be71b5cba2e648 Konstantin Komarov 2021-08-13 415 * - normal: append allocated and preallocated new clusters
be71b5cba2e648 Konstantin Komarov 2021-08-13 416 * Shrink:
be71b5cba2e648 Konstantin Komarov 2021-08-13 417 * - no deallocate if keep_prealloc is set
be71b5cba2e648 Konstantin Komarov 2021-08-13 418 */
be71b5cba2e648 Konstantin Komarov 2021-08-13 419 int attr_set_size(struct ntfs_inode *ni, enum ATTR_TYPE type,
be71b5cba2e648 Konstantin Komarov 2021-08-13 420 const __le16 *name, u8 name_len, struct runs_tree *run,
be71b5cba2e648 Konstantin Komarov 2021-08-13 421 u64 new_size, const u64 *new_valid, bool keep_prealloc,
be71b5cba2e648 Konstantin Komarov 2021-08-13 422 struct ATTRIB **ret)
be71b5cba2e648 Konstantin Komarov 2021-08-13 423 {
be71b5cba2e648 Konstantin Komarov 2021-08-13 424 int err = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 425 struct ntfs_sb_info *sbi = ni->mi.sbi;
be71b5cba2e648 Konstantin Komarov 2021-08-13 426 u8 cluster_bits = sbi->cluster_bits;
be71b5cba2e648 Konstantin Komarov 2021-08-13 427 bool is_mft =
be71b5cba2e648 Konstantin Komarov 2021-08-13 428 ni->mi.rno == MFT_REC_MFT && type == ATTR_DATA && !name_len;
be71b5cba2e648 Konstantin Komarov 2021-08-13 429 u64 old_valid, old_size, old_alloc, new_alloc, new_alloc_tmp;
be71b5cba2e648 Konstantin Komarov 2021-08-13 430 struct ATTRIB *attr = NULL, *attr_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 431 struct ATTR_LIST_ENTRY *le, *le_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 432 struct mft_inode *mi, *mi_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 433 CLST alen, vcn, lcn, new_alen, old_alen, svcn, evcn;
be71b5cba2e648 Konstantin Komarov 2021-08-13 434 CLST next_svcn, pre_alloc = -1, done = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 435 bool is_ext;
be71b5cba2e648 Konstantin Komarov 2021-08-13 436 u32 align;
be71b5cba2e648 Konstantin Komarov 2021-08-13 437 struct MFT_REC *rec;
be71b5cba2e648 Konstantin Komarov 2021-08-13 438
be71b5cba2e648 Konstantin Komarov 2021-08-13 439 again:
be71b5cba2e648 Konstantin Komarov 2021-08-13 440 le_b = NULL;
be71b5cba2e648 Konstantin Komarov 2021-08-13 441 attr_b = ni_find_attr(ni, NULL, &le_b, type, name, name_len, NULL,
be71b5cba2e648 Konstantin Komarov 2021-08-13 442 &mi_b);
be71b5cba2e648 Konstantin Komarov 2021-08-13 443 if (!attr_b) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 444 err = -ENOENT;
be71b5cba2e648 Konstantin Komarov 2021-08-13 445 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 446 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 447
be71b5cba2e648 Konstantin Komarov 2021-08-13 448 if (!attr_b->non_res) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 449 err = attr_set_size_res(ni, attr_b, le_b, mi_b, new_size, run,
be71b5cba2e648 Konstantin Komarov 2021-08-13 450 &attr_b);
be71b5cba2e648 Konstantin Komarov 2021-08-13 451 if (err || !attr_b->non_res)
be71b5cba2e648 Konstantin Komarov 2021-08-13 452 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 453
be71b5cba2e648 Konstantin Komarov 2021-08-13 454 /* layout of records may be changed, so do a full search */
be71b5cba2e648 Konstantin Komarov 2021-08-13 455 goto again;
be71b5cba2e648 Konstantin Komarov 2021-08-13 456 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 457
be71b5cba2e648 Konstantin Komarov 2021-08-13 458 is_ext = is_attr_ext(attr_b);
be71b5cba2e648 Konstantin Komarov 2021-08-13 459
be71b5cba2e648 Konstantin Komarov 2021-08-13 460 again_1:
be71b5cba2e648 Konstantin Komarov 2021-08-13 461 align = sbi->cluster_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 462
be71b5cba2e648 Konstantin Komarov 2021-08-13 463 if (is_ext) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 464 align <<= attr_b->nres.c_unit;
be71b5cba2e648 Konstantin Komarov 2021-08-13 465 if (is_attr_sparsed(attr_b))
be71b5cba2e648 Konstantin Komarov 2021-08-13 466 keep_prealloc = false;
be71b5cba2e648 Konstantin Komarov 2021-08-13 467 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 468
be71b5cba2e648 Konstantin Komarov 2021-08-13 469 old_valid = le64_to_cpu(attr_b->nres.valid_size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 470 old_size = le64_to_cpu(attr_b->nres.data_size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 471 old_alloc = le64_to_cpu(attr_b->nres.alloc_size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 472 old_alen = old_alloc >> cluster_bits;
be71b5cba2e648 Konstantin Komarov 2021-08-13 473
be71b5cba2e648 Konstantin Komarov 2021-08-13 474 new_alloc = (new_size + align - 1) & ~(u64)(align - 1);
be71b5cba2e648 Konstantin Komarov 2021-08-13 475 new_alen = new_alloc >> cluster_bits;
be71b5cba2e648 Konstantin Komarov 2021-08-13 476
be71b5cba2e648 Konstantin Komarov 2021-08-13 477 if (keep_prealloc && is_ext)
be71b5cba2e648 Konstantin Komarov 2021-08-13 478 keep_prealloc = false;
be71b5cba2e648 Konstantin Komarov 2021-08-13 479
be71b5cba2e648 Konstantin Komarov 2021-08-13 480 if (keep_prealloc && new_size < old_size) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 481 attr_b->nres.data_size = cpu_to_le64(new_size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 482 mi_b->dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 483 goto ok;
be71b5cba2e648 Konstantin Komarov 2021-08-13 484 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 485
be71b5cba2e648 Konstantin Komarov 2021-08-13 486 vcn = old_alen - 1;
be71b5cba2e648 Konstantin Komarov 2021-08-13 487
be71b5cba2e648 Konstantin Komarov 2021-08-13 488 svcn = le64_to_cpu(attr_b->nres.svcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 489 evcn = le64_to_cpu(attr_b->nres.evcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 490
be71b5cba2e648 Konstantin Komarov 2021-08-13 491 if (svcn <= vcn && vcn <= evcn) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 492 attr = attr_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 493 le = le_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 494 mi = mi_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 495 } else if (!le_b) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 496 err = -EINVAL;
be71b5cba2e648 Konstantin Komarov 2021-08-13 497 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 498 } else {
be71b5cba2e648 Konstantin Komarov 2021-08-13 499 le = le_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 500 attr = ni_find_attr(ni, attr_b, &le, type, name, name_len, &vcn,
be71b5cba2e648 Konstantin Komarov 2021-08-13 501 &mi);
be71b5cba2e648 Konstantin Komarov 2021-08-13 502 if (!attr) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 503 err = -EINVAL;
be71b5cba2e648 Konstantin Komarov 2021-08-13 504 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 505 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 506
be71b5cba2e648 Konstantin Komarov 2021-08-13 507 next_le_1:
be71b5cba2e648 Konstantin Komarov 2021-08-13 508 svcn = le64_to_cpu(attr->nres.svcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 509 evcn = le64_to_cpu(attr->nres.evcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 510 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 511
be71b5cba2e648 Konstantin Komarov 2021-08-13 512 next_le:
be71b5cba2e648 Konstantin Komarov 2021-08-13 513 rec = mi->mrec;
be71b5cba2e648 Konstantin Komarov 2021-08-13 514
be71b5cba2e648 Konstantin Komarov 2021-08-13 515 err = attr_load_runs(attr, ni, run, NULL);
be71b5cba2e648 Konstantin Komarov 2021-08-13 516 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 517 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 518
be71b5cba2e648 Konstantin Komarov 2021-08-13 519 if (new_size > old_size) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 520 CLST to_allocate;
be71b5cba2e648 Konstantin Komarov 2021-08-13 521 size_t free;
be71b5cba2e648 Konstantin Komarov 2021-08-13 522
be71b5cba2e648 Konstantin Komarov 2021-08-13 523 if (new_alloc <= old_alloc) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 524 attr_b->nres.data_size = cpu_to_le64(new_size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 525 mi_b->dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 526 goto ok;
be71b5cba2e648 Konstantin Komarov 2021-08-13 527 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 528
be71b5cba2e648 Konstantin Komarov 2021-08-13 529 to_allocate = new_alen - old_alen;
be71b5cba2e648 Konstantin Komarov 2021-08-13 530 add_alloc_in_same_attr_seg:
be71b5cba2e648 Konstantin Komarov 2021-08-13 531 lcn = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 532 if (is_mft) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 533 /* mft allocates clusters from mftzone */
be71b5cba2e648 Konstantin Komarov 2021-08-13 534 pre_alloc = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 535 } else if (is_ext) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 536 /* no preallocate for sparse/compress */
be71b5cba2e648 Konstantin Komarov 2021-08-13 537 pre_alloc = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 538 } else if (pre_alloc == -1) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 539 pre_alloc = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 540 if (type == ATTR_DATA && !name_len &&
be71b5cba2e648 Konstantin Komarov 2021-08-13 541 sbi->options.prealloc) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 542 CLST new_alen2 = bytes_to_cluster(
be71b5cba2e648 Konstantin Komarov 2021-08-13 543 sbi, get_pre_allocated(new_size));
be71b5cba2e648 Konstantin Komarov 2021-08-13 544 pre_alloc = new_alen2 - new_alen;
be71b5cba2e648 Konstantin Komarov 2021-08-13 545 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 546
be71b5cba2e648 Konstantin Komarov 2021-08-13 547 /* Get the last lcn to allocate from */
be71b5cba2e648 Konstantin Komarov 2021-08-13 548 if (old_alen &&
be71b5cba2e648 Konstantin Komarov 2021-08-13 549 !run_lookup_entry(run, vcn, &lcn, NULL, NULL)) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 550 lcn = SPARSE_LCN;
be71b5cba2e648 Konstantin Komarov 2021-08-13 551 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 552
be71b5cba2e648 Konstantin Komarov 2021-08-13 553 if (lcn == SPARSE_LCN)
be71b5cba2e648 Konstantin Komarov 2021-08-13 554 lcn = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 555 else if (lcn)
be71b5cba2e648 Konstantin Komarov 2021-08-13 556 lcn += 1;
be71b5cba2e648 Konstantin Komarov 2021-08-13 557
be71b5cba2e648 Konstantin Komarov 2021-08-13 558 free = wnd_zeroes(&sbi->used.bitmap);
be71b5cba2e648 Konstantin Komarov 2021-08-13 559 if (to_allocate > free) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 560 err = -ENOSPC;
be71b5cba2e648 Konstantin Komarov 2021-08-13 561 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 562 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 563
be71b5cba2e648 Konstantin Komarov 2021-08-13 564 if (pre_alloc && to_allocate + pre_alloc > free)
be71b5cba2e648 Konstantin Komarov 2021-08-13 565 pre_alloc = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 566 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 567
be71b5cba2e648 Konstantin Komarov 2021-08-13 568 vcn = old_alen;
be71b5cba2e648 Konstantin Komarov 2021-08-13 569
be71b5cba2e648 Konstantin Komarov 2021-08-13 570 if (is_ext) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 571 if (!run_add_entry(run, vcn, SPARSE_LCN, to_allocate,
be71b5cba2e648 Konstantin Komarov 2021-08-13 572 false)) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 573 err = -ENOMEM;
be71b5cba2e648 Konstantin Komarov 2021-08-13 574 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 575 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 576 alen = to_allocate;
be71b5cba2e648 Konstantin Komarov 2021-08-13 577 } else {
be71b5cba2e648 Konstantin Komarov 2021-08-13 578 /* ~3 bytes per fragment */
be71b5cba2e648 Konstantin Komarov 2021-08-13 579 err = attr_allocate_clusters(
be71b5cba2e648 Konstantin Komarov 2021-08-13 580 sbi, run, vcn, lcn, to_allocate, &pre_alloc,
be71b5cba2e648 Konstantin Komarov 2021-08-13 581 is_mft ? ALLOCATE_MFT : 0, &alen,
be71b5cba2e648 Konstantin Komarov 2021-08-13 582 is_mft ? 0
be71b5cba2e648 Konstantin Komarov 2021-08-13 583 : (sbi->record_size -
be71b5cba2e648 Konstantin Komarov 2021-08-13 584 le32_to_cpu(rec->used) + 8) /
be71b5cba2e648 Konstantin Komarov 2021-08-13 585 3 +
be71b5cba2e648 Konstantin Komarov 2021-08-13 586 1,
be71b5cba2e648 Konstantin Komarov 2021-08-13 587 NULL);
be71b5cba2e648 Konstantin Komarov 2021-08-13 588 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 589 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 590 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 591
be71b5cba2e648 Konstantin Komarov 2021-08-13 592 done += alen;
be71b5cba2e648 Konstantin Komarov 2021-08-13 593 vcn += alen;
be71b5cba2e648 Konstantin Komarov 2021-08-13 594 if (to_allocate > alen)
be71b5cba2e648 Konstantin Komarov 2021-08-13 595 to_allocate -= alen;
be71b5cba2e648 Konstantin Komarov 2021-08-13 596 else
be71b5cba2e648 Konstantin Komarov 2021-08-13 597 to_allocate = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 598
be71b5cba2e648 Konstantin Komarov 2021-08-13 599 pack_runs:
be71b5cba2e648 Konstantin Komarov 2021-08-13 600 err = mi_pack_runs(mi, attr, run, vcn - svcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 601 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 602 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 603
be71b5cba2e648 Konstantin Komarov 2021-08-13 604 next_svcn = le64_to_cpu(attr->nres.evcn) + 1;
be71b5cba2e648 Konstantin Komarov 2021-08-13 605 new_alloc_tmp = (u64)next_svcn << cluster_bits;
be71b5cba2e648 Konstantin Komarov 2021-08-13 606 attr_b->nres.alloc_size = cpu_to_le64(new_alloc_tmp);
be71b5cba2e648 Konstantin Komarov 2021-08-13 607 mi_b->dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 608
be71b5cba2e648 Konstantin Komarov 2021-08-13 609 if (next_svcn >= vcn && !to_allocate) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 610 /* Normal way. update attribute and exit */
be71b5cba2e648 Konstantin Komarov 2021-08-13 611 attr_b->nres.data_size = cpu_to_le64(new_size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 612 goto ok;
be71b5cba2e648 Konstantin Komarov 2021-08-13 613 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 614
be71b5cba2e648 Konstantin Komarov 2021-08-13 615 /* at least two mft to avoid recursive loop*/
be71b5cba2e648 Konstantin Komarov 2021-08-13 616 if (is_mft && next_svcn == vcn &&
be71b5cba2e648 Konstantin Komarov 2021-08-13 617 ((u64)done << sbi->cluster_bits) >= 2 * sbi->record_size) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 618 new_size = new_alloc_tmp;
be71b5cba2e648 Konstantin Komarov 2021-08-13 619 attr_b->nres.data_size = attr_b->nres.alloc_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 620 goto ok;
be71b5cba2e648 Konstantin Komarov 2021-08-13 621 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 622
be71b5cba2e648 Konstantin Komarov 2021-08-13 623 if (le32_to_cpu(rec->used) < sbi->record_size) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 624 old_alen = next_svcn;
be71b5cba2e648 Konstantin Komarov 2021-08-13 625 evcn = old_alen - 1;
be71b5cba2e648 Konstantin Komarov 2021-08-13 626 goto add_alloc_in_same_attr_seg;
be71b5cba2e648 Konstantin Komarov 2021-08-13 627 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 628
be71b5cba2e648 Konstantin Komarov 2021-08-13 629 attr_b->nres.data_size = attr_b->nres.alloc_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 630 if (new_alloc_tmp < old_valid)
be71b5cba2e648 Konstantin Komarov 2021-08-13 631 attr_b->nres.valid_size = attr_b->nres.data_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 632
be71b5cba2e648 Konstantin Komarov 2021-08-13 633 if (type == ATTR_LIST) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 634 err = ni_expand_list(ni);
be71b5cba2e648 Konstantin Komarov 2021-08-13 635 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 636 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 637 if (next_svcn < vcn)
be71b5cba2e648 Konstantin Komarov 2021-08-13 638 goto pack_runs;
be71b5cba2e648 Konstantin Komarov 2021-08-13 639
be71b5cba2e648 Konstantin Komarov 2021-08-13 640 /* layout of records is changed */
be71b5cba2e648 Konstantin Komarov 2021-08-13 641 goto again;
be71b5cba2e648 Konstantin Komarov 2021-08-13 642 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 643
be71b5cba2e648 Konstantin Komarov 2021-08-13 644 if (!ni->attr_list.size) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 645 err = ni_create_attr_list(ni);
be71b5cba2e648 Konstantin Komarov 2021-08-13 646 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 647 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 648 /* layout of records is changed */
be71b5cba2e648 Konstantin Komarov 2021-08-13 649 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 650
be71b5cba2e648 Konstantin Komarov 2021-08-13 651 if (next_svcn >= vcn) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 652 /* this is mft data, repeat */
be71b5cba2e648 Konstantin Komarov 2021-08-13 653 goto again;
be71b5cba2e648 Konstantin Komarov 2021-08-13 654 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 655
be71b5cba2e648 Konstantin Komarov 2021-08-13 656 /* insert new attribute segment */
be71b5cba2e648 Konstantin Komarov 2021-08-13 657 err = ni_insert_nonresident(ni, type, name, name_len, run,
be71b5cba2e648 Konstantin Komarov 2021-08-13 658 next_svcn, vcn - next_svcn,
be71b5cba2e648 Konstantin Komarov 2021-08-13 659 attr_b->flags, &attr, &mi);
be71b5cba2e648 Konstantin Komarov 2021-08-13 660 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 661 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 662
be71b5cba2e648 Konstantin Komarov 2021-08-13 663 if (!is_mft)
be71b5cba2e648 Konstantin Komarov 2021-08-13 664 run_truncate_head(run, evcn + 1);
be71b5cba2e648 Konstantin Komarov 2021-08-13 665
be71b5cba2e648 Konstantin Komarov 2021-08-13 666 svcn = le64_to_cpu(attr->nres.svcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 667 evcn = le64_to_cpu(attr->nres.evcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 668
be71b5cba2e648 Konstantin Komarov 2021-08-13 669 le_b = NULL;
be71b5cba2e648 Konstantin Komarov 2021-08-13 670 /* layout of records maybe changed */
be71b5cba2e648 Konstantin Komarov 2021-08-13 671 /* find base attribute to update*/
be71b5cba2e648 Konstantin Komarov 2021-08-13 672 attr_b = ni_find_attr(ni, NULL, &le_b, type, name, name_len,
be71b5cba2e648 Konstantin Komarov 2021-08-13 673 NULL, &mi_b);
be71b5cba2e648 Konstantin Komarov 2021-08-13 674 if (!attr_b) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 675 err = -ENOENT;
be71b5cba2e648 Konstantin Komarov 2021-08-13 676 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 677 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 678
be71b5cba2e648 Konstantin Komarov 2021-08-13 679 attr_b->nres.alloc_size = cpu_to_le64((u64)vcn << cluster_bits);
be71b5cba2e648 Konstantin Komarov 2021-08-13 680 attr_b->nres.data_size = attr_b->nres.alloc_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 681 attr_b->nres.valid_size = attr_b->nres.alloc_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 682 mi_b->dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 683 goto again_1;
be71b5cba2e648 Konstantin Komarov 2021-08-13 684 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 685
be71b5cba2e648 Konstantin Komarov 2021-08-13 686 if (new_size != old_size ||
be71b5cba2e648 Konstantin Komarov 2021-08-13 687 (new_alloc != old_alloc && !keep_prealloc)) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 688 vcn = max(svcn, new_alen);
be71b5cba2e648 Konstantin Komarov 2021-08-13 689 new_alloc_tmp = (u64)vcn << cluster_bits;
be71b5cba2e648 Konstantin Komarov 2021-08-13 690
be71b5cba2e648 Konstantin Komarov 2021-08-13 691 alen = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 692 err = run_deallocate_ex(sbi, run, vcn, evcn - vcn + 1, &alen,
be71b5cba2e648 Konstantin Komarov 2021-08-13 693 true);
be71b5cba2e648 Konstantin Komarov 2021-08-13 694 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 695 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 696
be71b5cba2e648 Konstantin Komarov 2021-08-13 697 run_truncate(run, vcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 698
be71b5cba2e648 Konstantin Komarov 2021-08-13 699 if (vcn > svcn) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 700 err = mi_pack_runs(mi, attr, run, vcn - svcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 701 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 702 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 703 } else if (le && le->vcn) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 704 u16 le_sz = le16_to_cpu(le->size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 705
be71b5cba2e648 Konstantin Komarov 2021-08-13 706 /*
be71b5cba2e648 Konstantin Komarov 2021-08-13 707 * NOTE: list entries for one attribute are always
be71b5cba2e648 Konstantin Komarov 2021-08-13 708 * the same size. We deal with last entry (vcn==0)
be71b5cba2e648 Konstantin Komarov 2021-08-13 709 * and it is not first in entries array
be71b5cba2e648 Konstantin Komarov 2021-08-13 710 * (list entry for std attribute always first)
be71b5cba2e648 Konstantin Komarov 2021-08-13 711 * So it is safe to step back
be71b5cba2e648 Konstantin Komarov 2021-08-13 712 */
be71b5cba2e648 Konstantin Komarov 2021-08-13 713 mi_remove_attr(mi, attr);
be71b5cba2e648 Konstantin Komarov 2021-08-13 714
be71b5cba2e648 Konstantin Komarov 2021-08-13 715 if (!al_remove_le(ni, le)) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 716 err = -EINVAL;
be71b5cba2e648 Konstantin Komarov 2021-08-13 717 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 718 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 719
be71b5cba2e648 Konstantin Komarov 2021-08-13 720 le = (struct ATTR_LIST_ENTRY *)((u8 *)le - le_sz);
be71b5cba2e648 Konstantin Komarov 2021-08-13 721 } else {
be71b5cba2e648 Konstantin Komarov 2021-08-13 722 attr->nres.evcn = cpu_to_le64((u64)vcn - 1);
be71b5cba2e648 Konstantin Komarov 2021-08-13 723 mi->dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 724 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 725
be71b5cba2e648 Konstantin Komarov 2021-08-13 726 attr_b->nres.alloc_size = cpu_to_le64(new_alloc_tmp);
be71b5cba2e648 Konstantin Komarov 2021-08-13 727
be71b5cba2e648 Konstantin Komarov 2021-08-13 728 if (vcn == new_alen) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 729 attr_b->nres.data_size = cpu_to_le64(new_size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 730 if (new_size < old_valid)
be71b5cba2e648 Konstantin Komarov 2021-08-13 731 attr_b->nres.valid_size =
be71b5cba2e648 Konstantin Komarov 2021-08-13 732 attr_b->nres.data_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 733 } else {
be71b5cba2e648 Konstantin Komarov 2021-08-13 734 if (new_alloc_tmp <=
be71b5cba2e648 Konstantin Komarov 2021-08-13 735 le64_to_cpu(attr_b->nres.data_size))
be71b5cba2e648 Konstantin Komarov 2021-08-13 736 attr_b->nres.data_size =
be71b5cba2e648 Konstantin Komarov 2021-08-13 737 attr_b->nres.alloc_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 738 if (new_alloc_tmp <
be71b5cba2e648 Konstantin Komarov 2021-08-13 739 le64_to_cpu(attr_b->nres.valid_size))
be71b5cba2e648 Konstantin Komarov 2021-08-13 740 attr_b->nres.valid_size =
be71b5cba2e648 Konstantin Komarov 2021-08-13 741 attr_b->nres.alloc_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 742 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 743
be71b5cba2e648 Konstantin Komarov 2021-08-13 744 if (is_ext)
be71b5cba2e648 Konstantin Komarov 2021-08-13 745 le64_sub_cpu(&attr_b->nres.total_size,
be71b5cba2e648 Konstantin Komarov 2021-08-13 746 ((u64)alen << cluster_bits));
be71b5cba2e648 Konstantin Komarov 2021-08-13 747
be71b5cba2e648 Konstantin Komarov 2021-08-13 748 mi_b->dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 749
be71b5cba2e648 Konstantin Komarov 2021-08-13 750 if (new_alloc_tmp <= new_alloc)
be71b5cba2e648 Konstantin Komarov 2021-08-13 751 goto ok;
be71b5cba2e648 Konstantin Komarov 2021-08-13 752
be71b5cba2e648 Konstantin Komarov 2021-08-13 753 old_size = new_alloc_tmp;
be71b5cba2e648 Konstantin Komarov 2021-08-13 754 vcn = svcn - 1;
be71b5cba2e648 Konstantin Komarov 2021-08-13 755
be71b5cba2e648 Konstantin Komarov 2021-08-13 756 if (le == le_b) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 757 attr = attr_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 758 mi = mi_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 759 evcn = svcn - 1;
be71b5cba2e648 Konstantin Komarov 2021-08-13 760 svcn = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 761 goto next_le;
be71b5cba2e648 Konstantin Komarov 2021-08-13 762 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 763
be71b5cba2e648 Konstantin Komarov 2021-08-13 764 if (le->type != type || le->name_len != name_len ||
be71b5cba2e648 Konstantin Komarov 2021-08-13 @765 memcmp(le_name(le), name, name_len * sizeof(short))) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 766 err = -EINVAL;
be71b5cba2e648 Konstantin Komarov 2021-08-13 767 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 768 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 769
be71b5cba2e648 Konstantin Komarov 2021-08-13 770 err = ni_load_mi(ni, le, &mi);
be71b5cba2e648 Konstantin Komarov 2021-08-13 771 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 772 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 773
be71b5cba2e648 Konstantin Komarov 2021-08-13 774 attr = mi_find_attr(mi, NULL, type, name, name_len, &le->id);
be71b5cba2e648 Konstantin Komarov 2021-08-13 775 if (!attr) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 776 err = -EINVAL;
be71b5cba2e648 Konstantin Komarov 2021-08-13 777 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 778 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 779 goto next_le_1;
be71b5cba2e648 Konstantin Komarov 2021-08-13 780 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 781
be71b5cba2e648 Konstantin Komarov 2021-08-13 782 ok:
be71b5cba2e648 Konstantin Komarov 2021-08-13 783 if (new_valid) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 784 __le64 valid = cpu_to_le64(min(*new_valid, new_size));
be71b5cba2e648 Konstantin Komarov 2021-08-13 785
be71b5cba2e648 Konstantin Komarov 2021-08-13 786 if (attr_b->nres.valid_size != valid) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 787 attr_b->nres.valid_size = valid;
be71b5cba2e648 Konstantin Komarov 2021-08-13 788 mi_b->dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 789 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 790 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 791
be71b5cba2e648 Konstantin Komarov 2021-08-13 792 out:
be71b5cba2e648 Konstantin Komarov 2021-08-13 793 if (!err && attr_b && ret)
be71b5cba2e648 Konstantin Komarov 2021-08-13 794 *ret = attr_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 795
be71b5cba2e648 Konstantin Komarov 2021-08-13 796 /* update inode_set_bytes*/
be71b5cba2e648 Konstantin Komarov 2021-08-13 797 if (!err && ((type == ATTR_DATA && !name_len) ||
be71b5cba2e648 Konstantin Komarov 2021-08-13 798 (type == ATTR_ALLOC && name == I30_NAME))) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 799 bool dirty = false;
be71b5cba2e648 Konstantin Komarov 2021-08-13 800
be71b5cba2e648 Konstantin Komarov 2021-08-13 801 if (ni->vfs_inode.i_size != new_size) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 802 ni->vfs_inode.i_size = new_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 803 dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 804 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 805
be71b5cba2e648 Konstantin Komarov 2021-08-13 806 if (attr_b && attr_b->non_res) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 807 new_alloc = le64_to_cpu(attr_b->nres.alloc_size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 808 if (inode_get_bytes(&ni->vfs_inode) != new_alloc) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 809 inode_set_bytes(&ni->vfs_inode, new_alloc);
be71b5cba2e648 Konstantin Komarov 2021-08-13 810 dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 811 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 812 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 813
be71b5cba2e648 Konstantin Komarov 2021-08-13 814 if (dirty) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 815 ni->ni_flags |= NI_FLAG_UPDATE_PARENT;
be71b5cba2e648 Konstantin Komarov 2021-08-13 816 mark_inode_dirty(&ni->vfs_inode);
be71b5cba2e648 Konstantin Komarov 2021-08-13 817 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 818 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 819
be71b5cba2e648 Konstantin Komarov 2021-08-13 820 return err;
be71b5cba2e648 Konstantin Komarov 2021-08-13 821 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 822
:::::: The code at line 765 was first introduced by commit
:::::: be71b5cba2e6485e8959da7a9f9a44461a1bb074 fs/ntfs3: Add attrib operations
:::::: TO: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
:::::: CC: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] 2+ messages in thread
* fs/ntfs3/attrib.c:765:21: warning: use of NULL 'name' where non-null expected [CWE-476]
@ 2022-06-27 3:04 kernel test robot
0 siblings, 0 replies; 2+ messages in thread
From: kernel test robot @ 2022-06-27 3:04 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 45364 bytes --]
::::::
:::::: Manual check reason: "low confidence bisect report"
:::::: Manual check reason: "low confidence static check first_new_problem: fs/ntfs3/attrib.c:765:21: warning: use of NULL 'name' where non-null expected [CWE-476] [-Wanalyzer-null-argument]"
::::::
CC: kbuild-all(a)lists.01.org
BCC: lkp(a)intel.com
CC: linux-kernel(a)vger.kernel.org
TO: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 8c23f235a6a8ae43abea215812eb9d8cf4dd165e
commit: 6e5be40d32fb1907285277c02e74493ed43d77fe fs/ntfs3: Add NTFS3 in fs/Kconfig and fs/Makefile
date: 11 months ago
:::::: branch date: 20 hours ago
:::::: commit date: 11 months ago
config: arm-randconfig-c002-20220625
compiler: arm-linux-gnueabi-gcc (GCC) 11.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=6e5be40d32fb1907285277c02e74493ed43d77fe
git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
git fetch --no-tags linus master
git checkout 6e5be40d32fb1907285277c02e74493ed43d77fe
# save the config file
ARCH=arm KBUILD_USERCFLAGS='-fanalyzer -Wno-error'
If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>
gcc-analyzer warnings: (new ones prefixed by >>)
| | |
| | (39) ...to here
|......
| 197 | if (err == -ENOSPC && pre) {
| | ~
| | |
| | (40) following 'false' branch...
|......
| 204 | if (err)
| | ~
| | |
| | (41) ...to here
|......
| 207 | if (new_lcn && vcn == vcn0)
| | ~
| | |
| | (42) following 'false' branch...
|......
| 211 | if (!run_add_entry(run, vcn, lcn, flen, opt == ALLOCATE_MFT)) {
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (43) ...to here
|
<------+
|
'attr_make_nonresident': events 44-55
|
| 291 | err = attr_allocate_clusters(sbi, run, 0, 0, len, NULL,
| | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (44) returning to 'attr_make_nonresident' from 'attr_allocate_clusters'
| 292 | ALLOCATE_DEF, &alen, 0, NULL);
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| 293 | if (err)
| | ~
| | |
| | (45) following 'false' branch (when 'err == 0')...
|......
| 296 | if (!rsize) {
| | ~
| | |
| | (46) ...to here
| | (47) following 'false' branch (when 'rsize != 0')...
| 297 | /* empty resident -> non empty nonresident */
| 298 | } else if (!is_data) {
| | ~
| | |
| | (48) ...to here
| | (49) following 'true' branch (when 'is_data != 0')...
|......
| 302 | } else if (!page) {
| | ~
| | |
| | (50) ...to here
| | (51) following 'true' branch (when 'page' is NULL)...
|......
| 305 | page = grab_cache_page(ni->vfs_inode.i_mapping, 0);
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (52) ...to here
| 306 | if (!page) {
| | ~
| | |
| | (53) following 'false' branch...
|......
| 310 | kaddr = kmap_atomic(page);
| | ~~~~~~~~~~~~~~~~~
| | |
| | (54) ...to here
| | (55) calling 'kmap_atomic' from 'attr_make_nonresident'
|
+--> 'kmap_atomic': event 56
|
|include/linux/highmem-internal.h:180:21:
| 180 | static inline void *kmap_atomic(struct page *page)
| | ^~~~~~~~~~~
| | |
| | (56) entry to 'kmap_atomic'
|
'kmap_atomic': event 57
|
|include/linux/mmzone.h:1341:12:
| 1341 | if (!mem_section[SECTION_NR_TO_ROOT(nr)])
| | ^
| | |
| | (57) following 'true' branch...
|
'kmap_atomic': event 58
|
|cc1:
| (58): ...to here
|
'kmap_atomic': event 59
|
| 1372 | unsigned long map = section->section_mem_map;
| | ^~~
| | |
| | (59) dereference of NULL '<unknown>'
|
fs/ntfs3/attrib.c: In function 'attr_set_size':
>> fs/ntfs3/attrib.c:765:21: warning: use of NULL 'name' where non-null expected [CWE-476] [-Wanalyzer-null-argument]
765 | memcmp(le_name(le), name, name_len * sizeof(short))) {
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
'attr_collapse_range': events 1-6
|
| 1688 | int attr_collapse_range(struct ntfs_inode *ni, u64 vbo, u64 bytes)
| | ^~~~~~~~~~~~~~~~~~~
| | |
| | (1) entry to 'attr_collapse_range'
|......
| 1702 | if (!bytes)
| | ~
| | |
| | (2) following 'false' branch (when 'bytes != 0')...
|......
| 1706 | attr_b = ni_find_attr(ni, NULL, &le_b, ATTR_DATA, NULL, 0, NULL, &mi_b);
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (3) ...to here
| 1707 | if (!attr_b)
| | ~
| | |
| | (4) following 'false' branch (when 'attr_b' is non-NULL)...
|......
| 1710 | if (!attr_b->non_res) {
| | ~ ~~~~~~~~~~~~~~~
| | | |
| | | (5) ...to here
| | (6) following 'false' branch...
|
'attr_collapse_range': events 7-12
|
| 1715 | data_size = le64_to_cpu(attr_b->nres.data_size);
|......
| 1727 | if ((vbo & mask) || (bytes & mask)) {
| | ~
| | |
| | (8) following 'false' branch...
|......
| 1732 | if (vbo > data_size)
| | ~
| | |
| | (9) ...to here
| | (10) following 'false' branch (when 'data_size >= vbo')...
|......
| 1735 | down_write(&ni->file.run_lock);
| | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (11) ...to here
| 1736 |
| 1737 | if (vbo + bytes >= data_size) {
| | ~
| | |
| | (12) following 'true' branch...
|
'attr_collapse_range': event 13
|
|include/linux/compiler-gcc.h:42:45:
| 42 | #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
| | ^~~~~~~~~~~~
| | |
| | (13) ...to here
include/linux/minmax.h:31:27: note: in definition of macro '__cmp_once'
| 31 | typeof(x) unique_x = (x); \
| | ^~~~~~~~
include/linux/compiler_types.h:60:22: note: in expansion of macro '___PASTE'
| 60 | #define __PASTE(a,b) ___PASTE(a,b)
| | ^~~~~~~~
include/linux/compiler-gcc.h:42:29: note: in expansion of macro '__PASTE'
| 42 | #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
| | ^~~~~~~
include/linux/compiler_types.h:60:22: note: in expansion of macro '___PASTE'
| 60 | #define __PASTE(a,b) ___PASTE(a,b)
| | ^~~~~~~~
include/linux/compiler-gcc.h:42:37: note: in expansion of macro '__PASTE'
| 42 | #define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), __COUNTER__)
| | ^~~~~~~
include/linux/minmax.h:38:34: note: in expansion of macro '__UNIQUE_ID'
| 38 | __cmp_once(x, y, __UNIQUE_ID(__x), __UNIQUE_ID(__y), op))
| | ^~~~~~~~~~~
include/linux/minmax.h:45:25: note: in expansion of macro '__careful_cmp'
| 45 | #define min(x, y) __careful_cmp(x, y, <)
| | ^~~~~~~~~~~~~
fs/ntfs3/attrib.c:1738:33: note: in expansion of macro 'min'
| 1738 | u64 new_valid = min(ni->i_valid, vbo);
| | ^~~
|
'attr_collapse_range': event 14
|
| 1742 | err = attr_set_size(ni, ATTR_DATA, NULL, 0, &ni->file.run, vbo,
| | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| | |
| | (14) calling 'attr_set_size' from 'attr_collapse_range'
| 1743 | &new_valid, true, NULL);
| | ~~~~~~~~~~~~~~~~~~~~~~~
|
+--> 'attr_set_size': events 15-24
|
| 419 | int attr_set_size(struct ntfs_inode *ni, enum ATTR_TYPE type,
| | ^~~~~~~~~~~~~
| | |
vim +/name +765 fs/ntfs3/attrib.c
be71b5cba2e648 Konstantin Komarov 2021-08-13 408
be71b5cba2e648 Konstantin Komarov 2021-08-13 409 /*
be71b5cba2e648 Konstantin Komarov 2021-08-13 410 * attr_set_size
be71b5cba2e648 Konstantin Komarov 2021-08-13 411 *
be71b5cba2e648 Konstantin Komarov 2021-08-13 412 * change the size of attribute
be71b5cba2e648 Konstantin Komarov 2021-08-13 413 * Extend:
be71b5cba2e648 Konstantin Komarov 2021-08-13 414 * - sparse/compressed: no allocated clusters
be71b5cba2e648 Konstantin Komarov 2021-08-13 415 * - normal: append allocated and preallocated new clusters
be71b5cba2e648 Konstantin Komarov 2021-08-13 416 * Shrink:
be71b5cba2e648 Konstantin Komarov 2021-08-13 417 * - no deallocate if keep_prealloc is set
be71b5cba2e648 Konstantin Komarov 2021-08-13 418 */
be71b5cba2e648 Konstantin Komarov 2021-08-13 419 int attr_set_size(struct ntfs_inode *ni, enum ATTR_TYPE type,
be71b5cba2e648 Konstantin Komarov 2021-08-13 420 const __le16 *name, u8 name_len, struct runs_tree *run,
be71b5cba2e648 Konstantin Komarov 2021-08-13 421 u64 new_size, const u64 *new_valid, bool keep_prealloc,
be71b5cba2e648 Konstantin Komarov 2021-08-13 422 struct ATTRIB **ret)
be71b5cba2e648 Konstantin Komarov 2021-08-13 423 {
be71b5cba2e648 Konstantin Komarov 2021-08-13 424 int err = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 425 struct ntfs_sb_info *sbi = ni->mi.sbi;
be71b5cba2e648 Konstantin Komarov 2021-08-13 426 u8 cluster_bits = sbi->cluster_bits;
be71b5cba2e648 Konstantin Komarov 2021-08-13 427 bool is_mft =
be71b5cba2e648 Konstantin Komarov 2021-08-13 428 ni->mi.rno == MFT_REC_MFT && type == ATTR_DATA && !name_len;
be71b5cba2e648 Konstantin Komarov 2021-08-13 429 u64 old_valid, old_size, old_alloc, new_alloc, new_alloc_tmp;
be71b5cba2e648 Konstantin Komarov 2021-08-13 430 struct ATTRIB *attr = NULL, *attr_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 431 struct ATTR_LIST_ENTRY *le, *le_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 432 struct mft_inode *mi, *mi_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 433 CLST alen, vcn, lcn, new_alen, old_alen, svcn, evcn;
be71b5cba2e648 Konstantin Komarov 2021-08-13 434 CLST next_svcn, pre_alloc = -1, done = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 435 bool is_ext;
be71b5cba2e648 Konstantin Komarov 2021-08-13 436 u32 align;
be71b5cba2e648 Konstantin Komarov 2021-08-13 437 struct MFT_REC *rec;
be71b5cba2e648 Konstantin Komarov 2021-08-13 438
be71b5cba2e648 Konstantin Komarov 2021-08-13 439 again:
be71b5cba2e648 Konstantin Komarov 2021-08-13 440 le_b = NULL;
be71b5cba2e648 Konstantin Komarov 2021-08-13 441 attr_b = ni_find_attr(ni, NULL, &le_b, type, name, name_len, NULL,
be71b5cba2e648 Konstantin Komarov 2021-08-13 442 &mi_b);
be71b5cba2e648 Konstantin Komarov 2021-08-13 443 if (!attr_b) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 444 err = -ENOENT;
be71b5cba2e648 Konstantin Komarov 2021-08-13 445 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 446 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 447
be71b5cba2e648 Konstantin Komarov 2021-08-13 448 if (!attr_b->non_res) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 449 err = attr_set_size_res(ni, attr_b, le_b, mi_b, new_size, run,
be71b5cba2e648 Konstantin Komarov 2021-08-13 450 &attr_b);
be71b5cba2e648 Konstantin Komarov 2021-08-13 451 if (err || !attr_b->non_res)
be71b5cba2e648 Konstantin Komarov 2021-08-13 452 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 453
be71b5cba2e648 Konstantin Komarov 2021-08-13 454 /* layout of records may be changed, so do a full search */
be71b5cba2e648 Konstantin Komarov 2021-08-13 455 goto again;
be71b5cba2e648 Konstantin Komarov 2021-08-13 456 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 457
be71b5cba2e648 Konstantin Komarov 2021-08-13 458 is_ext = is_attr_ext(attr_b);
be71b5cba2e648 Konstantin Komarov 2021-08-13 459
be71b5cba2e648 Konstantin Komarov 2021-08-13 460 again_1:
be71b5cba2e648 Konstantin Komarov 2021-08-13 461 align = sbi->cluster_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 462
be71b5cba2e648 Konstantin Komarov 2021-08-13 463 if (is_ext) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 464 align <<= attr_b->nres.c_unit;
be71b5cba2e648 Konstantin Komarov 2021-08-13 465 if (is_attr_sparsed(attr_b))
be71b5cba2e648 Konstantin Komarov 2021-08-13 466 keep_prealloc = false;
be71b5cba2e648 Konstantin Komarov 2021-08-13 467 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 468
be71b5cba2e648 Konstantin Komarov 2021-08-13 469 old_valid = le64_to_cpu(attr_b->nres.valid_size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 470 old_size = le64_to_cpu(attr_b->nres.data_size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 471 old_alloc = le64_to_cpu(attr_b->nres.alloc_size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 472 old_alen = old_alloc >> cluster_bits;
be71b5cba2e648 Konstantin Komarov 2021-08-13 473
be71b5cba2e648 Konstantin Komarov 2021-08-13 474 new_alloc = (new_size + align - 1) & ~(u64)(align - 1);
be71b5cba2e648 Konstantin Komarov 2021-08-13 475 new_alen = new_alloc >> cluster_bits;
be71b5cba2e648 Konstantin Komarov 2021-08-13 476
be71b5cba2e648 Konstantin Komarov 2021-08-13 477 if (keep_prealloc && is_ext)
be71b5cba2e648 Konstantin Komarov 2021-08-13 478 keep_prealloc = false;
be71b5cba2e648 Konstantin Komarov 2021-08-13 479
be71b5cba2e648 Konstantin Komarov 2021-08-13 480 if (keep_prealloc && new_size < old_size) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 481 attr_b->nres.data_size = cpu_to_le64(new_size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 482 mi_b->dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 483 goto ok;
be71b5cba2e648 Konstantin Komarov 2021-08-13 484 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 485
be71b5cba2e648 Konstantin Komarov 2021-08-13 486 vcn = old_alen - 1;
be71b5cba2e648 Konstantin Komarov 2021-08-13 487
be71b5cba2e648 Konstantin Komarov 2021-08-13 488 svcn = le64_to_cpu(attr_b->nres.svcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 489 evcn = le64_to_cpu(attr_b->nres.evcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 490
be71b5cba2e648 Konstantin Komarov 2021-08-13 491 if (svcn <= vcn && vcn <= evcn) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 492 attr = attr_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 493 le = le_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 494 mi = mi_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 495 } else if (!le_b) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 496 err = -EINVAL;
be71b5cba2e648 Konstantin Komarov 2021-08-13 497 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 498 } else {
be71b5cba2e648 Konstantin Komarov 2021-08-13 499 le = le_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 500 attr = ni_find_attr(ni, attr_b, &le, type, name, name_len, &vcn,
be71b5cba2e648 Konstantin Komarov 2021-08-13 501 &mi);
be71b5cba2e648 Konstantin Komarov 2021-08-13 502 if (!attr) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 503 err = -EINVAL;
be71b5cba2e648 Konstantin Komarov 2021-08-13 504 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 505 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 506
be71b5cba2e648 Konstantin Komarov 2021-08-13 507 next_le_1:
be71b5cba2e648 Konstantin Komarov 2021-08-13 508 svcn = le64_to_cpu(attr->nres.svcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 509 evcn = le64_to_cpu(attr->nres.evcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 510 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 511
be71b5cba2e648 Konstantin Komarov 2021-08-13 512 next_le:
be71b5cba2e648 Konstantin Komarov 2021-08-13 513 rec = mi->mrec;
be71b5cba2e648 Konstantin Komarov 2021-08-13 514
be71b5cba2e648 Konstantin Komarov 2021-08-13 515 err = attr_load_runs(attr, ni, run, NULL);
be71b5cba2e648 Konstantin Komarov 2021-08-13 516 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 517 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 518
be71b5cba2e648 Konstantin Komarov 2021-08-13 519 if (new_size > old_size) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 520 CLST to_allocate;
be71b5cba2e648 Konstantin Komarov 2021-08-13 521 size_t free;
be71b5cba2e648 Konstantin Komarov 2021-08-13 522
be71b5cba2e648 Konstantin Komarov 2021-08-13 523 if (new_alloc <= old_alloc) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 524 attr_b->nres.data_size = cpu_to_le64(new_size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 525 mi_b->dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 526 goto ok;
be71b5cba2e648 Konstantin Komarov 2021-08-13 527 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 528
be71b5cba2e648 Konstantin Komarov 2021-08-13 529 to_allocate = new_alen - old_alen;
be71b5cba2e648 Konstantin Komarov 2021-08-13 530 add_alloc_in_same_attr_seg:
be71b5cba2e648 Konstantin Komarov 2021-08-13 531 lcn = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 532 if (is_mft) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 533 /* mft allocates clusters from mftzone */
be71b5cba2e648 Konstantin Komarov 2021-08-13 534 pre_alloc = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 535 } else if (is_ext) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 536 /* no preallocate for sparse/compress */
be71b5cba2e648 Konstantin Komarov 2021-08-13 537 pre_alloc = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 538 } else if (pre_alloc == -1) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 539 pre_alloc = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 540 if (type == ATTR_DATA && !name_len &&
be71b5cba2e648 Konstantin Komarov 2021-08-13 541 sbi->options.prealloc) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 542 CLST new_alen2 = bytes_to_cluster(
be71b5cba2e648 Konstantin Komarov 2021-08-13 543 sbi, get_pre_allocated(new_size));
be71b5cba2e648 Konstantin Komarov 2021-08-13 544 pre_alloc = new_alen2 - new_alen;
be71b5cba2e648 Konstantin Komarov 2021-08-13 545 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 546
be71b5cba2e648 Konstantin Komarov 2021-08-13 547 /* Get the last lcn to allocate from */
be71b5cba2e648 Konstantin Komarov 2021-08-13 548 if (old_alen &&
be71b5cba2e648 Konstantin Komarov 2021-08-13 549 !run_lookup_entry(run, vcn, &lcn, NULL, NULL)) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 550 lcn = SPARSE_LCN;
be71b5cba2e648 Konstantin Komarov 2021-08-13 551 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 552
be71b5cba2e648 Konstantin Komarov 2021-08-13 553 if (lcn == SPARSE_LCN)
be71b5cba2e648 Konstantin Komarov 2021-08-13 554 lcn = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 555 else if (lcn)
be71b5cba2e648 Konstantin Komarov 2021-08-13 556 lcn += 1;
be71b5cba2e648 Konstantin Komarov 2021-08-13 557
be71b5cba2e648 Konstantin Komarov 2021-08-13 558 free = wnd_zeroes(&sbi->used.bitmap);
be71b5cba2e648 Konstantin Komarov 2021-08-13 559 if (to_allocate > free) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 560 err = -ENOSPC;
be71b5cba2e648 Konstantin Komarov 2021-08-13 561 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 562 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 563
be71b5cba2e648 Konstantin Komarov 2021-08-13 564 if (pre_alloc && to_allocate + pre_alloc > free)
be71b5cba2e648 Konstantin Komarov 2021-08-13 565 pre_alloc = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 566 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 567
be71b5cba2e648 Konstantin Komarov 2021-08-13 568 vcn = old_alen;
be71b5cba2e648 Konstantin Komarov 2021-08-13 569
be71b5cba2e648 Konstantin Komarov 2021-08-13 570 if (is_ext) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 571 if (!run_add_entry(run, vcn, SPARSE_LCN, to_allocate,
be71b5cba2e648 Konstantin Komarov 2021-08-13 572 false)) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 573 err = -ENOMEM;
be71b5cba2e648 Konstantin Komarov 2021-08-13 574 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 575 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 576 alen = to_allocate;
be71b5cba2e648 Konstantin Komarov 2021-08-13 577 } else {
be71b5cba2e648 Konstantin Komarov 2021-08-13 578 /* ~3 bytes per fragment */
be71b5cba2e648 Konstantin Komarov 2021-08-13 579 err = attr_allocate_clusters(
be71b5cba2e648 Konstantin Komarov 2021-08-13 580 sbi, run, vcn, lcn, to_allocate, &pre_alloc,
be71b5cba2e648 Konstantin Komarov 2021-08-13 581 is_mft ? ALLOCATE_MFT : 0, &alen,
be71b5cba2e648 Konstantin Komarov 2021-08-13 582 is_mft ? 0
be71b5cba2e648 Konstantin Komarov 2021-08-13 583 : (sbi->record_size -
be71b5cba2e648 Konstantin Komarov 2021-08-13 584 le32_to_cpu(rec->used) + 8) /
be71b5cba2e648 Konstantin Komarov 2021-08-13 585 3 +
be71b5cba2e648 Konstantin Komarov 2021-08-13 586 1,
be71b5cba2e648 Konstantin Komarov 2021-08-13 587 NULL);
be71b5cba2e648 Konstantin Komarov 2021-08-13 588 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 589 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 590 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 591
be71b5cba2e648 Konstantin Komarov 2021-08-13 592 done += alen;
be71b5cba2e648 Konstantin Komarov 2021-08-13 593 vcn += alen;
be71b5cba2e648 Konstantin Komarov 2021-08-13 594 if (to_allocate > alen)
be71b5cba2e648 Konstantin Komarov 2021-08-13 595 to_allocate -= alen;
be71b5cba2e648 Konstantin Komarov 2021-08-13 596 else
be71b5cba2e648 Konstantin Komarov 2021-08-13 597 to_allocate = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 598
be71b5cba2e648 Konstantin Komarov 2021-08-13 599 pack_runs:
be71b5cba2e648 Konstantin Komarov 2021-08-13 600 err = mi_pack_runs(mi, attr, run, vcn - svcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 601 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 602 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 603
be71b5cba2e648 Konstantin Komarov 2021-08-13 604 next_svcn = le64_to_cpu(attr->nres.evcn) + 1;
be71b5cba2e648 Konstantin Komarov 2021-08-13 605 new_alloc_tmp = (u64)next_svcn << cluster_bits;
be71b5cba2e648 Konstantin Komarov 2021-08-13 606 attr_b->nres.alloc_size = cpu_to_le64(new_alloc_tmp);
be71b5cba2e648 Konstantin Komarov 2021-08-13 607 mi_b->dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 608
be71b5cba2e648 Konstantin Komarov 2021-08-13 609 if (next_svcn >= vcn && !to_allocate) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 610 /* Normal way. update attribute and exit */
be71b5cba2e648 Konstantin Komarov 2021-08-13 611 attr_b->nres.data_size = cpu_to_le64(new_size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 612 goto ok;
be71b5cba2e648 Konstantin Komarov 2021-08-13 613 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 614
be71b5cba2e648 Konstantin Komarov 2021-08-13 615 /* at least two mft to avoid recursive loop*/
be71b5cba2e648 Konstantin Komarov 2021-08-13 616 if (is_mft && next_svcn == vcn &&
be71b5cba2e648 Konstantin Komarov 2021-08-13 617 ((u64)done << sbi->cluster_bits) >= 2 * sbi->record_size) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 618 new_size = new_alloc_tmp;
be71b5cba2e648 Konstantin Komarov 2021-08-13 619 attr_b->nres.data_size = attr_b->nres.alloc_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 620 goto ok;
be71b5cba2e648 Konstantin Komarov 2021-08-13 621 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 622
be71b5cba2e648 Konstantin Komarov 2021-08-13 623 if (le32_to_cpu(rec->used) < sbi->record_size) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 624 old_alen = next_svcn;
be71b5cba2e648 Konstantin Komarov 2021-08-13 625 evcn = old_alen - 1;
be71b5cba2e648 Konstantin Komarov 2021-08-13 626 goto add_alloc_in_same_attr_seg;
be71b5cba2e648 Konstantin Komarov 2021-08-13 627 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 628
be71b5cba2e648 Konstantin Komarov 2021-08-13 629 attr_b->nres.data_size = attr_b->nres.alloc_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 630 if (new_alloc_tmp < old_valid)
be71b5cba2e648 Konstantin Komarov 2021-08-13 631 attr_b->nres.valid_size = attr_b->nres.data_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 632
be71b5cba2e648 Konstantin Komarov 2021-08-13 633 if (type == ATTR_LIST) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 634 err = ni_expand_list(ni);
be71b5cba2e648 Konstantin Komarov 2021-08-13 635 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 636 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 637 if (next_svcn < vcn)
be71b5cba2e648 Konstantin Komarov 2021-08-13 638 goto pack_runs;
be71b5cba2e648 Konstantin Komarov 2021-08-13 639
be71b5cba2e648 Konstantin Komarov 2021-08-13 640 /* layout of records is changed */
be71b5cba2e648 Konstantin Komarov 2021-08-13 641 goto again;
be71b5cba2e648 Konstantin Komarov 2021-08-13 642 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 643
be71b5cba2e648 Konstantin Komarov 2021-08-13 644 if (!ni->attr_list.size) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 645 err = ni_create_attr_list(ni);
be71b5cba2e648 Konstantin Komarov 2021-08-13 646 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 647 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 648 /* layout of records is changed */
be71b5cba2e648 Konstantin Komarov 2021-08-13 649 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 650
be71b5cba2e648 Konstantin Komarov 2021-08-13 651 if (next_svcn >= vcn) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 652 /* this is mft data, repeat */
be71b5cba2e648 Konstantin Komarov 2021-08-13 653 goto again;
be71b5cba2e648 Konstantin Komarov 2021-08-13 654 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 655
be71b5cba2e648 Konstantin Komarov 2021-08-13 656 /* insert new attribute segment */
be71b5cba2e648 Konstantin Komarov 2021-08-13 657 err = ni_insert_nonresident(ni, type, name, name_len, run,
be71b5cba2e648 Konstantin Komarov 2021-08-13 658 next_svcn, vcn - next_svcn,
be71b5cba2e648 Konstantin Komarov 2021-08-13 659 attr_b->flags, &attr, &mi);
be71b5cba2e648 Konstantin Komarov 2021-08-13 660 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 661 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 662
be71b5cba2e648 Konstantin Komarov 2021-08-13 663 if (!is_mft)
be71b5cba2e648 Konstantin Komarov 2021-08-13 664 run_truncate_head(run, evcn + 1);
be71b5cba2e648 Konstantin Komarov 2021-08-13 665
be71b5cba2e648 Konstantin Komarov 2021-08-13 666 svcn = le64_to_cpu(attr->nres.svcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 667 evcn = le64_to_cpu(attr->nres.evcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 668
be71b5cba2e648 Konstantin Komarov 2021-08-13 669 le_b = NULL;
be71b5cba2e648 Konstantin Komarov 2021-08-13 670 /* layout of records maybe changed */
be71b5cba2e648 Konstantin Komarov 2021-08-13 671 /* find base attribute to update*/
be71b5cba2e648 Konstantin Komarov 2021-08-13 672 attr_b = ni_find_attr(ni, NULL, &le_b, type, name, name_len,
be71b5cba2e648 Konstantin Komarov 2021-08-13 673 NULL, &mi_b);
be71b5cba2e648 Konstantin Komarov 2021-08-13 674 if (!attr_b) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 675 err = -ENOENT;
be71b5cba2e648 Konstantin Komarov 2021-08-13 676 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 677 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 678
be71b5cba2e648 Konstantin Komarov 2021-08-13 679 attr_b->nres.alloc_size = cpu_to_le64((u64)vcn << cluster_bits);
be71b5cba2e648 Konstantin Komarov 2021-08-13 680 attr_b->nres.data_size = attr_b->nres.alloc_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 681 attr_b->nres.valid_size = attr_b->nres.alloc_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 682 mi_b->dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 683 goto again_1;
be71b5cba2e648 Konstantin Komarov 2021-08-13 684 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 685
be71b5cba2e648 Konstantin Komarov 2021-08-13 686 if (new_size != old_size ||
be71b5cba2e648 Konstantin Komarov 2021-08-13 687 (new_alloc != old_alloc && !keep_prealloc)) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 688 vcn = max(svcn, new_alen);
be71b5cba2e648 Konstantin Komarov 2021-08-13 689 new_alloc_tmp = (u64)vcn << cluster_bits;
be71b5cba2e648 Konstantin Komarov 2021-08-13 690
be71b5cba2e648 Konstantin Komarov 2021-08-13 691 alen = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 692 err = run_deallocate_ex(sbi, run, vcn, evcn - vcn + 1, &alen,
be71b5cba2e648 Konstantin Komarov 2021-08-13 693 true);
be71b5cba2e648 Konstantin Komarov 2021-08-13 694 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 695 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 696
be71b5cba2e648 Konstantin Komarov 2021-08-13 697 run_truncate(run, vcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 698
be71b5cba2e648 Konstantin Komarov 2021-08-13 699 if (vcn > svcn) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 700 err = mi_pack_runs(mi, attr, run, vcn - svcn);
be71b5cba2e648 Konstantin Komarov 2021-08-13 701 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 702 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 703 } else if (le && le->vcn) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 704 u16 le_sz = le16_to_cpu(le->size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 705
be71b5cba2e648 Konstantin Komarov 2021-08-13 706 /*
be71b5cba2e648 Konstantin Komarov 2021-08-13 707 * NOTE: list entries for one attribute are always
be71b5cba2e648 Konstantin Komarov 2021-08-13 708 * the same size. We deal with last entry (vcn==0)
be71b5cba2e648 Konstantin Komarov 2021-08-13 709 * and it is not first in entries array
be71b5cba2e648 Konstantin Komarov 2021-08-13 710 * (list entry for std attribute always first)
be71b5cba2e648 Konstantin Komarov 2021-08-13 711 * So it is safe to step back
be71b5cba2e648 Konstantin Komarov 2021-08-13 712 */
be71b5cba2e648 Konstantin Komarov 2021-08-13 713 mi_remove_attr(mi, attr);
be71b5cba2e648 Konstantin Komarov 2021-08-13 714
be71b5cba2e648 Konstantin Komarov 2021-08-13 715 if (!al_remove_le(ni, le)) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 716 err = -EINVAL;
be71b5cba2e648 Konstantin Komarov 2021-08-13 717 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 718 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 719
be71b5cba2e648 Konstantin Komarov 2021-08-13 720 le = (struct ATTR_LIST_ENTRY *)((u8 *)le - le_sz);
be71b5cba2e648 Konstantin Komarov 2021-08-13 721 } else {
be71b5cba2e648 Konstantin Komarov 2021-08-13 722 attr->nres.evcn = cpu_to_le64((u64)vcn - 1);
be71b5cba2e648 Konstantin Komarov 2021-08-13 723 mi->dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 724 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 725
be71b5cba2e648 Konstantin Komarov 2021-08-13 726 attr_b->nres.alloc_size = cpu_to_le64(new_alloc_tmp);
be71b5cba2e648 Konstantin Komarov 2021-08-13 727
be71b5cba2e648 Konstantin Komarov 2021-08-13 728 if (vcn == new_alen) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 729 attr_b->nres.data_size = cpu_to_le64(new_size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 730 if (new_size < old_valid)
be71b5cba2e648 Konstantin Komarov 2021-08-13 731 attr_b->nres.valid_size =
be71b5cba2e648 Konstantin Komarov 2021-08-13 732 attr_b->nres.data_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 733 } else {
be71b5cba2e648 Konstantin Komarov 2021-08-13 734 if (new_alloc_tmp <=
be71b5cba2e648 Konstantin Komarov 2021-08-13 735 le64_to_cpu(attr_b->nres.data_size))
be71b5cba2e648 Konstantin Komarov 2021-08-13 736 attr_b->nres.data_size =
be71b5cba2e648 Konstantin Komarov 2021-08-13 737 attr_b->nres.alloc_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 738 if (new_alloc_tmp <
be71b5cba2e648 Konstantin Komarov 2021-08-13 739 le64_to_cpu(attr_b->nres.valid_size))
be71b5cba2e648 Konstantin Komarov 2021-08-13 740 attr_b->nres.valid_size =
be71b5cba2e648 Konstantin Komarov 2021-08-13 741 attr_b->nres.alloc_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 742 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 743
be71b5cba2e648 Konstantin Komarov 2021-08-13 744 if (is_ext)
be71b5cba2e648 Konstantin Komarov 2021-08-13 745 le64_sub_cpu(&attr_b->nres.total_size,
be71b5cba2e648 Konstantin Komarov 2021-08-13 746 ((u64)alen << cluster_bits));
be71b5cba2e648 Konstantin Komarov 2021-08-13 747
be71b5cba2e648 Konstantin Komarov 2021-08-13 748 mi_b->dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 749
be71b5cba2e648 Konstantin Komarov 2021-08-13 750 if (new_alloc_tmp <= new_alloc)
be71b5cba2e648 Konstantin Komarov 2021-08-13 751 goto ok;
be71b5cba2e648 Konstantin Komarov 2021-08-13 752
be71b5cba2e648 Konstantin Komarov 2021-08-13 753 old_size = new_alloc_tmp;
be71b5cba2e648 Konstantin Komarov 2021-08-13 754 vcn = svcn - 1;
be71b5cba2e648 Konstantin Komarov 2021-08-13 755
be71b5cba2e648 Konstantin Komarov 2021-08-13 756 if (le == le_b) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 757 attr = attr_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 758 mi = mi_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 759 evcn = svcn - 1;
be71b5cba2e648 Konstantin Komarov 2021-08-13 760 svcn = 0;
be71b5cba2e648 Konstantin Komarov 2021-08-13 761 goto next_le;
be71b5cba2e648 Konstantin Komarov 2021-08-13 762 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 763
be71b5cba2e648 Konstantin Komarov 2021-08-13 764 if (le->type != type || le->name_len != name_len ||
be71b5cba2e648 Konstantin Komarov 2021-08-13 @765 memcmp(le_name(le), name, name_len * sizeof(short))) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 766 err = -EINVAL;
be71b5cba2e648 Konstantin Komarov 2021-08-13 767 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 768 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 769
be71b5cba2e648 Konstantin Komarov 2021-08-13 770 err = ni_load_mi(ni, le, &mi);
be71b5cba2e648 Konstantin Komarov 2021-08-13 771 if (err)
be71b5cba2e648 Konstantin Komarov 2021-08-13 772 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 773
be71b5cba2e648 Konstantin Komarov 2021-08-13 774 attr = mi_find_attr(mi, NULL, type, name, name_len, &le->id);
be71b5cba2e648 Konstantin Komarov 2021-08-13 775 if (!attr) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 776 err = -EINVAL;
be71b5cba2e648 Konstantin Komarov 2021-08-13 777 goto out;
be71b5cba2e648 Konstantin Komarov 2021-08-13 778 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 779 goto next_le_1;
be71b5cba2e648 Konstantin Komarov 2021-08-13 780 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 781
be71b5cba2e648 Konstantin Komarov 2021-08-13 782 ok:
be71b5cba2e648 Konstantin Komarov 2021-08-13 783 if (new_valid) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 784 __le64 valid = cpu_to_le64(min(*new_valid, new_size));
be71b5cba2e648 Konstantin Komarov 2021-08-13 785
be71b5cba2e648 Konstantin Komarov 2021-08-13 786 if (attr_b->nres.valid_size != valid) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 787 attr_b->nres.valid_size = valid;
be71b5cba2e648 Konstantin Komarov 2021-08-13 788 mi_b->dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 789 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 790 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 791
be71b5cba2e648 Konstantin Komarov 2021-08-13 792 out:
be71b5cba2e648 Konstantin Komarov 2021-08-13 793 if (!err && attr_b && ret)
be71b5cba2e648 Konstantin Komarov 2021-08-13 794 *ret = attr_b;
be71b5cba2e648 Konstantin Komarov 2021-08-13 795
be71b5cba2e648 Konstantin Komarov 2021-08-13 796 /* update inode_set_bytes*/
be71b5cba2e648 Konstantin Komarov 2021-08-13 797 if (!err && ((type == ATTR_DATA && !name_len) ||
be71b5cba2e648 Konstantin Komarov 2021-08-13 798 (type == ATTR_ALLOC && name == I30_NAME))) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 799 bool dirty = false;
be71b5cba2e648 Konstantin Komarov 2021-08-13 800
be71b5cba2e648 Konstantin Komarov 2021-08-13 801 if (ni->vfs_inode.i_size != new_size) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 802 ni->vfs_inode.i_size = new_size;
be71b5cba2e648 Konstantin Komarov 2021-08-13 803 dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 804 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 805
be71b5cba2e648 Konstantin Komarov 2021-08-13 806 if (attr_b && attr_b->non_res) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 807 new_alloc = le64_to_cpu(attr_b->nres.alloc_size);
be71b5cba2e648 Konstantin Komarov 2021-08-13 808 if (inode_get_bytes(&ni->vfs_inode) != new_alloc) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 809 inode_set_bytes(&ni->vfs_inode, new_alloc);
be71b5cba2e648 Konstantin Komarov 2021-08-13 810 dirty = true;
be71b5cba2e648 Konstantin Komarov 2021-08-13 811 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 812 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 813
be71b5cba2e648 Konstantin Komarov 2021-08-13 814 if (dirty) {
be71b5cba2e648 Konstantin Komarov 2021-08-13 815 ni->ni_flags |= NI_FLAG_UPDATE_PARENT;
be71b5cba2e648 Konstantin Komarov 2021-08-13 816 mark_inode_dirty(&ni->vfs_inode);
be71b5cba2e648 Konstantin Komarov 2021-08-13 817 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 818 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 819
be71b5cba2e648 Konstantin Komarov 2021-08-13 820 return err;
be71b5cba2e648 Konstantin Komarov 2021-08-13 821 }
be71b5cba2e648 Konstantin Komarov 2021-08-13 822
:::::: The code at line 765 was first introduced by commit
:::::: be71b5cba2e6485e8959da7a9f9a44461a1bb074 fs/ntfs3: Add attrib operations
:::::: TO: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
:::::: CC: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
--
0-DAY CI Kernel Test Service
https://01.org/lkp
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2022-06-27 3:04 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-27 3:04 fs/ntfs3/attrib.c:765:21: warning: use of NULL 'name' where non-null expected [CWE-476] kernel test robot
-- strict thread matches above, loose matches on Subject: below --
2022-06-27 3:04 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.