From 5d3951cc63e78408560c3b8f4449d71a0fe396b8 Mon Sep 17 00:00:00 2001 From: Wendy Cheng Date: Thu, 29 Nov 2007 17:56:51 -0500 Subject: [PATCH] --- yaml --- r: 76040 b: refs/heads/master c: c97bfe4351771675963e02f34d31e206fd2d7150 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/gfs2/inode.c | 11 +++++++++-- trunk/fs/gfs2/ops_file.c | 36 ++++++++++++++++++++++++------------ trunk/fs/gfs2/ops_inode.h | 2 ++ 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/[refs] b/[refs] index 0da6d92973dc..00237ed595cd 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: bcd405599faa16cf32a3d3f1ce6a1e12cb37fede +refs/heads/master: c97bfe4351771675963e02f34d31e206fd2d7150 diff --git a/trunk/fs/gfs2/inode.c b/trunk/fs/gfs2/inode.c index 92959d093adf..53bca9978fb5 100644 --- a/trunk/fs/gfs2/inode.c +++ b/trunk/fs/gfs2/inode.c @@ -131,14 +131,21 @@ static struct inode *gfs2_iget_skip(struct super_block *sb, void gfs2_set_iop(struct inode *inode) { + struct gfs2_sbd *sdp = GFS2_SB(inode); umode_t mode = inode->i_mode; if (S_ISREG(mode)) { inode->i_op = &gfs2_file_iops; - inode->i_fop = &gfs2_file_fops; + if (sdp->sd_args.ar_localflocks) + inode->i_fop = &gfs2_file_fops_nolock; + else + inode->i_fop = &gfs2_file_fops; } else if (S_ISDIR(mode)) { inode->i_op = &gfs2_dir_iops; - inode->i_fop = &gfs2_dir_fops; + if (sdp->sd_args.ar_localflocks) + inode->i_fop = &gfs2_dir_fops_nolock; + else + inode->i_fop = &gfs2_dir_fops; } else if (S_ISLNK(mode)) { inode->i_op = &gfs2_symlink_iops; } else { diff --git a/trunk/fs/gfs2/ops_file.c b/trunk/fs/gfs2/ops_file.c index ad5daaa6babc..db76ac1947e7 100644 --- a/trunk/fs/gfs2/ops_file.c +++ b/trunk/fs/gfs2/ops_file.c @@ -615,15 +615,6 @@ static int gfs2_lock(struct file *file, int cmd, struct file_lock *fl) if (__mandatory_lock(&ip->i_inode)) return -ENOLCK; - if (sdp->sd_args.ar_localflocks) { - if (IS_GETLK(cmd)) { - posix_test_lock(file, fl); - return 0; - } else { - return posix_lock_file_wait(file, fl); - } - } - if (cmd == F_CANCELLK) { /* Hack: */ cmd = F_SETLK; @@ -716,9 +707,6 @@ static int gfs2_flock(struct file *file, int cmd, struct file_lock *fl) if (__mandatory_lock(&ip->i_inode)) return -ENOLCK; - if (sdp->sd_args.ar_localflocks) - return flock_lock_file_wait(file, fl); - if (fl->fl_type == F_UNLCK) { do_unflock(file, fl); return 0; @@ -755,3 +743,27 @@ const struct file_operations gfs2_dir_fops = { .flock = gfs2_flock, }; +const struct file_operations gfs2_file_fops_nolock = { + .llseek = gfs2_llseek, + .read = do_sync_read, + .aio_read = generic_file_aio_read, + .write = do_sync_write, + .aio_write = generic_file_aio_write, + .unlocked_ioctl = gfs2_ioctl, + .mmap = gfs2_mmap, + .open = gfs2_open, + .release = gfs2_close, + .fsync = gfs2_fsync, + .splice_read = generic_file_splice_read, + .splice_write = generic_file_splice_write, + .setlease = gfs2_setlease, +}; + +const struct file_operations gfs2_dir_fops_nolock = { + .readdir = gfs2_readdir, + .unlocked_ioctl = gfs2_ioctl, + .open = gfs2_open, + .release = gfs2_close, + .fsync = gfs2_fsync, +}; + diff --git a/trunk/fs/gfs2/ops_inode.h b/trunk/fs/gfs2/ops_inode.h index edb519cb05ee..fd8cee231e1d 100644 --- a/trunk/fs/gfs2/ops_inode.h +++ b/trunk/fs/gfs2/ops_inode.h @@ -18,6 +18,8 @@ extern const struct inode_operations gfs2_symlink_iops; extern const struct inode_operations gfs2_dev_iops; extern const struct file_operations gfs2_file_fops; extern const struct file_operations gfs2_dir_fops; +extern const struct file_operations gfs2_file_fops_nolock; +extern const struct file_operations gfs2_dir_fops_nolock; extern void gfs2_set_inode_flags(struct inode *inode);