提交 6b8cc71a 编写于 作者: L Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/sfrench/cifs-2.6:
  [CIFS] Fix timezone handling on stat to os/2
  [CIFS] Incorrect hardlink count when original file is cached (oplocked)
...@@ -318,6 +318,7 @@ int cifs_get_inode_info(struct inode **pinode, ...@@ -318,6 +318,7 @@ int cifs_get_inode_info(struct inode **pinode,
struct cifs_sb_info *cifs_sb = CIFS_SB(sb); struct cifs_sb_info *cifs_sb = CIFS_SB(sb);
char *tmp_path; char *tmp_path;
char *buf = NULL; char *buf = NULL;
int adjustTZ = FALSE;
pTcon = cifs_sb->tcon; pTcon = cifs_sb->tcon;
cFYI(1,("Getting info on %s", search_path)); cFYI(1,("Getting info on %s", search_path));
...@@ -348,6 +349,7 @@ int cifs_get_inode_info(struct inode **pinode, ...@@ -348,6 +349,7 @@ int cifs_get_inode_info(struct inode **pinode,
pfindData, cifs_sb->local_nls, pfindData, cifs_sb->local_nls,
cifs_sb->mnt_cifs_flags & cifs_sb->mnt_cifs_flags &
CIFS_MOUNT_MAP_SPECIAL_CHR); CIFS_MOUNT_MAP_SPECIAL_CHR);
adjustTZ = TRUE;
} }
} }
...@@ -444,6 +446,10 @@ int cifs_get_inode_info(struct inode **pinode, ...@@ -444,6 +446,10 @@ int cifs_get_inode_info(struct inode **pinode,
inode->i_ctime = inode->i_ctime =
cifs_NTtimeToUnix(le64_to_cpu(pfindData->ChangeTime)); cifs_NTtimeToUnix(le64_to_cpu(pfindData->ChangeTime));
cFYI(0, ("Attributes came in as 0x%x", attr)); cFYI(0, ("Attributes came in as 0x%x", attr));
if(adjustTZ && (pTcon->ses) && (pTcon->ses->server)) {
inode->i_ctime.tv_sec += pTcon->ses->server->timeAdj;
inode->i_mtime.tv_sec += pTcon->ses->server->timeAdj;
}
/* set default mode. will override for dirs below */ /* set default mode. will override for dirs below */
if (atomic_read(&cifsInfo->inUse) == 0) if (atomic_read(&cifsInfo->inUse) == 0)
......
...@@ -69,17 +69,30 @@ cifs_hardlink(struct dentry *old_file, struct inode *inode, ...@@ -69,17 +69,30 @@ cifs_hardlink(struct dentry *old_file, struct inode *inode,
rc = -EOPNOTSUPP; rc = -EOPNOTSUPP;
} }
/* if (!rc) */ d_drop(direntry); /* force new lookup from server of target */
{
/* renew_parental_timestamps(old_file); /* if source file is cached (oplocked) revalidate will not go to server
inode->i_nlink++; until the file is closed or oplock broken so update nlinks locally */
mark_inode_dirty(inode); if(old_file->d_inode) {
d_instantiate(direntry, inode); */ cifsInode = CIFS_I(old_file->d_inode);
/* BB add call to either mark inode dirty or refresh its data and timestamp to current time */ if(rc == 0) {
old_file->d_inode->i_nlink++;
old_file->d_inode->i_ctime = CURRENT_TIME;
/* parent dir timestamps will update from srv
within a second, would it really be worth it
to set the parent dir cifs inode time to zero
to force revalidate (faster) for it too? */
}
/* if not oplocked will force revalidate to get info
on source file from srv */
cifsInode->time = 0;
/* Will update parent dir timestamps from srv within a second.
Would it really be worth it to set the parent dir (cifs
inode) time field to zero to force revalidate on parent
directory faster ie
CIFS_I(inode)->time = 0; */
} }
d_drop(direntry); /* force new lookup from server */
cifsInode = CIFS_I(old_file->d_inode);
cifsInode->time = 0; /* will force revalidate to go get info when needed */
cifs_hl_exit: cifs_hl_exit:
kfree(fromName); kfree(fromName);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册