Commit 4e3e9d02 authored by Tiger Yang's avatar Tiger Yang Committed by Mark Fasheh

ocfs2: add ocfs2_xattr_get_nolock

This function does the work of ocfs2_xattr_get under an open lock.
Signed-off-by: default avatarTiger Yang <tiger.yang@oracle.com>
Signed-off-by: default avatarMark Fasheh <mfasheh@suse.com>
parent 534eaddd
...@@ -925,12 +925,8 @@ static int ocfs2_xattr_block_get(struct inode *inode, ...@@ -925,12 +925,8 @@ static int ocfs2_xattr_block_get(struct inode *inode,
return ret; return ret;
} }
/* ocfs2_xattr_get() int ocfs2_xattr_get_nolock(struct inode *inode,
* struct buffer_head *di_bh,
* 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, int name_index,
const char *name, const char *name,
void *buffer, void *buffer,
...@@ -938,7 +934,6 @@ static int ocfs2_xattr_get(struct inode *inode, ...@@ -938,7 +934,6 @@ static int ocfs2_xattr_get(struct inode *inode,
{ {
int ret; int ret;
struct ocfs2_dinode *di = NULL; struct ocfs2_dinode *di = NULL;
struct buffer_head *di_bh = NULL;
struct ocfs2_inode_info *oi = OCFS2_I(inode); struct ocfs2_inode_info *oi = OCFS2_I(inode);
struct ocfs2_xattr_search xis = { struct ocfs2_xattr_search xis = {
.not_found = -ENODATA, .not_found = -ENODATA,
...@@ -953,11 +948,6 @@ static int ocfs2_xattr_get(struct inode *inode, ...@@ -953,11 +948,6 @@ static int ocfs2_xattr_get(struct inode *inode,
if (!(oi->ip_dyn_features & OCFS2_HAS_XATTR_FL)) if (!(oi->ip_dyn_features & OCFS2_HAS_XATTR_FL))
ret = -ENODATA; 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; xis.inode_bh = xbs.inode_bh = di_bh;
di = (struct ocfs2_dinode *)di_bh->b_data; di = (struct ocfs2_dinode *)di_bh->b_data;
...@@ -968,6 +958,32 @@ static int ocfs2_xattr_get(struct inode *inode, ...@@ -968,6 +958,32 @@ static int ocfs2_xattr_get(struct inode *inode,
ret = ocfs2_xattr_block_get(inode, name_index, name, buffer, ret = ocfs2_xattr_block_get(inode, name_index, name, buffer,
buffer_size, &xbs); buffer_size, &xbs);
up_read(&oi->ip_xattr_sem); 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); ocfs2_inode_unlock(inode, 0);
brelse(di_bh); brelse(di_bh);
......
...@@ -43,6 +43,8 @@ extern struct xattr_handler ocfs2_xattr_security_handler; ...@@ -43,6 +43,8 @@ extern struct xattr_handler ocfs2_xattr_security_handler;
extern struct xattr_handler *ocfs2_xattr_handlers[]; extern struct xattr_handler *ocfs2_xattr_handlers[];
ssize_t ocfs2_listxattr(struct dentry *, char *, size_t); ssize_t ocfs2_listxattr(struct dentry *, char *, size_t);
int ocfs2_xattr_get_nolock(struct inode *, struct buffer_head *, int,
const char *, void *, size_t);
int ocfs2_xattr_set(struct inode *, int, const char *, const void *, int ocfs2_xattr_set(struct inode *, int, const char *, const void *,
size_t, int); size_t, int);
int ocfs2_xattr_set_handle(handle_t *, struct inode *, struct buffer_head *, int ocfs2_xattr_set_handle(handle_t *, struct inode *, struct buffer_head *,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment