cifs_sb = CIFS_SB(inode->i_sb); pTcon = cifs_sb->tcon;  
cifs_follow_link(struct dentry *direntry, struct nameidata *nd){	struct inode *inode = direntry->d_inode;	int rc = -EACCES;	int xid;	char *full_path = NULL;	char * target_path = ERR_PTR(-ENOMEM);	struct cifs_sb_info *cifs_sb;	struct cifsTconInfo *pTcon;	xid = GetXid();	cifs_sb = CIFS_SB(inode->i_sb);	pTcon = cifs_sb->tcon;	down(&direntry->d_sb->s_vfs_rename_sem);	full_path = build_path_from_dentry(direntry, cifs_sb);	up(&direntry->d_sb->s_vfs_rename_sem);	if (!full_path)		goto out_no_free;	cFYI(1, ("Full path: %s inode = 0x%p", full_path, inode));	target_path = kmalloc(PATH_MAX, GFP_KERNEL);	if (!target_path) {		target_path = ERR_PTR(-ENOMEM);		goto out;	}/* BB add read reparse point symlink code and Unix extensions symlink code here BB */	if (pTcon->ses->capabilities & CAP_UNIX)		rc = CIFSSMBUnixQuerySymLink(xid, pTcon, full_path,					     target_path,					     PATH_MAX-1,					     cifs_sb->local_nls);	else {		/* rc = CIFSSMBQueryReparseLinkInfo */		/* BB Add code to Query ReparsePoint info */		/* BB Add MAC style xsymlink check here if enabled */	}	if (rc == 0) {/* BB Add special case check for Samba DFS symlinks */		target_path[PATH_MAX-1] = 0;	} else {		kfree(target_path);		target_path = ERR_PTR(rc);	}out:	kfree(full_path);out_no_free:	FreeXid(xid);	nd_set_link(nd, target_path);	return NULL;	/* No cookie */}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/7f57356b70dda014ef269135942426e4a852023e/link.c/buggy/fs/cifs/link.c