Skip to content

Commit f03b8ad

Browse files
author
Miklos Szeredi
committed
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 <[email protected]> Acked-by: Boaz Harrosh <[email protected]> Acked-by: Richard Weinberger <[email protected]> Acked-by: Bob Copeland <[email protected]> Acked-by: Jan Kara <[email protected]> Cc: Theodore Ts'o <[email protected]> Cc: Jaegeuk Kim <[email protected]> Cc: OGAWA Hirofumi <[email protected]> Cc: Mikulas Patocka <[email protected]> Cc: David Woodhouse <[email protected]> Cc: Dave Kleikamp <[email protected]> Cc: Ryusuke Konishi <[email protected]> Cc: Christoph Hellwig <[email protected]>
1 parent 9a232de commit f03b8ad

File tree

22 files changed

+123
-42
lines changed

22 files changed

+123
-42
lines changed

fs/affs/affs.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,8 @@ extern int affs_link(struct dentry *olddentry, struct inode *dir,
173173
extern int affs_symlink(struct inode *dir, struct dentry *dentry,
174174
const char *symname);
175175
extern int affs_rename(struct inode *old_dir, struct dentry *old_dentry,
176-
struct inode *new_dir, struct dentry *new_dentry);
176+
struct inode *new_dir, struct dentry *new_dentry,
177+
unsigned int flags);
177178

178179
/* inode.c */
179180

fs/affs/dir.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ const struct inode_operations affs_dir_inode_operations = {
3535
.symlink = affs_symlink,
3636
.mkdir = affs_mkdir,
3737
.rmdir = affs_rmdir,
38-
.rename = affs_rename,
38+
.rename2 = affs_rename,
3939
.setattr = affs_notify_change,
4040
};
4141

fs/affs/namei.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,12 +414,16 @@ affs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
414414

415415
int
416416
affs_rename(struct inode *old_dir, struct dentry *old_dentry,
417-
struct inode *new_dir, struct dentry *new_dentry)
417+
struct inode *new_dir, struct dentry *new_dentry,
418+
unsigned int flags)
418419
{
419420
struct super_block *sb = old_dir->i_sb;
420421
struct buffer_head *bh = NULL;
421422
int retval;
422423

424+
if (flags & ~RENAME_NOREPLACE)
425+
return -EINVAL;
426+
423427
pr_debug("%s(old=%lu,\"%pd\" to new=%lu,\"%pd\")\n", __func__,
424428
old_dir->i_ino, old_dentry, new_dir->i_ino, new_dentry);
425429

fs/bfs/dir.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,14 +207,18 @@ static int bfs_unlink(struct inode *dir, struct dentry *dentry)
207207
}
208208

209209
static int bfs_rename(struct inode *old_dir, struct dentry *old_dentry,
210-
struct inode *new_dir, struct dentry *new_dentry)
210+
struct inode *new_dir, struct dentry *new_dentry,
211+
unsigned int flags)
211212
{
212213
struct inode *old_inode, *new_inode;
213214
struct buffer_head *old_bh, *new_bh;
214215
struct bfs_dirent *old_de, *new_de;
215216
struct bfs_sb_info *info;
216217
int error = -ENOENT;
217218

219+
if (flags & ~RENAME_NOREPLACE)
220+
return -EINVAL;
221+
218222
old_bh = new_bh = NULL;
219223
old_inode = d_inode(old_dentry);
220224
if (S_ISDIR(old_inode->i_mode))
@@ -270,7 +274,7 @@ const struct inode_operations bfs_dir_inops = {
270274
.lookup = bfs_lookup,
271275
.link = bfs_link,
272276
.unlink = bfs_unlink,
273-
.rename = bfs_rename,
277+
.rename2 = bfs_rename,
274278
};
275279

276280
static int bfs_add_entry(struct inode *dir, const unsigned char *name,

fs/exofs/namei.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,8 @@ static int exofs_rmdir(struct inode *dir, struct dentry *dentry)
227227
}
228228

229229
static int exofs_rename(struct inode *old_dir, struct dentry *old_dentry,
230-
struct inode *new_dir, struct dentry *new_dentry)
230+
struct inode *new_dir, struct dentry *new_dentry,
231+
unsigned int flags)
231232
{
232233
struct inode *old_inode = d_inode(old_dentry);
233234
struct inode *new_inode = d_inode(new_dentry);
@@ -237,6 +238,9 @@ static int exofs_rename(struct inode *old_dir, struct dentry *old_dentry,
237238
struct exofs_dir_entry *old_de;
238239
int err = -ENOENT;
239240

241+
if (flags & ~RENAME_NOREPLACE)
242+
return -EINVAL;
243+
240244
old_de = exofs_find_entry(old_dir, old_dentry, &old_page);
241245
if (!old_de)
242246
goto out;
@@ -310,7 +314,7 @@ const struct inode_operations exofs_dir_inode_operations = {
310314
.mkdir = exofs_mkdir,
311315
.rmdir = exofs_rmdir,
312316
.mknod = exofs_mknod,
313-
.rename = exofs_rename,
317+
.rename2 = exofs_rename,
314318
.setattr = exofs_setattr,
315319
};
316320

fs/ext2/namei.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,8 @@ static int ext2_rmdir (struct inode * dir, struct dentry *dentry)
328328
}
329329

330330
static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry,
331-
struct inode * new_dir, struct dentry * new_dentry )
331+
struct inode * new_dir, struct dentry * new_dentry,
332+
unsigned int flags)
332333
{
333334
struct inode * old_inode = d_inode(old_dentry);
334335
struct inode * new_inode = d_inode(new_dentry);
@@ -338,6 +339,9 @@ static int ext2_rename (struct inode * old_dir, struct dentry * old_dentry,
338339
struct ext2_dir_entry_2 * old_de;
339340
int err;
340341

342+
if (flags & ~RENAME_NOREPLACE)
343+
return -EINVAL;
344+
341345
err = dquot_initialize(old_dir);
342346
if (err)
343347
goto out;
@@ -426,7 +430,7 @@ const struct inode_operations ext2_dir_inode_operations = {
426430
.mkdir = ext2_mkdir,
427431
.rmdir = ext2_rmdir,
428432
.mknod = ext2_mknod,
429-
.rename = ext2_rename,
433+
.rename2 = ext2_rename,
430434
#ifdef CONFIG_EXT2_FS_XATTR
431435
.setxattr = generic_setxattr,
432436
.getxattr = generic_getxattr,

fs/fat/namei_msdos.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -596,12 +596,16 @@ static int do_msdos_rename(struct inode *old_dir, unsigned char *old_name,
596596

597597
/***** Rename, a wrapper for rename_same_dir & rename_diff_dir */
598598
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)
600601
{
601602
struct super_block *sb = old_dir->i_sb;
602603
unsigned char old_msdos_name[MSDOS_NAME], new_msdos_name[MSDOS_NAME];
603604
int err, is_hid;
604605

606+
if (flags & ~RENAME_NOREPLACE)
607+
return -EINVAL;
608+
605609
mutex_lock(&MSDOS_SB(sb)->s_lock);
606610

607611
err = msdos_format_name(old_dentry->d_name.name,
@@ -633,7 +637,7 @@ static const struct inode_operations msdos_dir_inode_operations = {
633637
.unlink = msdos_unlink,
634638
.mkdir = msdos_mkdir,
635639
.rmdir = msdos_rmdir,
636-
.rename = msdos_rename,
640+
.rename2 = msdos_rename,
637641
.setattr = fat_setattr,
638642
.getattr = fat_getattr,
639643
};

fs/fat/namei_vfat.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -903,7 +903,8 @@ static int vfat_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
903903
}
904904

905905
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)
907908
{
908909
struct buffer_head *dotdot_bh;
909910
struct msdos_dir_entry *dotdot_de;
@@ -914,6 +915,9 @@ static int vfat_rename(struct inode *old_dir, struct dentry *old_dentry,
914915
int err, is_dir, update_dotdot, corrupt = 0;
915916
struct super_block *sb = old_dir->i_sb;
916917

918+
if (flags & ~RENAME_NOREPLACE)
919+
return -EINVAL;
920+
917921
old_sinfo.bh = sinfo.bh = dotdot_bh = NULL;
918922
old_inode = d_inode(old_dentry);
919923
new_inode = d_inode(new_dentry);
@@ -1036,7 +1040,7 @@ static const struct inode_operations vfat_dir_inode_operations = {
10361040
.unlink = vfat_unlink,
10371041
.mkdir = vfat_mkdir,
10381042
.rmdir = vfat_rmdir,
1039-
.rename = vfat_rename,
1043+
.rename2 = vfat_rename,
10401044
.setattr = fat_setattr,
10411045
.getattr = fat_getattr,
10421046
};

fs/hfs/dir.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,10 +286,14 @@ static int hfs_remove(struct inode *dir, struct dentry *dentry)
286286
* XXX: how do you handle must_be dir?
287287
*/
288288
static int hfs_rename(struct inode *old_dir, struct dentry *old_dentry,
289-
struct inode *new_dir, struct dentry *new_dentry)
289+
struct inode *new_dir, struct dentry *new_dentry,
290+
unsigned int flags)
290291
{
291292
int res;
292293

294+
if (flags & ~RENAME_NOREPLACE)
295+
return -EINVAL;
296+
293297
/* Unlink destination if it already exists */
294298
if (d_really_is_positive(new_dentry)) {
295299
res = hfs_remove(new_dir, new_dentry);
@@ -320,6 +324,6 @@ const struct inode_operations hfs_dir_inode_operations = {
320324
.unlink = hfs_remove,
321325
.mkdir = hfs_mkdir,
322326
.rmdir = hfs_remove,
323-
.rename = hfs_rename,
327+
.rename2 = hfs_rename,
324328
.setattr = hfs_inode_setattr,
325329
};

fs/hfsplus/dir.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -530,10 +530,14 @@ static int hfsplus_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode)
530530
}
531531

532532
static int hfsplus_rename(struct inode *old_dir, struct dentry *old_dentry,
533-
struct inode *new_dir, struct dentry *new_dentry)
533+
struct inode *new_dir, struct dentry *new_dentry,
534+
unsigned int flags)
534535
{
535536
int res;
536537

538+
if (flags & ~RENAME_NOREPLACE)
539+
return -EINVAL;
540+
537541
/* Unlink destination if it already exists */
538542
if (d_really_is_positive(new_dentry)) {
539543
if (d_is_dir(new_dentry))
@@ -561,7 +565,7 @@ const struct inode_operations hfsplus_dir_inode_operations = {
561565
.rmdir = hfsplus_rmdir,
562566
.symlink = hfsplus_symlink,
563567
.mknod = hfsplus_mknod,
564-
.rename = hfsplus_rename,
568+
.rename2 = hfsplus_rename,
565569
.setxattr = generic_setxattr,
566570
.getxattr = generic_getxattr,
567571
.listxattr = hfsplus_listxattr,

0 commit comments

Comments
 (0)