diff options
Diffstat (limited to 'fs/cifs/readdir.c')
| -rw-r--r-- | fs/cifs/readdir.c | 31 | 
1 files changed, 20 insertions, 11 deletions
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c index 6002fdc920a..df40cc5fd13 100644 --- a/fs/cifs/readdir.c +++ b/fs/cifs/readdir.c @@ -78,23 +78,32 @@ cifs_prime_dcache(struct dentry *parent, struct qstr *name,  	struct dentry *dentry, *alias;  	struct inode *inode;  	struct super_block *sb = parent->d_inode->i_sb; +	struct cifs_sb_info *cifs_sb = CIFS_SB(sb);  	cFYI(1, "%s: for %s", __func__, name->name); -	if (parent->d_op && parent->d_op->d_hash) -		parent->d_op->d_hash(parent, parent->d_inode, name); -	else -		name->hash = full_name_hash(name->name, name->len); +	dentry = d_hash_and_lookup(parent, name); +	if (unlikely(IS_ERR(dentry))) +		return; -	dentry = d_lookup(parent, name);  	if (dentry) {  		int err;  		inode = dentry->d_inode; -		/* update inode in place if i_ino didn't change */ -		if (inode && CIFS_I(inode)->uniqueid == fattr->cf_uniqueid) { -			cifs_fattr_to_inode(inode, fattr); -			goto out; +		if (inode) { +			/* +			 * If we're generating inode numbers, then we don't +			 * want to clobber the existing one with the one that +			 * the readdir code created. +			 */ +			if (!(cifs_sb->mnt_cifs_flags & CIFS_MOUNT_SERVER_INUM)) +				fattr->cf_uniqueid = CIFS_I(inode)->uniqueid; + +			/* update inode in place if i_ino didn't change */ +			if (CIFS_I(inode)->uniqueid == fattr->cf_uniqueid) { +				cifs_fattr_to_inode(inode, fattr); +				goto out; +			}  		}  		err = d_invalidate(dentry);  		dput(dentry); @@ -494,7 +503,7 @@ static int cifs_entry_is_dot(struct cifs_dirent *de, bool is_unicode)     whether we can use the cached search results from the previous search */  static int is_dir_changed(struct file *file)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	struct cifsInodeInfo *cifsInfo = CIFS_I(inode);  	if (cifsInfo->time == 0) @@ -767,7 +776,7 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)  	switch ((int) file->f_pos) {  	case 0:  		if (filldir(direntry, ".", 1, file->f_pos, -		     file->f_path.dentry->d_inode->i_ino, DT_DIR) < 0) { +		     file_inode(file)->i_ino, DT_DIR) < 0) {  			cERROR(1, "Filldir for current dir failed");  			rc = -ENOMEM;  			break;  |