LCOV - code coverage report
Current view: top level - fs/nfs - file.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 255 0.0 %
Date: 2014-02-18 Functions: 0 29 0.0 %
Branches: 0 203 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  *  linux/fs/nfs/file.c
       3                 :            :  *
       4                 :            :  *  Copyright (C) 1992  Rick Sladkey
       5                 :            :  *
       6                 :            :  *  Changes Copyright (C) 1994 by Florian La Roche
       7                 :            :  *   - Do not copy data too often around in the kernel.
       8                 :            :  *   - In nfs_file_read the return value of kmalloc wasn't checked.
       9                 :            :  *   - Put in a better version of read look-ahead buffering. Original idea
      10                 :            :  *     and implementation by Wai S Kok elekokws@ee.nus.sg.
      11                 :            :  *
      12                 :            :  *  Expire cache on write to a file by Wai S Kok (Oct 1994).
      13                 :            :  *
      14                 :            :  *  Total rewrite of read side for new NFS buffer cache.. Linus.
      15                 :            :  *
      16                 :            :  *  nfs regular file handling functions
      17                 :            :  */
      18                 :            : 
      19                 :            : #include <linux/module.h>
      20                 :            : #include <linux/time.h>
      21                 :            : #include <linux/kernel.h>
      22                 :            : #include <linux/errno.h>
      23                 :            : #include <linux/fcntl.h>
      24                 :            : #include <linux/stat.h>
      25                 :            : #include <linux/nfs_fs.h>
      26                 :            : #include <linux/nfs_mount.h>
      27                 :            : #include <linux/mm.h>
      28                 :            : #include <linux/pagemap.h>
      29                 :            : #include <linux/aio.h>
      30                 :            : #include <linux/gfp.h>
      31                 :            : #include <linux/swap.h>
      32                 :            : 
      33                 :            : #include <asm/uaccess.h>
      34                 :            : 
      35                 :            : #include "delegation.h"
      36                 :            : #include "internal.h"
      37                 :            : #include "iostat.h"
      38                 :            : #include "fscache.h"
      39                 :            : 
      40                 :            : #include "nfstrace.h"
      41                 :            : 
      42                 :            : #define NFSDBG_FACILITY         NFSDBG_FILE
      43                 :            : 
      44                 :            : static const struct vm_operations_struct nfs_file_vm_ops;
      45                 :            : 
      46                 :            : /* Hack for future NFS swap support */
      47                 :            : #ifndef IS_SWAPFILE
      48                 :            : # define IS_SWAPFILE(inode)     (0)
      49                 :            : #endif
      50                 :            : 
      51                 :          0 : int nfs_check_flags(int flags)
      52                 :            : {
      53 [ #  # ][ #  # ]:          0 :         if ((flags & (O_APPEND | O_DIRECT)) == (O_APPEND | O_DIRECT))
      54                 :            :                 return -EINVAL;
      55                 :            : 
      56                 :          0 :         return 0;
      57                 :            : }
      58                 :            : EXPORT_SYMBOL_GPL(nfs_check_flags);
      59                 :            : 
      60                 :            : /*
      61                 :            :  * Open file
      62                 :            :  */
      63                 :            : static int
      64                 :          0 : nfs_file_open(struct inode *inode, struct file *filp)
      65                 :            : {
      66                 :            :         int res;
      67                 :            : 
      68                 :            :         dprintk("NFS: open file(%pD2)\n", filp);
      69                 :            : 
      70                 :            :         nfs_inc_stats(inode, NFSIOS_VFSOPEN);
      71                 :          0 :         res = nfs_check_flags(filp->f_flags);
      72         [ #  # ]:          0 :         if (res)
      73                 :            :                 return res;
      74                 :            : 
      75                 :          0 :         res = nfs_open(inode, filp);
      76                 :          0 :         return res;
      77                 :            : }
      78                 :            : 
      79                 :            : int
      80                 :          0 : nfs_file_release(struct inode *inode, struct file *filp)
      81                 :            : {
      82                 :            :         dprintk("NFS: release(%pD2)\n", filp);
      83                 :            : 
      84                 :            :         nfs_inc_stats(inode, NFSIOS_VFSRELEASE);
      85                 :          0 :         return nfs_release(inode, filp);
      86                 :            : }
      87                 :            : EXPORT_SYMBOL_GPL(nfs_file_release);
      88                 :            : 
      89                 :            : /**
      90                 :            :  * nfs_revalidate_size - Revalidate the file size
      91                 :            :  * @inode - pointer to inode struct
      92                 :            :  * @file - pointer to struct file
      93                 :            :  *
      94                 :            :  * Revalidates the file length. This is basically a wrapper around
      95                 :            :  * nfs_revalidate_inode() that takes into account the fact that we may
      96                 :            :  * have cached writes (in which case we don't care about the server's
      97                 :            :  * idea of what the file length is), or O_DIRECT (in which case we
      98                 :            :  * shouldn't trust the cache).
      99                 :            :  */
     100                 :          0 : static int nfs_revalidate_file_size(struct inode *inode, struct file *filp)
     101                 :            : {
     102                 :            :         struct nfs_server *server = NFS_SERVER(inode);
     103                 :            :         struct nfs_inode *nfsi = NFS_I(inode);
     104                 :            : 
     105         [ #  # ]:          0 :         if (nfs_have_delegated_attributes(inode))
     106                 :            :                 goto out_noreval;
     107                 :            : 
     108         [ #  # ]:          0 :         if (filp->f_flags & O_DIRECT)
     109                 :            :                 goto force_reval;
     110         [ #  # ]:          0 :         if (nfsi->cache_validity & NFS_INO_REVAL_PAGECACHE)
     111                 :            :                 goto force_reval;
     112         [ #  # ]:          0 :         if (nfs_attribute_timeout(inode))
     113                 :            :                 goto force_reval;
     114                 :            : out_noreval:
     115                 :            :         return 0;
     116                 :            : force_reval:
     117                 :          0 :         return __nfs_revalidate_inode(server, inode);
     118                 :            : }
     119                 :            : 
     120                 :          0 : loff_t nfs_file_llseek(struct file *filp, loff_t offset, int whence)
     121                 :            : {
     122                 :            :         dprintk("NFS: llseek file(%pD2, %lld, %d)\n",
     123                 :            :                         filp, offset, whence);
     124                 :            : 
     125                 :            :         /*
     126                 :            :          * whence == SEEK_END || SEEK_DATA || SEEK_HOLE => we must revalidate
     127                 :            :          * the cached file length
     128                 :            :          */
     129         [ #  # ]:          0 :         if (whence != SEEK_SET && whence != SEEK_CUR) {
     130                 :          0 :                 struct inode *inode = filp->f_mapping->host;
     131                 :            : 
     132                 :          0 :                 int retval = nfs_revalidate_file_size(inode, filp);
     133         [ #  # ]:          0 :                 if (retval < 0)
     134                 :          0 :                         return (loff_t)retval;
     135                 :            :         }
     136                 :            : 
     137                 :          0 :         return generic_file_llseek(filp, offset, whence);
     138                 :            : }
     139                 :            : EXPORT_SYMBOL_GPL(nfs_file_llseek);
     140                 :            : 
     141                 :            : /*
     142                 :            :  * Flush all dirty pages, and check for write errors.
     143                 :            :  */
     144                 :            : int
     145                 :          0 : nfs_file_flush(struct file *file, fl_owner_t id)
     146                 :            : {
     147                 :            :         struct inode    *inode = file_inode(file);
     148                 :            : 
     149                 :            :         dprintk("NFS: flush(%pD2)\n", file);
     150                 :            : 
     151                 :            :         nfs_inc_stats(inode, NFSIOS_VFSFLUSH);
     152         [ #  # ]:          0 :         if ((file->f_mode & FMODE_WRITE) == 0)
     153                 :            :                 return 0;
     154                 :            : 
     155                 :            :         /*
     156                 :            :          * If we're holding a write delegation, then just start the i/o
     157                 :            :          * but don't wait for completion (or send a commit).
     158                 :            :          */
     159         [ #  # ]:          0 :         if (NFS_PROTO(inode)->have_delegation(inode, FMODE_WRITE))
     160                 :          0 :                 return filemap_fdatawrite(file->f_mapping);
     161                 :            : 
     162                 :            :         /* Flush writes to the server and return any errors */
     163                 :          0 :         return vfs_fsync(file, 0);
     164                 :            : }
     165                 :            : EXPORT_SYMBOL_GPL(nfs_file_flush);
     166                 :            : 
     167                 :            : ssize_t
     168                 :          0 : nfs_file_read(struct kiocb *iocb, const struct iovec *iov,
     169                 :            :                 unsigned long nr_segs, loff_t pos)
     170                 :            : {
     171                 :          0 :         struct inode *inode = file_inode(iocb->ki_filp);
     172                 :            :         ssize_t result;
     173                 :            : 
     174         [ #  # ]:          0 :         if (iocb->ki_filp->f_flags & O_DIRECT)
     175                 :          0 :                 return nfs_file_direct_read(iocb, iov, nr_segs, pos, true);
     176                 :            : 
     177                 :            :         dprintk("NFS: read(%pD2, %lu@%lu)\n",
     178                 :            :                 iocb->ki_filp,
     179                 :            :                 (unsigned long) iov_length(iov, nr_segs), (unsigned long) pos);
     180                 :            : 
     181                 :          0 :         result = nfs_revalidate_mapping(inode, iocb->ki_filp->f_mapping);
     182         [ #  # ]:          0 :         if (!result) {
     183                 :          0 :                 result = generic_file_aio_read(iocb, iov, nr_segs, pos);
     184         [ #  # ]:          0 :                 if (result > 0)
     185                 :            :                         nfs_add_stats(inode, NFSIOS_NORMALREADBYTES, result);
     186                 :            :         }
     187                 :          0 :         return result;
     188                 :            : }
     189                 :            : EXPORT_SYMBOL_GPL(nfs_file_read);
     190                 :            : 
     191                 :            : ssize_t
     192                 :          0 : nfs_file_splice_read(struct file *filp, loff_t *ppos,
     193                 :            :                      struct pipe_inode_info *pipe, size_t count,
     194                 :            :                      unsigned int flags)
     195                 :            : {
     196                 :            :         struct inode *inode = file_inode(filp);
     197                 :            :         ssize_t res;
     198                 :            : 
     199                 :            :         dprintk("NFS: splice_read(%pD2, %lu@%Lu)\n",
     200                 :            :                 filp, (unsigned long) count, (unsigned long long) *ppos);
     201                 :            : 
     202                 :          0 :         res = nfs_revalidate_mapping(inode, filp->f_mapping);
     203         [ #  # ]:          0 :         if (!res) {
     204                 :          0 :                 res = generic_file_splice_read(filp, ppos, pipe, count, flags);
     205         [ #  # ]:          0 :                 if (res > 0)
     206                 :            :                         nfs_add_stats(inode, NFSIOS_NORMALREADBYTES, res);
     207                 :            :         }
     208                 :          0 :         return res;
     209                 :            : }
     210                 :            : EXPORT_SYMBOL_GPL(nfs_file_splice_read);
     211                 :            : 
     212                 :            : int
     213                 :          0 : nfs_file_mmap(struct file * file, struct vm_area_struct * vma)
     214                 :            : {
     215                 :            :         struct inode *inode = file_inode(file);
     216                 :            :         int     status;
     217                 :            : 
     218                 :            :         dprintk("NFS: mmap(%pD2)\n", file);
     219                 :            : 
     220                 :            :         /* Note: generic_file_mmap() returns ENOSYS on nommu systems
     221                 :            :          *       so we call that before revalidating the mapping
     222                 :            :          */
     223                 :          0 :         status = generic_file_mmap(file, vma);
     224         [ #  # ]:          0 :         if (!status) {
     225                 :          0 :                 vma->vm_ops = &nfs_file_vm_ops;
     226                 :          0 :                 status = nfs_revalidate_mapping(inode, file->f_mapping);
     227                 :            :         }
     228                 :          0 :         return status;
     229                 :            : }
     230                 :            : EXPORT_SYMBOL_GPL(nfs_file_mmap);
     231                 :            : 
     232                 :            : /*
     233                 :            :  * Flush any dirty pages for this process, and check for write errors.
     234                 :            :  * The return status from this call provides a reliable indication of
     235                 :            :  * whether any write errors occurred for this process.
     236                 :            :  *
     237                 :            :  * Notice that it clears the NFS_CONTEXT_ERROR_WRITE before synching to
     238                 :            :  * disk, but it retrieves and clears ctx->error after synching, despite
     239                 :            :  * the two being set at the same time in nfs_context_set_write_error().
     240                 :            :  * This is because the former is used to notify the _next_ call to
     241                 :            :  * nfs_file_write() that a write error occurred, and hence cause it to
     242                 :            :  * fall back to doing a synchronous write.
     243                 :            :  */
     244                 :            : int
     245                 :          0 : nfs_file_fsync_commit(struct file *file, loff_t start, loff_t end, int datasync)
     246                 :            : {
     247                 :            :         struct nfs_open_context *ctx = nfs_file_open_context(file);
     248                 :            :         struct inode *inode = file_inode(file);
     249                 :            :         int have_error, do_resend, status;
     250                 :            :         int ret = 0;
     251                 :            : 
     252                 :            :         dprintk("NFS: fsync file(%pD2) datasync %d\n", file, datasync);
     253                 :            : 
     254                 :            :         nfs_inc_stats(inode, NFSIOS_VFSFSYNC);
     255                 :          0 :         do_resend = test_and_clear_bit(NFS_CONTEXT_RESEND_WRITES, &ctx->flags);
     256                 :          0 :         have_error = test_and_clear_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
     257                 :          0 :         status = nfs_commit_inode(inode, FLUSH_SYNC);
     258                 :          0 :         have_error |= test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags);
     259         [ #  # ]:          0 :         if (have_error) {
     260                 :          0 :                 ret = xchg(&ctx->error, 0);
     261         [ #  # ]:          0 :                 if (ret)
     262                 :            :                         goto out;
     263                 :            :         }
     264         [ #  # ]:          0 :         if (status < 0) {
     265                 :            :                 ret = status;
     266                 :            :                 goto out;
     267                 :            :         }
     268                 :          0 :         do_resend |= test_bit(NFS_CONTEXT_RESEND_WRITES, &ctx->flags);
     269         [ #  # ]:          0 :         if (do_resend)
     270                 :            :                 ret = -EAGAIN;
     271                 :            : out:
     272                 :          0 :         return ret;
     273                 :            : }
     274                 :            : EXPORT_SYMBOL_GPL(nfs_file_fsync_commit);
     275                 :            : 
     276                 :            : static int
     277                 :          0 : nfs_file_fsync(struct file *file, loff_t start, loff_t end, int datasync)
     278                 :            : {
     279                 :            :         int ret;
     280                 :            :         struct inode *inode = file_inode(file);
     281                 :            : 
     282                 :            :         trace_nfs_fsync_enter(inode);
     283                 :            : 
     284                 :            :         do {
     285                 :          0 :                 ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
     286         [ #  # ]:          0 :                 if (ret != 0)
     287                 :            :                         break;
     288                 :          0 :                 mutex_lock(&inode->i_mutex);
     289                 :          0 :                 ret = nfs_file_fsync_commit(file, start, end, datasync);
     290                 :          0 :                 mutex_unlock(&inode->i_mutex);
     291                 :            :                 /*
     292                 :            :                  * If nfs_file_fsync_commit detected a server reboot, then
     293                 :            :                  * resend all dirty pages that might have been covered by
     294                 :            :                  * the NFS_CONTEXT_RESEND_WRITES flag
     295                 :            :                  */
     296                 :            :                 start = 0;
     297                 :            :                 end = LLONG_MAX;
     298         [ #  # ]:          0 :         } while (ret == -EAGAIN);
     299                 :            : 
     300                 :            :         trace_nfs_fsync_exit(inode, ret);
     301                 :          0 :         return ret;
     302                 :            : }
     303                 :            : 
     304                 :            : /*
     305                 :            :  * Decide whether a read/modify/write cycle may be more efficient
     306                 :            :  * then a modify/write/read cycle when writing to a page in the
     307                 :            :  * page cache.
     308                 :            :  *
     309                 :            :  * The modify/write/read cycle may occur if a page is read before
     310                 :            :  * being completely filled by the writer.  In this situation, the
     311                 :            :  * page must be completely written to stable storage on the server
     312                 :            :  * before it can be refilled by reading in the page from the server.
     313                 :            :  * This can lead to expensive, small, FILE_SYNC mode writes being
     314                 :            :  * done.
     315                 :            :  *
     316                 :            :  * It may be more efficient to read the page first if the file is
     317                 :            :  * open for reading in addition to writing, the page is not marked
     318                 :            :  * as Uptodate, it is not dirty or waiting to be committed,
     319                 :            :  * indicating that it was previously allocated and then modified,
     320                 :            :  * that there were valid bytes of data in that range of the file,
     321                 :            :  * and that the new data won't completely replace the old data in
     322                 :            :  * that range of the file.
     323                 :            :  */
     324                 :          0 : static int nfs_want_read_modify_write(struct file *file, struct page *page,
     325                 :            :                         loff_t pos, unsigned len)
     326                 :            : {
     327                 :            :         unsigned int pglen = nfs_page_length(page);
     328                 :          0 :         unsigned int offset = pos & (PAGE_CACHE_SIZE - 1);
     329                 :          0 :         unsigned int end = offset + len;
     330                 :            : 
     331 [ #  # ][ #  # ]:          0 :         if ((file->f_mode & FMODE_READ) &&       /* open for read? */
     332         [ #  # ]:          0 :             !PageUptodate(page) &&              /* Uptodate? */
     333         [ #  # ]:          0 :             !PagePrivate(page) &&               /* i/o request already? */
     334         [ #  # ]:          0 :             pglen &&                            /* valid bytes of file? */
     335                 :          0 :             (end < pglen || offset))         /* replace all valid bytes? */
     336                 :            :                 return 1;
     337                 :            :         return 0;
     338                 :            : }
     339                 :            : 
     340                 :            : /*
     341                 :            :  * This does the "real" work of the write. We must allocate and lock the
     342                 :            :  * page to be sent back to the generic routine, which then copies the
     343                 :            :  * data from user space.
     344                 :            :  *
     345                 :            :  * If the writer ends up delaying the write, the writer needs to
     346                 :            :  * increment the page use counts until he is done with the page.
     347                 :            :  */
     348                 :          0 : static int nfs_write_begin(struct file *file, struct address_space *mapping,
     349                 :            :                         loff_t pos, unsigned len, unsigned flags,
     350                 :            :                         struct page **pagep, void **fsdata)
     351                 :            : {
     352                 :            :         int ret;
     353                 :          0 :         pgoff_t index = pos >> PAGE_CACHE_SHIFT;
     354                 :            :         struct page *page;
     355                 :            :         int once_thru = 0;
     356                 :            : 
     357                 :            :         dfprintk(PAGECACHE, "NFS: write_begin(%pD2(%ld), %u@%lld)\n",
     358                 :            :                 file, mapping->host->i_ino, len, (long long) pos);
     359                 :            : 
     360                 :            : start:
     361                 :            :         /*
     362                 :            :          * Prevent starvation issues if someone is doing a consistency
     363                 :            :          * sync-to-disk
     364                 :            :          */
     365                 :          0 :         ret = wait_on_bit(&NFS_I(mapping->host)->flags, NFS_INO_FLUSHING,
     366                 :            :                         nfs_wait_bit_killable, TASK_KILLABLE);
     367         [ #  # ]:          0 :         if (ret)
     368                 :            :                 return ret;
     369                 :            : 
     370                 :          0 :         page = grab_cache_page_write_begin(mapping, index, flags);
     371         [ #  # ]:          0 :         if (!page)
     372                 :            :                 return -ENOMEM;
     373                 :          0 :         *pagep = page;
     374                 :            : 
     375                 :          0 :         ret = nfs_flush_incompatible(file, page);
     376         [ #  # ]:          0 :         if (ret) {
     377                 :          0 :                 unlock_page(page);
     378                 :          0 :                 page_cache_release(page);
     379   [ #  #  #  # ]:          0 :         } else if (!once_thru &&
     380                 :          0 :                    nfs_want_read_modify_write(file, page, pos, len)) {
     381                 :            :                 once_thru = 1;
     382                 :          0 :                 ret = nfs_readpage(file, page);
     383                 :          0 :                 page_cache_release(page);
     384         [ #  # ]:          0 :                 if (!ret)
     385                 :            :                         goto start;
     386                 :            :         }
     387                 :          0 :         return ret;
     388                 :            : }
     389                 :            : 
     390                 :          0 : static int nfs_write_end(struct file *file, struct address_space *mapping,
     391                 :            :                         loff_t pos, unsigned len, unsigned copied,
     392                 :            :                         struct page *page, void *fsdata)
     393                 :            : {
     394                 :          0 :         unsigned offset = pos & (PAGE_CACHE_SIZE - 1);
     395                 :            :         struct nfs_open_context *ctx = nfs_file_open_context(file);
     396                 :            :         int status;
     397                 :            : 
     398                 :            :         dfprintk(PAGECACHE, "NFS: write_end(%pD2(%ld), %u@%lld)\n",
     399                 :            :                 file, mapping->host->i_ino, len, (long long) pos);
     400                 :            : 
     401                 :            :         /*
     402                 :            :          * Zero any uninitialised parts of the page, and then mark the page
     403                 :            :          * as up to date if it turns out that we're extending the file.
     404                 :            :          */
     405         [ #  # ]:          0 :         if (!PageUptodate(page)) {
     406                 :            :                 unsigned pglen = nfs_page_length(page);
     407                 :          0 :                 unsigned end = offset + len;
     408                 :            : 
     409         [ #  # ]:          0 :                 if (pglen == 0) {
     410                 :            :                         zero_user_segments(page, 0, offset,
     411                 :            :                                         end, PAGE_CACHE_SIZE);
     412                 :            :                         SetPageUptodate(page);
     413         [ #  # ]:          0 :                 } else if (end >= pglen) {
     414                 :            :                         zero_user_segment(page, end, PAGE_CACHE_SIZE);
     415         [ #  # ]:          0 :                         if (offset == 0)
     416                 :            :                                 SetPageUptodate(page);
     417                 :            :                 } else
     418                 :            :                         zero_user_segment(page, pglen, PAGE_CACHE_SIZE);
     419                 :            :         }
     420                 :            : 
     421                 :          0 :         status = nfs_updatepage(file, page, offset, copied);
     422                 :            : 
     423                 :          0 :         unlock_page(page);
     424                 :          0 :         page_cache_release(page);
     425                 :            : 
     426         [ #  # ]:          0 :         if (status < 0)
     427                 :            :                 return status;
     428                 :          0 :         NFS_I(mapping->host)->write_io += copied;
     429                 :            : 
     430         [ #  # ]:          0 :         if (nfs_ctx_key_to_expire(ctx)) {
     431                 :          0 :                 status = nfs_wb_all(mapping->host);
     432         [ #  # ]:          0 :                 if (status < 0)
     433                 :            :                         return status;
     434                 :            :         }
     435                 :            : 
     436                 :          0 :         return copied;
     437                 :            : }
     438                 :            : 
     439                 :            : /*
     440                 :            :  * Partially or wholly invalidate a page
     441                 :            :  * - Release the private state associated with a page if undergoing complete
     442                 :            :  *   page invalidation
     443                 :            :  * - Called if either PG_private or PG_fscache is set on the page
     444                 :            :  * - Caller holds page lock
     445                 :            :  */
     446                 :          0 : static void nfs_invalidate_page(struct page *page, unsigned int offset,
     447                 :            :                                 unsigned int length)
     448                 :            : {
     449                 :            :         dfprintk(PAGECACHE, "NFS: invalidate_page(%p, %u, %u)\n",
     450                 :            :                  page, offset, length);
     451                 :            : 
     452         [ #  # ]:          0 :         if (offset != 0 || length < PAGE_CACHE_SIZE)
     453                 :          0 :                 return;
     454                 :            :         /* Cancel any unstarted writes on this page */
     455                 :          0 :         nfs_wb_page_cancel(page_file_mapping(page)->host, page);
     456                 :            : 
     457                 :            :         nfs_fscache_invalidate_page(page, page->mapping->host);
     458                 :            : }
     459                 :            : 
     460                 :            : /*
     461                 :            :  * Attempt to release the private state associated with a page
     462                 :            :  * - Called if either PG_private or PG_fscache is set on the page
     463                 :            :  * - Caller holds page lock
     464                 :            :  * - Return true (may release page) or false (may not)
     465                 :            :  */
     466                 :          0 : static int nfs_release_page(struct page *page, gfp_t gfp)
     467                 :            : {
     468                 :          0 :         struct address_space *mapping = page->mapping;
     469                 :            : 
     470                 :            :         dfprintk(PAGECACHE, "NFS: release_page(%p)\n", page);
     471                 :            : 
     472                 :            :         /* Only do I/O if gfp is a superset of GFP_KERNEL, and we're not
     473                 :            :          * doing this memory reclaim for a fs-related allocation.
     474                 :            :          */
     475 [ #  # ][ #  # ]:          0 :         if (mapping && (gfp & GFP_KERNEL) == GFP_KERNEL &&
                 [ #  # ]
     476                 :          0 :             !(current->flags & PF_FSTRANS)) {
     477                 :            :                 int how = FLUSH_SYNC;
     478                 :            : 
     479                 :            :                 /* Don't let kswapd deadlock waiting for OOM RPC calls */
     480         [ #  # ]:          0 :                 if (current_is_kswapd())
     481                 :            :                         how = 0;
     482                 :          0 :                 nfs_commit_inode(mapping->host, how);
     483                 :            :         }
     484                 :            :         /* If PagePrivate() is set, then the page is not freeable */
     485         [ #  # ]:          0 :         if (PagePrivate(page))
     486                 :            :                 return 0;
     487                 :          0 :         return nfs_fscache_release_page(page, gfp);
     488                 :            : }
     489                 :            : 
     490                 :          0 : static void nfs_check_dirty_writeback(struct page *page,
     491                 :            :                                 bool *dirty, bool *writeback)
     492                 :            : {
     493                 :            :         struct nfs_inode *nfsi;
     494                 :            :         struct address_space *mapping = page_file_mapping(page);
     495                 :            : 
     496 [ #  # ][ #  # ]:          0 :         if (!mapping || PageSwapCache(page))
     497                 :            :                 return;
     498                 :            : 
     499                 :            :         /*
     500                 :            :          * Check if an unstable page is currently being committed and
     501                 :            :          * if so, have the VM treat it as if the page is under writeback
     502                 :            :          * so it will not block due to pages that will shortly be freeable.
     503                 :            :          */
     504                 :          0 :         nfsi = NFS_I(mapping->host);
     505         [ #  # ]:          0 :         if (test_bit(NFS_INO_COMMIT, &nfsi->flags)) {
     506                 :          0 :                 *writeback = true;
     507                 :          0 :                 return;
     508                 :            :         }
     509                 :            : 
     510                 :            :         /*
     511                 :            :          * If PagePrivate() is set, then the page is not freeable and as the
     512                 :            :          * inode is not being committed, it's not going to be cleaned in the
     513                 :            :          * near future so treat it as dirty
     514                 :            :          */
     515         [ #  # ]:          0 :         if (PagePrivate(page))
     516                 :          0 :                 *dirty = true;
     517                 :            : }
     518                 :            : 
     519                 :            : /*
     520                 :            :  * Attempt to clear the private state associated with a page when an error
     521                 :            :  * occurs that requires the cached contents of an inode to be written back or
     522                 :            :  * destroyed
     523                 :            :  * - Called if either PG_private or fscache is set on the page
     524                 :            :  * - Caller holds page lock
     525                 :            :  * - Return 0 if successful, -error otherwise
     526                 :            :  */
     527                 :          0 : static int nfs_launder_page(struct page *page)
     528                 :            : {
     529                 :          0 :         struct inode *inode = page_file_mapping(page)->host;
     530                 :            :         struct nfs_inode *nfsi = NFS_I(inode);
     531                 :            : 
     532                 :            :         dfprintk(PAGECACHE, "NFS: launder_page(%ld, %llu)\n",
     533                 :            :                 inode->i_ino, (long long)page_offset(page));
     534                 :            : 
     535                 :            :         nfs_fscache_wait_on_page_write(nfsi, page);
     536                 :          0 :         return nfs_wb_page(inode, page);
     537                 :            : }
     538                 :            : 
     539                 :            : #ifdef CONFIG_NFS_SWAP
     540                 :            : static int nfs_swap_activate(struct swap_info_struct *sis, struct file *file,
     541                 :            :                                                 sector_t *span)
     542                 :            : {
     543                 :            :         *span = sis->pages;
     544                 :            :         return xs_swapper(NFS_CLIENT(file->f_mapping->host)->cl_xprt, 1);
     545                 :            : }
     546                 :            : 
     547                 :            : static void nfs_swap_deactivate(struct file *file)
     548                 :            : {
     549                 :            :         xs_swapper(NFS_CLIENT(file->f_mapping->host)->cl_xprt, 0);
     550                 :            : }
     551                 :            : #endif
     552                 :            : 
     553                 :            : const struct address_space_operations nfs_file_aops = {
     554                 :            :         .readpage = nfs_readpage,
     555                 :            :         .readpages = nfs_readpages,
     556                 :            :         .set_page_dirty = __set_page_dirty_nobuffers,
     557                 :            :         .writepage = nfs_writepage,
     558                 :            :         .writepages = nfs_writepages,
     559                 :            :         .write_begin = nfs_write_begin,
     560                 :            :         .write_end = nfs_write_end,
     561                 :            :         .invalidatepage = nfs_invalidate_page,
     562                 :            :         .releasepage = nfs_release_page,
     563                 :            :         .direct_IO = nfs_direct_IO,
     564                 :            :         .migratepage = nfs_migrate_page,
     565                 :            :         .launder_page = nfs_launder_page,
     566                 :            :         .is_dirty_writeback = nfs_check_dirty_writeback,
     567                 :            :         .error_remove_page = generic_error_remove_page,
     568                 :            : #ifdef CONFIG_NFS_SWAP
     569                 :            :         .swap_activate = nfs_swap_activate,
     570                 :            :         .swap_deactivate = nfs_swap_deactivate,
     571                 :            : #endif
     572                 :            : };
     573                 :            : 
     574                 :            : /*
     575                 :            :  * Notification that a PTE pointing to an NFS page is about to be made
     576                 :            :  * writable, implying that someone is about to modify the page through a
     577                 :            :  * shared-writable mapping
     578                 :            :  */
     579                 :          0 : static int nfs_vm_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
     580                 :            : {
     581                 :          0 :         struct page *page = vmf->page;
     582                 :          0 :         struct file *filp = vma->vm_file;
     583                 :            :         struct inode *inode = file_inode(filp);
     584                 :            :         unsigned pagelen;
     585                 :            :         int ret = VM_FAULT_NOPAGE;
     586                 :            :         struct address_space *mapping;
     587                 :            : 
     588                 :            :         dfprintk(PAGECACHE, "NFS: vm_page_mkwrite(%pD2(%ld), offset %lld)\n",
     589                 :            :                 filp, filp->f_mapping->host->i_ino,
     590                 :            :                 (long long)page_offset(page));
     591                 :            : 
     592                 :            :         /* make sure the cache has finished storing the page */
     593                 :            :         nfs_fscache_wait_on_page_write(NFS_I(inode), page);
     594                 :            : 
     595                 :            :         lock_page(page);
     596                 :            :         mapping = page_file_mapping(page);
     597         [ #  # ]:          0 :         if (mapping != inode->i_mapping)
     598                 :            :                 goto out_unlock;
     599                 :            : 
     600                 :            :         wait_on_page_writeback(page);
     601                 :            : 
     602                 :            :         pagelen = nfs_page_length(page);
     603         [ #  # ]:          0 :         if (pagelen == 0)
     604                 :            :                 goto out_unlock;
     605                 :            : 
     606                 :            :         ret = VM_FAULT_LOCKED;
     607   [ #  #  #  # ]:          0 :         if (nfs_flush_incompatible(filp, page) == 0 &&
     608                 :          0 :             nfs_updatepage(filp, page, 0, pagelen) == 0)
     609                 :            :                 goto out;
     610                 :            : 
     611                 :            :         ret = VM_FAULT_SIGBUS;
     612                 :            : out_unlock:
     613                 :          0 :         unlock_page(page);
     614                 :            : out:
     615                 :          0 :         return ret;
     616                 :            : }
     617                 :            : 
     618                 :            : static const struct vm_operations_struct nfs_file_vm_ops = {
     619                 :            :         .fault = filemap_fault,
     620                 :            :         .page_mkwrite = nfs_vm_page_mkwrite,
     621                 :            :         .remap_pages = generic_file_remap_pages,
     622                 :            : };
     623                 :            : 
     624                 :          0 : static int nfs_need_sync_write(struct file *filp, struct inode *inode)
     625                 :            : {
     626                 :            :         struct nfs_open_context *ctx;
     627                 :            : 
     628 [ #  # ][ #  # ]:          0 :         if (IS_SYNC(inode) || (filp->f_flags & O_DSYNC))
                 [ #  # ]
     629                 :            :                 return 1;
     630                 :            :         ctx = nfs_file_open_context(filp);
     631   [ #  #  #  # ]:          0 :         if (test_bit(NFS_CONTEXT_ERROR_WRITE, &ctx->flags) ||
     632                 :          0 :             nfs_ctx_key_to_expire(ctx))
     633                 :            :                 return 1;
     634                 :            :         return 0;
     635                 :            : }
     636                 :            : 
     637                 :          0 : ssize_t nfs_file_write(struct kiocb *iocb, const struct iovec *iov,
     638                 :            :                        unsigned long nr_segs, loff_t pos)
     639                 :            : {
     640                 :          0 :         struct file *file = iocb->ki_filp;
     641                 :          0 :         struct inode *inode = file_inode(file);
     642                 :            :         unsigned long written = 0;
     643                 :            :         ssize_t result;
     644                 :            :         size_t count = iov_length(iov, nr_segs);
     645                 :            : 
     646                 :          0 :         result = nfs_key_timeout_notify(file, inode);
     647         [ #  # ]:          0 :         if (result)
     648                 :            :                 return result;
     649                 :            : 
     650         [ #  # ]:          0 :         if (file->f_flags & O_DIRECT)
     651                 :          0 :                 return nfs_file_direct_write(iocb, iov, nr_segs, pos, true);
     652                 :            : 
     653                 :            :         dprintk("NFS: write(%pD2, %lu@%Ld)\n",
     654                 :            :                 file, (unsigned long) count, (long long) pos);
     655                 :            : 
     656                 :            :         result = -EBUSY;
     657         [ #  # ]:          0 :         if (IS_SWAPFILE(inode))
     658                 :            :                 goto out_swapfile;
     659                 :            :         /*
     660                 :            :          * O_APPEND implies that we must revalidate the file length.
     661                 :            :          */
     662         [ #  # ]:          0 :         if (file->f_flags & O_APPEND) {
     663                 :          0 :                 result = nfs_revalidate_file_size(inode, file);
     664         [ #  # ]:          0 :                 if (result)
     665                 :            :                         goto out;
     666                 :            :         }
     667                 :            : 
     668                 :          0 :         result = count;
     669         [ #  # ]:          0 :         if (!count)
     670                 :            :                 goto out;
     671                 :            : 
     672                 :          0 :         result = generic_file_aio_write(iocb, iov, nr_segs, pos);
     673         [ #  # ]:          0 :         if (result > 0)
     674                 :          0 :                 written = result;
     675                 :            : 
     676                 :            :         /* Return error values for O_DSYNC and IS_SYNC() */
     677 [ #  # ][ #  # ]:          0 :         if (result >= 0 && nfs_need_sync_write(file, inode)) {
     678                 :          0 :                 int err = vfs_fsync(file, 0);
     679         [ #  # ]:          0 :                 if (err < 0)
     680                 :            :                         result = err;
     681                 :            :         }
     682         [ #  # ]:          0 :         if (result > 0)
     683                 :          0 :                 nfs_add_stats(inode, NFSIOS_NORMALWRITTENBYTES, written);
     684                 :            : out:
     685                 :          0 :         return result;
     686                 :            : 
     687                 :            : out_swapfile:
     688                 :          0 :         printk(KERN_INFO "NFS: attempt to write to active swap file!\n");
     689                 :          0 :         goto out;
     690                 :            : }
     691                 :            : EXPORT_SYMBOL_GPL(nfs_file_write);
     692                 :            : 
     693                 :          0 : ssize_t nfs_file_splice_write(struct pipe_inode_info *pipe,
     694                 :          0 :                               struct file *filp, loff_t *ppos,
     695                 :            :                               size_t count, unsigned int flags)
     696                 :            : {
     697                 :          0 :         struct inode *inode = file_inode(filp);
     698                 :            :         unsigned long written = 0;
     699                 :            :         ssize_t ret;
     700                 :            : 
     701                 :            :         dprintk("NFS splice_write(%pD2, %lu@%llu)\n",
     702                 :            :                 filp, (unsigned long) count, (unsigned long long) *ppos);
     703                 :            : 
     704                 :            :         /*
     705                 :            :          * The combination of splice and an O_APPEND destination is disallowed.
     706                 :            :          */
     707                 :            : 
     708                 :          0 :         ret = generic_file_splice_write(pipe, filp, ppos, count, flags);
     709         [ #  # ]:          0 :         if (ret > 0)
     710                 :          0 :                 written = ret;
     711                 :            : 
     712 [ #  # ][ #  # ]:          0 :         if (ret >= 0 && nfs_need_sync_write(filp, inode)) {
     713                 :          0 :                 int err = vfs_fsync(filp, 0);
     714         [ #  # ]:          0 :                 if (err < 0)
     715                 :            :                         ret = err;
     716                 :            :         }
     717         [ #  # ]:          0 :         if (ret > 0)
     718                 :          0 :                 nfs_add_stats(inode, NFSIOS_NORMALWRITTENBYTES, written);
     719                 :          0 :         return ret;
     720                 :            : }
     721                 :            : EXPORT_SYMBOL_GPL(nfs_file_splice_write);
     722                 :            : 
     723                 :            : static int
     724                 :          0 : do_getlk(struct file *filp, int cmd, struct file_lock *fl, int is_local)
     725                 :            : {
     726                 :          0 :         struct inode *inode = filp->f_mapping->host;
     727                 :            :         int status = 0;
     728                 :          0 :         unsigned int saved_type = fl->fl_type;
     729                 :            : 
     730                 :            :         /* Try local locking first */
     731                 :          0 :         posix_test_lock(filp, fl);
     732         [ #  # ]:          0 :         if (fl->fl_type != F_UNLCK) {
     733                 :            :                 /* found a conflict */
     734                 :            :                 goto out;
     735                 :            :         }
     736                 :          0 :         fl->fl_type = saved_type;
     737                 :            : 
     738         [ #  # ]:          0 :         if (NFS_PROTO(inode)->have_delegation(inode, FMODE_READ))
     739                 :            :                 goto out_noconflict;
     740                 :            : 
     741         [ #  # ]:          0 :         if (is_local)
     742                 :            :                 goto out_noconflict;
     743                 :            : 
     744                 :          0 :         status = NFS_PROTO(inode)->lock(filp, cmd, fl);
     745                 :            : out:
     746                 :          0 :         return status;
     747                 :            : out_noconflict:
     748                 :          0 :         fl->fl_type = F_UNLCK;
     749                 :          0 :         goto out;
     750                 :            : }
     751                 :            : 
     752                 :          0 : static int do_vfs_lock(struct file *file, struct file_lock *fl)
     753                 :            : {
     754                 :            :         int res = 0;
     755      [ #  #  # ]:          0 :         switch (fl->fl_flags & (FL_POSIX|FL_FLOCK)) {
     756                 :            :                 case FL_POSIX:
     757                 :          0 :                         res = posix_lock_file_wait(file, fl);
     758                 :          0 :                         break;
     759                 :            :                 case FL_FLOCK:
     760                 :          0 :                         res = flock_lock_file_wait(file, fl);
     761                 :          0 :                         break;
     762                 :            :                 default:
     763                 :          0 :                         BUG();
     764                 :            :         }
     765                 :          0 :         return res;
     766                 :            : }
     767                 :            : 
     768                 :            : static int
     769                 :          0 : do_unlk(struct file *filp, int cmd, struct file_lock *fl, int is_local)
     770                 :            : {
     771                 :          0 :         struct inode *inode = filp->f_mapping->host;
     772                 :            :         struct nfs_lock_context *l_ctx;
     773                 :            :         int status;
     774                 :            : 
     775                 :            :         /*
     776                 :            :          * Flush all pending writes before doing anything
     777                 :            :          * with locks..
     778                 :            :          */
     779                 :          0 :         nfs_sync_mapping(filp->f_mapping);
     780                 :            : 
     781                 :          0 :         l_ctx = nfs_get_lock_context(nfs_file_open_context(filp));
     782         [ #  # ]:          0 :         if (!IS_ERR(l_ctx)) {
     783                 :          0 :                 status = nfs_iocounter_wait(&l_ctx->io_count);
     784                 :          0 :                 nfs_put_lock_context(l_ctx);
     785         [ #  # ]:          0 :                 if (status < 0)
     786                 :            :                         return status;
     787                 :            :         }
     788                 :            : 
     789                 :            :         /* NOTE: special case
     790                 :            :          *      If we're signalled while cleaning up locks on process exit, we
     791                 :            :          *      still need to complete the unlock.
     792                 :            :          */
     793                 :            :         /*
     794                 :            :          * Use local locking if mounted with "-onolock" or with appropriate
     795                 :            :          * "-olocal_lock="
     796                 :            :          */
     797         [ #  # ]:          0 :         if (!is_local)
     798                 :          0 :                 status = NFS_PROTO(inode)->lock(filp, cmd, fl);
     799                 :            :         else
     800                 :          0 :                 status = do_vfs_lock(filp, fl);
     801                 :          0 :         return status;
     802                 :            : }
     803                 :            : 
     804                 :            : static int
     805                 :            : is_time_granular(struct timespec *ts) {
     806 [ #  # ][ #  # ]:          0 :         return ((ts->tv_sec == 0) && (ts->tv_nsec <= 1000));
     807                 :            : }
     808                 :            : 
     809                 :            : static int
     810                 :          0 : do_setlk(struct file *filp, int cmd, struct file_lock *fl, int is_local)
     811                 :            : {
     812                 :          0 :         struct inode *inode = filp->f_mapping->host;
     813                 :            :         int status;
     814                 :            : 
     815                 :            :         /*
     816                 :            :          * Flush all pending writes before doing anything
     817                 :            :          * with locks..
     818                 :            :          */
     819                 :          0 :         status = nfs_sync_mapping(filp->f_mapping);
     820         [ #  # ]:          0 :         if (status != 0)
     821                 :            :                 goto out;
     822                 :            : 
     823                 :            :         /*
     824                 :            :          * Use local locking if mounted with "-onolock" or with appropriate
     825                 :            :          * "-olocal_lock="
     826                 :            :          */
     827         [ #  # ]:          0 :         if (!is_local)
     828                 :          0 :                 status = NFS_PROTO(inode)->lock(filp, cmd, fl);
     829                 :            :         else
     830                 :          0 :                 status = do_vfs_lock(filp, fl);
     831         [ #  # ]:          0 :         if (status < 0)
     832                 :            :                 goto out;
     833                 :            : 
     834                 :            :         /*
     835                 :            :          * Revalidate the cache if the server has time stamps granular
     836                 :            :          * enough to detect subsecond changes.  Otherwise, clear the
     837                 :            :          * cache to prevent missing any changes.
     838                 :            :          *
     839                 :            :          * This makes locking act as a cache coherency point.
     840                 :            :          */
     841                 :          0 :         nfs_sync_mapping(filp->f_mapping);
     842         [ #  # ]:          0 :         if (!NFS_PROTO(inode)->have_delegation(inode, FMODE_READ)) {
     843         [ #  # ]:          0 :                 if (is_time_granular(&NFS_SERVER(inode)->time_delta))
     844                 :          0 :                         __nfs_revalidate_inode(NFS_SERVER(inode), inode);
     845                 :            :                 else
     846                 :          0 :                         nfs_zap_caches(inode);
     847                 :            :         }
     848                 :            : out:
     849                 :          0 :         return status;
     850                 :            : }
     851                 :            : 
     852                 :            : /*
     853                 :            :  * Lock a (portion of) a file
     854                 :            :  */
     855                 :          0 : int nfs_lock(struct file *filp, int cmd, struct file_lock *fl)
     856                 :            : {
     857                 :          0 :         struct inode *inode = filp->f_mapping->host;
     858                 :            :         int ret = -ENOLCK;
     859                 :            :         int is_local = 0;
     860                 :            : 
     861                 :            :         dprintk("NFS: lock(%pD2, t=%x, fl=%x, r=%lld:%lld)\n",
     862                 :            :                         filp, fl->fl_type, fl->fl_flags,
     863                 :            :                         (long long)fl->fl_start, (long long)fl->fl_end);
     864                 :            : 
     865                 :            :         nfs_inc_stats(inode, NFSIOS_VFSLOCK);
     866                 :            : 
     867                 :            :         /* No mandatory locks over NFS */
     868 [ #  # ][ #  # ]:          0 :         if (__mandatory_lock(inode) && fl->fl_type != F_UNLCK)
     869                 :            :                 goto out_err;
     870                 :            : 
     871         [ #  # ]:          0 :         if (NFS_SERVER(inode)->flags & NFS_MOUNT_LOCAL_FCNTL)
     872                 :            :                 is_local = 1;
     873                 :            : 
     874         [ #  # ]:          0 :         if (NFS_PROTO(inode)->lock_check_bounds != NULL) {
     875                 :          0 :                 ret = NFS_PROTO(inode)->lock_check_bounds(fl);
     876         [ #  # ]:          0 :                 if (ret < 0)
     877                 :            :                         goto out_err;
     878                 :            :         }
     879                 :            : 
     880         [ #  # ]:          0 :         if (IS_GETLK(cmd))
     881                 :          0 :                 ret = do_getlk(filp, cmd, fl, is_local);
     882         [ #  # ]:          0 :         else if (fl->fl_type == F_UNLCK)
     883                 :          0 :                 ret = do_unlk(filp, cmd, fl, is_local);
     884                 :            :         else
     885                 :          0 :                 ret = do_setlk(filp, cmd, fl, is_local);
     886                 :            : out_err:
     887                 :          0 :         return ret;
     888                 :            : }
     889                 :            : EXPORT_SYMBOL_GPL(nfs_lock);
     890                 :            : 
     891                 :            : /*
     892                 :            :  * Lock a (portion of) a file
     893                 :            :  */
     894                 :          0 : int nfs_flock(struct file *filp, int cmd, struct file_lock *fl)
     895                 :            : {
     896                 :          0 :         struct inode *inode = filp->f_mapping->host;
     897                 :            :         int is_local = 0;
     898                 :            : 
     899                 :            :         dprintk("NFS: flock(%pD2, t=%x, fl=%x)\n",
     900                 :            :                         filp, fl->fl_type, fl->fl_flags);
     901                 :            : 
     902         [ #  # ]:          0 :         if (!(fl->fl_flags & FL_FLOCK))
     903                 :            :                 return -ENOLCK;
     904                 :            : 
     905                 :            :         /*
     906                 :            :          * The NFSv4 protocol doesn't support LOCK_MAND, which is not part of
     907                 :            :          * any standard. In principle we might be able to support LOCK_MAND
     908                 :            :          * on NFSv2/3 since NLMv3/4 support DOS share modes, but for now the
     909                 :            :          * NFS code is not set up for it.
     910                 :            :          */
     911         [ #  # ]:          0 :         if (fl->fl_type & LOCK_MAND)
     912                 :            :                 return -EINVAL;
     913                 :            : 
     914         [ #  # ]:          0 :         if (NFS_SERVER(inode)->flags & NFS_MOUNT_LOCAL_FLOCK)
     915                 :            :                 is_local = 1;
     916                 :            : 
     917                 :            :         /* We're simulating flock() locks using posix locks on the server */
     918                 :          0 :         fl->fl_owner = (fl_owner_t)filp;
     919                 :          0 :         fl->fl_start = 0;
     920                 :          0 :         fl->fl_end = OFFSET_MAX;
     921                 :            : 
     922         [ #  # ]:          0 :         if (fl->fl_type == F_UNLCK)
     923                 :          0 :                 return do_unlk(filp, cmd, fl, is_local);
     924                 :          0 :         return do_setlk(filp, cmd, fl, is_local);
     925                 :            : }
     926                 :            : EXPORT_SYMBOL_GPL(nfs_flock);
     927                 :            : 
     928                 :            : /*
     929                 :            :  * There is no protocol support for leases, so we have no way to implement
     930                 :            :  * them correctly in the face of opens by other clients.
     931                 :            :  */
     932                 :          0 : int nfs_setlease(struct file *file, long arg, struct file_lock **fl)
     933                 :            : {
     934                 :            :         dprintk("NFS: setlease(%pD2, arg=%ld)\n", file, arg);
     935                 :          0 :         return -EINVAL;
     936                 :            : }
     937                 :            : EXPORT_SYMBOL_GPL(nfs_setlease);
     938                 :            : 
     939                 :            : const struct file_operations nfs_file_operations = {
     940                 :            :         .llseek         = nfs_file_llseek,
     941                 :            :         .read           = do_sync_read,
     942                 :            :         .write          = do_sync_write,
     943                 :            :         .aio_read       = nfs_file_read,
     944                 :            :         .aio_write      = nfs_file_write,
     945                 :            :         .mmap           = nfs_file_mmap,
     946                 :            :         .open           = nfs_file_open,
     947                 :            :         .flush          = nfs_file_flush,
     948                 :            :         .release        = nfs_file_release,
     949                 :            :         .fsync          = nfs_file_fsync,
     950                 :            :         .lock           = nfs_lock,
     951                 :            :         .flock          = nfs_flock,
     952                 :            :         .splice_read    = nfs_file_splice_read,
     953                 :            :         .splice_write   = nfs_file_splice_write,
     954                 :            :         .check_flags    = nfs_check_flags,
     955                 :            :         .setlease       = nfs_setlease,
     956                 :            : };
     957                 :            : EXPORT_SYMBOL_GPL(nfs_file_operations);

Generated by: LCOV version 1.9