diff --git a/fs/notify/fsnotify.h b/fs/notify/fsnotify.h index 96051780d50ec2e484b56c55924d49f17bc251bd..225924274f8a519b6b777d173ce25e1e5aaddbe7 100644 --- a/fs/notify/fsnotify.h +++ b/fs/notify/fsnotify.h @@ -26,19 +26,17 @@ extern struct inode *fsnotify_destroy_inode_mark(struct fsnotify_mark *mark); extern struct fsnotify_mark *fsnotify_find_mark( struct fsnotify_mark_connector *conn, struct fsnotify_group *group); -/* Destroy all marks connected via given connector protected by 'lock' */ -extern void fsnotify_destroy_marks(struct fsnotify_mark_connector *conn, - spinlock_t *lock); +/* Destroy all marks connected via given connector */ +extern void fsnotify_destroy_marks(struct fsnotify_mark_connector *conn); /* run the list of all marks associated with inode and destroy them */ static inline void fsnotify_clear_marks_by_inode(struct inode *inode) { - fsnotify_destroy_marks(inode->i_fsnotify_marks, &inode->i_lock); + fsnotify_destroy_marks(inode->i_fsnotify_marks); } /* run the list of all marks associated with vfsmount and destroy them */ static inline void fsnotify_clear_marks_by_mount(struct vfsmount *mnt) { - fsnotify_destroy_marks(real_mount(mnt)->mnt_fsnotify_marks, - &mnt->mnt_root->d_lock); + fsnotify_destroy_marks(real_mount(mnt)->mnt_fsnotify_marks); } /* prepare for freeing all marks associated with given group */ extern void fsnotify_detach_group_marks(struct fsnotify_group *group); diff --git a/fs/notify/mark.c b/fs/notify/mark.c index 0830e0af997a5df9ce67469a7112b8fc483ae3d4..f32ca924c44ed7cea2df8ebed52d0fcc19eda62a 100644 --- a/fs/notify/mark.c +++ b/fs/notify/mark.c @@ -572,14 +572,19 @@ void fsnotify_detach_group_marks(struct fsnotify_group *group) } } -void fsnotify_destroy_marks(struct fsnotify_mark_connector *conn, - spinlock_t *lock) +void fsnotify_destroy_marks(struct fsnotify_mark_connector *conn) { struct fsnotify_mark *mark; + spinlock_t *lock; if (!conn) return; + if (conn->flags & FSNOTIFY_OBJ_TYPE_INODE) + lock = &conn->inode->i_lock; + else + lock = &conn->mnt->mnt_root->d_lock; + while (1) { /* * We have to be careful since we can race with e.g.