svn commit: r272187 - in stable/10/sys: kern sys

Mateusz Guzik mjguzik at gmail.com
Fri Sep 26 20:24:20 UTC 2014


On Fri, Sep 26, 2014 at 08:05:29PM +0000, Mateusz Guzik wrote:
> Author: mjg
> Date: Fri Sep 26 20:05:28 2014
> New Revision: 272187
> URL: http://svnweb.freebsd.org/changeset/base/272187
> 
> Log:
>   MFC r270993:
>   
>   Fix up proc_realparent to always return correct process.
>   
>   Prior to the change it would always return initproc for non-traced processes.
>   
>   This fixes a regression in inferior().
>   
>   Approved by:	re (marius)
> 

Oops.. this is r270648. Still approvied by re (marius).

> Modified:
>   stable/10/sys/kern/kern_descrip.c
>   stable/10/sys/kern/vfs_vnops.c
>   stable/10/sys/sys/file.h
> Directory Properties:
>   stable/10/   (props changed)
> 
> Modified: stable/10/sys/kern/kern_descrip.c
> ==============================================================================
> --- stable/10/sys/kern/kern_descrip.c	Fri Sep 26 19:56:52 2014	(r272186)
> +++ stable/10/sys/kern/kern_descrip.c	Fri Sep 26 20:05:28 2014	(r272187)
> @@ -477,7 +477,6 @@ kern_fcntl(struct thread *td, int fd, in
>  	struct vnode *vp;
>  	cap_rights_t rights;
>  	int error, flg, tmp;
> -	u_int old, new;
>  	uint64_t bsize;
>  	off_t foffset;
>  
> @@ -761,26 +760,24 @@ kern_fcntl(struct thread *td, int fd, in
>  			error = EBADF;
>  			break;
>  		}
> +		vp = fp->f_vnode;
> +		/*
> +		 * Exclusive lock synchronizes against f_seqcount reads and
> +		 * writes in sequential_heuristic().
> +		 */
> +		error = vn_lock(vp, LK_EXCLUSIVE);
> +		if (error != 0) {
> +			fdrop(fp, td);
> +			break;
> +		}
>  		if (arg >= 0) {
> -			vp = fp->f_vnode;
> -			error = vn_lock(vp, LK_SHARED);
> -			if (error != 0) {
> -				fdrop(fp, td);
> -				break;
> -			}
>  			bsize = fp->f_vnode->v_mount->mnt_stat.f_iosize;
> -			VOP_UNLOCK(vp, 0);
>  			fp->f_seqcount = (arg + bsize - 1) / bsize;
> -			do {
> -				new = old = fp->f_flag;
> -				new |= FRDAHEAD;
> -			} while (!atomic_cmpset_rel_int(&fp->f_flag, old, new));
> +			atomic_set_int(&fp->f_flag, FRDAHEAD);
>  		} else {
> -			do {
> -				new = old = fp->f_flag;
> -				new &= ~FRDAHEAD;
> -			} while (!atomic_cmpset_rel_int(&fp->f_flag, old, new));
> +			atomic_clear_int(&fp->f_flag, FRDAHEAD);
>  		}
> +		VOP_UNLOCK(vp, 0);
>  		fdrop(fp, td);
>  		break;
>  
> 
> Modified: stable/10/sys/kern/vfs_vnops.c
> ==============================================================================
> --- stable/10/sys/kern/vfs_vnops.c	Fri Sep 26 19:56:52 2014	(r272186)
> +++ stable/10/sys/kern/vfs_vnops.c	Fri Sep 26 20:05:28 2014	(r272187)
> @@ -438,7 +438,8 @@ static int
>  sequential_heuristic(struct uio *uio, struct file *fp)
>  {
>  
> -	if (atomic_load_acq_int(&(fp->f_flag)) & FRDAHEAD)
> +	ASSERT_VOP_LOCKED(fp->f_vnode, __func__);
> +	if (fp->f_flag & FRDAHEAD)
>  		return (fp->f_seqcount << IO_SEQSHIFT);
>  
>  	/*
> 
> Modified: stable/10/sys/sys/file.h
> ==============================================================================
> --- stable/10/sys/sys/file.h	Fri Sep 26 19:56:52 2014	(r272186)
> +++ stable/10/sys/sys/file.h	Fri Sep 26 20:05:28 2014	(r272187)
> @@ -139,6 +139,7 @@ struct fileops {
>   *
>   * Below is the list of locks that protects members in struct file.
>   *
> + * (a) f_vnode lock required (shared allows both reads and writes)
>   * (f) protected with mtx_lock(mtx_pool_find(fp))
>   * (d) cdevpriv_mtx
>   * none	not locked
> @@ -164,7 +165,7 @@ struct file {
>  	/*
>  	 *  DTYPE_VNODE specific fields.
>  	 */
> -	int		f_seqcount;	/* Count of sequential accesses. */
> +	int		f_seqcount;	/* (a) Count of sequential accesses. */
>  	off_t		f_nextoff;	/* next expected read/write offset. */
>  	union {
>  		struct cdev_privdata *fvn_cdevpriv;
> 

-- 
Mateusz Guzik <mjguzik gmail.com>


More information about the svn-src-all mailing list