]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - fs/xfs/xfs_fsops.c
xfs: make XBF_MAPPED the default behaviour
[karo-tx-linux.git] / fs / xfs / xfs_fsops.c
index 874d39883dab6cd08e3145d41e26328f88eaffad..c25b094efbf715186f39a9b7a44466eb0a910374 100644 (file)
@@ -18,8 +18,6 @@
 #include "xfs.h"
 #include "xfs_fs.h"
 #include "xfs_types.h"
-#include "xfs_bit.h"
-#include "xfs_inum.h"
 #include "xfs_log.h"
 #include "xfs_trans.h"
 #include "xfs_sb.h"
@@ -39,7 +37,6 @@
 #include "xfs_itable.h"
 #include "xfs_trans_space.h"
 #include "xfs_rtalloc.h"
-#include "xfs_rw.h"
 #include "xfs_filestream.h"
 #include "xfs_trace.h"
 
@@ -193,7 +190,7 @@ xfs_growfs_data_private(
                 */
                bp = xfs_buf_get(mp->m_ddev_targp,
                                 XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)),
-                                XFS_FSS_TO_BB(mp, 1), XBF_MAPPED);
+                                XFS_FSS_TO_BB(mp, 1), 0);
                if (!bp) {
                        error = ENOMEM;
                        goto error0;
@@ -230,7 +227,7 @@ xfs_growfs_data_private(
                 */
                bp = xfs_buf_get(mp->m_ddev_targp,
                                 XFS_AG_DADDR(mp, agno, XFS_AGI_DADDR(mp)),
-                                XFS_FSS_TO_BB(mp, 1), XBF_MAPPED);
+                                XFS_FSS_TO_BB(mp, 1), 0);
                if (!bp) {
                        error = ENOMEM;
                        goto error0;
@@ -259,7 +256,7 @@ xfs_growfs_data_private(
                 */
                bp = xfs_buf_get(mp->m_ddev_targp,
                                 XFS_AGB_TO_DADDR(mp, agno, XFS_BNO_BLOCK(mp)),
-                                BTOBB(mp->m_sb.sb_blocksize), XBF_MAPPED);
+                                BTOBB(mp->m_sb.sb_blocksize), 0);
                if (!bp) {
                        error = ENOMEM;
                        goto error0;
@@ -285,7 +282,7 @@ xfs_growfs_data_private(
                 */
                bp = xfs_buf_get(mp->m_ddev_targp,
                                 XFS_AGB_TO_DADDR(mp, agno, XFS_CNT_BLOCK(mp)),
-                                BTOBB(mp->m_sb.sb_blocksize), XBF_MAPPED);
+                                BTOBB(mp->m_sb.sb_blocksize), 0);
                if (!bp) {
                        error = ENOMEM;
                        goto error0;
@@ -312,7 +309,7 @@ xfs_growfs_data_private(
                 */
                bp = xfs_buf_get(mp->m_ddev_targp,
                                 XFS_AGB_TO_DADDR(mp, agno, XFS_IBT_BLOCK(mp)),
-                                BTOBB(mp->m_sb.sb_blocksize), XBF_MAPPED);
+                                BTOBB(mp->m_sb.sb_blocksize), 0);
                if (!bp) {
                        error = ENOMEM;
                        goto error0;
@@ -402,7 +399,7 @@ xfs_growfs_data_private(
 
        /* update secondary superblocks. */
        for (agno = 1; agno < nagcount; agno++) {
-               error = xfs_read_buf(mp, mp->m_ddev_targp,
+               error = xfs_trans_read_buf(mp, NULL, mp->m_ddev_targp,
                                  XFS_AGB_TO_DADDR(mp, agno, XFS_SB_BLOCK(mp)),
                                  XFS_FSS_TO_BB(mp, 1), 0, &bp);
                if (error) {
@@ -690,3 +687,63 @@ xfs_fs_goingdown(
 
        return 0;
 }
+
+/*
+ * Force a shutdown of the filesystem instantly while keeping the filesystem
+ * consistent. We don't do an unmount here; just shutdown the shop, make sure
+ * that absolutely nothing persistent happens to this filesystem after this
+ * point.
+ */
+void
+xfs_do_force_shutdown(
+       xfs_mount_t     *mp,
+       int             flags,
+       char            *fname,
+       int             lnnum)
+{
+       int             logerror;
+
+       logerror = flags & SHUTDOWN_LOG_IO_ERROR;
+
+       if (!(flags & SHUTDOWN_FORCE_UMOUNT)) {
+               xfs_notice(mp,
+       "%s(0x%x) called from line %d of file %s.  Return address = 0x%p",
+                       __func__, flags, lnnum, fname, __return_address);
+       }
+       /*
+        * No need to duplicate efforts.
+        */
+       if (XFS_FORCED_SHUTDOWN(mp) && !logerror)
+               return;
+
+       /*
+        * This flags XFS_MOUNT_FS_SHUTDOWN, makes sure that we don't
+        * queue up anybody new on the log reservations, and wakes up
+        * everybody who's sleeping on log reservations to tell them
+        * the bad news.
+        */
+       if (xfs_log_force_umount(mp, logerror))
+               return;
+
+       if (flags & SHUTDOWN_CORRUPT_INCORE) {
+               xfs_alert_tag(mp, XFS_PTAG_SHUTDOWN_CORRUPT,
+    "Corruption of in-memory data detected.  Shutting down filesystem");
+               if (XFS_ERRLEVEL_HIGH <= xfs_error_level)
+                       xfs_stack_trace();
+       } else if (!(flags & SHUTDOWN_FORCE_UMOUNT)) {
+               if (logerror) {
+                       xfs_alert_tag(mp, XFS_PTAG_SHUTDOWN_LOGERROR,
+               "Log I/O Error Detected.  Shutting down filesystem");
+               } else if (flags & SHUTDOWN_DEVICE_REQ) {
+                       xfs_alert_tag(mp, XFS_PTAG_SHUTDOWN_IOERROR,
+               "All device paths lost.  Shutting down filesystem");
+               } else if (!(flags & SHUTDOWN_REMOTE_REQ)) {
+                       xfs_alert_tag(mp, XFS_PTAG_SHUTDOWN_IOERROR,
+               "I/O Error Detected. Shutting down filesystem");
+               }
+       }
+       if (!(flags & SHUTDOWN_FORCE_UMOUNT)) {
+               xfs_alert(mp,
+       "Please umount the filesystem and rectify the problem(s)");
+       }
+}