Add --enable-debug-dmu-tx configure option
[zfs.git] / module / zfs / zpl_super.c
index 3abb26a..98d0a03 100644 (file)
@@ -26,6 +26,7 @@
 #include <sys/zfs_vfsops.h>
 #include <sys/zfs_vnops.h>
 #include <sys/zfs_znode.h>
+#include <sys/zfs_ctldir.h>
 #include <sys/zpl.h>
 
 
@@ -139,21 +140,45 @@ zpl_remount_fs(struct super_block *sb, int *flags, char *data)
        return (error);
 }
 
-static int
-zpl_show_options(struct seq_file *seq, struct vfsmount *vfsp)
+static void
+zpl_umount_begin(struct super_block *sb)
 {
-       struct super_block *sb = vfsp->mnt_sb;
        zfs_sb_t *zsb = sb->s_fs_info;
+       int count;
 
        /*
-        * The Linux VFS automatically handles the following flags:
-        * MNT_NOSUID, MNT_NODEV, MNT_NOEXEC, MNT_NOATIME, MNT_READONLY
+        * Best effort to unmount snapshots in .zfs/snapshot/.  Normally this
+        * isn't required because snapshots have the MNT_SHRINKABLE flag set.
         */
+       if (zsb->z_ctldir)
+               (void) zfsctl_unmount_snapshots(zsb, MNT_FORCE, &count);
+}
+
+/*
+ * The Linux VFS automatically handles the following flags:
+ * MNT_NOSUID, MNT_NODEV, MNT_NOEXEC, MNT_NOATIME, MNT_READONLY
+ */
+#ifdef HAVE_SHOW_OPTIONS_WITH_DENTRY
+static int
+zpl_show_options(struct seq_file *seq, struct dentry *root)
+{
+       zfs_sb_t *zsb = root->d_sb->s_fs_info;
 
        seq_printf(seq, ",%s", zsb->z_flags & ZSB_XATTR ? "xattr" : "noxattr");
 
        return (0);
 }
+#else
+static int
+zpl_show_options(struct seq_file *seq, struct vfsmount *vfsp)
+{
+       zfs_sb_t *zsb = vfsp->mnt_sb->s_fs_info;
+
+       seq_printf(seq, ",%s", zsb->z_flags & ZSB_XATTR ? "xattr" : "noxattr");
+
+       return (0);
+}
+#endif /* HAVE_SHOW_OPTIONS_WITH_DENTRY */
 
 static int
 zpl_fill_super(struct super_block *sb, void *data, int silent)
@@ -189,13 +214,7 @@ zpl_get_sb(struct file_system_type *fs_type, int flags,
 static void
 zpl_kill_sb(struct super_block *sb)
 {
-#ifdef HAVE_SNAPSHOT
-       zfs_sb_t *zsb = sb->s_fs_info;
-
-       if (zsb && dmu_objset_is_snapshot(zsb->z_os))
-               zfs_snap_destroy(zsb);
-#endif /* HAVE_SNAPSHOT */
-
+       zfs_preumount(sb);
        kill_anon_super(sb);
 }
 
@@ -296,6 +315,7 @@ const struct super_operations zpl_super_operations = {
        .sync_fs                = zpl_sync_fs,
        .statfs                 = zpl_statfs,
        .remount_fs             = zpl_remount_fs,
+       .umount_begin           = zpl_umount_begin,
        .show_options           = zpl_show_options,
        .show_stats             = NULL,
 #ifdef HAVE_NR_CACHED_OBJECTS