[CIFS] mtime bounces from local to remote when cifs nocmtime i_flags overwritten
atime flag was also overwritten. Noticed by Shirish when he was debugging an atime problem. Should help performance a bit too. cifs should be getting time stamps from the server (that was the original intent too) Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
parent
c14e894bd4
commit
1b2b212603
4 changed files with 18 additions and 4 deletions
|
@ -91,8 +91,9 @@ cifs_read_super(struct super_block *sb, void *data,
|
||||||
struct inode *inode;
|
struct inode *inode;
|
||||||
struct cifs_sb_info *cifs_sb;
|
struct cifs_sb_info *cifs_sb;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
|
|
||||||
sb->s_flags |= MS_NODIRATIME; /* and probably even noatime */
|
/* BB should we make this contingent on mount parm? */
|
||||||
|
sb->s_flags |= MS_NODIRATIME | MS_NOATIME;
|
||||||
sb->s_fs_info = kzalloc(sizeof(struct cifs_sb_info),GFP_KERNEL);
|
sb->s_fs_info = kzalloc(sizeof(struct cifs_sb_info),GFP_KERNEL);
|
||||||
cifs_sb = CIFS_SB(sb);
|
cifs_sb = CIFS_SB(sb);
|
||||||
if(cifs_sb == NULL)
|
if(cifs_sb == NULL)
|
||||||
|
@ -258,7 +259,10 @@ cifs_alloc_inode(struct super_block *sb)
|
||||||
cifs_inode->clientCanCacheRead = FALSE;
|
cifs_inode->clientCanCacheRead = FALSE;
|
||||||
cifs_inode->clientCanCacheAll = FALSE;
|
cifs_inode->clientCanCacheAll = FALSE;
|
||||||
cifs_inode->vfs_inode.i_blkbits = 14; /* 2**14 = CIFS_MAX_MSGSIZE */
|
cifs_inode->vfs_inode.i_blkbits = 14; /* 2**14 = CIFS_MAX_MSGSIZE */
|
||||||
cifs_inode->vfs_inode.i_flags = S_NOATIME | S_NOCMTIME;
|
|
||||||
|
/* Can not set i_flags here - they get immediately overwritten
|
||||||
|
to zero by the VFS */
|
||||||
|
/* cifs_inode->vfs_inode.i_flags = S_NOATIME | S_NOCMTIME;*/
|
||||||
INIT_LIST_HEAD(&cifs_inode->openFileList);
|
INIT_LIST_HEAD(&cifs_inode->openFileList);
|
||||||
return &cifs_inode->vfs_inode;
|
return &cifs_inode->vfs_inode;
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,6 +90,9 @@ int cifs_get_inode_info_unix(struct inode **pinode,
|
||||||
(*pinode)->i_ino =
|
(*pinode)->i_ino =
|
||||||
(unsigned long)findData.UniqueId;
|
(unsigned long)findData.UniqueId;
|
||||||
} /* note ino incremented to unique num in new_inode */
|
} /* note ino incremented to unique num in new_inode */
|
||||||
|
if(sb->s_flags & MS_NOATIME)
|
||||||
|
(*pinode)->i_flags |= S_NOATIME | S_NOCMTIME;
|
||||||
|
|
||||||
insert_inode_hash(*pinode);
|
insert_inode_hash(*pinode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -421,6 +424,8 @@ int cifs_get_inode_info(struct inode **pinode,
|
||||||
} else /* do we need cast or hash to ino? */
|
} else /* do we need cast or hash to ino? */
|
||||||
(*pinode)->i_ino = inode_num;
|
(*pinode)->i_ino = inode_num;
|
||||||
} /* else ino incremented to unique num in new_inode*/
|
} /* else ino incremented to unique num in new_inode*/
|
||||||
|
if(sb->s_flags & MS_NOATIME)
|
||||||
|
(*pinode)->i_flags |= S_NOATIME | S_NOCMTIME;
|
||||||
insert_inode_hash(*pinode);
|
insert_inode_hash(*pinode);
|
||||||
}
|
}
|
||||||
inode = *pinode;
|
inode = *pinode;
|
||||||
|
|
|
@ -77,7 +77,8 @@ cifs_hardlink(struct dentry *old_file, struct inode *inode,
|
||||||
cifsInode = CIFS_I(old_file->d_inode);
|
cifsInode = CIFS_I(old_file->d_inode);
|
||||||
if(rc == 0) {
|
if(rc == 0) {
|
||||||
old_file->d_inode->i_nlink++;
|
old_file->d_inode->i_nlink++;
|
||||||
old_file->d_inode->i_ctime = CURRENT_TIME;
|
/* BB should we make this contingent on superblock flag NOATIME? */
|
||||||
|
/* old_file->d_inode->i_ctime = CURRENT_TIME;*/
|
||||||
/* parent dir timestamps will update from srv
|
/* parent dir timestamps will update from srv
|
||||||
within a second, would it really be worth it
|
within a second, would it really be worth it
|
||||||
to set the parent dir cifs inode time to zero
|
to set the parent dir cifs inode time to zero
|
||||||
|
|
|
@ -83,6 +83,8 @@ static int construct_dentry(struct qstr *qstring, struct file *file,
|
||||||
return rc;
|
return rc;
|
||||||
rc = 1;
|
rc = 1;
|
||||||
}
|
}
|
||||||
|
if(file->f_path.dentry->d_sb->s_flags & MS_NOATIME)
|
||||||
|
(*ptmp_inode)->i_flags |= S_NOATIME | S_NOCMTIME;
|
||||||
} else {
|
} else {
|
||||||
tmp_dentry = d_alloc(file->f_path.dentry, qstring);
|
tmp_dentry = d_alloc(file->f_path.dentry, qstring);
|
||||||
if(tmp_dentry == NULL) {
|
if(tmp_dentry == NULL) {
|
||||||
|
@ -98,6 +100,8 @@ static int construct_dentry(struct qstr *qstring, struct file *file,
|
||||||
tmp_dentry->d_op = &cifs_dentry_ops;
|
tmp_dentry->d_op = &cifs_dentry_ops;
|
||||||
if(*ptmp_inode == NULL)
|
if(*ptmp_inode == NULL)
|
||||||
return rc;
|
return rc;
|
||||||
|
if(file->f_path.dentry->d_sb->s_flags & MS_NOATIME)
|
||||||
|
(*ptmp_inode)->i_flags |= S_NOATIME | S_NOCMTIME;
|
||||||
rc = 2;
|
rc = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue