linux/fs/xfs/linux-2.6/xfs_fs_subr.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2002,2005-2006 Silicon Graphics, Inc.
   3 * All Rights Reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it would be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write the Free Software Foundation,
  16 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  17 */
  18#include "xfs.h"
  19#include "xfs_vnodeops.h"
  20#include "xfs_bmap_btree.h"
  21#include "xfs_inode.h"
  22#include "xfs_trace.h"
  23
  24/*
  25 * note: all filemap functions return negative error codes. These
  26 * need to be inverted before returning to the xfs core functions.
  27 */
  28void
  29xfs_tosspages(
  30        xfs_inode_t     *ip,
  31        xfs_off_t       first,
  32        xfs_off_t       last,
  33        int             fiopt)
  34{
  35        /* can't toss partial tail pages, so mask them out */
  36        last &= ~(PAGE_SIZE - 1);
  37        truncate_inode_pages_range(VFS_I(ip)->i_mapping, first, last - 1);
  38}
  39
  40int
  41xfs_flushinval_pages(
  42        xfs_inode_t     *ip,
  43        xfs_off_t       first,
  44        xfs_off_t       last,
  45        int             fiopt)
  46{
  47        struct address_space *mapping = VFS_I(ip)->i_mapping;
  48        int             ret = 0;
  49
  50        trace_xfs_pagecache_inval(ip, first, last);
  51
  52        xfs_iflags_clear(ip, XFS_ITRUNCATED);
  53        ret = filemap_write_and_wait_range(mapping, first,
  54                                last == -1 ? LLONG_MAX : last);
  55        if (!ret)
  56                truncate_inode_pages_range(mapping, first, last);
  57        return -ret;
  58}
  59
  60int
  61xfs_flush_pages(
  62        xfs_inode_t     *ip,
  63        xfs_off_t       first,
  64        xfs_off_t       last,
  65        uint64_t        flags,
  66        int             fiopt)
  67{
  68        struct address_space *mapping = VFS_I(ip)->i_mapping;
  69        int             ret = 0;
  70        int             ret2;
  71
  72        xfs_iflags_clear(ip, XFS_ITRUNCATED);
  73        ret = -filemap_fdatawrite_range(mapping, first,
  74                                last == -1 ? LLONG_MAX : last);
  75        if (flags & XBF_ASYNC)
  76                return ret;
  77        ret2 = xfs_wait_on_pages(ip, first, last);
  78        if (!ret)
  79                ret = ret2;
  80        return ret;
  81}
  82
  83int
  84xfs_wait_on_pages(
  85        xfs_inode_t     *ip,
  86        xfs_off_t       first,
  87        xfs_off_t       last)
  88{
  89        struct address_space *mapping = VFS_I(ip)->i_mapping;
  90
  91        if (mapping_tagged(mapping, PAGECACHE_TAG_WRITEBACK)) {
  92                return -filemap_fdatawait_range(mapping, first,
  93                                        last == -1 ? ip->i_size - 1 : last);
  94        }
  95        return 0;
  96}
  97