mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-05 02:19:51 +00:00
ocfs2: calculate and reserve credits for xattr value in mknod
We extend the credits for xattr's large value in set_value_outside before, this can give rise to a credits issue when we set one security entry and two acl entries duing mknod. As we remove extend_trans form set_value_outside, we must calculate and reserve the credits for xattr's large value in mknod. Signed-off-by: Tiger Yang <tiger.yang@oracle.com> Signed-off-by: Mark Fasheh <mfasheh@suse.com>
This commit is contained in:
parent
90cb546cad
commit
0e445b6fe9
1 changed files with 26 additions and 14 deletions
|
@ -490,9 +490,14 @@ int ocfs2_calc_security_init(struct inode *dir,
|
|||
}
|
||||
|
||||
/* reserve clusters for xattr value which will be set in B tree*/
|
||||
if (si->value_len > OCFS2_XATTR_INLINE_SIZE)
|
||||
*want_clusters += ocfs2_clusters_for_bytes(dir->i_sb,
|
||||
si->value_len);
|
||||
if (si->value_len > OCFS2_XATTR_INLINE_SIZE) {
|
||||
int new_clusters = ocfs2_clusters_for_bytes(dir->i_sb,
|
||||
si->value_len);
|
||||
|
||||
*xattr_credits += ocfs2_clusters_to_blocks(dir->i_sb,
|
||||
new_clusters);
|
||||
*want_clusters += new_clusters;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -506,9 +511,7 @@ int ocfs2_calc_xattr_init(struct inode *dir,
|
|||
{
|
||||
int ret = 0;
|
||||
struct ocfs2_super *osb = OCFS2_SB(dir->i_sb);
|
||||
int s_size = 0;
|
||||
int a_size = 0;
|
||||
int acl_len = 0;
|
||||
int s_size = 0, a_size = 0, acl_len = 0, new_clusters;
|
||||
|
||||
if (si->enable)
|
||||
s_size = ocfs2_xattr_entry_real_size(strlen(si->name),
|
||||
|
@ -556,16 +559,25 @@ int ocfs2_calc_xattr_init(struct inode *dir,
|
|||
*xattr_credits += ocfs2_blocks_per_xattr_bucket(dir->i_sb);
|
||||
}
|
||||
|
||||
/* reserve clusters for xattr value which will be set in B tree*/
|
||||
if (si->enable && si->value_len > OCFS2_XATTR_INLINE_SIZE)
|
||||
*want_clusters += ocfs2_clusters_for_bytes(dir->i_sb,
|
||||
si->value_len);
|
||||
/*
|
||||
* reserve credits and clusters for xattrs which has large value
|
||||
* and have to be set outside
|
||||
*/
|
||||
if (si->enable && si->value_len > OCFS2_XATTR_INLINE_SIZE) {
|
||||
new_clusters = ocfs2_clusters_for_bytes(dir->i_sb,
|
||||
si->value_len);
|
||||
*xattr_credits += ocfs2_clusters_to_blocks(dir->i_sb,
|
||||
new_clusters);
|
||||
*want_clusters += new_clusters;
|
||||
}
|
||||
if (osb->s_mount_opt & OCFS2_MOUNT_POSIX_ACL &&
|
||||
acl_len > OCFS2_XATTR_INLINE_SIZE) {
|
||||
*want_clusters += ocfs2_clusters_for_bytes(dir->i_sb, acl_len);
|
||||
if (S_ISDIR(mode))
|
||||
*want_clusters += ocfs2_clusters_for_bytes(dir->i_sb,
|
||||
acl_len);
|
||||
/* for directory, it has DEFAULT and ACCESS two types of acls */
|
||||
new_clusters = (S_ISDIR(mode) ? 2 : 1) *
|
||||
ocfs2_clusters_for_bytes(dir->i_sb, acl_len);
|
||||
*xattr_credits += ocfs2_clusters_to_blocks(dir->i_sb,
|
||||
new_clusters);
|
||||
*want_clusters += new_clusters;
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
|
Loading…
Reference in a new issue