summaryrefslogtreecommitdiff
path: root/fs/cifs/link.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.osdl.org>2006-12-02 00:40:13 (GMT)
committerLinus Torvalds <torvalds@woody.osdl.org>2006-12-02 00:40:13 (GMT)
commit6b8cc71ab2619a776b02869fd733ac1ead3db4e8 (patch)
tree5d2f92fc47f72a8da38658e75f2369e7fbae93a4 /fs/cifs/link.c
parent1399ff54741b3aa0aaf5097b8559fa30277ebe61 (diff)
parent8d6286fdfd290589f8446ec1503702227263dcfd (diff)
downloadlinux-6b8cc71ab2619a776b02869fd733ac1ead3db4e8.tar.xz
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)
Diffstat (limited to 'fs/cifs/link.c')
-rw-r--r--fs/cifs/link.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/fs/cifs/link.c b/fs/cifs/link.c
index 0bee8b7..8e25996 100644
--- a/fs/cifs/link.c
+++ b/fs/cifs/link.c
@@ -69,17 +69,30 @@ cifs_hardlink(struct dentry *old_file, struct inode *inode,
rc = -EOPNOTSUPP;
}
-/* if (!rc) */
- {
- /* renew_parental_timestamps(old_file);
- inode->i_nlink++;
- mark_inode_dirty(inode);
- d_instantiate(direntry, inode); */
- /* BB add call to either mark inode dirty or refresh its data and timestamp to current time */
+ d_drop(direntry); /* force new lookup from server of target */
+
+ /* if source file is cached (oplocked) revalidate will not go to server
+ until the file is closed or oplock broken so update nlinks locally */
+ if(old_file->d_inode) {
+ cifsInode = CIFS_I(old_file->d_inode);
+ 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:
kfree(fromName);