mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-27 03:19:35 +03:00
Conserve stack in zfs_setattr()
Move 'bulk' and 'xattr_bulk' from the stack to the heap to minimize stack space usage. These two arrays consumed 448 bytes on the stack and have been replaced by two 8 byte points for a total stack space saving of 432 bytes. The zfs_setattr() path had been previously observed to overrun the stack in certain circumstances.
This commit is contained in:
parent
450dc149bd
commit
17c37660a1
@ -2335,7 +2335,7 @@ zfs_setattr(struct inode *ip, vattr_t *vap, int flags, cred_t *cr)
|
|||||||
zfs_acl_t *aclp;
|
zfs_acl_t *aclp;
|
||||||
boolean_t skipaclchk = (flags & ATTR_NOACLCHECK) ? B_TRUE : B_FALSE;
|
boolean_t skipaclchk = (flags & ATTR_NOACLCHECK) ? B_TRUE : B_FALSE;
|
||||||
boolean_t fuid_dirtied = B_FALSE;
|
boolean_t fuid_dirtied = B_FALSE;
|
||||||
sa_bulk_attr_t bulk[7], xattr_bulk[7];
|
sa_bulk_attr_t *bulk, *xattr_bulk;
|
||||||
int count = 0, xattr_count = 0;
|
int count = 0, xattr_count = 0;
|
||||||
|
|
||||||
if (mask == 0)
|
if (mask == 0)
|
||||||
@ -2378,6 +2378,9 @@ zfs_setattr(struct inode *ip, vattr_t *vap, int flags, cred_t *cr)
|
|||||||
tmpxvattr = kmem_alloc(sizeof(xvattr_t), KM_SLEEP);
|
tmpxvattr = kmem_alloc(sizeof(xvattr_t), KM_SLEEP);
|
||||||
xva_init(tmpxvattr);
|
xva_init(tmpxvattr);
|
||||||
|
|
||||||
|
bulk = kmem_alloc(sizeof(sa_bulk_attr_t) * 7, KM_SLEEP);
|
||||||
|
xattr_bulk = kmem_alloc(sizeof(sa_bulk_attr_t) * 7, KM_SLEEP);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Immutable files can only alter immutable bit and atime
|
* Immutable files can only alter immutable bit and atime
|
||||||
*/
|
*/
|
||||||
@ -2918,6 +2921,8 @@ out2:
|
|||||||
zil_commit(zilog, 0);
|
zil_commit(zilog, 0);
|
||||||
|
|
||||||
out3:
|
out3:
|
||||||
|
kmem_free(xattr_bulk, sizeof(sa_bulk_attr_t) * 7);
|
||||||
|
kmem_free(bulk, sizeof(sa_bulk_attr_t) * 7);
|
||||||
kmem_free(tmpxvattr, sizeof(xvattr_t));
|
kmem_free(tmpxvattr, sizeof(xvattr_t));
|
||||||
ZFS_EXIT(zsb);
|
ZFS_EXIT(zsb);
|
||||||
return (err);
|
return (err);
|
||||||
|
Loading…
Reference in New Issue
Block a user