Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755901AbXKAVsA (ORCPT ); Thu, 1 Nov 2007 17:48:00 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1753275AbXKAVrv (ORCPT ); Thu, 1 Nov 2007 17:47:51 -0400 Received: from mail.fieldses.org ([66.93.2.214]:47689 "EHLO fieldses.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753469AbXKAVru (ORCPT ); Thu, 1 Nov 2007 17:47:50 -0400 Date: Thu, 1 Nov 2007 17:47:16 -0400 To: Jan Blunck Cc: Linux-Kernel Mailinglist , Christoph Hellwig , Andreas Gruenbacher , neilb@suse.de Subject: Re: [PATCH 7/7] Use struct path in struct svc_export Message-ID: <20071101214716.GF30151@fieldses.org> References: <20071029124120.528997881@weierstrass.suse.de> <20071029124121.956529923@weierstrass.suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20071029124121.956529923@weierstrass.suse.de> User-Agent: Mutt/1.5.16 (2007-06-11) From: "J. Bruce Fields" Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 21272 Lines: 586 On Mon, Oct 29, 2007 at 01:41:27PM +0100, Jan Blunck wrote: > I'm embedding struct path into struct svc_export. Fine by me.... (For what it's worth: Acked-by: J. Bruce Fields ) --b. > > Signed-off-by: Jan Blunck > --- > fs/nfsd/export.c | 69 +++++++++++++++++++++----------------------- > fs/nfsd/nfs3proc.c | 2 - > fs/nfsd/nfs3xdr.c | 4 +- > fs/nfsd/nfs4proc.c | 4 +- > fs/nfsd/nfs4xdr.c | 12 +++---- > fs/nfsd/nfsfh.c | 26 ++++++++-------- > fs/nfsd/nfsproc.c | 6 +-- > fs/nfsd/nfsxdr.c | 2 - > fs/nfsd/vfs.c | 22 +++++++------- > include/linux/nfsd/export.h | 5 +-- > 10 files changed, 74 insertions(+), 78 deletions(-) > > Index: b/fs/nfsd/export.c > =================================================================== > --- a/fs/nfsd/export.c > +++ b/fs/nfsd/export.c > @@ -332,10 +332,9 @@ static void nfsd4_fslocs_free(struct nfs > static void svc_export_put(struct kref *ref) > { > struct svc_export *exp = container_of(ref, struct svc_export, h.ref); > - dput(exp->ex_dentry); > - mntput(exp->ex_mnt); > + path_put(&exp->ex_path); > auth_domain_put(exp->ex_client); > - kfree(exp->ex_path); > + kfree(exp->ex_pathname); > nfsd4_fslocs_free(&exp->ex_fslocs); > kfree(exp); > } > @@ -346,11 +345,10 @@ static void svc_export_request(struct ca > { > /* client path */ > struct svc_export *exp = container_of(h, struct svc_export, h); > - struct path path = { .dentry = exp->ex_dentry, .mnt = exp->ex_mnt }; > char *pth; > > qword_add(bpp, blen, exp->ex_client->name); > - pth = d_path(&path, *bpp, *blen); > + pth = d_path(&exp->ex_path, *bpp, *blen); > if (IS_ERR(pth)) { > /* is this correct? */ > (*bpp)[0] = '\n'; > @@ -509,7 +507,7 @@ static int svc_export_parse(struct cache > int an_int; > > nd.path.dentry = NULL; > - exp.ex_path = NULL; > + exp.ex_pathname = NULL; > > /* fs locations */ > exp.ex_fslocs.locations = NULL; > @@ -548,11 +546,11 @@ static int svc_export_parse(struct cache > > exp.h.flags = 0; > exp.ex_client = dom; > - exp.ex_mnt = nd.path.mnt; > - exp.ex_dentry = nd.path.dentry; > - exp.ex_path = kstrdup(buf, GFP_KERNEL); > + exp.ex_path.mnt = nd.path.mnt; > + exp.ex_path.dentry = nd.path.dentry; > + exp.ex_pathname = kstrdup(buf, GFP_KERNEL); > err = -ENOMEM; > - if (!exp.ex_path) > + if (!exp.ex_pathname) > goto out; > > /* expiry */ > @@ -629,7 +627,7 @@ static int svc_export_parse(struct cache > out: > nfsd4_fslocs_free(&exp.ex_fslocs); > kfree(exp.ex_uuid); > - kfree(exp.ex_path); > + kfree(exp.ex_pathname); > if (nd.path.dentry) > path_put(&nd.path); > out_no_path: > @@ -654,7 +652,7 @@ static int svc_export_show(struct seq_fi > return 0; > } > exp = container_of(h, struct svc_export, h); > - seq_path(m, exp->ex_mnt, exp->ex_dentry, " \t\n\\"); > + seq_path(m, exp->ex_path.mnt, exp->ex_path.dentry, " \t\n\\"); > seq_putc(m, '\t'); > seq_escape(m, exp->ex_client->name, " \t\n\\"); > seq_putc(m, '('); > @@ -681,8 +679,8 @@ static int svc_export_match(struct cache > struct svc_export *orig = container_of(a, struct svc_export, h); > struct svc_export *new = container_of(b, struct svc_export, h); > return orig->ex_client == new->ex_client && > - orig->ex_dentry == new->ex_dentry && > - orig->ex_mnt == new->ex_mnt; > + orig->ex_path.dentry == new->ex_path.dentry && > + orig->ex_path.mnt == new->ex_path.mnt; > } > > static void svc_export_init(struct cache_head *cnew, struct cache_head *citem) > @@ -692,9 +690,9 @@ static void svc_export_init(struct cache > > kref_get(&item->ex_client->ref); > new->ex_client = item->ex_client; > - new->ex_dentry = dget(item->ex_dentry); > - new->ex_mnt = mntget(item->ex_mnt); > - new->ex_path = NULL; > + new->ex_path.dentry = dget(item->ex_path.dentry); > + new->ex_path.mnt = mntget(item->ex_path.mnt); > + new->ex_pathname = NULL; > new->ex_fslocs.locations = NULL; > new->ex_fslocs.locations_count = 0; > new->ex_fslocs.migrated = 0; > @@ -712,8 +710,8 @@ static void export_update(struct cache_h > new->ex_fsid = item->ex_fsid; > new->ex_uuid = item->ex_uuid; > item->ex_uuid = NULL; > - new->ex_path = item->ex_path; > - item->ex_path = NULL; > + new->ex_pathname = item->ex_pathname; > + item->ex_pathname = NULL; > new->ex_fslocs.locations = item->ex_fslocs.locations; > item->ex_fslocs.locations = NULL; > new->ex_fslocs.locations_count = item->ex_fslocs.locations_count; > @@ -756,8 +754,8 @@ svc_export_lookup(struct svc_export *exp > struct cache_head *ch; > int hash; > hash = hash_ptr(exp->ex_client, EXPORT_HASHBITS); > - hash ^= hash_ptr(exp->ex_dentry, EXPORT_HASHBITS); > - hash ^= hash_ptr(exp->ex_mnt, EXPORT_HASHBITS); > + hash ^= hash_ptr(exp->ex_path.dentry, EXPORT_HASHBITS); > + hash ^= hash_ptr(exp->ex_path.mnt, EXPORT_HASHBITS); > > ch = sunrpc_cache_lookup(&svc_export_cache, &exp->h, > hash); > @@ -773,8 +771,8 @@ svc_export_update(struct svc_export *new > struct cache_head *ch; > int hash; > hash = hash_ptr(old->ex_client, EXPORT_HASHBITS); > - hash ^= hash_ptr(old->ex_dentry, EXPORT_HASHBITS); > - hash ^= hash_ptr(old->ex_mnt, EXPORT_HASHBITS); > + hash ^= hash_ptr(old->ex_path.dentry, EXPORT_HASHBITS); > + hash ^= hash_ptr(old->ex_path.mnt, EXPORT_HASHBITS); > > ch = sunrpc_cache_update(&svc_export_cache, &new->h, > &old->h, > @@ -816,8 +814,8 @@ static int exp_set_key(svc_client *clp, > key.ek_client = clp; > key.ek_fsidtype = fsid_type; > memcpy(key.ek_fsid, fsidv, key_len(fsid_type)); > - key.ek_mnt = exp->ex_mnt; > - key.ek_dentry = exp->ex_dentry; > + key.ek_mnt = exp->ex_path.mnt; > + key.ek_dentry = exp->ex_path.dentry; > key.h.expiry_time = NEVER; > key.h.flags = 0; > > @@ -871,8 +869,8 @@ static svc_export *exp_get_by_name(svc_c > return ERR_PTR(-ENOENT); > > key.ex_client = clp; > - key.ex_mnt = mnt; > - key.ex_dentry = dentry; > + key.ex_path.mnt = mnt; > + key.ex_path.dentry = dentry; > > exp = svc_export_lookup(&key); > if (exp == NULL) > @@ -969,7 +967,7 @@ static int exp_fsid_hash(svc_client *clp > static int exp_hash(struct auth_domain *clp, struct svc_export *exp) > { > u32 fsid[2]; > - struct inode *inode = exp->ex_dentry->d_inode; > + struct inode *inode = exp->ex_path.dentry->d_inode; > dev_t dev = inode->i_sb->s_dev; > > if (old_valid_dev(dev)) { > @@ -983,7 +981,7 @@ static int exp_hash(struct auth_domain * > static void exp_unhash(struct svc_export *exp) > { > struct svc_expkey *ek; > - struct inode *inode = exp->ex_dentry->d_inode; > + struct inode *inode = exp->ex_path.dentry->d_inode; > > ek = exp_get_key(exp->ex_client, inode->i_sb->s_dev, inode->i_ino); > if (!IS_ERR(ek)) { > @@ -1065,12 +1063,11 @@ exp_export(struct nfsctl_export *nxp) > > new.h.expiry_time = NEVER; > new.h.flags = 0; > - new.ex_path = kstrdup(nxp->ex_path, GFP_KERNEL); > - if (!new.ex_path) > + new.ex_pathname = kstrdup(nxp->ex_path, GFP_KERNEL); > + if (!new.ex_pathname) > goto finish; > new.ex_client = clp; > - new.ex_mnt = nd.path.mnt; > - new.ex_dentry = nd.path.dentry; > + new.ex_path = nd.path; > new.ex_flags = nxp->ex_flags; > new.ex_anon_uid = nxp->ex_anon_uid; > new.ex_anon_gid = nxp->ex_anon_gid; > @@ -1091,8 +1088,8 @@ exp_export(struct nfsctl_export *nxp) > } else > err = 0; > finish: > - if (new.ex_path) > - kfree(new.ex_path); > + if (new.ex_pathname) > + kfree(new.ex_pathname); > if (exp) > exp_put(exp); > if (fsid_key && !IS_ERR(fsid_key)) > @@ -1363,7 +1360,7 @@ exp_pseudoroot(struct svc_rqst *rqstp, s > return nfserr_perm; > if (IS_ERR(exp)) > return nfserrno(PTR_ERR(exp)); > - rv = fh_compose(fhp, exp, exp->ex_dentry, NULL); > + rv = fh_compose(fhp, exp, exp->ex_path.dentry, NULL); > if (rv) > goto out; > rv = check_nfsd_access(exp, rqstp); > Index: b/fs/nfsd/nfs3proc.c > =================================================================== > --- a/fs/nfsd/nfs3proc.c > +++ b/fs/nfsd/nfs3proc.c > @@ -67,7 +67,7 @@ nfsd3_proc_getattr(struct svc_rqst *rqst > if (nfserr) > RETURN_STATUS(nfserr); > > - err = vfs_getattr(resp->fh.fh_export->ex_mnt, > + err = vfs_getattr(resp->fh.fh_export->ex_path.mnt, > resp->fh.fh_dentry, &resp->stat); > nfserr = nfserrno(err); > > Index: b/fs/nfsd/nfs3xdr.c > =================================================================== > --- a/fs/nfsd/nfs3xdr.c > +++ b/fs/nfsd/nfs3xdr.c > @@ -217,7 +217,7 @@ encode_post_op_attr(struct svc_rqst *rqs > int err; > struct kstat stat; > > - err = vfs_getattr(fhp->fh_export->ex_mnt, dentry, &stat); > + err = vfs_getattr(fhp->fh_export->ex_path.mnt, dentry, &stat); > if (!err) { > *p++ = xdr_one; /* attributes follow */ > lease_get_mtime(dentry->d_inode, &stat.mtime); > @@ -269,7 +269,7 @@ void fill_post_wcc(struct svc_fh *fhp) > if (fhp->fh_post_saved) > printk("nfsd: inode locked twice during operation.\n"); > > - err = vfs_getattr(fhp->fh_export->ex_mnt, fhp->fh_dentry, > + err = vfs_getattr(fhp->fh_export->ex_path.mnt, fhp->fh_dentry, > &fhp->fh_post_attr); > if (err) > fhp->fh_post_saved = 0; > Index: b/fs/nfsd/nfs4proc.c > =================================================================== > --- a/fs/nfsd/nfs4proc.c > +++ b/fs/nfsd/nfs4proc.c > @@ -658,7 +658,7 @@ nfsd4_setattr(struct svc_rqst *rqstp, st > return status; > } > } > - status = mnt_want_write(cstate->current_fh.fh_export->ex_mnt); > + status = mnt_want_write(cstate->current_fh.fh_export->ex_path.mnt); > if (status) > return status; > status = nfs_ok; > @@ -670,7 +670,7 @@ nfsd4_setattr(struct svc_rqst *rqstp, st > status = nfsd_setattr(rqstp, &cstate->current_fh, &setattr->sa_iattr, > 0, (time_t)0); > out: > - mnt_drop_write(cstate->current_fh.fh_export->ex_mnt); > + mnt_drop_write(cstate->current_fh.fh_export->ex_path.mnt); > return status; > } > > Index: b/fs/nfsd/nfs4xdr.c > =================================================================== > --- a/fs/nfsd/nfs4xdr.c > +++ b/fs/nfsd/nfs4xdr.c > @@ -1325,9 +1325,9 @@ static char *nfsd4_path(struct svc_rqst > *stat = exp_pseudoroot(rqstp, &tmp_fh); > if (*stat) > return NULL; > - rootpath = tmp_fh.fh_export->ex_path; > + rootpath = tmp_fh.fh_export->ex_pathname; > > - path = exp->ex_path; > + path = exp->ex_pathname; > > if (strncmp(path, rootpath, strlen(rootpath))) { > dprintk("nfsd: fs_locations failed;" > @@ -1476,7 +1476,7 @@ nfsd4_encode_fattr(struct svc_fh *fhp, s > goto out; > } > > - err = vfs_getattr(exp->ex_mnt, dentry, &stat); > + err = vfs_getattr(exp->ex_path.mnt, dentry, &stat); > if (err) > goto out_nfserr; > if ((bmval0 & (FATTR4_WORD0_FILES_FREE | FATTR4_WORD0_FILES_TOTAL | > @@ -1828,9 +1828,9 @@ out_acl: > if (bmval1 & FATTR4_WORD1_MOUNTED_ON_FILEID) { > if ((buflen -= 8) < 0) > goto out_resource; > - if (exp->ex_mnt->mnt_root->d_inode == dentry->d_inode) { > - err = vfs_getattr(exp->ex_mnt->mnt_parent, > - exp->ex_mnt->mnt_mountpoint, &stat); > + if (exp->ex_path.mnt->mnt_root->d_inode == dentry->d_inode) { > + err = vfs_getattr(exp->ex_path.mnt->mnt_parent, > + exp->ex_path.mnt->mnt_mountpoint, &stat); > if (err) > goto out_nfserr; > } > Index: b/fs/nfsd/nfsfh.c > =================================================================== > --- a/fs/nfsd/nfsfh.c > +++ b/fs/nfsd/nfsfh.c > @@ -46,7 +46,7 @@ static int nfsd_acceptable(void *expv, s > return 1; > > tdentry = dget(dentry); > - while (tdentry != exp->ex_dentry && ! IS_ROOT(tdentry)) { > + while (tdentry != exp->ex_path.dentry && ! IS_ROOT(tdentry)) { > /* make sure parents give x permission to user */ > int err; > parent = dget_parent(tdentry); > @@ -58,9 +58,9 @@ static int nfsd_acceptable(void *expv, s > dput(tdentry); > tdentry = parent; > } > - if (tdentry != exp->ex_dentry) > + if (tdentry != exp->ex_path.dentry) > dprintk("nfsd_acceptable failed at %p %s\n", tdentry, tdentry->d_name.name); > - rv = (tdentry == exp->ex_dentry); > + rv = (tdentry == exp->ex_path.dentry); > dput(tdentry); > return rv; > } > @@ -203,9 +203,9 @@ fh_verify(struct svc_rqst *rqstp, struct > fileid_type = fh->fh_fileid_type; > > if (fileid_type == FILEID_ROOT) > - dentry = dget(exp->ex_dentry); > + dentry = dget(exp->ex_path.dentry); > else { > - dentry = exportfs_decode_fh(exp->ex_mnt, fid, > + dentry = exportfs_decode_fh(exp->ex_path.mnt, fid, > data_left, fileid_type, > nfsd_acceptable, exp); > } > @@ -289,7 +289,7 @@ out: > static void _fh_update(struct svc_fh *fhp, struct svc_export *exp, > struct dentry *dentry) > { > - if (dentry != exp->ex_dentry) { > + if (dentry != exp->ex_path.dentry) { > struct fid *fid = (struct fid *) > (fhp->fh_handle.fh_auth + fhp->fh_handle.fh_size/4 - 1); > int maxsize = (fhp->fh_maxsize - fhp->fh_handle.fh_size)/4; > @@ -334,12 +334,12 @@ fh_compose(struct svc_fh *fhp, struct sv > struct inode * inode = dentry->d_inode; > struct dentry *parent = dentry->d_parent; > __u32 *datap; > - dev_t ex_dev = exp->ex_dentry->d_inode->i_sb->s_dev; > - int root_export = (exp->ex_dentry == exp->ex_dentry->d_sb->s_root); > + dev_t ex_dev = exp->ex_path.dentry->d_inode->i_sb->s_dev; > + int root_export = (exp->ex_path.dentry == exp->ex_path.dentry->d_sb->s_root); > > dprintk("nfsd: fh_compose(exp %02x:%02x/%ld %s/%s, ino=%ld)\n", > MAJOR(ex_dev), MINOR(ex_dev), > - (long) exp->ex_dentry->d_inode->i_ino, > + (long) exp->ex_path.dentry->d_inode->i_ino, > parent->d_name.name, dentry->d_name.name, > (inode ? inode->i_ino : 0)); > > @@ -381,7 +381,7 @@ fh_compose(struct svc_fh *fhp, struct sv > /* FALL THROUGH */ > case FSID_MAJOR_MINOR: > case FSID_ENCODE_DEV: > - if (!(exp->ex_dentry->d_inode->i_sb->s_type->fs_flags > + if (!(exp->ex_path.dentry->d_inode->i_sb->s_type->fs_flags > & FS_REQUIRES_DEV)) > goto retry; > break; > @@ -444,7 +444,7 @@ fh_compose(struct svc_fh *fhp, struct sv > fhp->fh_handle.ofh_dev = old_encode_dev(ex_dev); > fhp->fh_handle.ofh_xdev = fhp->fh_handle.ofh_dev; > fhp->fh_handle.ofh_xino = > - ino_t_to_u32(exp->ex_dentry->d_inode->i_ino); > + ino_t_to_u32(exp->ex_path.dentry->d_inode->i_ino); > fhp->fh_handle.ofh_dirino = ino_t_to_u32(parent_ino(dentry)); > if (inode) > _fh_update_old(dentry, exp, &fhp->fh_handle); > @@ -455,7 +455,7 @@ fh_compose(struct svc_fh *fhp, struct sv > datap = fhp->fh_handle.fh_auth+0; > fhp->fh_handle.fh_fsid_type = fsid_type; > mk_fsid(fsid_type, datap, ex_dev, > - exp->ex_dentry->d_inode->i_ino, > + exp->ex_path.dentry->d_inode->i_ino, > exp->ex_fsid, exp->ex_uuid); > > len = key_len(fsid_type); > @@ -561,7 +561,7 @@ enum fsid_source fsid_source(struct svc_ > case FSID_DEV: > case FSID_ENCODE_DEV: > case FSID_MAJOR_MINOR: > - if (fhp->fh_export->ex_dentry->d_inode->i_sb->s_type->fs_flags > + if (fhp->fh_export->ex_path.dentry->d_inode->i_sb->s_type->fs_flags > & FS_REQUIRES_DEV) > return FSIDSOURCE_DEV; > break; > Index: b/fs/nfsd/nfsproc.c > =================================================================== > --- a/fs/nfsd/nfsproc.c > +++ b/fs/nfsd/nfsproc.c > @@ -41,7 +41,7 @@ static __be32 > nfsd_return_attrs(__be32 err, struct nfsd_attrstat *resp) > { > if (err) return err; > - return nfserrno(vfs_getattr(resp->fh.fh_export->ex_mnt, > + return nfserrno(vfs_getattr(resp->fh.fh_export->ex_path.mnt, > resp->fh.fh_dentry, > &resp->stat)); > } > @@ -49,7 +49,7 @@ static __be32 > nfsd_return_dirop(__be32 err, struct nfsd_diropres *resp) > { > if (err) return err; > - return nfserrno(vfs_getattr(resp->fh.fh_export->ex_mnt, > + return nfserrno(vfs_getattr(resp->fh.fh_export->ex_path.mnt, > resp->fh.fh_dentry, > &resp->stat)); > } > @@ -164,7 +164,7 @@ nfsd_proc_read(struct svc_rqst *rqstp, s > &resp->count); > > if (nfserr) return nfserr; > - return nfserrno(vfs_getattr(resp->fh.fh_export->ex_mnt, > + return nfserrno(vfs_getattr(resp->fh.fh_export->ex_path.mnt, > resp->fh.fh_dentry, > &resp->stat)); > } > Index: b/fs/nfsd/nfsxdr.c > =================================================================== > --- a/fs/nfsd/nfsxdr.c > +++ b/fs/nfsd/nfsxdr.c > @@ -206,7 +206,7 @@ encode_fattr(struct svc_rqst *rqstp, __b > __be32 *nfs2svc_encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp) > { > struct kstat stat; > - vfs_getattr(fhp->fh_export->ex_mnt, fhp->fh_dentry, &stat); > + vfs_getattr(fhp->fh_export->ex_path.mnt, fhp->fh_dentry, &stat); > return encode_fattr(rqstp, p, fhp, &stat); > } > > Index: b/fs/nfsd/vfs.c > =================================================================== > --- a/fs/nfsd/vfs.c > +++ b/fs/nfsd/vfs.c > @@ -101,7 +101,7 @@ nfsd_cross_mnt(struct svc_rqst *rqstp, s > { > struct svc_export *exp = *expp, *exp2 = NULL; > struct dentry *dentry = *dpp; > - struct vfsmount *mnt = mntget(exp->ex_mnt); > + struct vfsmount *mnt = mntget(exp->ex_path.mnt); > struct dentry *mounts = dget(dentry); > int err = 0; > > @@ -156,7 +156,7 @@ nfsd_lookup_dentry(struct svc_rqst *rqst > if (isdotent(name, len)) { > if (len==1) > dentry = dget(dparent); > - else if (dparent != exp->ex_dentry) { > + else if (dparent != exp->ex_path.dentry) { > dentry = dget_parent(dparent); > } else if (!EX_NOHIDE(exp)) > dentry = dget(dparent); /* .. == . just like at / */ > @@ -164,7 +164,7 @@ nfsd_lookup_dentry(struct svc_rqst *rqst > /* checking mountpoint crossing is very different when stepping up */ > struct svc_export *exp2 = NULL; > struct dentry *dp; > - struct vfsmount *mnt = mntget(exp->ex_mnt); > + struct vfsmount *mnt = mntget(exp->ex_path.mnt); > dentry = dget(dparent); > while(dentry == mnt->mnt_root && follow_up(&mnt, &dentry)) > ; > @@ -721,7 +721,7 @@ nfsd_open(struct svc_rqst *rqstp, struct > > DQUOT_INIT(inode); > } > - *filp = dentry_open(dget(dentry), mntget(fhp->fh_export->ex_mnt), flags); > + *filp = dentry_open(dget(dentry), mntget(fhp->fh_export->ex_path.mnt), flags); > if (IS_ERR(*filp)) > host_err = PTR_ERR(*filp); > out_nfserr: > @@ -1242,11 +1242,11 @@ nfsd_create(struct svc_rqst *rqstp, stru > case S_IFBLK: > case S_IFIFO: > case S_IFSOCK: > - host_err = mnt_want_write(fhp->fh_export->ex_mnt); > + host_err = mnt_want_write(fhp->fh_export->ex_path.mnt); > if (host_err) > break; > host_err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev); > - mnt_drop_write(fhp->fh_export->ex_mnt); > + mnt_drop_write(fhp->fh_export->ex_path.mnt); > break; > default: > printk("nfsd: bad file type %o in nfsd_create\n", type); > @@ -1457,7 +1457,7 @@ nfsd_readlink(struct svc_rqst *rqstp, st > if (!inode->i_op || !inode->i_op->readlink) > goto out; > > - touch_atime(fhp->fh_export->ex_mnt, dentry); > + touch_atime(fhp->fh_export->ex_path.mnt, dentry); > /* N.B. Why does this call need a get_fs()?? > * Remove the set_fs and watch the fireworks:-) --okir > */ > @@ -1680,9 +1680,9 @@ nfsd_rename(struct svc_rqst *rqstp, stru > } > > host_err = -EXDEV; > - if (ffhp->fh_export->ex_mnt != tfhp->fh_export->ex_mnt) > + if (ffhp->fh_export->ex_path.mnt != tfhp->fh_export->ex_path.mnt) > goto out_dput_new; > - host_err = mnt_want_write(ffhp->fh_export->ex_mnt); > + host_err = mnt_want_write(ffhp->fh_export->ex_path.mnt); > if (host_err) > goto out_dput_new; > > @@ -1866,7 +1866,7 @@ nfsd_permission(struct svc_rqst *rqstp, > inode->i_mode, > IS_IMMUTABLE(inode)? " immut" : "", > IS_APPEND(inode)? " append" : "", > - __mnt_is_readonly(exp->ex_mnt)? " ro" : ""); > + __mnt_is_readonly(exp->ex_path.mnt)? " ro" : ""); > dprintk(" owner %d/%d user %d/%d\n", > inode->i_uid, inode->i_gid, current->fsuid, current->fsgid); > #endif > @@ -1877,7 +1877,7 @@ nfsd_permission(struct svc_rqst *rqstp, > */ > if (!(acc & MAY_LOCAL_ACCESS)) > if (acc & (MAY_WRITE | MAY_SATTR | MAY_TRUNC)) { > - if (exp_rdonly(rqstp, exp) || __mnt_is_readonly(exp->ex_mnt)) > + if (exp_rdonly(rqstp, exp) || __mnt_is_readonly(exp->ex_path.mnt)) > return nfserr_rofs; > if (/* (acc & MAY_WRITE) && */ IS_IMMUTABLE(inode)) > return nfserr_perm; > Index: b/include/linux/nfsd/export.h > =================================================================== > --- a/include/linux/nfsd/export.h > +++ b/include/linux/nfsd/export.h > @@ -84,9 +84,8 @@ struct svc_export { > struct cache_head h; > struct auth_domain * ex_client; > int ex_flags; > - struct vfsmount * ex_mnt; > - struct dentry * ex_dentry; > - char * ex_path; > + struct path ex_path; > + char * ex_pathname; > uid_t ex_anon_uid; > gid_t ex_anon_gid; > int ex_fsid; > > -- > - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/