newfid = v9fs_fid_lookup(dentry, FID_OP);
newfid = v9fs_fid_lookup(dentry);
v9fs_vfs_link(struct dentry *old_dentry, struct inode *dir,	      struct dentry *dentry){	int retval = -EPERM;	struct v9fs_session_info *v9ses = v9fs_inode2v9ses(dir);	struct v9fs_fcall *fcall = NULL;	struct v9fs_stat *mistat = kmalloc(v9ses->maxdata, GFP_KERNEL);	struct v9fs_fid *oldfid = v9fs_fid_lookup(old_dentry, FID_OP);	struct v9fs_fid *newfid = NULL;	char *symname = __getname();	dprintk(DEBUG_VFS, " %lu,%s,%s\n", dir->i_ino, dentry->d_name.name,		old_dentry->d_name.name);	if (!v9ses->extended) {		dprintk(DEBUG_ERROR, "not extended\n");		goto FreeMem;	}	/* get fid of old_dentry */	sprintf(symname, "hardlink(%d)\n", oldfid->fid);	/* issue a create */	retval = v9fs_create(dir, dentry, V9FS_DMLINK, 0);	if (retval != 0)		goto FreeMem;	newfid = v9fs_fid_lookup(dentry, FID_OP);	if (!newfid) {		dprintk(DEBUG_ERROR, "couldn't resolve fid from dentry\n");		goto FreeMem;	}	/* issue a twstat */	v9fs_blank_mistat(v9ses, mistat);	strcpy(mistat->data + 1, symname);	mistat->extension = mistat->data + 1;	retval = v9fs_t_wstat(v9ses, newfid->fid, mistat, &fcall);	if (retval < 0) {		dprintk(DEBUG_ERROR, "v9fs_t_wstat error: %s\n",			FCALL_ERROR(fcall));		goto FreeMem;	}	kfree(fcall);	if (v9fs_t_clunk(v9ses, newfid->fid, &fcall)) {		dprintk(DEBUG_ERROR, "clunk for symlink failed: %s\n",			FCALL_ERROR(fcall));		goto FreeMem;	}	d_drop(dentry);		/* FID - will this also clunk? */	kfree(fcall);	fcall = NULL;      FreeMem:	kfree(mistat);	kfree(fcall);	putname(symname);	return retval;}