diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c index 77fc5e1..665a9ea 100644 --- a/fs/cifs/cifsfs.c +++ b/fs/cifs/cifsfs.c @@ -572,6 +572,22 @@ static const struct super_operations cifs_super_ops = { #endif }; +static void +fill_phfattr(struct cifs_fattr *cf, struct super_block *sb) +{ + struct cifs_sb_info *cifs_sb = CIFS_SB(sb); + + memset(cf, 0, sizeof(*cf)); + cf->cf_uniqueid = iunique(sb, ROOT_I); + cf->cf_nlink = 1; + cf->cf_atime = CURRENT_TIME; + cf->cf_ctime = CURRENT_TIME; + cf->cf_mtime = CURRENT_TIME; + cf->cf_mode = S_IFDIR | S_IXUGO | S_IRWXU; + cf->cf_uid = cifs_sb->mnt_uid; + cf->cf_gid = cifs_sb->mnt_gid; +} + /* * Get root dentry from superblock according to prefix path mount option. * Return dentry with refcount + 1 on success and NULL otherwise. @@ -584,6 +600,9 @@ cifs_get_root(struct smb_vol *vol, struct super_block *sb) char *full_path = NULL; char *s, *p; char sep; + struct inode *dir, *phinode; + struct dentry *child; + struct cifs_fattr phfattr; full_path = cifs_build_path_to_root(vol, cifs_sb, cifs_sb_master_tcon(cifs_sb)); @@ -592,13 +611,13 @@ cifs_get_root(struct smb_vol *vol, struct super_block *sb) cifs_dbg(FYI, "Get root dentry for %s\n", full_path); + fill_phfattr(&phfattr, sb); sep = CIFS_DIR_SEP(cifs_sb); dentry = dget(sb->s_root); p = s = full_path; do { - struct inode *dir = dentry->d_inode; - struct dentry *child; + dir = dentry->d_inode; if (!dir) { dput(dentry); @@ -626,6 +645,16 @@ cifs_get_root(struct smb_vol *vol, struct super_block *sb) mutex_unlock(&dir->i_mutex); dput(dentry); dentry = child; + if (!IS_ERR(dentry)) { + if (*s) { + if (!dentry->d_inode) { + phinode = cifs_iget(sb, &phfattr); + if (phinode) + d_instantiate( + dentry, phinode); + } + } + } } while (!IS_ERR(dentry)); kfree(full_path); return dentry; diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c index 867b7cd..e61c439 100644 --- a/fs/cifs/inode.c +++ b/fs/cifs/inode.c @@ -1816,6 +1816,7 @@ int cifs_revalidate_dentry(struct dentry *dentry) int rc; struct inode *inode = dentry->d_inode; + dump_stack(); // XXX rc = cifs_revalidate_dentry_attr(dentry); if (rc) return rc;