Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 309246 Details for
Bug 447748
GFS2: lock_dlm is not always delivering callbacks in the right order
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
Third of the upstream patches
0009-GFS2-Clean-up-the-plock-operations.patch (text/plain), 11.22 KB, created by
Steve Whitehouse
on 2008-06-13 16:42:15 UTC
(
hide
)
Description:
Third of the upstream patches
Filename:
MIME Type:
Creator:
Steve Whitehouse
Created:
2008-06-13 16:42:15 UTC
Size:
11.22 KB
patch
obsolete
>From c73a2438037b7bb9b942dfab8bdfb06954a07109 Mon Sep 17 00:00:00 2001 >From: Steven Whitehouse <swhiteho@redhat.com> >Date: Wed, 4 Jun 2008 14:42:12 +0100 >Subject: [PATCH] [GFS2] Clean up the plock operations > >Historically we've done the cluster posix locking via the >lock modules. Recent changes moved the posix locking into >the DLM itself. Also we have two sets of file_operations, >one for cluster locks (both fcntl and flock) and one for >local locking. Note that local locking is an option >even for a multi-node filesystem (provided the application >is ok with that) so that using lock_dlm does not mean that >we will always use only the cluster lock set of >file_operations. > >Anyhow, the net result of that was the we've had bits of >GFS2 which depend on whether or not we are building the >lock_dlm module compiled in even when they were not needed. > >This patch alters the configuration such that those parts >of the code are not compiled in when not needed. Also >the DLM lock module becomes a bool. I know thats not >quite right until we finally get rid of what remains >that module, but for now it means that things will build >correctly, and the final removal of the module is in >the next patch. Likewise I hope my adition of header >files part way down ops_file.c will be indulged until >that is fixed, also in the next patch. > >The net result of this patch is the loss of about 50 lines >of wrapper functions, and reduction in size of GFS2 when >in lock_nolock only configurations. > >Signed-off-by: Steven Whitehouse <swhiteho@redhat.com> > >diff --git a/fs/gfs2/Kconfig b/fs/gfs2/Kconfig >index ab2f57e..5519120 100644 >--- a/fs/gfs2/Kconfig >+++ b/fs/gfs2/Kconfig >@@ -1,6 +1,10 @@ > config GFS2_FS > tristate "GFS2 file system support" > depends on EXPERIMENTAL && (64BIT || (LSF && LBD)) >+ select DLM if GFS2_FS_LOCKING_DLM >+ select CONFIGFS_FS if GFS2_FS_LOCKING_DLM >+ select SYSFS if GFS2_FS_LOCKING_DLM >+ select IP_SCTP if DLM_SCTP > select FS_POSIX_ACL > select CRC32 > help >@@ -21,11 +25,8 @@ config GFS2_FS > The "nolock" lock module is now built in to GFS2 by default. > > config GFS2_FS_LOCKING_DLM >- tristate "GFS2 DLM locking module" >- depends on GFS2_FS && SYSFS && NET && INET && (IPV6 || IPV6=n) >- select IP_SCTP if DLM_SCTP >- select CONFIGFS_FS >- select DLM >+ bool "GFS2 DLM locking" >+ depends on GFS2_FS && NET && INET && (IPV6 || IPV6=n) > help > Multiple node locking module for GFS2 > >diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c >index 09453d0..1622f81 100644 >--- a/fs/gfs2/inode.c >+++ b/fs/gfs2/inode.c >@@ -137,16 +137,16 @@ void gfs2_set_iop(struct inode *inode) > > if (S_ISREG(mode)) { > inode->i_op = &gfs2_file_iops; >- if (sdp->sd_args.ar_localflocks) >- inode->i_fop = &gfs2_file_fops_nolock; >+ if (gfs2_localflocks(sdp)) >+ inode->i_fop = gfs2_file_fops_nolock; > else >- inode->i_fop = &gfs2_file_fops; >+ inode->i_fop = gfs2_file_fops; > } else if (S_ISDIR(mode)) { > inode->i_op = &gfs2_dir_iops; >- if (sdp->sd_args.ar_localflocks) >- inode->i_fop = &gfs2_dir_fops_nolock; >+ if (gfs2_localflocks(sdp)) >+ inode->i_fop = gfs2_dir_fops_nolock; > else >- inode->i_fop = &gfs2_dir_fops; >+ inode->i_fop = gfs2_dir_fops; > } else if (S_ISLNK(mode)) { > inode->i_op = &gfs2_symlink_iops; > } else { >diff --git a/fs/gfs2/locking/dlm/mount.c b/fs/gfs2/locking/dlm/mount.c >index fa31c54..0f06a11 100644 >--- a/fs/gfs2/locking/dlm/mount.c >+++ b/fs/gfs2/locking/dlm/mount.c >@@ -229,27 +229,6 @@ static void gdlm_withdraw(void *lockspace) > gdlm_kobject_release(ls); > } > >-static int gdlm_plock(void *lockspace, struct lm_lockname *name, >- struct file *file, int cmd, struct file_lock *fl) >-{ >- struct gdlm_ls *ls = lockspace; >- return dlm_posix_lock(ls->dlm_lockspace, name->ln_number, file, cmd, fl); >-} >- >-static int gdlm_punlock(void *lockspace, struct lm_lockname *name, >- struct file *file, struct file_lock *fl) >-{ >- struct gdlm_ls *ls = lockspace; >- return dlm_posix_unlock(ls->dlm_lockspace, name->ln_number, file, fl); >-} >- >-static int gdlm_plock_get(void *lockspace, struct lm_lockname *name, >- struct file *file, struct file_lock *fl) >-{ >- struct gdlm_ls *ls = lockspace; >- return dlm_posix_get(ls->dlm_lockspace, name->ln_number, file, fl); >-} >- > const struct lm_lockops gdlm_ops = { > .lm_proto_name = "lock_dlm", > .lm_mount = gdlm_mount, >@@ -260,9 +239,6 @@ const struct lm_lockops gdlm_ops = { > .lm_put_lock = gdlm_put_lock, > .lm_lock = gdlm_lock, > .lm_unlock = gdlm_unlock, >- .lm_plock = gdlm_plock, >- .lm_punlock = gdlm_punlock, >- .lm_plock_get = gdlm_plock_get, > .lm_cancel = gdlm_cancel, > .lm_hold_lvb = gdlm_hold_lvb, > .lm_unhold_lvb = gdlm_unhold_lvb, >diff --git a/fs/gfs2/ops_file.c b/fs/gfs2/ops_file.c >index 0ff512a..4f68c73 100644 >--- a/fs/gfs2/ops_file.c >+++ b/fs/gfs2/ops_file.c >@@ -570,57 +570,28 @@ static int gfs2_fsync(struct file *file, struct dentry *dentry, int datasync) > return ret; > } > >+#ifdef CONFIG_GFS2_FS_LOCKING_DLM >+ >+#include <linux/dlm.h> >+#include <linux/dlm_plock.h> >+#include "locking/dlm/lock_dlm.h" >+ > /** > * gfs2_setlease - acquire/release a file lease > * @file: the file pointer > * @arg: lease type > * @fl: file lock > * >+ * We don't currently have a way to enforce a lease across the whole >+ * cluster; until we do, disable leases (by just returning -EINVAL), >+ * unless the administrator has requested purely local locking. >+ * > * Returns: errno > */ > > static int gfs2_setlease(struct file *file, long arg, struct file_lock **fl) > { >- struct gfs2_sbd *sdp = GFS2_SB(file->f_mapping->host); >- >- /* >- * We don't currently have a way to enforce a lease across the whole >- * cluster; until we do, disable leases (by just returning -EINVAL), >- * unless the administrator has requested purely local locking. >- */ >- if (!sdp->sd_args.ar_localflocks) >- return -EINVAL; >- return generic_setlease(file, arg, fl); >-} >- >-static int gfs2_lm_plock_get(struct gfs2_sbd *sdp, struct lm_lockname *name, >- struct file *file, struct file_lock *fl) >-{ >- int error = -EIO; >- if (likely(!test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) >- error = sdp->sd_lockstruct.ls_ops->lm_plock_get( >- sdp->sd_lockstruct.ls_lockspace, name, file, fl); >- return error; >-} >- >-static int gfs2_lm_plock(struct gfs2_sbd *sdp, struct lm_lockname *name, >- struct file *file, int cmd, struct file_lock *fl) >-{ >- int error = -EIO; >- if (likely(!test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) >- error = sdp->sd_lockstruct.ls_ops->lm_plock( >- sdp->sd_lockstruct.ls_lockspace, name, file, cmd, fl); >- return error; >-} >- >-static int gfs2_lm_punlock(struct gfs2_sbd *sdp, struct lm_lockname *name, >- struct file *file, struct file_lock *fl) >-{ >- int error = -EIO; >- if (likely(!test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) >- error = sdp->sd_lockstruct.ls_ops->lm_punlock( >- sdp->sd_lockstruct.ls_lockspace, name, file, fl); >- return error; >+ return -EINVAL; > } > > /** >@@ -636,9 +607,8 @@ static int gfs2_lock(struct file *file, int cmd, struct file_lock *fl) > { > struct gfs2_inode *ip = GFS2_I(file->f_mapping->host); > struct gfs2_sbd *sdp = GFS2_SB(file->f_mapping->host); >- struct lm_lockname name = >- { .ln_number = ip->i_no_addr, >- .ln_type = LM_TYPE_PLOCK }; >+ struct gdlm_ls *gls = sdp->sd_lockstruct.ls_lockspace; >+ dlm_lockspace_t *ls = gls->dlm_lockspace; > > if (!(fl->fl_flags & FL_POSIX)) > return -ENOLCK; >@@ -650,12 +620,14 @@ static int gfs2_lock(struct file *file, int cmd, struct file_lock *fl) > cmd = F_SETLK; > fl->fl_type = F_UNLCK; > } >+ if (unlikely(test_bit(SDF_SHUTDOWN, &sdp->sd_flags))) >+ return -EIO; > if (IS_GETLK(cmd)) >- return gfs2_lm_plock_get(sdp, &name, file, fl); >+ return dlm_posix_get(ls, ip->i_no_addr, file, fl); > else if (fl->fl_type == F_UNLCK) >- return gfs2_lm_punlock(sdp, &name, file, fl); >+ return dlm_posix_unlock(ls, ip->i_no_addr, file, fl); > else >- return gfs2_lm_plock(sdp, &name, file, cmd, fl); >+ return dlm_posix_lock(ls, ip->i_no_addr, file, cmd, fl); > } > > static int do_flock(struct file *file, int cmd, struct file_lock *fl) >@@ -742,7 +714,7 @@ static int gfs2_flock(struct file *file, int cmd, struct file_lock *fl) > } > } > >-const struct file_operations gfs2_file_fops = { >+const struct file_operations *gfs2_file_fops = &(const struct file_operations){ > .llseek = gfs2_llseek, > .read = do_sync_read, > .aio_read = generic_file_aio_read, >@@ -760,7 +732,7 @@ const struct file_operations gfs2_file_fops = { > .setlease = gfs2_setlease, > }; > >-const struct file_operations gfs2_dir_fops = { >+const struct file_operations *gfs2_dir_fops = &(const struct file_operations){ > .readdir = gfs2_readdir, > .unlocked_ioctl = gfs2_ioctl, > .open = gfs2_open, >@@ -770,7 +742,9 @@ const struct file_operations gfs2_dir_fops = { > .flock = gfs2_flock, > }; > >-const struct file_operations gfs2_file_fops_nolock = { >+#endif /* CONFIG_GFS2_FS_LOCKING_DLM */ >+ >+const struct file_operations *gfs2_file_fops_nolock = &(const struct file_operations){ > .llseek = gfs2_llseek, > .read = do_sync_read, > .aio_read = generic_file_aio_read, >@@ -783,10 +757,10 @@ const struct file_operations gfs2_file_fops_nolock = { > .fsync = gfs2_fsync, > .splice_read = generic_file_splice_read, > .splice_write = generic_file_splice_write, >- .setlease = gfs2_setlease, >+ .setlease = generic_setlease, > }; > >-const struct file_operations gfs2_dir_fops_nolock = { >+const struct file_operations *gfs2_dir_fops_nolock = &(const struct file_operations){ > .readdir = gfs2_readdir, > .unlocked_ioctl = gfs2_ioctl, > .open = gfs2_open, >diff --git a/fs/gfs2/ops_inode.h b/fs/gfs2/ops_inode.h >index 14b4b79..e92ed63 100644 >--- a/fs/gfs2/ops_inode.h >+++ b/fs/gfs2/ops_inode.h >@@ -11,15 +11,30 @@ > #define __OPS_INODE_DOT_H__ > > #include <linux/fs.h> >+#include "incore.h" > > extern const struct inode_operations gfs2_file_iops; > extern const struct inode_operations gfs2_dir_iops; > extern const struct inode_operations gfs2_symlink_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 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); > >+#ifdef CONFIG_GFS2_FS_LOCKING_DLM >+extern const struct file_operations *gfs2_file_fops; >+extern const struct file_operations *gfs2_dir_fops; >+static inline int gfs2_localflocks(const struct gfs2_sbd *sdp) >+{ >+ return sdp->sd_args.ar_localflocks; >+} >+#else /* Single node only */ >+#define gfs2_file_fops NULL >+#define gfs2_dir_fops NULL >+static inline int gfs2_localflocks(const struct gfs2_sbd *sdp) >+{ >+ return 1; >+} >+#endif /* CONFIG_GFS2_FS_LOCKING_DLM */ >+ > #endif /* __OPS_INODE_DOT_H__ */ >diff --git a/include/linux/lm_interface.h b/include/linux/lm_interface.h >index 2ed8fa1..e5347c0 100644 >--- a/include/linux/lm_interface.h >+++ b/include/linux/lm_interface.h >@@ -208,19 +208,6 @@ struct lm_lockops { > void (*lm_unhold_lvb) (void *lock, char *lvb); > > /* >- * Posix Lock oriented operations >- */ >- >- int (*lm_plock_get) (void *lockspace, struct lm_lockname *name, >- struct file *file, struct file_lock *fl); >- >- int (*lm_plock) (void *lockspace, struct lm_lockname *name, >- struct file *file, int cmd, struct file_lock *fl); >- >- int (*lm_punlock) (void *lockspace, struct lm_lockname *name, >- struct file *file, struct file_lock *fl); >- >- /* > * Client oriented operations > */ > >-- >1.5.1.2 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 447748
:
307210
|
309243
|
309244
| 309246 |
309248
|
309253
|
309545
|
310134
|
311171