aboutsummaryrefslogtreecommitdiffstats
path: root/fs/fat
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@redhat.com>2016-09-27 05:03:57 -0400
committerMiklos Szeredi <mszeredi@redhat.com>2016-09-27 05:03:57 -0400
commitf03b8ad8d38634d13e802165cc15917481b47835 (patch)
tree4dc9c060684f242d1e6c07d28d1ff625db63fd6c /fs/fat
parent9a232de4999666b2e8ea6775b2b0e3e4feb09b7a (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.c8
-rw-r--r--fs/fat/namei_vfat.c8
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 */
598static int msdos_rename(struct inode *old_dir, struct dentry *old_dentry, 598static 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
905static int vfat_rename(struct inode *old_dir, struct dentry *old_dentry, 905static 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};