base.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:24k
源码类别:

Linux/Unix编程

开发平台:

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