sysfs: Update s_iattr on link and unlink.
Eric W. Biederman [Sat, 21 Nov 2009 00:08:51 +0000 (16:08 -0800)]
Currently sysfs updates the timestamps on the vfs directory
inode when we create or remove a directory entry but doesn't
update the cached copy on the sysfs_dirent, fix that oversight.

Acked-by: Tejun Heo <tj@kernel.org>
Acked-by: Serge Hallyn <serue@us.ibm.com>
Signed-off-by: Eric W. Biederman <ebiederm@aristanetworks.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

fs/sysfs/dir.c

index 9ee130b..36ee6d8 100644 (file)
@@ -464,6 +464,8 @@ void sysfs_addrm_start(struct sysfs_addrm_cxt *acxt,
  */
 int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
 {
+       struct sysfs_inode_attrs *ps_iattr;
+
        if (sysfs_find_dirent(acxt->parent_sd, sd->s_name))
                return -EEXIST;
 
@@ -476,6 +478,13 @@ int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
 
        sysfs_link_sibling(sd);
 
+       /* Update timestamps on the parent */
+       ps_iattr = acxt->parent_sd->s_iattr;
+       if (ps_iattr) {
+               struct iattr *ps_iattrs = &ps_iattr->ia_iattr;
+               ps_iattrs->ia_ctime = ps_iattrs->ia_mtime = CURRENT_TIME;
+       }
+
        return 0;
 }
 
@@ -554,10 +563,19 @@ int sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
  */
 void sysfs_remove_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
 {
+       struct sysfs_inode_attrs *ps_iattr;
+
        BUG_ON(sd->s_flags & SYSFS_FLAG_REMOVED);
 
        sysfs_unlink_sibling(sd);
 
+       /* Update timestamps on the parent */
+       ps_iattr = acxt->parent_sd->s_iattr;
+       if (ps_iattr) {
+               struct iattr *ps_iattrs = &ps_iattr->ia_iattr;
+               ps_iattrs->ia_ctime = ps_iattrs->ia_mtime = CURRENT_TIME;
+       }
+
        sd->s_flags |= SYSFS_FLAG_REMOVED;
        sd->s_sibling = acxt->removed;
        acxt->removed = sd;