|
@@ -3781,7 +3781,7 @@ static struct file_lock *nfs4_alloc_init_lease(struct nfs4_file *fp, int flag)
|
|
|
static int nfs4_setlease(struct nfs4_delegation *dp)
|
|
|
{
|
|
|
struct nfs4_file *fp = dp->dl_stid.sc_file;
|
|
|
- struct file_lock *fl;
|
|
|
+ struct file_lock *fl, *ret;
|
|
|
struct file *filp;
|
|
|
int status = 0;
|
|
|
|
|
@@ -3795,11 +3795,14 @@ static int nfs4_setlease(struct nfs4_delegation *dp)
|
|
|
return -EBADF;
|
|
|
}
|
|
|
fl->fl_file = filp;
|
|
|
- status = vfs_setlease(filp, fl->fl_type, &fl);
|
|
|
+ ret = fl;
|
|
|
+ status = vfs_setlease(filp, fl->fl_type, &ret);
|
|
|
if (status) {
|
|
|
locks_free_lock(fl);
|
|
|
goto out_fput;
|
|
|
}
|
|
|
+ if (ret != fl)
|
|
|
+ locks_free_lock(fl);
|
|
|
spin_lock(&state_lock);
|
|
|
spin_lock(&fp->fi_lock);
|
|
|
/* Did the lease get broken before we took the lock? */
|