summaryrefslogtreecommitdiff
path: root/net/9p/client.c
diff options
context:
space:
mode:
authorEric Van Hensbergen <ericvh@gmail.com>2008-10-13 20:36:15 -0500
committerEric Van Hensbergen <ericvh@gmail.com>2008-10-17 11:04:43 -0500
commit06b55b464ee5b305aca75cb7d9424b184bf07f68 (patch)
treefb2bba4546ad4b800f1e49a75774b01fc6fcdb6b /net/9p/client.c
parentdfb0ec2e13a906ff19a0bbfa9208caab50cfc2e3 (diff)
9p: move dirread to fs layer
Currently reading a directory is implemented in the client code. This function is not actually a wire operation, but a meta operation which calls read operations and processes the results. This patch moves this functionality to the fs layer and calls component wire operations instead of constructing their packets. This provides a cleaner separation and will help when we reorganize the client functions and protocol processing methods. Signed-off-by: Eric Van Hensbergen <ericvh@gmail.com>
Diffstat (limited to 'net/9p/client.c')
-rw-r--r--net/9p/client.c103
1 files changed, 0 insertions, 103 deletions
diff --git a/net/9p/client.c b/net/9p/client.c
index d5ea042eabb0..90ee9efeede3 100644
--- a/net/9p/client.c
+++ b/net/9p/client.c
@@ -559,8 +559,6 @@ static struct p9_fid *p9_fid_create(struct p9_client *clnt)
memset(&fid->qid, 0, sizeof(struct p9_qid));
fid->mode = -1;
fid->rdir_fpos = 0;
- fid->rdir_pos = 0;
- fid->rdir_fcall = NULL;
fid->uid = current->fsuid;
fid->clnt = clnt;
fid->aux = NULL;
@@ -586,7 +584,6 @@ static void p9_fid_destroy(struct p9_fid *fid)
spin_lock(&clnt->lock);
list_del(&fid->flist);
spin_unlock(&clnt->lock);
- kfree(fid->rdir_fcall);
kfree(fid);
}
@@ -1261,103 +1258,3 @@ done:
return err;
}
EXPORT_SYMBOL(p9_client_wstat);
-
-struct p9_stat *p9_client_dirread(struct p9_fid *fid, u64 offset)
-{
- int err, n, m;
- struct p9_fcall *tc, *rc;
- struct p9_client *clnt;
- struct p9_stat st, *ret;
-
- P9_DPRINTK(P9_DEBUG_9P, "fid %d offset %llu\n", fid->fid,
- (long long unsigned) offset);
- err = 0;
- tc = NULL;
- rc = NULL;
- ret = NULL;
- clnt = fid->clnt;
-
- /* if the offset is below or above the current response, free it */
- if (offset < fid->rdir_fpos || (fid->rdir_fcall &&
- offset >= fid->rdir_fpos+fid->rdir_fcall->params.rread.count)) {
- fid->rdir_pos = 0;
- if (fid->rdir_fcall)
- fid->rdir_fpos += fid->rdir_fcall->params.rread.count;
-
- kfree(fid->rdir_fcall);
- fid->rdir_fcall = NULL;
- if (offset < fid->rdir_fpos)
- fid->rdir_fpos = 0;
- }
-
- if (!fid->rdir_fcall) {
- n = fid->iounit;
- if (!n || n > clnt->msize-P9_IOHDRSZ)
- n = clnt->msize - P9_IOHDRSZ;
-
- while (1) {
- if (fid->rdir_fcall) {
- fid->rdir_fpos +=
- fid->rdir_fcall->params.rread.count;
- kfree(fid->rdir_fcall);
- fid->rdir_fcall = NULL;
- }
-
- tc = p9_create_tread(fid->fid, fid->rdir_fpos, n);
- if (IS_ERR(tc)) {
- err = PTR_ERR(tc);
- tc = NULL;
- goto error;
- }
-
- err = p9_client_rpc(clnt, tc, &rc);
- if (err)
- goto error;
-
- n = rc->params.rread.count;
- if (n == 0)
- goto done;
-
- fid->rdir_fcall = rc;
- rc = NULL;
- if (offset >= fid->rdir_fpos &&
- offset < fid->rdir_fpos+n)
- break;
- }
-
- fid->rdir_pos = 0;
- }
-
- m = offset - fid->rdir_fpos;
- if (m < 0)
- goto done;
-
- n = p9_deserialize_stat(fid->rdir_fcall->params.rread.data + m,
- fid->rdir_fcall->params.rread.count - m, &st, clnt->dotu);
-
- if (!n) {
- err = -EIO;
- goto error;
- }
-
- fid->rdir_pos += n;
- st.size = n;
- ret = p9_clone_stat(&st, clnt->dotu);
- if (IS_ERR(ret)) {
- err = PTR_ERR(ret);
- ret = NULL;
- goto error;
- }
-
-done:
- kfree(tc);
- kfree(rc);
- return ret;
-
-error:
- kfree(tc);
- kfree(rc);
- kfree(ret);
- return ERR_PTR(err);
-}
-EXPORT_SYMBOL(p9_client_dirread);