Loading fs/fs_pin.c +13 −7 Original line number Diff line number Diff line Loading @@ -14,14 +14,20 @@ void pin_remove(struct fs_pin *pin) spin_unlock(&pin_lock); } void pin_insert(struct fs_pin *pin, struct vfsmount *m) void pin_insert_group(struct fs_pin *pin, struct vfsmount *m, struct hlist_head *p) { spin_lock(&pin_lock); hlist_add_head(&pin->s_list, &m->mnt_sb->s_pins); if (p) hlist_add_head(&pin->s_list, p); hlist_add_head(&pin->m_list, &real_mount(m)->mnt_pins); spin_unlock(&pin_lock); } void pin_insert(struct fs_pin *pin, struct vfsmount *m) { pin_insert_group(pin, m, &m->mnt_sb->s_pins); } void mnt_pin_kill(struct mount *m) { while (1) { Loading @@ -38,18 +44,18 @@ void mnt_pin_kill(struct mount *m) } } void sb_pin_kill(struct super_block *sb) void group_pin_kill(struct hlist_head *p) { while (1) { struct hlist_node *p; struct hlist_node *q; struct fs_pin *pin; rcu_read_lock(); p = ACCESS_ONCE(sb->s_pins.first); if (!p) { q = ACCESS_ONCE(p->first); if (!q) { rcu_read_unlock(); break; } pin = hlist_entry(p, struct fs_pin, s_list); pin = hlist_entry(q, struct fs_pin, s_list); pin->kill(pin); } } fs/internal.h +1 −1 Original line number Diff line number Diff line Loading @@ -145,7 +145,7 @@ extern const struct file_operations pipefifo_fops; /* * fs_pin.c */ extern void sb_pin_kill(struct super_block *sb); extern void group_pin_kill(struct hlist_head *p); extern void mnt_pin_kill(struct mount *m); /* Loading fs/super.c +2 −2 Original line number Diff line number Diff line Loading @@ -706,9 +706,9 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) remount_ro = (flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY); if (remount_ro) { if (sb->s_pins.first) { if (!hlist_empty(&sb->s_pins)) { up_write(&sb->s_umount); sb_pin_kill(sb); group_pin_kill(&sb->s_pins); down_write(&sb->s_umount); if (!sb->s_root) return 0; Loading include/linux/fs_pin.h +1 −0 Original line number Diff line number Diff line Loading @@ -7,4 +7,5 @@ struct fs_pin { }; void pin_remove(struct fs_pin *); void pin_insert_group(struct fs_pin *, struct vfsmount *, struct hlist_head *); void pin_insert(struct fs_pin *, struct vfsmount *); Loading
fs/fs_pin.c +13 −7 Original line number Diff line number Diff line Loading @@ -14,14 +14,20 @@ void pin_remove(struct fs_pin *pin) spin_unlock(&pin_lock); } void pin_insert(struct fs_pin *pin, struct vfsmount *m) void pin_insert_group(struct fs_pin *pin, struct vfsmount *m, struct hlist_head *p) { spin_lock(&pin_lock); hlist_add_head(&pin->s_list, &m->mnt_sb->s_pins); if (p) hlist_add_head(&pin->s_list, p); hlist_add_head(&pin->m_list, &real_mount(m)->mnt_pins); spin_unlock(&pin_lock); } void pin_insert(struct fs_pin *pin, struct vfsmount *m) { pin_insert_group(pin, m, &m->mnt_sb->s_pins); } void mnt_pin_kill(struct mount *m) { while (1) { Loading @@ -38,18 +44,18 @@ void mnt_pin_kill(struct mount *m) } } void sb_pin_kill(struct super_block *sb) void group_pin_kill(struct hlist_head *p) { while (1) { struct hlist_node *p; struct hlist_node *q; struct fs_pin *pin; rcu_read_lock(); p = ACCESS_ONCE(sb->s_pins.first); if (!p) { q = ACCESS_ONCE(p->first); if (!q) { rcu_read_unlock(); break; } pin = hlist_entry(p, struct fs_pin, s_list); pin = hlist_entry(q, struct fs_pin, s_list); pin->kill(pin); } }
fs/internal.h +1 −1 Original line number Diff line number Diff line Loading @@ -145,7 +145,7 @@ extern const struct file_operations pipefifo_fops; /* * fs_pin.c */ extern void sb_pin_kill(struct super_block *sb); extern void group_pin_kill(struct hlist_head *p); extern void mnt_pin_kill(struct mount *m); /* Loading
fs/super.c +2 −2 Original line number Diff line number Diff line Loading @@ -706,9 +706,9 @@ int do_remount_sb(struct super_block *sb, int flags, void *data, int force) remount_ro = (flags & MS_RDONLY) && !(sb->s_flags & MS_RDONLY); if (remount_ro) { if (sb->s_pins.first) { if (!hlist_empty(&sb->s_pins)) { up_write(&sb->s_umount); sb_pin_kill(sb); group_pin_kill(&sb->s_pins); down_write(&sb->s_umount); if (!sb->s_root) return 0; Loading
include/linux/fs_pin.h +1 −0 Original line number Diff line number Diff line Loading @@ -7,4 +7,5 @@ struct fs_pin { }; void pin_remove(struct fs_pin *); void pin_insert_group(struct fs_pin *, struct vfsmount *, struct hlist_head *); void pin_insert(struct fs_pin *, struct vfsmount *);