OSDN Git Service

NFS: client needs to maintain list of inodes with active layouts
[sagit-ice-cold/kernel_xiaomi_msm8998.git] / fs / nfs / pnfs.h
1 /*
2  *  pNFS client data structures.
3  *
4  *  Copyright (c) 2002
5  *  The Regents of the University of Michigan
6  *  All Rights Reserved
7  *
8  *  Dean Hildebrand <dhildebz@umich.edu>
9  *
10  *  Permission is granted to use, copy, create derivative works, and
11  *  redistribute this software and such derivative works for any purpose,
12  *  so long as the name of the University of Michigan is not used in
13  *  any advertising or publicity pertaining to the use or distribution
14  *  of this software without specific, written prior authorization. If
15  *  the above copyright notice or any other identification of the
16  *  University of Michigan is included in any copy of any portion of
17  *  this software, then the disclaimer below must also be included.
18  *
19  *  This software is provided as is, without representation or warranty
20  *  of any kind either express or implied, including without limitation
21  *  the implied warranties of merchantability, fitness for a particular
22  *  purpose, or noninfringement.  The Regents of the University of
23  *  Michigan shall not be liable for any damages, including special,
24  *  indirect, incidental, or consequential damages, with respect to any
25  *  claim arising out of or in connection with the use of the software,
26  *  even if it has been or is hereafter advised of the possibility of
27  *  such damages.
28  */
29
30 #ifndef FS_NFS_PNFS_H
31 #define FS_NFS_PNFS_H
32
33 struct pnfs_layout_segment {
34         struct list_head fi_list;
35         u32 iomode;
36         struct kref kref;
37         struct pnfs_layout_hdr *layout;
38 };
39
40 #ifdef CONFIG_NFS_V4_1
41
42 #define LAYOUT_NFSV4_1_MODULE_PREFIX "nfs-layouttype4"
43
44 enum {
45         NFS_LAYOUT_RO_FAILED = 0,       /* get ro layout failed stop trying */
46         NFS_LAYOUT_RW_FAILED,           /* get rw layout failed stop trying */
47 };
48
49 /* Per-layout driver specific registration structure */
50 struct pnfs_layoutdriver_type {
51         struct list_head pnfs_tblid;
52         const u32 id;
53         const char *name;
54         struct module *owner;
55         int (*initialize_mountpoint) (struct nfs_server *);
56         int (*uninitialize_mountpoint) (struct nfs_server *);
57 };
58
59 struct pnfs_layout_hdr {
60         unsigned long           refcount;
61         struct list_head        layouts;   /* other client layouts */
62         struct list_head        segs;      /* layout segments list */
63         unsigned long           state;
64         struct inode            *inode;
65 };
66
67 extern int pnfs_register_layoutdriver(struct pnfs_layoutdriver_type *);
68 extern void pnfs_unregister_layoutdriver(struct pnfs_layoutdriver_type *);
69
70 struct pnfs_layout_segment *
71 pnfs_update_layout(struct inode *ino, struct nfs_open_context *ctx,
72                    enum pnfs_iomode access_type);
73 void set_pnfs_layoutdriver(struct nfs_server *, u32 id);
74 void unset_pnfs_layoutdriver(struct nfs_server *);
75 void pnfs_destroy_layout(struct nfs_inode *);
76 void pnfs_destroy_all_layouts(struct nfs_client *);
77
78
79 static inline int lo_fail_bit(u32 iomode)
80 {
81         return iomode == IOMODE_RW ?
82                          NFS_LAYOUT_RW_FAILED : NFS_LAYOUT_RO_FAILED;
83 }
84
85 /* Return true if a layout driver is being used for this mountpoint */
86 static inline int pnfs_enabled_sb(struct nfs_server *nfss)
87 {
88         return nfss->pnfs_curr_ld != NULL;
89 }
90
91 #else  /* CONFIG_NFS_V4_1 */
92
93 static inline void pnfs_destroy_all_layouts(struct nfs_client *clp)
94 {
95 }
96
97 static inline void pnfs_destroy_layout(struct nfs_inode *nfsi)
98 {
99 }
100
101 static inline struct pnfs_layout_segment *
102 pnfs_update_layout(struct inode *ino, struct nfs_open_context *ctx,
103                    enum pnfs_iomode access_type)
104 {
105         return NULL;
106 }
107
108 static inline void set_pnfs_layoutdriver(struct nfs_server *s, u32 id)
109 {
110 }
111
112 static inline void unset_pnfs_layoutdriver(struct nfs_server *s)
113 {
114 }
115
116 #endif /* CONFIG_NFS_V4_1 */
117
118 #endif /* FS_NFS_PNFS_H */