linux/fs/afs/file.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/* AFS filesystem file handling
   3 *
   4 * Copyright (C) 2002, 2007 Red Hat, Inc. All Rights Reserved.
   5 * Written by David Howells (dhowells@redhat.com)
   6 */
   7
   8#include <linux/kernel.h>
   9#include <linux/module.h>
  10#include <linux/init.h>
  11#include <linux/fs.h>
  12#include <linux/pagemap.h>
  13#include <linux/writeback.h>
  14#include <linux/gfp.h>
  15#include <linux/task_io_accounting_ops.h>
  16#include <linux/mm.h>
  17#include "internal.h"
  18
  19static int afs_file_mmap(struct file *file, struct vm_area_struct *vma);
  20static int afs_readpage(struct file *file, struct page *page);
  21static void afs_invalidatepage(struct page *page, unsigned int offset,
  22                               unsigned int length);
  23static int afs_releasepage(struct page *page, gfp_t gfp_flags);
  24
  25static int afs_readpages(struct file *filp, struct address_space *mapping,
  26                         struct list_head *pages, unsigned nr_pages);
  27
  28const struct file_operations afs_file_operations = {
  29        .open           = afs_open,
  30        .release        = afs_release,
  31        .llseek         = generic_file_llseek,
  32        .read_iter      = generic_file_read_iter,
  33        .write_iter     = afs_file_write,
  34        .mmap           = afs_file_mmap,
  35        .splice_read    = generic_file_splice_read,
  36        .splice_write   = iter_file_splice_write,
  37        .fsync          = afs_fsync,
  38        .lock           = afs_lock,
  39        .flock          = afs_flock,
  40};
  41
  42const struct inode_operations afs_file_inode_operations = {
  43        .getattr        = afs_getattr,
  44        .setattr        = afs_setattr,
  45        .permission     = afs_permission,
  46        .listxattr      = afs_listxattr,
  47};
  48
  49const struct address_space_operations afs_fs_aops = {
  50        .readpage       = afs_readpage,
  51        .readpages      = afs_readpages,
  52        .set_page_dirty = afs_set_page_dirty,
  53        .launder_page   = afs_launder_page,
  54        .releasepage    = afs_releasepage,
  55        .invalidatepage = afs_invalidatepage,
  56        .write_begin    = afs_write_begin,
  57        .write_end      = afs_write_end,
  58        .writepage      = afs_writepage,
  59        .writepages     = afs_writepages,
  60};
  61
  62static const struct vm_operations_struct afs_vm_ops = {
  63        .fault          = filemap_fault,
  64        .map_pages      = filemap_map_pages,
  65        .page_mkwrite   = afs_page_mkwrite,
  66};
  67
  68/*
  69 * Discard a pin on a writeback key.
  70 */
  71void afs_put_wb_key(struct afs_wb_key *wbk)
  72{
  73        if (wbk && refcount_dec_and_test(&wbk->usage)) {
  74                key_put(wbk->key);
  75                kfree(wbk);
  76        }
  77}
  78
  79/*
  80 * Cache key for writeback.
  81 */
  82int afs_cache_wb_key(struct afs_vnode *vnode, struct afs_file *af)
  83{
  84        struct afs_wb_key *wbk, *p;
  85
  86        wbk = kzalloc(sizeof(struct afs_wb_key), GFP_KERNEL);
  87        if (!wbk)
  88                return -ENOMEM;
  89        refcount_set(&wbk->usage, 2);
  90        wbk->key = af->key;
  91
  92        spin_lock(&vnode->wb_lock);
  93        list_for_each_entry(p, &vnode->wb_keys, vnode_link) {
  94                if (p->key == wbk->key)
  95                        goto found;
  96        }
  97
  98        key_get(wbk->key);
  99        list_add_tail(&wbk->vnode_link, &vnode->wb_keys);
 100        spin_unlock(&vnode->wb_lock);
 101        af->wb = wbk;
 102        return 0;
 103
 104found:
 105        refcount_inc(&p->usage);
 106        spin_unlock(&vnode->wb_lock);
 107        af->wb = p;
 108        kfree(wbk);
 109        return 0;
 110}
 111
 112/*
 113 * open an AFS file or directory and attach a key to it
 114 */
 115int afs_open(struct inode *inode, struct file *file)
 116{
 117        struct afs_vnode *vnode = AFS_FS_I(inode);
 118        struct afs_file *af;
 119        struct key *key;
 120        int ret;
 121
 122        _enter("{%llx:%llu},", vnode->fid.vid, vnode->fid.vnode);
 123
 124        key = afs_request_key(vnode->volume->cell);
 125        if (IS_ERR(key)) {
 126                ret = PTR_ERR(key);
 127                goto error;
 128        }
 129
 130        af = kzalloc(sizeof(*af), GFP_KERNEL);
 131        if (!af) {
 132                ret = -ENOMEM;
 133                goto error_key;
 134        }
 135        af->key = key;
 136
 137        ret = afs_validate(vnode, key);
 138        if (ret < 0)
 139                goto error_af;
 140
 141        if (file->f_mode & FMODE_WRITE) {
 142                ret = afs_cache_wb_key(vnode, af);
 143                if (ret < 0)
 144                        goto error_af;
 145        }
 146
 147        if (file->f_flags & O_TRUNC)
 148                set_bit(AFS_VNODE_NEW_CONTENT, &vnode->flags);
 149        
 150        file->private_data = af;
 151        _leave(" = 0");
 152        return 0;
 153
 154error_af:
 155        kfree(af);
 156error_key:
 157        key_put(key);
 158error:
 159        _leave(" = %d", ret);
 160        return ret;
 161}
 162
 163/*
 164 * release an AFS file or directory and discard its key
 165 */
 166int afs_release(struct inode *inode, struct file *file)
 167{
 168        struct afs_vnode *vnode = AFS_FS_I(inode);
 169        struct afs_file *af = file->private_data;
 170        int ret = 0;
 171
 172        _enter("{%llx:%llu},", vnode->fid.vid, vnode->fid.vnode);
 173
 174        if ((file->f_mode & FMODE_WRITE))
 175                ret = vfs_fsync(file, 0);
 176
 177        file->private_data = NULL;
 178        if (af->wb)
 179                afs_put_wb_key(af->wb);
 180        key_put(af->key);
 181        kfree(af);
 182        afs_prune_wb_keys(vnode);
 183        _leave(" = %d", ret);
 184        return ret;
 185}
 186
 187/*
 188 * Dispose of a ref to a read record.
 189 */
 190void afs_put_read(struct afs_read *req)
 191{
 192        int i;
 193
 194        if (refcount_dec_and_test(&req->usage)) {
 195                if (req->pages) {
 196                        for (i = 0; i < req->nr_pages; i++)
 197                                if (req->pages[i])
 198                                        put_page(req->pages[i]);
 199                        if (req->pages != req->array)
 200                                kfree(req->pages);
 201                }
 202                kfree(req);
 203        }
 204}
 205
 206#ifdef CONFIG_AFS_FSCACHE
 207/*
 208 * deal with notification that a page was read from the cache
 209 */
 210static void afs_file_readpage_read_complete(struct page *page,
 211                                            void *data,
 212                                            int error)
 213{
 214        _enter("%p,%p,%d", page, data, error);
 215
 216        /* if the read completes with an error, we just unlock the page and let
 217         * the VM reissue the readpage */
 218        if (!error)
 219                SetPageUptodate(page);
 220        unlock_page(page);
 221}
 222#endif
 223
 224static void afs_fetch_data_success(struct afs_operation *op)
 225{
 226        struct afs_vnode *vnode = op->file[0].vnode;
 227
 228        _enter("op=%08x", op->debug_id);
 229        afs_vnode_commit_status(op, &op->file[0]);
 230        afs_stat_v(vnode, n_fetches);
 231        atomic_long_add(op->fetch.req->actual_len, &op->net->n_fetch_bytes);
 232}
 233
 234static void afs_fetch_data_put(struct afs_operation *op)
 235{
 236        afs_put_read(op->fetch.req);
 237}
 238
 239static const struct afs_operation_ops afs_fetch_data_operation = {
 240        .issue_afs_rpc  = afs_fs_fetch_data,
 241        .issue_yfs_rpc  = yfs_fs_fetch_data,
 242        .success        = afs_fetch_data_success,
 243        .aborted        = afs_check_for_remote_deletion,
 244        .put            = afs_fetch_data_put,
 245};
 246
 247/*
 248 * Fetch file data from the volume.
 249 */
 250int afs_fetch_data(struct afs_vnode *vnode, struct key *key, struct afs_read *req)
 251{
 252        struct afs_operation *op;
 253
 254        _enter("%s{%llx:%llu.%u},%x,,,",
 255               vnode->volume->name,
 256               vnode->fid.vid,
 257               vnode->fid.vnode,
 258               vnode->fid.unique,
 259               key_serial(key));
 260
 261        op = afs_alloc_operation(key, vnode->volume);
 262        if (IS_ERR(op))
 263                return PTR_ERR(op);
 264
 265        afs_op_set_vnode(op, 0, vnode);
 266
 267        op->fetch.req   = afs_get_read(req);
 268        op->ops         = &afs_fetch_data_operation;
 269        return afs_do_sync_operation(op);
 270}
 271
 272/*
 273 * read page from file, directory or symlink, given a key to use
 274 */
 275int afs_page_filler(void *data, struct page *page)
 276{
 277        struct inode *inode = page->mapping->host;
 278        struct afs_vnode *vnode = AFS_FS_I(inode);
 279        struct afs_read *req;
 280        struct key *key = data;
 281        int ret;
 282
 283        _enter("{%x},{%lu},{%lu}", key_serial(key), inode->i_ino, page->index);
 284
 285        BUG_ON(!PageLocked(page));
 286
 287        ret = -ESTALE;
 288        if (test_bit(AFS_VNODE_DELETED, &vnode->flags))
 289                goto error;
 290
 291        /* is it cached? */
 292#ifdef CONFIG_AFS_FSCACHE
 293        ret = fscache_read_or_alloc_page(vnode->cache,
 294                                         page,
 295                                         afs_file_readpage_read_complete,
 296                                         NULL,
 297                                         GFP_KERNEL);
 298#else
 299        ret = -ENOBUFS;
 300#endif
 301        switch (ret) {
 302                /* read BIO submitted (page in cache) */
 303        case 0:
 304                break;
 305
 306                /* page not yet cached */
 307        case -ENODATA:
 308                _debug("cache said ENODATA");
 309                goto go_on;
 310
 311                /* page will not be cached */
 312        case -ENOBUFS:
 313                _debug("cache said ENOBUFS");
 314
 315                fallthrough;
 316        default:
 317        go_on:
 318                req = kzalloc(struct_size(req, array, 1), GFP_KERNEL);
 319                if (!req)
 320                        goto enomem;
 321
 322                /* We request a full page.  If the page is a partial one at the
 323                 * end of the file, the server will return a short read and the
 324                 * unmarshalling code will clear the unfilled space.
 325                 */
 326                refcount_set(&req->usage, 1);
 327                req->pos = (loff_t)page->index << PAGE_SHIFT;
 328                req->len = PAGE_SIZE;
 329                req->nr_pages = 1;
 330                req->pages = req->array;
 331                req->pages[0] = page;
 332                get_page(page);
 333
 334                /* read the contents of the file from the server into the
 335                 * page */
 336                ret = afs_fetch_data(vnode, key, req);
 337                afs_put_read(req);
 338
 339                if (ret < 0) {
 340                        if (ret == -ENOENT) {
 341                                _debug("got NOENT from server"
 342                                       " - marking file deleted and stale");
 343                                set_bit(AFS_VNODE_DELETED, &vnode->flags);
 344                                ret = -ESTALE;
 345                        }
 346
 347#ifdef CONFIG_AFS_FSCACHE
 348                        fscache_uncache_page(vnode->cache, page);
 349#endif
 350                        BUG_ON(PageFsCache(page));
 351
 352                        if (ret == -EINTR ||
 353                            ret == -ENOMEM ||
 354                            ret == -ERESTARTSYS ||
 355                            ret == -EAGAIN)
 356                                goto error;
 357                        goto io_error;
 358                }
 359
 360                SetPageUptodate(page);
 361
 362                /* send the page to the cache */
 363#ifdef CONFIG_AFS_FSCACHE
 364                if (PageFsCache(page) &&
 365                    fscache_write_page(vnode->cache, page, vnode->status.size,
 366                                       GFP_KERNEL) != 0) {
 367                        fscache_uncache_page(vnode->cache, page);
 368                        BUG_ON(PageFsCache(page));
 369                }
 370#endif
 371                unlock_page(page);
 372        }
 373
 374        _leave(" = 0");
 375        return 0;
 376
 377io_error:
 378        SetPageError(page);
 379        goto error;
 380enomem:
 381        ret = -ENOMEM;
 382error:
 383        unlock_page(page);
 384        _leave(" = %d", ret);
 385        return ret;
 386}
 387
 388/*
 389 * read page from file, directory or symlink, given a file to nominate the key
 390 * to be used
 391 */
 392static int afs_readpage(struct file *file, struct page *page)
 393{
 394        struct key *key;
 395        int ret;
 396
 397        if (file) {
 398                key = afs_file_key(file);
 399                ASSERT(key != NULL);
 400                ret = afs_page_filler(key, page);
 401        } else {
 402                struct inode *inode = page->mapping->host;
 403                key = afs_request_key(AFS_FS_S(inode->i_sb)->cell);
 404                if (IS_ERR(key)) {
 405                        ret = PTR_ERR(key);
 406                } else {
 407                        ret = afs_page_filler(key, page);
 408                        key_put(key);
 409                }
 410        }
 411        return ret;
 412}
 413
 414/*
 415 * Make pages available as they're filled.
 416 */
 417static void afs_readpages_page_done(struct afs_read *req)
 418{
 419#ifdef CONFIG_AFS_FSCACHE
 420        struct afs_vnode *vnode = req->vnode;
 421#endif
 422        struct page *page = req->pages[req->index];
 423
 424        req->pages[req->index] = NULL;
 425        SetPageUptodate(page);
 426
 427        /* send the page to the cache */
 428#ifdef CONFIG_AFS_FSCACHE
 429        if (PageFsCache(page) &&
 430            fscache_write_page(vnode->cache, page, vnode->status.size,
 431                               GFP_KERNEL) != 0) {
 432                fscache_uncache_page(vnode->cache, page);
 433                BUG_ON(PageFsCache(page));
 434        }
 435#endif
 436        unlock_page(page);
 437        put_page(page);
 438}
 439
 440/*
 441 * Read a contiguous set of pages.
 442 */
 443static int afs_readpages_one(struct file *file, struct address_space *mapping,
 444                             struct list_head *pages)
 445{
 446        struct afs_vnode *vnode = AFS_FS_I(mapping->host);
 447        struct afs_read *req;
 448        struct list_head *p;
 449        struct page *first, *page;
 450        struct key *key = afs_file_key(file);
 451        pgoff_t index;
 452        int ret, n, i;
 453
 454        /* Count the number of contiguous pages at the front of the list.  Note
 455         * that the list goes prev-wards rather than next-wards.
 456         */
 457        first = lru_to_page(pages);
 458        index = first->index + 1;
 459        n = 1;
 460        for (p = first->lru.prev; p != pages; p = p->prev) {
 461                page = list_entry(p, struct page, lru);
 462                if (page->index != index)
 463                        break;
 464                index++;
 465                n++;
 466        }
 467
 468        req = kzalloc(struct_size(req, array, n), GFP_NOFS);
 469        if (!req)
 470                return -ENOMEM;
 471
 472        refcount_set(&req->usage, 1);
 473        req->vnode = vnode;
 474        req->page_done = afs_readpages_page_done;
 475        req->pos = first->index;
 476        req->pos <<= PAGE_SHIFT;
 477        req->pages = req->array;
 478
 479        /* Transfer the pages to the request.  We add them in until one fails
 480         * to add to the LRU and then we stop (as that'll make a hole in the
 481         * contiguous run.
 482         *
 483         * Note that it's possible for the file size to change whilst we're
 484         * doing this, but we rely on the server returning less than we asked
 485         * for if the file shrank.  We also rely on this to deal with a partial
 486         * page at the end of the file.
 487         */
 488        do {
 489                page = lru_to_page(pages);
 490                list_del(&page->lru);
 491                index = page->index;
 492                if (add_to_page_cache_lru(page, mapping, index,
 493                                          readahead_gfp_mask(mapping))) {
 494#ifdef CONFIG_AFS_FSCACHE
 495                        fscache_uncache_page(vnode->cache, page);
 496#endif
 497                        put_page(page);
 498                        break;
 499                }
 500
 501                req->pages[req->nr_pages++] = page;
 502                req->len += PAGE_SIZE;
 503        } while (req->nr_pages < n);
 504
 505        if (req->nr_pages == 0) {
 506                kfree(req);
 507                return 0;
 508        }
 509
 510        ret = afs_fetch_data(vnode, key, req);
 511        if (ret < 0)
 512                goto error;
 513
 514        task_io_account_read(PAGE_SIZE * req->nr_pages);
 515        afs_put_read(req);
 516        return 0;
 517
 518error:
 519        if (ret == -ENOENT) {
 520                _debug("got NOENT from server"
 521                       " - marking file deleted and stale");
 522                set_bit(AFS_VNODE_DELETED, &vnode->flags);
 523                ret = -ESTALE;
 524        }
 525
 526        for (i = 0; i < req->nr_pages; i++) {
 527                page = req->pages[i];
 528                if (page) {
 529#ifdef CONFIG_AFS_FSCACHE
 530                        fscache_uncache_page(vnode->cache, page);
 531#endif
 532                        SetPageError(page);
 533                        unlock_page(page);
 534                }
 535        }
 536
 537        afs_put_read(req);
 538        return ret;
 539}
 540
 541/*
 542 * read a set of pages
 543 */
 544static int afs_readpages(struct file *file, struct address_space *mapping,
 545                         struct list_head *pages, unsigned nr_pages)
 546{
 547        struct key *key = afs_file_key(file);
 548        struct afs_vnode *vnode;
 549        int ret = 0;
 550
 551        _enter("{%d},{%lu},,%d",
 552               key_serial(key), mapping->host->i_ino, nr_pages);
 553
 554        ASSERT(key != NULL);
 555
 556        vnode = AFS_FS_I(mapping->host);
 557        if (test_bit(AFS_VNODE_DELETED, &vnode->flags)) {
 558                _leave(" = -ESTALE");
 559                return -ESTALE;
 560        }
 561
 562        /* attempt to read as many of the pages as possible */
 563#ifdef CONFIG_AFS_FSCACHE
 564        ret = fscache_read_or_alloc_pages(vnode->cache,
 565                                          mapping,
 566                                          pages,
 567                                          &nr_pages,
 568                                          afs_file_readpage_read_complete,
 569                                          NULL,
 570                                          mapping_gfp_mask(mapping));
 571#else
 572        ret = -ENOBUFS;
 573#endif
 574
 575        switch (ret) {
 576                /* all pages are being read from the cache */
 577        case 0:
 578                BUG_ON(!list_empty(pages));
 579                BUG_ON(nr_pages != 0);
 580                _leave(" = 0 [reading all]");
 581                return 0;
 582
 583                /* there were pages that couldn't be read from the cache */
 584        case -ENODATA:
 585        case -ENOBUFS:
 586                break;
 587
 588                /* other error */
 589        default:
 590                _leave(" = %d", ret);
 591                return ret;
 592        }
 593
 594        while (!list_empty(pages)) {
 595                ret = afs_readpages_one(file, mapping, pages);
 596                if (ret < 0)
 597                        break;
 598        }
 599
 600        _leave(" = %d [netting]", ret);
 601        return ret;
 602}
 603
 604/*
 605 * Adjust the dirty region of the page on truncation or full invalidation,
 606 * getting rid of the markers altogether if the region is entirely invalidated.
 607 */
 608static void afs_invalidate_dirty(struct page *page, unsigned int offset,
 609                                 unsigned int length)
 610{
 611        struct afs_vnode *vnode = AFS_FS_I(page->mapping->host);
 612        unsigned long priv;
 613        unsigned int f, t, end = offset + length;
 614
 615        priv = page_private(page);
 616
 617        /* we clean up only if the entire page is being invalidated */
 618        if (offset == 0 && length == thp_size(page))
 619                goto full_invalidate;
 620
 621         /* If the page was dirtied by page_mkwrite(), the PTE stays writable
 622          * and we don't get another notification to tell us to expand it
 623          * again.
 624          */
 625        if (afs_is_page_dirty_mmapped(priv))
 626                return;
 627
 628        /* We may need to shorten the dirty region */
 629        f = afs_page_dirty_from(priv);
 630        t = afs_page_dirty_to(priv);
 631
 632        if (t <= offset || f >= end)
 633                return; /* Doesn't overlap */
 634
 635        if (f < offset && t > end)
 636                return; /* Splits the dirty region - just absorb it */
 637
 638        if (f >= offset && t <= end)
 639                goto undirty;
 640
 641        if (f < offset)
 642                t = offset;
 643        else
 644                f = end;
 645        if (f == t)
 646                goto undirty;
 647
 648        priv = afs_page_dirty(f, t);
 649        set_page_private(page, priv);
 650        trace_afs_page_dirty(vnode, tracepoint_string("trunc"), page->index, priv);
 651        return;
 652
 653undirty:
 654        trace_afs_page_dirty(vnode, tracepoint_string("undirty"), page->index, priv);
 655        clear_page_dirty_for_io(page);
 656full_invalidate:
 657        priv = (unsigned long)detach_page_private(page);
 658        trace_afs_page_dirty(vnode, tracepoint_string("inval"), page->index, priv);
 659}
 660
 661/*
 662 * invalidate part or all of a page
 663 * - release a page and clean up its private data if offset is 0 (indicating
 664 *   the entire page)
 665 */
 666static void afs_invalidatepage(struct page *page, unsigned int offset,
 667                               unsigned int length)
 668{
 669        _enter("{%lu},%u,%u", page->index, offset, length);
 670
 671        BUG_ON(!PageLocked(page));
 672
 673#ifdef CONFIG_AFS_FSCACHE
 674        /* we clean up only if the entire page is being invalidated */
 675        if (offset == 0 && length == PAGE_SIZE) {
 676                if (PageFsCache(page)) {
 677                        struct afs_vnode *vnode = AFS_FS_I(page->mapping->host);
 678                        fscache_wait_on_page_write(vnode->cache, page);
 679                        fscache_uncache_page(vnode->cache, page);
 680                }
 681        }
 682#endif
 683
 684        if (PagePrivate(page))
 685                afs_invalidate_dirty(page, offset, length);
 686
 687        _leave("");
 688}
 689
 690/*
 691 * release a page and clean up its private state if it's not busy
 692 * - return true if the page can now be released, false if not
 693 */
 694static int afs_releasepage(struct page *page, gfp_t gfp_flags)
 695{
 696        struct afs_vnode *vnode = AFS_FS_I(page->mapping->host);
 697        unsigned long priv;
 698
 699        _enter("{{%llx:%llu}[%lu],%lx},%x",
 700               vnode->fid.vid, vnode->fid.vnode, page->index, page->flags,
 701               gfp_flags);
 702
 703        /* deny if page is being written to the cache and the caller hasn't
 704         * elected to wait */
 705#ifdef CONFIG_AFS_FSCACHE
 706        if (!fscache_maybe_release_page(vnode->cache, page, gfp_flags)) {
 707                _leave(" = F [cache busy]");
 708                return 0;
 709        }
 710#endif
 711
 712        if (PagePrivate(page)) {
 713                priv = (unsigned long)detach_page_private(page);
 714                trace_afs_page_dirty(vnode, tracepoint_string("rel"),
 715                                     page->index, priv);
 716        }
 717
 718        /* indicate that the page can be released */
 719        _leave(" = T");
 720        return 1;
 721}
 722
 723/*
 724 * Handle setting up a memory mapping on an AFS file.
 725 */
 726static int afs_file_mmap(struct file *file, struct vm_area_struct *vma)
 727{
 728        int ret;
 729
 730        ret = generic_file_mmap(file, vma);
 731        if (ret == 0)
 732                vma->vm_ops = &afs_vm_ops;
 733        return ret;
 734}
 735