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:
Brian Behlendorf 2011-03-09 10:48:49 -08:00
parent 450dc149bd
commit 17c37660a1

View File

@ -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 @@ zfs_setattr(struct inode *ip, vattr_t *vap, int flags, cred_t *cr)
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);