X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fcifs%2Flink.c;fp=fs%2Fcifs%2Flink.c;h=0f99aae33162fbd68f5e08a32713db3055a418cf;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=a57f5d6e6213d6f23e693c88a98c3d539eb4ae6a;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/fs/cifs/link.c b/fs/cifs/link.c index a57f5d6e6..0f99aae33 100644 --- a/fs/cifs/link.c +++ b/fs/cifs/link.c @@ -48,8 +48,10 @@ 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) */ + down(&inode->i_sb->s_vfs_rename_sem); fromName = build_path_from_dentry(old_file); toName = build_path_from_dentry(direntry); + up(&inode->i_sb->s_vfs_rename_sem); if((fromName == NULL) || (toName == NULL)) { rc = -ENOMEM; goto cifs_hl_exit; @@ -65,7 +67,7 @@ cifs_hardlink(struct dentry *old_file, struct inode *inode, cifs_sb_target->local_nls, cifs_sb_target->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); - if((rc == -EIO) || (rc == -EINVAL)) + if(rc == -EIO) rc = -EOPNOTSUPP; } @@ -101,7 +103,9 @@ cifs_follow_link(struct dentry *direntry, struct nameidata *nd) xid = GetXid(); + down(&direntry->d_sb->s_vfs_rename_sem); full_path = build_path_from_dentry(direntry); + up(&direntry->d_sb->s_vfs_rename_sem); if (!full_path) goto out_no_free; @@ -160,14 +164,16 @@ cifs_symlink(struct inode *inode, struct dentry *direntry, const char *symname) cifs_sb = CIFS_SB(inode->i_sb); pTcon = cifs_sb->tcon; + down(&inode->i_sb->s_vfs_rename_sem); full_path = build_path_from_dentry(direntry); + up(&inode->i_sb->s_vfs_rename_sem); if(full_path == NULL) { FreeXid(xid); return -ENOMEM; } - cFYI(1, ("Full path: %s", full_path)); + cFYI(1, ("Full path: %s ", full_path)); cFYI(1, ("symname is %s", symname)); /* BB what if DFS and this volume is on different share? BB */ @@ -186,7 +192,8 @@ cifs_symlink(struct inode *inode, struct dentry *direntry, const char *symname) inode->i_sb,xid); if (rc != 0) { - cFYI(1, ("Create symlink ok, getinodeinfo fail rc = %d", + cFYI(1, + ("Create symlink worked but get_inode_info failed with rc = %d ", rc)); } else { if (pTcon->nocase) @@ -225,9 +232,9 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen) /* BB would it be safe against deadlock to grab this sem even though rename itself grabs the sem and calls lookup? */ -/* mutex_lock(&inode->i_sb->s_vfs_rename_mutex);*/ +/* down(&inode->i_sb->s_vfs_rename_sem);*/ full_path = build_path_from_dentry(direntry); -/* mutex_unlock(&inode->i_sb->s_vfs_rename_mutex);*/ +/* up(&inode->i_sb->s_vfs_rename_sem);*/ if(full_path == NULL) { FreeXid(xid); @@ -288,7 +295,7 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen) else { cFYI(1,("num referral: %d",num_referrals)); if(referrals) { - cFYI(1,("referral string: %s",referrals)); + cFYI(1,("referral string: %s ",referrals)); strncpy(tmpbuffer, referrals, len-1); } }