2 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
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.
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.
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
23 #include "xfs_trans.h"
28 #include "xfs_alloc.h"
29 #include "xfs_dmapi.h"
30 #include "xfs_mount.h"
31 #include "xfs_quota.h"
36 struct xfs_mount_args
*args
,
39 struct bhv_desc
*next
= bdp
;
42 while (! (bhvtovfsops(next
))->vfs_mount
)
43 next
= BHV_NEXT(next
);
44 return ((*bhvtovfsops(next
)->vfs_mount
)(next
, args
, cr
));
51 struct xfs_mount_args
*args
,
54 struct bhv_desc
*next
= bdp
;
57 while (! (bhvtovfsops(next
))->vfs_parseargs
)
58 next
= BHV_NEXT(next
);
59 return ((*bhvtovfsops(next
)->vfs_parseargs
)(next
, s
, args
, f
));
67 struct bhv_desc
*next
= bdp
;
70 while (! (bhvtovfsops(next
))->vfs_showargs
)
71 next
= BHV_NEXT(next
);
72 return ((*bhvtovfsops(next
)->vfs_showargs
)(next
, m
));
81 struct bhv_desc
*next
= bdp
;
84 while (! (bhvtovfsops(next
))->vfs_unmount
)
85 next
= BHV_NEXT(next
);
86 return ((*bhvtovfsops(next
)->vfs_unmount
)(next
, fl
, cr
));
93 struct xfs_mount_args
*args
)
95 struct bhv_desc
*next
= bdp
;
98 while (! (bhvtovfsops(next
))->vfs_mntupdate
)
99 next
= BHV_NEXT(next
);
100 return ((*bhvtovfsops(next
)->vfs_mntupdate
)(next
, fl
, args
));
105 struct bhv_desc
*bdp
,
106 struct bhv_vnode
**vpp
)
108 struct bhv_desc
*next
= bdp
;
111 while (! (bhvtovfsops(next
))->vfs_root
)
112 next
= BHV_NEXT(next
);
113 return ((*bhvtovfsops(next
)->vfs_root
)(next
, vpp
));
118 struct bhv_desc
*bdp
,
119 bhv_statvfs_t
*statp
,
120 struct bhv_vnode
*vp
)
122 struct bhv_desc
*next
= bdp
;
125 while (! (bhvtovfsops(next
))->vfs_statvfs
)
126 next
= BHV_NEXT(next
);
127 return ((*bhvtovfsops(next
)->vfs_statvfs
)(next
, statp
, vp
));
132 struct bhv_desc
*bdp
,
136 struct bhv_desc
*next
= bdp
;
139 while (! (bhvtovfsops(next
))->vfs_sync
)
140 next
= BHV_NEXT(next
);
141 return ((*bhvtovfsops(next
)->vfs_sync
)(next
, fl
, cr
));
146 struct bhv_desc
*bdp
,
147 struct bhv_vnode
**vpp
,
150 struct bhv_desc
*next
= bdp
;
153 while (! (bhvtovfsops(next
))->vfs_vget
)
154 next
= BHV_NEXT(next
);
155 return ((*bhvtovfsops(next
)->vfs_vget
)(next
, vpp
, fidp
));
160 struct bhv_desc
*bdp
,
163 struct bhv_desc
*next
= bdp
;
166 while (! (bhvtovfsops(next
))->vfs_dmapiops
)
167 next
= BHV_NEXT(next
);
168 return ((*bhvtovfsops(next
)->vfs_dmapiops
)(next
, addr
));
173 struct bhv_desc
*bdp
,
178 struct bhv_desc
*next
= bdp
;
181 while (! (bhvtovfsops(next
))->vfs_quotactl
)
182 next
= BHV_NEXT(next
);
183 return ((*bhvtovfsops(next
)->vfs_quotactl
)(next
, cmd
, id
, addr
));
188 struct bhv_desc
*bdp
,
189 struct bhv_vnode
*vp
,
193 struct bhv_desc
*next
= bdp
;
196 while (! (bhvtovfsops(next
))->vfs_init_vnode
)
197 next
= BHV_NEXT(next
);
198 ((*bhvtovfsops(next
)->vfs_init_vnode
)(next
, vp
, bp
, unlock
));
203 struct bhv_desc
*bdp
,
208 struct bhv_desc
*next
= bdp
;
211 while (! (bhvtovfsops(next
))->vfs_force_shutdown
)
212 next
= BHV_NEXT(next
);
213 ((*bhvtovfsops(next
)->vfs_force_shutdown
)(next
, fl
, file
, line
));
218 struct bhv_desc
*bdp
)
220 struct bhv_desc
*next
= bdp
;
223 while (! (bhvtovfsops(next
))->vfs_freeze
)
224 next
= BHV_NEXT(next
);
225 ((*bhvtovfsops(next
)->vfs_freeze
)(next
));
230 struct super_block
*sb
)
232 struct bhv_vfs
*vfsp
;
234 vfsp
= kmem_zalloc(sizeof(bhv_vfs_t
), KM_SLEEP
);
235 bhv_head_init(VFS_BHVHEAD(vfsp
), "vfs");
236 INIT_LIST_HEAD(&vfsp
->vfs_sync_list
);
237 spin_lock_init(&vfsp
->vfs_sync_lock
);
238 init_waitqueue_head(&vfsp
->vfs_wait_single_sync_task
);
240 vfsp
->vfs_super
= sb
;
241 sb
->s_fs_info
= vfsp
;
243 if (sb
->s_flags
& MS_RDONLY
)
244 vfsp
->vfs_flag
|= VFS_RDONLY
;
251 struct super_block
*sb
)
253 return (bhv_vfs_t
*)sb
->s_fs_info
;
258 struct bhv_vfs
*vfsp
)
260 bhv_head_destroy(VFS_BHVHEAD(vfsp
));
261 kmem_free(vfsp
, sizeof(bhv_vfs_t
));
266 struct bhv_vfs
*vfsp
,
267 struct bhv_module_vfsops
*vfsops
)
269 struct bhv_desc
*bdp
;
271 bdp
= kmem_alloc(sizeof(struct bhv_desc
), KM_SLEEP
);
272 bhv_desc_init(bdp
, NULL
, vfsp
, vfsops
);
273 bhv_insert(&vfsp
->vfs_bh
, bdp
);
278 struct bhv_vfs
*vfsp
,
279 struct bhv_desc
*bdp
,
280 struct bhv_vfsops
*vfsops
,
283 bhv_desc_init(bdp
, mount
, vfsp
, vfsops
);
284 bhv_insert_initial(&vfsp
->vfs_bh
, bdp
);
289 struct bhv_vfs
*vfsp
,
292 struct bhv_desc
*bhv
;
294 bhv
= bhv_lookup_range(&vfsp
->vfs_bh
, pos
, pos
);
297 bhv_remove(&vfsp
->vfs_bh
, bhv
);
298 kmem_free(bhv
, sizeof(*bhv
));
302 bhv_remove_all_vfsops(
303 struct bhv_vfs
*vfsp
,
306 struct xfs_mount
*mp
;
308 bhv_remove_vfsops(vfsp
, VFS_POSITION_QM
);
309 bhv_remove_vfsops(vfsp
, VFS_POSITION_DM
);
312 mp
= XFS_VFSTOM(vfsp
);
313 VFS_REMOVEBHV(vfsp
, &mp
->m_bhv
);
314 xfs_mount_free(mp
, 0);
318 bhv_insert_all_vfsops(
319 struct bhv_vfs
*vfsp
)
321 struct xfs_mount
*mp
;
323 mp
= xfs_mount_init();
324 vfs_insertbhv(vfsp
, &mp
->m_bhv
, &xfs_vfsops
, mp
);
325 vfs_insertdmapi(vfsp
);
326 vfs_insertquota(vfsp
);