lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date:	Wed, 5 May 2010 16:39:31 +0200
From:	Jan Kara <jack@...e.cz>
To:	John Kacur <jkacur@...hat.com>
Cc:	lkml <linux-kernel@...r.kernel.org>, Arnd Bergmann <arnd@...db.de>,
	Thomas Gleixner <tglx@...utronix.de>,
	Ingo Molnar <mingo@...e.hu>,
	Frederic Weisbecker <fweisbec@...il.com>,
	Jan Kara <jack@...e.cz>
Subject: Re: [PATCH 6/6] udf: BKL ioctl pushdown

On Wed 05-05-10 15:15:39, John Kacur wrote:
> Convert udf_ioctl to an unlocked_ioctl and push the BKL down into it.
  Thanks. Merged into UDF tree.

								Honza

> 
> Signed-off-by: John Kacur <jkacur@...hat.com
> ---
>  fs/udf/dir.c     |    2 +-
>  fs/udf/file.c    |   43 +++++++++++++++++++++++++++----------------
>  fs/udf/udfdecl.h |    3 +--
>  3 files changed, 29 insertions(+), 19 deletions(-)
> 
> diff --git a/fs/udf/dir.c b/fs/udf/dir.c
> index f0f2a43..3a84455 100644
> --- a/fs/udf/dir.c
> +++ b/fs/udf/dir.c
> @@ -209,6 +209,6 @@ static int udf_readdir(struct file *filp, void *dirent, filldir_t filldir)
>  const struct file_operations udf_dir_operations = {
>  	.read			= generic_read_dir,
>  	.readdir		= udf_readdir,
> -	.ioctl			= udf_ioctl,
> +	.unlocked_ioctl		= udf_ioctl,
>  	.fsync			= simple_fsync,
>  };
> diff --git a/fs/udf/file.c b/fs/udf/file.c
> index 4b6a46c..83092fb 100644
> --- a/fs/udf/file.c
> +++ b/fs/udf/file.c
> @@ -37,6 +37,7 @@
>  #include <linux/quotaops.h>
>  #include <linux/buffer_head.h>
>  #include <linux/aio.h>
> +#include <linux/smp_lock.h>
>  
>  #include "udf_i.h"
>  #include "udf_sb.h"
> @@ -144,50 +145,60 @@ static ssize_t udf_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
>  	return retval;
>  }
>  
> -int udf_ioctl(struct inode *inode, struct file *filp, unsigned int cmd,
> -	      unsigned long arg)
> +long udf_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
>  {
> +	struct inode *inode = filp->f_dentry->d_inode;
>  	long old_block, new_block;
>  	int result = -EINVAL;
>  
> +	lock_kernel();
> +
>  	if (file_permission(filp, MAY_READ) != 0) {
> -		udf_debug("no permission to access inode %lu\n",
> -			  inode->i_ino);
> -		return -EPERM;
> +		udf_debug("no permission to access inode %lu\n", inode->i_ino);
> +		result = -EPERM;
> +		goto out;
>  	}
>  
>  	if (!arg) {
>  		udf_debug("invalid argument to udf_ioctl\n");
> -		return -EINVAL;
> +		result = -EINVAL;
> +		goto out;
>  	}
>  
>  	switch (cmd) {
>  	case UDF_GETVOLIDENT:
>  		if (copy_to_user((char __user *)arg,
>  				 UDF_SB(inode->i_sb)->s_volume_ident, 32))
> -			return -EFAULT;
> +			result = -EFAULT;
>  		else
> -			return 0;
> +			result = 0;
> +		goto out;
>  	case UDF_RELOCATE_BLOCKS:
> -		if (!capable(CAP_SYS_ADMIN))
> -			return -EACCES;
> -		if (get_user(old_block, (long __user *)arg))
> -			return -EFAULT;
> +		if (!capable(CAP_SYS_ADMIN)) {
> +			result = -EACCES;
> +			goto out;
> +		}
> +		if (get_user(old_block, (long __user *)arg)) {
> +			result = -EFAULT;
> +			goto out;
> +		}
>  		result = udf_relocate_blocks(inode->i_sb,
>  						old_block, &new_block);
>  		if (result == 0)
>  			result = put_user(new_block, (long __user *)arg);
> -		return result;
> +		goto out;
>  	case UDF_GETEASIZE:
>  		result = put_user(UDF_I(inode)->i_lenEAttr, (int __user *)arg);
> -		break;
> +		goto out;
>  	case UDF_GETEABLOCK:
>  		result = copy_to_user((char __user *)arg,
>  				      UDF_I(inode)->i_ext.i_data,
>  				      UDF_I(inode)->i_lenEAttr) ? -EFAULT : 0;
> -		break;
> +		goto out;
>  	}
>  
> +out:
> +	unlock_kernel();
>  	return result;
>  }
>  
> @@ -207,7 +218,7 @@ static int udf_release_file(struct inode *inode, struct file *filp)
>  const struct file_operations udf_file_operations = {
>  	.read			= do_sync_read,
>  	.aio_read		= generic_file_aio_read,
> -	.ioctl			= udf_ioctl,
> +	.unlocked_ioctl		= udf_ioctl,
>  	.open			= dquot_file_open,
>  	.mmap			= generic_file_mmap,
>  	.write			= do_sync_write,
> diff --git a/fs/udf/udfdecl.h b/fs/udf/udfdecl.h
> index 702a114..9079ff7 100644
> --- a/fs/udf/udfdecl.h
> +++ b/fs/udf/udfdecl.h
> @@ -130,8 +130,7 @@ extern int udf_write_fi(struct inode *inode, struct fileIdentDesc *,
>  			uint8_t *, uint8_t *);
>  
>  /* file.c */
> -extern int udf_ioctl(struct inode *, struct file *, unsigned int,
> -		     unsigned long);
> +extern long udf_ioctl(struct file *, unsigned int, unsigned long);
>  extern int udf_setattr(struct dentry *dentry, struct iattr *iattr);
>  /* inode.c */
>  extern struct inode *udf_iget(struct super_block *, struct kernel_lb_addr *);
> -- 
> 1.6.6.1
> 
-- 
Jan Kara <jack@...e.cz>
SUSE Labs, CR
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ