All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vlad Apostolov <vapo@sgi.com>
To: Christoph Hellwig <hch@lst.de>
Cc: xfs@oss.sgi.com
Subject: Re: [PATCH] cleanup vnode useage in xfs_dm.c
Date: Tue, 25 Sep 2007 13:52:34 +1000	[thread overview]
Message-ID: <46F88602.4040104@sgi.com> (raw)
In-Reply-To: <20070923114339.GB9585@lst.de>

It is looking good Christoph. I also built and tested it with XFS DMAPI QA
all went fine. I think it is time to kill the 2.4 / 2.6 compat code as we
are going to drop the XFS 2.4 tree soon. Do you have a patch for this
or I could do it?

Regards,
Vlad


Christoph Hellwig wrote:
> Avoid passing around the vnode in xfs_dm.c but pass the xfs_inode /
> Linux inode / struct address_space as apropinquate.
>
> p.s. is there a chance we can kill all that 2.4 / early 2.6 compat code
> in dmapi one day?
>
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
>
> Index: linux-2.6-xfs/fs/xfs/dmapi/xfs_dm.c
> ===================================================================
> --- linux-2.6-xfs.orig/fs/xfs/dmapi/xfs_dm.c	2007-09-19 18:51:01.000000000 +0200
> +++ linux-2.6-xfs/fs/xfs/dmapi/xfs_dm.c	2007-09-19 18:53:41.000000000 +0200
> @@ -217,25 +217,35 @@ xfs_dm_send_data_event(
>   *
>   */
>  
> +
> +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
>  STATIC int
>  prohibited_mr_events(
> -	bhv_vnode_t	*vp)
> +	struct address_space *mapping)
>  {
> -	struct address_space *mapping = vn_to_inode(vp)->i_mapping;
>  	int prohibited = (1 << DM_EVENT_READ);
> -#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0)
> -	struct vm_area_struct *vma = NULL;
> -#endif
>  
> -	if (!VN_MAPPED(vp))
> +	if (!mapping_mapped(mapping))
>  		return 0;
>  
> -#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
>  	spin_lock(&mapping->i_mmap_lock);
>  	if (mapping_writably_mapped(mapping))
>  		prohibited |= (1 << DM_EVENT_WRITE);
>  	spin_unlock(&mapping->i_mmap_lock);
> +
> +	return prohibited;
> +}
>  #else
> +STATIC int
> +prohibited_mr_events(
> +	struct address_space *mapping)
> +{
> +	int prohibited = (1 << DM_EVENT_READ);
> +	struct vm_area_struct *vma = NULL;
> +
> +	if (!VN_MAPPED(inode_to_vn(mapping->host)))
> +		return 0;
> +
>  	spin_lock(&mapping->i_shared_lock);
>  	for (vma = mapping->i_mmap_shared; vma; vma = vma->vm_next_share) {
>  		if (vma->vm_flags & VM_WRITE) {
> @@ -250,16 +260,16 @@ prohibited_mr_events(
>  		}
>  	}
>  	spin_unlock(&mapping->i_shared_lock);
> -#endif
>  
>  	return prohibited;
>  }
> +#endif
>  
>  
>  #ifdef	DEBUG_RIGHTS
>  STATIC int
>  xfs_vp_to_hexhandle(
> -	bhv_vnode_t	*vp,
> +	struct inode	*inode,
>  	u_int		type,
>  	char		*buffer)
>  {
> @@ -269,7 +279,11 @@ xfs_vp_to_hexhandle(
>  	int		error;
>  	int		i;
>  
> -	if ((error = dm_vp_to_handle(vp, &handle)))
> +	/*
> +	 * XXX: dm_vp_to_handle doesn't exist.
> +	 * 	Looks like this debug code is rather dead.
> +	 */
> +	if ((error = dm_vp_to_handle(inode, &handle)))
>  		return(error);
>  
>  	if (type == DM_FSYS_OBJ) {	/* a filesystem handle */
> @@ -465,7 +479,6 @@ xfs_ip_to_stat(
>  	dm_stat_t		*buf)
>  {
>  	xfs_icdinode_t		*dic = &ip->i_d;
> -	bhv_vnode_t		*vp = XFS_ITOV(ip);
>  
>  	buf->dt_ino = ino;
>  	buf->dt_nlink = dic->di_nlink;
> @@ -474,8 +487,8 @@ xfs_ip_to_stat(
>  	buf->dt_uid = dic->di_uid;
>  	buf->dt_gid = dic->di_gid;
>  	buf->dt_size = XFS_ISIZE(ip);
> -	buf->dt_dev = new_encode_dev(vp->i_sb->s_dev);
> -	vn_atime_to_time_t(vp, &buf->dt_atime);
> +	buf->dt_dev = XFS_TO_HOST_DEVT(mp);
> +	vn_atime_to_time_t(XFS_ITOV(ip), &buf->dt_atime);
>  	buf->dt_mtime = dic->di_mtime.t_sec;
>  	buf->dt_ctime = dic->di_ctime.t_sec;
>  	buf->dt_xfs_xflags = xfs_ip2dmflags(ip);
> @@ -554,7 +567,6 @@ xfs_dm_bulkall_iget_one(
>  	char		*attr_name,
>  	caddr_t		attr_buf)
>  {
> -	bhv_vnode_t	*vp;
>  	xfs_inode_t	*ip;
>  	dm_handle_t	handle;
>  	u_int		xstat_sz = *xstat_szp;
> @@ -569,10 +581,9 @@ xfs_dm_bulkall_iget_one(
>  		xfs_iput_new(ip, XFS_ILOCK_SHARED);
>  		return ENOENT;
>  	}
> -	vp = XFS_ITOV(ip);
>  
>  	xfs_ip_to_stat(mp, ino, ip, &xbuf->dx_statinfo);
> -	dm_ip_to_handle(vn_to_inode(vp), &handle);
> +	dm_ip_to_handle(ip->i_vnode, &handle);
>  	xfs_dm_handle_to_xstat(xbuf, xstat_sz, &handle, sizeof(handle));
>  
>  	/* Drop ILOCK_SHARED for call to xfs_attr_get */
> @@ -581,7 +592,7 @@ xfs_dm_bulkall_iget_one(
>  	memset(&xbuf->dx_attrdata, 0, sizeof(dm_vardata_t));
>  	error = xfs_attr_get(ip, attr_name, attr_buf,
>  				 &value_len, ATTR_ROOT, sys_cred);
> -	VN_RELE(vp);
> +	iput(ip->i_vnode);
>  
>  	DM_EA_XLATE_ERR(error);
>  	if (error && (error != ENOATTR)) {
> @@ -837,7 +848,7 @@ xfs_dm_bulkattr_iget_one(
>  	}
>  
>  	xfs_ip_to_stat(mp, ino, ip, sbuf);
> -	dm_ip_to_handle(vn_to_inode(XFS_ITOV(ip)), &handle);
> +	dm_ip_to_handle(ip->i_vnode, &handle);
>  	xfs_dm_handle_to_stat(sbuf, stat_sz, &handle, sizeof(handle));
>  
>  	xfs_iput(ip, XFS_ILOCK_SHARED);
> @@ -925,7 +936,7 @@ xfs_dm_bulkattr_one(
>  	return error;
>  }
>  
> -/* xfs_dm_f_get_eventlist - return the dm_eventset_t mask for inode vp. */
> +/* xfs_dm_f_get_eventlist - return the dm_eventset_t mask for inode ip. */
>  
>  STATIC int
>  xfs_dm_f_get_eventlist(
> @@ -969,7 +980,6 @@ xfs_dm_f_get_eventlist(
>  
>  STATIC int
>  xfs_dm_f_set_eventlist(
> -	bhv_vnode_t	*vp,
>  	xfs_inode_t	*ip,
>  	dm_right_t	right,
>  	dm_eventset_t	*eventsetp,	/* in kernel space! */
> @@ -990,7 +1000,7 @@ xfs_dm_f_set_eventlist(
>  		return(EINVAL);
>  	max_mask = (1 << maxevent) - 1;
>  
> -	if (VN_ISDIR(vp)) {
> +	if (S_ISDIR(ip->i_d.di_mode)) {
>  		valid_events = DM_XFS_VALID_DIRECTORY_EVENTS;
>  	} else {	/* file or symlink */
>  		valid_events = DM_XFS_VALID_FILE_EVENTS;
> @@ -1019,7 +1029,7 @@ xfs_dm_f_set_eventlist(
>  	ip->i_d.di_dmevmask = (eventset & max_mask) | (ip->i_d.di_dmevmask & ~max_mask);
>  
>  	xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
> -	VN_HOLD(vp);
> +	igrab(ip->i_vnode);
>  	xfs_trans_commit(tp, 0);
>  
>  	return(0);
> @@ -1146,7 +1156,7 @@ xfs_dm_direct_ok(
>  
>  STATIC int
>  xfs_dm_rdwr(
> -	bhv_vnode_t	*vp,
> +	struct inode	*inode,
>  	uint		fflag,
>  	mode_t		fmode,
>  	dm_off_t	off,
> @@ -1154,13 +1164,12 @@ xfs_dm_rdwr(
>  	void		__user *bufp,
>  	int		*rvp)
>  {
> +	xfs_inode_t	*ip = XFS_I(inode);
>  	int		error;
>  	int		oflags;
>  	ssize_t		xfer;
>  	struct file	*file;
> -	struct inode	*inode = vn_to_inode(vp);
>  	struct dentry	*dentry;
> -	xfs_inode_t	*ip;
>  
>  	if ((off < 0) || (off > i_size_read(inode)) || !S_ISREG(inode->i_mode))
>  		return EINVAL;
> @@ -1178,7 +1187,6 @@ xfs_dm_rdwr(
>  	 */
>  
>  	oflags |= O_LARGEFILE | O_NONBLOCK | O_NOATIME;
> -	ip = xfs_vtoi(vp);
>  	if (xfs_dm_direct_ok(ip, off, len, bufp))
>  		oflags |= O_DIRECT;
>  
> @@ -1255,9 +1263,8 @@ xfs_dm_downgrade_right(
>  {
>  #ifdef	DEBUG_RIGHTS
>  	char		buffer[sizeof(dm_handle_t) * 2 + 1];
> -	bhv_vnode_t	*vp = vn_from_inode(inode);
>  
> -	if (!xfs_vp_to_hexhandle(vp, type, buffer)) {
> +	if (!xfs_vp_to_hexhandle(inode, type, buffer)) {
>  		printf("dm_downgrade_right: old %d new %d type %d handle %s\n",
>  			right, DM_RIGHT_SHARED, type, buffer);
>  	} else {
> @@ -1288,13 +1295,12 @@ xfs_dm_get_allocinfo_rvp(
>  	u_int		__user *nelemp,
>  	int		*rvp)
>  {
> -	xfs_inode_t	*ip;		/* xfs incore inode pointer */
> +	xfs_inode_t	*ip = XFS_I(inode);
>  	xfs_mount_t	*mp;		/* file system mount point */
>  	xfs_fileoff_t	fsb_offset;
>  	xfs_filblks_t	fsb_length;
>  	dm_off_t	startoff;
>  	int		elem;
> -	bhv_vnode_t	*vp = vn_from_inode(inode);
>  	xfs_bmbt_irec_t *bmp = NULL;
>  	u_int		bmpcnt = 50;
>  	u_int		bmpsz = sizeof(xfs_bmbt_irec_t) * bmpcnt;
> @@ -1311,7 +1317,6 @@ xfs_dm_get_allocinfo_rvp(
>  	if (copy_from_user( &startoff, offp, sizeof(startoff)))
>  		return(-EFAULT);
>  
> -	ip = xfs_vtoi(vp);
>  	mp = ip->i_mount;
>  	ASSERT(mp);
>  
> @@ -1819,15 +1824,13 @@ xfs_dm_get_dioinfo(
>  {
>  	dm_dioinfo_t	dio;
>  	xfs_mount_t	*mp;
> -	xfs_inode_t	*ip;
> -	bhv_vnode_t	*vp = vn_from_inode(inode);
> +	xfs_inode_t	*ip = XFS_I(inode);
>  
>  	/* Returns negative errors to DMAPI */
>  
>  	if (right < DM_RIGHT_SHARED)
>  		return(-EACCES);
>  
> -	ip = xfs_vtoi(vp);
>  	mp = ip->i_mount;
>  
>  	dio.d_miniosz = dio.d_mem = MIN_DIO_SIZE(mp);
> @@ -2079,8 +2082,7 @@ xfs_dm_get_eventlist(
>  	u_int 		*nelemp)
>  {
>  	int		error;
> -	bhv_vnode_t	*vp = vn_from_inode(inode);
> -	xfs_inode_t	*ip = xfs_vtoi(vp);
> +	xfs_inode_t	*ip = XFS_I(inode);
>  
>  	/* Returns negative errors to DMAPI */
>  
> @@ -2104,9 +2106,8 @@ xfs_dm_get_fileattr(
>  	dm_stat_t	__user *statp)
>  {
>  	dm_stat_t	stat;
> -	xfs_inode_t	*ip;
> +	xfs_inode_t	*ip = XFS_I(inode);
>  	xfs_mount_t	*mp;
> -	bhv_vnode_t	*vp = vn_from_inode(inode);
>  
>  	/* Returns negative errors to DMAPI */
>  
> @@ -2115,7 +2116,6 @@ xfs_dm_get_fileattr(
>  
>  	/* Find the mount point. */
>  
> -	ip = xfs_vtoi(vp);
>  	mp = ip->i_mount;
>  
>  	xfs_ilock(ip, XFS_ILOCK_SHARED);
> @@ -2144,16 +2144,14 @@ xfs_dm_get_region(
>  {
>  	dm_eventset_t	evmask;
>  	dm_region_t	region;
> -	xfs_inode_t	*ip;
> +	xfs_inode_t	*ip = XFS_I(inode);
>  	u_int		elem;
> -	bhv_vnode_t	*vp = vn_from_inode(inode);
>  
>  	/* Returns negative errors to DMAPI */
>  
>  	if (right < DM_RIGHT_SHARED)
>  		return(-EACCES);
>  
> -	ip = xfs_vtoi(vp);
>  	evmask = ip->i_d.di_dmevmask;	/* read the mask "atomically" */
>  
>  	/* Get the file's current managed region flags out of the
> @@ -2340,9 +2338,9 @@ xfs_dm_getall_inherit(
>  
>  /* Initialize location pointer for subsequent dm_get_dirattrs,
>     dm_get_bulkattr, and dm_get_bulkall calls.  The same initialization must
> -   work for vnode-based routines (dm_get_dirattrs) and filesystem-based
> +   work for inode-based routines (dm_get_dirattrs) and filesystem-based
>     routines (dm_get_bulkattr and dm_get_bulkall).  Filesystem-based functions
> -   call this routine using the filesystem's root vnode.
> +   call this routine using the filesystem's root inode.
>  */
>  
>  /* ARGSUSED */
> @@ -2444,12 +2442,11 @@ xfs_dm_probe_hole(
>  {
>  	dm_off_t	roff;
>  	dm_size_t	rlen;
> -	xfs_inode_t	*ip;
> +	xfs_inode_t	*ip = XFS_I(inode);
>  	xfs_mount_t	*mp;
>  	uint		lock_flags;
>  	xfs_fsize_t	realsize;
>  	dm_size_t	align;
> -	bhv_vnode_t	*vp = vn_from_inode(inode);
>  	int		error;
>  
>  	/* Returns negative errors to DMAPI */
> @@ -2457,7 +2454,6 @@ xfs_dm_probe_hole(
>  	if (right < DM_RIGHT_SHARED)
>  		return -EACCES;
>  
> -	ip = xfs_vtoi(vp);
>  	if ((ip->i_d.di_mode & S_IFMT) != S_IFREG)
>  		return -EINVAL;
>  
> @@ -2497,11 +2493,10 @@ xfs_dm_punch_hole(
>  {
>  	xfs_flock64_t	bf;
>  	int		error = 0;
> -	xfs_inode_t	*ip;
> +	xfs_inode_t	*ip = XFS_I(inode);
>  	xfs_mount_t	*mp;
>  	dm_size_t	align;
>  	xfs_fsize_t	realsize;
> -	bhv_vnode_t	*vp = vn_from_inode(inode);
>  	dm_off_t	roff;
>  	dm_size_t	rlen;
>  
> @@ -2519,7 +2514,6 @@ xfs_dm_punch_hole(
>  	if (error)
>  		return -EBUSY;
>  
> -	ip = xfs_vtoi(vp);
>  	mp = ip->i_mount;
>  
>  	down_rw_sems(inode, DM_SEM_FLAG_WR);
> @@ -2617,14 +2611,12 @@ xfs_dm_read_invis_rvp(
>  	void		__user *bufp,
>  	int		*rvp)
>  {
> -	bhv_vnode_t	*vp = vn_from_inode(inode);
> -
>  	/* Returns negative errors to DMAPI */
>  
>  	if (right < DM_RIGHT_SHARED)
>  		return(-EACCES);
>  
> -	return(-xfs_dm_rdwr(vp, 0, FMODE_READ, off, len, bufp, rvp));
> +	return(-xfs_dm_rdwr(inode, 0, FMODE_READ, off, len, bufp, rvp));
>  }
>  
>  
> @@ -2637,9 +2629,8 @@ xfs_dm_release_right(
>  {
>  #ifdef	DEBUG_RIGHTS
>  	char		buffer[sizeof(dm_handle_t) * 2 + 1];
> -	bhv_vnode_t	*vp = vn_from_inode(inode);
>  
> -	if (!xfs_vp_to_hexhandle(vp, type, buffer)) {
> +	if (!xfs_vp_to_hexhandle(inode, type, buffer)) {
>  		printf("dm_release_right: old %d type %d handle %s\n",
>  			right, type, buffer);
>  	} else {
> @@ -2692,9 +2683,8 @@ xfs_dm_request_right(
>  {
>  #ifdef	DEBUG_RIGHTS
>  	char		buffer[sizeof(dm_handle_t) * 2 + 1];
> -	bhv_vnode_t	*vp = vn_from_inode(inode);
>  
> -	if (!xfs_vp_to_hexhandle(vp, type, buffer)) {
> +	if (!xfs_vp_to_hexhandle(inode, type, buffer)) {
>  		printf("dm_request_right: old %d new %d type %d flags 0x%x "
>  			"handle %s\n", right, newright, type, flags, buffer);
>  	} else {
> @@ -2759,15 +2749,14 @@ xfs_dm_set_eventlist(
>  	u_int		maxevent)
>  {
>  	int		error;
> -	bhv_vnode_t	*vp = vn_from_inode(inode);
> -	xfs_inode_t	*ip = xfs_vtoi(vp);
> +	xfs_inode_t	*ip = XFS_I(inode);
>  
>  	/* Returns negative errors to DMAPI */
>  
>  	if (type == DM_FSYS_OBJ) {
>  		error = xfs_dm_fs_set_eventlist(ip->i_mount, right, eventsetp, maxevent);
>  	} else {
> -		error = xfs_dm_f_set_eventlist(vp, ip, right, eventsetp, maxevent);
> +		error = xfs_dm_f_set_eventlist(ip, right, eventsetp, maxevent);
>  	}
>  	return(-error); /* Return negative error to DMAPI */
>  }
> @@ -2787,7 +2776,6 @@ xfs_dm_set_fileattr(
>  	dm_fileattr_t	stat;
>  	bhv_vattr_t	vat;
>  	int		error;
> -	bhv_vnode_t	*vp = vn_from_inode(inode);
>  
>  	/* Returns negative errors to DMAPI */
>  
> @@ -2844,7 +2832,7 @@ xfs_dm_set_fileattr(
>  
>  	error = xfs_setattr(XFS_I(inode), &vat, ATTR_DMI, NULL);
>  	if (!error)
> -		vn_revalidate(vp);	/* update Linux inode flags */
> +		vn_revalidate(vn_from_inode(inode));	/* update Linux inode flags */
>  	return(-error); /* Return negative error to DMAPI */
>  }
>  
> @@ -2869,7 +2857,7 @@ xfs_dm_set_region(
>  	dm_region_t	__user *regbufp,
>  	dm_boolean_t	__user *exactflagp)
>  {
> -	xfs_inode_t	*ip;
> +	xfs_inode_t	*ip = XFS_I(inode);
>  	xfs_trans_t	*tp;
>  	xfs_mount_t	*mp;
>  	dm_region_t	region;
> @@ -2877,7 +2865,6 @@ xfs_dm_set_region(
>  	dm_eventset_t	mr_mask;
>  	int		error;
>  	u_int		exactflag;
> -	bhv_vnode_t	*vp = vn_from_inode(inode);
>  
>  	/* Returns negative errors to DMAPI */
>  
> @@ -2917,9 +2904,7 @@ xfs_dm_set_region(
>  	   bits, add in the new ones, and update the file's mask.
>  	*/
>  
> -	ip = xfs_vtoi(vp);
> -
> -	if (new_mask & prohibited_mr_events(vp)) {
> +	if (new_mask & prohibited_mr_events(inode->i_mapping)) {
>  		/* If the change is simply to remove the READ
>  		 * bit, then that's always okay.  Otherwise, it's busy.
>  		 */
> @@ -2943,7 +2928,7 @@ xfs_dm_set_region(
>  	ip->i_d.di_dmevmask = (ip->i_d.di_dmevmask & ~mr_mask) | new_mask;
>  
>  	xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
> -	VN_HOLD(vp);
> +	igrab(inode);
>  	xfs_trans_commit(tp, 0);
>  
>  	/* Return the proper value for *exactflagp depending upon whether or not
> @@ -3020,9 +3005,8 @@ xfs_dm_upgrade_right(
>  {
>  #ifdef	DEBUG_RIGHTS
>  	char		buffer[sizeof(dm_handle_t) * 2 + 1];
> -	bhv_vnode_t	*vp = vn_from_inode(inode);
>  
> -	if (!xfs_vp_to_hexhandle(vp, type, buffer)) {
> +	if (!xfs_vp_to_hexhandle(inode, type, buffer)) {
>  		printf("dm_upgrade_right: old %d new %d type %d handle %s\n",
>  			right, DM_RIGHT_EXCL, type, buffer);
>  	} else {
> @@ -3045,7 +3029,6 @@ xfs_dm_write_invis_rvp(
>  	int		*rvp)
>  {
>  	int		fflag = 0;
> -	bhv_vnode_t	*vp = vn_from_inode(inode);
>  
>  	/* Returns negative errors to DMAPI */
>  
> @@ -3054,7 +3037,7 @@ xfs_dm_write_invis_rvp(
>  
>  	if (flags & DM_WRITE_SYNC)
>  		fflag |= O_SYNC;
> -	return(-xfs_dm_rdwr(vp, fflag, FMODE_WRITE, off, len, bufp, rvp));
> +	return(-xfs_dm_rdwr(inode, fflag, FMODE_WRITE, off, len, bufp, rvp));
>  }
>  
>  
>
>   

  reply	other threads:[~2007-09-25  3:51 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-09-23 11:43 [PATCH] cleanup vnode useage in xfs_dm.c Christoph Hellwig
2007-09-25  3:52 ` Vlad Apostolov [this message]
2007-09-25 19:44   ` Christoph Hellwig
     [not found]     ` <46F9B766.8070808@sgi.com>
2007-09-26  8:13       ` Christoph Hellwig

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=46F88602.4040104@sgi.com \
    --to=vapo@sgi.com \
    --cc=hch@lst.de \
    --cc=xfs@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.