On Sat, 27 Aug 2011 00:11:57 +0400 Pavel Shilovsky <piastry@xxxxxxxxxxx> wrote: > 2011/8/26 Jeff Layton <jlayton@xxxxxxxxxx>: > > On Fri, 26 Aug 2011 10:52:21 +0400 > > Pavel Shilovsky <piastry@xxxxxxxxxxx> wrote: > > > >> Reorganize code and make it send qpath info request only for a full > >> path (//server/share/prefixpath) rather than request for every path > >> compoment. In this case we end up with negative dentries for all > >> components except full one and we will instantiate them later if > >> such a mount is requested. > >> > >> Signed-off-by: Pavel Shilovsky <piastry@xxxxxxxxxxx> > >> --- > >> fs/cifs/cifsfs.c | 123 +++++++++++++++++++++++++++++++---------------------- > >> fs/cifs/cifsfs.h | 3 +- > >> fs/cifs/inode.c | 7 ++- > >> fs/cifs/readdir.c | 9 +++- > >> 4 files changed, 85 insertions(+), 57 deletions(-) > >> > >> diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c > >> index 0435bb9..33a2e1e 100644 > >> --- a/fs/cifs/cifsfs.c > >> +++ b/fs/cifs/cifsfs.c > >> @@ -95,14 +95,13 @@ mempool_t *smb2_mid_poolp; > >> static struct kmem_cache *smb2_mid_cachep; > >> #endif /* CONFIG_CIFS_SMB2 */ > >> > >> -static int > >> +static void > >> cifs_read_super(struct super_block *sb) > >> { > >> - struct inode *inode; > >> - struct cifs_sb_info *cifs_sb; > >> - int rc = 0; > >> + struct cifs_sb_info *cifs_sb = CIFS_SB(sb); > >> > >> - cifs_sb = CIFS_SB(sb); > >> + /* BB should we make this contingent on mount parm? */ > >> + sb->s_flags |= MS_NODIRATIME | MS_NOATIME; > >> > >> if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIXACL) > >> sb->s_flags |= MS_POSIXACL; > >> @@ -120,26 +119,6 @@ cifs_read_super(struct super_block *sb) > >> sb->s_bdi = &cifs_sb->bdi; > >> sb->s_blocksize = CIFS_MAX_MSGSIZE; > >> sb->s_blocksize_bits = 14; /* default 2**14 = CIFS_MAX_MSGSIZE */ > >> - inode = cifs_root_iget(sb); > >> - > >> - if (IS_ERR(inode)) { > >> - rc = PTR_ERR(inode); > >> - inode = NULL; > >> - goto out_no_root; > >> - } > >> - > >> - sb->s_root = d_alloc_root(inode); > >> - > >> - if (!sb->s_root) { > >> - rc = -ENOMEM; > >> - goto out_no_root; > >> - } > >> - > >> - /* do that *after* d_alloc_root() - we want NULL ->d_op for root here */ > >> - if (cifs_sb_master_tcon(cifs_sb)->nocase) > >> - sb->s_d_op = &cifs_ci_dentry_ops; > >> - else > >> - sb->s_d_op = &cifs_dentry_ops; > >> > >> #ifdef CIFS_NFSD_EXPORT > >> if (cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM) { > >> @@ -148,14 +127,7 @@ cifs_read_super(struct super_block *sb) > >> } > >> #endif /* CIFS_NFSD_EXPORT */ > >> > >> - return 0; > >> - > >> -out_no_root: > >> - cERROR(1, "cifs_read_super: get root inode failed"); > >> - if (inode) > >> - iput(inode); > >> - > >> - return rc; > >> + sb->s_flags |= MS_ACTIVE; > >> } > >> > >> static void cifs_kill_sb(struct super_block *sb) > >> @@ -529,6 +501,17 @@ static const struct super_operations cifs_super_ops = { > >> #endif > >> }; > >> > >> +static struct dentry * > >> +cifs_alloc_root(struct super_block *sb) > >> +{ > >> + struct qstr q; > >> + > >> + q.name = "/"; > > > > I don't think you want a separator in the name. That seems > > like it should be "". > > > > In this case I based it on d_alloc_root() function that fills name as > "/". Why this should be ""? > You may be right. It just looked odd to me because '/' is typically the delimiter between path components and the q.name should be the name of the path component itself. If d_alloc_root does it though, you're probably OK. -- Jeff Layton <jlayton@xxxxxxxxxx> -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html