Hi Tomohiro,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v4.16-rc5 next-20180316]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:    
https://github.com/0day-ci/linux/commits/Misono-Tomohiro/btrfs-Add-three-new-unprivileged-ioctls-to-allow-normal-users-to-call-sub-list-show-etc/20180318-101013
reproduce:
        # apt-get install sparse
        make ARCH=x86_64 allmodconfig
        make C=1 CF=-D__CHECK_ENDIAN__


sparse warnings: (new ones prefixed by >>)

   fs/btrfs/ioctl.c:1561:9: sparse: incompatible types in comparison expression 
(different address spaces)
>> fs/btrfs/ioctl.c:2414:17: sparse: restricted __le64 degrades to integer
   fs/btrfs/ioctl.c:2538:21: sparse: incorrect type in assignment (different 
address spaces) @@    expected struct btrfs_ioctl_get_subvol_info_args 
[noderef] <asn:1>*subvol_info @@    got sn:1>*subvol_info @@
   fs/btrfs/ioctl.c:2538:21:    expected struct 
btrfs_ioctl_get_subvol_info_args [noderef] <asn:1>*subvol_info
   fs/btrfs/ioctl.c:2538:21:    got void *
   fs/btrfs/ioctl.c:2575:9: sparse: incorrect type in argument 1 (different 
address spaces) @@    expected void *to @@    got unsigned char [noderef] 
<avoid *to @@
   fs/btrfs/ioctl.c:2575:9:    expected void *to
   fs/btrfs/ioctl.c:2575:9:    got unsigned char [noderef] <asn:1>*<noident>
   fs/btrfs/ioctl.c:2576:9: sparse: incorrect type in argument 1 (different 
address spaces) @@    expected void *to @@    got unsigned char [noderef] 
<avoid *to @@
   fs/btrfs/ioctl.c:2576:9:    expected void *to
   fs/btrfs/ioctl.c:2576:9:    got unsigned char [noderef] <asn:1>*<noident>
   fs/btrfs/ioctl.c:2578:9: sparse: incorrect type in argument 1 (different 
address spaces) @@    expected void *to @@    got unsigned char [noderef] 
<avoid *to @@
   fs/btrfs/ioctl.c:2578:9:    expected void *to
   fs/btrfs/ioctl.c:2578:9:    got unsigned char [noderef] <asn:1>*<noident>
   fs/btrfs/ioctl.c:2618:39: sparse: incorrect type in argument 2 (different 
address spaces) @@    expected void *dst @@    got char [noderef] <avoid *dst @@
   fs/btrfs/ioctl.c:2618:39:    expected void *dst
   fs/btrfs/ioctl.c:2618:39:    got char [noderef] <asn:1>*<noident>
   fs/btrfs/ioctl.c:2621:32: sparse: incorrect type in argument 2 (different 
address spaces) @@    expected void const *from @@    got struct 
btrfs_ioctl_get_subvol_info_args [nodervoid const *from @@
   fs/btrfs/ioctl.c:2621:32:    expected void const *from
   fs/btrfs/ioctl.c:2621:32:    got struct btrfs_ioctl_get_subvol_info_args 
[noderef] <asn:1>*subvol_info
   fs/btrfs/ioctl.c:2625:16: sparse: incorrect type in argument 1 (different 
address spaces) @@    expected void const *<noident> @@    got struct 
btrfs_ioctl_get_subvol_info_args [nodervoid const *<noident> @@
   fs/btrfs/ioctl.c:2625:16:    expected void const *<noident>
   fs/btrfs/ioctl.c:2625:16:    got struct btrfs_ioctl_get_subvol_info_args 
[noderef] <asn:1>*subvol_info
   fs/btrfs/ioctl.c:2653:18: sparse: incorrect type in assignment (different 
address spaces) @@    expected struct btrfs_ioctl_get_subvol_rootref_args 
[noderef] <asn:1>*rootrefs @@    got sn:1>*rootrefs @@
   fs/btrfs/ioctl.c:2653:18:    expected struct 
btrfs_ioctl_get_subvol_rootref_args [noderef] <asn:1>*rootrefs
   fs/btrfs/ioctl.c:2653:18:    got void *
   fs/btrfs/ioctl.c:2709:40: sparse: incorrect type in argument 2 (different 
address spaces) @@    expected void const *from @@    got struct 
btrfs_ioctl_get_subvol_rootref_args [nodervoid const *from @@
   fs/btrfs/ioctl.c:2709:40:    expected void const *from
   fs/btrfs/ioctl.c:2709:40:    got struct btrfs_ioctl_get_subvol_rootref_args 
[noderef] <asn:1>*rootrefs
   fs/btrfs/ioctl.c:2714:15: sparse: incorrect type in argument 1 (different 
address spaces) @@    expected void const *<noident> @@    got struct 
btrfs_ioctl_get_subvol_rootref_args [nodervoid const *<noident> @@
   fs/btrfs/ioctl.c:2714:15:    expected void const *<noident>
   fs/btrfs/ioctl.c:2714:15:    got struct btrfs_ioctl_get_subvol_rootref_args 
[noderef] <asn:1>*rootrefs
   fs/btrfs/ioctl.c:3208:24: sparse: incompatible types in comparison 
expression (different address spaces)
   fs/btrfs/ioctl.c:2570:9: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2572:9: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2573:9: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2581:9: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2582:9: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2583:9: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2585:9: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2586:9: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2587:9: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2589:9: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2590:9: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2591:9: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2593:9: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2594:9: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2595:9: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2607:29: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2609:17: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2612:17: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2665:22: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2690:33: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2696:42: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2697:42: sparse: dereference of noderef expression
   fs/btrfs/ioctl.c:2708:17: sparse: dereference of noderef expression

vim +2414 fs/btrfs/ioctl.c

  2269  
  2270  static noinline int btrfs_search_path_in_tree_user(struct inode *inode,
  2271                                  struct btrfs_ioctl_ino_lookup_user_args 
*args)
  2272  {
  2273          struct btrfs_fs_info *fs_info = BTRFS_I(inode)->root->fs_info;
  2274          struct super_block *sb = inode->i_sb;
  2275          struct btrfs_key upper_limit = BTRFS_I(inode)->location;
  2276          u64 treeid = BTRFS_I(inode)->root->root_key.objectid;
  2277          u64 dirid = args->dirid;
  2278  
  2279          unsigned long item_off;
  2280          unsigned long item_len;
  2281          struct btrfs_inode_ref *iref;
  2282          struct btrfs_root_ref rref;
  2283          struct btrfs_root *root;
  2284          struct btrfs_path *path;
  2285          struct btrfs_key key, key2;
  2286          struct extent_buffer *l;
  2287          struct inode *temp_inode;
  2288          char *ptr;
  2289          int slot;
  2290          int len;
  2291          int total_len = 0;
  2292          int ret = -1;
  2293  
  2294          path = btrfs_alloc_path();
  2295          if (!path)
  2296                  return -ENOMEM;
  2297  
  2298          /*
  2299           * If the bottom subvolume does not exist directly under 
upper_limit,
  2300           * construct the path in bottomup way.
  2301           */
  2302          if (dirid != upper_limit.objectid) {
  2303                  ptr = &args->path[BTRFS_INO_LOOKUP_USER_PATH_MAX - 1];
  2304  
  2305                  key.objectid = treeid;
  2306                  key.type = BTRFS_ROOT_ITEM_KEY;
  2307                  key.offset = (u64)-1;
  2308                  root = btrfs_read_fs_root_no_name(fs_info, &key);
  2309                  if (IS_ERR(root)) {
  2310                          ret = -ENOENT;
  2311                          goto out;
  2312                  }
  2313  
  2314                  key.objectid = dirid;
  2315                  key.type = BTRFS_INODE_REF_KEY;
  2316                  key.offset = (u64)-1;
  2317                  while (1) {
  2318                          ret = btrfs_search_slot(NULL, root, &key, path, 
0, 0);
  2319                          if (ret < 0) {
  2320                                  goto out;
  2321                          } else if (ret > 0) {
  2322                                  ret = btrfs_previous_item(root, path, 
dirid,
  2323                                                            
BTRFS_INODE_REF_KEY);
  2324                                  if (ret < 0) {
  2325                                          goto out;
  2326                                  } else if (ret > 0) {
  2327                                          ret = -ENOENT;
  2328                                          goto out;
  2329                                  }
  2330                          }
  2331  
  2332                          l = path->nodes[0];
  2333                          slot = path->slots[0];
  2334                          btrfs_item_key_to_cpu(l, &key, slot);
  2335  
  2336                          iref = btrfs_item_ptr(l, slot, struct 
btrfs_inode_ref);
  2337                          len = btrfs_inode_ref_name_len(l, iref);
  2338                          ptr -= len + 1;
  2339                          total_len += len + 1;
  2340                          if (ptr < args->path) {
  2341                                  ret = -ENAMETOOLONG;
  2342                                  goto out;
  2343                          }
  2344  
  2345                          *(ptr + len) = '/';
  2346                          read_extent_buffer(l, ptr,
  2347                              (unsigned long)(iref + 1), len);
  2348  
  2349                          /* Check the read+exec permission of this 
directory */
  2350                          ret = btrfs_previous_item(root, path, dirid,
  2351                                                    BTRFS_INODE_ITEM_KEY);
  2352                          if (ret < 0) {
  2353                                  goto out;
  2354                          } else if (ret > 0) {
  2355                                  ret = -ENOENT;
  2356                                  goto out;
  2357                          }
  2358  
  2359                          l = path->nodes[0];
  2360                          slot = path->slots[0];
  2361                          btrfs_item_key_to_cpu(l, &key2, slot);
  2362                          if (key2.objectid != dirid) {
  2363                                  ret = -ENOENT;
  2364                                  goto out;
  2365                          }
  2366  
  2367                          temp_inode = btrfs_iget(sb, &key2, root, NULL);
  2368                          ret = inode_permission(temp_inode, MAY_READ | 
MAY_EXEC);
  2369                          iput(temp_inode);
  2370                          if (ret) {
  2371                                  ret = -EACCES;
  2372                                  goto out;
  2373                          }
  2374  
  2375                          if (key.offset == upper_limit.objectid)
  2376                                  break;
  2377                          if (key.objectid == BTRFS_FIRST_FREE_OBJECTID) {
  2378                                  ret = -EACCES;
  2379                                  goto out;
  2380                          }
  2381  
  2382                          btrfs_release_path(path);
  2383                          key.objectid = key.offset;
  2384                          key.offset = (u64)-1;
  2385                          dirid = key.objectid;
  2386                  }
  2387  
  2388                  memmove(args->path, ptr, total_len);
  2389                  args->path[total_len] = '\0';
  2390                  btrfs_release_path(path);
  2391          }
  2392  
  2393          /* get the bottom subolume's name from ROOT_REF */
  2394          root = fs_info->tree_root;
  2395          key.objectid = treeid;
  2396          key.type = BTRFS_ROOT_REF_KEY;
  2397          key.offset = args->subvolid;
  2398          ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
  2399          if (ret < 0) {
  2400                  goto out;
  2401          } else if (ret > 0) {
  2402                  ret = -ENOENT;
  2403                  goto out;
  2404          }
  2405  
  2406          l = path->nodes[0];
  2407          slot = path->slots[0];
  2408          btrfs_item_key_to_cpu(l, &key, slot);
  2409  
  2410          item_off = btrfs_item_ptr_offset(l, slot);
  2411          item_len = btrfs_item_size_nr(l, slot);
  2412          /* check if dirid in ROOT_REF corresponds to passed dirid */
  2413          read_extent_buffer(l, &rref, item_off, sizeof(struct 
btrfs_root_ref));
> 2414          if (rref.dirid != args->dirid) {
  2415                  ret = -EINVAL;
  2416                  goto out;
  2417          }
  2418  
  2419          /* copy subvolume's name */
  2420          item_off += sizeof(struct btrfs_root_ref);
  2421          item_len -= sizeof(struct btrfs_root_ref);
  2422          read_extent_buffer(l, args->name, item_off, item_len);
  2423          args->name[item_len] = '\0';
  2424  
  2425  out:
  2426          btrfs_free_path(path);
  2427          return ret;
  2428  }
  2429  

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to