OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [include/] [linux/] [nfs_page.h] - Blame information for rev 81

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * linux/include/linux/nfs_page.h
3
 *
4
 * Copyright (C) 2000 Trond Myklebust
5
 *
6
 * NFS page cache wrapper.
7
 */
8
 
9
#ifndef _LINUX_NFS_PAGE_H
10
#define _LINUX_NFS_PAGE_H
11
 
12
 
13
#include <linux/list.h>
14
#include <linux/pagemap.h>
15
#include <linux/wait.h>
16
#include <linux/sunrpc/auth.h>
17
#include <linux/nfs_xdr.h>
18
 
19
#include <linux/kref.h>
20
 
21
/*
22
 * Valid flags for the radix tree
23
 */
24
#define NFS_PAGE_TAG_LOCKED     0
25
#define NFS_PAGE_TAG_COMMIT     1
26
 
27
/*
28
 * Valid flags for a dirty buffer
29
 */
30
#define PG_BUSY                 0
31
#define PG_NEED_COMMIT          1
32
#define PG_NEED_RESCHED         2
33
 
34
struct nfs_inode;
35
struct nfs_page {
36
        struct list_head        wb_list;        /* Defines state of page: */
37
        struct page             *wb_page;       /* page to read in/write out */
38
        struct nfs_open_context *wb_context;    /* File state context info */
39
        atomic_t                wb_complete;    /* i/os we're waiting for */
40
        pgoff_t                 wb_index;       /* Offset >> PAGE_CACHE_SHIFT */
41
        unsigned int            wb_offset,      /* Offset & ~PAGE_CACHE_MASK */
42
                                wb_pgbase,      /* Start of page data */
43
                                wb_bytes;       /* Length of request */
44
        struct kref             wb_kref;        /* reference count */
45
        unsigned long           wb_flags;
46
        struct nfs_writeverf    wb_verf;        /* Commit cookie */
47
};
48
 
49
struct nfs_pageio_descriptor {
50
        struct list_head        pg_list;
51
        unsigned long           pg_bytes_written;
52
        size_t                  pg_count;
53
        size_t                  pg_bsize;
54
        unsigned int            pg_base;
55
 
56
        struct inode            *pg_inode;
57
        int                     (*pg_doio)(struct inode *, struct list_head *, unsigned int, size_t, int);
58
        int                     pg_ioflags;
59
        int                     pg_error;
60
};
61
 
62
#define NFS_WBACK_BUSY(req)     (test_bit(PG_BUSY,&(req)->wb_flags))
63
 
64
extern  struct nfs_page *nfs_create_request(struct nfs_open_context *ctx,
65
                                            struct inode *inode,
66
                                            struct page *page,
67
                                            unsigned int offset,
68
                                            unsigned int count);
69
extern  void nfs_clear_request(struct nfs_page *req);
70
extern  void nfs_release_request(struct nfs_page *req);
71
 
72
 
73
extern  int nfs_scan_list(struct nfs_inode *nfsi, struct list_head *dst,
74
                          pgoff_t idx_start, unsigned int npages, int tag);
75
extern  void nfs_pageio_init(struct nfs_pageio_descriptor *desc,
76
                             struct inode *inode,
77
                             int (*doio)(struct inode *, struct list_head *, unsigned int, size_t, int),
78
                             size_t bsize,
79
                             int how);
80
extern  int nfs_pageio_add_request(struct nfs_pageio_descriptor *,
81
                                   struct nfs_page *);
82
extern  void nfs_pageio_complete(struct nfs_pageio_descriptor *desc);
83
extern  void nfs_pageio_cond_complete(struct nfs_pageio_descriptor *, pgoff_t);
84
extern  int nfs_wait_on_request(struct nfs_page *);
85
extern  void nfs_unlock_request(struct nfs_page *req);
86
extern  void nfs_clear_page_tag_locked(struct nfs_page *req);
87
 
88
 
89
/*
90
 * Lock the page of an asynchronous request without getting a new reference
91
 */
92
static inline int
93
nfs_lock_request_dontget(struct nfs_page *req)
94
{
95
        return !test_and_set_bit(PG_BUSY, &req->wb_flags);
96
}
97
 
98
/*
99
 * Lock the page of an asynchronous request and take a reference
100
 */
101
static inline int
102
nfs_lock_request(struct nfs_page *req)
103
{
104
        if (test_and_set_bit(PG_BUSY, &req->wb_flags))
105
                return 0;
106
        kref_get(&req->wb_kref);
107
        return 1;
108
}
109
 
110
/**
111
 * nfs_list_add_request - Insert a request into a list
112
 * @req: request
113
 * @head: head of list into which to insert the request.
114
 */
115
static inline void
116
nfs_list_add_request(struct nfs_page *req, struct list_head *head)
117
{
118
        list_add_tail(&req->wb_list, head);
119
}
120
 
121
 
122
/**
123
 * nfs_list_remove_request - Remove a request from its wb_list
124
 * @req: request
125
 */
126
static inline void
127
nfs_list_remove_request(struct nfs_page *req)
128
{
129
        if (list_empty(&req->wb_list))
130
                return;
131
        list_del_init(&req->wb_list);
132
}
133
 
134
static inline struct nfs_page *
135
nfs_list_entry(struct list_head *head)
136
{
137
        return list_entry(head, struct nfs_page, wb_list);
138
}
139
 
140
static inline
141
loff_t req_offset(struct nfs_page *req)
142
{
143
        return (((loff_t)req->wb_index) << PAGE_CACHE_SHIFT) + req->wb_offset;
144
}
145
 
146
#endif /* _LINUX_NFS_PAGE_H */

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.