Deleted Added
full compact
zfs_vnops.c (258632) zfs_vnops.c (258720)
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE

--- 93 unchanged lines hidden (view full) ---

102 * pushing cached pages (which acquires range locks) and syncing out
103 * cached atime changes. Third, zfs_zinactive() may require a new tx,
104 * which could deadlock the system if you were already holding one.
105 * If you must call VN_RELE() within a tx then use VN_RELE_ASYNC().
106 *
107 * (3) All range locks must be grabbed before calling dmu_tx_assign(),
108 * as they can span dmu_tx_assign() calls.
109 *
1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE

--- 93 unchanged lines hidden (view full) ---

102 * pushing cached pages (which acquires range locks) and syncing out
103 * cached atime changes. Third, zfs_zinactive() may require a new tx,
104 * which could deadlock the system if you were already holding one.
105 * If you must call VN_RELE() within a tx then use VN_RELE_ASYNC().
106 *
107 * (3) All range locks must be grabbed before calling dmu_tx_assign(),
108 * as they can span dmu_tx_assign() calls.
109 *
110 * (4) Always pass TXG_NOWAIT as the second argument to dmu_tx_assign().
111 * This is critical because we don't want to block while holding locks.
112 * Note, in particular, that if a lock is sometimes acquired before
113 * the tx assigns, and sometimes after (e.g. z_lock), then failing to
114 * use a non-blocking assign can deadlock the system. The scenario:
110 * (4) If ZPL locks are held, pass TXG_NOWAIT as the second argument to
111 * dmu_tx_assign(). This is critical because we don't want to block
112 * while holding locks.
115 *
113 *
114 * If no ZPL locks are held (aside from ZFS_ENTER()), use TXG_WAIT. This
115 * reduces lock contention and CPU usage when we must wait (note that if
116 * throughput is constrained by the storage, nearly every transaction
117 * must wait).
118 *
119 * Note, in particular, that if a lock is sometimes acquired before
120 * the tx assigns, and sometimes after (e.g. z_lock), then failing
121 * to use a non-blocking assign can deadlock the system. The scenario:
122 *
116 * Thread A has grabbed a lock before calling dmu_tx_assign().
117 * Thread B is in an already-assigned tx, and blocks for this lock.
118 * Thread A calls dmu_tx_assign(TXG_WAIT) and blocks in txg_wait_open()
119 * forever, because the previous txg can't quiesce until B's tx commits.
120 *
121 * If dmu_tx_assign() returns ERESTART and zfsvfs->z_assign is TXG_NOWAIT,
122 * then drop all locks, call dmu_tx_wait(), and try again. On subsequent
123 * calls to dmu_tx_assign(), pass TXG_WAITED rather than TXG_NOWAIT,

--- 839 unchanged lines hidden (view full) ---

963 /*
964 * Write the file in reasonable size chunks. Each chunk is written
965 * in a separate transaction; this keeps the intent log records small
966 * and allows us to do more fine-grained space accounting.
967 */
968 while (n > 0) {
969 abuf = NULL;
970 woff = uio->uio_loffset;
123 * Thread A has grabbed a lock before calling dmu_tx_assign().
124 * Thread B is in an already-assigned tx, and blocks for this lock.
125 * Thread A calls dmu_tx_assign(TXG_WAIT) and blocks in txg_wait_open()
126 * forever, because the previous txg can't quiesce until B's tx commits.
127 *
128 * If dmu_tx_assign() returns ERESTART and zfsvfs->z_assign is TXG_NOWAIT,
129 * then drop all locks, call dmu_tx_wait(), and try again. On subsequent
130 * calls to dmu_tx_assign(), pass TXG_WAITED rather than TXG_NOWAIT,

--- 839 unchanged lines hidden (view full) ---

970 /*
971 * Write the file in reasonable size chunks. Each chunk is written
972 * in a separate transaction; this keeps the intent log records small
973 * and allows us to do more fine-grained space accounting.
974 */
975 while (n > 0) {
976 abuf = NULL;
977 woff = uio->uio_loffset;
971again:
972 if (zfs_owner_overquota(zfsvfs, zp, B_FALSE) ||
973 zfs_owner_overquota(zfsvfs, zp, B_TRUE)) {
974 if (abuf != NULL)
975 dmu_return_arcbuf(abuf);
976 error = SET_ERROR(EDQUOT);
977 break;
978 }
979

--- 35 unchanged lines hidden (view full) ---

1015
1016 /*
1017 * Start a transaction.
1018 */
1019 tx = dmu_tx_create(zfsvfs->z_os);
1020 dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE);
1021 dmu_tx_hold_write(tx, zp->z_id, woff, MIN(n, max_blksz));
1022 zfs_sa_upgrade_txholds(tx, zp);
978 if (zfs_owner_overquota(zfsvfs, zp, B_FALSE) ||
979 zfs_owner_overquota(zfsvfs, zp, B_TRUE)) {
980 if (abuf != NULL)
981 dmu_return_arcbuf(abuf);
982 error = SET_ERROR(EDQUOT);
983 break;
984 }
985

--- 35 unchanged lines hidden (view full) ---

1021
1022 /*
1023 * Start a transaction.
1024 */
1025 tx = dmu_tx_create(zfsvfs->z_os);
1026 dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE);
1027 dmu_tx_hold_write(tx, zp->z_id, woff, MIN(n, max_blksz));
1028 zfs_sa_upgrade_txholds(tx, zp);
1023 error = dmu_tx_assign(tx, TXG_NOWAIT);
1029 error = dmu_tx_assign(tx, TXG_WAIT);
1024 if (error) {
1030 if (error) {
1025 if (error == ERESTART) {
1026 dmu_tx_wait(tx);
1027 dmu_tx_abort(tx);
1028 goto again;
1029 }
1030 dmu_tx_abort(tx);
1031 if (abuf != NULL)
1032 dmu_return_arcbuf(abuf);
1033 break;
1034 }
1035
1036 /*
1037 * If zfs_range_lock() over-locked we grow the blocksize

--- 2367 unchanged lines hidden (view full) ---

3405 }
3406
3407 fuid_dirtied = zfsvfs->z_fuid_dirty;
3408 if (fuid_dirtied)
3409 zfs_fuid_txhold(zfsvfs, tx);
3410
3411 zfs_sa_upgrade_txholds(tx, zp);
3412
1031 dmu_tx_abort(tx);
1032 if (abuf != NULL)
1033 dmu_return_arcbuf(abuf);
1034 break;
1035 }
1036
1037 /*
1038 * If zfs_range_lock() over-locked we grow the blocksize

--- 2367 unchanged lines hidden (view full) ---

3406 }
3407
3408 fuid_dirtied = zfsvfs->z_fuid_dirty;
3409 if (fuid_dirtied)
3410 zfs_fuid_txhold(zfsvfs, tx);
3411
3412 zfs_sa_upgrade_txholds(tx, zp);
3413
3413 err = dmu_tx_assign(tx, TXG_NOWAIT);
3414 if (err) {
3415 if (err == ERESTART)
3416 dmu_tx_wait(tx);
3414 err = dmu_tx_assign(tx, TXG_WAIT);
3415 if (err)
3417 goto out;
3416 goto out;
3418 }
3419
3420 count = 0;
3421 /*
3422 * Set each attribute requested.
3423 * We group settings according to the locks they need to acquire.
3424 *
3425 * Note: you cannot set ctime directly, although it will be
3426 * updated as a side-effect of calling this function.

--- 1096 unchanged lines hidden (view full) ---

4523 len = zp->z_size - off;
4524 }
4525
4526 if (zfs_owner_overquota(zfsvfs, zp, B_FALSE) ||
4527 zfs_owner_overquota(zfsvfs, zp, B_TRUE)) {
4528 err = SET_ERROR(EDQUOT);
4529 goto out;
4530 }
3417
3418 count = 0;
3419 /*
3420 * Set each attribute requested.
3421 * We group settings according to the locks they need to acquire.
3422 *
3423 * Note: you cannot set ctime directly, although it will be
3424 * updated as a side-effect of calling this function.

--- 1096 unchanged lines hidden (view full) ---

4521 len = zp->z_size - off;
4522 }
4523
4524 if (zfs_owner_overquota(zfsvfs, zp, B_FALSE) ||
4525 zfs_owner_overquota(zfsvfs, zp, B_TRUE)) {
4526 err = SET_ERROR(EDQUOT);
4527 goto out;
4528 }
4531top:
4532 tx = dmu_tx_create(zfsvfs->z_os);
4533 dmu_tx_hold_write(tx, zp->z_id, off, len);
4534
4535 dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE);
4536 zfs_sa_upgrade_txholds(tx, zp);
4529 tx = dmu_tx_create(zfsvfs->z_os);
4530 dmu_tx_hold_write(tx, zp->z_id, off, len);
4531
4532 dmu_tx_hold_sa(tx, zp->z_sa_hdl, B_FALSE);
4533 zfs_sa_upgrade_txholds(tx, zp);
4537 err = dmu_tx_assign(tx, TXG_NOWAIT);
4534 err = dmu_tx_assign(tx, TXG_WAIT);
4538 if (err != 0) {
4535 if (err != 0) {
4539 if (err == ERESTART) {
4540 dmu_tx_wait(tx);
4541 dmu_tx_abort(tx);
4542 goto top;
4543 }
4544 dmu_tx_abort(tx);
4545 goto out;
4546 }
4547
4548 if (zp->z_blksz <= PAGESIZE) {
4549 caddr_t va = zfs_map_page(pp, S_READ);
4550 ASSERT3U(len, <=, PAGESIZE);
4551 dmu_write(zfsvfs->z_os, zp->z_id, off, len, va, tx);

--- 2452 unchanged lines hidden ---
4536 dmu_tx_abort(tx);
4537 goto out;
4538 }
4539
4540 if (zp->z_blksz <= PAGESIZE) {
4541 caddr_t va = zfs_map_page(pp, S_READ);
4542 ASSERT3U(len, <=, PAGESIZE);
4543 dmu_write(zfsvfs->z_os, zp->z_id, off, len, va, tx);

--- 2452 unchanged lines hidden ---