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 | f03b8ad8d38634d13e802165cc15917481b47835 (patch) | |
| tree | 4dc9c060684f242d1e6c07d28d1ff625db63fd6c /fs/fat | |
| parent | 9a232de4999666b2e8ea6775b2b0e3e4feb09b7a (diff) | |
fs: support RENAME_NOREPLACE for local filesystems
This is trivial to do:
- add flags argument to foo_rename()
- check if flags doesn't have any other than RENAME_NOREPLACE
- assign foo_rename() to .rename2 instead of .rename
Filesystems converted:
affs, bfs, exofs, ext2, hfs, hfsplus, jffs2, jfs, logfs, minix, msdos,
nilfs2, omfs, reiserfs, sysvfs, ubifs, udf, ufs, vfat.
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
Acked-by: Boaz Harrosh <ooo@electrozaur.com>
Acked-by: Richard Weinberger <richard@nod.at>
Acked-by: Bob Copeland <me@bobcopeland.com>
Acked-by: Jan Kara <jack@suse.cz>
Cc: Theodore Ts'o <tytso@mit.edu>
Cc: Jaegeuk Kim <jaegeuk@kernel.org>
Cc: OGAWA Hirofumi <hirofumi@mail.parknet.co.jp>
Cc: Mikulas Patocka <mpatocka@redhat.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Dave Kleikamp <shaggy@kernel.org>
Cc: Ryusuke Konishi <konishi.ryusuke@lab.ntt.co.jp>
Cc: Christoph Hellwig <hch@infradead.org>
Diffstat (limited to 'fs/fat')
| -rw-r--r-- | fs/fat/namei_msdos.c | 8 | ||||
| -rw-r--r-- | fs/fat/namei_vfat.c | 8 |
2 files changed, 12 insertions, 4 deletions
diff --git a/fs/fat/namei_msdos.c b/fs/fat/namei_msdos.c index 664655b2c55f..6c814699d5d5 100644 --- a/fs/fat/namei_msdos.c +++ b/fs/fat/namei_msdos.c | |||
| @@ -596,12 +596,16 @@ error_inode: | |||
| 596 | 596 | ||
| 597 | /***** Rename, a wrapper for rename_same_dir & rename_diff_dir */ | 597 | /***** Rename, a wrapper for rename_same_dir & rename_diff_dir */ |
| 598 | static int msdos_rename(struct inode *old_dir, struct dentry *old_dentry, | 598 | static int msdos_rename(struct inode *old_dir, struct dentry *old_dentry, |
| 599 | struct inode *new_dir, struct dentry *new_dentry) | 599 | struct inode *new_dir, struct dentry *new_dentry, |
| 600 | unsigned int flags) | ||
| 600 | { | 601 | { |
| 601 | struct super_block *sb = old_dir->i_sb; | 602 | struct super_block *sb = old_dir->i_sb; |
| 602 | unsigned char old_msdos_name[MSDOS_NAME], new_msdos_name[MSDOS_NAME]; | 603 | unsigned char old_msdos_name[MSDOS_NAME], new_msdos_name[MSDOS_NAME]; |
| 603 | int err, is_hid; | 604 | int err, is_hid; |
| 604 | 605 | ||
| 606 | if (flags & ~RENAME_NOREPLACE) | ||
| 607 | return -EINVAL; | ||
| 608 | |||
| 605 | mutex_lock(&MSDOS_SB(sb)->s_lock); | 609 | mutex_lock(&MSDOS_SB(sb)->s_lock); |
| 606 | 610 | ||
| 607 | err = msdos_format_name(old_dentry->d_name.name, | 611 | err = msdos_format_name(old_dentry->d_name.name, |
| @@ -633,7 +637,7 @@ static const struct inode_operations msdos_dir_inode_operations = { | |||
| 633 | .unlink = msdos_unlink, | 637 | .unlink = msdos_unlink, |
| 634 | .mkdir = msdos_mkdir, | 638 | .mkdir = msdos_mkdir, |
| 635 | .rmdir = msdos_rmdir, | 639 | .rmdir = msdos_rmdir, |
| 636 | .rename = msdos_rename, | 640 | .rename2 = msdos_rename, |
| 637 | .setattr = fat_setattr, | 641 | .setattr = fat_setattr, |
| 638 | .getattr = fat_getattr, | 642 | .getattr = fat_getattr, |
| 639 | }; | 643 | }; |
diff --git a/fs/fat/namei_vfat.c b/fs/fat/namei_vfat.c index 92b7363dafa9..ce8986f3918a 100644 --- a/fs/fat/namei_vfat.c +++ b/fs/fat/namei_vfat.c | |||
| @@ -903,7 +903,8 @@ out: | |||
| 903 | } | 903 | } |
| 904 | 904 | ||
| 905 | static int vfat_rename(struct inode *old_dir, struct dentry *old_dentry, | 905 | static int vfat_rename(struct inode *old_dir, struct dentry *old_dentry, |
| 906 | struct inode *new_dir, struct dentry *new_dentry) | 906 | struct inode *new_dir, struct dentry *new_dentry, |
| 907 | unsigned int flags) | ||
| 907 | { | 908 | { |
| 908 | struct buffer_head *dotdot_bh; | 909 | struct buffer_head *dotdot_bh; |
| 909 | struct msdos_dir_entry *dotdot_de; | 910 | struct msdos_dir_entry *dotdot_de; |
| @@ -914,6 +915,9 @@ static int vfat_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 914 | int err, is_dir, update_dotdot, corrupt = 0; | 915 | int err, is_dir, update_dotdot, corrupt = 0; |
| 915 | struct super_block *sb = old_dir->i_sb; | 916 | struct super_block *sb = old_dir->i_sb; |
| 916 | 917 | ||
| 918 | if (flags & ~RENAME_NOREPLACE) | ||
| 919 | return -EINVAL; | ||
| 920 | |||
| 917 | old_sinfo.bh = sinfo.bh = dotdot_bh = NULL; | 921 | old_sinfo.bh = sinfo.bh = dotdot_bh = NULL; |
| 918 | old_inode = d_inode(old_dentry); | 922 | old_inode = d_inode(old_dentry); |
| 919 | new_inode = d_inode(new_dentry); | 923 | new_inode = d_inode(new_dentry); |
| @@ -1036,7 +1040,7 @@ static const struct inode_operations vfat_dir_inode_operations = { | |||
| 1036 | .unlink = vfat_unlink, | 1040 | .unlink = vfat_unlink, |
| 1037 | .mkdir = vfat_mkdir, | 1041 | .mkdir = vfat_mkdir, |
| 1038 | .rmdir = vfat_rmdir, | 1042 | .rmdir = vfat_rmdir, |
| 1039 | .rename = vfat_rename, | 1043 | .rename2 = vfat_rename, |
| 1040 | .setattr = fat_setattr, | 1044 | .setattr = fat_setattr, |
| 1041 | .getattr = fat_getattr, | 1045 | .getattr = fat_getattr, |
| 1042 | }; | 1046 | }; |
