[amir73il:fan_rename 6/8] fs/notify/fanotify/fanotify.c:796:8: warning: variable 'old_memcg' is used uninitialized whenever 'if' condition is true
From: kernel test robot
Date: Wed Nov 17 2021 - 23:38:51 EST
tree: https://github.com/amir73il/linux fan_rename
head: d853df988fac35734c681deca299d26358f3e2fd
commit: 5fe3b310a5dc68cff5bd3dfbdfcc4c699a11ab15 [6/8] fanotify: record either old name new name or both for FAN_RENAME
config: hexagon-randconfig-r045-20211118 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project c46becf500df2a7fb4b4fce16178a036c344315a)
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://github.com/amir73il/linux/commit/5fe3b310a5dc68cff5bd3dfbdfcc4c699a11ab15
git remote add amir73il https://github.com/amir73il/linux
git fetch --no-tags amir73il fan_rename
git checkout 5fe3b310a5dc68cff5bd3dfbdfcc4c699a11ab15
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 ARCH=hexagon
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>
All warnings (new ones prefixed by >>):
>> fs/notify/fanotify/fanotify.c:796:8: warning: variable 'old_memcg' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized]
if (WARN_ON_ONCE(!(mask & FAN_MOVE)))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
include/asm-generic/bug.h:179:33: note: expanded from macro 'WARN_ON_ONCE'
#define WARN_ON_ONCE(condition) WARN_ON(condition)
^~~~~~~~~~~~~~~~~~
include/asm-generic/bug.h:165:28: note: expanded from macro 'WARN_ON'
#define WARN_ON(condition) ({ \
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/notify/fanotify/fanotify.c:856:19: note: uninitialized use occurs here
set_active_memcg(old_memcg);
^~~~~~~~~
fs/notify/fanotify/fanotify.c:796:4: note: remove the 'if' if its condition is always false
if (WARN_ON_ONCE(!(mask & FAN_MOVE)))
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
fs/notify/fanotify/fanotify.c:749:30: note: initialize the variable 'old_memcg' to silence this warning
struct mem_cgroup *old_memcg;
^
= NULL
1 warning generated.
vim +796 fs/notify/fanotify/fanotify.c
735
736 static struct fanotify_event *fanotify_alloc_event(struct fsnotify_group *group,
737 u32 mask, const void *data,
738 int data_type, struct inode *dir,
739 const struct qstr *file_name,
740 __kernel_fsid_t *fsid)
741 {
742 struct fanotify_event *event = NULL;
743 gfp_t gfp = GFP_KERNEL_ACCOUNT;
744 unsigned int fid_mode = FAN_GROUP_FLAG(group, FANOTIFY_FID_BITS);
745 struct inode *id = fanotify_fid_inode(mask, data, data_type, dir,
746 fid_mode);
747 struct inode *dirid = fanotify_dfid_inode(mask, data, data_type, dir);
748 const struct path *path = fsnotify_data_path(data, data_type);
749 struct mem_cgroup *old_memcg;
750 struct dentry *moved = NULL;
751 struct inode *child = NULL;
752 bool name_event = false;
753 unsigned int hash = 0;
754 bool ondir = mask & FAN_ONDIR;
755 struct pid *pid;
756
757 if ((fid_mode & FAN_REPORT_DIR_FID) && dirid) {
758 /*
759 * For certain events and group flags, report the child fid
760 * in addition to reporting the parent fid and maybe child name.
761 */
762 if (fanotify_report_child_fid(fid_mode, mask) && id != dirid)
763 child = id;
764
765 id = dirid;
766
767 /*
768 * We record file name only in a group with FAN_REPORT_NAME
769 * and when we have a directory inode to report.
770 *
771 * For directory entry modification event, we record the fid of
772 * the directory and the name of the modified entry.
773 *
774 * For event on non-directory that is reported to parent, we
775 * record the fid of the parent and the name of the child.
776 *
777 * Even if not reporting name, we need a variable length
778 * fanotify_name_event if reporting both parent and child fids.
779 */
780 if (!(fid_mode & FAN_REPORT_NAME)) {
781 name_event = !!child;
782 file_name = NULL;
783 } else if ((mask & ALL_FSNOTIFY_DIRENT_EVENTS) || !ondir) {
784 name_event = true;
785 }
786
787 /*
788 * In the special case of FAN_RENAME event, the FAN_MOVE flags
789 * are only used internally to indicate if we need to report
790 * only the old parent+name, only the new parent+name or both.
791 * 'dirid' and 'file_name' are the old parent+name and
792 * 'moved' has the new parent+name.
793 */
794 if (mask & FAN_RENAME) {
795 /* Either old and/or new info must be reported */
> 796 if (WARN_ON_ONCE(!(mask & FAN_MOVE)))
797 goto out;
798
799 if (!(mask & FAN_MOVED_FROM)) {
800 /* Do not report old parent+name */
801 dirid = NULL;
802 file_name = NULL;
803 }
804 if (mask & FAN_MOVED_FROM) {
805 /* Report new parent+name */
806 moved = fsnotify_data_dentry(data, data_type);
807 }
808 /* Clear internal flags */
809 mask &= ~FAN_MOVE;
810 name_event = true;
811 }
812 }
813
814 /*
815 * For queues with unlimited length lost events are not expected and
816 * can possibly have security implications. Avoid losing events when
817 * memory is short. For the limited size queues, avoid OOM killer in the
818 * target monitoring memcg as it may have security repercussion.
819 */
820 if (group->max_events == UINT_MAX)
821 gfp |= __GFP_NOFAIL;
822 else
823 gfp |= __GFP_RETRY_MAYFAIL;
824
825 /* Whoever is interested in the event, pays for the allocation. */
826 old_memcg = set_active_memcg(group->memcg);
827
828 if (fanotify_is_perm_event(mask)) {
829 event = fanotify_alloc_perm_event(path, gfp);
830 } else if (fanotify_is_error_event(mask)) {
831 event = fanotify_alloc_error_event(group, fsid, data,
832 data_type, &hash);
833 } else if (name_event && (file_name || moved || child)) {
834 event = fanotify_alloc_name_event(dirid, fsid, file_name, child,
835 moved, &hash, gfp);
836 } else if (fid_mode) {
837 event = fanotify_alloc_fid_event(id, fsid, &hash, gfp);
838 } else {
839 event = fanotify_alloc_path_event(path, &hash, gfp);
840 }
841
842 if (!event)
843 goto out;
844
845 if (FAN_GROUP_FLAG(group, FAN_REPORT_TID))
846 pid = get_pid(task_pid(current));
847 else
848 pid = get_pid(task_tgid(current));
849
850 /* Mix event info, FAN_ONDIR flag and pid into event merge key */
851 hash ^= hash_long((unsigned long)pid | ondir, FANOTIFY_EVENT_HASH_BITS);
852 fanotify_init_event(event, hash, mask);
853 event->pid = pid;
854
855 out:
856 set_active_memcg(old_memcg);
857 return event;
858 }
859
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx
Attachment:
.config.gz
Description: application/gzip