aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorTao Ma <tao.ma@oracle.com>2009-08-17 23:43:24 -0400
committerJoel Becker <joel.becker@oracle.com>2009-09-22 23:09:42 -0400
commit5aea1f0ef4024ba28213c10181e1b16ec678c82d (patch)
treeca28a8214cf9a8761fbac6b5e8aef84aa22fff54 /fs
parentfd68a894fc9641f816d9cffa58e853ba91cbc1a1 (diff)
ocfs2: Abstract the creation of xattr block.
In xattr reflink, we also need to create xattr block, so abstract the process out. Signed-off-by: Tao Ma <tao.ma@oracle.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/ocfs2/xattr.c115
1 files changed, 70 insertions, 45 deletions
diff --git a/fs/ocfs2/xattr.c b/fs/ocfs2/xattr.c
index eeb5b7caf195..a9339eb94a2e 100644
--- a/fs/ocfs2/xattr.c
+++ b/fs/ocfs2/xattr.c
@@ -2105,6 +2105,72 @@ cleanup:
2105 return ret; 2105 return ret;
2106} 2106}
2107 2107
2108static int ocfs2_create_xattr_block(handle_t *handle,
2109 struct inode *inode,
2110 struct buffer_head *inode_bh,
2111 struct ocfs2_alloc_context *meta_ac,
2112 struct buffer_head **ret_bh)
2113{
2114 int ret;
2115 u16 suballoc_bit_start;
2116 u32 num_got;
2117 u64 first_blkno;
2118 struct ocfs2_dinode *di = (struct ocfs2_dinode *)inode_bh->b_data;
2119 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
2120 struct buffer_head *new_bh = NULL;
2121 struct ocfs2_xattr_block *xblk;
2122
2123 ret = ocfs2_journal_access_di(handle, INODE_CACHE(inode), inode_bh,
2124 OCFS2_JOURNAL_ACCESS_CREATE);
2125 if (ret < 0) {
2126 mlog_errno(ret);
2127 goto end;
2128 }
2129
2130 ret = ocfs2_claim_metadata(osb, handle, meta_ac, 1,
2131 &suballoc_bit_start, &num_got,
2132 &first_blkno);
2133 if (ret < 0) {
2134 mlog_errno(ret);
2135 goto end;
2136 }
2137
2138 new_bh = sb_getblk(inode->i_sb, first_blkno);
2139 ocfs2_set_new_buffer_uptodate(INODE_CACHE(inode), new_bh);
2140
2141 ret = ocfs2_journal_access_xb(handle, INODE_CACHE(inode),
2142 new_bh,
2143 OCFS2_JOURNAL_ACCESS_CREATE);
2144 if (ret < 0) {
2145 mlog_errno(ret);
2146 goto end;
2147 }
2148
2149 /* Initialize ocfs2_xattr_block */
2150 xblk = (struct ocfs2_xattr_block *)new_bh->b_data;
2151 memset(xblk, 0, inode->i_sb->s_blocksize);
2152 strcpy((void *)xblk, OCFS2_XATTR_BLOCK_SIGNATURE);
2153 xblk->xb_suballoc_slot = cpu_to_le16(osb->slot_num);
2154 xblk->xb_suballoc_bit = cpu_to_le16(suballoc_bit_start);
2155 xblk->xb_fs_generation = cpu_to_le32(osb->fs_generation);
2156 xblk->xb_blkno = cpu_to_le64(first_blkno);
2157
2158 ret = ocfs2_journal_dirty(handle, new_bh);
2159 if (ret < 0) {
2160 mlog_errno(ret);
2161 goto end;
2162 }
2163 di->i_xattr_loc = cpu_to_le64(first_blkno);
2164 ocfs2_journal_dirty(handle, inode_bh);
2165
2166 *ret_bh = new_bh;
2167 new_bh = NULL;
2168
2169end:
2170 brelse(new_bh);
2171 return ret;
2172}
2173
2108/* 2174/*
2109 * ocfs2_xattr_block_set() 2175 * ocfs2_xattr_block_set()
2110 * 2176 *
@@ -2117,65 +2183,24 @@ static int ocfs2_xattr_block_set(struct inode *inode,
2117 struct ocfs2_xattr_set_ctxt *ctxt) 2183 struct ocfs2_xattr_set_ctxt *ctxt)
2118{ 2184{
2119 struct buffer_head *new_bh = NULL; 2185 struct buffer_head *new_bh = NULL;
2120 struct ocfs2_super *osb = OCFS2_SB(inode->i_sb);
2121 struct ocfs2_dinode *di = (struct ocfs2_dinode *)xs->inode_bh->b_data;
2122 handle_t *handle = ctxt->handle; 2186 handle_t *handle = ctxt->handle;
2123 struct ocfs2_xattr_block *xblk = NULL; 2187 struct ocfs2_xattr_block *xblk = NULL;
2124 u16 suballoc_bit_start;
2125 u32 num_got;
2126 u64 first_blkno;
2127 int ret; 2188 int ret;
2128 2189
2129 if (!xs->xattr_bh) { 2190 if (!xs->xattr_bh) {
2130 ret = ocfs2_journal_access_di(handle, INODE_CACHE(inode), 2191 ret = ocfs2_create_xattr_block(handle, inode, xs->inode_bh,
2131 xs->inode_bh, 2192 ctxt->meta_ac, &new_bh);
2132 OCFS2_JOURNAL_ACCESS_CREATE); 2193 if (ret) {
2133 if (ret < 0) {
2134 mlog_errno(ret);
2135 goto end;
2136 }
2137
2138 ret = ocfs2_claim_metadata(osb, handle, ctxt->meta_ac, 1,
2139 &suballoc_bit_start, &num_got,
2140 &first_blkno);
2141 if (ret < 0) {
2142 mlog_errno(ret);
2143 goto end;
2144 }
2145
2146 new_bh = sb_getblk(inode->i_sb, first_blkno);
2147 ocfs2_set_new_buffer_uptodate(INODE_CACHE(inode), new_bh);
2148
2149 ret = ocfs2_journal_access_xb(handle, INODE_CACHE(inode),
2150 new_bh,
2151 OCFS2_JOURNAL_ACCESS_CREATE);
2152 if (ret < 0) {
2153 mlog_errno(ret); 2194 mlog_errno(ret);
2154 goto end; 2195 goto end;
2155 } 2196 }
2156 2197
2157 /* Initialize ocfs2_xattr_block */
2158 xs->xattr_bh = new_bh; 2198 xs->xattr_bh = new_bh;
2159 xblk = (struct ocfs2_xattr_block *)new_bh->b_data; 2199 xblk = (struct ocfs2_xattr_block *)xs->xattr_bh->b_data;
2160 memset(xblk, 0, inode->i_sb->s_blocksize);
2161 strcpy((void *)xblk, OCFS2_XATTR_BLOCK_SIGNATURE);
2162 xblk->xb_suballoc_slot = cpu_to_le16(osb->slot_num);
2163 xblk->xb_suballoc_bit = cpu_to_le16(suballoc_bit_start);
2164 xblk->xb_fs_generation = cpu_to_le32(osb->fs_generation);
2165 xblk->xb_blkno = cpu_to_le64(first_blkno);
2166
2167 xs->header = &xblk->xb_attrs.xb_header; 2200 xs->header = &xblk->xb_attrs.xb_header;
2168 xs->base = (void *)xs->header; 2201 xs->base = (void *)xs->header;
2169 xs->end = (void *)xblk + inode->i_sb->s_blocksize; 2202 xs->end = (void *)xblk + inode->i_sb->s_blocksize;
2170 xs->here = xs->header->xh_entries; 2203 xs->here = xs->header->xh_entries;
2171
2172 ret = ocfs2_journal_dirty(handle, new_bh);
2173 if (ret < 0) {
2174 mlog_errno(ret);
2175 goto end;
2176 }
2177 di->i_xattr_loc = cpu_to_le64(first_blkno);
2178 ocfs2_journal_dirty(handle, xs->inode_bh);
2179 } else 2204 } else
2180 xblk = (struct ocfs2_xattr_block *)xs->xattr_bh->b_data; 2205 xblk = (struct ocfs2_xattr_block *)xs->xattr_bh->b_data;
2181 2206