fs/open.c | 25 ++++++++----------------- 1 files changed, 8 insertions(+), 17 deletions(-) diff -puN fs/open.c~utime-on-immutable-file-fix-cleanup fs/open.c --- 25/fs/open.c~utime-on-immutable-file-fix-cleanup 2003-09-27 19:30:16.000000000 -0700 +++ 25-akpm/fs/open.c 2003-09-27 19:34:24.000000000 -0700 @@ -351,13 +351,13 @@ asmlinkage long sys_utime(char __user * if (IS_RDONLY(inode)) goto dput_and_out; + error = -EPERM; + if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) + goto dput_and_out; + /* Don't worry, the checks are done in inode_change_ok() */ newattrs.ia_valid = ATTR_CTIME | ATTR_MTIME | ATTR_ATIME; if (times) { - error = -EPERM; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - goto dput_and_out; - error = get_user(newattrs.ia_atime.tv_sec, ×->actime); newattrs.ia_atime.tv_nsec = 0; if (!error) @@ -368,10 +368,6 @@ asmlinkage long sys_utime(char __user * newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET; } else { - error = -EACCES; - if (IS_IMMUTABLE(inode)) - goto dput_and_out; - if (current->fsuid != inode->i_uid && (error = permission(inode,MAY_WRITE,&nd)) != 0) goto dput_and_out; @@ -408,23 +404,19 @@ long do_utimes(char __user * filename, s if (IS_RDONLY(inode)) goto dput_and_out; + error = -EPERM; + if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) + goto dput_and_out; + /* Don't worry, the checks are done in inode_change_ok() */ newattrs.ia_valid = ATTR_CTIME | ATTR_MTIME | ATTR_ATIME; if (times) { - error = -EPERM; - if (IS_APPEND(inode) || IS_IMMUTABLE(inode)) - goto dput_and_out; - newattrs.ia_atime.tv_sec = times[0].tv_sec; newattrs.ia_atime.tv_nsec = times[0].tv_usec * 1000; newattrs.ia_mtime.tv_sec = times[1].tv_sec; newattrs.ia_mtime.tv_nsec = times[1].tv_usec * 1000; newattrs.ia_valid |= ATTR_ATIME_SET | ATTR_MTIME_SET; } else { - error = -EACCES; - if (IS_IMMUTABLE(inode)) - goto dput_and_out; - if (current->fsuid != inode->i_uid && (error = permission(inode,MAY_WRITE,&nd)) != 0) goto dput_and_out; @@ -447,7 +439,6 @@ asmlinkage long sys_utimes(char __user * return do_utimes(filename, utimes ? times : NULL); } - /* * access() needs to use the real uid/gid, not the effective uid/gid. * We do this by temporarily clearing all FS-related capabilities and _