CVSROOT:        /cvs/cluster
Module name:    cluster
Changes by:     [EMAIL PROTECTED]       2008-01-30 06:37:53

Modified files:
        gfs-kernel/src/gfs: eaops.c inode.c ops_file.c ops_file.h 

Log message:
        Red Hat bugzilla 244343:
        
        GFS supports two modes of locking - lock_nolock for single node 
filesystem
        and lock_dlm for cluster mode locking. The gfs 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.
        
        Port forward patch from RHEL5 branch to HEAD.
        
        Original author: Wendy Cheng <[EMAIL PROTECTED]>

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/eaops.c.diff?cvsroot=cluster&r1=1.7&r2=1.8
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/inode.c.diff?cvsroot=cluster&r1=1.26&r2=1.27
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/ops_file.c.diff?cvsroot=cluster&r1=1.38&r2=1.39
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs-kernel/src/gfs/ops_file.h.diff?cvsroot=cluster&r1=1.2&r2=1.3

--- cluster/gfs-kernel/src/gfs/eaops.c  2007/12/04 19:30:27     1.7
+++ cluster/gfs-kernel/src/gfs/eaops.c  2008/01/30 06:37:53     1.8
@@ -268,4 +268,3 @@
        &gfs_security_eaops,
 };
 
-
--- cluster/gfs-kernel/src/gfs/inode.c  2006/10/05 16:04:38     1.26
+++ cluster/gfs-kernel/src/gfs/inode.c  2008/01/30 06:37:53     1.27
@@ -170,6 +170,7 @@
 struct inode *
 gfs_iget(struct gfs_inode *ip, int create)
 {
+       struct gfs_sbd *sdp = ip->i_sbd;
        struct inode *inode = NULL, *tmp;
 
        spin_lock(&ip->i_spin);
@@ -189,13 +190,19 @@
        /* Attach GFS-specific ops vectors */
        if (ip->i_di.di_type == GFS_FILE_REG) {
                tmp->i_op = &gfs_file_iops;
-               tmp->i_fop = &gfs_file_fops;
                memcpy(&ip->gfs_file_aops, &gfs_file_aops,
                           sizeof(struct address_space_operations));
                tmp->i_mapping->a_ops = &ip->gfs_file_aops;
+               if (sdp->sd_args.ar_localflocks)
+                       tmp->i_fop = &gfs_file_fops_nolock;
+               else
+                       tmp->i_fop = &gfs_file_fops;
        } else if (ip->i_di.di_type == GFS_FILE_DIR) {
                tmp->i_op = &gfs_dir_iops;
-               tmp->i_fop = &gfs_dir_fops;
+               if (sdp->sd_args.ar_localflocks)
+                       tmp->i_fop = &gfs_dir_fops_nolock;
+               else
+                       tmp->i_fop = &gfs_dir_fops;
        } else if (ip->i_di.di_type == GFS_FILE_LNK) {
                tmp->i_op = &gfs_symlink_iops;
        } else {
--- cluster/gfs-kernel/src/gfs/ops_file.c       2008/01/28 06:36:18     1.38
+++ cluster/gfs-kernel/src/gfs/ops_file.c       2008/01/30 06:37:53     1.39
@@ -1616,15 +1616,6 @@
         if ((ip->i_di.di_mode & (S_ISGID | S_IXGRP)) == S_ISGID)
                 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 (IS_GETLK(cmd))
                 return gfs_lm_plock_get(sdp, &name, file, fl);
         else if (fl->fl_type == F_UNLCK)
@@ -1766,7 +1757,6 @@
 gfs_flock(struct file *file, int cmd, struct file_lock *fl)
 {
         struct gfs_inode *ip = get_v2ip(file->f_mapping->host);
-        struct gfs_sbd *sdp = ip->i_sbd;
 
         atomic_inc(&ip->i_sbd->sd_ops_file);
 
@@ -1775,9 +1765,6 @@
         if ((ip->i_di.di_mode & (S_ISGID | S_IXGRP)) == S_ISGID)
                 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;
@@ -1816,3 +1803,31 @@
         .lock = gfs_lock,
         .flock = gfs_flock,
 };
+
+struct file_operations gfs_file_fops_nolock = {
+       .llseek = gfs_llseek,
+       .read = gfs_read,
+       .write = gfs_write,
+       .aio_read = gfs_aio_read,
+       .aio_write = gfs_aio_write,
+       .ioctl = gfs_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = gfs_compat_ioctl,
+#endif
+       .mmap = gfs_mmap,
+       .open = gfs_open,
+       .release = gfs_close,
+       .fsync = gfs_fsync,
+       .splice_read = gfs_splice_read,
+};
+
+struct file_operations gfs_dir_fops_nolock = {
+       .readdir = gfs_readdir,
+       .ioctl = gfs_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl = gfs_compat_ioctl,
+#endif
+       .open = gfs_open,
+       .release = gfs_close,
+       .fsync = gfs_fsync,
+};
--- cluster/gfs-kernel/src/gfs/ops_file.h       2006/07/10 23:22:34     1.2
+++ cluster/gfs-kernel/src/gfs/ops_file.h       2008/01/30 06:37:53     1.3
@@ -16,5 +16,7 @@
 
 extern struct file_operations gfs_file_fops;
 extern struct file_operations gfs_dir_fops;
+extern struct file_operations gfs_file_fops_nolock;
+extern struct file_operations gfs_dir_fops_nolock;
 
 #endif /* __OPS_FILE_DOT_H__ */

Reply via email to