ufs_quota.c (234483) | ufs_quota.c (241896) |
---|---|
1/*- 2 * Copyright (c) 1982, 1986, 1990, 1993, 1995 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Robert Elz at The University of Melbourne. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 19 unchanged lines hidden (view full) --- 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * 32 * @(#)ufs_quota.c 8.5 (Berkeley) 5/20/95 33 */ 34 35#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 1982, 1986, 1990, 1993, 1995 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Robert Elz at The University of Melbourne. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 19 unchanged lines hidden (view full) --- 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 * 32 * @(#)ufs_quota.c 8.5 (Berkeley) 5/20/95 33 */ 34 35#include <sys/cdefs.h> |
36__FBSDID("$FreeBSD: head/sys/ufs/ufs/ufs_quota.c 234483 2012-04-20 07:00:28Z mckusick $"); | 36__FBSDID("$FreeBSD: head/sys/ufs/ufs/ufs_quota.c 241896 2012-10-22 17:50:54Z kib $"); |
37 38#include "opt_ffs.h" 39 40#include <sys/param.h> 41#include <sys/systm.h> 42#include <sys/endian.h> 43#include <sys/fcntl.h> 44#include <sys/kernel.h> --- 447 unchanged lines hidden (view full) --- 492 */ 493int 494quotaon(struct thread *td, struct mount *mp, int type, void *fname) 495{ 496 struct ufsmount *ump; 497 struct vnode *vp, **vpp; 498 struct vnode *mvp; 499 struct dquot *dq; | 37 38#include "opt_ffs.h" 39 40#include <sys/param.h> 41#include <sys/systm.h> 42#include <sys/endian.h> 43#include <sys/fcntl.h> 44#include <sys/kernel.h> --- 447 unchanged lines hidden (view full) --- 492 */ 493int 494quotaon(struct thread *td, struct mount *mp, int type, void *fname) 495{ 496 struct ufsmount *ump; 497 struct vnode *vp, **vpp; 498 struct vnode *mvp; 499 struct dquot *dq; |
500 int error, flags, vfslocked; | 500 int error, flags; |
501 struct nameidata nd; 502 503 error = priv_check(td, PRIV_UFS_QUOTAON); 504 if (error) 505 return (error); 506 507 if (mp->mnt_flag & MNT_RDONLY) 508 return (EROFS); 509 510 ump = VFSTOUFS(mp); 511 dq = NODQUOT; 512 | 501 struct nameidata nd; 502 503 error = priv_check(td, PRIV_UFS_QUOTAON); 504 if (error) 505 return (error); 506 507 if (mp->mnt_flag & MNT_RDONLY) 508 return (EROFS); 509 510 ump = VFSTOUFS(mp); 511 dq = NODQUOT; 512 |
513 NDINIT(&nd, LOOKUP, FOLLOW | MPSAFE, UIO_USERSPACE, fname, td); | 513 NDINIT(&nd, LOOKUP, FOLLOW, UIO_USERSPACE, fname, td); |
514 flags = FREAD | FWRITE; 515 vfs_ref(mp); 516 vfs_unbusy(mp); 517 error = vn_open(&nd, &flags, 0, NULL); 518 if (error != 0) { 519 vfs_rel(mp); 520 return (error); 521 } | 514 flags = FREAD | FWRITE; 515 vfs_ref(mp); 516 vfs_unbusy(mp); 517 error = vn_open(&nd, &flags, 0, NULL); 518 if (error != 0) { 519 vfs_rel(mp); 520 return (error); 521 } |
522 vfslocked = NDHASGIANT(&nd); | |
523 NDFREE(&nd, NDF_ONLY_PNBUF); 524 vp = nd.ni_vp; 525 error = vfs_busy(mp, MBF_NOWAIT); 526 vfs_rel(mp); 527 if (error == 0) { 528 if (vp->v_type != VREG) { 529 error = EACCES; 530 vfs_unbusy(mp); 531 } 532 } 533 if (error != 0) { 534 VOP_UNLOCK(vp, 0); 535 (void) vn_close(vp, FREAD|FWRITE, td->td_ucred, td); | 522 NDFREE(&nd, NDF_ONLY_PNBUF); 523 vp = nd.ni_vp; 524 error = vfs_busy(mp, MBF_NOWAIT); 525 vfs_rel(mp); 526 if (error == 0) { 527 if (vp->v_type != VREG) { 528 error = EACCES; 529 vfs_unbusy(mp); 530 } 531 } 532 if (error != 0) { 533 VOP_UNLOCK(vp, 0); 534 (void) vn_close(vp, FREAD|FWRITE, td->td_ucred, td); |
536 VFS_UNLOCK_GIANT(vfslocked); | |
537 return (error); 538 } 539 540 UFS_LOCK(ump); 541 if ((ump->um_qflags[type] & (QTF_OPENING|QTF_CLOSING)) != 0) { 542 UFS_UNLOCK(ump); 543 VOP_UNLOCK(vp, 0); 544 (void) vn_close(vp, FREAD|FWRITE, td->td_ucred, td); | 535 return (error); 536 } 537 538 UFS_LOCK(ump); 539 if ((ump->um_qflags[type] & (QTF_OPENING|QTF_CLOSING)) != 0) { 540 UFS_UNLOCK(ump); 541 VOP_UNLOCK(vp, 0); 542 (void) vn_close(vp, FREAD|FWRITE, td->td_ucred, td); |
545 VFS_UNLOCK_GIANT(vfslocked); | |
546 vfs_unbusy(mp); 547 return (EALREADY); 548 } 549 ump->um_qflags[type] |= QTF_OPENING|QTF_CLOSING; 550 UFS_UNLOCK(ump); 551 if ((error = dqopen(vp, ump, type)) != 0) { 552 VOP_UNLOCK(vp, 0); 553 UFS_LOCK(ump); 554 ump->um_qflags[type] &= ~(QTF_OPENING|QTF_CLOSING); 555 UFS_UNLOCK(ump); 556 (void) vn_close(vp, FREAD|FWRITE, td->td_ucred, td); | 543 vfs_unbusy(mp); 544 return (EALREADY); 545 } 546 ump->um_qflags[type] |= QTF_OPENING|QTF_CLOSING; 547 UFS_UNLOCK(ump); 548 if ((error = dqopen(vp, ump, type)) != 0) { 549 VOP_UNLOCK(vp, 0); 550 UFS_LOCK(ump); 551 ump->um_qflags[type] &= ~(QTF_OPENING|QTF_CLOSING); 552 UFS_UNLOCK(ump); 553 (void) vn_close(vp, FREAD|FWRITE, td->td_ucred, td); |
557 VFS_UNLOCK_GIANT(vfslocked); | |
558 vfs_unbusy(mp); 559 return (error); 560 } 561 VOP_UNLOCK(vp, 0); 562 MNT_ILOCK(mp); 563 mp->mnt_flag |= MNT_QUOTA; 564 MNT_IUNLOCK(mp); 565 566 vpp = &ump->um_quotas[type]; 567 if (*vpp != vp) 568 quotaoff1(td, mp, type); 569 570 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); 571 vp->v_vflag |= VV_SYSTEM; 572 VOP_UNLOCK(vp, 0); 573 *vpp = vp; | 554 vfs_unbusy(mp); 555 return (error); 556 } 557 VOP_UNLOCK(vp, 0); 558 MNT_ILOCK(mp); 559 mp->mnt_flag |= MNT_QUOTA; 560 MNT_IUNLOCK(mp); 561 562 vpp = &ump->um_quotas[type]; 563 if (*vpp != vp) 564 quotaoff1(td, mp, type); 565 566 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); 567 vp->v_vflag |= VV_SYSTEM; 568 VOP_UNLOCK(vp, 0); 569 *vpp = vp; |
574 VFS_UNLOCK_GIANT(vfslocked); | |
575 /* 576 * Save the credential of the process that turned on quotas. 577 * Set up the time limits for this quota. 578 */ 579 ump->um_cred[type] = crhold(td->td_ucred); 580 ump->um_btime[type] = MAX_DQ_TIME; 581 ump->um_itime[type] = MAX_IQ_TIME; 582 if (dqget(NULLVP, 0, ump, type, &dq) == 0) { --- 55 unchanged lines hidden (view full) --- 638quotaoff1(struct thread *td, struct mount *mp, int type) 639{ 640 struct vnode *vp; 641 struct vnode *qvp, *mvp; 642 struct ufsmount *ump; 643 struct dquot *dq; 644 struct inode *ip; 645 struct ucred *cr; | 570 /* 571 * Save the credential of the process that turned on quotas. 572 * Set up the time limits for this quota. 573 */ 574 ump->um_cred[type] = crhold(td->td_ucred); 575 ump->um_btime[type] = MAX_DQ_TIME; 576 ump->um_itime[type] = MAX_IQ_TIME; 577 if (dqget(NULLVP, 0, ump, type, &dq) == 0) { --- 55 unchanged lines hidden (view full) --- 633quotaoff1(struct thread *td, struct mount *mp, int type) 634{ 635 struct vnode *vp; 636 struct vnode *qvp, *mvp; 637 struct ufsmount *ump; 638 struct dquot *dq; 639 struct inode *ip; 640 struct ucred *cr; |
646 int vfslocked; | |
647 int error; 648 649 ump = VFSTOUFS(mp); 650 651 UFS_LOCK(ump); 652 KASSERT((ump->um_qflags[type] & QTF_CLOSING) != 0, 653 ("quotaoff1: flags are invalid")); 654 if ((qvp = ump->um_quotas[type]) == NULLVP) { --- 29 unchanged lines hidden (view full) --- 684 /* Clear um_quotas before closing the quota vnode to prevent 685 * access to the closed vnode from dqget/dqsync 686 */ 687 UFS_LOCK(ump); 688 ump->um_quotas[type] = NULLVP; 689 ump->um_cred[type] = NOCRED; 690 UFS_UNLOCK(ump); 691 | 641 int error; 642 643 ump = VFSTOUFS(mp); 644 645 UFS_LOCK(ump); 646 KASSERT((ump->um_qflags[type] & QTF_CLOSING) != 0, 647 ("quotaoff1: flags are invalid")); 648 if ((qvp = ump->um_quotas[type]) == NULLVP) { --- 29 unchanged lines hidden (view full) --- 678 /* Clear um_quotas before closing the quota vnode to prevent 679 * access to the closed vnode from dqget/dqsync 680 */ 681 UFS_LOCK(ump); 682 ump->um_quotas[type] = NULLVP; 683 ump->um_cred[type] = NOCRED; 684 UFS_UNLOCK(ump); 685 |
692 vfslocked = VFS_LOCK_GIANT(qvp->v_mount); | |
693 vn_lock(qvp, LK_EXCLUSIVE | LK_RETRY); 694 qvp->v_vflag &= ~VV_SYSTEM; 695 VOP_UNLOCK(qvp, 0); 696 error = vn_close(qvp, FREAD|FWRITE, td->td_ucred, td); | 686 vn_lock(qvp, LK_EXCLUSIVE | LK_RETRY); 687 qvp->v_vflag &= ~VV_SYSTEM; 688 VOP_UNLOCK(qvp, 0); 689 error = vn_close(qvp, FREAD|FWRITE, td->td_ucred, td); |
697 VFS_UNLOCK_GIANT(vfslocked); | |
698 crfree(cr); 699 700 return (error); 701} 702 703/* 704 * Turns off quotas, assumes that ump->um_qflags are already checked 705 * and QTF_CLOSING is set to indicate operation in progress. Fixes --- 535 unchanged lines hidden (view full) --- 1241{ 1242 uint8_t buf[sizeof(struct dqblk64)]; 1243 off_t base, recsize; 1244 struct dquot *dq, *dq1; 1245 struct dqhash *dqh; 1246 struct vnode *dqvp; 1247 struct iovec aiov; 1248 struct uio auio; | 690 crfree(cr); 691 692 return (error); 693} 694 695/* 696 * Turns off quotas, assumes that ump->um_qflags are already checked 697 * and QTF_CLOSING is set to indicate operation in progress. Fixes --- 535 unchanged lines hidden (view full) --- 1233{ 1234 uint8_t buf[sizeof(struct dqblk64)]; 1235 off_t base, recsize; 1236 struct dquot *dq, *dq1; 1237 struct dqhash *dqh; 1238 struct vnode *dqvp; 1239 struct iovec aiov; 1240 struct uio auio; |
1249 int vfslocked, dqvplocked, error; | 1241 int dqvplocked, error; |
1250 1251#ifdef DEBUG_VFS_LOCKS 1252 if (vp != NULLVP) 1253 ASSERT_VOP_ELOCKED(vp, "dqget"); 1254#endif 1255 1256 if (vp != NULLVP && *dqp != NODQUOT) { 1257 return (0); --- 29 unchanged lines hidden (view full) --- 1287 DQI_WAIT(dq, PINOD+1, "dqget"); 1288 DQI_UNLOCK(dq); 1289 if (dq->dq_ump == NULL) { 1290 dqrele(vp, dq); 1291 dq = NODQUOT; 1292 error = EIO; 1293 } 1294 *dqp = dq; | 1242 1243#ifdef DEBUG_VFS_LOCKS 1244 if (vp != NULLVP) 1245 ASSERT_VOP_ELOCKED(vp, "dqget"); 1246#endif 1247 1248 if (vp != NULLVP && *dqp != NODQUOT) { 1249 return (0); --- 29 unchanged lines hidden (view full) --- 1279 DQI_WAIT(dq, PINOD+1, "dqget"); 1280 DQI_UNLOCK(dq); 1281 if (dq->dq_ump == NULL) { 1282 dqrele(vp, dq); 1283 dq = NODQUOT; 1284 error = EIO; 1285 } 1286 *dqp = dq; |
1295 vfslocked = VFS_LOCK_GIANT(dqvp->v_mount); | |
1296 if (dqvplocked) 1297 vput(dqvp); 1298 else 1299 vrele(dqvp); | 1287 if (dqvplocked) 1288 vput(dqvp); 1289 else 1290 vrele(dqvp); |
1300 VFS_UNLOCK_GIANT(vfslocked); | |
1301 return (error); 1302 } 1303 1304 /* 1305 * Quota vnode lock is before DQ_LOCK. Acquire dqvp lock there 1306 * since new dq will appear on the hash chain DQ_LOCKed. 1307 */ 1308 if (vp != dqvp) { --- 36 unchanged lines hidden (view full) --- 1345 goto hfound; 1346 } 1347 dq = dq1; 1348 } else { 1349 if ((dq = TAILQ_FIRST(&dqfreelist)) == NULL) { 1350 DQH_UNLOCK(); 1351 tablefull("dquot"); 1352 *dqp = NODQUOT; | 1291 return (error); 1292 } 1293 1294 /* 1295 * Quota vnode lock is before DQ_LOCK. Acquire dqvp lock there 1296 * since new dq will appear on the hash chain DQ_LOCKed. 1297 */ 1298 if (vp != dqvp) { --- 36 unchanged lines hidden (view full) --- 1335 goto hfound; 1336 } 1337 dq = dq1; 1338 } else { 1339 if ((dq = TAILQ_FIRST(&dqfreelist)) == NULL) { 1340 DQH_UNLOCK(); 1341 tablefull("dquot"); 1342 *dqp = NODQUOT; |
1353 vfslocked = VFS_LOCK_GIANT(dqvp->v_mount); | |
1354 if (dqvplocked) 1355 vput(dqvp); 1356 else 1357 vrele(dqvp); | 1343 if (dqvplocked) 1344 vput(dqvp); 1345 else 1346 vrele(dqvp); |
1358 VFS_UNLOCK_GIANT(vfslocked); | |
1359 return (EUSERS); 1360 } 1361 if (dq->dq_cnt || (dq->dq_flags & DQ_MOD)) 1362 panic("dqget: free dquot isn't %p", dq); 1363 TAILQ_REMOVE(&dqfreelist, dq, dq_freelist); 1364 if (dq->dq_ump != NULL) 1365 LIST_REMOVE(dq, dq_hash); 1366 } --- 26 unchanged lines hidden (view full) --- 1393 aiov.iov_base = buf; 1394 aiov.iov_len = recsize; 1395 auio.uio_resid = recsize; 1396 auio.uio_offset = base + id * recsize; 1397 auio.uio_segflg = UIO_SYSSPACE; 1398 auio.uio_rw = UIO_READ; 1399 auio.uio_td = (struct thread *)0; 1400 | 1347 return (EUSERS); 1348 } 1349 if (dq->dq_cnt || (dq->dq_flags & DQ_MOD)) 1350 panic("dqget: free dquot isn't %p", dq); 1351 TAILQ_REMOVE(&dqfreelist, dq, dq_freelist); 1352 if (dq->dq_ump != NULL) 1353 LIST_REMOVE(dq, dq_hash); 1354 } --- 26 unchanged lines hidden (view full) --- 1381 aiov.iov_base = buf; 1382 aiov.iov_len = recsize; 1383 auio.uio_resid = recsize; 1384 auio.uio_offset = base + id * recsize; 1385 auio.uio_segflg = UIO_SYSSPACE; 1386 auio.uio_rw = UIO_READ; 1387 auio.uio_td = (struct thread *)0; 1388 |
1401 vfslocked = VFS_LOCK_GIANT(dqvp->v_mount); | |
1402 error = VOP_READ(dqvp, &auio, 0, ump->um_cred[type]); 1403 if (auio.uio_resid == recsize && error == 0) { 1404 bzero(&dq->dq_dqb, sizeof(dq->dq_dqb)); 1405 } else { 1406 if (ump->um_qflags[type] & QTF_64BIT) 1407 dqb64_dq((struct dqblk64 *)buf, dq); 1408 else 1409 dqb32_dq((struct dqblk32 *)buf, dq); 1410 } 1411 if (dqvplocked) 1412 vput(dqvp); 1413 else 1414 vrele(dqvp); | 1389 error = VOP_READ(dqvp, &auio, 0, ump->um_cred[type]); 1390 if (auio.uio_resid == recsize && error == 0) { 1391 bzero(&dq->dq_dqb, sizeof(dq->dq_dqb)); 1392 } else { 1393 if (ump->um_qflags[type] & QTF_64BIT) 1394 dqb64_dq((struct dqblk64 *)buf, dq); 1395 else 1396 dqb32_dq((struct dqblk32 *)buf, dq); 1397 } 1398 if (dqvplocked) 1399 vput(dqvp); 1400 else 1401 vrele(dqvp); |
1415 VFS_UNLOCK_GIANT(vfslocked); | |
1416 /* 1417 * I/O error in reading quota file, release 1418 * quota structure and reflect problem to caller. 1419 */ 1420 if (error) { 1421 DQH_LOCK(); 1422 dq->dq_ump = NULL; 1423 LIST_REMOVE(dq, dq_hash); --- 96 unchanged lines hidden (view full) --- 1520static int 1521dqsync(struct vnode *vp, struct dquot *dq) 1522{ 1523 uint8_t buf[sizeof(struct dqblk64)]; 1524 off_t base, recsize; 1525 struct vnode *dqvp; 1526 struct iovec aiov; 1527 struct uio auio; | 1402 /* 1403 * I/O error in reading quota file, release 1404 * quota structure and reflect problem to caller. 1405 */ 1406 if (error) { 1407 DQH_LOCK(); 1408 dq->dq_ump = NULL; 1409 LIST_REMOVE(dq, dq_hash); --- 96 unchanged lines hidden (view full) --- 1506static int 1507dqsync(struct vnode *vp, struct dquot *dq) 1508{ 1509 uint8_t buf[sizeof(struct dqblk64)]; 1510 off_t base, recsize; 1511 struct vnode *dqvp; 1512 struct iovec aiov; 1513 struct uio auio; |
1528 int vfslocked, error; | 1514 int error; |
1529 struct mount *mp; 1530 struct ufsmount *ump; 1531 1532#ifdef DEBUG_VFS_LOCKS 1533 if (vp != NULL) 1534 ASSERT_VOP_ELOCKED(vp, "dqsync"); 1535#endif 1536 --- 4 unchanged lines hidden (view full) --- 1541 if ((ump = dq->dq_ump) == NULL) 1542 return (0); 1543 UFS_LOCK(ump); 1544 if ((dqvp = ump->um_quotas[dq->dq_type]) == NULLVP) 1545 panic("dqsync: file"); 1546 vref(dqvp); 1547 UFS_UNLOCK(ump); 1548 | 1515 struct mount *mp; 1516 struct ufsmount *ump; 1517 1518#ifdef DEBUG_VFS_LOCKS 1519 if (vp != NULL) 1520 ASSERT_VOP_ELOCKED(vp, "dqsync"); 1521#endif 1522 --- 4 unchanged lines hidden (view full) --- 1527 if ((ump = dq->dq_ump) == NULL) 1528 return (0); 1529 UFS_LOCK(ump); 1530 if ((dqvp = ump->um_quotas[dq->dq_type]) == NULLVP) 1531 panic("dqsync: file"); 1532 vref(dqvp); 1533 UFS_UNLOCK(ump); 1534 |
1549 vfslocked = VFS_LOCK_GIANT(dqvp->v_mount); | |
1550 DQI_LOCK(dq); 1551 if ((dq->dq_flags & DQ_MOD) == 0) { 1552 DQI_UNLOCK(dq); 1553 vrele(dqvp); | 1535 DQI_LOCK(dq); 1536 if ((dq->dq_flags & DQ_MOD) == 0) { 1537 DQI_UNLOCK(dq); 1538 vrele(dqvp); |
1554 VFS_UNLOCK_GIANT(vfslocked); | |
1555 return (0); 1556 } 1557 DQI_UNLOCK(dq); 1558 1559 (void) vn_start_secondary_write(dqvp, &mp, V_WAIT); 1560 if (vp != dqvp) 1561 vn_lock(dqvp, LK_EXCLUSIVE | LK_RETRY); 1562 | 1539 return (0); 1540 } 1541 DQI_UNLOCK(dq); 1542 1543 (void) vn_start_secondary_write(dqvp, &mp, V_WAIT); 1544 if (vp != dqvp) 1545 vn_lock(dqvp, LK_EXCLUSIVE | LK_RETRY); 1546 |
1563 VFS_UNLOCK_GIANT(vfslocked); | |
1564 DQI_LOCK(dq); 1565 DQI_WAIT(dq, PINOD+2, "dqsync"); 1566 if ((dq->dq_flags & DQ_MOD) == 0) 1567 goto out; 1568 dq->dq_flags |= DQ_LOCK; 1569 DQI_UNLOCK(dq); 1570 1571 /* --- 14 unchanged lines hidden (view full) --- 1586 auio.uio_iovcnt = 1; 1587 aiov.iov_base = buf; 1588 aiov.iov_len = recsize; 1589 auio.uio_resid = recsize; 1590 auio.uio_offset = base + dq->dq_id * recsize; 1591 auio.uio_segflg = UIO_SYSSPACE; 1592 auio.uio_rw = UIO_WRITE; 1593 auio.uio_td = (struct thread *)0; | 1547 DQI_LOCK(dq); 1548 DQI_WAIT(dq, PINOD+2, "dqsync"); 1549 if ((dq->dq_flags & DQ_MOD) == 0) 1550 goto out; 1551 dq->dq_flags |= DQ_LOCK; 1552 DQI_UNLOCK(dq); 1553 1554 /* --- 14 unchanged lines hidden (view full) --- 1569 auio.uio_iovcnt = 1; 1570 aiov.iov_base = buf; 1571 aiov.iov_len = recsize; 1572 auio.uio_resid = recsize; 1573 auio.uio_offset = base + dq->dq_id * recsize; 1574 auio.uio_segflg = UIO_SYSSPACE; 1575 auio.uio_rw = UIO_WRITE; 1576 auio.uio_td = (struct thread *)0; |
1594 vfslocked = VFS_LOCK_GIANT(dqvp->v_mount); | |
1595 error = VOP_WRITE(dqvp, &auio, 0, dq->dq_ump->um_cred[dq->dq_type]); | 1577 error = VOP_WRITE(dqvp, &auio, 0, dq->dq_ump->um_cred[dq->dq_type]); |
1596 VFS_UNLOCK_GIANT(vfslocked); | |
1597 if (auio.uio_resid && error == 0) 1598 error = EIO; 1599 1600 DQI_LOCK(dq); 1601 DQI_WAKEUP(dq); 1602 dq->dq_flags &= ~DQ_MOD; 1603out: 1604 DQI_UNLOCK(dq); | 1578 if (auio.uio_resid && error == 0) 1579 error = EIO; 1580 1581 DQI_LOCK(dq); 1582 DQI_WAKEUP(dq); 1583 dq->dq_flags &= ~DQ_MOD; 1584out: 1585 DQI_UNLOCK(dq); |
1605 vfslocked = VFS_LOCK_GIANT(dqvp->v_mount); | |
1606 if (vp != dqvp) 1607 vput(dqvp); 1608 else 1609 vrele(dqvp); 1610 vn_finished_secondary_write(mp); | 1586 if (vp != dqvp) 1587 vput(dqvp); 1588 else 1589 vrele(dqvp); 1590 vn_finished_secondary_write(mp); |
1611 VFS_UNLOCK_GIANT(vfslocked); | |
1612 return (error); 1613} 1614 1615/* 1616 * Flush all entries from the cache for a particular vnode. 1617 */ 1618static void 1619dqflush(struct vnode *vp) --- 233 unchanged lines hidden --- | 1591 return (error); 1592} 1593 1594/* 1595 * Flush all entries from the cache for a particular vnode. 1596 */ 1597static void 1598dqflush(struct vnode *vp) --- 233 unchanged lines hidden --- |