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 | ||
