Re: [PATCH 2/7] vfs: Introduce the fd closing helper

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Quoting Pavel Emelyanov (xemul@xxxxxxxxxxxxx):
> This is nothing but making is possible to call the sys_close from the kernel.
> 
> Signed-off-by: Pavel Emelyanov <xemul@xxxxxxxxxxxxx>

I see no problems here, thanks.

Acked-by: Serge Hallyn <serge.hallyn@xxxxxxxxxxxxx>

> 
> ---
>  fs/open.c          |   32 ++++++++++++++++++++------------
>  include/linux/fs.h |    1 +
>  2 files changed, 21 insertions(+), 12 deletions(-)
> 
> diff --git a/fs/open.c b/fs/open.c
> index b52cf01..126aa8b 100644
> --- a/fs/open.c
> +++ b/fs/open.c
> @@ -1078,17 +1078,11 @@ int filp_close(struct file *filp, fl_owner_t id)
>  
>  EXPORT_SYMBOL(filp_close);
>  
> -/*
> - * Careful here! We test whether the file pointer is NULL before
> - * releasing the fd. This ensures that one clone task can't release
> - * an fd while another clone is opening it.
> - */
> -SYSCALL_DEFINE1(close, unsigned int, fd)
> +int do_close(unsigned int fd)
>  {
>  	struct file * filp;
>  	struct files_struct *files = current->files;
>  	struct fdtable *fdt;
> -	int retval;
>  
>  	spin_lock(&files->file_lock);
>  	fdt = files_fdtable(files);
> @@ -1101,7 +1095,25 @@ SYSCALL_DEFINE1(close, unsigned int, fd)
>  	FD_CLR(fd, fdt->close_on_exec);
>  	__put_unused_fd(files, fd);
>  	spin_unlock(&files->file_lock);
> -	retval = filp_close(filp, files);
> +
> +	return filp_close(filp, files);
> +
> +out_unlock:
> +	spin_unlock(&files->file_lock);
> +	return -EBADF;
> +}
> +EXPORT_SYMBOL_GPL(do_close);
> +
> +/*
> + * Careful here! We test whether the file pointer is NULL before
> + * releasing the fd. This ensures that one clone task can't release
> + * an fd while another clone is opening it.
> + */
> +SYSCALL_DEFINE1(close, unsigned int, fd)
> +{
> +	int retval;
> +
> +	retval = do_close(fd);
>  
>  	/* can't restart close syscall because file table entry was cleared */
>  	if (unlikely(retval == -ERESTARTSYS ||
> @@ -1111,10 +1123,6 @@ SYSCALL_DEFINE1(close, unsigned int, fd)
>  		retval = -EINTR;
>  
>  	return retval;
> -
> -out_unlock:
> -	spin_unlock(&files->file_lock);
> -	return -EBADF;
>  }
>  EXPORT_SYMBOL(sys_close);
>  
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index cdf9495..77a5d3e 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -1991,6 +1991,7 @@ extern struct file *file_open_root(struct dentry *, struct vfsmount *,
>  extern struct file * dentry_open(struct dentry *, struct vfsmount *, int,
>  				 const struct cred *);
>  extern int filp_close(struct file *, fl_owner_t id);
> +extern int do_close(unsigned int fd);
>  extern char * getname(const char __user *);
>  
>  /* fs/ioctl.c */
> -- 
> 1.5.5.6
> _______________________________________________
> Containers mailing list
> Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx
> https://lists.linux-foundation.org/mailman/listinfo/containers
_______________________________________________
Containers mailing list
Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx
https://lists.linux-foundation.org/mailman/listinfo/containers


[Index of Archives]     [Cgroups]     [Netdev]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite Forum]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux