diff options
| author | Steve French <sfrench@us.ibm.com> | 2006-03-03 11:27:25 +0000 | 
|---|---|---|
| committer | Steve French <sfrench@us.ibm.com> | 2006-03-03 11:27:25 +0000 | 
| commit | c6ee60b7c8bbc78e3b1776b2820a7e7f95f8996a (patch) | |
| tree | 99b48ef0f5217fddc0aa897d9e60d95ace7da6ff /fs/9p/fid.c | |
| parent | 13298defe5323c7fdcac268f588d8d1090758fb8 (diff) | |
| parent | c499ec24c31edf270e777a868ffd0daddcfe7ebd (diff) | |
Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
Signed-off-by: Steve French <sfrench@us.ibm.com>
Diffstat (limited to 'fs/9p/fid.c')
| -rw-r--r-- | fs/9p/fid.c | 145 | 
1 files changed, 12 insertions, 133 deletions
diff --git a/fs/9p/fid.c b/fs/9p/fid.c index eda449778fa..c4d13bf904d 100644 --- a/fs/9p/fid.c +++ b/fs/9p/fid.c @@ -1,7 +1,7 @@  /*   * V9FS FID Management   * - *  Copyright (C) 2005 by Eric Van Hensbergen <ericvh@gmail.com> + *  Copyright (C) 2005, 2006 by Eric Van Hensbergen <ericvh@gmail.com>   *   *  This program is free software; you can redistribute it and/or modify   *  it under the terms of the GNU General Public License as published by @@ -40,7 +40,7 @@   *   */ -static int v9fs_fid_insert(struct v9fs_fid *fid, struct dentry *dentry) +int v9fs_fid_insert(struct v9fs_fid *fid, struct dentry *dentry)  {  	struct list_head *fid_list = (struct list_head *)dentry->d_fsdata;  	dprintk(DEBUG_9P, "fid %d (%p) dentry %s (%p)\n", fid->fid, fid, @@ -57,7 +57,6 @@ static int v9fs_fid_insert(struct v9fs_fid *fid, struct dentry *dentry)  	}  	fid->uid = current->uid; -	fid->pid = current->pid;  	list_add(&fid->list, fid_list);  	return 0;  } @@ -68,14 +67,11 @@ static int v9fs_fid_insert(struct v9fs_fid *fid, struct dentry *dentry)   *   */ -struct v9fs_fid *v9fs_fid_create(struct dentry *dentry, -	struct v9fs_session_info *v9ses, int fid, int create) +struct v9fs_fid *v9fs_fid_create(struct v9fs_session_info *v9ses, int fid)  {  	struct v9fs_fid *new; -	dprintk(DEBUG_9P, "fid create dentry %p, fid %d, create %d\n", -		dentry, fid, create); - +	dprintk(DEBUG_9P, "fid create fid %d\n", fid);  	new = kmalloc(sizeof(struct v9fs_fid), GFP_KERNEL);  	if (new == NULL) {  		dprintk(DEBUG_ERROR, "Out of Memory\n"); @@ -85,19 +81,13 @@ struct v9fs_fid *v9fs_fid_create(struct dentry *dentry,  	new->fid = fid;  	new->v9ses = v9ses;  	new->fidopen = 0; -	new->fidcreate = create;  	new->fidclunked = 0;  	new->iounit = 0;  	new->rdir_pos = 0;  	new->rdir_fcall = NULL; +	INIT_LIST_HEAD(&new->list); -	if (v9fs_fid_insert(new, dentry) == 0) -		return new; -	else { -		dprintk(DEBUG_ERROR, "Problems inserting to dentry\n"); -		kfree(new); -		return NULL; -	} +	return new;  }  /** @@ -113,140 +103,29 @@ void v9fs_fid_destroy(struct v9fs_fid *fid)  }  /** - * v9fs_fid_walk_up - walks from the process current directory - * 	up to the specified dentry. - */ -static struct v9fs_fid *v9fs_fid_walk_up(struct dentry *dentry) -{ -	int fidnum, cfidnum, err; -	struct v9fs_fid *cfid; -	struct dentry *cde; -	struct v9fs_session_info *v9ses; - -	v9ses = v9fs_inode2v9ses(current->fs->pwd->d_inode); -	cfid = v9fs_fid_lookup(current->fs->pwd); -	if (cfid == NULL) { -		dprintk(DEBUG_ERROR, "process cwd doesn't have a fid\n"); -		return ERR_PTR(-ENOENT); -	} - -	cfidnum = cfid->fid; -	cde = 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"); -		err = -ENOENT; -		goto clunk_fid; -	} - -	while (cde != dentry) { -		if (cde == cde->d_parent) { -			dprintk(DEBUG_ERROR, "can't find dentry\n"); -			err = -ENOENT; -			goto clunk_fid; -		} - -		err = v9fs_t_walk(v9ses, cfidnum, fidnum, "..", NULL); -		if (err < 0) { -			dprintk(DEBUG_ERROR, "problem walking to parent\n"); -			goto clunk_fid; -		} - -		cfidnum = fidnum; -		cde = cde->d_parent; -	} - -	return v9fs_fid_create(dentry, v9ses, fidnum, 0); - -clunk_fid: -	v9fs_t_clunk(v9ses, fidnum); -	return ERR_PTR(err); -} - -/**   * v9fs_fid_lookup - retrieve the right fid from a  particular dentry   * @dentry: dentry to look for fid in   * @type: intent of lookup (operation or traversal)   * - * search list of fids associated with a dentry for a fid with a matching - * thread id or uid.  If that fails, look up the dentry's parents to see if you - * can find a matching fid. + * find a fid in the dentry + * + * TODO: only match fids that have the same uid as current user   *   */  struct v9fs_fid *v9fs_fid_lookup(struct dentry *dentry)  {  	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;  	dprintk(DEBUG_9P, " dentry: %s (%p)\n", dentry->d_iname, dentry); -	if (fid_list) { -		list_for_each_entry_safe(current_fid, temp, fid_list, list) { -			if (!current_fid->fidcreate) { -				return_fid = current_fid; -				break; -			} -		} - -		if (!return_fid) -			return_fid = current_fid; -	} - -	/* 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 (fid_list) +		return_fid = list_entry(fid_list->next, struct v9fs_fid, list);  	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) { -			return_fid = v9fs_fid_walk_up(dentry); -			if (IS_ERR(return_fid)) -				return_fid = NULL; -		} +		dprintk(DEBUG_ERROR, "Couldn't find a fid in dentry\n");  	}  	return return_fid;  } - -struct v9fs_fid *v9fs_fid_get_created(struct dentry *dentry) -{ -	struct list_head *fid_list; -	struct v9fs_fid *fid, *ftmp, *ret; - -	dprintk(DEBUG_9P, " dentry: %s (%p)\n", dentry->d_iname, dentry); -	fid_list = (struct list_head *)dentry->d_fsdata; -	ret = NULL; -	if (fid_list) { -		list_for_each_entry_safe(fid, ftmp, fid_list, list) { -			if (fid->fidcreate && fid->pid == current->pid) { -				list_del(&fid->list); -				ret = fid; -				break; -			} -		} -	} - -	dprintk(DEBUG_9P, "return %p\n", ret); -	return ret; -}  | 
