On Fri, Jan 26, 2018 at 03:09:53PM -0800, Omar Sandoval wrote: > +static int sb_reachable(struct super_block *sb, struct mnt_namespace *mnt_ns) bool return value, surely? > -static void sync_fs_one_sb(struct super_block *sb, void *arg) > +static void sync_fs_one_sb(struct super_block *sb, void *p) > { > - if (!sb_rdonly(sb) && sb->s_op->sync_fs) > - sb->s_op->sync_fs(sb, *(int *)arg); > + struct sb_sync *arg = p; > + > + if (!sb_rdonly(sb) && sb_reachable(sb, arg->mnt_ns) && > + sb->s_op->sync_fs) > + sb->s_op->sync_fs(sb, arg->wait); The order of tests seems wrong. There's no point in doing the expensive "is it reachable" test before the cheap "can we sync it" test. > { > - int nowait = 0, wait = 1; > + struct sb_sync arg = { > + .mnt_ns = current->nsproxy->mnt_ns, > + }; > + > + if (arg.mnt_ns == init_task.nsproxy->mnt_ns) > + arg.mnt_ns = NULL; Why is the root namespace special? That at least needs a comment.