dir.c (82f2e5472e2304e531c2fa85e457f4a71070044e) | dir.c (4a201d6e3f4253f918555cc7c27c418f8ac1bb65) |
---|---|
1/* 2 * linux/fs/nfs/dir.c 3 * 4 * Copyright (C) 1992 Rick Sladkey 5 * 6 * nfs directory handling functions 7 * 8 * 10 Apr 1996 Added silly rename for unlink --okir --- 211 unchanged lines hidden (view full) --- 220} 221 222/* 223 * the caller is responsible for freeing qstr.name 224 * when called by nfs_readdir_add_to_array, the strings will be freed in 225 * nfs_clear_readdir_array() 226 */ 227static | 1/* 2 * linux/fs/nfs/dir.c 3 * 4 * Copyright (C) 1992 Rick Sladkey 5 * 6 * nfs directory handling functions 7 * 8 * 10 Apr 1996 Added silly rename for unlink --okir --- 211 unchanged lines hidden (view full) --- 220} 221 222/* 223 * the caller is responsible for freeing qstr.name 224 * when called by nfs_readdir_add_to_array, the strings will be freed in 225 * nfs_clear_readdir_array() 226 */ 227static |
228void nfs_readdir_make_qstr(struct qstr *string, const char *name, unsigned int len) | 228int nfs_readdir_make_qstr(struct qstr *string, const char *name, unsigned int len) |
229{ 230 string->len = len; 231 string->name = kmemdup(name, len, GFP_KERNEL); | 229{ 230 string->len = len; 231 string->name = kmemdup(name, len, GFP_KERNEL); |
232 string->hash = full_name_hash(string->name, string->len); | 232 if (string->name == NULL) 233 return -ENOMEM; 234 string->hash = full_name_hash(name, len); 235 return 0; |
233} 234 235static 236int nfs_readdir_add_to_array(struct nfs_entry *entry, struct page *page) 237{ 238 struct nfs_cache_array *array = nfs_readdir_get_array(page); | 236} 237 238static 239int nfs_readdir_add_to_array(struct nfs_entry *entry, struct page *page) 240{ 241 struct nfs_cache_array *array = nfs_readdir_get_array(page); |
242 struct nfs_cache_array_entry *cache_entry; 243 int ret; 244 |
|
239 if (IS_ERR(array)) 240 return PTR_ERR(array); | 245 if (IS_ERR(array)) 246 return PTR_ERR(array); |
241 if (array->size >= MAX_READDIR_ARRAY) { 242 nfs_readdir_release_array(page); 243 return -EIO; 244 } | 247 ret = -EIO; 248 if (array->size >= MAX_READDIR_ARRAY) 249 goto out; |
245 | 250 |
246 array->array[array->size].cookie = entry->prev_cookie; | 251 cache_entry = &array->array[array->size]; 252 cache_entry->cookie = entry->prev_cookie; 253 cache_entry->ino = entry->ino; 254 ret = nfs_readdir_make_qstr(&cache_entry->string, entry->name, entry->len); 255 if (ret) 256 goto out; |
247 array->last_cookie = entry->cookie; | 257 array->last_cookie = entry->cookie; |
248 array->array[array->size].ino = entry->ino; 249 nfs_readdir_make_qstr(&array->array[array->size].string, entry->name, entry->len); | |
250 if (entry->eof == 1) 251 array->eof_index = array->size; 252 array->size++; | 258 if (entry->eof == 1) 259 array->eof_index = array->size; 260 array->size++; |
261out: |
|
253 nfs_readdir_release_array(page); | 262 nfs_readdir_release_array(page); |
254 return 0; | 263 return ret; |
255} 256 257static 258int nfs_readdir_search_for_pos(struct nfs_cache_array *array, nfs_readdir_descriptor_t *desc) 259{ 260 loff_t diff = desc->file->f_pos - desc->current_index; 261 unsigned int index; 262 --- 120 unchanged lines hidden (view full) --- 383 return 1; 384different: 385 return 0; 386} 387 388static 389void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry) 390{ | 264} 265 266static 267int nfs_readdir_search_for_pos(struct nfs_cache_array *array, nfs_readdir_descriptor_t *desc) 268{ 269 loff_t diff = desc->file->f_pos - desc->current_index; 270 unsigned int index; 271 --- 120 unchanged lines hidden (view full) --- 392 return 1; 393different: 394 return 0; 395} 396 397static 398void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry) 399{ |
391 struct qstr filename; 392 struct dentry *dentry = NULL; 393 struct dentry *alias = NULL; | 400 struct qstr filename = { 401 .len = entry->len, 402 .name = entry->name, 403 }; 404 struct dentry *dentry; 405 struct dentry *alias; |
394 struct inode *dir = parent->d_inode; 395 struct inode *inode; 396 | 406 struct inode *dir = parent->d_inode; 407 struct inode *inode; 408 |
397 nfs_readdir_make_qstr(&filename, entry->name, entry->len); 398 if (filename.len == 1 && filename.name[0] == '.') 399 dentry = dget(parent); 400 else if (filename.len == 2 && filename.name[0] == '.' 401 && filename.name[1] == '.') 402 dentry = dget_parent(parent); 403 else 404 dentry = d_lookup(parent, &filename); | 409 if (filename.name[0] == '.') { 410 if (filename.len == 1) 411 return; 412 if (filename.len == 2 && filename.name[1] == '.') 413 return; 414 } 415 filename.hash = full_name_hash(filename.name, filename.len); |
405 | 416 |
417 dentry = d_lookup(parent, &filename); |
|
406 if (dentry != NULL) { 407 if (nfs_same_file(dentry, entry)) { 408 nfs_refresh_inode(dentry->d_inode, entry->fattr); 409 goto out; 410 } else { 411 d_drop(dentry); 412 dput(dentry); 413 } 414 } 415 416 dentry = d_alloc(parent, &filename); | 418 if (dentry != NULL) { 419 if (nfs_same_file(dentry, entry)) { 420 nfs_refresh_inode(dentry->d_inode, entry->fattr); 421 goto out; 422 } else { 423 d_drop(dentry); 424 dput(dentry); 425 } 426 } 427 428 dentry = d_alloc(parent, &filename); |
429 if (dentry == NULL) 430 return; 431 |
|
417 dentry->d_op = NFS_PROTO(dir)->dentry_ops; 418 inode = nfs_fhget(dentry->d_sb, entry->fh, entry->fattr); 419 if (IS_ERR(inode)) 420 goto out; 421 422 alias = d_materialise_unique(dentry, inode); 423 if (IS_ERR(alias)) 424 goto out; 425 else if (alias) { 426 nfs_set_verifier(alias, nfs_save_change_attribute(dir)); 427 dput(alias); 428 } else 429 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 430 431out: 432 dput(dentry); | 432 dentry->d_op = NFS_PROTO(dir)->dentry_ops; 433 inode = nfs_fhget(dentry->d_sb, entry->fh, entry->fattr); 434 if (IS_ERR(inode)) 435 goto out; 436 437 alias = d_materialise_unique(dentry, inode); 438 if (IS_ERR(alias)) 439 goto out; 440 else if (alias) { 441 nfs_set_verifier(alias, nfs_save_change_attribute(dir)); 442 dput(alias); 443 } else 444 nfs_set_verifier(dentry, nfs_save_change_attribute(dir)); 445 446out: 447 dput(dentry); |
433 kfree(filename.name); 434 return; | |
435} 436 437/* Perform conversion from xdr to cache array */ 438static 439void nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *entry, 440 void *xdr_page, struct page *page, unsigned int buflen) 441{ 442 struct xdr_stream stream; --- 60 unchanged lines hidden (view full) --- 503 504 for (i = 0; i < npages; i++) { 505 struct page *page = alloc_page(GFP_KERNEL); 506 if (page == NULL) 507 goto out_freepages; 508 pages[i] = page; 509 } 510 | 448} 449 450/* Perform conversion from xdr to cache array */ 451static 452void nfs_readdir_page_filler(nfs_readdir_descriptor_t *desc, struct nfs_entry *entry, 453 void *xdr_page, struct page *page, unsigned int buflen) 454{ 455 struct xdr_stream stream; --- 60 unchanged lines hidden (view full) --- 516 517 for (i = 0; i < npages; i++) { 518 struct page *page = alloc_page(GFP_KERNEL); 519 if (page == NULL) 520 goto out_freepages; 521 pages[i] = page; 522 } 523 |
511 ptr = vm_map_ram(pages, NFS_MAX_READDIR_PAGES, 0, PAGE_KERNEL); | 524 ptr = vm_map_ram(pages, npages, 0, PAGE_KERNEL); |
512 if (!IS_ERR_OR_NULL(ptr)) 513 return ptr; 514out_freepages: 515 nfs_readdir_free_pagearray(pages, i); 516 return NULL; 517} 518 519static --- 1694 unchanged lines hidden --- | 525 if (!IS_ERR_OR_NULL(ptr)) 526 return ptr; 527out_freepages: 528 nfs_readdir_free_pagearray(pages, i); 529 return NULL; 530} 531 532static --- 1694 unchanged lines hidden --- |