sysfs: Update s_iattr on link and unlink.
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>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
35df63c46c
commit
6b0bfe9383
@@ -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)
|
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))
|
if (sysfs_find_dirent(acxt->parent_sd, sd->s_name))
|
||||||
return -EEXIST;
|
return -EEXIST;
|
||||||
|
|
||||||
@@ -476,6 +478,13 @@ int __sysfs_add_one(struct sysfs_addrm_cxt *acxt, struct sysfs_dirent *sd)
|
|||||||
|
|
||||||
sysfs_link_sibling(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;
|
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)
|
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);
|
BUG_ON(sd->s_flags & SYSFS_FLAG_REMOVED);
|
||||||
|
|
||||||
sysfs_unlink_sibling(sd);
|
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_flags |= SYSFS_FLAG_REMOVED;
|
||||||
sd->s_sibling = acxt->removed;
|
sd->s_sibling = acxt->removed;
|
||||||
acxt->removed = sd;
|
acxt->removed = sd;
|
||||||
|
Reference in New Issue
Block a user