diff options
| author | Miklos Szeredi <mszeredi@suse.cz> | 2014-10-23 18:14:36 -0400 |
|---|---|---|
| committer | Miklos Szeredi <mszeredi@suse.cz> | 2014-10-23 18:14:36 -0400 |
| commit | 787fb6bc9682ec7c05fb5d9561b57100fbc1cc41 (patch) | |
| tree | fde11fbe9f87e95ef6078fcbfed5f55c9ba134f8 /include/linux | |
| parent | cbdf35bcb833bfd00f0925d7a9a33a21f41ea582 (diff) | |
vfs: add whiteout support
Whiteout isn't actually a new file type, but is represented as a char
device (Linus's idea) with 0/0 device number.
This has several advantages compared to introducing a new whiteout file
type:
- no userspace API changes (e.g. trivial to make backups of upper layer
filesystem, without losing whiteouts)
- no fs image format changes (you can boot an old kernel/fsck without
whiteout support and things won't break)
- implementation is trivial
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/fs.h | 11 |
1 files changed, 11 insertions, 0 deletions
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 | * |
