Skip to content

Commit

Permalink
[XFS] Catch errors when turning off quotas.
Browse files Browse the repository at this point in the history
When turning off quota, we need to write various transactions to the log
to ensure that they are cleanly removed in the case of a crash. We need to
check that the transactions hit the disk correctly. If we fail to write
the final quota off transaction, we are corrupt in memory and so the only
option is to shut the filesystem down at this point.

SGI-PV: 980084
SGI-Modid: xfs-linux-melb:xfs-kern:30790a

Signed-off-by: David Chinner <dgc@sgi.com>
Signed-off-by: Niv Sardi <xaiki@sgi.com>
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
  • Loading branch information
David Chinner authored and Lachlan McIlroy committed Apr 18, 2008
1 parent 31d5577 commit cb6edc2
Showing 1 changed file with 12 additions and 3 deletions.
15 changes: 12 additions & 3 deletions fs/xfs/quota/xfs_qm_syscalls.c
Original file line number Diff line number Diff line change
Expand Up @@ -279,9 +279,12 @@ xfs_qm_scall_quotaoff(

/*
* Write the LI_QUOTAOFF log record, and do SB changes atomically,
* and synchronously.
* and synchronously. If we fail to write, we should abort the
* operation as it cannot be recovered safely if we crash.
*/
xfs_qm_log_quotaoff(mp, &qoffstart, flags);
error = xfs_qm_log_quotaoff(mp, &qoffstart, flags);
if (error)
goto out_error;

/*
* Next we clear the XFS_MOUNT_*DQ_ACTIVE bit(s) in the mount struct
Expand Down Expand Up @@ -337,7 +340,12 @@ xfs_qm_scall_quotaoff(
* So, we have QUOTAOFF start and end logitems; the start
* logitem won't get overwritten until the end logitem appears...
*/
xfs_qm_log_quotaoff_end(mp, qoffstart, flags);
error = xfs_qm_log_quotaoff_end(mp, qoffstart, flags);
if (error) {
/* We're screwed now. Shutdown is the only option. */
xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
goto out_error;
}

/*
* If quotas is completely disabled, close shop.
Expand All @@ -361,6 +369,7 @@ xfs_qm_scall_quotaoff(
XFS_PURGE_INODE(XFS_QI_GQIP(mp));
XFS_QI_GQIP(mp) = NULL;
}
out_error:
mutex_unlock(&(XFS_QI_QOFFLOCK(mp)));

return (error);
Expand Down

0 comments on commit cb6edc2

Please sign in to comment.