@@ -1138,7 +1138,7 @@ zfs_create(znode_t *dzp, const char *name, vattr_t *vap, int excl, int mode,
11381138 if (fuid_dirtied )
11391139 zfs_fuid_txhold (zfsvfs , tx );
11401140 dmu_tx_hold_zap (tx , dzp -> z_id , TRUE, name );
1141- dmu_tx_hold_sa (tx , dzp -> z_sa_hdl , B_FALSE );
1141+ dmu_tx_hold_sa (tx , dzp -> z_sa_hdl , ZFS_SEQ_MAY_GROW ( dzp ) );
11421142 if (!zfsvfs -> z_use_sa &&
11431143 acl_ids .z_aclp -> z_acl_bytes > ZFS_ACE_SPACE ) {
11441144 dmu_tx_hold_write (tx , DMU_NEW_OBJECT ,
@@ -1269,7 +1269,8 @@ zfs_remove_(vnode_t *dvp, vnode_t *vp, const char *name, cred_t *cr)
12691269 */
12701270 tx = dmu_tx_create (zfsvfs -> z_os );
12711271 dmu_tx_hold_zap (tx , dzp -> z_id , FALSE, name );
1272- dmu_tx_hold_sa (tx , zp -> z_sa_hdl , B_FALSE );
1272+ dmu_tx_hold_sa (tx , zp -> z_sa_hdl , ZFS_SEQ_MAY_GROW (zp ));
1273+ dmu_tx_hold_sa (tx , dzp -> z_sa_hdl , ZFS_SEQ_MAY_GROW (dzp ));
12731274 zfs_sa_upgrade_txholds (tx , zp );
12741275 zfs_sa_upgrade_txholds (tx , dzp );
12751276
@@ -1497,6 +1498,7 @@ zfs_mkdir(znode_t *dzp, const char *dirname, vattr_t *vap, znode_t **zpp,
14971498 tx = dmu_tx_create (zfsvfs -> z_os );
14981499 dmu_tx_hold_zap (tx , dzp -> z_id , TRUE, dirname );
14991500 dmu_tx_hold_zap (tx , DMU_NEW_OBJECT , FALSE, NULL );
1501+ dmu_tx_hold_sa (tx , dzp -> z_sa_hdl , ZFS_SEQ_MAY_GROW (dzp ));
15001502 fuid_dirtied = zfsvfs -> z_fuid_dirty ;
15011503 if (fuid_dirtied )
15021504 zfs_fuid_txhold (zfsvfs , tx );
@@ -1605,7 +1607,8 @@ zfs_rmdir_(vnode_t *dvp, vnode_t *vp, const char *name, cred_t *cr)
16051607
16061608 tx = dmu_tx_create (zfsvfs -> z_os );
16071609 dmu_tx_hold_zap (tx , dzp -> z_id , FALSE, name );
1608- dmu_tx_hold_sa (tx , zp -> z_sa_hdl , B_FALSE );
1610+ dmu_tx_hold_sa (tx , zp -> z_sa_hdl , ZFS_SEQ_MAY_GROW (zp ));
1611+ dmu_tx_hold_sa (tx , dzp -> z_sa_hdl , ZFS_SEQ_MAY_GROW (dzp ));
16091612 dmu_tx_hold_zap (tx , zfsvfs -> z_unlinkedobj , FALSE, NULL );
16101613 zfs_sa_upgrade_txholds (tx , zp );
16111614 zfs_sa_upgrade_txholds (tx , dzp );
@@ -2318,7 +2321,7 @@ zfs_setattr(znode_t *zp, vattr_t *vap, int flags, cred_t *cr, zidmap_t *mnt_ns)
23182321 boolean_t skipaclchk = (flags & ATTR_NOACLCHECK ) ? B_TRUE : B_FALSE ;
23192322 boolean_t fuid_dirtied = B_FALSE ;
23202323 boolean_t handle_eadir = B_FALSE ;
2321- sa_bulk_attr_t bulk [7 ], xattr_bulk [7 ];
2324+ sa_bulk_attr_t bulk [8 ], xattr_bulk [7 ];
23222325 int count = 0 , xattr_count = 0 ;
23232326
23242327 if (mask == 0 )
@@ -2758,7 +2761,8 @@ zfs_setattr(znode_t *zp, vattr_t *vap, int flags, cred_t *cr, zidmap_t *mnt_ns)
27582761 if (((mask & AT_XVATTR ) &&
27592762 XVA_ISSET_REQ (xvap , XAT_AV_SCANSTAMP )) ||
27602763 (projid != ZFS_INVALID_PROJID &&
2761- !(zp -> z_pflags & ZFS_PROJID )))
2764+ !(zp -> z_pflags & ZFS_PROJID )) ||
2765+ !(zp -> z_pflags & ZFS_HAS_SEQ ))
27622766 dmu_tx_hold_sa (tx , zp -> z_sa_hdl , B_TRUE );
27632767 else
27642768 dmu_tx_hold_sa (tx , zp -> z_sa_hdl , B_FALSE );
@@ -2921,6 +2925,8 @@ zfs_setattr(znode_t *zp, vattr_t *vap, int flags, cred_t *cr, zidmap_t *mnt_ns)
29212925 }
29222926 }
29232927
2928+ ZFS_PERSIST_SEQ (zp , bulk , count );
2929+
29242930 /*
29252931 * Do this after setting timestamps to prevent timestamp
29262932 * update from toggling bit
@@ -3464,16 +3470,16 @@ zfs_do_rename_impl(vnode_t *sdvp, vnode_t **svpp, struct componentname *scnp,
34643470 }
34653471
34663472 tx = dmu_tx_create (zfsvfs -> z_os );
3467- dmu_tx_hold_sa (tx , szp -> z_sa_hdl , B_FALSE );
3468- dmu_tx_hold_sa (tx , sdzp -> z_sa_hdl , B_FALSE );
3473+ dmu_tx_hold_sa (tx , szp -> z_sa_hdl , ZFS_SEQ_MAY_GROW ( szp ) );
3474+ dmu_tx_hold_sa (tx , sdzp -> z_sa_hdl , ZFS_SEQ_MAY_GROW ( sdzp ) );
34693475 dmu_tx_hold_zap (tx , sdzp -> z_id , FALSE, snm );
34703476 dmu_tx_hold_zap (tx , tdzp -> z_id , TRUE, tnm );
34713477 if (sdzp != tdzp ) {
3472- dmu_tx_hold_sa (tx , tdzp -> z_sa_hdl , B_FALSE );
3478+ dmu_tx_hold_sa (tx , tdzp -> z_sa_hdl , ZFS_SEQ_MAY_GROW ( tdzp ) );
34733479 zfs_sa_upgrade_txholds (tx , tdzp );
34743480 }
34753481 if (tzp ) {
3476- dmu_tx_hold_sa (tx , tzp -> z_sa_hdl , B_FALSE );
3482+ dmu_tx_hold_sa (tx , tzp -> z_sa_hdl , ZFS_SEQ_MAY_GROW ( tzp ) );
34773483 zfs_sa_upgrade_txholds (tx , tzp );
34783484 }
34793485
@@ -3672,7 +3678,7 @@ zfs_symlink(znode_t *dzp, const char *name, vattr_t *vap,
36723678 dmu_tx_hold_zap (tx , dzp -> z_id , TRUE, name );
36733679 dmu_tx_hold_sa_create (tx , acl_ids .z_aclp -> z_acl_bytes +
36743680 ZFS_SA_BASE_ATTR_SIZE + len );
3675- dmu_tx_hold_sa (tx , dzp -> z_sa_hdl , B_FALSE );
3681+ dmu_tx_hold_sa (tx , dzp -> z_sa_hdl , ZFS_SEQ_MAY_GROW ( dzp ) );
36763682 if (!zfsvfs -> z_use_sa && acl_ids .z_aclp -> z_acl_bytes > ZFS_ACE_SPACE ) {
36773683 dmu_tx_hold_write (tx , DMU_NEW_OBJECT , 0 ,
36783684 acl_ids .z_aclp -> z_acl_bytes );
@@ -3894,7 +3900,8 @@ zfs_link(znode_t *tdzp, znode_t *szp, const char *name, cred_t *cr,
38943900 }
38953901
38963902 tx = dmu_tx_create (zfsvfs -> z_os );
3897- dmu_tx_hold_sa (tx , szp -> z_sa_hdl , B_FALSE );
3903+ dmu_tx_hold_sa (tx , szp -> z_sa_hdl , ZFS_SEQ_MAY_GROW (szp ));
3904+ dmu_tx_hold_sa (tx , tdzp -> z_sa_hdl , ZFS_SEQ_MAY_GROW (tdzp ));
38983905 dmu_tx_hold_zap (tx , tdzp -> z_id , TRUE, name );
38993906 zfs_sa_upgrade_txholds (tx , szp );
39003907 zfs_sa_upgrade_txholds (tx , tdzp );
@@ -4458,7 +4465,7 @@ zfs_putpages(struct vnode *vp, vm_page_t *ma, size_t len, int flags,
44584465 tx = dmu_tx_create (zfsvfs -> z_os );
44594466 dmu_tx_hold_write (tx , zp -> z_id , off , len );
44604467
4461- dmu_tx_hold_sa (tx , zp -> z_sa_hdl , B_FALSE );
4468+ dmu_tx_hold_sa (tx , zp -> z_sa_hdl , ZFS_SEQ_MAY_GROW ( zp ) );
44624469 zfs_sa_upgrade_txholds (tx , zp );
44634470 err = dmu_tx_assign (tx , DMU_TX_WAIT );
44644471 if (err != 0 ) {
@@ -4482,7 +4489,7 @@ zfs_putpages(struct vnode *vp, vm_page_t *ma, size_t len, int flags,
44824489
44834490 if (err == 0 ) {
44844491 uint64_t mtime [2 ], ctime [2 ];
4485- sa_bulk_attr_t bulk [3 ];
4492+ sa_bulk_attr_t bulk [4 ];
44864493 int count = 0 ;
44874494
44884495 SA_ADD_BULK_ATTR (bulk , count , SA_ZPL_MTIME (zfsvfs ), NULL ,
@@ -4492,6 +4499,7 @@ zfs_putpages(struct vnode *vp, vm_page_t *ma, size_t len, int flags,
44924499 SA_ADD_BULK_ATTR (bulk , count , SA_ZPL_FLAGS (zfsvfs ), NULL ,
44934500 & zp -> z_pflags , 8 );
44944501 zfs_tstamp_update_setup (zp , CONTENT_MODIFIED , mtime , ctime );
4502+ ZFS_PERSIST_SEQ (zp , bulk , count );
44954503 err = sa_bulk_update (zp -> z_sa_hdl , bulk , count , tx );
44964504 ASSERT0 (err );
44974505
0 commit comments