Skip to content

Commit

Permalink
sysfs: Only take active references on attributes.
Browse files Browse the repository at this point in the history
If we exclude directories and symlinks from the set of sysfs
dirents where we need active references we are left with
sysfs attributes (binary or not).

- Tweak sysfs_deactivate to only do something on attributes
- Move lockdep initialization into sysfs_file_add_mode to
  limit it to just attributes.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Acked-by: WANG Cong <xiyou.wangcong@gmail.com>
Cc: Tejun Heo <tj@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Eric W. Biederman authored and Greg Kroah-Hartman committed Mar 8, 2010
1 parent e72ceb8 commit a2db684
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 1 deletion.
5 changes: 4 additions & 1 deletion fs/sysfs/dir.c
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,10 @@ static void sysfs_deactivate(struct sysfs_dirent *sd)
int v;

BUG_ON(sd->s_sibling || !(sd->s_flags & SYSFS_FLAG_REMOVED));

if (!(sysfs_type(sd) & SYSFS_ACTIVE_REF))
return;

sd->s_sibling = (void *)&wait;

rwsem_acquire(&sd->dep_map, 0, 0, _RET_IP_);
Expand Down Expand Up @@ -315,7 +319,6 @@ struct sysfs_dirent *sysfs_new_dirent(const char *name, umode_t mode, int type)

atomic_set(&sd->s_count, 1);
atomic_set(&sd->s_active, 0);
sysfs_dirent_init_lockdep(sd);

sd->s_name = name;
sd->s_mode = mode;
Expand Down
1 change: 1 addition & 0 deletions fs/sysfs/file.c
Original file line number Diff line number Diff line change
Expand Up @@ -509,6 +509,7 @@ int sysfs_add_file_mode(struct sysfs_dirent *dir_sd,
if (!sd)
return -ENOMEM;
sd->s_attr.attr = (void *)attr;
sysfs_dirent_init_lockdep(sd);

sysfs_addrm_start(&acxt, dir_sd);
rc = sysfs_add_one(&acxt, sd);
Expand Down
1 change: 1 addition & 0 deletions fs/sysfs/sysfs.h
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ struct sysfs_dirent {
#define SYSFS_KOBJ_BIN_ATTR 0x0004
#define SYSFS_KOBJ_LINK 0x0008
#define SYSFS_COPY_NAME (SYSFS_DIR | SYSFS_KOBJ_LINK)
#define SYSFS_ACTIVE_REF (SYSFS_KOBJ_ATTR | SYSFS_KOBJ_BIN_ATTR)

#define SYSFS_FLAG_MASK ~SYSFS_TYPE_MASK
#define SYSFS_FLAG_REMOVED 0x0200
Expand Down

0 comments on commit a2db684

Please sign in to comment.