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

Commit 0bd4fa97 authored by Steve French's avatar Steve French
Browse files

[CIFS] [CIFS] Do not take rename sem on most path based calls (during


building of full path) to avoid hang rename/readdir hang

Reported by Alan Tyson

Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent f4ffaa45
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -139,9 +139,7 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
	cifs_sb = CIFS_SB(inode->i_sb);
	pTcon = cifs_sb->tcon;

	mutex_lock(&direntry->d_sb->s_vfs_rename_mutex);
	full_path = build_path_from_dentry(direntry);
	mutex_unlock(&direntry->d_sb->s_vfs_rename_mutex);
	if(full_path == NULL) {
		FreeXid(xid);
		return -ENOMEM;
@@ -316,9 +314,7 @@ int cifs_mknod(struct inode *inode, struct dentry *direntry, int mode,
	cifs_sb = CIFS_SB(inode->i_sb);
	pTcon = cifs_sb->tcon;

	mutex_lock(&direntry->d_sb->s_vfs_rename_mutex);
	full_path = build_path_from_dentry(direntry);
	mutex_unlock(&direntry->d_sb->s_vfs_rename_mutex);
	if(full_path == NULL)
		rc = -ENOMEM;
	else if (pTcon->ses->capabilities & CAP_UNIX) {
+0 −2
Original line number Diff line number Diff line
@@ -86,9 +86,7 @@ int cifs_dir_notify(struct file * file, unsigned long arg)
	cifs_sb = CIFS_SB(file->f_dentry->d_sb);
	pTcon = cifs_sb->tcon;

	mutex_lock(&file->f_dentry->d_sb->s_vfs_rename_mutex);
	full_path = build_path_from_dentry(file->f_dentry);
	mutex_unlock(&file->f_dentry->d_sb->s_vfs_rename_mutex);

	if(full_path == NULL) {
		rc = -ENOMEM;
+0 −2
Original line number Diff line number Diff line
@@ -203,9 +203,7 @@ int cifs_open(struct inode *inode, struct file *file)
		}
	}

	mutex_lock(&inode->i_sb->s_vfs_rename_mutex);
	full_path = build_path_from_dentry(file->f_dentry);
	mutex_unlock(&inode->i_sb->s_vfs_rename_mutex);
	if (full_path == NULL) {
		FreeXid(xid);
		return -ENOMEM;
+0 −6
Original line number Diff line number Diff line
@@ -722,9 +722,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
	cifs_sb = CIFS_SB(inode->i_sb);
	pTcon = cifs_sb->tcon;

	mutex_lock(&inode->i_sb->s_vfs_rename_mutex);
	full_path = build_path_from_dentry(direntry);
	mutex_unlock(&inode->i_sb->s_vfs_rename_mutex);
	if (full_path == NULL) {
		FreeXid(xid);
		return -ENOMEM;
@@ -807,9 +805,7 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry)
	cifs_sb = CIFS_SB(inode->i_sb);
	pTcon = cifs_sb->tcon;

	mutex_lock(&inode->i_sb->s_vfs_rename_mutex);
	full_path = build_path_from_dentry(direntry);
	mutex_unlock(&inode->i_sb->s_vfs_rename_mutex);
	if (full_path == NULL) {
		FreeXid(xid);
		return -ENOMEM;
@@ -1141,9 +1137,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
			rc = 0;
	}
		
	mutex_lock(&direntry->d_sb->s_vfs_rename_mutex);
	full_path = build_path_from_dentry(direntry);
	mutex_unlock(&direntry->d_sb->s_vfs_rename_mutex);
	if (full_path == NULL) {
		FreeXid(xid);
		return -ENOMEM;
+0 −6
Original line number Diff line number Diff line
@@ -48,10 +48,8 @@ cifs_hardlink(struct dentry *old_file, struct inode *inode,
/* No need to check for cross device links since server will do that
   BB note DFS case in future though (when we may have to check) */

	mutex_lock(&inode->i_sb->s_vfs_rename_mutex);
	fromName = build_path_from_dentry(old_file);
	toName = build_path_from_dentry(direntry);
	mutex_unlock(&inode->i_sb->s_vfs_rename_mutex);
	if((fromName == NULL) || (toName == NULL)) {
		rc = -ENOMEM;
		goto cifs_hl_exit;
@@ -103,9 +101,7 @@ cifs_follow_link(struct dentry *direntry, struct nameidata *nd)

	xid = GetXid();

	mutex_lock(&direntry->d_sb->s_vfs_rename_mutex);
	full_path = build_path_from_dentry(direntry);
	mutex_unlock(&direntry->d_sb->s_vfs_rename_mutex);

	if (!full_path)
		goto out_no_free;
@@ -164,9 +160,7 @@ cifs_symlink(struct inode *inode, struct dentry *direntry, const char *symname)
	cifs_sb = CIFS_SB(inode->i_sb);
	pTcon = cifs_sb->tcon;

	mutex_lock(&inode->i_sb->s_vfs_rename_mutex);
	full_path = build_path_from_dentry(direntry);
	mutex_unlock(&inode->i_sb->s_vfs_rename_mutex);

	if(full_path == NULL) {
		FreeXid(xid);
Loading