aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ocfs2/inode.c
diff options
context:
space:
mode:
authorMark Fasheh <mark.fasheh@oracle.com>2007-01-17 15:53:31 -0500
committerMark Fasheh <mark.fasheh@oracle.com>2007-04-26 18:01:56 -0400
commit3a0782d09c07aa3ec767ba6089cd15cfbfbfc508 (patch)
tree4791919970e11f4b2fb3162481a59a56f5196fe4 /fs/ocfs2/inode.c
parent363041a5f74b953ab6b705ac9c88e5eda218a24b (diff)
ocfs2: teach extend/truncate about sparse files
For ocfs2_truncate_file(), we eliminate the "simple" truncate case which no longer exists since i_size is not tied to i_clusters. In ocfs2_extend_file(), we skip the allocation / page zeroing code for file systems which understand sparse files. The core truncate code is changed to do a bottom up tree traversal. This gets abstracted out into it's own function. To make things more readable, most of the special case handling for in-inode extents from ocfs2_do_truncate() is also removed. Though write support for sparse files comes in a later patch, we at least update ocfs2_prepare_inode_for_write() to skip allocation for sparse files. Signed-off-by: Mark Fasheh <mark.fasheh@oracle.com>
Diffstat (limited to 'fs/ocfs2/inode.c')
-rw-r--r--fs/ocfs2/inode.c46
1 files changed, 12 insertions, 34 deletions
diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c
index 5ff8549eb1a3..0bd86a137591 100644
--- a/fs/ocfs2/inode.c
+++ b/fs/ocfs2/inode.c
@@ -487,7 +487,6 @@ static int ocfs2_truncate_for_delete(struct ocfs2_super *osb,
487 struct buffer_head *fe_bh) 487 struct buffer_head *fe_bh)
488{ 488{
489 int status = 0; 489 int status = 0;
490 handle_t *handle = NULL;
491 struct ocfs2_truncate_context *tc = NULL; 490 struct ocfs2_truncate_context *tc = NULL;
492 struct ocfs2_dinode *fe; 491 struct ocfs2_dinode *fe;
493 492
@@ -495,41 +494,20 @@ static int ocfs2_truncate_for_delete(struct ocfs2_super *osb,
495 494
496 fe = (struct ocfs2_dinode *) fe_bh->b_data; 495 fe = (struct ocfs2_dinode *) fe_bh->b_data;
497 496
498 /* zero allocation, zero truncate :) */ 497 if (fe->i_clusters) {
499 if (!fe->i_clusters) 498 status = ocfs2_prepare_truncate(osb, inode, fe_bh, &tc);
500 goto bail; 499 if (status < 0) {
501 500 mlog_errno(status);
502 handle = ocfs2_start_trans(osb, OCFS2_INODE_UPDATE_CREDITS); 501 goto out;
503 if (IS_ERR(handle)) { 502 }
504 status = PTR_ERR(handle);
505 handle = NULL;
506 mlog_errno(status);
507 goto bail;
508 }
509
510 status = ocfs2_set_inode_size(handle, inode, fe_bh, 0ULL);
511 if (status < 0) {
512 mlog_errno(status);
513 goto bail;
514 }
515
516 ocfs2_commit_trans(osb, handle);
517 handle = NULL;
518
519 status = ocfs2_prepare_truncate(osb, inode, fe_bh, &tc);
520 if (status < 0) {
521 mlog_errno(status);
522 goto bail;
523 }
524 503
525 status = ocfs2_commit_truncate(osb, inode, fe_bh, tc); 504 status = ocfs2_commit_truncate(osb, inode, fe_bh, tc);
526 if (status < 0) { 505 if (status < 0) {
527 mlog_errno(status); 506 mlog_errno(status);
528 goto bail; 507 goto out;
508 }
529 } 509 }
530bail: 510out:
531 if (handle)
532 ocfs2_commit_trans(osb, handle);
533 511
534 mlog_exit(status); 512 mlog_exit(status);
535 return status; 513 return status;