forked from Minki/linux
ovl: don't cache acl on overlay layer
Some operations (setxattr/chmod) can make the cached acl stale. We either
need to clear overlay's acl cache for the affected inode or prevent acl
caching on the overlay altogether. Preventing caching has the following
advantages:
- no double caching, less memory used
- overlay cache doesn't go stale when fs clears it's own cache
Possible disadvantage is performance loss. If that becomes a problem
get_acl() can be optimized for overlayfs.
This patch disables caching by pre setting i_*acl to a value that
- has bit 0 set, so is_uncached_acl() will return true
- is not equal to ACL_NOT_CACHED, so get_acl() will not overwrite it
The constant -3 was chosen for this purpose.
Fixes: 39a25b2b37
("ovl: define ->get_acl() for overlay inodes")
Signed-off-by: Miklos Szeredi <mszeredi@redhat.com>
This commit is contained in:
parent
5201dc449e
commit
2a3a2a3f35
@ -416,6 +416,9 @@ static void ovl_fill_inode(struct inode *inode, umode_t mode)
|
|||||||
inode->i_ino = get_next_ino();
|
inode->i_ino = get_next_ino();
|
||||||
inode->i_mode = mode;
|
inode->i_mode = mode;
|
||||||
inode->i_flags |= S_NOCMTIME;
|
inode->i_flags |= S_NOCMTIME;
|
||||||
|
#ifdef CONFIG_FS_POSIX_ACL
|
||||||
|
inode->i_acl = inode->i_default_acl = ACL_DONT_CACHE;
|
||||||
|
#endif
|
||||||
|
|
||||||
mode &= S_IFMT;
|
mode &= S_IFMT;
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
|
@ -574,6 +574,7 @@ static inline void mapping_allow_writable(struct address_space *mapping)
|
|||||||
|
|
||||||
struct posix_acl;
|
struct posix_acl;
|
||||||
#define ACL_NOT_CACHED ((void *)(-1))
|
#define ACL_NOT_CACHED ((void *)(-1))
|
||||||
|
#define ACL_DONT_CACHE ((void *)(-3))
|
||||||
|
|
||||||
static inline struct posix_acl *
|
static inline struct posix_acl *
|
||||||
uncached_acl_sentinel(struct task_struct *task)
|
uncached_acl_sentinel(struct task_struct *task)
|
||||||
|
Loading…
Reference in New Issue
Block a user