diff options
-rw-r--r-- | fs/xfs/linux-2.6/xfs_super.c | 22 | ||||
-rw-r--r-- | fs/xfs/xfs_mount.h | 23 |
2 files changed, 21 insertions, 24 deletions
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 25b6903a3bce..1bfb0e980193 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
@@ -1131,8 +1131,6 @@ xfs_fs_put_super( | |||
1131 | struct super_block *sb) | 1131 | struct super_block *sb) |
1132 | { | 1132 | { |
1133 | struct xfs_mount *mp = XFS_M(sb); | 1133 | struct xfs_mount *mp = XFS_M(sb); |
1134 | struct xfs_inode *rip = mp->m_rootip; | ||
1135 | int unmount_event_flags = 0; | ||
1136 | 1134 | ||
1137 | xfs_syncd_stop(mp); | 1135 | xfs_syncd_stop(mp); |
1138 | 1136 | ||
@@ -1148,20 +1146,7 @@ xfs_fs_put_super( | |||
1148 | xfs_sync_attr(mp, 0); | 1146 | xfs_sync_attr(mp, 0); |
1149 | } | 1147 | } |
1150 | 1148 | ||
1151 | #ifdef HAVE_DMAPI | 1149 | XFS_SEND_PREUNMOUNT(mp); |
1152 | if (mp->m_flags & XFS_MOUNT_DMAPI) { | ||
1153 | unmount_event_flags = | ||
1154 | (mp->m_dmevmask & (1 << DM_EVENT_UNMOUNT)) ? | ||
1155 | 0 : DM_FLAGS_UNWANTED; | ||
1156 | /* | ||
1157 | * Ignore error from dmapi here, first unmount is not allowed | ||
1158 | * to fail anyway, and second we wouldn't want to fail a | ||
1159 | * unmount because of dmapi. | ||
1160 | */ | ||
1161 | XFS_SEND_PREUNMOUNT(mp, rip, DM_RIGHT_NULL, rip, DM_RIGHT_NULL, | ||
1162 | NULL, NULL, 0, 0, unmount_event_flags); | ||
1163 | } | ||
1164 | #endif | ||
1165 | 1150 | ||
1166 | /* | 1151 | /* |
1167 | * Blow away any referenced inode in the filestreams cache. | 1152 | * Blow away any referenced inode in the filestreams cache. |
@@ -1172,10 +1157,7 @@ xfs_fs_put_super( | |||
1172 | 1157 | ||
1173 | XFS_bflush(mp->m_ddev_targp); | 1158 | XFS_bflush(mp->m_ddev_targp); |
1174 | 1159 | ||
1175 | if (mp->m_flags & XFS_MOUNT_DMAPI) { | 1160 | XFS_SEND_UNMOUNT(mp); |
1176 | XFS_SEND_UNMOUNT(mp, rip, DM_RIGHT_NULL, 0, 0, | ||
1177 | unmount_event_flags); | ||
1178 | } | ||
1179 | 1161 | ||
1180 | xfs_unmountfs(mp); | 1162 | xfs_unmountfs(mp); |
1181 | xfs_freesb(mp); | 1163 | xfs_freesb(mp); |
diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h index 23bf246fa85a..1df7e4502967 100644 --- a/fs/xfs/xfs_mount.h +++ b/fs/xfs/xfs_mount.h | |||
@@ -93,6 +93,9 @@ typedef struct xfs_dmops { | |||
93 | xfs_send_unmount_t xfs_send_unmount; | 93 | xfs_send_unmount_t xfs_send_unmount; |
94 | } xfs_dmops_t; | 94 | } xfs_dmops_t; |
95 | 95 | ||
96 | #define XFS_DMAPI_UNMOUNT_FLAGS(mp) \ | ||
97 | (((mp)->m_dmevmask & (1 << DM_EVENT_UNMOUNT)) ? 0 : DM_FLAGS_UNWANTED) | ||
98 | |||
96 | #define XFS_SEND_DATA(mp, ev,ip,off,len,fl,lock) \ | 99 | #define XFS_SEND_DATA(mp, ev,ip,off,len,fl,lock) \ |
97 | (*(mp)->m_dm_ops->xfs_send_data)(ev,ip,off,len,fl,lock) | 100 | (*(mp)->m_dm_ops->xfs_send_data)(ev,ip,off,len,fl,lock) |
98 | #define XFS_SEND_MMAP(mp, vma,fl) \ | 101 | #define XFS_SEND_MMAP(mp, vma,fl) \ |
@@ -101,12 +104,24 @@ typedef struct xfs_dmops { | |||
101 | (*(mp)->m_dm_ops->xfs_send_destroy)(ip,right) | 104 | (*(mp)->m_dm_ops->xfs_send_destroy)(ip,right) |
102 | #define XFS_SEND_NAMESP(mp, ev,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ | 105 | #define XFS_SEND_NAMESP(mp, ev,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ |
103 | (*(mp)->m_dm_ops->xfs_send_namesp)(ev,NULL,b1,r1,b2,r2,n1,n2,mode,rval,fl) | 106 | (*(mp)->m_dm_ops->xfs_send_namesp)(ev,NULL,b1,r1,b2,r2,n1,n2,mode,rval,fl) |
104 | #define XFS_SEND_PREUNMOUNT(mp,b1,r1,b2,r2,n1,n2,mode,rval,fl) \ | ||
105 | (*(mp)->m_dm_ops->xfs_send_namesp)(DM_EVENT_PREUNMOUNT,mp,b1,r1,b2,r2,n1,n2,mode,rval,fl) | ||
106 | #define XFS_SEND_MOUNT(mp,right,path,name) \ | 107 | #define XFS_SEND_MOUNT(mp,right,path,name) \ |
107 | (*(mp)->m_dm_ops->xfs_send_mount)(mp,right,path,name) | 108 | (*(mp)->m_dm_ops->xfs_send_mount)(mp,right,path,name) |
108 | #define XFS_SEND_UNMOUNT(mp, ip,right,mode,rval,fl) \ | 109 | #define XFS_SEND_PREUNMOUNT(mp) \ |
109 | (*(mp)->m_dm_ops->xfs_send_unmount)(mp,ip,right,mode,rval,fl) | 110 | do { \ |
111 | if (mp->m_flags & XFS_MOUNT_DMAPI) { \ | ||
112 | (*(mp)->m_dm_ops->xfs_send_namesp)(DM_EVENT_PREUNMOUNT, mp, \ | ||
113 | (mp)->m_rootip, DM_RIGHT_NULL, \ | ||
114 | (mp)->m_rootip, DM_RIGHT_NULL, \ | ||
115 | NULL, NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); \ | ||
116 | } \ | ||
117 | } while (0) | ||
118 | #define XFS_SEND_UNMOUNT(mp) \ | ||
119 | do { \ | ||
120 | if (mp->m_flags & XFS_MOUNT_DMAPI) { \ | ||
121 | (*(mp)->m_dm_ops->xfs_send_unmount)(mp, (mp)->m_rootip, \ | ||
122 | DM_RIGHT_NULL, 0, 0, XFS_DMAPI_UNMOUNT_FLAGS(mp)); \ | ||
123 | } \ | ||
124 | } while (0) | ||
110 | 125 | ||
111 | 126 | ||
112 | #ifdef HAVE_PERCPU_SB | 127 | #ifdef HAVE_PERCPU_SB |