The argument to locks_unlink_lock can't be just any pointer to a pointer. It must be a pointer to the fl_next field in the previous lock in the list.
Unified · Split
| @@ -1619,7 +1619,7 @@ static int generic_add_lease(struct file *filp, long arg, struct file_lock **flp · 1618 unmodified lines | ||
| 1619 | 1619 | smp_mb(); |
| 1620 | 1620 | error = check_conflicting_open(dentry, arg); |
| 1621 | 1621 | if (error) |
| 1622 | − locks_unlink_lock(flp); | |
| 1622 | + locks_unlink_lock(before); | |
| 1623 | 1623 | out: |
| 1624 | 1624 | if (is_deleg) |
| 1625 | 1625 | mutex_unlock(&inode->i_mutex); |