diff options
Diffstat (limited to 'fs/sysfs')
-rw-r--r-- | fs/sysfs/dir.c | 10 | ||||
-rw-r--r-- | fs/sysfs/inode.c | 11 | ||||
-rw-r--r-- | fs/sysfs/sysfs.h | 2 |
3 files changed, 16 insertions, 7 deletions
diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c index 7e54bac8c4b0..ea9120a830d8 100644 --- a/fs/sysfs/dir.c +++ b/fs/sysfs/dir.c | |||
@@ -231,7 +231,7 @@ void release_sysfs_dirent(struct sysfs_dirent * sd) | |||
231 | goto repeat; | 231 | goto repeat; |
232 | } | 232 | } |
233 | 233 | ||
234 | static int sysfs_dentry_delete(struct dentry *dentry) | 234 | static int sysfs_dentry_delete(const struct dentry *dentry) |
235 | { | 235 | { |
236 | struct sysfs_dirent *sd = dentry->d_fsdata; | 236 | struct sysfs_dirent *sd = dentry->d_fsdata; |
237 | return !!(sd->s_flags & SYSFS_FLAG_REMOVED); | 237 | return !!(sd->s_flags & SYSFS_FLAG_REMOVED); |
@@ -239,9 +239,13 @@ static int sysfs_dentry_delete(struct dentry *dentry) | |||
239 | 239 | ||
240 | static int sysfs_dentry_revalidate(struct dentry *dentry, struct nameidata *nd) | 240 | static int sysfs_dentry_revalidate(struct dentry *dentry, struct nameidata *nd) |
241 | { | 241 | { |
242 | struct sysfs_dirent *sd = dentry->d_fsdata; | 242 | struct sysfs_dirent *sd; |
243 | int is_dir; | 243 | int is_dir; |
244 | 244 | ||
245 | if (nd->flags & LOOKUP_RCU) | ||
246 | return -ECHILD; | ||
247 | |||
248 | sd = dentry->d_fsdata; | ||
245 | mutex_lock(&sysfs_mutex); | 249 | mutex_lock(&sysfs_mutex); |
246 | 250 | ||
247 | /* The sysfs dirent has been deleted */ | 251 | /* The sysfs dirent has been deleted */ |
@@ -701,7 +705,7 @@ static struct dentry * sysfs_lookup(struct inode *dir, struct dentry *dentry, | |||
701 | /* instantiate and hash dentry */ | 705 | /* instantiate and hash dentry */ |
702 | ret = d_find_alias(inode); | 706 | ret = d_find_alias(inode); |
703 | if (!ret) { | 707 | if (!ret) { |
704 | dentry->d_op = &sysfs_dentry_ops; | 708 | d_set_d_op(dentry, &sysfs_dentry_ops); |
705 | dentry->d_fsdata = sysfs_get(sd); | 709 | dentry->d_fsdata = sysfs_get(sd); |
706 | d_add(dentry, inode); | 710 | d_add(dentry, inode); |
707 | } else { | 711 | } else { |
diff --git a/fs/sysfs/inode.c b/fs/sysfs/inode.c index cffb1fd8ba33..30ac27345586 100644 --- a/fs/sysfs/inode.c +++ b/fs/sysfs/inode.c | |||
@@ -348,13 +348,18 @@ int sysfs_hash_and_remove(struct sysfs_dirent *dir_sd, const void *ns, const cha | |||
348 | return -ENOENT; | 348 | return -ENOENT; |
349 | } | 349 | } |
350 | 350 | ||
351 | int sysfs_permission(struct inode *inode, int mask) | 351 | int sysfs_permission(struct inode *inode, int mask, unsigned int flags) |
352 | { | 352 | { |
353 | struct sysfs_dirent *sd = inode->i_private; | 353 | struct sysfs_dirent *sd; |
354 | |||
355 | if (flags & IPERM_FLAG_RCU) | ||
356 | return -ECHILD; | ||
357 | |||
358 | sd = inode->i_private; | ||
354 | 359 | ||
355 | mutex_lock(&sysfs_mutex); | 360 | mutex_lock(&sysfs_mutex); |
356 | sysfs_refresh_inode(sd, inode); | 361 | sysfs_refresh_inode(sd, inode); |
357 | mutex_unlock(&sysfs_mutex); | 362 | mutex_unlock(&sysfs_mutex); |
358 | 363 | ||
359 | return generic_permission(inode, mask, NULL); | 364 | return generic_permission(inode, mask, flags, NULL); |
360 | } | 365 | } |
diff --git a/fs/sysfs/sysfs.h b/fs/sysfs/sysfs.h index d9be60a2e956..ffaaa816bfba 100644 --- a/fs/sysfs/sysfs.h +++ b/fs/sysfs/sysfs.h | |||
@@ -200,7 +200,7 @@ static inline void __sysfs_put(struct sysfs_dirent *sd) | |||
200 | struct inode *sysfs_get_inode(struct super_block *sb, struct sysfs_dirent *sd); | 200 | struct inode *sysfs_get_inode(struct super_block *sb, struct sysfs_dirent *sd); |
201 | void sysfs_evict_inode(struct inode *inode); | 201 | void sysfs_evict_inode(struct inode *inode); |
202 | int sysfs_sd_setattr(struct sysfs_dirent *sd, struct iattr *iattr); | 202 | int sysfs_sd_setattr(struct sysfs_dirent *sd, struct iattr *iattr); |
203 | int sysfs_permission(struct inode *inode, int mask); | 203 | int sysfs_permission(struct inode *inode, int mask, unsigned int flags); |
204 | int sysfs_setattr(struct dentry *dentry, struct iattr *iattr); | 204 | int sysfs_setattr(struct dentry *dentry, struct iattr *iattr); |
205 | int sysfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat); | 205 | int sysfs_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat); |
206 | int sysfs_setxattr(struct dentry *dentry, const char *name, const void *value, | 206 | int sysfs_setxattr(struct dentry *dentry, const char *name, const void *value, |