X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libcfs%2Flibcfs%2Flinux%2Flinux-curproc.c;h=cfe1641185617d052fe2da144413241ffeda0204;hb=9ed879b12c07d1f4de2fe55f35318ed8cdd8995c;hp=9ebccb826408e6046a3e2dd98eae72f37d36e90f;hpb=2a8058591bccf6364b11e897a858839ac3887e85;p=fs%2Flustre-release.git diff --git a/libcfs/libcfs/linux/linux-curproc.c b/libcfs/libcfs/linux/linux-curproc.c index 9ebccb8..cfe1641 100644 --- a/libcfs/libcfs/linux/linux-curproc.c +++ b/libcfs/libcfs/linux/linux-curproc.c @@ -55,75 +55,6 @@ * for Linux kernel. */ -uid_t cfs_curproc_uid(void) -{ - return current_uid(); -} - -gid_t cfs_curproc_gid(void) -{ - return current_gid(); -} - -uid_t cfs_curproc_fsuid(void) -{ - return current_fsuid(); -} - -uid_t cfs_curproc_euid(void) -{ - return current_euid(); -} - -uid_t cfs_curproc_egid(void) -{ - return current_egid(); -} - -gid_t cfs_curproc_fsgid(void) -{ - return current_fsgid(); -} - -pid_t cfs_curproc_pid(void) -{ - return current->pid; -} - -int cfs_curproc_groups_nr(void) -{ - int nr; - - task_lock(current); - nr = current_cred()->group_info->ngroups; - task_unlock(current); - return nr; -} - -void cfs_curproc_groups_dump(gid_t *array, int size) -{ - task_lock(current); - size = min_t(int, size, current_cred()->group_info->ngroups); - memcpy(array, current_cred()->group_info->blocks[0], size * sizeof(__u32)); - task_unlock(current); -} - - -int cfs_curproc_is_in_groups(gid_t gid) -{ - return in_group_p(gid); -} - -mode_t cfs_curproc_umask(void) -{ - return current->fs->umask; -} - -char *cfs_curproc_comm(void) -{ - return current->comm; -} - /* Currently all the CFS_CAP_* defines match CAP_* ones. */ #define cfs_cap_pack(cap) (cap) #define cfs_cap_unpack(cap) (cap) @@ -151,7 +82,7 @@ int cfs_cap_raised(cfs_cap_t cap) return cap_raised(current_cap(), cfs_cap_unpack(cap)); } -void cfs_kernel_cap_pack(cfs_kernel_cap_t kcap, cfs_cap_t *cap) +void cfs_kernel_cap_pack(kernel_cap_t kcap, cfs_cap_t *cap) { #if defined (_LINUX_CAPABILITY_VERSION) && _LINUX_CAPABILITY_VERSION == 0x19980330 *cap = cfs_cap_pack(kcap); @@ -165,7 +96,7 @@ void cfs_kernel_cap_pack(cfs_kernel_cap_t kcap, cfs_cap_t *cap) #endif } -void cfs_kernel_cap_unpack(cfs_kernel_cap_t *kcap, cfs_cap_t cap) +void cfs_kernel_cap_unpack(kernel_cap_t *kcap, cfs_cap_t cap) { #if defined (_LINUX_CAPABILITY_VERSION) && _LINUX_CAPABILITY_VERSION == 0x19980330 *kcap = cfs_cap_unpack(cap); @@ -199,21 +130,24 @@ int cfs_capable(cfs_cap_t cap) return capable(cfs_cap_unpack(cap)); } -static int cfs_access_process_vm(struct task_struct *tsk, unsigned long addr, +static int cfs_access_process_vm(struct task_struct *tsk, + struct mm_struct *mm, + unsigned long addr, void *buf, int len, int write) { /* Just copied from kernel for the kernels which doesn't * have access_process_vm() exported */ - struct mm_struct *mm; struct vm_area_struct *vma; struct page *page; void *old_buf = buf; - mm = get_task_mm(tsk); - if (!mm) - return 0; + /* Avoid deadlocks on mmap_sem if called from sys_mmap_pgoff(), + * which is already holding mmap_sem for writes. If some other + * thread gets the write lock in the meantime, this thread will + * block, but at least it won't deadlock on itself. LU-1735 */ + if (down_read_trylock(&mm->mmap_sem) == 0) + return -EDEADLK; - down_read(&mm->mmap_sem); /* ignore errors, just check how much was sucessfully transfered */ while (len) { int bytes, rc, offset; @@ -245,7 +179,6 @@ static int cfs_access_process_vm(struct task_struct *tsk, unsigned long addr, addr += bytes; } up_read(&mm->mmap_sem); - mmput(mm); return buf - old_buf; } @@ -254,7 +187,7 @@ static int cfs_access_process_vm(struct task_struct *tsk, unsigned long addr, int cfs_get_environ(const char *key, char *value, int *val_len) { struct mm_struct *mm; - char *buffer, *tmp_buf = NULL; + char *buffer; int buf_len = PAGE_CACHE_SIZE; int key_len = strlen(key); unsigned long addr; @@ -271,14 +204,6 @@ int cfs_get_environ(const char *key, char *value, int *val_len) RETURN(-EINVAL); } - /* Avoid deadlocks on mmap_sem if called from sys_mmap_pgoff(), - * which is already holding mmap_sem for writes. If some other - * thread gets the write lock in the meantime, this thread will - * block, but at least it won't deadlock on itself. LU-1735 */ - if (down_read_trylock(&mm->mmap_sem) == 0) - return -EDEADLK; - up_read(&mm->mmap_sem); - addr = mm->env_start; while (addr < mm->env_end) { int this_len, retval, scan_len; @@ -287,9 +212,11 @@ int cfs_get_environ(const char *key, char *value, int *val_len) memset(buffer, 0, buf_len); this_len = min_t(int, mm->env_end - addr, buf_len); - retval = cfs_access_process_vm(current, addr, buffer, + retval = cfs_access_process_vm(current, mm, addr, buffer, this_len, 0); - if (retval != this_len) + if (retval < 0) + GOTO(out, rc = retval); + else if (retval != this_len) break; addr += retval; @@ -344,24 +271,10 @@ int cfs_get_environ(const char *key, char *value, int *val_len) out: mmput(mm); kfree((void *)buffer); - if (tmp_buf) - kfree((void *)tmp_buf); return rc; } EXPORT_SYMBOL(cfs_get_environ); -EXPORT_SYMBOL(cfs_curproc_uid); -EXPORT_SYMBOL(cfs_curproc_pid); -EXPORT_SYMBOL(cfs_curproc_euid); -EXPORT_SYMBOL(cfs_curproc_gid); -EXPORT_SYMBOL(cfs_curproc_egid); -EXPORT_SYMBOL(cfs_curproc_fsuid); -EXPORT_SYMBOL(cfs_curproc_fsgid); -EXPORT_SYMBOL(cfs_curproc_umask); -EXPORT_SYMBOL(cfs_curproc_comm); -EXPORT_SYMBOL(cfs_curproc_groups_nr); -EXPORT_SYMBOL(cfs_curproc_groups_dump); -EXPORT_SYMBOL(cfs_curproc_is_in_groups); EXPORT_SYMBOL(cfs_cap_raise); EXPORT_SYMBOL(cfs_cap_lower); EXPORT_SYMBOL(cfs_cap_raised);