diff options
-rw-r--r-- | fs/gfs2/inode.c | 11 | ||||
-rw-r--r-- | fs/gfs2/ops_file.c | 36 | ||||
-rw-r--r-- | fs/gfs2/ops_inode.h | 2 |
3 files changed, 35 insertions, 14 deletions
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c index 92959d093adf..53bca9978fb5 100644 --- a/fs/gfs2/inode.c +++ b/fs/gfs2/inode.c | |||
@@ -131,14 +131,21 @@ static struct inode *gfs2_iget_skip(struct super_block *sb, | |||
131 | 131 | ||
132 | void gfs2_set_iop(struct inode *inode) | 132 | void gfs2_set_iop(struct inode *inode) |
133 | { | 133 | { |
134 | struct gfs2_sbd *sdp = GFS2_SB(inode); | ||
134 | umode_t mode = inode->i_mode; | 135 | umode_t mode = inode->i_mode; |
135 | 136 | ||
136 | if (S_ISREG(mode)) { | 137 | if (S_ISREG(mode)) { |
137 | inode->i_op = &gfs2_file_iops; | 138 | inode->i_op = &gfs2_file_iops; |
138 | inode->i_fop = &gfs2_file_fops; | 139 | if (sdp->sd_args.ar_localflocks) |
140 | inode->i_fop = &gfs2_file_fops_nolock; | ||
141 | else | ||
142 | inode->i_fop = &gfs2_file_fops; | ||
139 | } else if (S_ISDIR(mode)) { | 143 | } else if (S_ISDIR(mode)) { |
140 | inode->i_op = &gfs2_dir_iops; | 144 | inode->i_op = &gfs2_dir_iops; |
141 | inode->i_fop = &gfs2_dir_fops; | 145 | if (sdp->sd_args.ar_localflocks) |
146 | inode->i_fop = &gfs2_dir_fops_nolock; | ||
147 | else | ||
148 | inode->i_fop = &gfs2_dir_fops; | ||
142 | } else if (S_ISLNK(mode)) { | 149 | } else if (S_ISLNK(mode)) { |
143 | inode->i_op = &gfs2_symlink_iops; | 150 | inode->i_op = &gfs2_symlink_iops; |
144 | } else { | 151 | } else { |
diff --git a/fs/gfs2/ops_file.c b/fs/gfs2/ops_file.c index ad5daaa6babc..db76ac1947e7 100644 --- a/fs/gfs2/ops_file.c +++ b/fs/gfs2/ops_file.c | |||
@@ -615,15 +615,6 @@ static int gfs2_lock(struct file *file, int cmd, struct file_lock *fl) | |||
615 | if (__mandatory_lock(&ip->i_inode)) | 615 | if (__mandatory_lock(&ip->i_inode)) |
616 | return -ENOLCK; | 616 | return -ENOLCK; |
617 | 617 | ||
618 | if (sdp->sd_args.ar_localflocks) { | ||
619 | if (IS_GETLK(cmd)) { | ||
620 | posix_test_lock(file, fl); | ||
621 | return 0; | ||
622 | } else { | ||
623 | return posix_lock_file_wait(file, fl); | ||
624 | } | ||
625 | } | ||
626 | |||
627 | if (cmd == F_CANCELLK) { | 618 | if (cmd == F_CANCELLK) { |
628 | /* Hack: */ | 619 | /* Hack: */ |
629 | cmd = F_SETLK; | 620 | cmd = F_SETLK; |
@@ -716,9 +707,6 @@ static int gfs2_flock(struct file *file, int cmd, struct file_lock *fl) | |||
716 | if (__mandatory_lock(&ip->i_inode)) | 707 | if (__mandatory_lock(&ip->i_inode)) |
717 | return -ENOLCK; | 708 | return -ENOLCK; |
718 | 709 | ||
719 | if (sdp->sd_args.ar_localflocks) | ||
720 | return flock_lock_file_wait(file, fl); | ||
721 | |||
722 | if (fl->fl_type == F_UNLCK) { | 710 | if (fl->fl_type == F_UNLCK) { |
723 | do_unflock(file, fl); | 711 | do_unflock(file, fl); |
724 | return 0; | 712 | return 0; |
@@ -755,3 +743,27 @@ const struct file_operations gfs2_dir_fops = { | |||
755 | .flock = gfs2_flock, | 743 | .flock = gfs2_flock, |
756 | }; | 744 | }; |
757 | 745 | ||
746 | const struct file_operations gfs2_file_fops_nolock = { | ||
747 | .llseek = gfs2_llseek, | ||
748 | .read = do_sync_read, | ||
749 | .aio_read = generic_file_aio_read, | ||
750 | .write = do_sync_write, | ||
751 | .aio_write = generic_file_aio_write, | ||
752 | .unlocked_ioctl = gfs2_ioctl, | ||
753 | .mmap = gfs2_mmap, | ||
754 | .open = gfs2_open, | ||
755 | .release = gfs2_close, | ||
756 | .fsync = gfs2_fsync, | ||
757 | .splice_read = generic_file_splice_read, | ||
758 | .splice_write = generic_file_splice_write, | ||
759 | .setlease = gfs2_setlease, | ||
760 | }; | ||
761 | |||
762 | const struct file_operations gfs2_dir_fops_nolock = { | ||
763 | .readdir = gfs2_readdir, | ||
764 | .unlocked_ioctl = gfs2_ioctl, | ||
765 | .open = gfs2_open, | ||
766 | .release = gfs2_close, | ||
767 | .fsync = gfs2_fsync, | ||
768 | }; | ||
769 | |||
diff --git a/fs/gfs2/ops_inode.h b/fs/gfs2/ops_inode.h index edb519cb05ee..fd8cee231e1d 100644 --- a/fs/gfs2/ops_inode.h +++ b/fs/gfs2/ops_inode.h | |||
@@ -18,6 +18,8 @@ extern const struct inode_operations gfs2_symlink_iops; | |||
18 | extern const struct inode_operations gfs2_dev_iops; | 18 | extern const struct inode_operations gfs2_dev_iops; |
19 | extern const struct file_operations gfs2_file_fops; | 19 | extern const struct file_operations gfs2_file_fops; |
20 | extern const struct file_operations gfs2_dir_fops; | 20 | extern const struct file_operations gfs2_dir_fops; |
21 | extern const struct file_operations gfs2_file_fops_nolock; | ||
22 | extern const struct file_operations gfs2_dir_fops_nolock; | ||
21 | 23 | ||
22 | extern void gfs2_set_inode_flags(struct inode *inode); | 24 | extern void gfs2_set_inode_flags(struct inode *inode); |
23 | 25 | ||