[rhvgoyal:ioannis-fanotify 13/18] fs/notify/fanotify/fanotify_user.c:1637 do_fanotify_mark() warn: inconsistent indenting

From: kernel test robot
Date: Sat Apr 30 2022 - 03:03:48 EST


tree: https://github.com/rhvgoyal/linux ioannis-fanotify
head: 10887e7003a6a801e521d59daff76f0c035f061f
commit: c8e47599d4489ca1c6a72c73882a36b3f5f23b47 [13/18] Fanotify, Inotify: Send remote request when adding a local watch
config: nios2-randconfig-m031-20220428 (https://download.01.org/0day-ci/archive/20220430/202204301433.yqsNAcRP-lkp@xxxxxxxxx/config)
compiler: nios2-linux-gcc (GCC) 11.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>

New smatch warnings:
fs/notify/fanotify/fanotify_user.c:1637 do_fanotify_mark() warn: inconsistent indenting
fs/notify/fanotify/fanotify_user.c:1693 do_fanotify_mark() warn: variable dereferenced before check 'inode' (see line 1667)

Old smatch warnings:
arch/nios2/include/asm/thread_info.h:62 current_thread_info() error: uninitialized symbol 'sp'.
fs/notify/fanotify/fanotify_user.c:422 copy_fid_info_to_user() error: we previously assumed 'fh' could be null (see line 381)
fs/notify/fanotify/fanotify_user.c:1686 do_fanotify_mark() error: we previously assumed 'mnt' could be null (see line 1667)
fs/notify/fanotify/fanotify_user.c:1710 do_fanotify_mark() warn: variable dereferenced before check 'inode' (see line 1667)

vim +1637 fs/notify/fanotify/fanotify_user.c

1501
1502 static int do_fanotify_mark(int fanotify_fd, unsigned int flags, __u64 mask,
1503 int dfd, const char __user *pathname)
1504 {
1505 struct inode *inode = NULL;
1506 struct vfsmount *mnt = NULL;
1507 struct fsnotify_group *group;
1508 struct fd f;
1509 struct path path;
1510 __kernel_fsid_t __fsid, *fsid = NULL;
1511 u32 valid_mask = FANOTIFY_EVENTS | FANOTIFY_EVENT_FLAGS;
1512 unsigned int mark_type = flags & FANOTIFY_MARK_TYPE_BITS;
1513 bool ignored = flags & FAN_MARK_IGNORED_MASK;
1514 unsigned int obj_type, fid_mode;
1515 u32 umask = 0;
1516 int ret;
1517
1518 pr_debug("%s: fanotify_fd=%d flags=%x dfd=%d pathname=%p mask=%llx\n",
1519 __func__, fanotify_fd, flags, dfd, pathname, mask);
1520
1521 /* we only use the lower 32 bits as of right now. */
1522 if (upper_32_bits(mask))
1523 return -EINVAL;
1524
1525 if (flags & ~FANOTIFY_MARK_FLAGS)
1526 return -EINVAL;
1527
1528 switch (mark_type) {
1529 case FAN_MARK_INODE:
1530 obj_type = FSNOTIFY_OBJ_TYPE_INODE;
1531 break;
1532 case FAN_MARK_MOUNT:
1533 obj_type = FSNOTIFY_OBJ_TYPE_VFSMOUNT;
1534 break;
1535 case FAN_MARK_FILESYSTEM:
1536 obj_type = FSNOTIFY_OBJ_TYPE_SB;
1537 break;
1538 default:
1539 return -EINVAL;
1540 }
1541
1542 switch (flags & (FAN_MARK_ADD | FAN_MARK_REMOVE | FAN_MARK_FLUSH)) {
1543 case FAN_MARK_ADD:
1544 case FAN_MARK_REMOVE:
1545 if (!mask)
1546 return -EINVAL;
1547 break;
1548 case FAN_MARK_FLUSH:
1549 if (flags & ~(FANOTIFY_MARK_TYPE_BITS | FAN_MARK_FLUSH))
1550 return -EINVAL;
1551 break;
1552 default:
1553 return -EINVAL;
1554 }
1555
1556 if (IS_ENABLED(CONFIG_FANOTIFY_ACCESS_PERMISSIONS))
1557 valid_mask |= FANOTIFY_PERM_EVENTS;
1558
1559 if (mask & ~valid_mask)
1560 return -EINVAL;
1561
1562 /* Event flags (ONDIR, ON_CHILD) are meaningless in ignored mask */
1563 if (ignored)
1564 mask &= ~FANOTIFY_EVENT_FLAGS;
1565
1566 f = fdget(fanotify_fd);
1567 if (unlikely(!f.file))
1568 return -EBADF;
1569
1570 /* verify that this is indeed an fanotify instance */
1571 ret = -EINVAL;
1572 if (unlikely(f.file->f_op != &fanotify_fops))
1573 goto fput_and_out;
1574 group = f.file->private_data;
1575
1576 /*
1577 * An unprivileged user is not allowed to setup mount nor filesystem
1578 * marks. This also includes setting up such marks by a group that
1579 * was initialized by an unprivileged user.
1580 */
1581 ret = -EPERM;
1582 if ((!capable(CAP_SYS_ADMIN) ||
1583 FAN_GROUP_FLAG(group, FANOTIFY_UNPRIV)) &&
1584 mark_type != FAN_MARK_INODE)
1585 goto fput_and_out;
1586
1587 /*
1588 * group->priority == FS_PRIO_0 == FAN_CLASS_NOTIF. These are not
1589 * allowed to set permissions events.
1590 */
1591 ret = -EINVAL;
1592 if (mask & FANOTIFY_PERM_EVENTS &&
1593 group->priority == FS_PRIO_0)
1594 goto fput_and_out;
1595
1596 if (mask & FAN_FS_ERROR &&
1597 mark_type != FAN_MARK_FILESYSTEM)
1598 goto fput_and_out;
1599
1600 /*
1601 * Events that do not carry enough information to report
1602 * event->fd require a group that supports reporting fid. Those
1603 * events are not supported on a mount mark, because they do not
1604 * carry enough information (i.e. path) to be filtered by mount
1605 * point.
1606 */
1607 fid_mode = FAN_GROUP_FLAG(group, FANOTIFY_FID_BITS);
1608 if (mask & ~(FANOTIFY_FD_EVENTS|FANOTIFY_EVENT_FLAGS) &&
1609 (!fid_mode || mark_type == FAN_MARK_MOUNT))
1610 goto fput_and_out;
1611
1612 /*
1613 * FAN_RENAME uses special info type records to report the old and
1614 * new parent+name. Reporting only old and new parent id is less
1615 * useful and was not implemented.
1616 */
1617 if (mask & FAN_RENAME && !(fid_mode & FAN_REPORT_NAME))
1618 goto fput_and_out;
1619
1620 if (flags & FAN_MARK_FLUSH) {
1621 ret = 0;
1622 if (mark_type == FAN_MARK_MOUNT)
1623 fsnotify_clear_vfsmount_marks_by_group(group);
1624 else if (mark_type == FAN_MARK_FILESYSTEM)
1625 fsnotify_clear_sb_marks_by_group(group);
1626 else
1627 fsnotify_clear_inode_marks_by_group(group);
1628 goto fput_and_out;
1629 }
1630
1631 ret = fanotify_find_path(dfd, pathname, &path, flags,
1632 (mask & ALL_FSNOTIFY_EVENTS), obj_type);
1633 if (ret)
1634 goto fput_and_out;
1635
1636 /* We do not support fid_mode plus remote fsnotify */
> 1637 ret = -EPERM;
1638 if (!fid_mode && mark_type == FAN_MARK_INODE &&
1639 path.dentry->d_inode->i_op->fsnotify_update)
1640 goto fput_and_out;
1641
1642 if (flags & FAN_MARK_ADD) {
1643 ret = fanotify_events_supported(&path, mask);
1644 if (ret)
1645 goto path_put_and_out;
1646 }
1647
1648 if (fid_mode) {
1649 ret = fanotify_test_fsid(path.dentry, &__fsid);
1650 if (ret)
1651 goto path_put_and_out;
1652
1653 ret = fanotify_test_fid(path.dentry);
1654 if (ret)
1655 goto path_put_and_out;
1656
1657 fsid = &__fsid;
1658 }
1659
1660 /* inode held in place by reference to path; group by fget on fd */
1661 if (mark_type == FAN_MARK_INODE)
1662 inode = path.dentry->d_inode;
1663 else
1664 mnt = path.mnt;
1665
1666 /* Mask out FAN_EVENT_ON_CHILD flag for sb/mount/non-dir marks */
> 1667 if (mnt || !S_ISDIR(inode->i_mode)) {
1668 mask &= ~FAN_EVENT_ON_CHILD;
1669 umask = FAN_EVENT_ON_CHILD;
1670 /*
1671 * If group needs to report parent fid, register for getting
1672 * events with parent/name info for non-directory.
1673 */
1674 if ((fid_mode & FAN_REPORT_DIR_FID) &&
1675 (flags & FAN_MARK_ADD) && !ignored)
1676 mask |= FAN_EVENT_ON_CHILD;
1677 }
1678
1679 /* create/update an inode mark */
1680 switch (flags & (FAN_MARK_ADD | FAN_MARK_REMOVE)) {
1681 case FAN_MARK_ADD:
1682 if (mark_type == FAN_MARK_MOUNT)
1683 ret = fanotify_add_vfsmount_mark(group, mnt, mask,
1684 flags, fsid);
1685 else if (mark_type == FAN_MARK_FILESYSTEM)
1686 ret = fanotify_add_sb_mark(group, mnt->mnt_sb, mask,
1687 flags, fsid);
1688 else {
1689 ret = fanotify_add_inode_mark(group, inode, mask,
1690 flags, fsid);
1691 /* Only if the object is an inode send a request to FUSE server */
1692 if (ret == 0){
> 1693 if (inode && inode->i_op->fsnotify_update)
1694 inode->i_op->fsnotify_update(inode);
1695 }
1696 }
1697 break;
1698 case FAN_MARK_REMOVE:
1699 if (mark_type == FAN_MARK_MOUNT)
1700 ret = fanotify_remove_vfsmount_mark(group, mnt, mask,
1701 flags, umask);
1702 else if (mark_type == FAN_MARK_FILESYSTEM)
1703 ret = fanotify_remove_sb_mark(group, mnt->mnt_sb, mask,
1704 flags, umask);
1705 else {
1706 ret = fanotify_remove_inode_mark(group, inode, mask,
1707 flags, umask);
1708 /* Only if the object is an inode send a request to FUSE server */
1709 if (ret == 0){
1710 if (inode && inode->i_op->fsnotify_update)
1711 inode->i_op->fsnotify_update(inode);
1712 }
1713 }
1714 break;
1715 default:
1716 ret = -EINVAL;
1717 }
1718
1719 path_put_and_out:
1720 path_put(&path);
1721 fput_and_out:
1722 fdput(f);
1723 return ret;
1724 }
1725

--
0-DAY CI Kernel Test Service
https://01.org/lkp