base.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:23k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/fs/proc/base.c
  3.  *
  4.  *  Copyright (C) 1991, 1992 Linus Torvalds
  5.  *
  6.  *  proc base directory handling functions
  7.  *
  8.  *  1999, Al Viro. Rewritten. Now it covers the whole per-process part.
  9.  *  Instead of using magical inumbers to determine the kind of object
  10.  *  we allocate and fill in-core inodes upon lookup. They don't even
  11.  *  go into icache. We cache the reference to task_struct upon lookup too.
  12.  *  Eventually it should become a filesystem in its own. We don't use the
  13.  *  rest of procfs anymore.
  14.  */
  15. #include <asm/uaccess.h>
  16. #include <linux/config.h>
  17. #include <linux/errno.h>
  18. #include <linux/sched.h>
  19. #include <linux/proc_fs.h>
  20. #include <linux/stat.h>
  21. #include <linux/init.h>
  22. #include <linux/file.h>
  23. #include <linux/string.h>
  24. /*
  25.  * For hysterical raisins we keep the same inumbers as in the old procfs.
  26.  * Feel free to change the macro below - just keep the range distinct from
  27.  * inumbers of the rest of procfs (currently those are in 0x0000--0xffff).
  28.  * As soon as we'll get a separate superblock we will be able to forget
  29.  * about magical ranges too.
  30.  */
  31. #define fake_ino(pid,ino) (((pid)<<16)|(ino))
  32. ssize_t proc_pid_read_maps(struct task_struct*,struct file*,char*,size_t,loff_t*);
  33. int proc_pid_stat(struct task_struct*,char*);
  34. int proc_pid_status(struct task_struct*,char*);
  35. int proc_pid_statm(struct task_struct*,char*);
  36. int proc_pid_cpu(struct task_struct*,char*);
  37. static int proc_fd_link(struct inode *inode, struct dentry **dentry, struct vfsmount **mnt)
  38. {
  39. if (inode->u.proc_i.file) {
  40. *mnt = mntget(inode->u.proc_i.file->f_vfsmnt);
  41. *dentry = dget(inode->u.proc_i.file->f_dentry);
  42. return 0;
  43. }
  44. return -ENOENT;
  45. }
  46. static int proc_exe_link(struct inode *inode, struct dentry **dentry, struct vfsmount **mnt)
  47. {
  48. struct mm_struct * mm;
  49. struct vm_area_struct * vma;
  50. int result = -ENOENT;
  51. struct task_struct *task = inode->u.proc_i.task;
  52. task_lock(task);
  53. mm = task->mm;
  54. if (mm)
  55. atomic_inc(&mm->mm_users);
  56. task_unlock(task);
  57. if (!mm)
  58. goto out;
  59. down_read(&mm->mmap_sem);
  60. vma = mm->mmap;
  61. while (vma) {
  62. if ((vma->vm_flags & VM_EXECUTABLE) && 
  63.     vma->vm_file) {
  64. *mnt = mntget(vma->vm_file->f_vfsmnt);
  65. *dentry = dget(vma->vm_file->f_dentry);
  66. result = 0;
  67. break;
  68. }
  69. vma = vma->vm_next;
  70. }
  71. up_read(&mm->mmap_sem);
  72. mmput(mm);
  73. out:
  74. return result;
  75. }
  76. static int proc_cwd_link(struct inode *inode, struct dentry **dentry, struct vfsmount **mnt)
  77. {
  78. struct fs_struct *fs;
  79. int result = -ENOENT;
  80. task_lock(inode->u.proc_i.task);
  81. fs = inode->u.proc_i.task->fs;
  82. if(fs)
  83. atomic_inc(&fs->count);
  84. task_unlock(inode->u.proc_i.task);
  85. if (fs) {
  86. read_lock(&fs->lock);
  87. *mnt = mntget(fs->pwdmnt);
  88. *dentry = dget(fs->pwd);
  89. read_unlock(&fs->lock);
  90. result = 0;
  91. put_fs_struct(fs);
  92. }
  93. return result;
  94. }
  95. static int proc_root_link(struct inode *inode, struct dentry **dentry, struct vfsmount **mnt)
  96. {
  97. struct fs_struct *fs;
  98. int result = -ENOENT;
  99. task_lock(inode->u.proc_i.task);
  100. fs = inode->u.proc_i.task->fs;
  101. if(fs)
  102. atomic_inc(&fs->count);
  103. task_unlock(inode->u.proc_i.task);
  104. if (fs) {
  105. read_lock(&fs->lock);
  106. *mnt = mntget(fs->rootmnt);
  107. *dentry = dget(fs->root);
  108. read_unlock(&fs->lock);
  109. result = 0;
  110. put_fs_struct(fs);
  111. }
  112. return result;
  113. }
  114. static int proc_pid_environ(struct task_struct *task, char * buffer)
  115. {
  116. struct mm_struct *mm;
  117. int res = 0;
  118. task_lock(task);
  119. mm = task->mm;
  120. if (mm)
  121. atomic_inc(&mm->mm_users);
  122. task_unlock(task);
  123. if (mm) {
  124. int len = mm->env_end - mm->env_start;
  125. if (len > PAGE_SIZE)
  126. len = PAGE_SIZE;
  127. res = access_process_vm(task, mm->env_start, buffer, len, 0);
  128. mmput(mm);
  129. }
  130. return res;
  131. }
  132. static int proc_pid_cmdline(struct task_struct *task, char * buffer)
  133. {
  134. struct mm_struct *mm;
  135. int res = 0;
  136. task_lock(task);
  137. mm = task->mm;
  138. if (mm)
  139. atomic_inc(&mm->mm_users);
  140. task_unlock(task);
  141. if (mm) {
  142. int len = mm->arg_end - mm->arg_start;
  143. if (len > PAGE_SIZE)
  144. len = PAGE_SIZE;
  145. res = access_process_vm(task, mm->arg_start, buffer, len, 0);
  146. // If the nul at the end of args has been overwritten, then
  147. // assume application is using setproctitle(3).
  148. if ( res > 0 && buffer[res-1] != '' )
  149. {
  150. len = strnlen( buffer, res );
  151. if ( len < res )
  152. {
  153.     res = len;
  154. }
  155. else
  156. {
  157. len = mm->env_end - mm->env_start;
  158. if (len > PAGE_SIZE - res)
  159. len = PAGE_SIZE - res;
  160. res += access_process_vm(task, mm->env_start, buffer+res, len, 0);
  161. res = strnlen( buffer, res );
  162. }
  163. }
  164. mmput(mm);
  165. }
  166. return res;
  167. }
  168. /************************************************************************/
  169. /*                       Here the fs part begins                        */
  170. /************************************************************************/
  171. /* permission checks */
  172. static int proc_check_root(struct inode *inode)
  173. {
  174. struct dentry *de, *base, *root;
  175. struct vfsmount *our_vfsmnt, *vfsmnt, *mnt;
  176. int res = 0;
  177. if (proc_root_link(inode, &root, &vfsmnt)) /* Ewww... */
  178. return -ENOENT;
  179. read_lock(&current->fs->lock);
  180. our_vfsmnt = mntget(current->fs->rootmnt);
  181. base = dget(current->fs->root);
  182. read_unlock(&current->fs->lock);
  183. spin_lock(&dcache_lock);
  184. de = root;
  185. mnt = vfsmnt;
  186. while (vfsmnt != our_vfsmnt) {
  187. if (vfsmnt == vfsmnt->mnt_parent)
  188. goto out;
  189. de = vfsmnt->mnt_mountpoint;
  190. vfsmnt = vfsmnt->mnt_parent;
  191. }
  192. if (!is_subdir(de, base))
  193. goto out;
  194. spin_unlock(&dcache_lock);
  195. exit:
  196. dput(base);
  197. mntput(our_vfsmnt);
  198. dput(root);
  199. mntput(mnt);
  200. return res;
  201. out:
  202. spin_unlock(&dcache_lock);
  203. res = -EACCES;
  204. goto exit;
  205. }
  206. static int proc_permission(struct inode *inode, int mask)
  207. {
  208. if (vfs_permission(inode, mask) != 0)
  209. return -EACCES;
  210. return proc_check_root(inode);
  211. }
  212. static ssize_t pid_maps_read(struct file * file, char * buf,
  213.       size_t count, loff_t *ppos)
  214. {
  215. struct inode * inode = file->f_dentry->d_inode;
  216. struct task_struct *task = inode->u.proc_i.task;
  217. ssize_t res;
  218. res = proc_pid_read_maps(task, file, buf, count, ppos);
  219. return res;
  220. }
  221. static struct file_operations proc_maps_operations = {
  222. read: pid_maps_read,
  223. };
  224. #define PROC_BLOCK_SIZE (3*1024) /* 4K page size but our output routines use some slack for overruns */
  225. static ssize_t proc_info_read(struct file * file, char * buf,
  226.   size_t count, loff_t *ppos)
  227. {
  228. struct inode * inode = file->f_dentry->d_inode;
  229. unsigned long page;
  230. ssize_t length;
  231. ssize_t end;
  232. struct task_struct *task = inode->u.proc_i.task;
  233. if (count > PROC_BLOCK_SIZE)
  234. count = PROC_BLOCK_SIZE;
  235. if (!(page = __get_free_page(GFP_KERNEL)))
  236. return -ENOMEM;
  237. length = inode->u.proc_i.op.proc_read(task, (char*)page);
  238. if (length < 0) {
  239. free_page(page);
  240. return length;
  241. }
  242. /* Static 4kB (or whatever) block capacity */
  243. if (*ppos >= length) {
  244. free_page(page);
  245. return 0;
  246. }
  247. if (count + *ppos > length)
  248. count = length - *ppos;
  249. end = count + *ppos;
  250. copy_to_user(buf, (char *) page + *ppos, count);
  251. *ppos = end;
  252. free_page(page);
  253. return count;
  254. }
  255. static struct file_operations proc_info_file_operations = {
  256. read: proc_info_read,
  257. };
  258. #define MAY_PTRACE(p) 
  259. (p==current||(p->p_pptr==current&&(p->ptrace & PT_PTRACED)&&p->state==TASK_STOPPED))
  260. static int mem_open(struct inode* inode, struct file* file)
  261. {
  262. file->private_data = (void*)((long)current->self_exec_id);
  263. return 0;
  264. }
  265. static ssize_t mem_read(struct file * file, char * buf,
  266. size_t count, loff_t *ppos)
  267. {
  268. struct task_struct *task = file->f_dentry->d_inode->u.proc_i.task;
  269. char *page;
  270. unsigned long src = *ppos;
  271. int copied = 0;
  272. struct mm_struct *mm;
  273. if (!MAY_PTRACE(task))
  274. return -ESRCH;
  275. page = (char *)__get_free_page(GFP_USER);
  276. if (!page)
  277. return -ENOMEM;
  278. task_lock(task);
  279. mm = task->mm;
  280. if (mm)
  281. atomic_inc(&mm->mm_users);
  282. task_unlock(task);
  283. if (!mm)
  284. return 0;
  285. if (file->private_data != (void*)((long)current->self_exec_id) ) {
  286. mmput(mm);
  287. return -EIO;
  288. }
  289. while (count > 0) {
  290. int this_len, retval;
  291. this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count;
  292. retval = access_process_vm(task, src, page, this_len, 0);
  293. if (!retval) {
  294. if (!copied)
  295. copied = -EIO;
  296. break;
  297. }
  298. if (copy_to_user(buf, page, retval)) {
  299. copied = -EFAULT;
  300. break;
  301. }
  302. copied += retval;
  303. src += retval;
  304. buf += retval;
  305. count -= retval;
  306. }
  307. *ppos = src;
  308. mmput(mm);
  309. free_page((unsigned long) page);
  310. return copied;
  311. }
  312. #define mem_write NULL
  313. #ifndef mem_write
  314. /* This is a security hazard */
  315. static ssize_t mem_write(struct file * file, const char * buf,
  316.  size_t count, loff_t *ppos)
  317. {
  318. int copied = 0;
  319. char *page;
  320. struct task_struct *task = file->f_dentry->d_inode->u.proc_i.task;
  321. unsigned long dst = *ppos;
  322. if (!MAY_PTRACE(task))
  323. return -ESRCH;
  324. page = (char *)__get_free_page(GFP_USER);
  325. if (!page)
  326. return -ENOMEM;
  327. while (count > 0) {
  328. int this_len, retval;
  329. this_len = (count > PAGE_SIZE) ? PAGE_SIZE : count;
  330. if (copy_from_user(page, buf, this_len)) {
  331. copied = -EFAULT;
  332. break;
  333. }
  334. retval = access_process_vm(task, dst, page, this_len, 1);
  335. if (!retval) {
  336. if (!copied)
  337. copied = -EIO;
  338. break;
  339. }
  340. copied += retval;
  341. buf += retval;
  342. dst += retval;
  343. count -= retval;
  344. }
  345. *ppos = dst;
  346. free_page((unsigned long) page);
  347. return copied;
  348. }
  349. #endif
  350. static struct file_operations proc_mem_operations = {
  351. read: mem_read,
  352. write: mem_write,
  353. open: mem_open,
  354. };
  355. static struct inode_operations proc_mem_inode_operations = {
  356. permission: proc_permission,
  357. };
  358. static int proc_pid_follow_link(struct dentry *dentry, struct nameidata *nd)
  359. {
  360. struct inode *inode = dentry->d_inode;
  361. int error = -EACCES;
  362. /* We don't need a base pointer in the /proc filesystem */
  363. path_release(nd);
  364. if (current->fsuid != inode->i_uid && !capable(CAP_DAC_OVERRIDE))
  365. goto out;
  366. error = proc_check_root(inode);
  367. if (error)
  368. goto out;
  369. error = inode->u.proc_i.op.proc_get_link(inode, &nd->dentry, &nd->mnt);
  370. nd->last_type = LAST_BIND;
  371. out:
  372. return error;
  373. }
  374. static int do_proc_readlink(struct dentry *dentry, struct vfsmount *mnt,
  375.     char * buffer, int buflen)
  376. {
  377. struct inode * inode;
  378. char * tmp = (char*)__get_free_page(GFP_KERNEL), *path;
  379. int len;
  380. if (!tmp)
  381. return -ENOMEM;
  382. inode = dentry->d_inode;
  383. path = d_path(dentry, mnt, tmp, PAGE_SIZE);
  384. len = tmp + PAGE_SIZE - 1 - path;
  385. if (len < buflen)
  386. buflen = len;
  387. copy_to_user(buffer, path, buflen);
  388. free_page((unsigned long)tmp);
  389. return buflen;
  390. }
  391. static int proc_pid_readlink(struct dentry * dentry, char * buffer, int buflen)
  392. {
  393. int error = -EACCES;
  394. struct inode *inode = dentry->d_inode;
  395. struct dentry *de;
  396. struct vfsmount *mnt = NULL;
  397. if (current->fsuid != inode->i_uid && !capable(CAP_DAC_OVERRIDE))
  398. goto out;
  399. error = proc_check_root(inode);
  400. if (error)
  401. goto out;
  402. error = inode->u.proc_i.op.proc_get_link(inode, &de, &mnt);
  403. if (error)
  404. goto out;
  405. error = do_proc_readlink(de, mnt, buffer, buflen);
  406. dput(de);
  407. mntput(mnt);
  408. out:
  409. return error;
  410. }
  411. static struct inode_operations proc_pid_link_inode_operations = {
  412. readlink: proc_pid_readlink,
  413. follow_link: proc_pid_follow_link
  414. };
  415. struct pid_entry {
  416. int type;
  417. int len;
  418. char *name;
  419. mode_t mode;
  420. };
  421. enum pid_directory_inos {
  422. PROC_PID_INO = 2,
  423. PROC_PID_STATUS,
  424. PROC_PID_MEM,
  425. PROC_PID_CWD,
  426. PROC_PID_ROOT,
  427. PROC_PID_EXE,
  428. PROC_PID_FD,
  429. PROC_PID_ENVIRON,
  430. PROC_PID_CMDLINE,
  431. PROC_PID_STAT,
  432. PROC_PID_STATM,
  433. PROC_PID_MAPS,
  434. PROC_PID_CPU,
  435. PROC_PID_FD_DIR = 0x8000, /* 0x8000-0xffff */
  436. };
  437. #define E(type,name,mode) {(type),sizeof(name)-1,(name),(mode)}
  438. static struct pid_entry base_stuff[] = {
  439.   E(PROC_PID_FD, "fd", S_IFDIR|S_IRUSR|S_IXUSR),
  440.   E(PROC_PID_ENVIRON, "environ", S_IFREG|S_IRUSR),
  441.   E(PROC_PID_STATUS, "status", S_IFREG|S_IRUGO),
  442.   E(PROC_PID_CMDLINE, "cmdline", S_IFREG|S_IRUGO),
  443.   E(PROC_PID_STAT, "stat", S_IFREG|S_IRUGO),
  444.   E(PROC_PID_STATM, "statm", S_IFREG|S_IRUGO),
  445. #ifdef CONFIG_SMP
  446.   E(PROC_PID_CPU, "cpu", S_IFREG|S_IRUGO),
  447. #endif
  448.   E(PROC_PID_MAPS, "maps", S_IFREG|S_IRUGO),
  449.   E(PROC_PID_MEM, "mem", S_IFREG|S_IRUSR|S_IWUSR),
  450.   E(PROC_PID_CWD, "cwd", S_IFLNK|S_IRWXUGO),
  451.   E(PROC_PID_ROOT, "root", S_IFLNK|S_IRWXUGO),
  452.   E(PROC_PID_EXE, "exe", S_IFLNK|S_IRWXUGO),
  453.   {0,0,NULL,0}
  454. };
  455. #undef E
  456. #define NUMBUF 10
  457. static int proc_readfd(struct file * filp, void * dirent, filldir_t filldir)
  458. {
  459. struct inode *inode = filp->f_dentry->d_inode;
  460. struct task_struct *p = inode->u.proc_i.task;
  461. unsigned int fd, pid, ino;
  462. int retval;
  463. char buf[NUMBUF];
  464. struct files_struct * files;
  465. retval = 0;
  466. pid = p->pid;
  467. fd = filp->f_pos;
  468. switch (fd) {
  469. case 0:
  470. if (filldir(dirent, ".", 1, 0, inode->i_ino, DT_DIR) < 0)
  471. goto out;
  472. filp->f_pos++;
  473. case 1:
  474. ino = fake_ino(pid, PROC_PID_INO);
  475. if (filldir(dirent, "..", 2, 1, ino, DT_DIR) < 0)
  476. goto out;
  477. filp->f_pos++;
  478. default:
  479. task_lock(p);
  480. files = p->files;
  481. if (files)
  482. atomic_inc(&files->count);
  483. task_unlock(p);
  484. if (!files)
  485. goto out;
  486. read_lock(&files->file_lock);
  487. for (fd = filp->f_pos-2;
  488.      fd < files->max_fds;
  489.      fd++, filp->f_pos++) {
  490. unsigned int i,j;
  491. if (!fcheck_files(files, fd))
  492. continue;
  493. read_unlock(&files->file_lock);
  494. j = NUMBUF;
  495. i = fd;
  496. do {
  497. j--;
  498. buf[j] = '0' + (i % 10);
  499. i /= 10;
  500. } while (i);
  501. ino = fake_ino(pid, PROC_PID_FD_DIR + fd);
  502. if (filldir(dirent, buf+j, NUMBUF-j, fd+2, ino, DT_LNK) < 0) {
  503. read_lock(&files->file_lock);
  504. break;
  505. }
  506. read_lock(&files->file_lock);
  507. }
  508. read_unlock(&files->file_lock);
  509. put_files_struct(files);
  510. }
  511. out:
  512. return retval;
  513. }
  514. static int proc_base_readdir(struct file * filp,
  515. void * dirent, filldir_t filldir)
  516. {
  517. int i;
  518. int pid;
  519. struct inode *inode = filp->f_dentry->d_inode;
  520. struct pid_entry *p;
  521. pid = inode->u.proc_i.task->pid;
  522. if (!pid)
  523. return -ENOENT;
  524. i = filp->f_pos;
  525. switch (i) {
  526. case 0:
  527. if (filldir(dirent, ".", 1, i, inode->i_ino, DT_DIR) < 0)
  528. return 0;
  529. i++;
  530. filp->f_pos++;
  531. /* fall through */
  532. case 1:
  533. if (filldir(dirent, "..", 2, i, PROC_ROOT_INO, DT_DIR) < 0)
  534. return 0;
  535. i++;
  536. filp->f_pos++;
  537. /* fall through */
  538. default:
  539. i -= 2;
  540. if (i>=sizeof(base_stuff)/sizeof(base_stuff[0]))
  541. return 1;
  542. p = base_stuff + i;
  543. while (p->name) {
  544. if (filldir(dirent, p->name, p->len, filp->f_pos,
  545.     fake_ino(pid, p->type), p->mode >> 12) < 0)
  546. return 0;
  547. filp->f_pos++;
  548. p++;
  549. }
  550. }
  551. return 1;
  552. }
  553. /* building an inode */
  554. static int task_dumpable(struct task_struct *task)
  555. {
  556. int dumpable = 0;
  557. struct mm_struct *mm;
  558. task_lock(task);
  559. mm = task->mm;
  560. if (mm)
  561. dumpable = mm->dumpable;
  562. task_unlock(task);
  563. return dumpable;
  564. }
  565. static struct inode *proc_pid_make_inode(struct super_block * sb, struct task_struct *task, int ino)
  566. {
  567. struct inode * inode;
  568. /* We need a new inode */
  569. inode = new_inode(sb);
  570. if (!inode)
  571. goto out;
  572. /* Common stuff */
  573. inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
  574. inode->i_ino = fake_ino(task->pid, ino);
  575. if (!task->pid)
  576. goto out_unlock;
  577. /*
  578.  * grab the reference to task.
  579.  */
  580. get_task_struct(task);
  581. inode->u.proc_i.task = task;
  582. inode->i_uid = 0;
  583. inode->i_gid = 0;
  584. if (ino == PROC_PID_INO || task_dumpable(task)) {
  585. inode->i_uid = task->euid;
  586. inode->i_gid = task->egid;
  587. }
  588. out:
  589. return inode;
  590. out_unlock:
  591. iput(inode);
  592. return NULL;
  593. }
  594. /* dentry stuff */
  595. static int pid_fd_revalidate(struct dentry * dentry, int flags)
  596. {
  597. return 0;
  598. }
  599. /*
  600.  * Exceptional case: normally we are not allowed to unhash a busy
  601.  * directory. In this case, however, we can do it - no aliasing problems
  602.  * due to the way we treat inodes.
  603.  */
  604. static int pid_base_revalidate(struct dentry * dentry, int flags)
  605. {
  606. if (dentry->d_inode->u.proc_i.task->pid)
  607. return 1;
  608. d_drop(dentry);
  609. return 0;
  610. }
  611. static int pid_delete_dentry(struct dentry * dentry)
  612. {
  613. return 1;
  614. }
  615. static struct dentry_operations pid_fd_dentry_operations =
  616. {
  617. d_revalidate: pid_fd_revalidate,
  618. d_delete: pid_delete_dentry,
  619. };
  620. static struct dentry_operations pid_dentry_operations =
  621. {
  622. d_delete: pid_delete_dentry,
  623. };
  624. static struct dentry_operations pid_base_dentry_operations =
  625. {
  626. d_revalidate: pid_base_revalidate,
  627. d_delete: pid_delete_dentry,
  628. };
  629. /* Lookups */
  630. #define MAX_MULBY10 ((~0U-9)/10)
  631. static struct dentry *proc_lookupfd(struct inode * dir, struct dentry * dentry)
  632. {
  633. unsigned int fd, c;
  634. struct task_struct *task = dir->u.proc_i.task;
  635. struct file * file;
  636. struct files_struct * files;
  637. struct inode *inode;
  638. const char *name;
  639. int len;
  640. fd = 0;
  641. len = dentry->d_name.len;
  642. name = dentry->d_name.name;
  643. if (len > 1 && *name == '0') goto out;
  644. while (len-- > 0) {
  645. c = *name - '0';
  646. name++;
  647. if (c > 9)
  648. goto out;
  649. if (fd >= MAX_MULBY10)
  650. goto out;
  651. fd *= 10;
  652. fd += c;
  653. }
  654. inode = proc_pid_make_inode(dir->i_sb, task, PROC_PID_FD_DIR+fd);
  655. if (!inode)
  656. goto out;
  657. task_lock(task);
  658. files = task->files;
  659. if (files)
  660. atomic_inc(&files->count);
  661. task_unlock(task);
  662. if (!files)
  663. goto out_unlock;
  664. read_lock(&files->file_lock);
  665. file = inode->u.proc_i.file = fcheck_files(files, fd);
  666. if (!file)
  667. goto out_unlock2;
  668. get_file(file);
  669. read_unlock(&files->file_lock);
  670. put_files_struct(files);
  671. inode->i_op = &proc_pid_link_inode_operations;
  672. inode->i_size = 64;
  673. inode->i_mode = S_IFLNK;
  674. inode->u.proc_i.op.proc_get_link = proc_fd_link;
  675. if (file->f_mode & 1)
  676. inode->i_mode |= S_IRUSR | S_IXUSR;
  677. if (file->f_mode & 2)
  678. inode->i_mode |= S_IWUSR | S_IXUSR;
  679. dentry->d_op = &pid_fd_dentry_operations;
  680. d_add(dentry, inode);
  681. return NULL;
  682. out_unlock2:
  683. put_files_struct(files);
  684. read_unlock(&files->file_lock);
  685. out_unlock:
  686. iput(inode);
  687. out:
  688. return ERR_PTR(-ENOENT);
  689. }
  690. static struct file_operations proc_fd_operations = {
  691. read: generic_read_dir,
  692. readdir: proc_readfd,
  693. };
  694. /*
  695.  * proc directories can do almost nothing..
  696.  */
  697. static struct inode_operations proc_fd_inode_operations = {
  698. lookup: proc_lookupfd,
  699. permission: proc_permission,
  700. };
  701. static struct dentry *proc_base_lookup(struct inode *dir, struct dentry *dentry)
  702. {
  703. struct inode *inode;
  704. int error;
  705. struct task_struct *task = dir->u.proc_i.task;
  706. struct pid_entry *p;
  707. error = -ENOENT;
  708. inode = NULL;
  709. for (p = base_stuff; p->name; p++) {
  710. if (p->len != dentry->d_name.len)
  711. continue;
  712. if (!memcmp(dentry->d_name.name, p->name, p->len))
  713. break;
  714. }
  715. if (!p->name)
  716. goto out;
  717. error = -EINVAL;
  718. inode = proc_pid_make_inode(dir->i_sb, task, p->type);
  719. if (!inode)
  720. goto out;
  721. inode->i_mode = p->mode;
  722. /*
  723.  * Yes, it does not scale. And it should not. Don't add
  724.  * new entries into /proc/<pid>/ without very good reasons.
  725.  */
  726. switch(p->type) {
  727. case PROC_PID_FD:
  728. inode->i_nlink = 2;
  729. inode->i_op = &proc_fd_inode_operations;
  730. inode->i_fop = &proc_fd_operations;
  731. break;
  732. case PROC_PID_EXE:
  733. inode->i_op = &proc_pid_link_inode_operations;
  734. inode->u.proc_i.op.proc_get_link = proc_exe_link;
  735. break;
  736. case PROC_PID_CWD:
  737. inode->i_op = &proc_pid_link_inode_operations;
  738. inode->u.proc_i.op.proc_get_link = proc_cwd_link;
  739. break;
  740. case PROC_PID_ROOT:
  741. inode->i_op = &proc_pid_link_inode_operations;
  742. inode->u.proc_i.op.proc_get_link = proc_root_link;
  743. break;
  744. case PROC_PID_ENVIRON:
  745. inode->i_fop = &proc_info_file_operations;
  746. inode->u.proc_i.op.proc_read = proc_pid_environ;
  747. break;
  748. case PROC_PID_STATUS:
  749. inode->i_fop = &proc_info_file_operations;
  750. inode->u.proc_i.op.proc_read = proc_pid_status;
  751. break;
  752. case PROC_PID_STAT:
  753. inode->i_fop = &proc_info_file_operations;
  754. inode->u.proc_i.op.proc_read = proc_pid_stat;
  755. break;
  756. case PROC_PID_CMDLINE:
  757. inode->i_fop = &proc_info_file_operations;
  758. inode->u.proc_i.op.proc_read = proc_pid_cmdline;
  759. break;
  760. case PROC_PID_STATM:
  761. inode->i_fop = &proc_info_file_operations;
  762. inode->u.proc_i.op.proc_read = proc_pid_statm;
  763. break;
  764. case PROC_PID_MAPS:
  765. inode->i_fop = &proc_maps_operations;
  766. break;
  767. #ifdef CONFIG_SMP
  768. case PROC_PID_CPU:
  769. inode->i_fop = &proc_info_file_operations;
  770. inode->u.proc_i.op.proc_read = proc_pid_cpu;
  771. break;
  772. #endif
  773. case PROC_PID_MEM:
  774. inode->i_op = &proc_mem_inode_operations;
  775. inode->i_fop = &proc_mem_operations;
  776. break;
  777. default:
  778. printk("procfs: impossible type (%d)",p->type);
  779. iput(inode);
  780. return ERR_PTR(-EINVAL);
  781. }
  782. dentry->d_op = &pid_dentry_operations;
  783. d_add(dentry, inode);
  784. return NULL;
  785. out:
  786. return ERR_PTR(error);
  787. }
  788. static struct file_operations proc_base_operations = {
  789. read: generic_read_dir,
  790. readdir: proc_base_readdir,
  791. };
  792. static struct inode_operations proc_base_inode_operations = {
  793. lookup: proc_base_lookup,
  794. };
  795. /*
  796.  * /proc/self:
  797.  */
  798. static int proc_self_readlink(struct dentry *dentry, char *buffer, int buflen)
  799. {
  800. char tmp[30];
  801. sprintf(tmp, "%d", current->pid);
  802. return vfs_readlink(dentry,buffer,buflen,tmp);
  803. }
  804. static int proc_self_follow_link(struct dentry *dentry, struct nameidata *nd)
  805. {
  806. char tmp[30];
  807. sprintf(tmp, "%d", current->pid);
  808. return vfs_follow_link(nd,tmp);
  809. }
  810. static struct inode_operations proc_self_inode_operations = {
  811. readlink: proc_self_readlink,
  812. follow_link: proc_self_follow_link,
  813. };
  814. struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry)
  815. {
  816. unsigned int pid, c;
  817. struct task_struct *task;
  818. const char *name;
  819. struct inode *inode;
  820. int len;
  821. pid = 0;
  822. name = dentry->d_name.name;
  823. len = dentry->d_name.len;
  824. if (len == 4 && !memcmp(name, "self", 4)) {
  825. inode = new_inode(dir->i_sb);
  826. if (!inode)
  827. return ERR_PTR(-ENOMEM);
  828. inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
  829. inode->i_ino = fake_ino(0, PROC_PID_INO);
  830. inode->u.proc_i.file = NULL;
  831. inode->u.proc_i.task = NULL;
  832. inode->i_mode = S_IFLNK|S_IRWXUGO;
  833. inode->i_uid = inode->i_gid = 0;
  834. inode->i_size = 64;
  835. inode->i_op = &proc_self_inode_operations;
  836. d_add(dentry, inode);
  837. return NULL;
  838. }
  839. while (len-- > 0) {
  840. c = *name - '0';
  841. name++;
  842. if (c > 9)
  843. goto out;
  844. if (pid >= MAX_MULBY10)
  845. goto out;
  846. pid *= 10;
  847. pid += c;
  848. if (!pid)
  849. goto out;
  850. }
  851. read_lock(&tasklist_lock);
  852. task = find_task_by_pid(pid);
  853. if (task)
  854. get_task_struct(task);
  855. read_unlock(&tasklist_lock);
  856. if (!task)
  857. goto out;
  858. inode = proc_pid_make_inode(dir->i_sb, task, PROC_PID_INO);
  859. free_task_struct(task);
  860. if (!inode)
  861. goto out;
  862. inode->i_mode = S_IFDIR|S_IRUGO|S_IXUGO;
  863. inode->i_op = &proc_base_inode_operations;
  864. inode->i_fop = &proc_base_operations;
  865. inode->i_nlink = 3;
  866. inode->i_flags|=S_IMMUTABLE;
  867. dentry->d_op = &pid_base_dentry_operations;
  868. d_add(dentry, inode);
  869. return NULL;
  870. out:
  871. return ERR_PTR(-ENOENT);
  872. }
  873. void proc_pid_delete_inode(struct inode *inode)
  874. {
  875. if (inode->u.proc_i.file)
  876. fput(inode->u.proc_i.file);
  877. if (inode->u.proc_i.task)
  878. free_task_struct(inode->u.proc_i.task);
  879. }
  880. #define PROC_NUMBUF 10
  881. #define PROC_MAXPIDS 20
  882. /*
  883.  * Get a few pid's to return for filldir - we need to hold the
  884.  * tasklist lock while doing this, and we must release it before
  885.  * we actually do the filldir itself, so we use a temp buffer..
  886.  */
  887. static int get_pid_list(int index, unsigned int *pids)
  888. {
  889. struct task_struct *p;
  890. int nr_pids = 0;
  891. index--;
  892. read_lock(&tasklist_lock);
  893. for_each_task(p) {
  894. int pid = p->pid;
  895. if (!pid)
  896. continue;
  897. if (--index >= 0)
  898. continue;
  899. pids[nr_pids] = pid;
  900. nr_pids++;
  901. if (nr_pids >= PROC_MAXPIDS)
  902. break;
  903. }
  904. read_unlock(&tasklist_lock);
  905. return nr_pids;
  906. }
  907. int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)
  908. {
  909. unsigned int pid_array[PROC_MAXPIDS];
  910. char buf[PROC_NUMBUF];
  911. unsigned int nr = filp->f_pos - FIRST_PROCESS_ENTRY;
  912. unsigned int nr_pids, i;
  913. if (!nr) {
  914. ino_t ino = fake_ino(0,PROC_PID_INO);
  915. if (filldir(dirent, "self", 4, filp->f_pos, ino, DT_LNK) < 0)
  916. return 0;
  917. filp->f_pos++;
  918. nr++;
  919. }
  920. nr_pids = get_pid_list(nr, pid_array);
  921. for (i = 0; i < nr_pids; i++) {
  922. int pid = pid_array[i];
  923. ino_t ino = fake_ino(pid,PROC_PID_INO);
  924. unsigned long j = PROC_NUMBUF;
  925. do buf[--j] = '0' + (pid % 10); while (pid/=10);
  926. if (filldir(dirent, buf+j, PROC_NUMBUF-j, filp->f_pos, ino, DT_DIR) < 0)
  927. break;
  928. filp->f_pos++;
  929. }
  930. return 0;
  931. }