[XFS] merge xfs_unmount into xfs_fs_put_super / xfs_fs_fill_super
authorChristoph Hellwig <hch@infradead.org>
Tue, 20 May 2008 01:30:52 +0000 (11:30 +1000)
committerNiv Sardi <xaiki@debian.org>
Mon, 28 Jul 2008 06:58:20 +0000 (16:58 +1000)
xfs_unmount is small and already pretty Linux specific, so merge it into
the callers. The real unmount path is simplified a little by doing a
WARN_ON on the xfs_unmount_flush retval directly instead of propagating
the error back to the caller, and the mout failure case in simplified
significantly by removing the forced shutdown case and all the dmapi
events that shouldn't be sent because the dmapi mount event hasn't been
sent by that time either.

SGI-PV: 981951
SGI-Modid: xfs-linux-melb:xfs-kern:31188a

Signed-off-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: David Chinner <dgc@sgi.com>
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
fs/xfs/linux-2.6/xfs_super.c
fs/xfs/xfs_vfsops.c
fs/xfs/xfs_vfsops.h

index a3ecdf44246585fe33b45341ace0c7329cbbf8b0..28132e6439532d5f42f90c76156c5d6df1d9f41b 100644 (file)
@@ -1087,14 +1087,61 @@ xfs_fs_put_super(
        struct super_block      *sb)
 {
        struct xfs_mount        *mp = XFS_M(sb);
+       struct xfs_inode        *rip = mp->m_rootip;
+       int                     unmount_event_flags = 0;
        int                     error;
 
        kthread_stop(mp->m_sync_task);
 
        xfs_sync(mp, SYNC_ATTR | SYNC_DELWRI);
-       error = xfs_unmount(mp, 0, NULL);
-       if (error)
-               printk("XFS: unmount got error=%d\n", error);
+
+#ifdef HAVE_DMAPI
+       if (mp->m_flags & XFS_MOUNT_DMAPI) {
+               unmount_event_flags =
+                       (mp->m_dmevmask & (1 << DM_EVENT_UNMOUNT)) ?
+                               0 : DM_FLAGS_UNWANTED;
+               /*
+                * Ignore error from dmapi here, first unmount is not allowed
+                * to fail anyway, and second we wouldn't want to fail a
+                * unmount because of dmapi.
+                */
+               XFS_SEND_PREUNMOUNT(mp, rip, DM_RIGHT_NULL, rip, DM_RIGHT_NULL,
+                               NULL, NULL, 0, 0, unmount_event_flags);
+       }
+#endif
+
+       /*
+        * Blow away any referenced inode in the filestreams cache.
+        * This can and will cause log traffic as inodes go inactive
+        * here.
+        */
+       xfs_filestream_unmount(mp);
+
+       XFS_bflush(mp->m_ddev_targp);
+       error = xfs_unmount_flush(mp, 0);
+       WARN_ON(error);
+
+       IRELE(rip);
+
+       /*
+        * If we're forcing a shutdown, typically because of a media error,
+        * we want to make sure we invalidate dirty pages that belong to
+        * referenced vnodes as well.
+        */
+       if (XFS_FORCED_SHUTDOWN(mp)) {
+               error = xfs_sync(mp, SYNC_WAIT | SYNC_CLOSE);
+               ASSERT(error != EFSCORRUPTED);
+       }
+
+       if (mp->m_flags & XFS_MOUNT_DMAPI) {
+               XFS_SEND_UNMOUNT(mp, rip, DM_RIGHT_NULL, 0, 0,
+                               unmount_event_flags);
+       }
+
+       xfs_unmountfs(mp, NULL);
+       xfs_qmops_put(mp);
+       xfs_dmops_put(mp);
+       kmem_free(mp);
 }
 
 STATIC void
@@ -1400,7 +1447,23 @@ fail_vnrele:
        }
 
 fail_unmount:
-       xfs_unmount(mp, 0, NULL);
+       /*
+        * Blow away any referenced inode in the filestreams cache.
+        * This can and will cause log traffic as inodes go inactive
+        * here.
+        */
+       xfs_filestream_unmount(mp);
+
+       XFS_bflush(mp->m_ddev_targp);
+       error = xfs_unmount_flush(mp, 0);
+       WARN_ON(error);
+
+       IRELE(mp->m_rootip);
+
+       xfs_unmountfs(mp, NULL);
+       xfs_qmops_put(mp);
+       xfs_dmops_put(mp);
+       kmem_free(mp);
 
 fail_vfsop:
        kmem_free(args);
index e223aeab68be3cedcea96f8222c50da268d7f26e..bc34f90e7eea60d4036bc10d561118b29076d215 100644 (file)
@@ -558,93 +558,6 @@ error0:
        return error;
 }
 
-int
-xfs_unmount(
-       xfs_mount_t     *mp,
-       int             flags,
-       cred_t          *credp)
-{
-       xfs_inode_t     *rip;
-       bhv_vnode_t     *rvp;
-       int             unmount_event_wanted = 0;
-       int             unmount_event_flags = 0;
-       int             xfs_unmountfs_needed = 0;
-       int             error;
-
-       rip = mp->m_rootip;
-       rvp = XFS_ITOV(rip);
-
-#ifdef HAVE_DMAPI
-       if (mp->m_flags & XFS_MOUNT_DMAPI) {
-               error = XFS_SEND_PREUNMOUNT(mp,
-                               rip, DM_RIGHT_NULL, rip, DM_RIGHT_NULL,
-                               NULL, NULL, 0, 0,
-                               (mp->m_dmevmask & (1<<DM_EVENT_PREUNMOUNT))?
-                                       0:DM_FLAGS_UNWANTED);
-                       if (error)
-                               return XFS_ERROR(error);
-               unmount_event_wanted = 1;
-               unmount_event_flags = (mp->m_dmevmask & (1<<DM_EVENT_UNMOUNT))?
-                                       0 : DM_FLAGS_UNWANTED;
-       }
-#endif
-
-       /*
-        * Blow away any referenced inode in the filestreams cache.
-        * This can and will cause log traffic as inodes go inactive
-        * here.
-        */
-       xfs_filestream_unmount(mp);
-
-       XFS_bflush(mp->m_ddev_targp);
-       error = xfs_unmount_flush(mp, 0);
-       if (error)
-               goto out;
-
-       ASSERT(vn_count(rvp) == 1);
-
-       /*
-        * Drop the reference count
-        */
-       IRELE(rip);
-
-       /*
-        * If we're forcing a shutdown, typically because of a media error,
-        * we want to make sure we invalidate dirty pages that belong to
-        * referenced vnodes as well.
-        */
-       if (XFS_FORCED_SHUTDOWN(mp)) {
-               error = xfs_sync(mp, SYNC_WAIT | SYNC_CLOSE);
-               ASSERT(error != EFSCORRUPTED);
-       }
-       xfs_unmountfs_needed = 1;
-
-out:
-       /*      Send DMAPI event, if required.
-        *      Then do xfs_unmountfs() if needed.
-        *      Then return error (or zero).
-        */
-       if (unmount_event_wanted) {
-               /* Note: mp structure must still exist for
-                * XFS_SEND_UNMOUNT() call.
-                */
-               XFS_SEND_UNMOUNT(mp, error == 0 ? rip : NULL,
-                       DM_RIGHT_NULL, 0, error, unmount_event_flags);
-       }
-       if (xfs_unmountfs_needed) {
-               /*
-                * Call common unmount function to flush to disk
-                * and free the super block buffer & mount structures.
-                */
-               xfs_unmountfs(mp, credp);
-               xfs_qmops_put(mp);
-               xfs_dmops_put(mp);
-               kmem_free(mp);
-       }
-
-       return XFS_ERROR(error);
-}
-
 STATIC void
 xfs_quiesce_fs(
        xfs_mount_t             *mp)
index 995091f19499dae4f99023ea9419b545afeb22cc..de64bb6542df2341a92dc6af7d54d529c2049b88 100644 (file)
@@ -10,7 +10,6 @@ struct xfs_mount_args;
 
 int xfs_mount(struct xfs_mount *mp, struct xfs_mount_args *args,
                struct cred *credp);
-int xfs_unmount(struct xfs_mount *mp, int flags, struct cred *credp);
 int xfs_sync(struct xfs_mount *mp, int flags);
 void xfs_do_force_shutdown(struct xfs_mount *mp, int flags, char *fname,
                int lnnum);