1 /* 2 * Copyright (C) 2008 Red Hat, Inc., Eric Paris <eparis@redhat.com> 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2, or (at your option) 7 * any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; see the file COPYING. If not, write to 16 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 17 */ 18 19 /* 20 * fsnotify inode mark locking/lifetime/and refcnting 21 * 22 * REFCNT: 23 * The group->recnt and mark->refcnt tell how many "things" in the kernel 24 * currently are referencing the objects. Both kind of objects typically will 25 * live inside the kernel with a refcnt of 2, one for its creation and one for 26 * the reference a group and a mark hold to each other. 27 * If you are holding the appropriate locks, you can take a reference and the 28 * object itself is guaranteed to survive until the reference is dropped. 29 * 30 * LOCKING: 31 * There are 3 locks involved with fsnotify inode marks and they MUST be taken 32 * in order as follows: 33 * 34 * group->mark_mutex 35 * mark->lock 36 * mark->connector->lock 37 * 38 * group->mark_mutex protects the marks_list anchored inside a given group and 39 * each mark is hooked via the g_list. It also protects the groups private 40 * data (i.e group limits). 41 42 * mark->lock protects the marks attributes like its masks and flags. 43 * Furthermore it protects the access to a reference of the group that the mark 44 * is assigned to as well as the access to a reference of the inode/vfsmount 45 * that is being watched by the mark. 46 * 47 * mark->connector->lock protects the list of marks anchored inside an 48 * inode / vfsmount and each mark is hooked via the i_list. 49 * 50 * A list of notification marks relating to inode / mnt is contained in 51 * fsnotify_mark_connector. That structure is alive as long as there are any 52 * marks in the list and is also protected by fsnotify_mark_srcu. A mark gets 53 * detached from fsnotify_mark_connector when last reference to the mark is 54 * dropped. Thus having mark reference is enough to protect mark->connector 55 * pointer and to make sure fsnotify_mark_connector cannot disappear. Also 56 * because we remove mark from g_list before dropping mark reference associated 57 * with that, any mark found through g_list is guaranteed to have 58 * mark->connector set until we drop group->mark_mutex. 59 * 60 * LIFETIME: 61 * Inode marks survive between when they are added to an inode and when their 62 * refcnt==0. Marks are also protected by fsnotify_mark_srcu. 63 * 64 * The inode mark can be cleared for a number of different reasons including: 65 * - The inode is unlinked for the last time. (fsnotify_inode_remove) 66 * - The inode is being evicted from cache. (fsnotify_inode_delete) 67 * - The fs the inode is on is unmounted. (fsnotify_inode_delete/fsnotify_unmount_inodes) 68 * - Something explicitly requests that it be removed. (fsnotify_destroy_mark) 69 * - The fsnotify_group associated with the mark is going away and all such marks 70 * need to be cleaned up. (fsnotify_clear_marks_by_group) 71 * 72 * This has the very interesting property of being able to run concurrently with 73 * any (or all) other directions. 74 */ 75 76 #include <linux/fs.h> 77 #include <linux/init.h> 78 #include <linux/kernel.h> 79 #include <linux/kthread.h> 80 #include <linux/module.h> 81 #include <linux/mutex.h> 82 #include <linux/slab.h> 83 #include <linux/spinlock.h> 84 #include <linux/srcu.h> 85 86 #include <linux/atomic.h> 87 88 #include <linux/fsnotify_backend.h> 89 #include "fsnotify.h" 90 91 #define FSNOTIFY_REAPER_DELAY (1) /* 1 jiffy */ 92 93 struct srcu_struct fsnotify_mark_srcu; 94 struct kmem_cache *fsnotify_mark_connector_cachep; 95 96 static DEFINE_SPINLOCK(destroy_lock); 97 static LIST_HEAD(destroy_list); 98 static struct fsnotify_mark_connector *connector_destroy_list; 99 100 static void fsnotify_mark_destroy_workfn(struct work_struct *work); 101 static DECLARE_DELAYED_WORK(reaper_work, fsnotify_mark_destroy_workfn); 102 103 static void fsnotify_connector_destroy_workfn(struct work_struct *work); 104 static DECLARE_WORK(connector_reaper_work, fsnotify_connector_destroy_workfn); 105 106 void fsnotify_get_mark(struct fsnotify_mark *mark) 107 { 108 WARN_ON_ONCE(!refcount_read(&mark->refcnt)); 109 refcount_inc(&mark->refcnt); 110 } 111 112 static void __fsnotify_recalc_mask(struct fsnotify_mark_connector *conn) 113 { 114 u32 new_mask = 0; 115 struct fsnotify_mark *mark; 116 117 assert_spin_locked(&conn->lock); 118 hlist_for_each_entry(mark, &conn->list, obj_list) { 119 if (mark->flags & FSNOTIFY_MARK_FLAG_ATTACHED) 120 new_mask |= mark->mask; 121 } 122 if (conn->type == FSNOTIFY_OBJ_TYPE_INODE) 123 fsnotify_conn_inode(conn)->i_fsnotify_mask = new_mask; 124 else if (conn->type == FSNOTIFY_OBJ_TYPE_VFSMOUNT) 125 fsnotify_conn_mount(conn)->mnt_fsnotify_mask = new_mask; 126 } 127 128 /* 129 * Calculate mask of events for a list of marks. The caller must make sure 130 * connector and connector->obj cannot disappear under us. Callers achieve 131 * this by holding a mark->lock or mark->group->mark_mutex for a mark on this 132 * list. 133 */ 134 void fsnotify_recalc_mask(struct fsnotify_mark_connector *conn) 135 { 136 if (!conn) 137 return; 138 139 spin_lock(&conn->lock); 140 __fsnotify_recalc_mask(conn); 141 spin_unlock(&conn->lock); 142 if (conn->type == FSNOTIFY_OBJ_TYPE_INODE) 143 __fsnotify_update_child_dentry_flags( 144 fsnotify_conn_inode(conn)); 145 } 146 147 /* Free all connectors queued for freeing once SRCU period ends */ 148 static void fsnotify_connector_destroy_workfn(struct work_struct *work) 149 { 150 struct fsnotify_mark_connector *conn, *free; 151 152 spin_lock(&destroy_lock); 153 conn = connector_destroy_list; 154 connector_destroy_list = NULL; 155 spin_unlock(&destroy_lock); 156 157 synchronize_srcu(&fsnotify_mark_srcu); 158 while (conn) { 159 free = conn; 160 conn = conn->destroy_next; 161 kmem_cache_free(fsnotify_mark_connector_cachep, free); 162 } 163 } 164 165 static struct inode *fsnotify_detach_connector_from_object( 166 struct fsnotify_mark_connector *conn) 167 { 168 struct inode *inode = NULL; 169 170 if (conn->type == FSNOTIFY_OBJ_TYPE_DETACHED) 171 return NULL; 172 173 if (conn->type == FSNOTIFY_OBJ_TYPE_INODE) { 174 inode = fsnotify_conn_inode(conn); 175 inode->i_fsnotify_mask = 0; 176 } else if (conn->type == FSNOTIFY_OBJ_TYPE_VFSMOUNT) { 177 fsnotify_conn_mount(conn)->mnt_fsnotify_mask = 0; 178 } 179 180 rcu_assign_pointer(*(conn->obj), NULL); 181 conn->obj = NULL; 182 conn->type = FSNOTIFY_OBJ_TYPE_DETACHED; 183 184 return inode; 185 } 186 187 static void fsnotify_final_mark_destroy(struct fsnotify_mark *mark) 188 { 189 struct fsnotify_group *group = mark->group; 190 191 if (WARN_ON_ONCE(!group)) 192 return; 193 group->ops->free_mark(mark); 194 fsnotify_put_group(group); 195 } 196 197 void fsnotify_put_mark(struct fsnotify_mark *mark) 198 { 199 struct fsnotify_mark_connector *conn; 200 struct inode *inode = NULL; 201 bool free_conn = false; 202 203 /* Catch marks that were actually never attached to object */ 204 if (!mark->connector) { 205 if (refcount_dec_and_test(&mark->refcnt)) 206 fsnotify_final_mark_destroy(mark); 207 return; 208 } 209 210 /* 211 * We have to be careful so that traversals of obj_list under lock can 212 * safely grab mark reference. 213 */ 214 if (!refcount_dec_and_lock(&mark->refcnt, &mark->connector->lock)) 215 return; 216 217 conn = mark->connector; 218 hlist_del_init_rcu(&mark->obj_list); 219 if (hlist_empty(&conn->list)) { 220 inode = fsnotify_detach_connector_from_object(conn); 221 free_conn = true; 222 } else { 223 __fsnotify_recalc_mask(conn); 224 } 225 mark->connector = NULL; 226 spin_unlock(&conn->lock); 227 228 iput(inode); 229 230 if (free_conn) { 231 spin_lock(&destroy_lock); 232 conn->destroy_next = connector_destroy_list; 233 connector_destroy_list = conn; 234 spin_unlock(&destroy_lock); 235 queue_work(system_unbound_wq, &connector_reaper_work); 236 } 237 /* 238 * Note that we didn't update flags telling whether inode cares about 239 * what's happening with children. We update these flags from 240 * __fsnotify_parent() lazily when next event happens on one of our 241 * children. 242 */ 243 spin_lock(&destroy_lock); 244 list_add(&mark->g_list, &destroy_list); 245 spin_unlock(&destroy_lock); 246 queue_delayed_work(system_unbound_wq, &reaper_work, 247 FSNOTIFY_REAPER_DELAY); 248 } 249 250 /* 251 * Get mark reference when we found the mark via lockless traversal of object 252 * list. Mark can be already removed from the list by now and on its way to be 253 * destroyed once SRCU period ends. 254 * 255 * Also pin the group so it doesn't disappear under us. 256 */ 257 static bool fsnotify_get_mark_safe(struct fsnotify_mark *mark) 258 { 259 if (!mark) 260 return true; 261 262 if (refcount_inc_not_zero(&mark->refcnt)) { 263 spin_lock(&mark->lock); 264 if (mark->flags & FSNOTIFY_MARK_FLAG_ATTACHED) { 265 /* mark is attached, group is still alive then */ 266 atomic_inc(&mark->group->user_waits); 267 spin_unlock(&mark->lock); 268 return true; 269 } 270 spin_unlock(&mark->lock); 271 fsnotify_put_mark(mark); 272 } 273 return false; 274 } 275 276 /* 277 * Puts marks and wakes up group destruction if necessary. 278 * 279 * Pairs with fsnotify_get_mark_safe() 280 */ 281 static void fsnotify_put_mark_wake(struct fsnotify_mark *mark) 282 { 283 if (mark) { 284 struct fsnotify_group *group = mark->group; 285 286 fsnotify_put_mark(mark); 287 /* 288 * We abuse notification_waitq on group shutdown for waiting for 289 * all marks pinned when waiting for userspace. 290 */ 291 if (atomic_dec_and_test(&group->user_waits) && group->shutdown) 292 wake_up(&group->notification_waitq); 293 } 294 } 295 296 bool fsnotify_prepare_user_wait(struct fsnotify_iter_info *iter_info) 297 { 298 int type; 299 300 fsnotify_foreach_obj_type(type) { 301 /* This can fail if mark is being removed */ 302 if (!fsnotify_get_mark_safe(iter_info->marks[type])) 303 goto fail; 304 } 305 306 /* 307 * Now that both marks are pinned by refcount in the inode / vfsmount 308 * lists, we can drop SRCU lock, and safely resume the list iteration 309 * once userspace returns. 310 */ 311 srcu_read_unlock(&fsnotify_mark_srcu, iter_info->srcu_idx); 312 313 return true; 314 315 fail: 316 for (type--; type >= 0; type--) 317 fsnotify_put_mark_wake(iter_info->marks[type]); 318 return false; 319 } 320 321 void fsnotify_finish_user_wait(struct fsnotify_iter_info *iter_info) 322 { 323 int type; 324 325 iter_info->srcu_idx = srcu_read_lock(&fsnotify_mark_srcu); 326 fsnotify_foreach_obj_type(type) 327 fsnotify_put_mark_wake(iter_info->marks[type]); 328 } 329 330 /* 331 * Mark mark as detached, remove it from group list. Mark still stays in object 332 * list until its last reference is dropped. Note that we rely on mark being 333 * removed from group list before corresponding reference to it is dropped. In 334 * particular we rely on mark->connector being valid while we hold 335 * group->mark_mutex if we found the mark through g_list. 336 * 337 * Must be called with group->mark_mutex held. The caller must either hold 338 * reference to the mark or be protected by fsnotify_mark_srcu. 339 */ 340 void fsnotify_detach_mark(struct fsnotify_mark *mark) 341 { 342 struct fsnotify_group *group = mark->group; 343 344 WARN_ON_ONCE(!mutex_is_locked(&group->mark_mutex)); 345 WARN_ON_ONCE(!srcu_read_lock_held(&fsnotify_mark_srcu) && 346 refcount_read(&mark->refcnt) < 1 + 347 !!(mark->flags & FSNOTIFY_MARK_FLAG_ATTACHED)); 348 349 spin_lock(&mark->lock); 350 /* something else already called this function on this mark */ 351 if (!(mark->flags & FSNOTIFY_MARK_FLAG_ATTACHED)) { 352 spin_unlock(&mark->lock); 353 return; 354 } 355 mark->flags &= ~FSNOTIFY_MARK_FLAG_ATTACHED; 356 list_del_init(&mark->g_list); 357 spin_unlock(&mark->lock); 358 359 atomic_dec(&group->num_marks); 360 361 /* Drop mark reference acquired in fsnotify_add_mark_locked() */ 362 fsnotify_put_mark(mark); 363 } 364 365 /* 366 * Free fsnotify mark. The mark is actually only marked as being freed. The 367 * freeing is actually happening only once last reference to the mark is 368 * dropped from a workqueue which first waits for srcu period end. 369 * 370 * Caller must have a reference to the mark or be protected by 371 * fsnotify_mark_srcu. 372 */ 373 void fsnotify_free_mark(struct fsnotify_mark *mark) 374 { 375 struct fsnotify_group *group = mark->group; 376 377 spin_lock(&mark->lock); 378 /* something else already called this function on this mark */ 379 if (!(mark->flags & FSNOTIFY_MARK_FLAG_ALIVE)) { 380 spin_unlock(&mark->lock); 381 return; 382 } 383 mark->flags &= ~FSNOTIFY_MARK_FLAG_ALIVE; 384 spin_unlock(&mark->lock); 385 386 /* 387 * Some groups like to know that marks are being freed. This is a 388 * callback to the group function to let it know that this mark 389 * is being freed. 390 */ 391 if (group->ops->freeing_mark) 392 group->ops->freeing_mark(mark, group); 393 } 394 395 void fsnotify_destroy_mark(struct fsnotify_mark *mark, 396 struct fsnotify_group *group) 397 { 398 mutex_lock_nested(&group->mark_mutex, SINGLE_DEPTH_NESTING); 399 fsnotify_detach_mark(mark); 400 mutex_unlock(&group->mark_mutex); 401 fsnotify_free_mark(mark); 402 } 403 404 /* 405 * Sorting function for lists of fsnotify marks. 406 * 407 * Fanotify supports different notification classes (reflected as priority of 408 * notification group). Events shall be passed to notification groups in 409 * decreasing priority order. To achieve this marks in notification lists for 410 * inodes and vfsmounts are sorted so that priorities of corresponding groups 411 * are descending. 412 * 413 * Furthermore correct handling of the ignore mask requires processing inode 414 * and vfsmount marks of each group together. Using the group address as 415 * further sort criterion provides a unique sorting order and thus we can 416 * merge inode and vfsmount lists of marks in linear time and find groups 417 * present in both lists. 418 * 419 * A return value of 1 signifies that b has priority over a. 420 * A return value of 0 signifies that the two marks have to be handled together. 421 * A return value of -1 signifies that a has priority over b. 422 */ 423 int fsnotify_compare_groups(struct fsnotify_group *a, struct fsnotify_group *b) 424 { 425 if (a == b) 426 return 0; 427 if (!a) 428 return 1; 429 if (!b) 430 return -1; 431 if (a->priority < b->priority) 432 return 1; 433 if (a->priority > b->priority) 434 return -1; 435 if (a < b) 436 return 1; 437 return -1; 438 } 439 440 static int fsnotify_attach_connector_to_object(fsnotify_connp_t *connp, 441 unsigned int type) 442 { 443 struct inode *inode = NULL; 444 struct fsnotify_mark_connector *conn; 445 446 conn = kmem_cache_alloc(fsnotify_mark_connector_cachep, GFP_KERNEL); 447 if (!conn) 448 return -ENOMEM; 449 spin_lock_init(&conn->lock); 450 INIT_HLIST_HEAD(&conn->list); 451 conn->type = type; 452 conn->obj = connp; 453 if (conn->type == FSNOTIFY_OBJ_TYPE_INODE) 454 inode = igrab(fsnotify_conn_inode(conn)); 455 /* 456 * cmpxchg() provides the barrier so that readers of *connp can see 457 * only initialized structure 458 */ 459 if (cmpxchg(connp, NULL, conn)) { 460 /* Someone else created list structure for us */ 461 if (inode) 462 iput(inode); 463 kmem_cache_free(fsnotify_mark_connector_cachep, conn); 464 } 465 466 return 0; 467 } 468 469 /* 470 * Get mark connector, make sure it is alive and return with its lock held. 471 * This is for users that get connector pointer from inode or mount. Users that 472 * hold reference to a mark on the list may directly lock connector->lock as 473 * they are sure list cannot go away under them. 474 */ 475 static struct fsnotify_mark_connector *fsnotify_grab_connector( 476 fsnotify_connp_t *connp) 477 { 478 struct fsnotify_mark_connector *conn; 479 int idx; 480 481 idx = srcu_read_lock(&fsnotify_mark_srcu); 482 conn = srcu_dereference(*connp, &fsnotify_mark_srcu); 483 if (!conn) 484 goto out; 485 spin_lock(&conn->lock); 486 if (conn->type == FSNOTIFY_OBJ_TYPE_DETACHED) { 487 spin_unlock(&conn->lock); 488 srcu_read_unlock(&fsnotify_mark_srcu, idx); 489 return NULL; 490 } 491 out: 492 srcu_read_unlock(&fsnotify_mark_srcu, idx); 493 return conn; 494 } 495 496 /* 497 * Add mark into proper place in given list of marks. These marks may be used 498 * for the fsnotify backend to determine which event types should be delivered 499 * to which group and for which inodes. These marks are ordered according to 500 * priority, highest number first, and then by the group's location in memory. 501 */ 502 static int fsnotify_add_mark_list(struct fsnotify_mark *mark, 503 fsnotify_connp_t *connp, unsigned int type, 504 int allow_dups) 505 { 506 struct fsnotify_mark *lmark, *last = NULL; 507 struct fsnotify_mark_connector *conn; 508 int cmp; 509 int err = 0; 510 511 if (WARN_ON(!fsnotify_valid_obj_type(type))) 512 return -EINVAL; 513 restart: 514 spin_lock(&mark->lock); 515 conn = fsnotify_grab_connector(connp); 516 if (!conn) { 517 spin_unlock(&mark->lock); 518 err = fsnotify_attach_connector_to_object(connp, type); 519 if (err) 520 return err; 521 goto restart; 522 } 523 524 /* is mark the first mark? */ 525 if (hlist_empty(&conn->list)) { 526 hlist_add_head_rcu(&mark->obj_list, &conn->list); 527 goto added; 528 } 529 530 /* should mark be in the middle of the current list? */ 531 hlist_for_each_entry(lmark, &conn->list, obj_list) { 532 last = lmark; 533 534 if ((lmark->group == mark->group) && 535 (lmark->flags & FSNOTIFY_MARK_FLAG_ATTACHED) && 536 !allow_dups) { 537 err = -EEXIST; 538 goto out_err; 539 } 540 541 cmp = fsnotify_compare_groups(lmark->group, mark->group); 542 if (cmp >= 0) { 543 hlist_add_before_rcu(&mark->obj_list, &lmark->obj_list); 544 goto added; 545 } 546 } 547 548 BUG_ON(last == NULL); 549 /* mark should be the last entry. last is the current last entry */ 550 hlist_add_behind_rcu(&mark->obj_list, &last->obj_list); 551 added: 552 mark->connector = conn; 553 out_err: 554 spin_unlock(&conn->lock); 555 spin_unlock(&mark->lock); 556 return err; 557 } 558 559 /* 560 * Attach an initialized mark to a given group and fs object. 561 * These marks may be used for the fsnotify backend to determine which 562 * event types should be delivered to which group. 563 */ 564 int fsnotify_add_mark_locked(struct fsnotify_mark *mark, 565 fsnotify_connp_t *connp, unsigned int type, 566 int allow_dups) 567 { 568 struct fsnotify_group *group = mark->group; 569 int ret = 0; 570 571 BUG_ON(!mutex_is_locked(&group->mark_mutex)); 572 573 /* 574 * LOCKING ORDER!!!! 575 * group->mark_mutex 576 * mark->lock 577 * mark->connector->lock 578 */ 579 spin_lock(&mark->lock); 580 mark->flags |= FSNOTIFY_MARK_FLAG_ALIVE | FSNOTIFY_MARK_FLAG_ATTACHED; 581 582 list_add(&mark->g_list, &group->marks_list); 583 atomic_inc(&group->num_marks); 584 fsnotify_get_mark(mark); /* for g_list */ 585 spin_unlock(&mark->lock); 586 587 ret = fsnotify_add_mark_list(mark, connp, type, allow_dups); 588 if (ret) 589 goto err; 590 591 if (mark->mask) 592 fsnotify_recalc_mask(mark->connector); 593 594 return ret; 595 err: 596 spin_lock(&mark->lock); 597 mark->flags &= ~(FSNOTIFY_MARK_FLAG_ALIVE | 598 FSNOTIFY_MARK_FLAG_ATTACHED); 599 list_del_init(&mark->g_list); 600 spin_unlock(&mark->lock); 601 atomic_dec(&group->num_marks); 602 603 fsnotify_put_mark(mark); 604 return ret; 605 } 606 607 int fsnotify_add_mark(struct fsnotify_mark *mark, fsnotify_connp_t *connp, 608 unsigned int type, int allow_dups) 609 { 610 int ret; 611 struct fsnotify_group *group = mark->group; 612 613 mutex_lock(&group->mark_mutex); 614 ret = fsnotify_add_mark_locked(mark, connp, type, allow_dups); 615 mutex_unlock(&group->mark_mutex); 616 return ret; 617 } 618 619 /* 620 * Given a list of marks, find the mark associated with given group. If found 621 * take a reference to that mark and return it, else return NULL. 622 */ 623 struct fsnotify_mark *fsnotify_find_mark(fsnotify_connp_t *connp, 624 struct fsnotify_group *group) 625 { 626 struct fsnotify_mark_connector *conn; 627 struct fsnotify_mark *mark; 628 629 conn = fsnotify_grab_connector(connp); 630 if (!conn) 631 return NULL; 632 633 hlist_for_each_entry(mark, &conn->list, obj_list) { 634 if (mark->group == group && 635 (mark->flags & FSNOTIFY_MARK_FLAG_ATTACHED)) { 636 fsnotify_get_mark(mark); 637 spin_unlock(&conn->lock); 638 return mark; 639 } 640 } 641 spin_unlock(&conn->lock); 642 return NULL; 643 } 644 645 /* Clear any marks in a group with given type mask */ 646 void fsnotify_clear_marks_by_group(struct fsnotify_group *group, 647 unsigned int type_mask) 648 { 649 struct fsnotify_mark *lmark, *mark; 650 LIST_HEAD(to_free); 651 struct list_head *head = &to_free; 652 653 /* Skip selection step if we want to clear all marks. */ 654 if (type_mask == FSNOTIFY_OBJ_ALL_TYPES_MASK) { 655 head = &group->marks_list; 656 goto clear; 657 } 658 /* 659 * We have to be really careful here. Anytime we drop mark_mutex, e.g. 660 * fsnotify_clear_marks_by_inode() can come and free marks. Even in our 661 * to_free list so we have to use mark_mutex even when accessing that 662 * list. And freeing mark requires us to drop mark_mutex. So we can 663 * reliably free only the first mark in the list. That's why we first 664 * move marks to free to to_free list in one go and then free marks in 665 * to_free list one by one. 666 */ 667 mutex_lock_nested(&group->mark_mutex, SINGLE_DEPTH_NESTING); 668 list_for_each_entry_safe(mark, lmark, &group->marks_list, g_list) { 669 if ((1U << mark->connector->type) & type_mask) 670 list_move(&mark->g_list, &to_free); 671 } 672 mutex_unlock(&group->mark_mutex); 673 674 clear: 675 while (1) { 676 mutex_lock_nested(&group->mark_mutex, SINGLE_DEPTH_NESTING); 677 if (list_empty(head)) { 678 mutex_unlock(&group->mark_mutex); 679 break; 680 } 681 mark = list_first_entry(head, struct fsnotify_mark, g_list); 682 fsnotify_get_mark(mark); 683 fsnotify_detach_mark(mark); 684 mutex_unlock(&group->mark_mutex); 685 fsnotify_free_mark(mark); 686 fsnotify_put_mark(mark); 687 } 688 } 689 690 /* Destroy all marks attached to an object via connector */ 691 void fsnotify_destroy_marks(fsnotify_connp_t *connp) 692 { 693 struct fsnotify_mark_connector *conn; 694 struct fsnotify_mark *mark, *old_mark = NULL; 695 struct inode *inode; 696 697 conn = fsnotify_grab_connector(connp); 698 if (!conn) 699 return; 700 /* 701 * We have to be careful since we can race with e.g. 702 * fsnotify_clear_marks_by_group() and once we drop the conn->lock, the 703 * list can get modified. However we are holding mark reference and 704 * thus our mark cannot be removed from obj_list so we can continue 705 * iteration after regaining conn->lock. 706 */ 707 hlist_for_each_entry(mark, &conn->list, obj_list) { 708 fsnotify_get_mark(mark); 709 spin_unlock(&conn->lock); 710 if (old_mark) 711 fsnotify_put_mark(old_mark); 712 old_mark = mark; 713 fsnotify_destroy_mark(mark, mark->group); 714 spin_lock(&conn->lock); 715 } 716 /* 717 * Detach list from object now so that we don't pin inode until all 718 * mark references get dropped. It would lead to strange results such 719 * as delaying inode deletion or blocking unmount. 720 */ 721 inode = fsnotify_detach_connector_from_object(conn); 722 spin_unlock(&conn->lock); 723 if (old_mark) 724 fsnotify_put_mark(old_mark); 725 iput(inode); 726 } 727 728 /* 729 * Nothing fancy, just initialize lists and locks and counters. 730 */ 731 void fsnotify_init_mark(struct fsnotify_mark *mark, 732 struct fsnotify_group *group) 733 { 734 memset(mark, 0, sizeof(*mark)); 735 spin_lock_init(&mark->lock); 736 refcount_set(&mark->refcnt, 1); 737 fsnotify_get_group(group); 738 mark->group = group; 739 } 740 741 /* 742 * Destroy all marks in destroy_list, waits for SRCU period to finish before 743 * actually freeing marks. 744 */ 745 static void fsnotify_mark_destroy_workfn(struct work_struct *work) 746 { 747 struct fsnotify_mark *mark, *next; 748 struct list_head private_destroy_list; 749 750 spin_lock(&destroy_lock); 751 /* exchange the list head */ 752 list_replace_init(&destroy_list, &private_destroy_list); 753 spin_unlock(&destroy_lock); 754 755 synchronize_srcu(&fsnotify_mark_srcu); 756 757 list_for_each_entry_safe(mark, next, &private_destroy_list, g_list) { 758 list_del_init(&mark->g_list); 759 fsnotify_final_mark_destroy(mark); 760 } 761 } 762 763 /* Wait for all marks queued for destruction to be actually destroyed */ 764 void fsnotify_wait_marks_destroyed(void) 765 { 766 flush_delayed_work(&reaper_work); 767 } 768