Deleted Added
full compact
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 ---