Wrapfs: implement ->getattr
authorErez Zadok <ezk@cs.sunysb.edu>
Tue, 19 Nov 2013 22:22:31 +0000 (17:22 -0500)
committerErez Zadok <ezk@cs.sunysb.edu>
Tue, 27 Dec 2016 03:53:13 +0000 (22:53 -0500)
Signed-off-by: Erez Zadok <ezk@cs.sunysb.edu>
fs/wrapfs/inode.c

index 7c388a7107167749ae2b59be1f841fc465ce4aa0..989bb70b9ef15883065c01ae031b1914c96b16fe 100644 (file)
@@ -437,11 +437,32 @@ out_err:
        return err;
 }
 
+static int wrapfs_getattr(struct vfsmount *mnt, struct dentry *dentry,
+                         struct kstat *stat)
+{
+       int err;
+       struct kstat lower_stat;
+       struct path lower_path;
+
+       wrapfs_get_lower_path(dentry, &lower_path);
+       err = vfs_getattr(&lower_path, &lower_stat);
+       if (err)
+               goto out;
+       fsstack_copy_attr_all(dentry->d_inode,
+                             lower_path.dentry->d_inode);
+       generic_fillattr(dentry->d_inode, stat);
+       stat->blocks = lower_stat.blocks;
+out:
+       wrapfs_put_lower_path(dentry, &lower_path);
+       return err;
+}
+
 const struct inode_operations wrapfs_symlink_iops = {
        .readlink       = wrapfs_readlink,
        .permission     = wrapfs_permission,
        .follow_link    = wrapfs_follow_link,
        .setattr        = wrapfs_setattr,
+       .getattr        = wrapfs_getattr,
        .put_link       = wrapfs_put_link,
 };
 
@@ -457,9 +478,11 @@ const struct inode_operations wrapfs_dir_iops = {
        .rename         = wrapfs_rename,
        .permission     = wrapfs_permission,
        .setattr        = wrapfs_setattr,
+       .getattr        = wrapfs_getattr,
 };
 
 const struct inode_operations wrapfs_main_iops = {
        .permission     = wrapfs_permission,
        .setattr        = wrapfs_setattr,
+       .getattr        = wrapfs_getattr,
 };