diff options
Diffstat (limited to 'fs/9p/vfs_dir.c')
-rw-r--r-- | fs/9p/vfs_dir.c | 47 |
1 files changed, 19 insertions, 28 deletions
diff --git a/fs/9p/vfs_dir.c b/fs/9p/vfs_dir.c index 57a43b8feef5..ae6d032b9b59 100644 --- a/fs/9p/vfs_dir.c +++ b/fs/9p/vfs_dir.c | |||
@@ -37,8 +37,8 @@ | |||
37 | #include "debug.h" | 37 | #include "debug.h" |
38 | #include "v9fs.h" | 38 | #include "v9fs.h" |
39 | #include "9p.h" | 39 | #include "9p.h" |
40 | #include "v9fs_vfs.h" | ||
41 | #include "conv.h" | 40 | #include "conv.h" |
41 | #include "v9fs_vfs.h" | ||
42 | #include "fid.h" | 42 | #include "fid.h" |
43 | 43 | ||
44 | /** | 44 | /** |
@@ -74,20 +74,16 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
74 | struct inode *inode = filp->f_dentry->d_inode; | 74 | struct inode *inode = filp->f_dentry->d_inode; |
75 | struct v9fs_session_info *v9ses = v9fs_inode2v9ses(inode); | 75 | struct v9fs_session_info *v9ses = v9fs_inode2v9ses(inode); |
76 | struct v9fs_fid *file = filp->private_data; | 76 | struct v9fs_fid *file = filp->private_data; |
77 | unsigned int i, n; | 77 | unsigned int i, n, s; |
78 | int fid = -1; | 78 | int fid = -1; |
79 | int ret = 0; | 79 | int ret = 0; |
80 | struct v9fs_stat *mi = NULL; | 80 | struct v9fs_stat stat; |
81 | int over = 0; | 81 | int over = 0; |
82 | 82 | ||
83 | dprintk(DEBUG_VFS, "name %s\n", filp->f_dentry->d_name.name); | 83 | dprintk(DEBUG_VFS, "name %s\n", filp->f_dentry->d_name.name); |
84 | 84 | ||
85 | fid = file->fid; | 85 | fid = file->fid; |
86 | 86 | ||
87 | mi = kmalloc(v9ses->maxdata, GFP_KERNEL); | ||
88 | if (!mi) | ||
89 | return -ENOMEM; | ||
90 | |||
91 | if (file->rdir_fcall && (filp->f_pos != file->rdir_pos)) { | 87 | if (file->rdir_fcall && (filp->f_pos != file->rdir_pos)) { |
92 | kfree(file->rdir_fcall); | 88 | kfree(file->rdir_fcall); |
93 | file->rdir_fcall = NULL; | 89 | file->rdir_fcall = NULL; |
@@ -97,20 +93,20 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
97 | n = file->rdir_fcall->params.rread.count; | 93 | n = file->rdir_fcall->params.rread.count; |
98 | i = file->rdir_fpos; | 94 | i = file->rdir_fpos; |
99 | while (i < n) { | 95 | while (i < n) { |
100 | int s = v9fs_deserialize_stat(v9ses, | 96 | s = v9fs_deserialize_stat( |
101 | file->rdir_fcall->params.rread.data + i, | 97 | file->rdir_fcall->params.rread.data + i, |
102 | n - i, mi, v9ses->maxdata); | 98 | n - i, &stat, v9ses->extended); |
103 | 99 | ||
104 | if (s == 0) { | 100 | if (s == 0) { |
105 | dprintk(DEBUG_ERROR, | 101 | dprintk(DEBUG_ERROR, |
106 | "error while deserializing mistat\n"); | 102 | "error while deserializing stat\n"); |
107 | ret = -EIO; | 103 | ret = -EIO; |
108 | goto FreeStructs; | 104 | goto FreeStructs; |
109 | } | 105 | } |
110 | 106 | ||
111 | over = filldir(dirent, mi->name, strlen(mi->name), | 107 | over = filldir(dirent, stat.name.str, stat.name.len, |
112 | filp->f_pos, v9fs_qid2ino(&mi->qid), | 108 | filp->f_pos, v9fs_qid2ino(&stat.qid), |
113 | dt_type(mi)); | 109 | dt_type(&stat)); |
114 | 110 | ||
115 | if (over) { | 111 | if (over) { |
116 | file->rdir_fpos = i; | 112 | file->rdir_fpos = i; |
@@ -130,7 +126,7 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
130 | 126 | ||
131 | while (!over) { | 127 | while (!over) { |
132 | ret = v9fs_t_read(v9ses, fid, filp->f_pos, | 128 | ret = v9fs_t_read(v9ses, fid, filp->f_pos, |
133 | v9ses->maxdata-V9FS_IOHDRSZ, &fcall); | 129 | v9ses->maxdata-V9FS_IOHDRSZ, &fcall); |
134 | if (ret < 0) { | 130 | if (ret < 0) { |
135 | dprintk(DEBUG_ERROR, "error while reading: %d: %p\n", | 131 | dprintk(DEBUG_ERROR, "error while reading: %d: %p\n", |
136 | ret, fcall); | 132 | ret, fcall); |
@@ -141,19 +137,18 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
141 | n = ret; | 137 | n = ret; |
142 | i = 0; | 138 | i = 0; |
143 | while (i < n) { | 139 | while (i < n) { |
144 | int s = v9fs_deserialize_stat(v9ses, | 140 | s = v9fs_deserialize_stat(fcall->params.rread.data + i, |
145 | fcall->params.rread.data + i, n - i, mi, | 141 | n - i, &stat, v9ses->extended); |
146 | v9ses->maxdata); | ||
147 | 142 | ||
148 | if (s == 0) { | 143 | if (s == 0) { |
149 | dprintk(DEBUG_ERROR, | 144 | dprintk(DEBUG_ERROR, |
150 | "error while deserializing mistat\n"); | 145 | "error while deserializing stat\n"); |
151 | return -EIO; | 146 | return -EIO; |
152 | } | 147 | } |
153 | 148 | ||
154 | over = filldir(dirent, mi->name, strlen(mi->name), | 149 | over = filldir(dirent, stat.name.str, stat.name.len, |
155 | filp->f_pos, v9fs_qid2ino(&mi->qid), | 150 | filp->f_pos, v9fs_qid2ino(&stat.qid), |
156 | dt_type(mi)); | 151 | dt_type(&stat)); |
157 | 152 | ||
158 | if (over) { | 153 | if (over) { |
159 | file->rdir_fcall = fcall; | 154 | file->rdir_fcall = fcall; |
@@ -172,7 +167,6 @@ static int v9fs_dir_readdir(struct file *filp, void *dirent, filldir_t filldir) | |||
172 | 167 | ||
173 | FreeStructs: | 168 | FreeStructs: |
174 | kfree(fcall); | 169 | kfree(fcall); |
175 | kfree(mi); | ||
176 | return ret; | 170 | return ret; |
177 | } | 171 | } |
178 | 172 | ||
@@ -193,18 +187,15 @@ int v9fs_dir_release(struct inode *inode, struct file *filp) | |||
193 | fid->fid); | 187 | fid->fid); |
194 | fidnum = fid->fid; | 188 | fidnum = fid->fid; |
195 | 189 | ||
196 | filemap_fdatawrite(inode->i_mapping); | 190 | filemap_write_and_wait(inode->i_mapping); |
197 | filemap_fdatawait(inode->i_mapping); | ||
198 | 191 | ||
199 | if (fidnum >= 0) { | 192 | if (fidnum >= 0) { |
200 | dprintk(DEBUG_VFS, "fidopen: %d v9f->fid: %d\n", fid->fidopen, | 193 | dprintk(DEBUG_VFS, "fidopen: %d v9f->fid: %d\n", fid->fidopen, |
201 | fid->fid); | 194 | fid->fid); |
202 | 195 | ||
203 | if (v9fs_t_clunk(v9ses, fidnum, NULL)) | 196 | if (v9fs_t_clunk(v9ses, fidnum)) |
204 | dprintk(DEBUG_ERROR, "clunk failed\n"); | 197 | dprintk(DEBUG_ERROR, "clunk failed\n"); |
205 | 198 | ||
206 | v9fs_put_idpool(fid->fid, &v9ses->fidpool); | ||
207 | |||
208 | kfree(fid->rdir_fcall); | 199 | kfree(fid->rdir_fcall); |
209 | kfree(fid); | 200 | kfree(fid); |
210 | 201 | ||