diff options
Diffstat (limited to 'fs/xfs/xfs_mount.c')
| -rw-r--r-- | fs/xfs/xfs_mount.c | 105 |
1 files changed, 87 insertions, 18 deletions
diff --git a/fs/xfs/xfs_mount.c b/fs/xfs/xfs_mount.c index 65a99725d0cc..5c6f092659c1 100644 --- a/fs/xfs/xfs_mount.c +++ b/fs/xfs/xfs_mount.c | |||
| @@ -960,6 +960,53 @@ xfs_check_sizes(xfs_mount_t *mp) | |||
| 960 | } | 960 | } |
| 961 | 961 | ||
| 962 | /* | 962 | /* |
| 963 | * Clear the quotaflags in memory and in the superblock. | ||
| 964 | */ | ||
| 965 | int | ||
| 966 | xfs_mount_reset_sbqflags( | ||
| 967 | struct xfs_mount *mp) | ||
| 968 | { | ||
| 969 | int error; | ||
| 970 | struct xfs_trans *tp; | ||
| 971 | |||
| 972 | mp->m_qflags = 0; | ||
| 973 | |||
| 974 | /* | ||
| 975 | * It is OK to look at sb_qflags here in mount path, | ||
| 976 | * without m_sb_lock. | ||
| 977 | */ | ||
| 978 | if (mp->m_sb.sb_qflags == 0) | ||
| 979 | return 0; | ||
| 980 | spin_lock(&mp->m_sb_lock); | ||
| 981 | mp->m_sb.sb_qflags = 0; | ||
| 982 | spin_unlock(&mp->m_sb_lock); | ||
| 983 | |||
| 984 | /* | ||
| 985 | * If the fs is readonly, let the incore superblock run | ||
| 986 | * with quotas off but don't flush the update out to disk | ||
| 987 | */ | ||
| 988 | if (mp->m_flags & XFS_MOUNT_RDONLY) | ||
| 989 | return 0; | ||
| 990 | |||
| 991 | #ifdef QUOTADEBUG | ||
| 992 | xfs_fs_cmn_err(CE_NOTE, mp, "Writing superblock quota changes"); | ||
| 993 | #endif | ||
| 994 | |||
| 995 | tp = xfs_trans_alloc(mp, XFS_TRANS_QM_SBCHANGE); | ||
| 996 | error = xfs_trans_reserve(tp, 0, mp->m_sb.sb_sectsize + 128, 0, 0, | ||
| 997 | XFS_DEFAULT_LOG_COUNT); | ||
| 998 | if (error) { | ||
| 999 | xfs_trans_cancel(tp, 0); | ||
| 1000 | xfs_fs_cmn_err(CE_ALERT, mp, | ||
| 1001 | "xfs_mount_reset_sbqflags: Superblock update failed!"); | ||
| 1002 | return error; | ||
| 1003 | } | ||
| 1004 | |||
| 1005 | xfs_mod_sb(tp, XFS_SB_QFLAGS); | ||
| 1006 | return xfs_trans_commit(tp, 0); | ||
| 1007 | } | ||
| 1008 | |||
| 1009 | /* | ||
| 963 | * This function does the following on an initial mount of a file system: | 1010 | * This function does the following on an initial mount of a file system: |
| 964 | * - reads the superblock from disk and init the mount struct | 1011 | * - reads the superblock from disk and init the mount struct |
| 965 | * - if we're a 32-bit kernel, do a size check on the superblock | 1012 | * - if we're a 32-bit kernel, do a size check on the superblock |
| @@ -976,7 +1023,8 @@ xfs_mountfs( | |||
| 976 | xfs_sb_t *sbp = &(mp->m_sb); | 1023 | xfs_sb_t *sbp = &(mp->m_sb); |
| 977 | xfs_inode_t *rip; | 1024 | xfs_inode_t *rip; |
| 978 | __uint64_t resblks; | 1025 | __uint64_t resblks; |
| 979 | uint quotamount, quotaflags; | 1026 | uint quotamount = 0; |
| 1027 | uint quotaflags = 0; | ||
| 980 | int error = 0; | 1028 | int error = 0; |
| 981 | 1029 | ||
| 982 | xfs_mount_common(mp, sbp); | 1030 | xfs_mount_common(mp, sbp); |
| @@ -1210,9 +1258,28 @@ xfs_mountfs( | |||
| 1210 | /* | 1258 | /* |
| 1211 | * Initialise the XFS quota management subsystem for this mount | 1259 | * Initialise the XFS quota management subsystem for this mount |
| 1212 | */ | 1260 | */ |
| 1213 | error = XFS_QM_INIT(mp, "amount, "aflags); | 1261 | if (XFS_IS_QUOTA_RUNNING(mp)) { |
| 1214 | if (error) | 1262 | error = xfs_qm_newmount(mp, "amount, "aflags); |
| 1215 | goto out_rtunmount; | 1263 | if (error) |
| 1264 | goto out_rtunmount; | ||
| 1265 | } else { | ||
| 1266 | ASSERT(!XFS_IS_QUOTA_ON(mp)); | ||
| 1267 | |||
| 1268 | /* | ||
| 1269 | * If a file system had quotas running earlier, but decided to | ||
| 1270 | * mount without -o uquota/pquota/gquota options, revoke the | ||
| 1271 | * quotachecked license. | ||
| 1272 | */ | ||
| 1273 | if (mp->m_sb.sb_qflags & XFS_ALL_QUOTA_ACCT) { | ||
| 1274 | cmn_err(CE_NOTE, | ||
| 1275 | "XFS: resetting qflags for filesystem %s", | ||
| 1276 | mp->m_fsname); | ||
| 1277 | |||
| 1278 | error = xfs_mount_reset_sbqflags(mp); | ||
| 1279 | if (error) | ||
| 1280 | return error; | ||
| 1281 | } | ||
| 1282 | } | ||
| 1216 | 1283 | ||
| 1217 | /* | 1284 | /* |
| 1218 | * Finish recovering the file system. This part needed to be | 1285 | * Finish recovering the file system. This part needed to be |
| @@ -1228,9 +1295,19 @@ xfs_mountfs( | |||
| 1228 | /* | 1295 | /* |
| 1229 | * Complete the quota initialisation, post-log-replay component. | 1296 | * Complete the quota initialisation, post-log-replay component. |
| 1230 | */ | 1297 | */ |
| 1231 | error = XFS_QM_MOUNT(mp, quotamount, quotaflags); | 1298 | if (quotamount) { |
| 1232 | if (error) | 1299 | ASSERT(mp->m_qflags == 0); |
| 1233 | goto out_rtunmount; | 1300 | mp->m_qflags = quotaflags; |
| 1301 | |||
| 1302 | xfs_qm_mount_quotas(mp); | ||
| 1303 | } | ||
| 1304 | |||
| 1305 | #if defined(DEBUG) && defined(XFS_LOUD_RECOVERY) | ||
| 1306 | if (XFS_IS_QUOTA_ON(mp)) | ||
| 1307 | xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas turned on"); | ||
| 1308 | else | ||
| 1309 | xfs_fs_cmn_err(CE_NOTE, mp, "Disk quotas not turned on"); | ||
| 1310 | #endif | ||
| 1234 | 1311 | ||
| 1235 | /* | 1312 | /* |
| 1236 | * Now we are mounted, reserve a small amount of unused space for | 1313 | * Now we are mounted, reserve a small amount of unused space for |
| @@ -1279,12 +1356,7 @@ xfs_unmountfs( | |||
| 1279 | __uint64_t resblks; | 1356 | __uint64_t resblks; |
| 1280 | int error; | 1357 | int error; |
| 1281 | 1358 | ||
| 1282 | /* | 1359 | xfs_qm_unmount_quotas(mp); |
| 1283 | * Release dquot that rootinode, rbmino and rsumino might be holding, | ||
| 1284 | * and release the quota inodes. | ||
| 1285 | */ | ||
| 1286 | XFS_QM_UNMOUNT(mp); | ||
| 1287 | |||
| 1288 | xfs_rtunmount_inodes(mp); | 1360 | xfs_rtunmount_inodes(mp); |
| 1289 | IRELE(mp->m_rootip); | 1361 | IRELE(mp->m_rootip); |
| 1290 | 1362 | ||
| @@ -1299,12 +1371,9 @@ xfs_unmountfs( | |||
| 1299 | * need to force the log first. | 1371 | * need to force the log first. |
| 1300 | */ | 1372 | */ |
| 1301 | xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE | XFS_LOG_SYNC); | 1373 | xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE | XFS_LOG_SYNC); |
| 1302 | xfs_reclaim_inodes(mp, 0, XFS_IFLUSH_ASYNC); | 1374 | xfs_reclaim_inodes(mp, XFS_IFLUSH_ASYNC); |
| 1303 | |||
| 1304 | XFS_QM_DQPURGEALL(mp, XFS_QMOPT_QUOTALL | XFS_QMOPT_UMOUNTING); | ||
| 1305 | 1375 | ||
| 1306 | if (mp->m_quotainfo) | 1376 | xfs_qm_unmount(mp); |
| 1307 | XFS_QM_DONE(mp); | ||
| 1308 | 1377 | ||
| 1309 | /* | 1378 | /* |
| 1310 | * Flush out the log synchronously so that we know for sure | 1379 | * Flush out the log synchronously so that we know for sure |
