aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_mount.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/xfs_mount.c')
-rw-r--r--fs/xfs/xfs_mount.c35
1 files changed, 22 insertions, 13 deletions
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c
index 244aa1b9f134..2d03fe194c2c 100644
--- a/fs/xfs/xfs_mount.c
+++ b/fs/xfs/xfs_mount.c
@@ -45,7 +45,7 @@
45#include "xfs_fsops.h" 45#include "xfs_fsops.h"
46#include "xfs_utils.h" 46#include "xfs_utils.h"
47 47
48STATIC void xfs_mount_log_sb(xfs_mount_t *, __int64_t); 48STATIC int xfs_mount_log_sb(xfs_mount_t *, __int64_t);
49STATIC int xfs_uuid_mount(xfs_mount_t *); 49STATIC int xfs_uuid_mount(xfs_mount_t *);
50STATIC void xfs_uuid_unmount(xfs_mount_t *mp); 50STATIC void xfs_uuid_unmount(xfs_mount_t *mp);
51STATIC void xfs_unmountfs_wait(xfs_mount_t *); 51STATIC void xfs_unmountfs_wait(xfs_mount_t *);
@@ -1189,8 +1189,13 @@ xfs_mountfs(
1189 /* 1189 /*
1190 * If fs is not mounted readonly, then update the superblock changes. 1190 * If fs is not mounted readonly, then update the superblock changes.
1191 */ 1191 */
1192 if (update_flags && !(mp->m_flags & XFS_MOUNT_RDONLY)) 1192 if (update_flags && !(mp->m_flags & XFS_MOUNT_RDONLY)) {
1193 xfs_mount_log_sb(mp, update_flags); 1193 error = xfs_mount_log_sb(mp, update_flags);
1194 if (error) {
1195 cmn_err(CE_WARN, "XFS: failed to write sb changes");
1196 goto error4;
1197 }
1198 }
1194 1199
1195 /* 1200 /*
1196 * Initialise the XFS quota management subsystem for this mount 1201 * Initialise the XFS quota management subsystem for this mount
@@ -1320,8 +1325,10 @@ xfs_unmountfs(xfs_mount_t *mp, struct cred *cr)
1320 cmn_err(CE_WARN, "XFS: Unable to free reserved block pool. " 1325 cmn_err(CE_WARN, "XFS: Unable to free reserved block pool. "
1321 "Freespace may not be correct on next mount."); 1326 "Freespace may not be correct on next mount.");
1322 1327
1323 1328 error = xfs_log_sbcount(mp, 1);
1324 xfs_log_sbcount(mp, 1); 1329 if (error)
1330 cmn_err(CE_WARN, "XFS: Unable to update superblock counters. "
1331 "Freespace may not be correct on next mount.");
1325 xfs_unmountfs_writesb(mp); 1332 xfs_unmountfs_writesb(mp);
1326 xfs_unmountfs_wait(mp); /* wait for async bufs */ 1333 xfs_unmountfs_wait(mp); /* wait for async bufs */
1327 xfs_log_unmount(mp); /* Done! No more fs ops. */ 1334 xfs_log_unmount(mp); /* Done! No more fs ops. */
@@ -1413,9 +1420,8 @@ xfs_log_sbcount(
1413 xfs_mod_sb(tp, XFS_SB_IFREE | XFS_SB_ICOUNT | XFS_SB_FDBLOCKS); 1420 xfs_mod_sb(tp, XFS_SB_IFREE | XFS_SB_ICOUNT | XFS_SB_FDBLOCKS);
1414 if (sync) 1421 if (sync)
1415 xfs_trans_set_sync(tp); 1422 xfs_trans_set_sync(tp);
1416 xfs_trans_commit(tp, 0); 1423 error = xfs_trans_commit(tp, 0);
1417 1424 return error;
1418 return 0;
1419} 1425}
1420 1426
1421STATIC void 1427STATIC void
@@ -1913,24 +1919,27 @@ xfs_uuid_unmount(
1913 * be altered by the mount options, as well as any potential sb_features2 1919 * be altered by the mount options, as well as any potential sb_features2
1914 * fixup. Only the first superblock is updated. 1920 * fixup. Only the first superblock is updated.
1915 */ 1921 */
1916STATIC void 1922STATIC int
1917xfs_mount_log_sb( 1923xfs_mount_log_sb(
1918 xfs_mount_t *mp, 1924 xfs_mount_t *mp,
1919 __int64_t fields) 1925 __int64_t fields)
1920{ 1926{
1921 xfs_trans_t *tp; 1927 xfs_trans_t *tp;
1928 int error;
1922 1929
1923 ASSERT(fields & (XFS_SB_UNIT | XFS_SB_WIDTH | XFS_SB_UUID | 1930 ASSERT(fields & (XFS_SB_UNIT | XFS_SB_WIDTH | XFS_SB_UUID |
1924 XFS_SB_FEATURES2 | XFS_SB_BAD_FEATURES2)); 1931 XFS_SB_FEATURES2 | XFS_SB_BAD_FEATURES2));
1925 1932
1926 tp = xfs_trans_alloc(mp, XFS_TRANS_SB_UNIT); 1933 tp = xfs_trans_alloc(mp, XFS_TRANS_SB_UNIT);
1927 if (xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, 1934 error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0,
1928 XFS_DEFAULT_LOG_COUNT)) { 1935 XFS_DEFAULT_LOG_COUNT);
1936 if (error) {
1929 xfs_trans_cancel(tp, 0); 1937 xfs_trans_cancel(tp, 0);
1930 return; 1938 return error;
1931 } 1939 }
1932 xfs_mod_sb(tp, fields); 1940 xfs_mod_sb(tp, fields);
1933 xfs_trans_commit(tp, 0); 1941 error = xfs_trans_commit(tp, 0);
1942 return error;
1934} 1943}
1935 1944
1936 1945