From: "J. Bruce Fields" <bfields@fieldses.org>
To: Miklos Szeredi <miklos@szeredi.hu>
Cc: viro@ZenIV.linux.org.uk, linux-fsdevel@vger.kernel.org,
linux-kernel@vger.kernel.org, hch@infradead.org,
torvalds@linux-foundation.org, akpm@linux-foundation.org,
apw@canonical.com, nbd@openwrt.org, neilb@suse.de,
hramrach@centrum.cz, jordipujolp@gmail.com,
ezk@fsl.cs.sunysb.edu, ricwheeler@gmail.com, dhowells@redhat.com,
hpj@urpla.net, sedat.dilek@googlemail.com, penberg@kernel.org,
goran.cetusic@gmail.com, romain@orebokech.com, mszeredi@suse.cz
Subject: Re: [PATCH 01/13] vfs: add i_op->open()
Date: Wed, 15 Aug 2012 13:21:50 -0400 [thread overview]
Message-ID: <20120815172150.GA25062@fieldses.org> (raw)
In-Reply-To: <1345045700-9062-2-git-send-email-miklos@szeredi.hu>
On Wed, Aug 15, 2012 at 05:48:08PM +0200, Miklos Szeredi wrote:
> From: Miklos Szeredi <mszeredi@suse.cz>
>
> Add a new inode operation i_op->open(). This is for stacked
Shouldn't that "->open()" be "->dentry_open()" ?
--b.
> filesystems that want to return a struct file from a different
> filesystem.
>
> Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
> ---
> Documentation/filesystems/Locking | 2 ++
> Documentation/filesystems/vfs.txt | 7 +++++++
> fs/namei.c | 9 ++++++---
> fs/open.c | 23 +++++++++++++++++++++--
> include/linux/fs.h | 2 ++
> 5 files changed, 38 insertions(+), 5 deletions(-)
>
> diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking
> index 0f103e3..d222b6a 100644
> --- a/Documentation/filesystems/Locking
> +++ b/Documentation/filesystems/Locking
> @@ -64,6 +64,7 @@ prototypes:
> int (*atomic_open)(struct inode *, struct dentry *,
> struct file *, unsigned open_flag,
> umode_t create_mode, int *opened);
> + int (*dentry_open)(struct dentry *, struct file *, const struct cred *);
>
> locking rules:
> all may block
> @@ -92,6 +93,7 @@ removexattr: yes
> fiemap: no
> update_time: no
> atomic_open: yes
> +open: no
>
> Additionally, ->rmdir(), ->unlink() and ->rename() have ->i_mutex on
> victim.
> diff --git a/Documentation/filesystems/vfs.txt b/Documentation/filesystems/vfs.txt
> index 065aa2d..f53d93c 100644
> --- a/Documentation/filesystems/vfs.txt
> +++ b/Documentation/filesystems/vfs.txt
> @@ -367,6 +367,7 @@ struct inode_operations {
> int (*atomic_open)(struct inode *, struct dentry *,
> struct file *, unsigned open_flag,
> umode_t create_mode, int *opened);
> + int (*dentry_open)(struct dentry *, struct file *, const struct cred *);
> };
>
> Again, all methods are called without any locks being held, unless
> @@ -696,6 +697,12 @@ struct address_space_operations {
> but instead uses bmap to find out where the blocks in the file
> are and uses those addresses directly.
>
> + dentry_open: this is an alternative to f_op->open(), the difference is that
> + this method may open a file not necessarily originating from the same
> + filesystem as the one i_op->open() was called on. It may be
> + useful for stacking filesystems which want to allow native I/O directly
> + on underlying files.
> +
>
> invalidatepage: If a page has PagePrivate set, then invalidatepage
> will be called when part or all of the page is to be removed
> diff --git a/fs/namei.c b/fs/namei.c
> index 1b46439..ac2526d 100644
> --- a/fs/namei.c
> +++ b/fs/namei.c
> @@ -2816,9 +2816,12 @@ finish_open_created:
> error = may_open(&nd->path, acc_mode, open_flag);
> if (error)
> goto out;
> - file->f_path.mnt = nd->path.mnt;
> - error = finish_open(file, nd->path.dentry, NULL, opened);
> - if (error) {
> +
> + BUG_ON(*opened & FILE_OPENED); /* once it's opened, it's opened */
> + error = vfs_open(&nd->path, file, current_cred());
> + if (!error) {
> + *opened |= FILE_OPENED;
> + } else {
> if (error == -EOPENSTALE)
> goto stale_open;
> goto out;
> diff --git a/fs/open.c b/fs/open.c
> index f3d96e7..c5a8cac 100644
> --- a/fs/open.c
> +++ b/fs/open.c
> @@ -787,8 +787,7 @@ struct file *dentry_open(const struct path *path, int flags,
> return ERR_PTR(error);
>
> f->f_flags = flags;
> - f->f_path = *path;
> - error = do_dentry_open(f, NULL, cred);
> + error = vfs_open(path, f, cred);
> if (!error) {
> error = open_check_o_direct(f);
> if (error) {
> @@ -803,6 +802,26 @@ struct file *dentry_open(const struct path *path, int flags,
> }
> EXPORT_SYMBOL(dentry_open);
>
> +/**
> + * vfs_open - open the file at the given path
> + * @path: path to open
> + * @filp: newly allocated file with f_flag initialized
> + * @cred: credentials to use
> + */
> +int vfs_open(const struct path *path, struct file *filp,
> + const struct cred *cred)
> +{
> + struct inode *inode = path->dentry->d_inode;
> +
> + if (inode->i_op->dentry_open)
> + return inode->i_op->dentry_open(path->dentry, filp, cred);
> + else {
> + filp->f_path = *path;
> + return do_dentry_open(filp, NULL, cred);
> + }
> +}
> +EXPORT_SYMBOL(vfs_open);
> +
> static void __put_unused_fd(struct files_struct *files, unsigned int fd)
> {
> struct fdtable *fdt = files_fdtable(files);
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index 38dba16..abc7a53 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -1836,6 +1836,7 @@ struct inode_operations {
> int (*atomic_open)(struct inode *, struct dentry *,
> struct file *, unsigned open_flag,
> umode_t create_mode, int *opened);
> + int (*dentry_open)(struct dentry *, struct file *, const struct cred *);
> } ____cacheline_aligned;
>
> struct seq_file;
> @@ -2201,6 +2202,7 @@ extern long do_sys_open(int dfd, const char __user *filename, int flags,
> extern struct file *filp_open(const char *, int, umode_t);
> extern struct file *file_open_root(struct dentry *, struct vfsmount *,
> const char *, int);
> +extern int vfs_open(const struct path *, struct file *, const struct cred *);
> extern struct file * dentry_open(const struct path *, int, const struct cred *);
> extern int filp_close(struct file *, fl_owner_t id);
> extern char * getname(const char __user *);
> --
> 1.7.7
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
> Please read the FAQ at http://www.tux.org/lkml/
next prev parent reply other threads:[~2012-08-15 17:21 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-15 15:48 [PATCH 00/13] overlay filesystem: request for inclusion (v14) Miklos Szeredi
2012-08-15 15:48 ` [PATCH 01/13] vfs: add i_op->open() Miklos Szeredi
2012-08-15 17:21 ` J. Bruce Fields [this message]
2012-08-15 20:28 ` NeilBrown
2012-08-16 10:10 ` Miklos Szeredi
2012-08-15 15:48 ` [PATCH 02/13] vfs: export do_splice_direct() to modules Miklos Szeredi
2012-08-15 15:48 ` [PATCH 03/13] vfs: introduce clone_private_mount() Miklos Szeredi
2012-08-15 15:48 ` [PATCH 04/13] overlay filesystem Miklos Szeredi
2012-08-16 6:24 ` Eric W. Biederman
2012-08-16 10:25 ` Miklos Szeredi
2012-08-15 15:48 ` [PATCH 05/13] overlayfs: add statfs support Miklos Szeredi
2012-08-17 18:20 ` Ben Hutchings
2012-08-29 22:48 ` Miklos Szeredi
2012-08-30 5:54 ` Ben Hutchings
2012-08-31 12:47 ` J. R. Okajima
2012-08-15 15:48 ` [PATCH 06/13] overlayfs: implement show_options Miklos Szeredi
2012-08-15 15:48 ` [PATCH 07/13] overlay: overlay filesystem documentation Miklos Szeredi
2012-08-15 19:53 ` J. Bruce Fields
2012-08-16 10:09 ` Miklos Szeredi
2012-09-10 1:47 ` Jan Engelhardt
2012-09-10 3:18 ` NeilBrown
2012-08-15 15:48 ` [PATCH 08/13] fs: limit filesystem stacking depth Miklos Szeredi
2012-08-16 8:02 ` Sedat Dilek
2012-08-16 8:30 ` Sedat Dilek
2012-08-16 10:42 ` Miklos Szeredi
2012-08-16 13:24 ` Sedat Dilek
2012-09-03 15:05 ` Miklos Szeredi
2012-08-15 15:48 ` [PATCH 09/13] overlayfs: fix possible leak in ovl_new_inode Miklos Szeredi
2012-08-15 15:48 ` [PATCH 10/13] overlayfs: create new inode in ovl_link Miklos Szeredi
2012-08-15 15:48 ` [PATCH 11/13] vfs: export __inode_permission() to modules Miklos Szeredi
2012-08-15 17:17 ` Sedat Dilek
2012-08-15 15:48 ` [PATCH 12/13] ovl: switch to __inode_permission() Miklos Szeredi
2012-08-15 16:59 ` Casey Schaufler
2012-08-15 17:07 ` Andy Whitcroft
2012-08-15 17:34 ` Casey Schaufler
2012-08-15 15:48 ` [PATCH 13/13] overlayfs: copy up i_uid/i_gid from the underlying inode Miklos Szeredi
2012-08-15 17:14 ` [PATCH 00/13] overlay filesystem: request for inclusion (v14) Sedat Dilek
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=20120815172150.GA25062@fieldses.org \
--to=bfields@fieldses.org \
--cc=akpm@linux-foundation.org \
--cc=apw@canonical.com \
--cc=dhowells@redhat.com \
--cc=ezk@fsl.cs.sunysb.edu \
--cc=goran.cetusic@gmail.com \
--cc=hch@infradead.org \
--cc=hpj@urpla.net \
--cc=hramrach@centrum.cz \
--cc=jordipujolp@gmail.com \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=miklos@szeredi.hu \
--cc=mszeredi@suse.cz \
--cc=nbd@openwrt.org \
--cc=neilb@suse.de \
--cc=penberg@kernel.org \
--cc=ricwheeler@gmail.com \
--cc=romain@orebokech.com \
--cc=sedat.dilek@googlemail.com \
--cc=torvalds@linux-foundation.org \
--cc=viro@ZenIV.linux.org.uk \
/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.