ocfs2: add ocfs2_xattr_set_handle
This function is used to set xattr's in a started transaction. It is only called during inode creation inode for initial security/acl xattrs of the new inode. These xattrs could be put into ibody or extent block, so xattr bucket would not be use in this case. Signed-off-by: Tiger Yang <tiger.yang@oracle.com> Signed-off-by: Mark Fasheh <mfasheh@suse.com>
This commit is contained in:
parent
f5d362022a
commit
6c3faba442
|
@ -2325,6 +2325,74 @@ static int __ocfs2_xattr_set_handle(struct inode *inode,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This function only called duing creating inode
|
||||||
|
* for init security/acl xattrs of the new inode.
|
||||||
|
* The xattrs could be put into ibody or extent block,
|
||||||
|
* xattr bucket would not be use in this case.
|
||||||
|
* transanction credits also be reserved in here.
|
||||||
|
*/
|
||||||
|
int ocfs2_xattr_set_handle(handle_t *handle,
|
||||||
|
struct inode *inode,
|
||||||
|
struct buffer_head *di_bh,
|
||||||
|
int name_index,
|
||||||
|
const char *name,
|
||||||
|
const void *value,
|
||||||
|
size_t value_len,
|
||||||
|
int flags,
|
||||||
|
struct ocfs2_alloc_context *meta_ac,
|
||||||
|
struct ocfs2_alloc_context *data_ac)
|
||||||
|
{
|
||||||
|
struct ocfs2_dinode *di;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
struct ocfs2_xattr_info xi = {
|
||||||
|
.name_index = name_index,
|
||||||
|
.name = name,
|
||||||
|
.value = value,
|
||||||
|
.value_len = value_len,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ocfs2_xattr_search xis = {
|
||||||
|
.not_found = -ENODATA,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ocfs2_xattr_search xbs = {
|
||||||
|
.not_found = -ENODATA,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ocfs2_xattr_set_ctxt ctxt = {
|
||||||
|
.handle = handle,
|
||||||
|
.meta_ac = meta_ac,
|
||||||
|
.data_ac = data_ac,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!ocfs2_supports_xattr(OCFS2_SB(inode->i_sb)))
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
xis.inode_bh = xbs.inode_bh = di_bh;
|
||||||
|
di = (struct ocfs2_dinode *)di_bh->b_data;
|
||||||
|
|
||||||
|
down_write(&OCFS2_I(inode)->ip_xattr_sem);
|
||||||
|
|
||||||
|
ret = ocfs2_xattr_ibody_find(inode, name_index, name, &xis);
|
||||||
|
if (ret)
|
||||||
|
goto cleanup;
|
||||||
|
if (xis.not_found) {
|
||||||
|
ret = ocfs2_xattr_block_find(inode, name_index, name, &xbs);
|
||||||
|
if (ret)
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = __ocfs2_xattr_set_handle(inode, di, &xi, &xis, &xbs, &ctxt);
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
up_write(&OCFS2_I(inode)->ip_xattr_sem);
|
||||||
|
brelse(xbs.xattr_bh);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ocfs2_xattr_set()
|
* ocfs2_xattr_set()
|
||||||
*
|
*
|
||||||
|
|
|
@ -37,6 +37,10 @@ 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_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, const char *, const void *, size_t, int,
|
||||||
|
struct ocfs2_alloc_context *,
|
||||||
|
struct ocfs2_alloc_context *);
|
||||||
int ocfs2_xattr_remove(struct inode *, struct buffer_head *);
|
int ocfs2_xattr_remove(struct inode *, struct buffer_head *);
|
||||||
|
|
||||||
#endif /* OCFS2_XATTR_H */
|
#endif /* OCFS2_XATTR_H */
|
||||||
|
|
Loading…
Reference in New Issue