|
@@ -925,12 +925,8 @@ cleanup:
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
-/* ocfs2_xattr_get()
|
|
|
- *
|
|
|
- * Copy an extended attribute into the buffer provided.
|
|
|
- * Buffer is NULL to compute the size of buffer required.
|
|
|
- */
|
|
|
-static int ocfs2_xattr_get(struct inode *inode,
|
|
|
+int ocfs2_xattr_get_nolock(struct inode *inode,
|
|
|
+ struct buffer_head *di_bh,
|
|
|
int name_index,
|
|
|
const char *name,
|
|
|
void *buffer,
|
|
@@ -938,7 +934,6 @@ static int ocfs2_xattr_get(struct inode *inode,
|
|
|
{
|
|
|
int ret;
|
|
|
struct ocfs2_dinode *di = NULL;
|
|
|
- struct buffer_head *di_bh = NULL;
|
|
|
struct ocfs2_inode_info *oi = OCFS2_I(inode);
|
|
|
struct ocfs2_xattr_search xis = {
|
|
|
.not_found = -ENODATA,
|
|
@@ -953,11 +948,6 @@ static int ocfs2_xattr_get(struct inode *inode,
|
|
|
if (!(oi->ip_dyn_features & OCFS2_HAS_XATTR_FL))
|
|
|
ret = -ENODATA;
|
|
|
|
|
|
- ret = ocfs2_inode_lock(inode, &di_bh, 0);
|
|
|
- if (ret < 0) {
|
|
|
- mlog_errno(ret);
|
|
|
- return ret;
|
|
|
- }
|
|
|
xis.inode_bh = xbs.inode_bh = di_bh;
|
|
|
di = (struct ocfs2_dinode *)di_bh->b_data;
|
|
|
|
|
@@ -968,6 +958,32 @@ static int ocfs2_xattr_get(struct inode *inode,
|
|
|
ret = ocfs2_xattr_block_get(inode, name_index, name, buffer,
|
|
|
buffer_size, &xbs);
|
|
|
up_read(&oi->ip_xattr_sem);
|
|
|
+
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+/* ocfs2_xattr_get()
|
|
|
+ *
|
|
|
+ * Copy an extended attribute into the buffer provided.
|
|
|
+ * Buffer is NULL to compute the size of buffer required.
|
|
|
+ */
|
|
|
+static int ocfs2_xattr_get(struct inode *inode,
|
|
|
+ int name_index,
|
|
|
+ const char *name,
|
|
|
+ void *buffer,
|
|
|
+ size_t buffer_size)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+ struct buffer_head *di_bh = NULL;
|
|
|
+
|
|
|
+ ret = ocfs2_inode_lock(inode, &di_bh, 0);
|
|
|
+ if (ret < 0) {
|
|
|
+ mlog_errno(ret);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ ret = ocfs2_xattr_get_nolock(inode, di_bh, name_index,
|
|
|
+ name, buffer, buffer_size);
|
|
|
+
|
|
|
ocfs2_inode_unlock(inode, 0);
|
|
|
|
|
|
brelse(di_bh);
|