aboutsummaryrefslogtreecommitdiffstats
path: root/fs/notify/inode_mark.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/notify/inode_mark.c')
-rw-r--r--fs/notify/inode_mark.c35
1 files changed, 27 insertions, 8 deletions
diff --git a/fs/notify/inode_mark.c b/fs/notify/inode_mark.c
index c925579ba011..4292f9e23ae8 100644
--- a/fs/notify/inode_mark.c
+++ b/fs/notify/inode_mark.c
@@ -141,7 +141,32 @@ struct fsnotify_mark *fsnotify_find_inode_mark(struct fsnotify_group *group,
141} 141}
142 142
143/* 143/*
144 * Attach an initialized mark mark to a given group and inode. 144 * If we are setting a mark mask on an inode mark we should pin the inode
145 * in memory.
146 */
147void fsnotify_set_inode_mark_mask_locked(struct fsnotify_mark *mark,
148 __u32 mask)
149{
150 struct inode *inode;
151
152 assert_spin_locked(&mark->lock);
153
154 if (mask &&
155 mark->i.inode &&
156 !(mark->flags & FSNOTIFY_MARK_FLAG_OBJECT_PINNED)) {
157 mark->flags |= FSNOTIFY_MARK_FLAG_OBJECT_PINNED;
158 inode = igrab(mark->i.inode);
159 /*
160 * we shouldn't be able to get here if the inode wasn't
161 * already safely held in memory. But bug in case it
162 * ever is wrong.
163 */
164 BUG_ON(!inode);
165 }
166}
167
168/*
169 * Attach an initialized mark to a given group and inode.
145 * These marks may be used for the fsnotify backend to determine which 170 * These marks may be used for the fsnotify backend to determine which
146 * event types should be delivered to which group and for which inodes. 171 * event types should be delivered to which group and for which inodes.
147 */ 172 */
@@ -152,10 +177,6 @@ int fsnotify_add_inode_mark(struct fsnotify_mark *mark,
152 struct fsnotify_mark *lmark = NULL; 177 struct fsnotify_mark *lmark = NULL;
153 int ret = 0; 178 int ret = 0;
154 179
155 inode = igrab(inode);
156 if (unlikely(!inode))
157 return -EINVAL;
158
159 mark->flags = FSNOTIFY_MARK_FLAG_INODE; 180 mark->flags = FSNOTIFY_MARK_FLAG_INODE;
160 181
161 assert_spin_locked(&mark->lock); 182 assert_spin_locked(&mark->lock);
@@ -175,10 +196,8 @@ int fsnotify_add_inode_mark(struct fsnotify_mark *mark,
175 196
176 spin_unlock(&inode->i_lock); 197 spin_unlock(&inode->i_lock);
177 198
178 if (lmark) { 199 if (lmark)
179 ret = -EEXIST; 200 ret = -EEXIST;
180 iput(inode);
181 }
182 201
183 return ret; 202 return ret;
184} 203}