[XFS] call common xfs vfs-level helpers directly and remove vfs operations
[powerpc.git] / fs / xfs / linux-2.6 / xfs_vfs.c
1 /*
2  * Copyright (c) 2000-2005 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_fs.h"
20 #include "xfs_inum.h"
21 #include "xfs_log.h"
22 #include "xfs_clnt.h"
23 #include "xfs_trans.h"
24 #include "xfs_sb.h"
25 #include "xfs_ag.h"
26 #include "xfs_dir2.h"
27 #include "xfs_imap.h"
28 #include "xfs_alloc.h"
29 #include "xfs_dmapi.h"
30 #include "xfs_mount.h"
31 #include "xfs_quota.h"
32
33 int
34 vfs_mount(
35         struct bhv_desc         *bdp,
36         struct xfs_mount_args   *args,
37         struct cred             *cr)
38 {
39         struct bhv_desc         *next = bdp;
40
41         ASSERT(next);
42         while (! (bhvtovfsops(next))->vfs_mount)
43                 next = BHV_NEXT(next);
44         return ((*bhvtovfsops(next)->vfs_mount)(next, args, cr));
45 }
46
47 int
48 vfs_parseargs(
49         struct bhv_desc         *bdp,
50         char                    *s,
51         struct xfs_mount_args   *args,
52         int                     f)
53 {
54         struct bhv_desc         *next = bdp;
55
56         ASSERT(next);
57         while (! (bhvtovfsops(next))->vfs_parseargs)
58                 next = BHV_NEXT(next);
59         return ((*bhvtovfsops(next)->vfs_parseargs)(next, s, args, f));
60 }
61
62 int
63 vfs_showargs(
64         struct bhv_desc         *bdp,
65         struct seq_file         *m)
66 {
67         struct bhv_desc         *next = bdp;
68
69         ASSERT(next);
70         while (! (bhvtovfsops(next))->vfs_showargs)
71                 next = BHV_NEXT(next);
72         return ((*bhvtovfsops(next)->vfs_showargs)(next, m));
73 }
74
75 int
76 vfs_unmount(
77         struct bhv_desc         *bdp,
78         int                     fl,
79         struct cred             *cr)
80 {
81         struct bhv_desc         *next = bdp;
82
83         ASSERT(next);
84         while (! (bhvtovfsops(next))->vfs_unmount)
85                 next = BHV_NEXT(next);
86         return ((*bhvtovfsops(next)->vfs_unmount)(next, fl, cr));
87 }
88
89 int
90 vfs_mntupdate(
91         struct bhv_desc         *bdp,
92         int                     *fl,
93         struct xfs_mount_args   *args)
94 {
95         struct bhv_desc         *next = bdp;
96
97         ASSERT(next);
98         while (! (bhvtovfsops(next))->vfs_mntupdate)
99                 next = BHV_NEXT(next);
100         return ((*bhvtovfsops(next)->vfs_mntupdate)(next, fl, args));
101 }
102
103 int
104 vfs_root(
105         struct bhv_desc         *bdp,
106         bhv_vnode_t             **vpp)
107 {
108         struct bhv_desc         *next = bdp;
109
110         ASSERT(next);
111         while (! (bhvtovfsops(next))->vfs_root)
112                 next = BHV_NEXT(next);
113         return ((*bhvtovfsops(next)->vfs_root)(next, vpp));
114 }
115
116 int
117 vfs_statvfs(
118         struct bhv_desc         *bdp,
119         bhv_statvfs_t           *statp,
120         bhv_vnode_t             *vp)
121 {
122         struct bhv_desc         *next = bdp;
123
124         ASSERT(next);
125         while (! (bhvtovfsops(next))->vfs_statvfs)
126                 next = BHV_NEXT(next);
127         return ((*bhvtovfsops(next)->vfs_statvfs)(next, statp, vp));
128 }
129
130 int
131 vfs_sync(
132         struct bhv_desc         *bdp,
133         int                     fl,
134         struct cred             *cr)
135 {
136         struct bhv_desc         *next = bdp;
137
138         ASSERT(next);
139         while (! (bhvtovfsops(next))->vfs_sync)
140                 next = BHV_NEXT(next);
141         return ((*bhvtovfsops(next)->vfs_sync)(next, fl, cr));
142 }
143
144 int
145 vfs_vget(
146         struct bhv_desc         *bdp,
147         bhv_vnode_t             **vpp,
148         struct fid              *fidp)
149 {
150         struct bhv_desc         *next = bdp;
151
152         ASSERT(next);
153         while (! (bhvtovfsops(next))->vfs_vget)
154                 next = BHV_NEXT(next);
155         return ((*bhvtovfsops(next)->vfs_vget)(next, vpp, fidp));
156 }
157
158 void
159 vfs_init_vnode(
160         struct bhv_desc         *bdp,
161         bhv_vnode_t             *vp,
162         struct xfs_inode        *ip,
163         int                     unlock)
164 {
165         struct bhv_desc         *next = bdp;
166
167         ASSERT(next);
168         while (! (bhvtovfsops(next))->vfs_init_vnode)
169                 next = BHV_NEXT(next);
170         ((*bhvtovfsops(next)->vfs_init_vnode)(next, vp, ip, unlock));
171 }
172
173 void
174 vfs_force_shutdown(
175         struct bhv_desc         *bdp,
176         int                     fl,
177         char                    *file,
178         int                     line)
179 {
180         struct bhv_desc         *next = bdp;
181
182         ASSERT(next);
183         while (! (bhvtovfsops(next))->vfs_force_shutdown)
184                 next = BHV_NEXT(next);
185         ((*bhvtovfsops(next)->vfs_force_shutdown)(next, fl, file, line));
186 }
187
188 void
189 vfs_freeze(
190         struct bhv_desc         *bdp)
191 {
192         struct bhv_desc         *next = bdp;
193
194         ASSERT(next);
195         while (! (bhvtovfsops(next))->vfs_freeze)
196                 next = BHV_NEXT(next);
197         ((*bhvtovfsops(next)->vfs_freeze)(next));
198 }
199
200 bhv_vfs_t *
201 vfs_allocate(
202         struct super_block      *sb)
203 {
204         struct bhv_vfs          *vfsp;
205
206         vfsp = kmem_zalloc(sizeof(bhv_vfs_t), KM_SLEEP);
207         INIT_LIST_HEAD(&vfsp->vfs_sync_list);
208         spin_lock_init(&vfsp->vfs_sync_lock);
209         init_waitqueue_head(&vfsp->vfs_wait_single_sync_task);
210
211         vfsp->vfs_super = sb;
212         sb->s_fs_info = vfsp;
213
214         if (sb->s_flags & MS_RDONLY)
215                 vfsp->vfs_flag |= VFS_RDONLY;
216
217         return vfsp;
218 }
219
220 bhv_vfs_t *
221 vfs_from_sb(
222         struct super_block      *sb)
223 {
224         return (bhv_vfs_t *)sb->s_fs_info;
225 }
226
227 void
228 vfs_deallocate(
229         struct bhv_vfs          *vfsp)
230 {
231         kmem_free(vfsp, sizeof(bhv_vfs_t));
232 }