|
@@ -208,6 +208,14 @@ static int v9fs_file_do_lock(struct file *filp, int cmd, struct file_lock *fl)
|
|
|
if (schedule_timeout_interruptible(v9ses->session_lock_timeout)
|
|
|
!= 0)
|
|
|
break;
|
|
|
+ /*
|
|
|
+ * p9_client_lock_dotl overwrites flock.client_id with the
|
|
|
+ * server message, free and reuse the client name
|
|
|
+ */
|
|
|
+ if (flock.client_id != fid->clnt->name) {
|
|
|
+ kfree(flock.client_id);
|
|
|
+ flock.client_id = fid->clnt->name;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* map 9p status to VFS status */
|
|
@@ -239,6 +247,8 @@ out_unlock:
|
|
|
locks_lock_file_wait(filp, fl);
|
|
|
fl->fl_type = fl_type;
|
|
|
}
|
|
|
+ if (flock.client_id != fid->clnt->name)
|
|
|
+ kfree(flock.client_id);
|
|
|
out:
|
|
|
return res;
|
|
|
}
|
|
@@ -273,7 +283,7 @@ static int v9fs_file_getlock(struct file *filp, struct file_lock *fl)
|
|
|
|
|
|
res = p9_client_getlock_dotl(fid, &glock);
|
|
|
if (res < 0)
|
|
|
- return res;
|
|
|
+ goto out;
|
|
|
/* map 9p lock type to os lock type */
|
|
|
switch (glock.type) {
|
|
|
case P9_LOCK_TYPE_RDLCK:
|
|
@@ -294,7 +304,9 @@ static int v9fs_file_getlock(struct file *filp, struct file_lock *fl)
|
|
|
fl->fl_end = glock.start + glock.length - 1;
|
|
|
fl->fl_pid = -glock.proc_id;
|
|
|
}
|
|
|
- kfree(glock.client_id);
|
|
|
+out:
|
|
|
+ if (glock.client_id != fid->clnt->name)
|
|
|
+ kfree(glock.client_id);
|
|
|
return res;
|
|
|
}
|
|
|
|