linux/fs/nfs/read.c
<<
>>
Prefs
   1/*
   2 * linux/fs/nfs/read.c
   3 *
   4 * Block I/O for NFS
   5 *
   6 * Partial copy of Linus' read cache modifications to fs/nfs/file.c
   7 * modified for async RPC by okir@monad.swb.de
   8 */
   9
  10#include <linux/time.h>
  11#include <linux/kernel.h>
  12#include <linux/errno.h>
  13#include <linux/fcntl.h>
  14#include <linux/stat.h>
  15#include <linux/mm.h>
  16#include <linux/slab.h>
  17#include <linux/pagemap.h>
  18#include <linux/sunrpc/clnt.h>
  19#include <linux/nfs_fs.h>
  20#include <linux/nfs_page.h>
  21#include <linux/module.h>
  22
  23#include <asm/system.h>
  24#include "pnfs.h"
  25
  26#include "nfs4_fs.h"
  27#include "internal.h"
  28#include "iostat.h"
  29#include "fscache.h"
  30
  31#define NFSDBG_FACILITY         NFSDBG_PAGECACHE
  32
  33static const struct nfs_pageio_ops nfs_pageio_read_ops;
  34static const struct rpc_call_ops nfs_read_partial_ops;
  35static const struct rpc_call_ops nfs_read_full_ops;
  36
  37static struct kmem_cache *nfs_rdata_cachep;
  38
  39struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount)
  40{
  41        struct nfs_read_data *p;
  42
  43        p = kmem_cache_zalloc(nfs_rdata_cachep, GFP_KERNEL);
  44        if (p) {
  45                INIT_LIST_HEAD(&p->pages);
  46                p->npages = pagecount;
  47                if (pagecount <= ARRAY_SIZE(p->page_array))
  48                        p->pagevec = p->page_array;
  49                else {
  50                        p->pagevec = kcalloc(pagecount, sizeof(struct page *), GFP_KERNEL);
  51                        if (!p->pagevec) {
  52                                kmem_cache_free(nfs_rdata_cachep, p);
  53                                p = NULL;
  54                        }
  55                }
  56        }
  57        return p;
  58}
  59
  60void nfs_readdata_free(struct nfs_read_data *p)
  61{
  62        if (p && (p->pagevec != &p->page_array[0]))
  63                kfree(p->pagevec);
  64        kmem_cache_free(nfs_rdata_cachep, p);
  65}
  66
  67void nfs_readdata_release(struct nfs_read_data *rdata)
  68{
  69        put_lseg(rdata->lseg);
  70        put_nfs_open_context(rdata->args.context);
  71        nfs_readdata_free(rdata);
  72}
  73
  74static
  75int nfs_return_empty_page(struct page *page)
  76{
  77        zero_user(page, 0, PAGE_CACHE_SIZE);
  78        SetPageUptodate(page);
  79        unlock_page(page);
  80        return 0;
  81}
  82
  83static void nfs_readpage_truncate_uninitialised_page(struct nfs_read_data *data)
  84{
  85        unsigned int remainder = data->args.count - data->res.count;
  86        unsigned int base = data->args.pgbase + data->res.count;
  87        unsigned int pglen;
  88        struct page **pages;
  89
  90        if (data->res.eof == 0 || remainder == 0)
  91                return;
  92        /*
  93         * Note: "remainder" can never be negative, since we check for
  94         *      this in the XDR code.
  95         */
  96        pages = &data->args.pages[base >> PAGE_CACHE_SHIFT];
  97        base &= ~PAGE_CACHE_MASK;
  98        pglen = PAGE_CACHE_SIZE - base;
  99        for (;;) {
 100                if (remainder <= pglen) {
 101                        zero_user(*pages, base, remainder);
 102                        break;
 103                }
 104                zero_user(*pages, base, pglen);
 105                pages++;
 106                remainder -= pglen;
 107                pglen = PAGE_CACHE_SIZE;
 108                base = 0;
 109        }
 110}
 111
 112void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio,
 113                struct inode *inode)
 114{
 115        nfs_pageio_init(pgio, inode, &nfs_pageio_read_ops,
 116                        NFS_SERVER(inode)->rsize, 0);
 117}
 118
 119void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio)
 120{
 121        pgio->pg_ops = &nfs_pageio_read_ops;
 122        pgio->pg_bsize = NFS_SERVER(pgio->pg_inode)->rsize;
 123}
 124EXPORT_SYMBOL_GPL(nfs_pageio_reset_read_mds);
 125
 126static void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
 127                struct inode *inode)
 128{
 129        if (!pnfs_pageio_init_read(pgio, inode))
 130                nfs_pageio_init_read_mds(pgio, inode);
 131}
 132
 133int nfs_readpage_async(struct nfs_open_context *ctx, struct inode *inode,
 134                       struct page *page)
 135{
 136        struct nfs_page *new;
 137        unsigned int len;
 138        struct nfs_pageio_descriptor pgio;
 139
 140        len = nfs_page_length(page);
 141        if (len == 0)
 142                return nfs_return_empty_page(page);
 143        new = nfs_create_request(ctx, inode, page, 0, len);
 144        if (IS_ERR(new)) {
 145                unlock_page(page);
 146                return PTR_ERR(new);
 147        }
 148        if (len < PAGE_CACHE_SIZE)
 149                zero_user_segment(page, len, PAGE_CACHE_SIZE);
 150
 151        nfs_pageio_init_read(&pgio, inode);
 152        nfs_pageio_add_request(&pgio, new);
 153        nfs_pageio_complete(&pgio);
 154        return 0;
 155}
 156
 157static void nfs_readpage_release(struct nfs_page *req)
 158{
 159        struct inode *d_inode = req->wb_context->dentry->d_inode;
 160
 161        if (PageUptodate(req->wb_page))
 162                nfs_readpage_to_fscache(d_inode, req->wb_page, 0);
 163
 164        unlock_page(req->wb_page);
 165
 166        dprintk("NFS: read done (%s/%Ld %d@%Ld)\n",
 167                        req->wb_context->dentry->d_inode->i_sb->s_id,
 168                        (long long)NFS_FILEID(req->wb_context->dentry->d_inode),
 169                        req->wb_bytes,
 170                        (long long)req_offset(req));
 171        nfs_release_request(req);
 172}
 173
 174int nfs_initiate_read(struct nfs_read_data *data, struct rpc_clnt *clnt,
 175                      const struct rpc_call_ops *call_ops)
 176{
 177        struct inode *inode = data->inode;
 178        int swap_flags = IS_SWAPFILE(inode) ? NFS_RPC_SWAPFLAGS : 0;
 179        struct rpc_task *task;
 180        struct rpc_message msg = {
 181                .rpc_argp = &data->args,
 182                .rpc_resp = &data->res,
 183                .rpc_cred = data->cred,
 184        };
 185        struct rpc_task_setup task_setup_data = {
 186                .task = &data->task,
 187                .rpc_client = clnt,
 188                .rpc_message = &msg,
 189                .callback_ops = call_ops,
 190                .callback_data = data,
 191                .workqueue = nfsiod_workqueue,
 192                .flags = RPC_TASK_ASYNC | swap_flags,
 193        };
 194
 195        /* Set up the initial task struct. */
 196        NFS_PROTO(inode)->read_setup(data, &msg);
 197
 198        dprintk("NFS: %5u initiated read call (req %s/%lld, %u bytes @ "
 199                        "offset %llu)\n",
 200                        data->task.tk_pid,
 201                        inode->i_sb->s_id,
 202                        (long long)NFS_FILEID(inode),
 203                        data->args.count,
 204                        (unsigned long long)data->args.offset);
 205
 206        task = rpc_run_task(&task_setup_data);
 207        if (IS_ERR(task))
 208                return PTR_ERR(task);
 209        rpc_put_task(task);
 210        return 0;
 211}
 212EXPORT_SYMBOL_GPL(nfs_initiate_read);
 213
 214/*
 215 * Set up the NFS read request struct
 216 */
 217static void nfs_read_rpcsetup(struct nfs_page *req, struct nfs_read_data *data,
 218                unsigned int count, unsigned int offset)
 219{
 220        struct inode *inode = req->wb_context->dentry->d_inode;
 221
 222        data->req         = req;
 223        data->inode       = inode;
 224        data->cred        = req->wb_context->cred;
 225
 226        data->args.fh     = NFS_FH(inode);
 227        data->args.offset = req_offset(req) + offset;
 228        data->args.pgbase = req->wb_pgbase + offset;
 229        data->args.pages  = data->pagevec;
 230        data->args.count  = count;
 231        data->args.context = get_nfs_open_context(req->wb_context);
 232        data->args.lock_context = req->wb_lock_context;
 233
 234        data->res.fattr   = &data->fattr;
 235        data->res.count   = count;
 236        data->res.eof     = 0;
 237        nfs_fattr_init(&data->fattr);
 238}
 239
 240static int nfs_do_read(struct nfs_read_data *data,
 241                const struct rpc_call_ops *call_ops)
 242{
 243        struct inode *inode = data->args.context->dentry->d_inode;
 244
 245        return nfs_initiate_read(data, NFS_CLIENT(inode), call_ops);
 246}
 247
 248static int
 249nfs_do_multiple_reads(struct list_head *head,
 250                const struct rpc_call_ops *call_ops)
 251{
 252        struct nfs_read_data *data;
 253        int ret = 0;
 254
 255        while (!list_empty(head)) {
 256                int ret2;
 257
 258                data = list_entry(head->next, struct nfs_read_data, list);
 259                list_del_init(&data->list);
 260
 261                ret2 = nfs_do_read(data, call_ops);
 262                if (ret == 0)
 263                        ret = ret2;
 264        }
 265        return ret;
 266}
 267
 268static void
 269nfs_async_read_error(struct list_head *head)
 270{
 271        struct nfs_page *req;
 272
 273        while (!list_empty(head)) {
 274                req = nfs_list_entry(head->next);
 275                nfs_list_remove_request(req);
 276                nfs_readpage_release(req);
 277        }
 278}
 279
 280/*
 281 * Generate multiple requests to fill a single page.
 282 *
 283 * We optimize to reduce the number of read operations on the wire.  If we
 284 * detect that we're reading a page, or an area of a page, that is past the
 285 * end of file, we do not generate NFS read operations but just clear the
 286 * parts of the page that would have come back zero from the server anyway.
 287 *
 288 * We rely on the cached value of i_size to make this determination; another
 289 * client can fill pages on the server past our cached end-of-file, but we
 290 * won't see the new data until our attribute cache is updated.  This is more
 291 * or less conventional NFS client behavior.
 292 */
 293static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc, struct list_head *res)
 294{
 295        struct nfs_page *req = nfs_list_entry(desc->pg_list.next);
 296        struct page *page = req->wb_page;
 297        struct nfs_read_data *data;
 298        size_t rsize = desc->pg_bsize, nbytes;
 299        unsigned int offset;
 300        int requests = 0;
 301        int ret = 0;
 302
 303        nfs_list_remove_request(req);
 304
 305        offset = 0;
 306        nbytes = desc->pg_count;
 307        do {
 308                size_t len = min(nbytes,rsize);
 309
 310                data = nfs_readdata_alloc(1);
 311                if (!data)
 312                        goto out_bad;
 313                data->pagevec[0] = page;
 314                nfs_read_rpcsetup(req, data, len, offset);
 315                list_add(&data->list, res);
 316                requests++;
 317                nbytes -= len;
 318                offset += len;
 319        } while(nbytes != 0);
 320        atomic_set(&req->wb_complete, requests);
 321        desc->pg_rpc_callops = &nfs_read_partial_ops;
 322        return ret;
 323out_bad:
 324        while (!list_empty(res)) {
 325                data = list_entry(res->next, struct nfs_read_data, list);
 326                list_del(&data->list);
 327                nfs_readdata_free(data);
 328        }
 329        nfs_readpage_release(req);
 330        return -ENOMEM;
 331}
 332
 333static int nfs_pagein_one(struct nfs_pageio_descriptor *desc, struct list_head *res)
 334{
 335        struct nfs_page         *req;
 336        struct page             **pages;
 337        struct nfs_read_data    *data;
 338        struct list_head *head = &desc->pg_list;
 339        int ret = 0;
 340
 341        data = nfs_readdata_alloc(nfs_page_array_len(desc->pg_base,
 342                                                     desc->pg_count));
 343        if (!data) {
 344                nfs_async_read_error(head);
 345                ret = -ENOMEM;
 346                goto out;
 347        }
 348
 349        pages = data->pagevec;
 350        while (!list_empty(head)) {
 351                req = nfs_list_entry(head->next);
 352                nfs_list_remove_request(req);
 353                nfs_list_add_request(req, &data->pages);
 354                *pages++ = req->wb_page;
 355        }
 356        req = nfs_list_entry(data->pages.next);
 357
 358        nfs_read_rpcsetup(req, data, desc->pg_count, 0);
 359        list_add(&data->list, res);
 360        desc->pg_rpc_callops = &nfs_read_full_ops;
 361out:
 362        return ret;
 363}
 364
 365int nfs_generic_pagein(struct nfs_pageio_descriptor *desc, struct list_head *head)
 366{
 367        if (desc->pg_bsize < PAGE_CACHE_SIZE)
 368                return nfs_pagein_multi(desc, head);
 369        return nfs_pagein_one(desc, head);
 370}
 371
 372static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
 373{
 374        LIST_HEAD(head);
 375        int ret;
 376
 377        ret = nfs_generic_pagein(desc, &head);
 378        if (ret == 0)
 379                ret = nfs_do_multiple_reads(&head, desc->pg_rpc_callops);
 380        return ret;
 381}
 382
 383static const struct nfs_pageio_ops nfs_pageio_read_ops = {
 384        .pg_test = nfs_generic_pg_test,
 385        .pg_doio = nfs_generic_pg_readpages,
 386};
 387
 388/*
 389 * This is the callback from RPC telling us whether a reply was
 390 * received or some error occurred (timeout or socket shutdown).
 391 */
 392int nfs_readpage_result(struct rpc_task *task, struct nfs_read_data *data)
 393{
 394        int status;
 395
 396        dprintk("NFS: %s: %5u, (status %d)\n", __func__, task->tk_pid,
 397                        task->tk_status);
 398
 399        status = NFS_PROTO(data->inode)->read_done(task, data);
 400        if (status != 0)
 401                return status;
 402
 403        nfs_add_stats(data->inode, NFSIOS_SERVERREADBYTES, data->res.count);
 404
 405        if (task->tk_status == -ESTALE) {
 406                set_bit(NFS_INO_STALE, &NFS_I(data->inode)->flags);
 407                nfs_mark_for_revalidate(data->inode);
 408        }
 409        return 0;
 410}
 411
 412static void nfs_readpage_retry(struct rpc_task *task, struct nfs_read_data *data)
 413{
 414        struct nfs_readargs *argp = &data->args;
 415        struct nfs_readres *resp = &data->res;
 416
 417        if (resp->eof || resp->count == argp->count)
 418                return;
 419
 420        /* This is a short read! */
 421        nfs_inc_stats(data->inode, NFSIOS_SHORTREAD);
 422        /* Has the server at least made some progress? */
 423        if (resp->count == 0)
 424                return;
 425
 426        /* Yes, so retry the read at the end of the data */
 427        data->mds_offset += resp->count;
 428        argp->offset += resp->count;
 429        argp->pgbase += resp->count;
 430        argp->count -= resp->count;
 431        rpc_restart_call_prepare(task);
 432}
 433
 434/*
 435 * Handle a read reply that fills part of a page.
 436 */
 437static void nfs_readpage_result_partial(struct rpc_task *task, void *calldata)
 438{
 439        struct nfs_read_data *data = calldata;
 440 
 441        if (nfs_readpage_result(task, data) != 0)
 442                return;
 443        if (task->tk_status < 0)
 444                return;
 445
 446        nfs_readpage_truncate_uninitialised_page(data);
 447        nfs_readpage_retry(task, data);
 448}
 449
 450static void nfs_readpage_release_partial(void *calldata)
 451{
 452        struct nfs_read_data *data = calldata;
 453        struct nfs_page *req = data->req;
 454        struct page *page = req->wb_page;
 455        int status = data->task.tk_status;
 456
 457        if (status < 0)
 458                set_bit(PG_PARTIAL_READ_FAILED, &req->wb_flags);
 459
 460        if (atomic_dec_and_test(&req->wb_complete)) {
 461                if (!test_bit(PG_PARTIAL_READ_FAILED, &req->wb_flags))
 462                        SetPageUptodate(page);
 463                nfs_readpage_release(req);
 464        }
 465        nfs_readdata_release(calldata);
 466}
 467
 468#if defined(CONFIG_NFS_V4_1)
 469void nfs_read_prepare(struct rpc_task *task, void *calldata)
 470{
 471        struct nfs_read_data *data = calldata;
 472
 473        if (nfs4_setup_sequence(NFS_SERVER(data->inode),
 474                                &data->args.seq_args, &data->res.seq_res,
 475                                0, task))
 476                return;
 477        rpc_call_start(task);
 478}
 479#endif /* CONFIG_NFS_V4_1 */
 480
 481static const struct rpc_call_ops nfs_read_partial_ops = {
 482#if defined(CONFIG_NFS_V4_1)
 483        .rpc_call_prepare = nfs_read_prepare,
 484#endif /* CONFIG_NFS_V4_1 */
 485        .rpc_call_done = nfs_readpage_result_partial,
 486        .rpc_release = nfs_readpage_release_partial,
 487};
 488
 489static void nfs_readpage_set_pages_uptodate(struct nfs_read_data *data)
 490{
 491        unsigned int count = data->res.count;
 492        unsigned int base = data->args.pgbase;
 493        struct page **pages;
 494
 495        if (data->res.eof)
 496                count = data->args.count;
 497        if (unlikely(count == 0))
 498                return;
 499        pages = &data->args.pages[base >> PAGE_CACHE_SHIFT];
 500        base &= ~PAGE_CACHE_MASK;
 501        count += base;
 502        for (;count >= PAGE_CACHE_SIZE; count -= PAGE_CACHE_SIZE, pages++)
 503                SetPageUptodate(*pages);
 504        if (count == 0)
 505                return;
 506        /* Was this a short read? */
 507        if (data->res.eof || data->res.count == data->args.count)
 508                SetPageUptodate(*pages);
 509}
 510
 511/*
 512 * This is the callback from RPC telling us whether a reply was
 513 * received or some error occurred (timeout or socket shutdown).
 514 */
 515static void nfs_readpage_result_full(struct rpc_task *task, void *calldata)
 516{
 517        struct nfs_read_data *data = calldata;
 518
 519        if (nfs_readpage_result(task, data) != 0)
 520                return;
 521        if (task->tk_status < 0)
 522                return;
 523        /*
 524         * Note: nfs_readpage_retry may change the values of
 525         * data->args. In the multi-page case, we therefore need
 526         * to ensure that we call nfs_readpage_set_pages_uptodate()
 527         * first.
 528         */
 529        nfs_readpage_truncate_uninitialised_page(data);
 530        nfs_readpage_set_pages_uptodate(data);
 531        nfs_readpage_retry(task, data);
 532}
 533
 534static void nfs_readpage_release_full(void *calldata)
 535{
 536        struct nfs_read_data *data = calldata;
 537
 538        while (!list_empty(&data->pages)) {
 539                struct nfs_page *req = nfs_list_entry(data->pages.next);
 540
 541                nfs_list_remove_request(req);
 542                nfs_readpage_release(req);
 543        }
 544        nfs_readdata_release(calldata);
 545}
 546
 547static const struct rpc_call_ops nfs_read_full_ops = {
 548#if defined(CONFIG_NFS_V4_1)
 549        .rpc_call_prepare = nfs_read_prepare,
 550#endif /* CONFIG_NFS_V4_1 */
 551        .rpc_call_done = nfs_readpage_result_full,
 552        .rpc_release = nfs_readpage_release_full,
 553};
 554
 555/*
 556 * Read a page over NFS.
 557 * We read the page synchronously in the following case:
 558 *  -   The error flag is set for this page. This happens only when a
 559 *      previous async read operation failed.
 560 */
 561int nfs_readpage(struct file *file, struct page *page)
 562{
 563        struct nfs_open_context *ctx;
 564        struct inode *inode = page->mapping->host;
 565        int             error;
 566
 567        dprintk("NFS: nfs_readpage (%p %ld@%lu)\n",
 568                page, PAGE_CACHE_SIZE, page->index);
 569        nfs_inc_stats(inode, NFSIOS_VFSREADPAGE);
 570        nfs_add_stats(inode, NFSIOS_READPAGES, 1);
 571
 572        /*
 573         * Try to flush any pending writes to the file..
 574         *
 575         * NOTE! Because we own the page lock, there cannot
 576         * be any new pending writes generated at this point
 577         * for this page (other pages can be written to).
 578         */
 579        error = nfs_wb_page(inode, page);
 580        if (error)
 581                goto out_unlock;
 582        if (PageUptodate(page))
 583                goto out_unlock;
 584
 585        error = -ESTALE;
 586        if (NFS_STALE(inode))
 587                goto out_unlock;
 588
 589        if (file == NULL) {
 590                error = -EBADF;
 591                ctx = nfs_find_open_context(inode, NULL, FMODE_READ);
 592                if (ctx == NULL)
 593                        goto out_unlock;
 594        } else
 595                ctx = get_nfs_open_context(nfs_file_open_context(file));
 596
 597        if (!IS_SYNC(inode)) {
 598                error = nfs_readpage_from_fscache(ctx, inode, page);
 599                if (error == 0)
 600                        goto out;
 601        }
 602
 603        error = nfs_readpage_async(ctx, inode, page);
 604
 605out:
 606        put_nfs_open_context(ctx);
 607        return error;
 608out_unlock:
 609        unlock_page(page);
 610        return error;
 611}
 612
 613struct nfs_readdesc {
 614        struct nfs_pageio_descriptor *pgio;
 615        struct nfs_open_context *ctx;
 616};
 617
 618static int
 619readpage_async_filler(void *data, struct page *page)
 620{
 621        struct nfs_readdesc *desc = (struct nfs_readdesc *)data;
 622        struct inode *inode = page->mapping->host;
 623        struct nfs_page *new;
 624        unsigned int len;
 625        int error;
 626
 627        len = nfs_page_length(page);
 628        if (len == 0)
 629                return nfs_return_empty_page(page);
 630
 631        new = nfs_create_request(desc->ctx, inode, page, 0, len);
 632        if (IS_ERR(new))
 633                goto out_error;
 634
 635        if (len < PAGE_CACHE_SIZE)
 636                zero_user_segment(page, len, PAGE_CACHE_SIZE);
 637        if (!nfs_pageio_add_request(desc->pgio, new)) {
 638                error = desc->pgio->pg_error;
 639                goto out_unlock;
 640        }
 641        return 0;
 642out_error:
 643        error = PTR_ERR(new);
 644out_unlock:
 645        unlock_page(page);
 646        return error;
 647}
 648
 649int nfs_readpages(struct file *filp, struct address_space *mapping,
 650                struct list_head *pages, unsigned nr_pages)
 651{
 652        struct nfs_pageio_descriptor pgio;
 653        struct nfs_readdesc desc = {
 654                .pgio = &pgio,
 655        };
 656        struct inode *inode = mapping->host;
 657        unsigned long npages;
 658        int ret = -ESTALE;
 659
 660        dprintk("NFS: nfs_readpages (%s/%Ld %d)\n",
 661                        inode->i_sb->s_id,
 662                        (long long)NFS_FILEID(inode),
 663                        nr_pages);
 664        nfs_inc_stats(inode, NFSIOS_VFSREADPAGES);
 665
 666        if (NFS_STALE(inode))
 667                goto out;
 668
 669        if (filp == NULL) {
 670                desc.ctx = nfs_find_open_context(inode, NULL, FMODE_READ);
 671                if (desc.ctx == NULL)
 672                        return -EBADF;
 673        } else
 674                desc.ctx = get_nfs_open_context(nfs_file_open_context(filp));
 675
 676        /* attempt to read as many of the pages as possible from the cache
 677         * - this returns -ENOBUFS immediately if the cookie is negative
 678         */
 679        ret = nfs_readpages_from_fscache(desc.ctx, inode, mapping,
 680                                         pages, &nr_pages);
 681        if (ret == 0)
 682                goto read_complete; /* all pages were read */
 683
 684        nfs_pageio_init_read(&pgio, inode);
 685
 686        ret = read_cache_pages(mapping, pages, readpage_async_filler, &desc);
 687
 688        nfs_pageio_complete(&pgio);
 689        npages = (pgio.pg_bytes_written + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
 690        nfs_add_stats(inode, NFSIOS_READPAGES, npages);
 691read_complete:
 692        put_nfs_open_context(desc.ctx);
 693out:
 694        return ret;
 695}
 696
 697int __init nfs_init_readpagecache(void)
 698{
 699        nfs_rdata_cachep = kmem_cache_create("nfs_read_data",
 700                                             sizeof(struct nfs_read_data),
 701                                             0, SLAB_HWCACHE_ALIGN,
 702                                             NULL);
 703        if (nfs_rdata_cachep == NULL)
 704                return -ENOMEM;
 705
 706        return 0;
 707}
 708
 709void nfs_destroy_readpagecache(void)
 710{
 711        kmem_cache_destroy(nfs_rdata_cachep);
 712}
 713
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.