* [PATCH] ovl: fix inode in utimes_common on overlayfs. @ 2016-07-29 8:06 zhangaihua1 2016-08-09 3:00 ` retry: " Zhang AiHua 0 siblings, 1 reply; 4+ messages in thread From: zhangaihua1 @ 2016-07-29 8:06 UTC (permalink / raw) To: linux-fsdevel, linux-kernel, linux-unionfs; +Cc: Aihua Zhang From: Aihua Zhang <zhangaihua1@huawei.com> the check IS_IMMUTABLE(inode) is invalid in utimes_commmon, the inode should point to upper rather than merge. the patch also fix the error in LTP(utimensat01). Signed-off-by: Aihua Zhang <zhangaihua1@huawei.com> --- fs/utimes.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/fs/utimes.c b/fs/utimes.c index 85c40f4..1813a62 100644 --- a/fs/utimes.c +++ b/fs/utimes.c @@ -53,6 +53,7 @@ static int utimes_common(struct path *path, struct timespec *times) int error; struct iattr newattrs; struct inode *inode = path->dentry->d_inode; + struct inode *real_inode = d_real(path->dentry)->d_inode; struct inode *delegated_inode = NULL; error = mnt_want_write(path->mnt); @@ -93,7 +94,7 @@ static int utimes_common(struct path *path, struct timespec *times) * inode_change_ok() won't do it. */ error = -EACCES; - if (IS_IMMUTABLE(inode)) + if (IS_IMMUTABLE(real_inode)) goto mnt_drop_write_and_out; if (!inode_owner_or_capable(inode)) { -- 1.7.1 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* retry: [PATCH] ovl: fix inode in utimes_common on overlayfs. 2016-07-29 8:06 [PATCH] ovl: fix inode in utimes_common on overlayfs zhangaihua1 @ 2016-08-09 3:00 ` Zhang AiHua 2016-08-10 8:01 ` Miklos Szeredi 0 siblings, 1 reply; 4+ messages in thread From: Zhang AiHua @ 2016-08-09 3:00 UTC (permalink / raw) To: linux-unionfs -------- 转发的消息 -------- 主题: [PATCH] ovl: fix inode in utimes_common on overlayfs. 日期: Fri, 29 Jul 2016 16:06:19 +0800 发件人: zhangaihua1@huawei.com 收件人: linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-unionfs@vger.kernel.org 抄送: Aihua Zhang <zhangaihua1@huawei.com> From: Aihua Zhang <zhangaihua1@huawei.com> the check IS_IMMUTABLE(inode) is invalid in utimes_commmon, the inode should point to upper rather than merge. the patch also fix the error in LTP(utimensat01). Signed-off-by: Aihua Zhang <zhangaihua1@huawei.com> --- fs/utimes.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/fs/utimes.c b/fs/utimes.c index 85c40f4..1813a62 100644 --- a/fs/utimes.c +++ b/fs/utimes.c @@ -53,6 +53,7 @@ static int utimes_common(struct path *path, struct timespec *times) int error; struct iattr newattrs; struct inode *inode = path->dentry->d_inode; + struct inode *real_inode = d_real(path->dentry)->d_inode; struct inode *delegated_inode = NULL; error = mnt_want_write(path->mnt); @@ -93,7 +94,7 @@ static int utimes_common(struct path *path, struct timespec *times) * inode_change_ok() won't do it. */ error = -EACCES; - if (IS_IMMUTABLE(inode)) + if (IS_IMMUTABLE(real_inode)) goto mnt_drop_write_and_out; if (!inode_owner_or_capable(inode)) { -- 1.7.1 . ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: retry: [PATCH] ovl: fix inode in utimes_common on overlayfs. 2016-08-09 3:00 ` retry: " Zhang AiHua @ 2016-08-10 8:01 ` Miklos Szeredi 2016-08-11 9:13 ` Zhang AiHua 0 siblings, 1 reply; 4+ messages in thread From: Miklos Szeredi @ 2016-08-10 8:01 UTC (permalink / raw) To: Zhang AiHua; +Cc: linux-unionfs On Tue, Aug 09, 2016 at 11:00:03AM +0800, Zhang AiHua wrote: > From: Aihua Zhang <zhangaihua1@huawei.com> > > the check IS_IMMUTABLE(inode) is invalid in utimes_commmon, > the inode should point to upper rather than merge. > > the patch also fix the error in LTP(utimensat01). > > Signed-off-by: Aihua Zhang <zhangaihua1@huawei.com> Can you please try this alternative patch? Thanks, Miklos --- fs/attr.c | 15 +++++++++++++++ fs/utimes.c | 17 +---------------- include/linux/fs.h | 1 + 3 files changed, 17 insertions(+), 16 deletions(-) --- a/fs/attr.c +++ b/fs/attr.c @@ -202,6 +202,21 @@ int notify_change(struct dentry * dentry return -EPERM; } + /* + * If utimes(2) and friends are called with times == NULL (or both + * times are UTIME_NOW), then we need to check for write permission + */ + if (ia_valid & ATTR_TOUCH) { + if (IS_IMMUTABLE(inode)) + return -EPERM; + + if (!inode_owner_or_capable(inode)) { + error = inode_permission(inode, MAY_WRITE); + if (error) + return error; + } + } + if ((ia_valid & ATTR_MODE)) { umode_t amode = attr->ia_mode; /* Flag setting protected by i_mutex */ --- a/fs/utimes.c +++ b/fs/utimes.c @@ -87,21 +87,7 @@ static int utimes_common(struct path *pa */ newattrs.ia_valid |= ATTR_TIMES_SET; } else { - /* - * If times is NULL (or both times are UTIME_NOW), - * then we need to check permissions, because - * inode_change_ok() won't do it. - */ - error = -EPERM; - if (IS_IMMUTABLE(inode)) - goto mnt_drop_write_and_out; - - error = -EACCES; - if (!inode_owner_or_capable(inode)) { - error = inode_permission(inode, MAY_WRITE); - if (error) - goto mnt_drop_write_and_out; - } + newattrs.ia_valid |= ATTR_TOUCH; } retry_deleg: inode_lock(inode); @@ -113,7 +99,6 @@ static int utimes_common(struct path *pa goto retry_deleg; } -mnt_drop_write_and_out: mnt_drop_write(path->mnt); out: return error; --- a/include/linux/fs.h +++ b/include/linux/fs.h @@ -224,6 +224,7 @@ typedef int (dio_iodone_t)(struct kiocb #define ATTR_KILL_PRIV (1 << 14) #define ATTR_OPEN (1 << 15) /* Truncating from open(O_TRUNC) */ #define ATTR_TIMES_SET (1 << 16) +#define ATTR_TOUCH (1 << 17) /* * Whiteout is represented by a char device. The following constants define the ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: retry: [PATCH] ovl: fix inode in utimes_common on overlayfs. 2016-08-10 8:01 ` Miklos Szeredi @ 2016-08-11 9:13 ` Zhang AiHua 0 siblings, 0 replies; 4+ messages in thread From: Zhang AiHua @ 2016-08-11 9:13 UTC (permalink / raw) To: Miklos Szeredi, linux-unionfs Hi, I have tested this patch, it's ok and looks better, thanks. --AiHua 在 2016/8/10 16:01, Miklos Szeredi 写道: > On Tue, Aug 09, 2016 at 11:00:03AM +0800, Zhang AiHua wrote: > >> From: Aihua Zhang <zhangaihua1@huawei.com> >> >> the check IS_IMMUTABLE(inode) is invalid in utimes_commmon, >> the inode should point to upper rather than merge. >> >> the patch also fix the error in LTP(utimensat01). >> >> Signed-off-by: Aihua Zhang <zhangaihua1@huawei.com> > > Can you please try this alternative patch? > > Thanks, > Miklos > > --- > fs/attr.c | 15 +++++++++++++++ > fs/utimes.c | 17 +---------------- > include/linux/fs.h | 1 + > 3 files changed, 17 insertions(+), 16 deletions(-) > > --- a/fs/attr.c > +++ b/fs/attr.c > @@ -202,6 +202,21 @@ int notify_change(struct dentry * dentry > return -EPERM; > } > > + /* > + * If utimes(2) and friends are called with times == NULL (or both > + * times are UTIME_NOW), then we need to check for write permission > + */ > + if (ia_valid & ATTR_TOUCH) { > + if (IS_IMMUTABLE(inode)) > + return -EPERM; > + > + if (!inode_owner_or_capable(inode)) { > + error = inode_permission(inode, MAY_WRITE); > + if (error) > + return error; > + } > + } > + > if ((ia_valid & ATTR_MODE)) { > umode_t amode = attr->ia_mode; > /* Flag setting protected by i_mutex */ > --- a/fs/utimes.c > +++ b/fs/utimes.c > @@ -87,21 +87,7 @@ static int utimes_common(struct path *pa > */ > newattrs.ia_valid |= ATTR_TIMES_SET; > } else { > - /* > - * If times is NULL (or both times are UTIME_NOW), > - * then we need to check permissions, because > - * inode_change_ok() won't do it. > - */ > - error = -EPERM; > - if (IS_IMMUTABLE(inode)) > - goto mnt_drop_write_and_out; > - > - error = -EACCES; > - if (!inode_owner_or_capable(inode)) { > - error = inode_permission(inode, MAY_WRITE); > - if (error) > - goto mnt_drop_write_and_out; > - } > + newattrs.ia_valid |= ATTR_TOUCH; > } > retry_deleg: > inode_lock(inode); > @@ -113,7 +99,6 @@ static int utimes_common(struct path *pa > goto retry_deleg; > } > > -mnt_drop_write_and_out: > mnt_drop_write(path->mnt); > out: > return error; > --- a/include/linux/fs.h > +++ b/include/linux/fs.h > @@ -224,6 +224,7 @@ typedef int (dio_iodone_t)(struct kiocb > #define ATTR_KILL_PRIV (1 << 14) > #define ATTR_OPEN (1 << 15) /* Truncating from open(O_TRUNC) */ > #define ATTR_TIMES_SET (1 << 16) > +#define ATTR_TOUCH (1 << 17) > > /* > * Whiteout is represented by a char device. The following constants define the > > . > ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2016-08-11 9:16 UTC | newest] Thread overview: 4+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2016-07-29 8:06 [PATCH] ovl: fix inode in utimes_common on overlayfs zhangaihua1 2016-08-09 3:00 ` retry: " Zhang AiHua 2016-08-10 8:01 ` Miklos Szeredi 2016-08-11 9:13 ` Zhang AiHua
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).