Conserve stack in zfs_setattr()
authorBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 9 Mar 2011 18:48:49 +0000 (10:48 -0800)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Wed, 9 Mar 2011 21:30:03 +0000 (13:30 -0800)
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

index cb66741..00534d8 100644 (file)
@@ -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);