From: Jan Kara <jack@suse.cz> To: Al Viro <viro@ZenIV.linux.org.uk> Cc: linux-fsdevel@vger.kernel.org, xfs@oss.sgi.com, ceph-devel@vger.kernel.org, Miklos Szeredi <miklos@szeredi.hu>, Jan Kara <jack@suse.cz> Subject: [PATCH 2/5] ceph: Propagate dentry down to inode_change_ok() Date: Thu, 26 May 2016 18:19:57 +0200 [thread overview] Message-ID: <1464279600-13009-3-git-send-email-jack@suse.cz> (raw) In-Reply-To: <1464279600-13009-1-git-send-email-jack@suse.cz> To avoid clearing of capabilities or security related extended attributes too early, inode_change_ok() will need to take dentry instead of inode. ceph_setattr() has the dentry easily available but __ceph_setattr() is also called from ceph_set_acl() where dentry is not easily available. Luckily that call path does not need inode_change_ok() to be called anyway. So reorganize functions a bit so that inode_change_ok() is called only from paths where dentry is available. Signed-off-by: Jan Kara <jack@suse.cz> --- fs/ceph/acl.c | 5 +++++ fs/ceph/inode.c | 19 +++++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c index 013151d50069..a2cedfde75eb 100644 --- a/fs/ceph/acl.c +++ b/fs/ceph/acl.c @@ -127,6 +127,11 @@ int ceph_set_acl(struct inode *inode, struct posix_acl *acl, int type) goto out_free; } + if (ceph_snap(inode) != CEPH_NOSNAP) { + ret = -EROFS; + goto out_free; + } + if (new_mode != old_mode) { newattrs.ia_mode = new_mode; newattrs.ia_valid = ATTR_MODE; diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index e669cfa9d793..29873cbd6b2b 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -1791,13 +1791,6 @@ int __ceph_setattr(struct inode *inode, struct iattr *attr) int inode_dirty_flags = 0; bool lock_snap_rwsem = false; - if (ceph_snap(inode) != CEPH_NOSNAP) - return -EROFS; - - err = inode_change_ok(inode, attr); - if (err != 0) - return err; - prealloc_cf = ceph_alloc_cap_flush(); if (!prealloc_cf) return -ENOMEM; @@ -2011,7 +2004,17 @@ out_put: */ int ceph_setattr(struct dentry *dentry, struct iattr *attr) { - return __ceph_setattr(d_inode(dentry), attr); + struct inode *inode = d_inode(dentry); + int err; + + if (ceph_snap(inode) != CEPH_NOSNAP) + return -EROFS; + + err = inode_change_ok(inode, attr); + if (err != 0) + return err; + + return __ceph_setattr(inode, attr); } /* -- 2.6.6
WARNING: multiple messages have this Message-ID (diff)
From: Jan Kara <jack@suse.cz> To: Al Viro <viro@ZenIV.linux.org.uk> Cc: linux-fsdevel@vger.kernel.org, ceph-devel@vger.kernel.org, Miklos Szeredi <miklos@szeredi.hu>, Jan Kara <jack@suse.cz>, xfs@oss.sgi.com Subject: [PATCH 2/5] ceph: Propagate dentry down to inode_change_ok() Date: Thu, 26 May 2016 18:19:57 +0200 [thread overview] Message-ID: <1464279600-13009-3-git-send-email-jack@suse.cz> (raw) In-Reply-To: <1464279600-13009-1-git-send-email-jack@suse.cz> To avoid clearing of capabilities or security related extended attributes too early, inode_change_ok() will need to take dentry instead of inode. ceph_setattr() has the dentry easily available but __ceph_setattr() is also called from ceph_set_acl() where dentry is not easily available. Luckily that call path does not need inode_change_ok() to be called anyway. So reorganize functions a bit so that inode_change_ok() is called only from paths where dentry is available. Signed-off-by: Jan Kara <jack@suse.cz> --- fs/ceph/acl.c | 5 +++++ fs/ceph/inode.c | 19 +++++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/fs/ceph/acl.c b/fs/ceph/acl.c index 013151d50069..a2cedfde75eb 100644 --- a/fs/ceph/acl.c +++ b/fs/ceph/acl.c @@ -127,6 +127,11 @@ int ceph_set_acl(struct inode *inode, struct posix_acl *acl, int type) goto out_free; } + if (ceph_snap(inode) != CEPH_NOSNAP) { + ret = -EROFS; + goto out_free; + } + if (new_mode != old_mode) { newattrs.ia_mode = new_mode; newattrs.ia_valid = ATTR_MODE; diff --git a/fs/ceph/inode.c b/fs/ceph/inode.c index e669cfa9d793..29873cbd6b2b 100644 --- a/fs/ceph/inode.c +++ b/fs/ceph/inode.c @@ -1791,13 +1791,6 @@ int __ceph_setattr(struct inode *inode, struct iattr *attr) int inode_dirty_flags = 0; bool lock_snap_rwsem = false; - if (ceph_snap(inode) != CEPH_NOSNAP) - return -EROFS; - - err = inode_change_ok(inode, attr); - if (err != 0) - return err; - prealloc_cf = ceph_alloc_cap_flush(); if (!prealloc_cf) return -ENOMEM; @@ -2011,7 +2004,17 @@ out_put: */ int ceph_setattr(struct dentry *dentry, struct iattr *attr) { - return __ceph_setattr(d_inode(dentry), attr); + struct inode *inode = d_inode(dentry); + int err; + + if (ceph_snap(inode) != CEPH_NOSNAP) + return -EROFS; + + err = inode_change_ok(inode, attr); + if (err != 0) + return err; + + return __ceph_setattr(inode, attr); } /* -- 2.6.6 _______________________________________________ xfs mailing list xfs@oss.sgi.com http://oss.sgi.com/mailman/listinfo/xfs
next prev parent reply other threads:[~2016-05-26 16:20 UTC|newest] Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top 2016-05-26 16:19 [PATCH 0/5] fs: Avoid premature clearing of file capabilities Jan Kara 2016-05-26 16:19 ` Jan Kara 2016-05-26 16:19 ` [PATCH 1/5] xfs: Propagate dentry down to inode_change_ok() Jan Kara 2016-05-26 16:19 ` Jan Kara 2016-05-26 21:53 ` Dave Chinner 2016-05-26 21:53 ` Dave Chinner 2016-05-27 16:12 ` Jan Kara 2016-05-27 16:12 ` Jan Kara 2016-05-27 16:12 ` Jan Kara 2016-05-29 22:36 ` Dave Chinner 2016-05-29 22:36 ` Dave Chinner 2016-05-26 16:19 ` Jan Kara [this message] 2016-05-26 16:19 ` [PATCH 2/5] ceph: " Jan Kara 2016-05-26 16:19 ` [PATCH 3/5] fuse: " Jan Kara 2016-05-26 16:19 ` Jan Kara 2016-05-26 16:42 ` Miklos Szeredi 2016-05-26 16:42 ` Miklos Szeredi 2016-05-26 16:19 ` [PATCH 4/5] fs: Give dentry to inode_change_ok() instead of inode Jan Kara 2016-05-26 16:19 ` Jan Kara 2016-05-26 16:20 ` [PATCH 5/5] fs: Avoid premature clearing of capabilities Jan Kara 2016-05-26 16:20 ` Jan Kara 2016-08-03 11:28 [PATCH 0/5 v2] fs: Avoid premature clearing of file capabilities Jan Kara 2016-08-03 11:28 ` [PATCH 2/5] ceph: Propagate dentry down to inode_change_ok() Jan Kara 2016-08-03 11:28 ` Jan Kara 2016-09-19 15:30 [PATCH 0/5 v2 RESEND] fs: Avoid premature clearing of file capabilities Jan Kara 2016-09-19 15:30 ` [PATCH 2/5] ceph: Propagate dentry down to inode_change_ok() Jan Kara 2016-09-19 18:57 ` Jeff Layton 2016-09-22 8:50 ` Jan Kara 2016-09-22 8:50 ` Jan Kara 2016-09-22 17:20 ` Jeff Layton 2016-09-26 10:25 ` Jan Kara 2016-09-26 10:25 ` Jan Kara 2016-09-23 7:45 ` Yan, Zheng
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=1464279600-13009-3-git-send-email-jack@suse.cz \ --to=jack@suse.cz \ --cc=ceph-devel@vger.kernel.org \ --cc=linux-fsdevel@vger.kernel.org \ --cc=miklos@szeredi.hu \ --cc=viro@ZenIV.linux.org.uk \ --cc=xfs@oss.sgi.com \ /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 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.