From 17c37660a14cc5e26cc668fdb285933fee4b6cf4 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Wed, 9 Mar 2011 10:48:49 -0800 Subject: 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. --- module/zfs/zfs_vnops.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) 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); -- cgit v1.2.3