History

init: add an init_chmod helper

Add a simple helper to chmod with a kernel space file name and switch the early init code over to it.

Christoph Hellwig committed 6 years ago

Commit 10977421 parent b8734986 files · +19 −12Browse files

Unified · Split

6 files
  1. fs/init.c +13 −0
  2. fs/internal.h +1 −1
  3. fs/open.c +2 −2
  4. include/linux/init_syscalls.h +1 −0
  5. include/linux/syscalls.h +0 −7
  6. init/initramfs.c +2 −2
fs/init.c+13−0
@@ -96,6 +96,19 @@ int __init init_chown(const char *filename, uid_t user, gid_t group, int flags) · 95 unmodified lines
9696 return error;
9797 }
9898
99+int __init init_chmod(const char *filename, umode_t mode)
100+{
101+ struct path path;
102+ int error;
103+
104+ error = kern_path(filename, LOOKUP_FOLLOW, &path);
105+ if (error)
106+ return error;
107+ error = chmod_common(&path, mode);
108+ path_put(&path);
109+ return error;
110+}
111+
99112 int __init init_unlink(const char *pathname)
100113 {
101114 return do_unlinkat(AT_FDCWD, getname_kernel(pathname));
fs/internal.h+1−1
@@ -131,7 +131,7 @@ extern struct open_how build_open_how(int flags, umode_t mode); · 130 unmodified lines
131131 extern int build_open_flags(const struct open_how *how, struct open_flags *op);
132132
133133 long do_sys_ftruncate(unsigned int fd, loff_t length, int small);
134−int do_fchmodat(int dfd, const char __user *filename, umode_t mode);
134+int chmod_common(const struct path *path, umode_t mode);
135135 int do_fchownat(int dfd, const char __user *filename, uid_t user, gid_t group,
136136 int flag);
137137 int chown_common(const struct path *path, uid_t user, gid_t group);
fs/open.c+2−2
@@ -563,7 +563,7 @@ out: · 562 unmodified lines
563563 return error;
564564 }
565565
566−static int chmod_common(const struct path *path, umode_t mode)
566+int chmod_common(const struct path *path, umode_t mode)
567567 {
568568 struct inode *inode = path->dentry->d_inode;
569569 struct inode *delegated_inode = NULL;
@@ -610,7 +610,7 @@ SYSCALL_DEFINE2(fchmod, unsigned int, fd, umode_t, mode) · 40 unmodified lines
610610 return err;
611611 }
612612
613−int do_fchmodat(int dfd, const char __user *filename, umode_t mode)
613+static int do_fchmodat(int dfd, const char __user *filename, umode_t mode)
614614 {
615615 struct path path;
616616 int error;
include/linux/init_syscalls.h+1−0
@@ -6,5 +6,6 @@ int __init init_umount(const char *name, int flags); · 5 unmodified lines
66 int __init init_chdir(const char *filename);
77 int __init init_chroot(const char *filename);
88 int __init init_chown(const char *filename, uid_t user, gid_t group, int flags);
9+int __init init_chmod(const char *filename, umode_t mode);
910 int __init init_unlink(const char *pathname);
1011 int __init init_rmdir(const char *pathname);
include/linux/syscalls.h+0−7
@@ -1304,13 +1304,6 @@ static inline long ksys_link(const char __user *oldname, · 1303 unmodified lines
13041304 return do_linkat(AT_FDCWD, oldname, AT_FDCWD, newname, 0);
13051305 }
13061306
1307−extern int do_fchmodat(int dfd, const char __user *filename, umode_t mode);
1308−
1309−static inline int ksys_chmod(const char __user *filename, umode_t mode)
1310−{
1311− return do_fchmodat(AT_FDCWD, filename, mode);
1312−}
1313−
13141307 long do_faccessat(int dfd, const char __user *filename, int mode, int flags);
13151308
13161309 static inline long ksys_access(const char __user *filename, int mode)
init/initramfs.c+2−2
@@ -350,14 +350,14 @@ static int __init do_name(void) · 349 unmodified lines
350350 } else if (S_ISDIR(mode)) {
351351 ksys_mkdir(collected, mode);
352352 init_chown(collected, uid, gid, 0);
353− ksys_chmod(collected, mode);
353+ init_chmod(collected, mode);
354354 dir_add(collected, mtime);
355355 } else if (S_ISBLK(mode) || S_ISCHR(mode) ||
356356 S_ISFIFO(mode) || S_ISSOCK(mode)) {
357357 if (maybe_link() == 0) {
358358 ksys_mknod(collected, mode, rdev);
359359 init_chown(collected, uid, gid, 0);
360− ksys_chmod(collected, mode);
360+ init_chmod(collected, mode);
361361 do_utime(collected, mtime);
362362 }
363363 }