linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Jean-Pierre André" <jean-pierre.andre@wanadoo.fr>
To: Miklos Szeredi <miklos@szeredi.hu>
Cc: utcke+fuse@informatik.uni-hamburg.de,
	fuse-devel@lists.sourceforge.net, linux-fsdevel@vger.kernel.org,
	Szabolcs Szakacsits <szaka@ntfs-3g.com>
Subject: Re: [PATCH] fuse: allow umask processing in userspace
Date: Thu, 02 Jul 2009 15:20:11 +0200	[thread overview]
Message-ID: <4A4CB40B.90902@wanadoo.fr> (raw)
In-Reply-To: <E1MJ31Q-00076A-2G@pomaz-ex.szeredi.hu>

Hi Miklos,

On my first try, I did not get much far. I could not compile
the kernel module for kernel-2.6.29.5-191 because of
undefined function current_umask(). This function
is nowhere to be found in the kernel source.

Is this a function (or macro) missing from the proposed
patch or part of a kernel upgrade ? In this latter case,
can it be implemented within the patch ? If not, I would
rather avoid installing a specific kernel for this test
and just use a dummy version returning a fixed value.

Anyway, what would be the minimal kernel version ?

Regards

Jean-Pierre


Miklos Szeredi wrote:
> On Fri, 19 Jun 2009, Jean-Pierre André wrote:
>   
>> On the very related issue of having some way of getting
>> the original permission flags (with umask not applied),
>> in create(), has there been any progress ?
>>     
>
> OK, here's a patch that does this, it applies on top of latest git.
> Could you please give it a test?
>
> Even if you are not using git, you can get a "snapshot" of the git
> tree from www.kernel.org.
>
> I'll follow up with a patch for libfuse (also against latest CVS or
> 2.8.0-pre3)
>
> Thanks,
> Miklos
>
> ---
> This patch lets filesystems handle masking the file mode on creation.
> This is needed if filesystem is using ACLs.
>
>  - The CREATE, MKDIR and MKNOD requests are extended with a "umask"
>    parameter.
>
>  - A new FUSE_DONT_MASK flag is added to the INIT request/reply.  With
>    this the filesystem may request that the create mode is not masked.
>
> CC: Jean-Pierre André <jean-pierre.andre@wanadoo.fr>
> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
> ---
>  fs/fuse/dir.c        |   20 +++++++++++++++++---
>  fs/fuse/fuse_i.h     |    3 +++
>  fs/fuse/inode.c      |    9 ++++++++-
>  include/linux/fuse.h |   20 ++++++++++++++++++--
>  4 files changed, 46 insertions(+), 6 deletions(-)
>
> Index: linux-2.6/fs/fuse/dir.c
> ===================================================================
> --- linux-2.6.orig/fs/fuse/dir.c	2009-06-22 20:37:44.000000000 +0200
> +++ linux-2.6/fs/fuse/dir.c	2009-06-23 10:06:36.000000000 +0200
> @@ -375,7 +375,7 @@ static int fuse_create_open(struct inode
>  	struct fuse_conn *fc = get_fuse_conn(dir);
>  	struct fuse_req *req;
>  	struct fuse_req *forget_req;
> -	struct fuse_open_in inarg;
> +	struct fuse_create_in inarg;
>  	struct fuse_open_out outopen;
>  	struct fuse_entry_out outentry;
>  	struct fuse_file *ff;
> @@ -399,15 +399,20 @@ static int fuse_create_open(struct inode
>  	if (!ff)
>  		goto out_put_request;
>  
> +	if (!fc->dont_mask)
> +		mode &= ~current_umask();
> +
>  	flags &= ~O_NOCTTY;
>  	memset(&inarg, 0, sizeof(inarg));
>  	memset(&outentry, 0, sizeof(outentry));
>  	inarg.flags = flags;
>  	inarg.mode = mode;
> +	inarg.umask = current_umask();
>  	req->in.h.opcode = FUSE_CREATE;
>  	req->in.h.nodeid = get_node_id(dir);
>  	req->in.numargs = 2;
> -	req->in.args[0].size = sizeof(inarg);
> +	req->in.args[0].size = fc->minor < 12 ? sizeof(struct fuse_open_in) :
> +						sizeof(inarg);
>  	req->in.args[0].value = &inarg;
>  	req->in.args[1].size = entry->d_name.len + 1;
>  	req->in.args[1].value = entry->d_name.name;
> @@ -546,12 +551,17 @@ static int fuse_mknod(struct inode *dir,
>  	if (IS_ERR(req))
>  		return PTR_ERR(req);
>  
> +	if (!fc->dont_mask)
> +		mode &= ~current_umask();
> +
>  	memset(&inarg, 0, sizeof(inarg));
>  	inarg.mode = mode;
>  	inarg.rdev = new_encode_dev(rdev);
> +	inarg.umask = current_umask();
>  	req->in.h.opcode = FUSE_MKNOD;
>  	req->in.numargs = 2;
> -	req->in.args[0].size = sizeof(inarg);
> +	req->in.args[0].size = fc->minor < 12 ? FUSE_COMPAT_MKNOD_IN_SIZE :
> +						sizeof(inarg);
>  	req->in.args[0].value = &inarg;
>  	req->in.args[1].size = entry->d_name.len + 1;
>  	req->in.args[1].value = entry->d_name.name;
> @@ -578,8 +588,12 @@ static int fuse_mkdir(struct inode *dir,
>  	if (IS_ERR(req))
>  		return PTR_ERR(req);
>  
> +	if (!fc->dont_mask)
> +		mode &= ~current_umask();
> +
>  	memset(&inarg, 0, sizeof(inarg));
>  	inarg.mode = mode;
> +	inarg.umask = current_umask();
>  	req->in.h.opcode = FUSE_MKDIR;
>  	req->in.numargs = 2;
>  	req->in.args[0].size = sizeof(inarg);
> Index: linux-2.6/fs/fuse/fuse_i.h
> ===================================================================
> --- linux-2.6.orig/fs/fuse/fuse_i.h	2009-06-22 20:37:44.000000000 +0200
> +++ linux-2.6/fs/fuse/fuse_i.h	2009-06-22 20:42:59.000000000 +0200
> @@ -446,6 +446,9 @@ struct fuse_conn {
>  	/** Do multi-page cached writes */
>  	unsigned big_writes:1;
>  
> +	/** Don't apply umask to creation modes */
> +	unsigned dont_mask:1;
> +
>  	/** The number of requests waiting for completion */
>  	atomic_t num_waiting;
>  
> Index: linux-2.6/fs/fuse/inode.c
> ===================================================================
> --- linux-2.6.orig/fs/fuse/inode.c	2009-06-22 20:37:44.000000000 +0200
> +++ linux-2.6/fs/fuse/inode.c	2009-06-22 20:51:10.000000000 +0200
> @@ -725,6 +725,8 @@ static void process_init_reply(struct fu
>  			}
>  			if (arg->flags & FUSE_BIG_WRITES)
>  				fc->big_writes = 1;
> +			if (arg->flags & FUSE_DONT_MASK)
> +				fc->dont_mask = 1;
>  		} else {
>  			ra_pages = fc->max_read / PAGE_CACHE_SIZE;
>  			fc->no_lock = 1;
> @@ -748,7 +750,7 @@ static void fuse_send_init(struct fuse_c
>  	arg->minor = FUSE_KERNEL_MINOR_VERSION;
>  	arg->max_readahead = fc->bdi.ra_pages * PAGE_CACHE_SIZE;
>  	arg->flags |= FUSE_ASYNC_READ | FUSE_POSIX_LOCKS | FUSE_ATOMIC_O_TRUNC |
> -		FUSE_EXPORT_SUPPORT | FUSE_BIG_WRITES;
> +		FUSE_EXPORT_SUPPORT | FUSE_BIG_WRITES | FUSE_DONT_MASK;
>  	req->in.h.opcode = FUSE_INIT;
>  	req->in.numargs = 1;
>  	req->in.args[0].size = sizeof(*arg);
> @@ -864,6 +866,11 @@ static int fuse_fill_super(struct super_
>  	if (err)
>  		goto err_put_conn;
>  
> +	/* Handle umasking inside the fuse code */
> +	if (sb->s_flags & MS_POSIXACL)
> +		fc->dont_mask = 1;
> +	sb->s_flags |= MS_POSIXACL;
> +
>  	fc->release = fuse_free_conn;
>  	fc->flags = d.flags;
>  	fc->user_id = d.user_id;
> Index: linux-2.6/include/linux/fuse.h
> ===================================================================
> --- linux-2.6.orig/include/linux/fuse.h	2009-06-22 20:37:44.000000000 +0200
> +++ linux-2.6/include/linux/fuse.h	2009-06-23 10:05:45.000000000 +0200
> @@ -25,6 +25,9 @@
>   *  - add IOCTL message
>   *  - add unsolicited notification support
>   *  - add POLL message and NOTIFY_POLL notification
> + *
> + * 7.12
> + *  - add umask flag to input argument of open, mknod and mkdir
>   */
>  
>  #ifndef _LINUX_FUSE_H
> @@ -36,7 +39,7 @@
>  #define FUSE_KERNEL_VERSION 7
>  
>  /** Minor version number of this interface */
> -#define FUSE_KERNEL_MINOR_VERSION 11
> +#define FUSE_KERNEL_MINOR_VERSION 12
>  
>  /** The node ID of the root inode */
>  #define FUSE_ROOT_ID 1
> @@ -112,6 +115,7 @@ struct fuse_file_lock {
>   * INIT request/reply flags
>   *
>   * FUSE_EXPORT_SUPPORT: filesystem handles lookups of "." and ".."
> + * FUSE_DONT_MASK: don't apply umask to file mode on create operations
>   */
>  #define FUSE_ASYNC_READ		(1 << 0)
>  #define FUSE_POSIX_LOCKS	(1 << 1)
> @@ -119,6 +123,7 @@ struct fuse_file_lock {
>  #define FUSE_ATOMIC_O_TRUNC	(1 << 3)
>  #define FUSE_EXPORT_SUPPORT	(1 << 4)
>  #define FUSE_BIG_WRITES		(1 << 5)
> +#define FUSE_DONT_MASK		(1 << 6)
>  
>  /**
>   * CUSE INIT request/reply flags
> @@ -262,14 +267,18 @@ struct fuse_attr_out {
>  	struct fuse_attr attr;
>  };
>  
> +#define FUSE_COMPAT_MKNOD_IN_SIZE 8
> +
>  struct fuse_mknod_in {
>  	__u32	mode;
>  	__u32	rdev;
> +	__u32	umask;
> +	__u32	padding;
>  };
>  
>  struct fuse_mkdir_in {
>  	__u32	mode;
> -	__u32	padding;
> +	__u32	umask;
>  };
>  
>  struct fuse_rename_in {
> @@ -301,7 +310,14 @@ struct fuse_setattr_in {
>  
>  struct fuse_open_in {
>  	__u32	flags;
> +	__u32	unused;
> +};
> +
> +struct fuse_create_in {
> +	__u32	flags;
>  	__u32	mode;
> +	__u32	umask;
> +	__u32	padding;
>  };
>  
>  struct fuse_open_out {
>
>   

--
To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

  parent reply	other threads:[~2009-07-02 13:20 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20090618093635.GQ17358@hasgksssven.desy.de>
     [not found] ` <E1MHdOR-0008U9-Vb@pomaz-ex.szeredi.hu>
     [not found]   ` <4A3BC22A.80907@wanadoo.fr>
2009-06-23 10:14     ` [PATCH] fuse: allow umask processing in userspace Miklos Szeredi
2009-06-23 10:23       ` [PATCH] libfuse: " Miklos Szeredi
     [not found]       ` <E1MJ31Q-00076A-2G-8f8m9JG5TPIdUIPVzhDTVZP2KDSNp7ea@public.gmane.org>
2009-06-24 16:14         ` [PATCH] fuse: " Jean-Pierre ANDRE
2009-07-02 13:20       ` Jean-Pierre André [this message]
2009-07-03  9:23         ` Miklos Szeredi
2009-07-03  7:50       ` Jean-Pierre André
2009-07-04 14:51       ` Jean-Pierre André
2009-07-06 11:52         ` Miklos Szeredi
2009-07-06 18:52           ` Jean-Pierre André

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=4A4CB40B.90902@wanadoo.fr \
    --to=jean-pierre.andre@wanadoo.fr \
    --cc=fuse-devel@lists.sourceforge.net \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=miklos@szeredi.hu \
    --cc=szaka@ntfs-3g.com \
    --cc=utcke+fuse@informatik.uni-hamburg.de \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).