All of lore.kernel.org
 help / color / mirror / Atom feed
* 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

* 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

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
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.