~ubuntu-branches/ubuntu/raring/openafs/raring

« back to all changes in this revision

Viewing changes to .pc/3.8-compat/src/afs/LINUX/osi_vm.c

  • Committer: Package Import Robot
  • Author(s): Luke Faraone
  • Date: 2013-03-05 01:01:49 UTC
  • mfrom: (44.1.1 raring-proposed)
  • Revision ID: package-import@ubuntu.com-20130305010149-3ui1dhq9a2fw9abp
Tags: 1.6.2-1+ubuntu2
Explicitly include -pthread in UAFS_XLIBS to fix build failure

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright 2000, International Business Machines Corporation and others.
 
3
 * All Rights Reserved.
 
4
 * 
 
5
 * This software has been released under the terms of the IBM Public
 
6
 * License.  For details, see the LICENSE file in the top-level source
 
7
 * directory or online at http://www.openafs.org/dl/license10.html
 
8
 */
 
9
 
 
10
#include <afsconfig.h>
 
11
#include "afs/param.h"
 
12
 
 
13
 
 
14
#include "afs/sysincludes.h"    /* Standard vendor system headers */
 
15
#include "afsincludes.h"        /* Afs-based standard headers */
 
16
#include "afs/afs_stats.h"      /* statistics */
 
17
 
 
18
#include "osi_compat.h"
 
19
 
 
20
/* Linux VM operations
 
21
 *
 
22
 * The general model for Linux is to treat vm as a cache that's:
 
23
 * 1) explicitly updated by AFS when AFS writes the data to the cache file.
 
24
 * 2) reads go through the cache. A cache miss is satisfied by the filesystem.
 
25
 *
 
26
 * This means flushing VM is not required on this OS.
 
27
 */
 
28
 
 
29
/* Try to discard pages, in order to recycle a vcache entry.
 
30
 *
 
31
 * We also make some sanity checks:  ref count, open count, held locks.
 
32
 *
 
33
 * We also do some non-VM-related chores, such as releasing the cred pointer
 
34
 * (for AIX and Solaris) and releasing the gnode (for AIX).
 
35
 *
 
36
 * Locking:  afs_xvcache lock is held.  If it is dropped and re-acquired,
 
37
 *   *slept should be set to warn the caller.
 
38
 *
 
39
 * Formerly, afs_xvcache was dropped and re-acquired for Solaris, but now it
 
40
 * is not dropped and re-acquired for any platform.  It may be that *slept is
 
41
 * therefore obsolescent.
 
42
 */
 
43
int
 
44
osi_VM_FlushVCache(struct vcache *avc, int *slept)
 
45
{
 
46
    struct inode *ip = AFSTOV(avc);
 
47
 
 
48
    if (VREFCOUNT(avc) > 1)
 
49
        return EBUSY;
 
50
 
 
51
    if (avc->opens != 0)
 
52
        return EBUSY;
 
53
 
 
54
    return vmtruncate(ip, 0);
 
55
    return 0;
 
56
}
 
57
 
 
58
/* Try to invalidate pages, for "fs flush" or "fs flushv"; or
 
59
 * try to free pages, when deleting a file.
 
60
 *
 
61
 * Locking:  the vcache entry's lock is held.  It may be dropped and 
 
62
 * re-obtained.
 
63
 *
 
64
 * Since we drop and re-obtain the lock, we can't guarantee that there won't
 
65
 * be some pages around when we return, newly created by concurrent activity.
 
66
 */
 
67
void
 
68
osi_VM_TryToSmush(struct vcache *avc, afs_ucred_t *acred, int sync)
 
69
{
 
70
    struct inode *ip = AFSTOV(avc);
 
71
 
 
72
    invalidate_remote_inode(ip);
 
73
}
 
74
 
 
75
/* Flush and invalidate pages, for fsync() with INVAL flag
 
76
 *
 
77
 * Locking:  only the global lock is held.
 
78
 */
 
79
void
 
80
osi_VM_FSyncInval(struct vcache *avc)
 
81
{
 
82
 
 
83
}
 
84
 
 
85
/* Try to store pages to cache, in order to store a file back to the server.
 
86
 *
 
87
 * Locking:  the vcache entry's lock is held.  It will usually be dropped and
 
88
 * re-obtained.
 
89
 */
 
90
void
 
91
osi_VM_StoreAllSegments(struct vcache *avc)
 
92
{
 
93
    struct inode *ip = AFSTOV(avc);
 
94
 
 
95
    if (avc->f.states & CPageWrite)
 
96
        return; /* someone already writing */
 
97
 
 
98
    /* filemap_fdatasync() only exported in 2.4.5 and above */
 
99
    ReleaseWriteLock(&avc->lock);
 
100
    AFS_GUNLOCK();
 
101
    filemap_fdatawrite(ip->i_mapping);
 
102
    filemap_fdatawait(ip->i_mapping);
 
103
    AFS_GLOCK();
 
104
    ObtainWriteLock(&avc->lock, 121);
 
105
}
 
106
 
 
107
/* Purge VM for a file when its callback is revoked.
 
108
 *
 
109
 * Locking:  No lock is held, not even the global lock.
 
110
 */
 
111
 
 
112
/* Note that for speed some of our Linux vnodeops do not initialise credp
 
113
 * before calling osi_FlushPages(). If credp is ever required on Linux,
 
114
 * then these callers should be updated.
 
115
 */
 
116
void
 
117
osi_VM_FlushPages(struct vcache *avc, afs_ucred_t *credp)
 
118
{
 
119
    struct inode *ip = AFSTOV(avc);
 
120
    
 
121
    afs_linux_lock_inode(ip);
 
122
    truncate_inode_pages(&ip->i_data, 0);
 
123
    afs_linux_unlock_inode(ip);
 
124
}
 
125
 
 
126
/* Purge pages beyond end-of-file, when truncating a file.
 
127
 *
 
128
 * Locking:  no lock is held, not even the global lock.
 
129
 * activeV is raised.  This is supposed to block pageins, but at present
 
130
 * it only works on Solaris.
 
131
 */
 
132
void
 
133
osi_VM_Truncate(struct vcache *avc, int alen, afs_ucred_t *acred)
 
134
{
 
135
    vmtruncate(AFSTOV(avc), alen);
 
136
}