diff options
Diffstat (limited to 'fs/nfs/file.c')
-rw-r--r-- | fs/nfs/file.c | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/fs/nfs/file.c b/fs/nfs/file.c index d84a3d8f32af..7c73f06692b6 100644 --- a/fs/nfs/file.c +++ b/fs/nfs/file.c | |||
@@ -593,6 +593,7 @@ out: | |||
593 | static int nfs_lock(struct file *filp, int cmd, struct file_lock *fl) | 593 | static int nfs_lock(struct file *filp, int cmd, struct file_lock *fl) |
594 | { | 594 | { |
595 | struct inode * inode = filp->f_mapping->host; | 595 | struct inode * inode = filp->f_mapping->host; |
596 | int ret = -ENOLCK; | ||
596 | 597 | ||
597 | dprintk("NFS: nfs_lock(f=%s/%ld, t=%x, fl=%x, r=%Ld:%Ld)\n", | 598 | dprintk("NFS: nfs_lock(f=%s/%ld, t=%x, fl=%x, r=%Ld:%Ld)\n", |
598 | inode->i_sb->s_id, inode->i_ino, | 599 | inode->i_sb->s_id, inode->i_ino, |
@@ -602,13 +603,22 @@ static int nfs_lock(struct file *filp, int cmd, struct file_lock *fl) | |||
602 | 603 | ||
603 | /* No mandatory locks over NFS */ | 604 | /* No mandatory locks over NFS */ |
604 | if (__mandatory_lock(inode) && fl->fl_type != F_UNLCK) | 605 | if (__mandatory_lock(inode) && fl->fl_type != F_UNLCK) |
605 | return -ENOLCK; | 606 | goto out_err; |
607 | |||
608 | if (NFS_PROTO(inode)->lock_check_bounds != NULL) { | ||
609 | ret = NFS_PROTO(inode)->lock_check_bounds(fl); | ||
610 | if (ret < 0) | ||
611 | goto out_err; | ||
612 | } | ||
606 | 613 | ||
607 | if (IS_GETLK(cmd)) | 614 | if (IS_GETLK(cmd)) |
608 | return do_getlk(filp, cmd, fl); | 615 | ret = do_getlk(filp, cmd, fl); |
609 | if (fl->fl_type == F_UNLCK) | 616 | else if (fl->fl_type == F_UNLCK) |
610 | return do_unlk(filp, cmd, fl); | 617 | ret = do_unlk(filp, cmd, fl); |
611 | return do_setlk(filp, cmd, fl); | 618 | else |
619 | ret = do_setlk(filp, cmd, fl); | ||
620 | out_err: | ||
621 | return ret; | ||
612 | } | 622 | } |
613 | 623 | ||
614 | /* | 624 | /* |