From: Stanislav Kinsbursky --- kernel/cpt/rst_files.c | 5 +++++ kernel/cpt/rst_mm.c | 10 +++++++++- mm/mlock.c | 11 +++++++++-- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/kernel/cpt/rst_files.c b/kernel/cpt/rst_files.c index 0cfe181..2330dae 100644 --- a/kernel/cpt/rst_files.c +++ b/kernel/cpt/rst_files.c @@ -777,11 +777,14 @@ static int fixup_file_flags(struct file *file, const struct cred *cred, wprintk_ctx("file %ld mode mismatch %08x %08x\n", (long)pos, file->f_mode, fi->cpt_mode); } if (file->f_flags != fi->cpt_flags) { + unsigned int set_nonblock = 0; + if (!(fi->cpt_flags&O_NOFOLLOW)) file->f_flags &= ~O_NOFOLLOW; if ((file->f_flags^fi->cpt_flags)&O_NONBLOCK) { file->f_flags &= ~O_NONBLOCK; file->f_flags |= fi->cpt_flags&O_NONBLOCK; + set_nonblock = file->f_flags; } if ((file->f_flags ^ fi->cpt_flags) & O_LARGEFILE) { file->f_flags &= ~O_LARGEFILE; @@ -804,6 +807,8 @@ static int fixup_file_flags(struct file *file, const struct cred *cred, if (file->f_flags != fi->cpt_flags) { eprintk_ctx("file %ld flags mismatch %08x %08x\n", (long)pos, file->f_flags, fi->cpt_flags); + if (set_nonblock) + eprintk_ctx("%s: O_NONBLOCK flags: 0x%x\n", __func__, set_nonblock); return -EINVAL; } } diff --git a/kernel/cpt/rst_mm.c b/kernel/cpt/rst_mm.c index fa0bda5..faddb51 100644 --- a/kernel/cpt/rst_mm.c +++ b/kernel/cpt/rst_mm.c @@ -922,7 +922,15 @@ check: if (err == -EFAULT) err = 0; if (err) { - eprintk_ctx("%s: sc_m(un)lock failed\n", __func__); + if (vma->vm_flags&VM_LOCKED) { + eprintk_ctx("%s: mlock failed\n", __func__); + eprintk_ctx("%s: capable(CAP_IPC_LOCK): %d\n", __func__, capable(CAP_IPC_LOCK)); + eprintk_ctx("%s: lock_limit: %ld\n", __func__, current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur >> PAGE_SHIFT); + eprintk_ctx("%s: locked: %ld\n", __func__, current->mm->locked_vm); + eprintk_ctx("%s: to lock: %Ld\n", __func__, (vmai->cpt_end-vmai->cpt_start) >> PAGE_SHIFT); + } else + eprintk_ctx("%s: munlock failed\n", __func__); + goto out; } goto check; diff --git a/mm/mlock.c b/mm/mlock.c index 13ba93a..dcff96a 100644 --- a/mm/mlock.c +++ b/mm/mlock.c @@ -478,8 +478,11 @@ static int do_mlock(unsigned long start, size_t len, int on) if (end == start) return 0; vma = find_vma_prev(current->mm, start, &prev); - if (!vma || vma->vm_start > start) + if (!vma || vma->vm_start > start) { + printk(KERN_ERR "%s: vma(1): %p\n", __func__, vma); + printk(KERN_ERR "%s: vma->vm_start > start: %d\n", __func__, vma->vm_start > start); return -ENOMEM; + } if (start > vma->vm_start) prev = vma; @@ -497,8 +500,10 @@ static int do_mlock(unsigned long start, size_t len, int on) if (tmp > end) tmp = end; error = mlock_fixup(vma, &prev, nstart, tmp, newflags); - if (error) + if (error) { + printk(KERN_ERR "%s: mlock_fixup failed\n", __func__); break; + } nstart = tmp; if (nstart < prev->vm_end) nstart = prev->vm_end; @@ -507,6 +512,8 @@ static int do_mlock(unsigned long start, size_t len, int on) vma = prev->vm_next; if (!vma || vma->vm_start != nstart) { + printk(KERN_ERR "%s: vma(2): %p\n", __func__, vma); + printk(KERN_ERR "%s: vma->vm_start != nstart: %d\n", __func__, vma->vm_start != nstart); error = -ENOMEM; break; }