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