aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux/fs.h
diff options
context:
space:
mode:
authorMiklos Szeredi <mszeredi@suse.cz>2014-10-23 18:14:36 -0400
committerMiklos Szeredi <mszeredi@suse.cz>2014-10-23 18:14:36 -0400
commit787fb6bc9682ec7c05fb5d9561b57100fbc1cc41 (patch)
treefde11fbe9f87e95ef6078fcbfed5f55c9ba134f8 /include/linux/fs.h
parentcbdf35bcb833bfd00f0925d7a9a33a21f41ea582 (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/fs.h')
-rw-r--r--include/linux/fs.h11
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
1398extern int vfs_rmdir(struct inode *, struct dentry *); 1405extern int vfs_rmdir(struct inode *, struct dentry *);
1399extern int vfs_unlink(struct inode *, struct dentry *, struct inode **); 1406extern int vfs_unlink(struct inode *, struct dentry *, struct inode **);
1400extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **, unsigned int); 1407extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *, struct inode **, unsigned int);
1408extern 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 *