mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-14 17:14:09 +00:00
ocfs2: add ocfs2_xattr_get_nolock
This function does the work of ocfs2_xattr_get under an open lock. Signed-off-by: Tiger Yang <tiger.yang@oracle.com> Signed-off-by: Mark Fasheh <mfasheh@suse.com>
This commit is contained in:
parent
534eadddc1
commit
4e3e9d027f
@ -925,12 +925,8 @@ cleanup:
|
|||||||
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,
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
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,
|
|||||||
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;
|
|||||||
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 *,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user