[PATCH 10/17 remove dependency of the dmapi module on behaviors.
Mount options are now parsed by the main XFS module and rejected if dmapi support is not available, and there is a new dm operation to send the mount event.
Signed-off-by Christoph Hellwig <[email protected]>
fs/xfs/dmapi/xfs_dm.c +34 -1
@@ -3073,7 +3073,6 @@ static fsys_function_vector_t xfs_fsys_vint xfs_dm_get_fsys_vector ( -bhv_desc_t *bdp,caddr_t addr) {static int initialized =0 ;
@@ -3316,6 +3315,20 @@ xfs_dm_send_namesp_event(return error;/* Return positive error to XFS */ } +STATIC int +xfs_dm_send_mount_event ( +struct xfs_mount *mp, +dm_right_t root_right, +char *mtpt, +char *fsname) +{ +struct bhv_vfs *vfsp =XFS_MTOVFS (mp); + +return dm_send_mount_event (vfsp->vfs_super, root_right, +NULL ,DM_RIGHT_NULL , + mp->m_rootip ?XFS_ITOV (mp->m_rootip) :NULL , +DM_RIGHT_NULL , mtpt, fsname); +} STATIC void xfs_dm_send_unmount_event(
@@ -3341,5 +3354,25 @@ xfs_dmops_t xfs_dmcore_xfs = { .xfs_send_mmap = xfs_dm_send_mmap_event, .xfs_send_destroy = xfs_dm_send_destroy_event, .xfs_send_namesp = xfs_dm_send_namesp_event, + .xfs_send_mount = xfs_dm_send_mount_event, .xfs_send_unmount = xfs_dm_send_unmount_event, }; +EXPORT_SYMBOL (xfs_dmcore_xfs); + +static int __init +xfs_dm_init (void ) +{ +printk (KERN_INFO "SGI XFS Data Management API subsystem\n" ); + +dmapi_register (&xfs_fs_type, &xfs_dmapiops); +return 0 ; +} + +static void __exit +xfs_dm_exit (void ) +{ +dmapi_unregister (&xfs_fs_type); +} + +module_init (xfs_dm_init); +module_exit (xfs_dm_exit);
fs/xfs/dmapi/xfs_dm.h +1 -2
@@ -18,9 +18,8 @@#ifndef __XFS_DM_H__#define __XFS_DM_H__ -extern int xfs_dm_get_fsys_vector (bhv_desc_t *,caddr_t ); +extern int xfs_dm_get_fsys_vector (caddr_t ); -extern xfs_dmops_t xfs_dmcore_xfs;extern struct file_system_type xfs_fs_type;extern struct filesystem_dmapi_operations xfs_dmapiops;
fs/xfs/dmapi/xfs_dm_bhv.c deleted +0 -179
179 lines not on this page · raw message
fs/xfs/dmapi/xfs_dm_fsops.c +1 -1
@@ -112,7 +112,7 @@ xfs_dm_get_dmapiops(struct super_block *sb, void *addr) { - return -bhv_vfs_dmapiops(vfs_from_sb(sb), (caddr_t)addr); + return -xfs_dm_get_fsys_vector(addr); }STATIC void
fs/xfs/linux-2.6/xfs_ksyms.c +0 -1
@@ -199,7 +199,6 @@ EXPORT_SYMBOL(vfs_root);EXPORT_SYMBOL (vfs_statvfs);EXPORT_SYMBOL (vfs_sync);EXPORT_SYMBOL (vfs_vget); -EXPORT_SYMBOL (vfs_dmapiops);EXPORT_SYMBOL (vfs_quotactl);EXPORT_SYMBOL (vfs_get_inode);EXPORT_SYMBOL (vfs_init_vnode);
fs/xfs/linux-2.6/xfs_vfs.c +0 -14
@@ -156,19 +156,6 @@ vfs_vget( } int -vfs_dmapiops ( -struct bhv_desc *bdp, -caddr_t addr) -{ -struct bhv_desc *next = bdp; - -ASSERT (next); -while (! (bhvtovfsops (next))->vfs_dmapiops) - next =BHV_NEXT (next); -return ((*bhvtovfsops (next)->vfs_dmapiops)(next, addr)); -} - -int vfs_quotactl( struct bhv_desc *bdp, int cmd,
@@ -404,7 +391,6 @@ bhv_remove_all_vfsops(struct xfs_mount *mp;bhv_remove_vfsops (vfsp,VFS_POSITION_QM ); -bhv_remove_vfsops (vfsp,VFS_POSITION_DM );bhv_remove_vfsops (vfsp,VFS_POSITION_IO );if (!freebase)return ;
fs/xfs/linux-2.6/xfs_vfs.h +0 -7
@@ -66,14 +66,12 @@ typedef struct bhv_vfs {typedef enum {VFS_BHV_UNKNOWN ,/* not specified */ VFS_BHV_XFS ,/* xfs */ -VFS_BHV_DM ,/* data migration */ VFS_BHV_QM ,/* quota manager */ VFS_BHV_IO ,/* IO path */ VFS_BHV_END /* housekeeping end-of-range */ }bhv_vfs_type_t ;#define VFS_POSITION_XFS (BHV_POSITION_BASE) -#define VFS_POSITION_DM (VFS_POSITION_BASE+10)#define VFS_POSITION_QM (VFS_POSITION_BASE+20)#define VFS_POSITION_IO (VFS_POSITION_BASE+30)
@@ -129,7 +127,6 @@ typedef int (*vfs_statvfs_t)(bhv_desc_t struct inode *);typedef int (*vfs_sync_t )(bhv_desc_t *,int ,struct cred *);typedef int (*vfs_vget_t )(bhv_desc_t *,struct inode **,struct fid *); -typedef int (*vfs_dmapiops_t )(bhv_desc_t *,caddr_t );typedef int (*vfs_quotactl_t )(bhv_desc_t *,int ,int ,caddr_t );typedef void (*vfs_init_vnode_t )(bhv_desc_t *,struct inode *,struct xfs_inode *,int );
@@ -148,7 +145,6 @@ typedef struct bhv_vfsops {vfs_statvfs_t vfs_statvfs;/* file system statistics */ vfs_sync_t vfs_sync;/* flush files */ vfs_vget_t vfs_vget;/* get vnode from fid */ -vfs_dmapiops_t vfs_dmapiops;/* data migration */ vfs_quotactl_t vfs_quotactl;/* disk quota */ vfs_get_inode_t vfs_get_inode;/* bhv specific iget */ vfs_init_vnode_t vfs_init_vnode;/* initialize a new vnode */
@@ -169,7 +165,6 @@ typedef struct bhv_vfsops {#define bhv_vfs_statvfs (v, sp,vp) vfs_statvfs(VFSHEAD(v), sp,vp)#define bhv_vfs_sync (v, flag,cr) vfs_sync(VFSHEAD(v), flag,cr)#define bhv_vfs_vget (v, vpp,fidp) vfs_vget(VFSHEAD(v), vpp,fidp) -#define bhv_vfs_dmapiops (v, p) vfs_dmapiops(VFSHEAD(v), p)#define bhv_vfs_quotactl (v, c,id,p) vfs_quotactl(VFSHEAD(v), c,id,p)#define bhv_vfs_get_inode (v, ino, fl) vfs_get_inode(VFSHEAD(v), ino,fl)#define bhv_vfs_init_vnode (v, vp,b,ul) vfs_init_vnode(VFSHEAD(v), vp,b,ul)
@@ -188,7 +183,6 @@ typedef struct bhv_vfsops {#define bhv_next_vfs_statvfs (b, sp,vp) vfs_statvfs(b, sp,vp)#define bhv_next_vfs_sync (b, flag,cr) vfs_sync(b, flag,cr)#define bhv_next_vfs_vget (b, vpp,fidp) vfs_vget(b, vpp,fidp) -#define bhv_next_vfs_dmapiops (b, p) vfs_dmapiops(b, p)#define bhv_next_vfs_quotactl (b, c,id,p) vfs_quotactl(b, c,id,p)#define bhv_next_vfs_get_inode (b, ino,fl) vfs_get_inode(b, ino,fl)#define bhv_next_vfs_init_vnode (b, vp,b2,ul) vfs_init_vnode(b, vp,b2,ul)
@@ -204,7 +198,6 @@ extern int vfs_root(bhv_desc_t *, structextern int vfs_statvfs (bhv_desc_t *,bhv_statvfs_t *,struct inode *);extern int vfs_sync (bhv_desc_t *,int ,struct cred *);extern int vfs_vget (bhv_desc_t *,struct inode **,struct fid *); -extern int vfs_dmapiops (bhv_desc_t *,caddr_t );extern int vfs_quotactl (bhv_desc_t *,int ,int ,caddr_t );extern struct inode *vfs_get_inode (bhv_desc_t *,xfs_ino_t ,int );extern void vfs_init_vnode (bhv_desc_t *,struct inode *,struct xfs_inode *,int );
fs/xfs/xfs_vfsops.c +28 -3
@@ -326,6 +326,8 @@ xfs_start_flags(if (ap->flags2 &XFSMNT2_FILESTREAMS ) mp->m_flags |=XFS_MOUNT_FILESTREAMS ; +if (ap->flags &XFSMNT_DMAPI ) + vfs->vfs_flag |=VFS_DMI ;return 0 ; }
@@ -430,11 +432,13 @@ xfs_mount( ddev = vfsp->vfs_super->s_bdev; logdev = rtdev =NULL ; + error =xfs_dmops_get (mp, args); +if (error) +return error; +/* * Setup xfs_mount function vectors from available behaviors */ - p =vfs_bhv_lookup (vfsp,VFS_POSITION_DM ); - mp->m_dm_ops = p ? *(xfs_dmops_t *)vfs_bhv_custom (p) : xfs_dmcore_stub; p =vfs_bhv_lookup (vfsp,VFS_POSITION_QM ); mp->m_qm_ops = p ? *(xfs_qmops_t *)vfs_bhv_custom (p) : xfs_qmcore_stub; p =vfs_bhv_lookup (vfsp,VFS_POSITION_IO );
@@ -537,6 +541,8 @@ xfs_mount(if (error) goto error2; +XFS_SEND_MOUNT (mp,DM_RIGHT_NULL , args->mtpt, args->fsname); +return 0 ; error2:
@@ -550,6 +556,7 @@ error1:xfs_binval (mp->m_rtdev_targp); error0:xfs_unmountfs_close (mp, credp); +xfs_dmops_put (mp);return error; }
@@ -640,6 +647,7 @@ out:* and free the super block buffer & mount structures. */ xfs_unmountfs (mp, credp); +xfs_dmops_put (mp);kmem_free (mp,sizeof (xfs_mount_t)); }
@@ -1688,6 +1696,9 @@ xfs_vget(#define MNTOPT_ATTR2 "attr2"/* do use attr2 attribute format */ #define MNTOPT_NOATTR2 "noattr2"/* do not use attr2 attribute format */ #define MNTOPT_FILESTREAM "filestreams"/* use filestreams allocator */ +#define MNTOPT_DMAPI "dmapi"/* DMI enabled (DMAPI / XDSM) */ +#define MNTOPT_XDSM "xdsm"/* DMI enabled (DMAPI / XDSM) */ +#define MNTOPT_DMI "dmi"/* DMI enabled (DMAPI / XDSM) */ STATIC unsigned long suffix_strtoul (char *s,char **endp,unsigned int base)
@@ -1867,6 +1878,12 @@ xfs_parseargs( args->flags &= ~XFSMNT_ATTR2 ; }else if (!strcmp (this_char,MNTOPT_FILESTREAM )) { args->flags2 |=XFSMNT2_FILESTREAMS ; + }else if (!strcmp (this_char,MNTOPT_DMAPI )) { + args->flags |=XFSMNT_DMAPI ; + }else if (!strcmp (this_char,MNTOPT_XDSM )) { + args->flags |=XFSMNT_DMAPI ; + }else if (!strcmp (this_char,MNTOPT_DMI )) { + args->flags |=XFSMNT_DMAPI ; }else if (!strcmp (this_char,"ihashsize" )) {cmn_err (CE_WARN ,"XFS: ihashsize no longer used, option is deprecated." );
@@ -1898,6 +1915,12 @@ xfs_parseargs(return EINVAL ; } +if ((args->flags &XFSMNT_DMAPI ) && *args->mtpt =='\0' ) { +printk ("XFS: %s option needs the mount point option as well\n" , +MNTOPT_DMAPI ); +return EINVAL ; + } +if ((dsunit && !dswidth) || (!dsunit && dswidth)) {cmn_err (CE_WARN ,"XFS: sunit and swidth must be specified together" );
@@ -1991,6 +2014,9 @@ xfs_showargs(if (vfsp->vfs_flag &VFS_GRPID )seq_printf (m,"," MNTOPT_GRPID ); +if (vfsp->vfs_flag &VFS_DMI ) +seq_puts (m,"," MNTOPT_DMAPI ); +return 0 ; }
@@ -2021,7 +2047,6 @@ bhv_vfsops_t xfs_vfsops = { .vfs_statvfs = xfs_statvfs, .vfs_sync = xfs_sync, .vfs_vget = xfs_vget, - .vfs_dmapiops = (vfs_dmapiops_t)fs_nosys, .vfs_quotactl = (vfs_quotactl_t)fs_nosys, .vfs_get_inode = xfs_get_inode, .vfs_init_vnode = xfs_initialize_vnode,
fs/xfs/dmapi/Makefile-linux-2.6 +1 -2
@@ -25,6 +25,5 @@ endif obj-$(CONFIG_XFS_DMAPI) += xfs_dmapi.o -xfs_dmapi-y += xfs_dm_bhv.o \ - xfs_dm_fsops.o \ +xfs_dmapi-y += xfs_dm_fsops.o \ xfs_dm.o
fs/xfs/xfs_mount.h +16 -8
@@ -85,6 +85,8 @@ typedef int (*xfs_send_namesp_t)(dm_even bhv_vnode_t *, dm_right_t, bhv_vnode_t *, dm_right_t, char *, char *, mode_t, int, int); +typedef int (*xfs_send_mount_t )(struct xfs_mount *,dm_right_t , +char *,char *);typedef void (*xfs_send_unmount_t )(struct bhv_vfs *,bhv_vnode_t *,dm_right_t ,mode_t ,int ,int );
@@ -93,21 +95,24 @@ typedef struct xfs_dmops {xfs_send_mmap_t xfs_send_mmap;xfs_send_destroy_t xfs_send_destroy;xfs_send_namesp_t xfs_send_namesp; +xfs_send_mount_t xfs_send_mount;xfs_send_unmount_t xfs_send_unmount; } xfs_dmops_t;#define XFS_SEND_DATA (mp, ev,vp,off,len,fl,lock) \ - (*(mp)->m_dm_ops.xfs_send_data)(ev,vp,off,len,fl,lock) + (*(mp)->m_dm_ops->xfs_send_data)(ev,vp,off,len,fl,lock)#define XFS_SEND_MMAP (mp, vma,fl) \ - (*(mp)->m_dm_ops.xfs_send_mmap)(vma,fl) + (*(mp)->m_dm_ops->xfs_send_mmap)(vma,fl)#define XFS_SEND_DESTROY (mp, vp,right) \ - (*(mp)->m_dm_ops.xfs_send_destroy)(vp,right) + (*(mp)->m_dm_ops->xfs_send_destroy)(vp,right)#define XFS_SEND_NAMESP (mp, ev,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ - (*(mp)->m_dm_ops.xfs_send_namesp)(ev,NULL,b1,r1,b2,r2,n1,n2,mode,rval,fl) + (*(mp)->m_dm_ops->xfs_send_namesp)(ev,NULL,b1,r1,b2,r2,n1,n2,mode,rval,fl)#define XFS_SEND_PREUNMOUNT (mp, vfs,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ - (*(mp)->m_dm_ops.xfs_send_namesp)(DM_EVENT_PREUNMOUNT,vfs,b1,r1,b2,r2,n1,n2,mode,rval,fl) + (*(mp)->m_dm_ops->xfs_send_namesp)(DM_EVENT_PREUNMOUNT,vfs,b1,r1,b2,r2,n1,n2,mode,rval,fl) +#define XFS_SEND_MOUNT (mp,right,path,name) \ + (*(mp)->m_dm_ops->xfs_send_mount)(mp,right,path,name)#define XFS_SEND_UNMOUNT (mp, vfsp,vp,right,mode,rval,fl) \ - (*(mp)->m_dm_ops.xfs_send_unmount)(vfsp,vp,right,mode,rval,fl) + (*(mp)->m_dm_ops->xfs_send_unmount)(vfsp,vp,right,mode,rval,fl)/*
@@ -407,7 +412,7 @@ typedef struct xfs_mount {uint m_chsize;/* size of next field */ struct xfs_chash *m_chash;/* fs private inode per-cluster * hash table */ -struct xfs_dmops m_dm_ops;/* vector of DMI ops */ +struct xfs_dmops *m_dm_ops;/* vector of DMI ops */ struct xfs_qmops m_qm_ops;/* vector of XQM ops */ struct xfs_ioops m_io_ops;/* vector of I/O ops */ atomic_t m_active_trans;/* number trans frozen */
@@ -642,7 +647,10 @@ extern void xfs_sb_from_disk(struct xfs_extern void xfs_sb_to_disk (struct xfs_dsb *,struct xfs_sb *,__int64_t );extern int xfs_sb_validate_fsb_count (struct xfs_sb *,__uint64_t ); -extern struct xfs_dmops xfs_dmcore_stub; +extern int xfs_dmops_get (struct xfs_mount *,struct xfs_mount_args *); +extern void xfs_dmops_put (struct xfs_mount *); + +extern struct xfs_dmops xfs_dmcore_xfs;extern struct xfs_qmops xfs_qmcore_stub;extern struct xfs_ioops xfs_iocore_xfs;
fs/xfs/xfs_dmapi.h +0 -3
@@ -168,7 +168,4 @@ typedef enum { DM_FLAGS_NDELAY : 0)#define AT_DELAY_FLAG (f) ((f&ATTR_NONBLOCK) ? DM_FLAGS_NDELAY : 0) - -extern struct bhv_module_vfsops xfs_dmops; -#endif /* __XFS_DMAPI_H__ */
fs/xfs/xfs_dmops.c +38 -5
56 lines not on this page · raw message