new helper: file_inode(file)
[linux-block.git] / fs / cifs / readdir.c
index 6002fdc920ae402dabad902e623b875288fa988e..7255b0c7aa7e2d967cab8fe6ecda4045f24072a9 100644 (file)
@@ -78,6 +78,7 @@ 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);
 
@@ -91,10 +92,20 @@ cifs_prime_dcache(struct dentry *parent, struct qstr *name,
                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 +505,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 +778,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;