|
@@ -204,6 +204,16 @@ int fsnotify(struct inode *to_tell, __u32 mask, void *data, int data_is,
|
|
|
else
|
|
|
mnt = NULL;
|
|
|
|
|
|
+ /*
|
|
|
+ * Optimization: srcu_read_lock() has a memory barrier which can
|
|
|
+ * be expensive. It protects walking the *_fsnotify_marks lists.
|
|
|
+ * However, if we do not walk the lists, we do not have to do
|
|
|
+ * SRCU because we have no references to any objects and do not
|
|
|
+ * need SRCU to keep them "alive".
|
|
|
+ */
|
|
|
+ if (hlist_empty(&to_tell->i_fsnotify_marks) &&
|
|
|
+ (!mnt || hlist_empty(&mnt->mnt_fsnotify_marks)))
|
|
|
+ return 0;
|
|
|
/*
|
|
|
* if this is a modify event we may need to clear the ignored masks
|
|
|
* otherwise return if neither the inode nor the vfsmount care about
|