]> 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 1c6fdeb702ffde9d3ab8b7a4835d55275bbd4926..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"
 
@@ -147,9 +144,9 @@ xfs_growfs_data_private(
        if ((error = xfs_sb_validate_fsb_count(&mp->m_sb, nb)))
                return error;
        dpct = pct - mp->m_sb.sb_imax_pct;
-       bp = xfs_buf_read_uncached(mp, mp->m_ddev_targp,
+       bp = xfs_buf_read_uncached(mp->m_ddev_targp,
                                XFS_FSB_TO_BB(mp, nb) - XFS_FSS_TO_BB(mp, 1),
-                               BBTOB(XFS_FSS_TO_BB(mp, 1)), 0);
+                               XFS_FSS_TO_BB(mp, 1), 0);
        if (!bp)
                return EIO;
        xfs_buf_relse(bp);
@@ -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_LOCK | 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_LOCK | XBF_MAPPED);
+                                XFS_FSS_TO_BB(mp, 1), 0);
                if (!bp) {
                        error = ENOMEM;
                        goto error0;
@@ -259,8 +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_LOCK | XBF_MAPPED);
+                                BTOBB(mp->m_sb.sb_blocksize), 0);
                if (!bp) {
                        error = ENOMEM;
                        goto error0;
@@ -286,8 +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_LOCK | XBF_MAPPED);
+                                BTOBB(mp->m_sb.sb_blocksize), 0);
                if (!bp) {
                        error = ENOMEM;
                        goto error0;
@@ -314,8 +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_LOCK | XBF_MAPPED);
+                                BTOBB(mp->m_sb.sb_blocksize), 0);
                if (!bp) {
                        error = ENOMEM;
                        goto error0;
@@ -405,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) {
@@ -693,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)");
+       }
+}