On Mon, Apr 02, 2012 at 09:14:44PM +0400, Konstantin Khlebnikov wrote: ... > > > >Ah, it's about locking. I misundertand it at first. > >Oleg, forget about my email then. > > Yes, it's about locking. Please review patch for your code from attachment. Thanks a lot, Konstantin! This should do the trick. > diff --git a/include/linux/sched.h b/include/linux/sched.h > index cff94cd..4a41270 100644 > --- a/include/linux/sched.h > +++ b/include/linux/sched.h > @@ -437,6 +437,7 @@ extern int get_dumpable(struct mm_struct *mm); > /* leave room for more dump flags */ > #define MMF_VM_MERGEABLE 16 /* KSM may merge identical pages */ > #define MMF_VM_HUGEPAGE 17 /* set when VM_HUGEPAGE is set on vma */ > +#define MMF_EXE_FILE_CHANGED 18 /* see prctl(PR_SET_MM_EXE_FILE) */ > > #define MMF_INIT_MASK (MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK) > > diff --git a/kernel/sys.c b/kernel/sys.c > index da660f3..b217069 100644 > --- a/kernel/sys.c > +++ b/kernel/sys.c > @@ -1714,17 +1714,11 @@ static bool vma_flags_mismatch(struct vm_area_struct *vma, > > static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd) > { > + struct vm_area_struct *vma; > struct file *exe_file; > struct dentry *dentry; > int err; > > - /* > - * Setting new mm::exe_file is only allowed when no VM_EXECUTABLE vma's > - * remain. So perform a quick test first. > - */ > - if (mm->num_exe_file_vmas) > - return -EBUSY; > - > exe_file = fget(fd); > if (!exe_file) > return -EBADF; > @@ -1745,17 +1739,28 @@ static int prctl_set_mm_exe_file(struct mm_struct *mm, unsigned int fd) > if (err) > goto exit; > > + down_write(&mm->mmap_sem); > + /* > + * Forbid mm->exe_file change if there are mapped some other files. > + */ > + err = -EEXIST; > + for (vma = mm->mmap; vma; vma = vma->vm_next) { > + if (vma->vm_file && > + !path_equal(&vma->vm_file->f_path, &exe_file->f_path)) > + goto out_unlock; > + } If I understand right, this snippet is emulating old behaviour (ie as it was with num_exe_file_vmas), thus -EBUSY might be more appropriate? But it's really a small nit I think. Thanks again. Cyrill -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>