Skip to content

Commit

Permalink
[CIFS] Incorrect hardlink count when original file is cached (oplocked)
Browse files Browse the repository at this point in the history
Fixes Samba bug 2823

In this case hardlink count is stale for one of the two inodes (ie the
original file) until it is closed - since revalidate does not go to
server while file is cached locally.

Signed-off-by: Steve French <[email protected]>
  • Loading branch information
Steve French committed Nov 16, 2006
1 parent 237ee31 commit 31ec35d
Showing 1 changed file with 23 additions and 10 deletions.
33 changes: 23 additions & 10 deletions fs/cifs/link.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down

0 comments on commit 31ec35d

Please sign in to comment.