diff options
| author | Miklos Szeredi <mszeredi@redhat.com> | 2016-09-27 05:03:57 -0400 |
|---|---|---|
| committer | Miklos Szeredi <mszeredi@redhat.com> | 2016-09-27 05:03:57 -0400 |
| commit | e0e0be8a835520e2f7c89f214dfda570922a1b90 (patch) | |
| tree | 42033a89a20c26dc0f19e9119803885b1f7a06c6 | |
| parent | f03b8ad8d38634d13e802165cc15917481b47835 (diff) | |
libfs: support RENAME_NOREPLACE in simple_rename()
This is trivial to do:
- add flags argument to simple_rename()
- check if flags doesn't have any other than RENAME_NOREPLACE
- assign simple_rename() to .rename2 instead of .rename
Filesystems converted:
hugetlbfs, ramfs, bpf.
Debugfs uses simple_rename() to implement debugfs_rename(), which is for
debugfs instances to rename files internally, not for userspace filesystem
access. For this case pass zero flags to simple_rename().
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Acked-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Alexei Starovoitov <ast@kernel.org>
| -rw-r--r-- | fs/debugfs/inode.c | 2 | ||||
| -rw-r--r-- | fs/hugetlbfs/inode.c | 2 | ||||
| -rw-r--r-- | fs/libfs.c | 6 | ||||
| -rw-r--r-- | fs/ramfs/inode.c | 2 | ||||
| -rw-r--r-- | include/linux/fs.h | 3 | ||||
| -rw-r--r-- | kernel/bpf/inode.c | 2 |
6 files changed, 11 insertions, 6 deletions
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c index 72361baf9da7..5ac27c9de669 100644 --- a/fs/debugfs/inode.c +++ b/fs/debugfs/inode.c | |||
| @@ -748,7 +748,7 @@ struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry, | |||
| 748 | old_name = fsnotify_oldname_init(old_dentry->d_name.name); | 748 | old_name = fsnotify_oldname_init(old_dentry->d_name.name); |
| 749 | 749 | ||
| 750 | error = simple_rename(d_inode(old_dir), old_dentry, d_inode(new_dir), | 750 | error = simple_rename(d_inode(old_dir), old_dentry, d_inode(new_dir), |
| 751 | dentry); | 751 | dentry, 0); |
| 752 | if (error) { | 752 | if (error) { |
| 753 | fsnotify_oldname_free(old_name); | 753 | fsnotify_oldname_free(old_name); |
| 754 | goto exit; | 754 | goto exit; |
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 4ea71eba40a5..50cd7475a942 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
| @@ -988,7 +988,7 @@ static const struct inode_operations hugetlbfs_dir_inode_operations = { | |||
| 988 | .mkdir = hugetlbfs_mkdir, | 988 | .mkdir = hugetlbfs_mkdir, |
| 989 | .rmdir = simple_rmdir, | 989 | .rmdir = simple_rmdir, |
| 990 | .mknod = hugetlbfs_mknod, | 990 | .mknod = hugetlbfs_mknod, |
| 991 | .rename = simple_rename, | 991 | .rename2 = simple_rename, |
| 992 | .setattr = hugetlbfs_setattr, | 992 | .setattr = hugetlbfs_setattr, |
| 993 | }; | 993 | }; |
| 994 | 994 | ||
diff --git a/fs/libfs.c b/fs/libfs.c index 74dc8b9e7f53..4758353b2d41 100644 --- a/fs/libfs.c +++ b/fs/libfs.c | |||
| @@ -349,11 +349,15 @@ int simple_rmdir(struct inode *dir, struct dentry *dentry) | |||
| 349 | EXPORT_SYMBOL(simple_rmdir); | 349 | EXPORT_SYMBOL(simple_rmdir); |
| 350 | 350 | ||
| 351 | int simple_rename(struct inode *old_dir, struct dentry *old_dentry, | 351 | int simple_rename(struct inode *old_dir, struct dentry *old_dentry, |
| 352 | struct inode *new_dir, struct dentry *new_dentry) | 352 | struct inode *new_dir, struct dentry *new_dentry, |
| 353 | unsigned int flags) | ||
| 353 | { | 354 | { |
| 354 | struct inode *inode = d_inode(old_dentry); | 355 | struct inode *inode = d_inode(old_dentry); |
| 355 | int they_are_dirs = d_is_dir(old_dentry); | 356 | int they_are_dirs = d_is_dir(old_dentry); |
| 356 | 357 | ||
| 358 | if (flags & ~RENAME_NOREPLACE) | ||
| 359 | return -EINVAL; | ||
| 360 | |||
| 357 | if (!simple_empty(new_dentry)) | 361 | if (!simple_empty(new_dentry)) |
| 358 | return -ENOTEMPTY; | 362 | return -ENOTEMPTY; |
| 359 | 363 | ||
diff --git a/fs/ramfs/inode.c b/fs/ramfs/inode.c index 1ab6e6c2e60e..c2aa068ff974 100644 --- a/fs/ramfs/inode.c +++ b/fs/ramfs/inode.c | |||
| @@ -146,7 +146,7 @@ static const struct inode_operations ramfs_dir_inode_operations = { | |||
| 146 | .mkdir = ramfs_mkdir, | 146 | .mkdir = ramfs_mkdir, |
| 147 | .rmdir = simple_rmdir, | 147 | .rmdir = simple_rmdir, |
| 148 | .mknod = ramfs_mknod, | 148 | .mknod = ramfs_mknod, |
| 149 | .rename = simple_rename, | 149 | .rename2 = simple_rename, |
| 150 | }; | 150 | }; |
| 151 | 151 | ||
| 152 | static const struct super_operations ramfs_ops = { | 152 | static const struct super_operations ramfs_ops = { |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 901e25d495cc..2bd67545fdf8 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -2950,7 +2950,8 @@ extern int simple_open(struct inode *inode, struct file *file); | |||
| 2950 | extern int simple_link(struct dentry *, struct inode *, struct dentry *); | 2950 | extern int simple_link(struct dentry *, struct inode *, struct dentry *); |
| 2951 | extern int simple_unlink(struct inode *, struct dentry *); | 2951 | extern int simple_unlink(struct inode *, struct dentry *); |
| 2952 | extern int simple_rmdir(struct inode *, struct dentry *); | 2952 | extern int simple_rmdir(struct inode *, struct dentry *); |
| 2953 | extern int simple_rename(struct inode *, struct dentry *, struct inode *, struct dentry *); | 2953 | extern int simple_rename(struct inode *, struct dentry *, |
| 2954 | struct inode *, struct dentry *, unsigned int); | ||
| 2954 | extern int noop_fsync(struct file *, loff_t, loff_t, int); | 2955 | extern int noop_fsync(struct file *, loff_t, loff_t, int); |
| 2955 | extern int simple_empty(struct dentry *); | 2956 | extern int simple_empty(struct dentry *); |
| 2956 | extern int simple_readpage(struct file *file, struct page *page); | 2957 | extern int simple_readpage(struct file *file, struct page *page); |
diff --git a/kernel/bpf/inode.c b/kernel/bpf/inode.c index 5967b870a895..c92fd8936d33 100644 --- a/kernel/bpf/inode.c +++ b/kernel/bpf/inode.c | |||
| @@ -189,7 +189,7 @@ static const struct inode_operations bpf_dir_iops = { | |||
| 189 | .mknod = bpf_mkobj, | 189 | .mknod = bpf_mkobj, |
| 190 | .mkdir = bpf_mkdir, | 190 | .mkdir = bpf_mkdir, |
| 191 | .rmdir = simple_rmdir, | 191 | .rmdir = simple_rmdir, |
| 192 | .rename = simple_rename, | 192 | .rename2 = simple_rename, |
| 193 | .link = simple_link, | 193 | .link = simple_link, |
| 194 | .unlink = simple_unlink, | 194 | .unlink = simple_unlink, |
| 195 | }; | 195 | }; |
