diff options
Diffstat (limited to 'fs/fuse/file.c')
-rw-r--r-- | fs/fuse/file.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/fs/fuse/file.c b/fs/fuse/file.c index 8092f0d9fd1f..67ff2c6a8f63 100644 --- a/fs/fuse/file.c +++ b/fs/fuse/file.c | |||
@@ -1341,6 +1341,11 @@ static int fuse_setlk(struct file *file, struct file_lock *fl, int flock) | |||
1341 | pid_t pid = fl->fl_type != F_UNLCK ? current->tgid : 0; | 1341 | pid_t pid = fl->fl_type != F_UNLCK ? current->tgid : 0; |
1342 | int err; | 1342 | int err; |
1343 | 1343 | ||
1344 | if (fl->fl_lmops && fl->fl_lmops->fl_grant) { | ||
1345 | /* NLM needs asynchronous locks, which we don't support yet */ | ||
1346 | return -ENOLCK; | ||
1347 | } | ||
1348 | |||
1344 | /* Unlock on close is handled by the flush method */ | 1349 | /* Unlock on close is handled by the flush method */ |
1345 | if (fl->fl_flags & FL_CLOSE) | 1350 | if (fl->fl_flags & FL_CLOSE) |
1346 | return 0; | 1351 | return 0; |
@@ -1365,7 +1370,9 @@ static int fuse_file_lock(struct file *file, int cmd, struct file_lock *fl) | |||
1365 | struct fuse_conn *fc = get_fuse_conn(inode); | 1370 | struct fuse_conn *fc = get_fuse_conn(inode); |
1366 | int err; | 1371 | int err; |
1367 | 1372 | ||
1368 | if (cmd == F_GETLK) { | 1373 | if (cmd == F_CANCELLK) { |
1374 | err = 0; | ||
1375 | } else if (cmd == F_GETLK) { | ||
1369 | if (fc->no_lock) { | 1376 | if (fc->no_lock) { |
1370 | posix_test_lock(file, fl); | 1377 | posix_test_lock(file, fl); |
1371 | err = 0; | 1378 | err = 0; |
@@ -1373,7 +1380,7 @@ static int fuse_file_lock(struct file *file, int cmd, struct file_lock *fl) | |||
1373 | err = fuse_getlk(file, fl); | 1380 | err = fuse_getlk(file, fl); |
1374 | } else { | 1381 | } else { |
1375 | if (fc->no_lock) | 1382 | if (fc->no_lock) |
1376 | err = posix_lock_file_wait(file, fl); | 1383 | err = posix_lock_file(file, fl, NULL); |
1377 | else | 1384 | else |
1378 | err = fuse_setlk(file, fl, 0); | 1385 | err = fuse_setlk(file, fl, 0); |
1379 | } | 1386 | } |