Skip to content

Commit

Permalink
[GFS2] Remove lock methods for lock_nolock protocol
Browse files Browse the repository at this point in the history
GFS2 supports two modes of locking - lock_nolock for single node filesystem
and lock_dlm for cluster mode locking. The gfs2 lock methods are removed from
file operation table for lock_nolock protocol. This would allow VFS to handle
posix lock and flock logics just like other in-tree filesystems without
duplication.

Signed-off-by: S. Wendy Cheng <wcheng@redhat.com>
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
  • Loading branch information
Wendy Cheng authored and Steven Whitehouse committed Jan 25, 2008
1 parent bcd4055 commit c97bfe4
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 14 deletions.
11 changes: 9 additions & 2 deletions fs/gfs2/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
36 changes: 24 additions & 12 deletions fs/gfs2/ops_file.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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,
};

2 changes: 2 additions & 0 deletions fs/gfs2/ops_inode.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down

0 comments on commit c97bfe4

Please sign in to comment.