diff options
author | Brian Behlendorf <[email protected]> | 2011-03-09 10:48:49 -0800 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2011-03-09 13:30:03 -0800 |
commit | 17c37660a14cc5e26cc668fdb285933fee4b6cf4 (patch) | |
tree | e043fa31800007fbe9d5c3957ccf1baf10d1c9fa /module/zfs/zfs_vnops.c | |
parent | 450dc149bd5afdddad724a6eff7ff741fa8fdf11 (diff) |
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.
Diffstat (limited to 'module/zfs/zfs_vnops.c')
-rw-r--r-- | module/zfs/zfs_vnops.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/module/zfs/zfs_vnops.c b/module/zfs/zfs_vnops.c index cb66741c2..00534d845 100644 --- a/module/zfs/zfs_vnops.c +++ b/module/zfs/zfs_vnops.c @@ -2335,7 +2335,7 @@ zfs_setattr(struct inode *ip, vattr_t *vap, int flags, cred_t *cr) zfs_acl_t *aclp; boolean_t skipaclchk = (flags & ATTR_NOACLCHECK) ? B_TRUE : 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; 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); 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 */ @@ -2918,6 +2921,8 @@ out2: zil_commit(zilog, 0); 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)); ZFS_EXIT(zsb); return (err); |