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 186571 Details for
Bug 243913
NFS Client R/O in anaconda preinstall environment
[?]
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.
nosharecache is on by default
linux-2.6.18-nfs-nosharecache-is-default.patch (text/x-patch), 9.76 KB, created by
Steve Dickson
on 2007-09-04 20:08:20 UTC
(
hide
)
Description:
nosharecache is on by default
Filename:
MIME Type:
Creator:
Steve Dickson
Created:
2007-09-04 20:08:20 UTC
Size:
9.76 KB
patch
obsolete
>commit e89a5a43b95cdc4305b7c8e8121a380f02476636 >Author: Trond Myklebust <Trond.Myklebust@netapp.com> >Date: Fri Aug 31 10:45:17 2007 -0400 > > NFS: Fix the mount regression > > This avoids the recent NFS mount regression (returning EBUSY when > mounting the same filesystem twice with different parameters). > > The best I can do given the constraints appears to be to have the kernel > first look for a superblock that matches both the fsid and the > user-specified mount options, and then spawn off a new superblock if > that search fails. > > Note that this is not the same as specifying nosharecache everywhere > since nosharecache will never attempt to match an existing superblock. > > Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> > Tested-by: Hua Zhong <hzhong@gmail.com> > Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> > >--- linux-2.6.18.i686/fs/nfs/super.c.orig 2007-08-28 09:09:19.716183000 -0400 >+++ linux-2.6.18.i686/fs/nfs/super.c 2007-09-04 15:13:32.030095000 -0400 >@@ -599,11 +599,52 @@ static void nfs_clone_super(struct super > nfs_initialise_sb(sb); > } > >-static int nfs_set_super(struct super_block *s, void *_server) >+#define NFS_MS_MASK (MS_RDONLY|MS_NOSUID|MS_NODEV|MS_NOEXEC|MS_SYNCHRONOUS) >+ >+static int nfs_compare_mount_options(const struct super_block *s, const struct nfs_server *b, int flags) > { >- struct nfs_server *server = _server; >+ const struct nfs_server *a = s->s_fs_info; >+ const struct rpc_clnt *clnt_a = a->client; >+ const struct rpc_clnt *clnt_b = b->client; >+ >+ if ((s->s_flags & NFS_MS_MASK) != (flags & NFS_MS_MASK)) >+ goto Ebusy; >+ if (a->nfs_client != b->nfs_client) >+ goto Ebusy; >+ if (a->flags != b->flags) >+ goto Ebusy; >+ if (a->wsize != b->wsize) >+ goto Ebusy; >+ if (a->rsize != b->rsize) >+ goto Ebusy; >+ if (a->acregmin != b->acregmin) >+ goto Ebusy; >+ if (a->acregmax != b->acregmax) >+ goto Ebusy; >+ if (a->acdirmin != b->acdirmin) >+ goto Ebusy; >+ if (a->acdirmax != b->acdirmax) >+ goto Ebusy; >+ if (clnt_a->cl_auth->au_flavor != clnt_b->cl_auth->au_flavor) >+ goto Ebusy; >+ return 1; >+Ebusy: >+ return 0; >+} >+ >+struct nfs_sb_mountdata { >+ struct nfs_server *server; >+ int mntflags; >+ int err_on_noshare; >+}; >+ >+static int nfs_set_super(struct super_block *s, void *data) >+{ >+ struct nfs_sb_mountdata *sb_mntdata = data; >+ struct nfs_server *server = sb_mntdata->server; > int ret; > >+ s->s_flags = sb_mntdata->mntflags; > s->s_fs_info = server; > ret = set_anon_super(s, server); > if (ret == 0) >@@ -613,41 +654,29 @@ static int nfs_set_super(struct super_bl > > static int nfs_compare_super(struct super_block *sb, void *data) > { >- struct nfs_server *server = data, *old = NFS_SB(sb); >+ struct nfs_sb_mountdata *sb_mntdata = data; >+ struct nfs_server *server = sb_mntdata->server, *old = NFS_SB(sb); >+ int mntflags = sb_mntdata->mntflags; >+ int cc, fsc = (server->flags & NFS_MOUNT_FSCACHE); > > if (memcmp(&old->nfs_client->cl_addr, > &server->nfs_client->cl_addr, > sizeof(old->nfs_client->cl_addr)) != 0) > return 0; >+ /* Wit FS-Cache sharing is a must with the same server */ >+ if (fsc) >+ sb_mntdata->err_on_noshare = 1; > /* Note: NFS_MOUNT_UNSHARED == NFS4_MOUNT_UNSHARED */ > if (old->flags & NFS_MOUNT_UNSHARED) > return 0; > if (memcmp(&old->fsid, &server->fsid, sizeof(old->fsid)) != 0) > return 0; >- return 1; >-} >+ cc = nfs_compare_mount_options(sb, server, mntflags); > >-static int nfs_compare_mount_options(const struct nfs_server *a, const struct nfs_server *b) >-{ >- if (a->nfs_client != b->nfs_client) >- goto Ebusy; >- if (a->flags != b->flags) >- goto Ebusy; >- if (a->wsize != b->wsize) >- goto Ebusy; >- if (a->rsize != b->rsize) >- goto Ebusy; >- if (a->acregmin != b->acregmin) >- goto Ebusy; >- if (a->acregmax != b->acregmax) >- goto Ebusy; >- if (a->acdirmin != b->acdirmin) >- goto Ebusy; >- if (a->acdirmax != b->acdirmax) >- goto Ebusy; >- return 0; >-Ebusy: >- return -EBUSY; >+ if (fsc && cc) >+ sb_mntdata->err_on_noshare = 0; >+ >+ return cc; > } > > static int nfs_get_sb(struct file_system_type *fs_type, >@@ -659,6 +688,10 @@ static int nfs_get_sb(struct file_system > struct nfs_mount_data *data = raw_data; > struct dentry *mntroot; > int (*compare_super)(struct super_block *,void *) = nfs_compare_super; >+ struct nfs_sb_mountdata sb_mntdata = { >+ .mntflags = flags, >+ .err_on_noshare = 0, >+ }; > int error; > > /* Validate the mount data */ >@@ -672,27 +705,24 @@ static int nfs_get_sb(struct file_system > error = PTR_ERR(server); > goto out_err_noserver; > } >+ sb_mntdata.server = server; > >- if (server->flags & NFS_MOUNT_UNSHARED) { >- if (server->flags & NFS_MOUNT_FSCACHE) { >- error = -EINVAL; >- goto out_err_nosb; >- } >+ if (server->flags & NFS_MOUNT_UNSHARED) > compare_super = NULL; >- } >+ > /* Get a superblock - note that we may end up sharing one that already exists */ >- s = sget(fs_type, compare_super, nfs_set_super, server); >+ s = sget(fs_type, compare_super, nfs_set_super, &sb_mntdata); > if (IS_ERR(s)) { > error = PTR_ERR(s); > goto out_err_nosb; > } >- > if (s->s_fs_info != server) { >- error = nfs_compare_mount_options(server, NFS_SB(s)); > nfs_free_server(server); > server = NULL; >- if (error < 0) >- goto error_splat_super; >+ } else if ((server->flags & NFS_MOUNT_FSCACHE) >+ && sb_mntdata.err_on_noshare) { >+ error = -EINVAL; >+ goto error_splat_super; > } > > if (!s->s_root) { >@@ -746,6 +776,10 @@ static int nfs_xdev_get_sb(struct file_s > struct nfs_server *server; > struct dentry *mntroot; > int (*compare_super)(struct super_block *,void *) = nfs_compare_super; >+ struct nfs_sb_mountdata sb_mntdata = { >+ .mntflags = flags, >+ .err_on_noshare = 0, >+ }; > int error; > > dprintk("--> nfs_xdev_get_sb()\n"); >@@ -756,16 +790,13 @@ static int nfs_xdev_get_sb(struct file_s > error = PTR_ERR(server); > goto out_err_noserver; > } >+ sb_mntdata.server = server; > >- if (server->flags & NFS_MOUNT_UNSHARED) { >- if (server->flags & NFS_MOUNT_FSCACHE) { >- error = -EINVAL; >- goto out_err_nosb; >- } >+ if (server->flags & NFS_MOUNT_UNSHARED) > compare_super = NULL; >- } >+ > /* Get a superblock - note that we may end up sharing one that already exists */ >- s = sget(&nfs_fs_type, compare_super, nfs_set_super, server); >+ s = sget(&nfs_fs_type, compare_super, nfs_set_super, &sb_mntdata); > if (IS_ERR(s)) { > error = PTR_ERR(s); > goto out_err_nosb; >@@ -774,6 +805,10 @@ static int nfs_xdev_get_sb(struct file_s > if (s->s_fs_info != server) { > nfs_free_server(server); > server = NULL; >+ } else if ((server->flags & NFS_MOUNT_FSCACHE) >+ && sb_mntdata.err_on_noshare) { >+ error = -EINVAL; >+ goto error_splat_super; > } > > if (!s->s_root) { >@@ -871,6 +906,10 @@ static int nfs4_get_sb(struct file_syste > char *mntpath = NULL, *hostname = NULL, ip_addr[16]; > void *p; > int (*compare_super)(struct super_block *,void *) = nfs_compare_super; >+ struct nfs_sb_mountdata sb_mntdata = { >+ .mntflags = flags, >+ .err_on_noshare = 0, >+ }; > int error; > > if (data == NULL) { >@@ -938,27 +977,25 @@ static int nfs4_get_sb(struct file_syste > error = PTR_ERR(server); > goto out_err_noserver; > } >+ sb_mntdata.server = server; > >- if (server->flags & NFS_MOUNT_UNSHARED) { >- if (server->flags & NFS_MOUNT_FSCACHE) { >- error = -EINVAL; >- goto out_free; >- } >+ if (server->flags & NFS_MOUNT_UNSHARED) > compare_super = NULL; >- } >+ > /* Get a superblock - note that we may end up sharing one that already exists */ >- s = sget(fs_type, compare_super, nfs_set_super, server); >+ s = sget(fs_type, compare_super, nfs_set_super, &sb_mntdata); > if (IS_ERR(s)) { > error = PTR_ERR(s); > goto out_free; > } > > if (s->s_fs_info != server) { >- error = nfs_compare_mount_options(server, NFS_SB(s)); > nfs_free_server(server); > server = NULL; >- if (error < 0) >- goto error_splat_super; >+ } else if ((server->flags & NFS_MOUNT_FSCACHE) >+ && sb_mntdata.err_on_noshare) { >+ error = -EINVAL; >+ goto error_splat_super; > } > > if (!s->s_root) { >@@ -1020,6 +1057,9 @@ static int nfs4_xdev_get_sb(struct file_ > struct nfs_server *server; > struct dentry *mntroot; > int (*compare_super)(struct super_block *,void *) = nfs_compare_super; >+ struct nfs_sb_mountdata sb_mntdata = { >+ .mntflags = flags, >+ }; > int error; > > dprintk("--> nfs4_xdev_get_sb()\n"); >@@ -1030,6 +1070,7 @@ static int nfs4_xdev_get_sb(struct file_ > error = PTR_ERR(server); > goto out_err_noserver; > } >+ sb_mntdata.server = server; > > if (server->flags & NFS4_MOUNT_UNSHARED) { > if (server->flags & NFS4_MOUNT_FSCACHE) { >@@ -1039,7 +1080,7 @@ static int nfs4_xdev_get_sb(struct file_ > compare_super = NULL; > } > /* Get a superblock - note that we may end up sharing one that already exists */ >- s = sget(&nfs_fs_type, compare_super, nfs_set_super, server); >+ s = sget(&nfs_fs_type, compare_super, nfs_set_super, &sb_mntdata); > if (IS_ERR(s)) { > error = PTR_ERR(s); > goto out_err_nosb; >@@ -1095,6 +1136,9 @@ static int nfs4_referral_get_sb(struct f > struct dentry *mntroot; > struct nfs_fh mntfh; > int (*compare_super)(struct super_block *,void *) = nfs_compare_super; >+ struct nfs_sb_mountdata sb_mntdata = { >+ .mntflags = flags, >+ }; > int error; > > dprintk("--> nfs4_referral_get_sb()\n"); >@@ -1105,6 +1149,7 @@ static int nfs4_referral_get_sb(struct f > error = PTR_ERR(server); > goto out_err_noserver; > } >+ sb_mntdata.server = server; > > if (server->flags & NFS4_MOUNT_UNSHARED) { > if (server->flags & NFS4_MOUNT_FSCACHE) { >@@ -1114,7 +1159,7 @@ static int nfs4_referral_get_sb(struct f > compare_super = NULL; > } > /* Get a superblock - note that we may end up sharing one that already exists */ >- s = sget(&nfs_fs_type, compare_super, nfs_set_super, server); >+ s = sget(&nfs_fs_type, compare_super, nfs_set_super, &sb_mntdata); > if (IS_ERR(s)) { > error = PTR_ERR(s); > goto out_err_nosb; >@@ -1127,7 +1172,6 @@ static int nfs4_referral_get_sb(struct f > > if (!s->s_root) { > /* initial superblock/root creation */ >- s->s_flags = flags; > nfs4_fill_super(s); > } >
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 Raw
Actions:
View
Attachments on
bug 243913
:
156814
| 186571