diff options
| -rw-r--r-- | fs/namei.c | 14 | ||||
| -rw-r--r-- | include/linux/fs.h | 11 |
2 files changed, 25 insertions, 0 deletions
diff --git a/fs/namei.c b/fs/namei.c index 77fd536106cb..d20191c0ebf5 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
| @@ -4346,6 +4346,20 @@ SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newna | |||
| 4346 | return sys_renameat2(AT_FDCWD, oldname, AT_FDCWD, newname, 0); | 4346 | return sys_renameat2(AT_FDCWD, oldname, AT_FDCWD, newname, 0); |
| 4347 | } | 4347 | } |
| 4348 | 4348 | ||
| 4349 | int vfs_whiteout(struct inode *dir, struct dentry *dentry) | ||
| 4350 | { | ||
| 4351 | int error = may_create(dir, dentry); | ||
| 4352 | if (error) | ||
| 4353 | return error; | ||
| 4354 | |||
| 4355 | if (!dir->i_op->mknod) | ||
| 4356 | return -EPERM; | ||
| 4357 | |||
| 4358 | return dir->i_op->mknod(dir, dentry, | ||
| 4359 | S_IFCHR | WHITEOUT_MODE, WHITEOUT_DEV); | ||
| 4360 | } | ||
| 4361 | EXPORT_SYMBOL(vfs_whiteout); | ||
| 4362 | |||
| 4349 | int readlink_copy(char __user *buffer, int buflen, const char *link) | 4363 | int readlink_copy(char __user *buffer, int buflen, const char *link) |
| 4350 | { | 4364 | { |
| 4351 | int len = PTR_ERR(link); | 4365 | int len = PTR_ERR(link); |
diff --git a/include/linux/fs.h b/include/linux/fs.h index 55cc0a319baa..69118b3cb917 100644 --- a/include/linux/fs.h +++ b/include/linux/fs.h | |||
| @@ -223,6 +223,13 @@ typedef void (dio_iodone_t)(struct kiocb *iocb, loff_t offset, | |||
| 223 | #define ATTR_TIMES_SET (1 << 16) | 223 | #define ATTR_TIMES_SET (1 << 16) |
| 224 | 224 | ||
| 225 | /* | 225 | /* |
| 226 | * Whiteout is represented by a char device. The following constants define the | ||
| 227 | * mode and device number to use. | ||
| 228 | */ | ||
| 229 | #define WHITEOUT_MODE 0 | ||
| 230 | #define WHITEOUT_DEV 0 | ||
| 231 | |||
| 232 | /* | ||
| 226 | * This is the Inode Attributes structure, used for notify_change(). It | 233 | * This is the Inode Attributes structure, used for notify_change(). It |
| 227 | * uses the above definitions as flags, to know which values have changed. | 234 | * uses the above definitions as flags, to know which values have changed. |
| 228 | * Also, in this manner, a Filesystem can look at only the values it cares | 235 | * Also, in this manner, a Filesystem can look at only the values it cares |
| @@ -1398,6 +1405,7 @@ extern int vfs_link(struct dentry *, struct inode *, struct dentry *, struct ino | |||
| 1398 | extern int vfs_rmdir(struct inode *, struct dentry *); | 1405 | extern int vfs_rmdir(struct inode *, struct dentry *); |
| 1399 | extern int vfs_unlink(struct inode *, struct dentry *, struct inode **); | 1406 | extern int vfs_unlink(struct inode *, struct dentry *, struct inode **); |
| 1400 | extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **, unsigned int); | 1407 | extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **, unsigned int); |
| 1408 | extern int vfs_whiteout(struct inode *, struct dentry *); | ||
| 1401 | 1409 | ||
| 1402 | /* | 1410 | /* |
| 1403 | * VFS dentry helper functions. | 1411 | * VFS dentry helper functions. |
| @@ -1628,6 +1636,9 @@ struct super_operations { | |||
| 1628 | #define IS_AUTOMOUNT(inode) ((inode)->i_flags & S_AUTOMOUNT) | 1636 | #define IS_AUTOMOUNT(inode) ((inode)->i_flags & S_AUTOMOUNT) |
| 1629 | #define IS_NOSEC(inode) ((inode)->i_flags & S_NOSEC) | 1637 | #define IS_NOSEC(inode) ((inode)->i_flags & S_NOSEC) |
| 1630 | 1638 | ||
| 1639 | #define IS_WHITEOUT(inode) (S_ISCHR(inode->i_mode) && \ | ||
| 1640 | (inode)->i_rdev == WHITEOUT_DEV) | ||
| 1641 | |||
| 1631 | /* | 1642 | /* |
| 1632 | * Inode state bits. Protected by inode->i_lock | 1643 | * Inode state bits. Protected by inode->i_lock |
| 1633 | * | 1644 | * |
