Hello Alexander Aring, The patch 7a3de7324c2b: "fs: dlm: trace user space callbacks" from Aug 15, 2022, leads to the following Smatch static checker warning:
fs/dlm/lock.c:5900 dlm_user_request() warn: 'lkb' was already freed. fs/dlm/lock.c 5832 int dlm_user_request(struct dlm_ls *ls, struct dlm_user_args *ua, 5833 int mode, uint32_t flags, void *name, unsigned int namelen) 5834 #endif 5835 { 5836 struct dlm_lkb *lkb; 5837 struct dlm_args args; 5838 int error; 5839 5840 dlm_lock_recovery(ls); 5841 5842 error = create_lkb(ls, &lkb); 5843 if (error) { 5844 kfree(ua); 5845 goto out; 5846 } 5847 5848 trace_dlm_lock_start(ls, lkb, name, namelen, mode, flags); 5849 5850 if (flags & DLM_LKF_VALBLK) { 5851 ua->lksb.sb_lvbptr = kzalloc(DLM_USER_LVB_LEN, GFP_NOFS); 5852 if (!ua->lksb.sb_lvbptr) { 5853 kfree(ua); 5854 __put_lkb(ls, lkb); 5855 error = -ENOMEM; 5856 goto out_trace_end; 5857 } 5858 } 5859 #ifdef CONFIG_DLM_DEPRECATED_API 5860 error = set_lock_args(mode, &ua->lksb, flags, namelen, timeout_cs, 5861 fake_astfn, ua, fake_bastfn, &args); 5862 #else 5863 error = set_lock_args(mode, &ua->lksb, flags, namelen, fake_astfn, ua, 5864 fake_bastfn, &args); 5865 #endif 5866 if (error) { 5867 kfree(ua->lksb.sb_lvbptr); 5868 ua->lksb.sb_lvbptr = NULL; 5869 kfree(ua); 5870 __put_lkb(ls, lkb); 5871 goto out_trace_end; 5872 } 5873 5874 /* After ua is attached to lkb it will be freed by dlm_free_lkb(). 5875 When DLM_IFL_USER is set, the dlm knows that this is a userspace 5876 lock and that lkb_astparam is the dlm_user_args structure. */ 5877 lkb->lkb_flags |= DLM_IFL_USER; 5878 error = request_lock(ls, lkb, name, namelen, &args); 5879 5880 switch (error) { 5881 case 0: 5882 break; 5883 case -EINPROGRESS: 5884 error = 0; 5885 break; 5886 case -EAGAIN: 5887 error = 0; 5888 fallthrough; 5889 default: 5890 __put_lkb(ls, lkb); 5891 goto out_trace_end; 5892 } 5893 5894 /* add this new lkb to the per-process list of locks */ 5895 spin_lock(&ua->proc->locks_spin); 5896 hold_lkb(lkb); 5897 list_add_tail(&lkb->lkb_ownqueue, &ua->proc->locks); 5898 spin_unlock(&ua->proc->locks_spin); 5899 out_trace_end: --> 5900 trace_dlm_lock_end(ls, lkb, name, namelen, mode, flags, error, false); ^^^ This is freed, but probably the trace code doesn't care? I'm not sure. 5901 out: 5902 dlm_unlock_recovery(ls); 5903 return error; 5904 } 5905 5906 #ifdef CONFIG_DLM_DEPRECATED_API 5907 int dlm_user_convert(struct dlm_ls *ls, struct dlm_user_args *ua_tmp, 5908 int mode, uint32_t flags, uint32_t lkid, char *lvb_in, 5909 unsigned long timeout_cs) 5910 #else regards, dan carpenter