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)
This commit is contained in:
commit
6b8cc71ab2
2 changed files with 29 additions and 10 deletions
|
@ -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,
|
||||||
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,
|
||||||
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,
|
||||||
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);
|
||||||
|
|
Loading…
Reference in a new issue