diff options
| -rw-r--r-- | fs/ocfs2/xattr.c | 74 |
1 files changed, 45 insertions, 29 deletions
diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c index e97b34842cfe..2be19083713f 100644 --- a/fs/ocfs2/xattr.c +++ b/fs/ocfs2/xattr.c | |||
| @@ -709,7 +709,7 @@ static int ocfs2_xattr_extend_allocation(struct inode *inode, | |||
| 709 | struct ocfs2_xattr_value_buf *vb, | 709 | struct ocfs2_xattr_value_buf *vb, |
| 710 | struct ocfs2_xattr_set_ctxt *ctxt) | 710 | struct ocfs2_xattr_set_ctxt *ctxt) |
| 711 | { | 711 | { |
| 712 | int status = 0; | 712 | int status = 0, credits; |
| 713 | handle_t *handle = ctxt->handle; | 713 | handle_t *handle = ctxt->handle; |
| 714 | enum ocfs2_alloc_restarted why; | 714 | enum ocfs2_alloc_restarted why; |
| 715 | u32 prev_clusters, logical_start = le32_to_cpu(vb->vb_xv->xr_clusters); | 715 | u32 prev_clusters, logical_start = le32_to_cpu(vb->vb_xv->xr_clusters); |
| @@ -719,38 +719,54 @@ static int ocfs2_xattr_extend_allocation(struct inode *inode, | |||
| 719 | 719 | ||
| 720 | ocfs2_init_xattr_value_extent_tree(&et, INODE_CACHE(inode), vb); | 720 | ocfs2_init_xattr_value_extent_tree(&et, INODE_CACHE(inode), vb); |
| 721 | 721 | ||
| 722 | status = vb->vb_access(handle, INODE_CACHE(inode), vb->vb_bh, | 722 | while (clusters_to_add) { |
| 723 | OCFS2_JOURNAL_ACCESS_WRITE); | 723 | status = vb->vb_access(handle, INODE_CACHE(inode), vb->vb_bh, |
| 724 | if (status < 0) { | 724 | OCFS2_JOURNAL_ACCESS_WRITE); |
| 725 | mlog_errno(status); | 725 | if (status < 0) { |
| 726 | goto leave; | 726 | mlog_errno(status); |
| 727 | } | 727 | break; |
| 728 | } | ||
| 728 | 729 | ||
| 729 | prev_clusters = le32_to_cpu(vb->vb_xv->xr_clusters); | 730 | prev_clusters = le32_to_cpu(vb->vb_xv->xr_clusters); |
| 730 | status = ocfs2_add_clusters_in_btree(handle, | 731 | status = ocfs2_add_clusters_in_btree(handle, |
| 731 | &et, | 732 | &et, |
| 732 | &logical_start, | 733 | &logical_start, |
| 733 | clusters_to_add, | 734 | clusters_to_add, |
| 734 | 0, | 735 | 0, |
| 735 | ctxt->data_ac, | 736 | ctxt->data_ac, |
| 736 | ctxt->meta_ac, | 737 | ctxt->meta_ac, |
| 737 | &why); | 738 | &why); |
| 738 | if (status < 0) { | 739 | if ((status < 0) && (status != -EAGAIN)) { |
| 739 | mlog_errno(status); | 740 | if (status != -ENOSPC) |
| 740 | goto leave; | 741 | mlog_errno(status); |
| 741 | } | 742 | break; |
| 743 | } | ||
| 742 | 744 | ||
| 743 | ocfs2_journal_dirty(handle, vb->vb_bh); | 745 | ocfs2_journal_dirty(handle, vb->vb_bh); |
| 744 | 746 | ||
| 745 | clusters_to_add -= le32_to_cpu(vb->vb_xv->xr_clusters) - prev_clusters; | 747 | clusters_to_add -= le32_to_cpu(vb->vb_xv->xr_clusters) - |
| 748 | prev_clusters; | ||
| 746 | 749 | ||
| 747 | /* | 750 | if (why != RESTART_NONE && clusters_to_add) { |
| 748 | * We should have already allocated enough space before the transaction, | 751 | /* |
| 749 | * so no need to restart. | 752 | * We can only fail in case the alloc file doesn't give |
| 750 | */ | 753 | * up enough clusters. |
| 751 | BUG_ON(why != RESTART_NONE || clusters_to_add); | 754 | */ |
| 752 | 755 | BUG_ON(why == RESTART_META); | |
| 753 | leave: | 756 | |
| 757 | mlog(0, "restarting xattr value extension for %u" | ||
| 758 | " clusters,.\n", clusters_to_add); | ||
| 759 | credits = ocfs2_calc_extend_credits(inode->i_sb, | ||
| 760 | &vb->vb_xv->xr_list, | ||
| 761 | clusters_to_add); | ||
| 762 | status = ocfs2_extend_trans(handle, credits); | ||
| 763 | if (status < 0) { | ||
| 764 | status = -ENOMEM; | ||
| 765 | mlog_errno(status); | ||
| 766 | break; | ||
| 767 | } | ||
| 768 | } | ||
| 769 | } | ||
| 754 | 770 | ||
| 755 | return status; | 771 | return status; |
| 756 | } | 772 | } |
