diff options
author | Joel Becker <joel.becker@oracle.com> | 2008-12-09 18:01:04 -0500 |
---|---|---|
committer | Mark Fasheh <mfasheh@suse.com> | 2009-01-05 11:40:32 -0500 |
commit | b3e5d37905730dc5ddff717f55ed830caa80ea0e (patch) | |
tree | 00431340f37700a04aa02007da1cf2bcfd0a734e /fs/ocfs2/xattr.c | |
parent | 19b801f45fa5e4840b9be3dcf1e73b08f35b04d9 (diff) |
ocfs2: Pass ocfs2_xattr_value_buf into ocfs2_xattr_value_truncate().
The callers of ocfs2_xattr_value_truncate() now pass in
ocfs2_xattr_value_bufs. These callers are the ones that calculated the
xv location, so they are the right starting point.
Signed-off-by: Joel Becker <joel.becker@oracle.com>
Signed-off-by: Mark Fasheh <mfasheh@suse.com>
Diffstat (limited to 'fs/ocfs2/xattr.c')
-rw-r--r-- | fs/ocfs2/xattr.c | 66 |
1 files changed, 34 insertions, 32 deletions
diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c index 4ce8019f0ef1..409f9eeec703 100644 --- a/fs/ocfs2/xattr.c +++ b/fs/ocfs2/xattr.c | |||
@@ -718,19 +718,13 @@ out: | |||
718 | } | 718 | } |
719 | 719 | ||
720 | static int ocfs2_xattr_value_truncate(struct inode *inode, | 720 | static int ocfs2_xattr_value_truncate(struct inode *inode, |
721 | struct buffer_head *root_bh, | 721 | struct ocfs2_xattr_value_buf *vb, |
722 | struct ocfs2_xattr_value_root *xv, | ||
723 | int len, | 722 | int len, |
724 | struct ocfs2_xattr_set_ctxt *ctxt) | 723 | struct ocfs2_xattr_set_ctxt *ctxt) |
725 | { | 724 | { |
726 | int ret; | 725 | int ret; |
727 | u32 new_clusters = ocfs2_clusters_for_bytes(inode->i_sb, len); | 726 | u32 new_clusters = ocfs2_clusters_for_bytes(inode->i_sb, len); |
728 | u32 old_clusters = le32_to_cpu(xv->xr_clusters); | 727 | u32 old_clusters = le32_to_cpu(vb->vb_xv->xr_clusters); |
729 | struct ocfs2_xattr_value_buf vb = { | ||
730 | .vb_bh = root_bh, | ||
731 | .vb_xv = xv, | ||
732 | .vb_access = ocfs2_journal_access, | ||
733 | }; | ||
734 | 728 | ||
735 | if (new_clusters == old_clusters) | 729 | if (new_clusters == old_clusters) |
736 | return 0; | 730 | return 0; |
@@ -738,11 +732,11 @@ static int ocfs2_xattr_value_truncate(struct inode *inode, | |||
738 | if (new_clusters > old_clusters) | 732 | if (new_clusters > old_clusters) |
739 | ret = ocfs2_xattr_extend_allocation(inode, | 733 | ret = ocfs2_xattr_extend_allocation(inode, |
740 | new_clusters - old_clusters, | 734 | new_clusters - old_clusters, |
741 | &vb, ctxt); | 735 | vb, ctxt); |
742 | else | 736 | else |
743 | ret = ocfs2_xattr_shrink_size(inode, | 737 | ret = ocfs2_xattr_shrink_size(inode, |
744 | old_clusters, new_clusters, | 738 | old_clusters, new_clusters, |
745 | &vb, ctxt); | 739 | vb, ctxt); |
746 | 740 | ||
747 | return ret; | 741 | return ret; |
748 | } | 742 | } |
@@ -1330,6 +1324,10 @@ static int ocfs2_xattr_set_value_outside(struct inode *inode, | |||
1330 | struct ocfs2_xattr_value_root *xv = NULL; | 1324 | struct ocfs2_xattr_value_root *xv = NULL; |
1331 | size_t size = OCFS2_XATTR_SIZE(name_len) + OCFS2_XATTR_ROOT_SIZE; | 1325 | size_t size = OCFS2_XATTR_SIZE(name_len) + OCFS2_XATTR_ROOT_SIZE; |
1332 | int ret = 0; | 1326 | int ret = 0; |
1327 | struct ocfs2_xattr_value_buf vb = { | ||
1328 | .vb_bh = xs->xattr_bh, | ||
1329 | .vb_access = ocfs2_journal_access | ||
1330 | }; | ||
1333 | 1331 | ||
1334 | memset(val, 0, size); | 1332 | memset(val, 0, size); |
1335 | memcpy(val, xi->name, name_len); | 1333 | memcpy(val, xi->name, name_len); |
@@ -1340,9 +1338,9 @@ static int ocfs2_xattr_set_value_outside(struct inode *inode, | |||
1340 | xv->xr_list.l_tree_depth = 0; | 1338 | xv->xr_list.l_tree_depth = 0; |
1341 | xv->xr_list.l_count = cpu_to_le16(1); | 1339 | xv->xr_list.l_count = cpu_to_le16(1); |
1342 | xv->xr_list.l_next_free_rec = 0; | 1340 | xv->xr_list.l_next_free_rec = 0; |
1341 | vb.vb_xv = xv; | ||
1343 | 1342 | ||
1344 | ret = ocfs2_xattr_value_truncate(inode, xs->xattr_bh, xv, | 1343 | ret = ocfs2_xattr_value_truncate(inode, &vb, xi->value_len, ctxt); |
1345 | xi->value_len, ctxt); | ||
1346 | if (ret < 0) { | 1344 | if (ret < 0) { |
1347 | mlog_errno(ret); | 1345 | mlog_errno(ret); |
1348 | return ret; | 1346 | return ret; |
@@ -1352,7 +1350,7 @@ static int ocfs2_xattr_set_value_outside(struct inode *inode, | |||
1352 | mlog_errno(ret); | 1350 | mlog_errno(ret); |
1353 | return ret; | 1351 | return ret; |
1354 | } | 1352 | } |
1355 | ret = __ocfs2_xattr_set_value_outside(inode, ctxt->handle, xv, | 1353 | ret = __ocfs2_xattr_set_value_outside(inode, ctxt->handle, vb.vb_xv, |
1356 | xi->value, xi->value_len); | 1354 | xi->value, xi->value_len); |
1357 | if (ret < 0) | 1355 | if (ret < 0) |
1358 | mlog_errno(ret); | 1356 | mlog_errno(ret); |
@@ -1550,9 +1548,12 @@ static int ocfs2_xattr_set_entry(struct inode *inode, | |||
1550 | goto out; | 1548 | goto out; |
1551 | } else if (!ocfs2_xattr_is_local(xs->here)) { | 1549 | } else if (!ocfs2_xattr_is_local(xs->here)) { |
1552 | /* For existing xattr which has value outside */ | 1550 | /* For existing xattr which has value outside */ |
1553 | struct ocfs2_xattr_value_root *xv = NULL; | 1551 | struct ocfs2_xattr_value_buf vb = { |
1554 | xv = (struct ocfs2_xattr_value_root *)(val + | 1552 | .vb_bh = xs->xattr_bh, |
1555 | OCFS2_XATTR_SIZE(name_len)); | 1553 | .vb_xv = (struct ocfs2_xattr_value_root *) |
1554 | (val + OCFS2_XATTR_SIZE(name_len)), | ||
1555 | .vb_access = ocfs2_journal_access, | ||
1556 | }; | ||
1556 | 1557 | ||
1557 | if (xi->value_len > OCFS2_XATTR_INLINE_SIZE) { | 1558 | if (xi->value_len > OCFS2_XATTR_INLINE_SIZE) { |
1558 | /* | 1559 | /* |
@@ -1561,8 +1562,7 @@ static int ocfs2_xattr_set_entry(struct inode *inode, | |||
1561 | * then set new value with set_value_outside(). | 1562 | * then set new value with set_value_outside(). |
1562 | */ | 1563 | */ |
1563 | ret = ocfs2_xattr_value_truncate(inode, | 1564 | ret = ocfs2_xattr_value_truncate(inode, |
1564 | xs->xattr_bh, | 1565 | &vb, |
1565 | xv, | ||
1566 | xi->value_len, | 1566 | xi->value_len, |
1567 | ctxt); | 1567 | ctxt); |
1568 | if (ret < 0) { | 1568 | if (ret < 0) { |
@@ -1582,7 +1582,7 @@ static int ocfs2_xattr_set_entry(struct inode *inode, | |||
1582 | 1582 | ||
1583 | ret = __ocfs2_xattr_set_value_outside(inode, | 1583 | ret = __ocfs2_xattr_set_value_outside(inode, |
1584 | handle, | 1584 | handle, |
1585 | xv, | 1585 | vb.vb_xv, |
1586 | xi->value, | 1586 | xi->value, |
1587 | xi->value_len); | 1587 | xi->value_len); |
1588 | if (ret < 0) | 1588 | if (ret < 0) |
@@ -1594,8 +1594,7 @@ static int ocfs2_xattr_set_entry(struct inode *inode, | |||
1594 | * just trucate old value to zero. | 1594 | * just trucate old value to zero. |
1595 | */ | 1595 | */ |
1596 | ret = ocfs2_xattr_value_truncate(inode, | 1596 | ret = ocfs2_xattr_value_truncate(inode, |
1597 | xs->xattr_bh, | 1597 | &vb, |
1598 | xv, | ||
1599 | 0, | 1598 | 0, |
1600 | ctxt); | 1599 | ctxt); |
1601 | if (ret < 0) | 1600 | if (ret < 0) |
@@ -1714,15 +1713,17 @@ static int ocfs2_remove_value_outside(struct inode*inode, | |||
1714 | struct ocfs2_xattr_entry *entry = &header->xh_entries[i]; | 1713 | struct ocfs2_xattr_entry *entry = &header->xh_entries[i]; |
1715 | 1714 | ||
1716 | if (!ocfs2_xattr_is_local(entry)) { | 1715 | if (!ocfs2_xattr_is_local(entry)) { |
1717 | struct ocfs2_xattr_value_root *xv; | 1716 | struct ocfs2_xattr_value_buf vb = { |
1717 | .vb_bh = bh, | ||
1718 | .vb_access = ocfs2_journal_access, | ||
1719 | }; | ||
1718 | void *val; | 1720 | void *val; |
1719 | 1721 | ||
1720 | val = (void *)header + | 1722 | val = (void *)header + |
1721 | le16_to_cpu(entry->xe_name_offset); | 1723 | le16_to_cpu(entry->xe_name_offset); |
1722 | xv = (struct ocfs2_xattr_value_root *) | 1724 | vb.vb_xv = (struct ocfs2_xattr_value_root *) |
1723 | (val + OCFS2_XATTR_SIZE(entry->xe_name_len)); | 1725 | (val + OCFS2_XATTR_SIZE(entry->xe_name_len)); |
1724 | ret = ocfs2_xattr_value_truncate(inode, bh, xv, | 1726 | ret = ocfs2_xattr_value_truncate(inode, &vb, 0, &ctxt); |
1725 | 0, &ctxt); | ||
1726 | if (ret < 0) { | 1727 | if (ret < 0) { |
1727 | mlog_errno(ret); | 1728 | mlog_errno(ret); |
1728 | break; | 1729 | break; |
@@ -4651,11 +4652,12 @@ static int ocfs2_xattr_bucket_value_truncate(struct inode *inode, | |||
4651 | { | 4652 | { |
4652 | int ret, offset; | 4653 | int ret, offset; |
4653 | u64 value_blk; | 4654 | u64 value_blk; |
4654 | struct buffer_head *value_bh = NULL; | ||
4655 | struct ocfs2_xattr_value_root *xv; | ||
4656 | struct ocfs2_xattr_entry *xe; | 4655 | struct ocfs2_xattr_entry *xe; |
4657 | struct ocfs2_xattr_header *xh = bucket_xh(bucket); | 4656 | struct ocfs2_xattr_header *xh = bucket_xh(bucket); |
4658 | size_t blocksize = inode->i_sb->s_blocksize; | 4657 | size_t blocksize = inode->i_sb->s_blocksize; |
4658 | struct ocfs2_xattr_value_buf vb = { | ||
4659 | .vb_access = ocfs2_journal_access, | ||
4660 | }; | ||
4659 | 4661 | ||
4660 | xe = &xh->xh_entries[xe_off]; | 4662 | xe = &xh->xh_entries[xe_off]; |
4661 | 4663 | ||
@@ -4669,11 +4671,11 @@ static int ocfs2_xattr_bucket_value_truncate(struct inode *inode, | |||
4669 | /* We don't allow ocfs2_xattr_value to be stored in different block. */ | 4671 | /* We don't allow ocfs2_xattr_value to be stored in different block. */ |
4670 | BUG_ON(value_blk != (offset + OCFS2_XATTR_ROOT_SIZE - 1) / blocksize); | 4672 | BUG_ON(value_blk != (offset + OCFS2_XATTR_ROOT_SIZE - 1) / blocksize); |
4671 | 4673 | ||
4672 | value_bh = bucket->bu_bhs[value_blk]; | 4674 | vb.vb_bh = bucket->bu_bhs[value_blk]; |
4673 | BUG_ON(!value_bh); | 4675 | BUG_ON(!vb.vb_bh); |
4674 | 4676 | ||
4675 | xv = (struct ocfs2_xattr_value_root *) | 4677 | vb.vb_xv = (struct ocfs2_xattr_value_root *) |
4676 | (value_bh->b_data + offset % blocksize); | 4678 | (vb.vb_bh->b_data + offset % blocksize); |
4677 | 4679 | ||
4678 | ret = ocfs2_xattr_bucket_journal_access(ctxt->handle, bucket, | 4680 | ret = ocfs2_xattr_bucket_journal_access(ctxt->handle, bucket, |
4679 | OCFS2_JOURNAL_ACCESS_WRITE); | 4681 | OCFS2_JOURNAL_ACCESS_WRITE); |
@@ -4691,7 +4693,7 @@ static int ocfs2_xattr_bucket_value_truncate(struct inode *inode, | |||
4691 | */ | 4693 | */ |
4692 | mlog(0, "truncate %u in xattr bucket %llu to %d bytes.\n", | 4694 | mlog(0, "truncate %u in xattr bucket %llu to %d bytes.\n", |
4693 | xe_off, (unsigned long long)bucket_blkno(bucket), len); | 4695 | xe_off, (unsigned long long)bucket_blkno(bucket), len); |
4694 | ret = ocfs2_xattr_value_truncate(inode, value_bh, xv, len, ctxt); | 4696 | ret = ocfs2_xattr_value_truncate(inode, &vb, len, ctxt); |
4695 | if (ret) { | 4697 | if (ret) { |
4696 | mlog_errno(ret); | 4698 | mlog_errno(ret); |
4697 | goto out_dirty; | 4699 | goto out_dirty; |