Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3abb9272 authored by Steve French's avatar Steve French
Browse files

[CIFS] When file is deleted locally but later recreated on the server


fix cifs negative dentries so they are freed faster (not requiring
umount or readdir e.g.) so the client recognizes the new file on
the server more quickly.

Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent 458af543
Loading
Loading
Loading
Loading
+5 −3
Original line number Original line Diff line number Diff line
Version 1.39
Version 1.39
------------
------------
Defer close of a file handle slightly if pending writes depend on that file handle
Defer close of a file handle slightly if pending writes depend on that handle
(this reduces the EBADF bad file handle errors that can be logged under heavy
(this reduces the EBADF bad file handle errors that can be logged under heavy
stress on writes). Modify cifs Kconfig options to expose CONFIG_CIFS_STATS2 
stress on writes). Modify cifs Kconfig options to expose CONFIG_CIFS_STATS2 
Fix SFU style symlinks and mknod needed for servers which do not support the CIFS
Fix SFU style symlinks and mknod needed for servers which do not support the
Unix Extensions.  Fix setfacl/getfacl on bigendian. 
CIFS Unix Extensions.  Fix setfacl/getfacl on bigendian. Timeout negative
dentries so files that the client sees as deleted but that later get created
on the server will be recognized.


Version 1.38
Version 1.38
------------
------------
+16 −9
Original line number Original line Diff line number Diff line
@@ -465,12 +465,20 @@ cifs_lookup(struct inode *parent_dir_inode, struct dentry *direntry, struct name
			direntry->d_op = &cifs_dentry_ops;
			direntry->d_op = &cifs_dentry_ops;
		d_add(direntry, newInode);
		d_add(direntry, newInode);


		/* since paths are not looked up by component - the parent directories are presumed to be good here */
		/* since paths are not looked up by component - the parent 
		   directories are presumed to be good here */
		renew_parental_timestamps(direntry);
		renew_parental_timestamps(direntry);


	} else if (rc == -ENOENT) {
	} else if (rc == -ENOENT) {
		rc = 0;
		rc = 0;
		direntry->d_time = jiffies;
		if (pTcon->nocase)
			direntry->d_op = &cifs_ci_dentry_ops;
		else
			direntry->d_op = &cifs_dentry_ops;
		d_add(direntry, NULL);
		d_add(direntry, NULL);
	/*	if it was once a directory (but how can we tell?) we could do  
			shrink_dcache_parent(direntry); */
	} else {
	} else {
		cERROR(1,("Error 0x%x on cifs_get_inode_info in lookup of %s",
		cERROR(1,("Error 0x%x on cifs_get_inode_info in lookup of %s",
			   rc,full_path));
			   rc,full_path));
@@ -489,20 +497,19 @@ cifs_d_revalidate(struct dentry *direntry, struct nameidata *nd)
{
{
	int isValid = 1;
	int isValid = 1;


/*	lock_kernel(); *//* surely we do not want to lock the kernel for a whole network round trip which could take seconds */

	if (direntry->d_inode) {
	if (direntry->d_inode) {
		if (cifs_revalidate(direntry)) {
		if (cifs_revalidate(direntry)) {
			/* unlock_kernel(); */
			return 0;
			return 0;
		}
		}
	} else {
	} else {
		cFYI(1,
		cFYI(1, ("neg dentry 0x%p name = %s",
		     ("In cifs_d_revalidate with no inode but name = %s and dentry 0x%p",
			 direntry, direntry->d_name.name));
		      direntry->d_name.name, direntry));
		if(time_after(jiffies, direntry->d_time + HZ) || 
			!lookupCacheEnabled) {
			d_drop(direntry);
			isValid = 0;
		} 
	}
	}

/*    unlock_kernel(); */


	return isValid;
	return isValid;
}
}
+14 −8
Original line number Original line Diff line number Diff line
@@ -1039,16 +1039,22 @@ int cifs_revalidate(struct dentry *direntry)
		filemap_fdatawrite(direntry->d_inode->i_mapping);
		filemap_fdatawrite(direntry->d_inode->i_mapping);
	}
	}
	if (invalidate_inode) {
	if (invalidate_inode) {
	/* shrink_dcache not necessary now that cifs dentry ops
	are exported for negative dentries */
/*		if(S_ISDIR(direntry->d_inode->i_mode)) 
			shrink_dcache_parent(direntry); */
		if (S_ISREG(direntry->d_inode->i_mode)) {
			if (direntry->d_inode->i_mapping)
			if (direntry->d_inode->i_mapping)
				filemap_fdatawait(direntry->d_inode->i_mapping);
				filemap_fdatawait(direntry->d_inode->i_mapping);
			/* may eventually have to do this for open files too */
			/* may eventually have to do this for open files too */
			if (list_empty(&(cifsInode->openFileList))) {
			if (list_empty(&(cifsInode->openFileList))) {
			/* Has changed on server - flush read ahead pages */
				/* changed on server - flush read ahead pages */
				cFYI(1, ("Invalidating read ahead data on "
				cFYI(1, ("Invalidating read ahead data on "
					 "closed file"));
					 "closed file"));
				invalidate_remote_inode(direntry->d_inode);
				invalidate_remote_inode(direntry->d_inode);
			}
			}
		}
		}
	}
/*	up(&direntry->d_inode->i_sem); */
/*	up(&direntry->d_inode->i_sem); */
	
	
	kfree(full_path);
	kfree(full_path);