LKML Archive on lore.kernel.org help / color / mirror / Atom feed
From: Dave Hansen <haveblue@us.ibm.com> To: akpm@osdl.org Cc: linux-kernel@vger.kernel.org, miklos@szeredi.hu, hch@infradead.org, Dave Hansen <haveblue@us.ibm.com> Subject: [PATCH 02/27] make open_namei() return a filp Date: Thu, 01 Nov 2007 16:08:28 -0700 [thread overview] Message-ID: <20071101230828.B1162D60@kernel> (raw) In-Reply-To: <20071101230826.9A4F6E00@kernel> open_namei() will, in the future, need to take mount write counts over its creation and truncation (via may_open()) operations. It needs to keep these write counts until any potential filp that is created gets __fput()'d. This gets complicated in the error handling and becomes very murky as to how far open_namei() actually got, and whether or not that mount write count was taken. Creating the filps inside of open_namei() lets us shift the write count to be taken and released along with the filp. We can hold a temporary write count during those creation and truncation operations, then release them once the write for the filp has been established. Any caller who gets a 'struct file' back must consider that filp instantiated and fput() it normally. The callers no longer have to worry about ever manually releasing a mnt write count. Signed-off-by: Dave Hansen <haveblue@us.ibm.com> --- linux-2.6.git-dave/fs/namei.c | 16 ++++++++-------- linux-2.6.git-dave/fs/open.c | 7 +------ linux-2.6.git-dave/include/linux/fs.h | 2 +- 3 files changed, 10 insertions(+), 15 deletions(-) diff -puN fs/namei.c~make-open_namei-return-a-filp fs/namei.c --- linux-2.6.git/fs/namei.c~make-open_namei-return-a-filp 2007-11-01 14:46:05.000000000 -0700 +++ linux-2.6.git-dave/fs/namei.c 2007-11-01 14:46:05.000000000 -0700 @@ -1730,8 +1730,8 @@ static inline int sys_open_flags_to_name * system call. See sys_open_flags_to_namei_flags(). * SMP-safe */ -int open_namei(int dfd, const char *pathname, int sys_open_flag, - int mode, struct nameidata *nd) +struct file *open_namei(int dfd, const char *pathname, int sys_open_flag, + int mode, struct nameidata *nd) { int acc_mode, error; struct path path; @@ -1757,7 +1757,7 @@ int open_namei(int dfd, const char *path error = path_lookup_open(dfd, pathname, lookup_flags(flag), nd, flag); if (error) - return error; + return ERR_PTR(error); goto ok; } @@ -1766,7 +1766,7 @@ int open_namei(int dfd, const char *path */ error = path_lookup_create(dfd,pathname,LOOKUP_PARENT,nd,flag,mode); if (error) - return error; + return ERR_PTR(error); /* * We have the parent and last component. First of all, check @@ -1801,7 +1801,7 @@ do_last: error = __open_namei_create(nd, &path, flag, mode); if (error) goto exit; - return 0; + return nameidata_to_filp(nd, sys_open_flag); } /* @@ -1834,7 +1834,7 @@ ok: error = may_open(nd, acc_mode, flag); if (error) goto exit; - return 0; + return nameidata_to_filp(nd, sys_open_flag); exit_dput: dput_path(&path, nd); @@ -1842,7 +1842,7 @@ exit: if (!IS_ERR(nd->intent.open.file)) release_open_intent(nd); path_release(nd); - return error; + return ERR_PTR(error); do_link: error = -ELOOP; @@ -1869,7 +1869,7 @@ do_link: * with "intent.open". */ release_open_intent(nd); - return error; + return ERR_PTR(error); } nd->flags &= ~LOOKUP_PARENT; if (nd->last_type == LAST_BIND) diff -puN fs/open.c~make-open_namei-return-a-filp fs/open.c --- linux-2.6.git/fs/open.c~make-open_namei-return-a-filp 2007-11-01 14:46:05.000000000 -0700 +++ linux-2.6.git-dave/fs/open.c 2007-11-01 14:46:05.000000000 -0700 @@ -803,14 +803,9 @@ cleanup_file: static struct file *do_filp_open(int dfd, const char *filename, int flags, int mode) { - int error; struct nameidata nd; - error = open_namei(dfd, filename, flags, mode, &nd); - if (!error) - return nameidata_to_filp(&nd, flags); - - return ERR_PTR(error); + return open_namei(dfd, filename, flags, mode, &nd); } struct file *filp_open(const char *filename, int flags, int mode) diff -puN include/linux/fs.h~make-open_namei-return-a-filp include/linux/fs.h --- linux-2.6.git/include/linux/fs.h~make-open_namei-return-a-filp 2007-11-01 14:46:05.000000000 -0700 +++ linux-2.6.git-dave/include/linux/fs.h 2007-11-01 14:46:05.000000000 -0700 @@ -1714,7 +1714,7 @@ extern struct file *create_read_pipe(str extern struct file *create_write_pipe(void); extern void free_write_pipe(struct file *); -extern int open_namei(int dfd, const char *, int, int, struct nameidata *); +extern struct file *open_namei(int dfd, const char *, int, int, struct nameidata *); extern int may_open(struct nameidata *, int, int); extern int kernel_read(struct file *, unsigned long, char *, unsigned long); _
next prev parent reply other threads:[~2007-11-01 23:08 UTC|newest] Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top 2007-11-01 23:08 [PATCH 00/27] Read-only bind mounts (-mm resend) Dave Hansen 2007-11-01 23:08 ` [PATCH 01/27] do namei_flags calculation inside open_namei() Dave Hansen 2007-11-01 23:08 ` Dave Hansen [this message] 2007-11-01 23:08 ` [PATCH 03/27] kill do_filp_open() Dave Hansen 2007-11-01 23:08 ` [PATCH 04/27] kill filp_open() Dave Hansen 2008-01-16 8:52 ` Andrew Morton 2008-01-16 17:04 ` Dave Hansen 2008-01-16 17:10 ` Christoph Hellwig 2008-01-16 17:41 ` Dave Hansen 2008-01-16 17:47 ` Christoph Hellwig 2008-01-16 17:12 ` Bryn M. Reeves 2007-11-01 23:08 ` [PATCH 05/27] rename open_namei() to open_pathname() Dave Hansen 2007-11-26 14:33 ` Christoph Hellwig 2007-11-01 23:08 ` [PATCH 06/27] r-o-bind-mounts-stub-functions Dave Hansen 2007-11-01 23:08 ` [PATCH 07/27] r-o-bind-mounts-do_rmdir-elevate-write-count Dave Hansen 2007-11-01 23:08 ` [PATCH 08/27] r-o-bind-mounts-elevate-mnt-writers-for-callers-of-vfs_mkdir Dave Hansen 2007-11-01 23:08 ` [PATCH 09/27] r-o-bind-mounts-elevate-mnt-writers-for-vfs_unlink-callers Dave Hansen 2007-11-01 23:08 ` [PATCH 10/27] r-o-bind-mounts-elevate-mount-count-for-extended-attributes Dave Hansen 2007-11-01 23:08 ` [PATCH 11/27] r-o-bind-mounts-elevate-write-count-during-entire-ncp_ioctl Dave Hansen 2007-11-01 23:08 ` [PATCH 12/27] r-o-bind-mounts-elevate-write-count-for-do_sys_utime-and-touch_atime Dave Hansen 2007-11-01 23:08 ` [PATCH 13/27] r-o-bind-mounts-elevate-write-count-for-do_utimes Dave Hansen 2007-11-01 23:08 ` [PATCH 14/27] r-o-bind-mounts-elevate-write-count-for-file_update_time Dave Hansen 2007-11-01 23:08 ` [PATCH 15/27] r-o-bind-mounts-elevate-write-count-for-link-and-symlink-calls Dave Hansen 2007-11-01 23:08 ` [PATCH 16/27] r-o-bind-mounts-elevate-write-count-for-some-ioctls Dave Hansen 2007-11-05 23:23 ` Andrew Morton 2007-11-06 9:01 ` Jan Kara 2007-11-06 9:12 ` Andrew Morton 2007-11-01 23:08 ` [PATCH 17/27] r-o-bind-mounts-elevate-write-count-opend-files Dave Hansen 2007-11-01 23:08 ` [PATCH 18/27] r-o-bind-mounts-elevate-write-count-over-calls-to-vfs_rename Dave Hansen 2007-11-01 23:08 ` [PATCH 19/27] r-o-bind-mounts-elevate-writer-count-for-chown-and-friends Dave Hansen 2007-11-01 23:08 ` [PATCH 20/27] r-o-bind-mounts-elevate-writer-count-for-do_sys_truncate Dave Hansen 2007-11-01 23:08 ` [PATCH 21/27] r-o-bind-mounts-make-access-use-mnt-check Dave Hansen 2007-11-01 23:08 ` [PATCH 22/27] r-o-bind-mounts-nfs-check-mnt-instead-of-superblock-directly Dave Hansen 2007-11-01 23:08 ` [PATCH 23/27] r-o-bind-mounts-sys_mknodat-elevate-write-count-for-vfs_mknod-create Dave Hansen 2007-11-01 23:08 ` [PATCH 24/27] r-o-bind-mounts-track-number-of-mount-writers Dave Hansen 2007-11-01 23:09 ` [PATCH 25/27] r-o-bind-mounts-track-number-of-mount-writers-make-lockdep-happy-with-r-o-bind-mounts Dave Hansen 2007-11-05 23:35 ` Andrew Morton 2007-11-01 23:09 ` [PATCH 26/27] r-o-bind-mounts-honor-r-w-changes-at-do_remount-time Dave Hansen 2007-11-01 23:09 ` [PATCH 27/27] keep track of mnt_writer state of struct file Dave Hansen
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=20071101230828.B1162D60@kernel \ --to=haveblue@us.ibm.com \ --cc=akpm@osdl.org \ --cc=hch@infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=miklos@szeredi.hu \ /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: linkBe 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).