/* we need to fid_lookup the starting point */ int fidnum = -1; int oldfid = -1; int result = -1; struct v9fs_session_info *v9ses = v9fs_inode2v9ses(current->fs->pwd->d_inode);  current_fid = v9fs_fid_lookup(current->fs->pwd, FID_WALK); if (current_fid == NULL) { dprintk(DEBUG_ERROR, "process cwd doesn't have a fid\n"); return return_fid; } oldfid = current_fid->fid; par = current->fs->pwd; /* TODO: take advantage of multiwalk */  fidnum = v9fs_get_idpool(&v9ses->fidpool); if (fidnum < 0) { dprintk(DEBUG_ERROR, "could not get a new fid num\n"); return return_fid; }  while (par != dentry) { result = v9fs_t_walk(v9ses, oldfid, fidnum, "..", NULL); if (result < 0) { dprintk(DEBUG_ERROR, "problem walking to parent\n");  break; } oldfid = fidnum; if (par == par->d_parent) { dprintk(DEBUG_ERROR, "can't find dentry\n"); break; } par = par->d_parent; } if (par == dentry) { return_fid = v9fs_fid_create(dentry); return_fid->fid = fidnum; } 
return_fid = v9fs_fid_walk_up(dentry); if (IS_ERR(return_fid)) return_fid = NULL; 
struct v9fs_fid *v9fs_fid_lookup(struct dentry *dentry, int type){	struct list_head *fid_list = (struct list_head *)dentry->d_fsdata;	struct v9fs_fid *current_fid = NULL;	struct v9fs_fid *temp = NULL;	struct v9fs_fid *return_fid = NULL;	int found_parent = 0;	int found_user = 0;	dprintk(DEBUG_9P, " dentry: %s (%p) type %d\n", dentry->d_iname, dentry,		type);	if (fid_list && !list_empty(fid_list)) {		list_for_each_entry_safe(current_fid, temp, fid_list, list) {			if (current_fid->uid == current->uid) {				if (return_fid == NULL) {					if ((type == FID_OP)					    || (!current_fid->fidopen)) {						return_fid = current_fid;						found_user = 1;					}				}			}			if (current_fid->pid == current->real_parent->pid) {				if ((return_fid == NULL) || (found_parent)				    || (found_user)) {					if ((type == FID_OP)					    || (!current_fid->fidopen)) {						return_fid = current_fid;						found_parent = 1;						found_user = 0;					}				}			}			if (current_fid->pid == current->pid) {				if ((type == FID_OP) ||				    (!current_fid->fidopen)) {					return_fid = current_fid;					found_parent = 0;					found_user = 0;				}			}		}	}	/* we are at the root but didn't match */	if ((!return_fid) && (dentry->d_parent == dentry)) {		/* TODO: clone attach with new uid */		return_fid = current_fid;	}	if (!return_fid) {		struct dentry *par = current->fs->pwd->d_parent;		int count = 1;		while (par != NULL) {			if (par == dentry)				break;			count++;			if (par == par->d_parent) {				dprintk(DEBUG_ERROR,					"got to root without finding dentry\n");				break;			}			par = par->d_parent;		}/* XXX - there may be some duplication we can get rid of */		if (par == dentry) {			/* we need to fid_lookup the starting point */			int fidnum = -1;			int oldfid = -1;			int result = -1;			struct v9fs_session_info *v9ses =			    v9fs_inode2v9ses(current->fs->pwd->d_inode);			current_fid =			    v9fs_fid_lookup(current->fs->pwd, FID_WALK);			if (current_fid == NULL) {				dprintk(DEBUG_ERROR,					"process cwd doesn't have a fid\n");				return return_fid;			}			oldfid = current_fid->fid;			par = current->fs->pwd;			/* TODO: take advantage of multiwalk */			fidnum = v9fs_get_idpool(&v9ses->fidpool);			if (fidnum < 0) {				dprintk(DEBUG_ERROR,					"could not get a new fid num\n");				return return_fid;			}			while (par != dentry) {				result =				    v9fs_t_walk(v9ses, oldfid, fidnum, "..",						NULL);				if (result < 0) {					dprintk(DEBUG_ERROR,						"problem walking to parent\n");					break;				}				oldfid = fidnum;				if (par == par->d_parent) {					dprintk(DEBUG_ERROR,						"can't find dentry\n");					break;				}				par = par->d_parent;			}			if (par == dentry) {				return_fid = v9fs_fid_create(dentry);				return_fid->fid = fidnum;			}		}	}	return return_fid;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/0b8dd17762194ec77066d339e0b2866b0c66b715/fid.c/buggy/fs/9p/fid.c