Re: [PATCH 6/6] udf: BKL ioctl pushdown

From: Jan Kara
Date: Wed May 05 2010 - 10:39:43 EST


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@xxxxxxxxxx
> ---
> 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@xxxxxxx>
SUSE Labs, CR
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/