kern_alq.c (207223) | kern_alq.c (241896) |
---|---|
1/*- 2 * Copyright (c) 2002, Jeffrey Roberson <jeff@freebsd.org> 3 * Copyright (c) 2008-2009, Lawrence Stewart <lstewart@freebsd.org> 4 * Copyright (c) 2009-2010, The FreeBSD Foundation 5 * All rights reserved. 6 * 7 * Portions of this software were developed at the Centre for Advanced 8 * Internet Architectures, Swinburne University of Technology, Melbourne, --- 17 unchanged lines hidden (view full) --- 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2002, Jeffrey Roberson <jeff@freebsd.org> 3 * Copyright (c) 2008-2009, Lawrence Stewart <lstewart@freebsd.org> 4 * Copyright (c) 2009-2010, The FreeBSD Foundation 5 * All rights reserved. 6 * 7 * Portions of this software were developed at the Centre for Advanced 8 * Internet Architectures, Swinburne University of Technology, Melbourne, --- 17 unchanged lines hidden (view full) --- 26 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33#include <sys/cdefs.h> |
34__FBSDID("$FreeBSD: head/sys/kern/kern_alq.c 207223 2010-04-26 13:48:22Z lstewart $"); | 34__FBSDID("$FreeBSD: head/sys/kern/kern_alq.c 241896 2012-10-22 17:50:54Z kib $"); |
35 36#include "opt_mac.h" 37 38#include <sys/param.h> 39#include <sys/systm.h> 40#include <sys/kernel.h> 41#include <sys/kthread.h> 42#include <sys/lock.h> --- 265 unchanged lines hidden (view full) --- 308{ 309 struct thread *td; 310 struct mount *mp; 311 struct vnode *vp; 312 struct uio auio; 313 struct iovec aiov[2]; 314 int totlen; 315 int iov; | 35 36#include "opt_mac.h" 37 38#include <sys/param.h> 39#include <sys/systm.h> 40#include <sys/kernel.h> 41#include <sys/kthread.h> 42#include <sys/lock.h> --- 265 unchanged lines hidden (view full) --- 308{ 309 struct thread *td; 310 struct mount *mp; 311 struct vnode *vp; 312 struct uio auio; 313 struct iovec aiov[2]; 314 int totlen; 315 int iov; |
316 int vfslocked; | |
317 int wrapearly; 318 319 KASSERT((HAS_PENDING_DATA(alq)), ("%s: queue empty!", __func__)); 320 321 vp = alq->aq_vp; 322 td = curthread; 323 totlen = 0; 324 iov = 1; --- 35 unchanged lines hidden (view full) --- 360 auio.uio_rw = UIO_WRITE; 361 auio.uio_iovcnt = iov; 362 auio.uio_resid = totlen; 363 auio.uio_td = td; 364 365 /* 366 * Do all of the junk required to write now. 367 */ | 316 int wrapearly; 317 318 KASSERT((HAS_PENDING_DATA(alq)), ("%s: queue empty!", __func__)); 319 320 vp = alq->aq_vp; 321 td = curthread; 322 totlen = 0; 323 iov = 1; --- 35 unchanged lines hidden (view full) --- 359 auio.uio_rw = UIO_WRITE; 360 auio.uio_iovcnt = iov; 361 auio.uio_resid = totlen; 362 auio.uio_td = td; 363 364 /* 365 * Do all of the junk required to write now. 366 */ |
368 vfslocked = VFS_LOCK_GIANT(vp->v_mount); | |
369 vn_start_write(vp, &mp, V_WAIT); 370 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); 371 /* 372 * XXX: VOP_WRITE error checks are ignored. 373 */ 374#ifdef MAC 375 if (mac_vnode_check_write(alq->aq_cred, NOCRED, vp) == 0) 376#endif 377 VOP_WRITE(vp, &auio, IO_UNIT | IO_APPEND, alq->aq_cred); 378 VOP_UNLOCK(vp, 0); 379 vn_finished_write(mp); | 367 vn_start_write(vp, &mp, V_WAIT); 368 vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); 369 /* 370 * XXX: VOP_WRITE error checks are ignored. 371 */ 372#ifdef MAC 373 if (mac_vnode_check_write(alq->aq_cred, NOCRED, vp) == 0) 374#endif 375 VOP_WRITE(vp, &auio, IO_UNIT | IO_APPEND, alq->aq_cred); 376 VOP_UNLOCK(vp, 0); 377 vn_finished_write(mp); |
380 VFS_UNLOCK_GIANT(vfslocked); | |
381 382 ALQ_LOCK(alq); 383 alq->aq_flags &= ~AQ_FLUSHING; 384 385 /* Adjust writetail as required, taking into account wrapping. */ 386 alq->aq_writetail = (alq->aq_writetail + totlen + wrapearly) % 387 alq->aq_buflen; 388 alq->aq_freebytes += totlen + wrapearly; --- 44 unchanged lines hidden (view full) --- 433alq_open_flags(struct alq **alqp, const char *file, struct ucred *cred, int cmode, 434 int size, int flags) 435{ 436 struct thread *td; 437 struct nameidata nd; 438 struct alq *alq; 439 int oflags; 440 int error; | 378 379 ALQ_LOCK(alq); 380 alq->aq_flags &= ~AQ_FLUSHING; 381 382 /* Adjust writetail as required, taking into account wrapping. */ 383 alq->aq_writetail = (alq->aq_writetail + totlen + wrapearly) % 384 alq->aq_buflen; 385 alq->aq_freebytes += totlen + wrapearly; --- 44 unchanged lines hidden (view full) --- 430alq_open_flags(struct alq **alqp, const char *file, struct ucred *cred, int cmode, 431 int size, int flags) 432{ 433 struct thread *td; 434 struct nameidata nd; 435 struct alq *alq; 436 int oflags; 437 int error; |
441 int vfslocked; | |
442 443 KASSERT((size > 0), ("%s: size <= 0", __func__)); 444 445 *alqp = NULL; 446 td = curthread; 447 | 438 439 KASSERT((size > 0), ("%s: size <= 0", __func__)); 440 441 *alqp = NULL; 442 td = curthread; 443 |
448 NDINIT(&nd, LOOKUP, NOFOLLOW | MPSAFE, UIO_SYSSPACE, file, td); | 444 NDINIT(&nd, LOOKUP, NOFOLLOW, UIO_SYSSPACE, file, td); |
449 oflags = FWRITE | O_NOFOLLOW | O_CREAT; 450 451 error = vn_open_cred(&nd, &oflags, cmode, 0, cred, NULL); 452 if (error) 453 return (error); 454 | 445 oflags = FWRITE | O_NOFOLLOW | O_CREAT; 446 447 error = vn_open_cred(&nd, &oflags, cmode, 0, cred, NULL); 448 if (error) 449 return (error); 450 |
455 vfslocked = NDHASGIANT(&nd); | |
456 NDFREE(&nd, NDF_ONLY_PNBUF); 457 /* We just unlock so we hold a reference */ 458 VOP_UNLOCK(nd.ni_vp, 0); | 451 NDFREE(&nd, NDF_ONLY_PNBUF); 452 /* We just unlock so we hold a reference */ 453 VOP_UNLOCK(nd.ni_vp, 0); |
459 VFS_UNLOCK_GIANT(vfslocked); | |
460 461 alq = malloc(sizeof(*alq), M_ALD, M_WAITOK|M_ZERO); 462 alq->aq_vp = nd.ni_vp; 463 alq->aq_cred = crhold(cred); 464 465 mtx_init(&alq->aq_mtx, "ALD Queue", NULL, MTX_SPIN|MTX_QUIET); 466 467 alq->aq_buflen = size; --- 507 unchanged lines hidden --- | 454 455 alq = malloc(sizeof(*alq), M_ALD, M_WAITOK|M_ZERO); 456 alq->aq_vp = nd.ni_vp; 457 alq->aq_cred = crhold(cred); 458 459 mtx_init(&alq->aq_mtx, "ALD Queue", NULL, MTX_SPIN|MTX_QUIET); 460 461 alq->aq_buflen = size; --- 507 unchanged lines hidden --- |