diff options
author | Christoph Hellwig <hch@infradead.org> | 2010-07-20 03:51:31 -0400 |
---|---|---|
committer | Alex Elder <aelder@sgi.com> | 2010-07-26 14:16:52 -0400 |
commit | 5d18898b20dfed5f373f8a9a7cbe01446036f8e9 (patch) | |
tree | dc96915d62c7140ad4ac33a3724ddf36f9db022f /fs/xfs/quota/xfs_qm_syscalls.c | |
parent | 939d723b721eef71060201738653a73443ff4510 (diff) |
xfs: simplify xfs_truncate_file
xfs_truncate_file is only used for truncating quota files. Move it to
xfs_qm_syscalls.c so it can be marked static and take advatange of the
fact by removing the unused page cache validation and taking the iget
into the helper.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
Diffstat (limited to 'fs/xfs/quota/xfs_qm_syscalls.c')
-rw-r--r-- | fs/xfs/quota/xfs_qm_syscalls.c | 70 |
1 files changed, 52 insertions, 18 deletions
diff --git a/fs/xfs/quota/xfs_qm_syscalls.c b/fs/xfs/quota/xfs_qm_syscalls.c index 73f2b203975e..d257eb8557c4 100644 --- a/fs/xfs/quota/xfs_qm_syscalls.c +++ b/fs/xfs/quota/xfs_qm_syscalls.c | |||
@@ -238,40 +238,74 @@ out_unlock: | |||
238 | return error; | 238 | return error; |
239 | } | 239 | } |
240 | 240 | ||
241 | STATIC int | ||
242 | xfs_qm_scall_trunc_qfile( | ||
243 | struct xfs_mount *mp, | ||
244 | xfs_ino_t ino) | ||
245 | { | ||
246 | struct xfs_inode *ip; | ||
247 | struct xfs_trans *tp; | ||
248 | int error; | ||
249 | |||
250 | if (ino == NULLFSINO) | ||
251 | return 0; | ||
252 | |||
253 | error = xfs_iget(mp, NULL, ino, 0, 0, &ip); | ||
254 | if (error) | ||
255 | return error; | ||
256 | |||
257 | xfs_ilock(ip, XFS_IOLOCK_EXCL); | ||
258 | |||
259 | tp = xfs_trans_alloc(mp, XFS_TRANS_TRUNCATE_FILE); | ||
260 | error = xfs_trans_reserve(tp, 0, XFS_ITRUNCATE_LOG_RES(mp), 0, | ||
261 | XFS_TRANS_PERM_LOG_RES, | ||
262 | XFS_ITRUNCATE_LOG_COUNT); | ||
263 | if (error) { | ||
264 | xfs_trans_cancel(tp, 0); | ||
265 | xfs_iunlock(ip, XFS_IOLOCK_EXCL); | ||
266 | goto out_put; | ||
267 | } | ||
268 | |||
269 | xfs_ilock(ip, XFS_ILOCK_EXCL); | ||
270 | xfs_trans_ijoin(tp, ip); | ||
271 | |||
272 | error = xfs_itruncate_finish(&tp, ip, 0, XFS_DATA_FORK, 1); | ||
273 | if (error) { | ||
274 | xfs_trans_cancel(tp, XFS_TRANS_RELEASE_LOG_RES | | ||
275 | XFS_TRANS_ABORT); | ||
276 | goto out_unlock; | ||
277 | } | ||
278 | |||
279 | xfs_ichgtime(ip, XFS_ICHGTIME_MOD | XFS_ICHGTIME_CHG); | ||
280 | error = xfs_trans_commit(tp, XFS_TRANS_RELEASE_LOG_RES); | ||
281 | |||
282 | out_unlock: | ||
283 | xfs_iunlock(ip, XFS_ILOCK_EXCL | XFS_IOLOCK_EXCL); | ||
284 | out_put: | ||
285 | IRELE(ip); | ||
286 | return error; | ||
287 | } | ||
288 | |||
241 | int | 289 | int |
242 | xfs_qm_scall_trunc_qfiles( | 290 | xfs_qm_scall_trunc_qfiles( |
243 | xfs_mount_t *mp, | 291 | xfs_mount_t *mp, |
244 | uint flags) | 292 | uint flags) |
245 | { | 293 | { |
246 | int error = 0, error2 = 0; | 294 | int error = 0, error2 = 0; |
247 | xfs_inode_t *qip; | ||
248 | 295 | ||
249 | if (!xfs_sb_version_hasquota(&mp->m_sb) || flags == 0) { | 296 | if (!xfs_sb_version_hasquota(&mp->m_sb) || flags == 0) { |
250 | qdprintk("qtrunc flags=%x m_qflags=%x\n", flags, mp->m_qflags); | 297 | qdprintk("qtrunc flags=%x m_qflags=%x\n", flags, mp->m_qflags); |
251 | return XFS_ERROR(EINVAL); | 298 | return XFS_ERROR(EINVAL); |
252 | } | 299 | } |
253 | 300 | ||
254 | if ((flags & XFS_DQ_USER) && mp->m_sb.sb_uquotino != NULLFSINO) { | 301 | if (flags & XFS_DQ_USER) |
255 | error = xfs_iget(mp, NULL, mp->m_sb.sb_uquotino, 0, 0, &qip); | 302 | error = xfs_qm_scall_trunc_qfile(mp, mp->m_sb.sb_uquotino); |
256 | if (!error) { | 303 | if (flags & (XFS_DQ_GROUP|XFS_DQ_PROJ)) |
257 | error = xfs_truncate_file(mp, qip); | 304 | error2 = xfs_qm_scall_trunc_qfile(mp, mp->m_sb.sb_gquotino); |
258 | IRELE(qip); | ||
259 | } | ||
260 | } | ||
261 | |||
262 | if ((flags & (XFS_DQ_GROUP|XFS_DQ_PROJ)) && | ||
263 | mp->m_sb.sb_gquotino != NULLFSINO) { | ||
264 | error2 = xfs_iget(mp, NULL, mp->m_sb.sb_gquotino, 0, 0, &qip); | ||
265 | if (!error2) { | ||
266 | error2 = xfs_truncate_file(mp, qip); | ||
267 | IRELE(qip); | ||
268 | } | ||
269 | } | ||
270 | 305 | ||
271 | return error ? error : error2; | 306 | return error ? error : error2; |
272 | } | 307 | } |
273 | 308 | ||
274 | |||
275 | /* | 309 | /* |
276 | * Switch on (a given) quota enforcement for a filesystem. This takes | 310 | * Switch on (a given) quota enforcement for a filesystem. This takes |
277 | * effect immediately. | 311 | * effect immediately. |