diff options
Diffstat (limited to 'fs/9p/vfs_file.c')
| -rw-r--r-- | fs/9p/vfs_file.c | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c index 3c173fcc2c5a..62857a810a79 100644 --- a/fs/9p/vfs_file.c +++ b/fs/9p/vfs_file.c | |||
| @@ -65,7 +65,7 @@ int v9fs_file_open(struct inode *inode, struct file *file) | |||
| 65 | v9inode = V9FS_I(inode); | 65 | v9inode = V9FS_I(inode); |
| 66 | v9ses = v9fs_inode2v9ses(inode); | 66 | v9ses = v9fs_inode2v9ses(inode); |
| 67 | if (v9fs_proto_dotl(v9ses)) | 67 | if (v9fs_proto_dotl(v9ses)) |
| 68 | omode = file->f_flags; | 68 | omode = v9fs_open_to_dotl_flags(file->f_flags); |
| 69 | else | 69 | else |
| 70 | omode = v9fs_uflags2omode(file->f_flags, | 70 | omode = v9fs_uflags2omode(file->f_flags, |
| 71 | v9fs_proto_dotu(v9ses)); | 71 | v9fs_proto_dotu(v9ses)); |
| @@ -169,7 +169,18 @@ static int v9fs_file_do_lock(struct file *filp, int cmd, struct file_lock *fl) | |||
| 169 | 169 | ||
| 170 | /* convert posix lock to p9 tlock args */ | 170 | /* convert posix lock to p9 tlock args */ |
| 171 | memset(&flock, 0, sizeof(flock)); | 171 | memset(&flock, 0, sizeof(flock)); |
| 172 | flock.type = fl->fl_type; | 172 | /* map the lock type */ |
| 173 | switch (fl->fl_type) { | ||
| 174 | case F_RDLCK: | ||
| 175 | flock.type = P9_LOCK_TYPE_RDLCK; | ||
| 176 | break; | ||
| 177 | case F_WRLCK: | ||
| 178 | flock.type = P9_LOCK_TYPE_WRLCK; | ||
| 179 | break; | ||
| 180 | case F_UNLCK: | ||
| 181 | flock.type = P9_LOCK_TYPE_UNLCK; | ||
| 182 | break; | ||
| 183 | } | ||
| 173 | flock.start = fl->fl_start; | 184 | flock.start = fl->fl_start; |
| 174 | if (fl->fl_end == OFFSET_MAX) | 185 | if (fl->fl_end == OFFSET_MAX) |
| 175 | flock.length = 0; | 186 | flock.length = 0; |
| @@ -245,7 +256,7 @@ static int v9fs_file_getlock(struct file *filp, struct file_lock *fl) | |||
| 245 | 256 | ||
| 246 | /* convert posix lock to p9 tgetlock args */ | 257 | /* convert posix lock to p9 tgetlock args */ |
| 247 | memset(&glock, 0, sizeof(glock)); | 258 | memset(&glock, 0, sizeof(glock)); |
| 248 | glock.type = fl->fl_type; | 259 | glock.type = P9_LOCK_TYPE_UNLCK; |
| 249 | glock.start = fl->fl_start; | 260 | glock.start = fl->fl_start; |
| 250 | if (fl->fl_end == OFFSET_MAX) | 261 | if (fl->fl_end == OFFSET_MAX) |
| 251 | glock.length = 0; | 262 | glock.length = 0; |
| @@ -257,17 +268,26 @@ static int v9fs_file_getlock(struct file *filp, struct file_lock *fl) | |||
| 257 | res = p9_client_getlock_dotl(fid, &glock); | 268 | res = p9_client_getlock_dotl(fid, &glock); |
| 258 | if (res < 0) | 269 | if (res < 0) |
| 259 | return res; | 270 | return res; |
| 260 | if (glock.type != F_UNLCK) { | 271 | /* map 9p lock type to os lock type */ |
| 261 | fl->fl_type = glock.type; | 272 | switch (glock.type) { |
| 273 | case P9_LOCK_TYPE_RDLCK: | ||
| 274 | fl->fl_type = F_RDLCK; | ||
| 275 | break; | ||
| 276 | case P9_LOCK_TYPE_WRLCK: | ||
| 277 | fl->fl_type = F_WRLCK; | ||
| 278 | break; | ||
| 279 | case P9_LOCK_TYPE_UNLCK: | ||
| 280 | fl->fl_type = F_UNLCK; | ||
| 281 | break; | ||
| 282 | } | ||
| 283 | if (glock.type != P9_LOCK_TYPE_UNLCK) { | ||
| 262 | fl->fl_start = glock.start; | 284 | fl->fl_start = glock.start; |
| 263 | if (glock.length == 0) | 285 | if (glock.length == 0) |
| 264 | fl->fl_end = OFFSET_MAX; | 286 | fl->fl_end = OFFSET_MAX; |
| 265 | else | 287 | else |
| 266 | fl->fl_end = glock.start + glock.length - 1; | 288 | fl->fl_end = glock.start + glock.length - 1; |
| 267 | fl->fl_pid = glock.proc_id; | 289 | fl->fl_pid = glock.proc_id; |
| 268 | } else | 290 | } |
| 269 | fl->fl_type = F_UNLCK; | ||
| 270 | |||
| 271 | return res; | 291 | return res; |
| 272 | } | 292 | } |
| 273 | 293 | ||
