Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

vfs: add RENAME_WHITEOUT

This adds a new RENAME_WHITEOUT flag. This flag makes rename() create a
whiteout of source. The whiteout creation is atomic relative to the
rename.

Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>

+7 -2
+6 -2
fs/namei.c
··· 4209 4209 bool should_retry = false; 4210 4210 int error; 4211 4211 4212 - if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE)) 4212 + if (flags & ~(RENAME_NOREPLACE | RENAME_EXCHANGE | RENAME_WHITEOUT)) 4213 4213 return -EINVAL; 4214 4214 4215 - if ((flags & RENAME_NOREPLACE) && (flags & RENAME_EXCHANGE)) 4215 + if ((flags & (RENAME_NOREPLACE | RENAME_WHITEOUT)) && 4216 + (flags & RENAME_EXCHANGE)) 4216 4217 return -EINVAL; 4218 + 4219 + if ((flags & RENAME_WHITEOUT) && !capable(CAP_MKNOD)) 4220 + return -EPERM; 4217 4221 4218 4222 retry: 4219 4223 from = user_path_parent(olddfd, oldname, &oldnd, lookup_flags);
+1
include/uapi/linux/fs.h
··· 37 37 38 38 #define RENAME_NOREPLACE (1 << 0) /* Don't overwrite target */ 39 39 #define RENAME_EXCHANGE (1 << 1) /* Exchange source and dest */ 40 + #define RENAME_WHITEOUT (1 << 2) /* Whiteout source */ 40 41 41 42 struct fstrim_range { 42 43 __u64 start;