eCryptfs: Add getattr function
The i_blocks field of an eCryptfs inode cannot be trusted, but generic_fillattr() uses it to instantiate the blocks field of a stat() syscall when a filesystem doesn't implement its own getattr(). Users have noticed that the output of du is incorrect on newly created files. This patch creates ecryptfs_getattr() which calls into the lower filesystem's getattr() so that eCryptfs can use its kstat.blocks value after calling generic_fillattr(). It is important to note that the block count includes the eCryptfs metadata stored in the beginning of the lower file plus any padding used to fill an extent before encryption. https://bugs.launchpad.net/ecryptfs/+bug/390833 Reported-by: Dominic Sacré <dominic.sacre@gmx.de> Signed-off-by: Tyler Hicks <tyhicks@linux.vnet.ibm.com>
This commit is contained in:
@@ -1006,6 +1006,21 @@ out:
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ecryptfs_getattr(struct vfsmount *mnt, struct dentry *dentry,
|
||||||
|
struct kstat *stat)
|
||||||
|
{
|
||||||
|
struct kstat lower_stat;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = vfs_getattr(ecryptfs_dentry_to_lower_mnt(dentry),
|
||||||
|
ecryptfs_dentry_to_lower(dentry), &lower_stat);
|
||||||
|
if (!rc) {
|
||||||
|
generic_fillattr(dentry->d_inode, stat);
|
||||||
|
stat->blocks = lower_stat.blocks;
|
||||||
|
}
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value,
|
ecryptfs_setxattr(struct dentry *dentry, const char *name, const void *value,
|
||||||
size_t size, int flags)
|
size_t size, int flags)
|
||||||
@@ -1135,6 +1150,7 @@ const struct inode_operations ecryptfs_dir_iops = {
|
|||||||
const struct inode_operations ecryptfs_main_iops = {
|
const struct inode_operations ecryptfs_main_iops = {
|
||||||
.permission = ecryptfs_permission,
|
.permission = ecryptfs_permission,
|
||||||
.setattr = ecryptfs_setattr,
|
.setattr = ecryptfs_setattr,
|
||||||
|
.getattr = ecryptfs_getattr,
|
||||||
.setxattr = ecryptfs_setxattr,
|
.setxattr = ecryptfs_setxattr,
|
||||||
.getxattr = ecryptfs_getxattr,
|
.getxattr = ecryptfs_getxattr,
|
||||||
.listxattr = ecryptfs_listxattr,
|
.listxattr = ecryptfs_listxattr,
|
||||||
|
Reference in New Issue
Block a user