Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

orangefs: free readdir buffer index before the dir_emit loop

We only need it while the service operation is actually in progress
since it is only used to co-ordinate the client-core's memory use. The
kernel allocates its own space.

Also clean up some comments which mislead the reader into thinking
the readdir buffers are shared memory.

Signed-off-by: Martin Brandenburg <martin@omnibond.com>
Signed-off-by: Mike Marshall <hubcap@omnibond.com>

authored by

Martin Brandenburg and committed by
Mike Marshall
ee3b8d37 adcf34a2

+9 -25
+9 -25
fs/orangefs/dir.c
··· 9 9 #include "orangefs-bufmap.h" 10 10 11 11 struct readdir_handle_s { 12 - int buffer_index; 13 12 struct orangefs_readdir_response_s readdir_response; 14 13 void *dents_buf; 15 14 }; ··· 142 143 } 143 144 144 145 static long readdir_handle_ctor(struct readdir_handle_s *rhandle, void *buf, 145 - size_t size, int buffer_index) 146 + size_t size) 146 147 { 147 148 long ret; 148 149 ··· 151 152 ("Invalid NULL buffer specified in readdir_handle_ctor\n"); 152 153 return -ENOMEM; 153 154 } 154 - if (buffer_index < 0) { 155 - gossip_err 156 - ("Invalid buffer index specified in readdir_handle_ctor\n"); 157 - return -EINVAL; 158 - } 159 - rhandle->buffer_index = buffer_index; 160 155 rhandle->dents_buf = buf; 161 156 ret = decode_dirents(buf, size, &rhandle->readdir_response); 162 157 if (ret < 0) { 163 158 gossip_err("Could not decode readdir from buffer %ld\n", ret); 164 - rhandle->buffer_index = -1; 165 159 gossip_debug(GOSSIP_DIR_DEBUG, "vfree %p\n", buf); 166 160 vfree(buf); 167 161 rhandle->dents_buf = NULL; ··· 171 179 kfree(rhandle->readdir_response.dirent_array); 172 180 rhandle->readdir_response.dirent_array = NULL; 173 181 174 - if (rhandle->buffer_index >= 0) { 175 - orangefs_readdir_index_put(rhandle->buffer_index); 176 - rhandle->buffer_index = -1; 177 - } 178 182 if (rhandle->dents_buf) { 179 183 gossip_debug(GOSSIP_DIR_DEBUG, "vfree %p\n", 180 184 rhandle->dents_buf); ··· 224 236 "orangefs_readdir called on %s (pos=%llu)\n", 225 237 dentry->d_name.name, llu(pos)); 226 238 227 - rhandle.buffer_index = -1; 228 239 rhandle.dents_buf = NULL; 229 240 memset(&rhandle.readdir_response, 0, sizeof(rhandle.readdir_response)); 230 241 ··· 231 244 if (!new_op) 232 245 return -ENOMEM; 233 246 247 + /* 248 + * Only the indices are shared. No memory is actually shared, but the 249 + * mechanism is used. 250 + */ 234 251 new_op->uses_shared_memory = 1; 235 252 new_op->upcall.req.readdir.refn = orangefs_inode->refn; 236 253 new_op->upcall.req.readdir.max_dirent_count = ··· 265 274 new_op->downcall.status, 266 275 ret); 267 276 277 + orangefs_readdir_index_put(buffer_index); 278 + 268 279 if (ret == -EAGAIN && op_state_purged(new_op)) { 269 - /* 270 - * readdir shared memory aread has been wiped due to 271 - * pvfs2-client-core restarting, so we must get a new 272 - * index into the shared memory. 273 - */ 280 + /* Client-core indices are invalid after it restarted. */ 274 281 gossip_debug(GOSSIP_DIR_DEBUG, 275 282 "%s: Getting new buffer_index for retry of readdir..\n", 276 283 __func__); 277 - orangefs_readdir_index_put(buffer_index); 278 284 goto get_new_buffer_index; 279 285 } 280 286 281 287 if (ret == -EIO && op_state_purged(new_op)) { 282 288 gossip_err("%s: Client is down. Aborting readdir call.\n", 283 289 __func__); 284 - orangefs_readdir_index_put(buffer_index); 285 290 goto out_free_op; 286 291 } 287 292 ··· 285 298 gossip_debug(GOSSIP_DIR_DEBUG, 286 299 "Readdir request failed. Status:%d\n", 287 300 new_op->downcall.status); 288 - orangefs_readdir_index_put(buffer_index); 289 301 if (ret >= 0) 290 302 ret = new_op->downcall.status; 291 303 goto out_free_op; ··· 293 307 bytes_decoded = 294 308 readdir_handle_ctor(&rhandle, 295 309 new_op->downcall.trailer_buf, 296 - new_op->downcall.trailer_size, 297 - buffer_index); 310 + new_op->downcall.trailer_size); 298 311 if (bytes_decoded < 0) { 299 312 gossip_err("orangefs_readdir: Could not decode trailer buffer into a readdir response %d\n", 300 313 ret); 301 314 ret = bytes_decoded; 302 - orangefs_readdir_index_put(buffer_index); 303 315 goto out_free_op; 304 316 } 305 317