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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *   Copyright (c) International Business Machines Corp., 2000-2002
  3.  *   Portions Copyright (c) Christoph Hellwig, 2001-2002
  4.  *
  5.  *   This program is free software;  you can redistribute it and/or modify
  6.  *   it under the terms of the GNU General Public License as published by
  7.  *   the Free Software Foundation; either version 2 of the License, or 
  8.  *   (at your option) any later version.
  9.  * 
  10.  *   This program is distributed in the hope that it will be useful,
  11.  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
  12.  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
  13.  *   the GNU General Public License for more details.
  14.  *
  15.  *   You should have received a copy of the GNU General Public License
  16.  *   along with this program;  if not, write to the Free Software 
  17.  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  18.  */
  19. #include <linux/fs.h>
  20. //#include <linux/locks.h>
  21. #include "jfs_incore.h"
  22. #include "jfs_filsys.h"
  23. #include "jfs_imap.h"
  24. #include "jfs_extent.h"
  25. #include "jfs_unicode.h"
  26. #include "jfs_debug.h"
  27. extern struct inode_operations jfs_dir_inode_operations;
  28. extern struct inode_operations jfs_file_inode_operations;
  29. extern struct inode_operations jfs_symlink_inode_operations;
  30. extern struct file_operations jfs_dir_operations;
  31. extern struct file_operations jfs_file_operations;
  32. struct address_space_operations jfs_aops;
  33. extern int freeZeroLink(struct inode *);
  34. void jfs_clear_inode(struct inode *inode)
  35. {
  36. struct jfs_inode_info *ji = JFS_IP(inode);
  37. jFYI(1, ("jfs_clear_inode called ip = 0x%pn", inode));
  38. if (ji->active_ag != -1) {
  39. printk(KERN_ERR "jfs_clear_inode, active_ag = %dn",
  40.        ji->active_ag);
  41. printk(KERN_ERR "i_ino = %ld, i_mode = %on",
  42.        inode->i_ino, inode->i_mode);
  43. }
  44. ASSERT(list_empty(&ji->mp_list));
  45. ASSERT(list_empty(&ji->anon_inode_list));
  46. if (ji->atlhead) {
  47. jERROR(1, ("jfs_clear_inode: inode %p has anonymous tlocksn",
  48. inode));
  49. jERROR(1, ("i_state = 0x%lx, cflag = 0x%lxn",
  50. inode->i_state, ji->cflag));
  51. }
  52. free_jfs_inode(inode);
  53. }
  54. void jfs_read_inode(struct inode *inode)
  55. {
  56. int rc;
  57. rc = alloc_jfs_inode(inode);
  58. if (rc) {
  59. jFYI(1, ("In jfs_read_inode, alloc_jfs_inode failed"));
  60. goto bad_inode;
  61. }
  62. jFYI(1, ("In jfs_read_inode, inode = 0x%pn", inode));
  63. if (diRead(inode))
  64. goto bad_inode_free;
  65. if (S_ISREG(inode->i_mode)) {
  66. inode->i_op = &jfs_file_inode_operations;
  67. inode->i_fop = &jfs_file_operations;
  68. inode->i_mapping->a_ops = &jfs_aops;
  69. } else if (S_ISDIR(inode->i_mode)) {
  70. inode->i_op = &jfs_dir_inode_operations;
  71. inode->i_fop = &jfs_dir_operations;
  72. inode->i_mapping->a_ops = &jfs_aops;
  73. inode->i_mapping->gfp_mask = GFP_NOFS;
  74. } else if (S_ISLNK(inode->i_mode)) {
  75. if (inode->i_size > IDATASIZE) {
  76. inode->i_op = &page_symlink_inode_operations;
  77. inode->i_mapping->a_ops = &jfs_aops;
  78. } else
  79. inode->i_op = &jfs_symlink_inode_operations;
  80. } else {
  81. inode->i_op = &jfs_file_inode_operations;
  82. init_special_inode(inode, inode->i_mode,
  83.    kdev_t_to_nr(inode->i_rdev));
  84. }
  85. return;
  86.       bad_inode_free:
  87. free_jfs_inode(inode);
  88.       bad_inode:
  89. make_bad_inode(inode);
  90. }
  91. /* This define is from fs/open.c */
  92. #define special_file(m) (S_ISCHR(m)||S_ISBLK(m)||S_ISFIFO(m)||S_ISSOCK(m))
  93. /*
  94.  * Workhorse of both fsync & write_inode
  95.  */
  96. int jfs_commit_inode(struct inode *inode, int wait)
  97. {
  98. int rc = 0;
  99. tid_t tid;
  100. static int noisy = 5;
  101. jFYI(1, ("In jfs_commit_inode, inode = 0x%pn", inode));
  102. /*
  103.  * Don't commit if inode has been committed since last being
  104.  * marked dirty, or if it has been deleted.
  105.  */
  106. if (test_cflag(COMMIT_Nolink, inode) ||
  107.     !test_cflag(COMMIT_Dirty, inode))
  108. return 0;
  109. if (isReadOnly(inode)) {
  110. /* kernel allows writes to devices on read-only
  111.  * partitions and may think inode is dirty
  112.  */
  113. if (!special_file(inode->i_mode) && noisy) {
  114. jERROR(1, ("jfs_commit_inode(0x%p) called on "
  115.    "read-only volumen", inode));
  116. jERROR(1, ("Is remount racy?n"));
  117. noisy--;
  118. }
  119. return 0;
  120. }
  121. tid = txBegin(inode->i_sb, COMMIT_INODE);
  122. down(&JFS_IP(inode)->commit_sem);
  123. rc = txCommit(tid, 1, &inode, wait ? COMMIT_SYNC : 0);
  124. txEnd(tid);
  125. up(&JFS_IP(inode)->commit_sem);
  126. return -rc;
  127. }
  128. void jfs_write_inode(struct inode *inode, int wait)
  129. {
  130. /*
  131.  * If COMMIT_DIRTY is not set, the inode isn't really dirty.
  132.  * It has been committed since the last change, but was still
  133.  * on the dirty inode list
  134.  */
  135. if (test_cflag(COMMIT_Nolink, inode) ||
  136.     !test_cflag(COMMIT_Dirty, inode))
  137. return;
  138. if (jfs_commit_inode(inode, wait)) {
  139. jERROR(1, ("jfs_write_inode: jfs_commit_inode failed!n"));
  140. }
  141. }
  142. void jfs_delete_inode(struct inode *inode)
  143. {
  144. jFYI(1, ("In jfs_delete_inode, inode = 0x%pn", inode));
  145. if (test_cflag(COMMIT_Freewmap, inode))
  146. freeZeroLink(inode);
  147. diFree(inode);
  148. clear_inode(inode);
  149. }
  150. void jfs_dirty_inode(struct inode *inode)
  151. {
  152. static int noisy = 5;
  153. if (isReadOnly(inode)) {
  154. if (!special_file(inode->i_mode) && noisy) {
  155. /* kernel allows writes to devices on read-only
  156.  * partitions and may try to mark inode dirty
  157.  */
  158. jERROR(1, ("jfs_dirty_inode called on "
  159.    "read-only volumen"));
  160. jERROR(1, ("Is remount racy?n"));
  161. noisy--;
  162. }
  163. return;
  164. }
  165. set_cflag(COMMIT_Dirty, inode);
  166. }
  167. static int jfs_get_block(struct inode *ip, long lblock,
  168.  struct buffer_head *bh_result, int create)
  169. {
  170. s64 lblock64 = lblock;
  171. int no_size_check = 0;
  172. int rc = 0;
  173. int take_locks;
  174. xad_t xad;
  175. s64 xaddr;
  176. int xflag;
  177. s32 xlen;
  178. /*
  179.  * If this is a special inode (imap, dmap) or directory,
  180.  * the lock should already be taken
  181.  */
  182. take_locks = ((JFS_IP(ip)->fileset != AGGREGATE_I) &&
  183.       !S_ISDIR(ip->i_mode));
  184. /*
  185.  * Take appropriate lock on inode
  186.  */
  187. if (take_locks) {
  188. if (create)
  189. IWRITE_LOCK(ip);
  190. else
  191. IREAD_LOCK(ip);
  192. }
  193. /*
  194.  * A directory's "data" is the inode index table, but i_size is the
  195.  * size of the d-tree, so don't check the offset against i_size
  196.  */
  197. if (S_ISDIR(ip->i_mode))
  198. no_size_check = 1;
  199. if ((no_size_check ||
  200.      ((lblock64 << ip->i_sb->s_blocksize_bits) < ip->i_size)) &&
  201.     (xtLookup(ip, lblock64, 1, &xflag, &xaddr, &xlen, no_size_check)
  202.      == 0) && xlen) {
  203. if (xflag & XAD_NOTRECORDED) {
  204. if (!create)
  205. /*
  206.  * Allocated but not recorded, read treats
  207.  * this as a hole
  208.  */
  209. goto unlock;
  210. #ifdef _JFS_4K
  211. XADoffset(&xad, lblock64);
  212. XADlength(&xad, xlen);
  213. XADaddress(&xad, xaddr);
  214. #else /* _JFS_4K */
  215. /*
  216.  * As long as block size = 4K, this isn't a problem.
  217.  * We should mark the whole page not ABNR, but how
  218.  * will we know to mark the other blocks BH_New?
  219.  */
  220. BUG();
  221. #endif /* _JFS_4K */
  222. rc = extRecord(ip, &xad);
  223. if (rc)
  224. goto unlock;
  225. bh_result->b_state |= (1UL << BH_New);
  226. }
  227. bh_result->b_dev = ip->i_dev;
  228. bh_result->b_blocknr = xaddr;
  229. bh_result->b_state |= (1UL << BH_Mapped);
  230. goto unlock;
  231. }
  232. if (!create)
  233. goto unlock;
  234. /*
  235.  * Allocate a new block
  236.  */
  237. #ifdef _JFS_4K
  238. if ((rc = extHint(ip, lblock64 << ip->i_sb->s_blocksize_bits, &xad)))
  239. goto unlock;
  240. rc = extAlloc(ip, 1, lblock64, &xad, FALSE);
  241. if (rc)
  242. goto unlock;
  243. bh_result->b_dev = ip->i_dev;
  244. bh_result->b_blocknr = addressXAD(&xad);
  245. bh_result->b_state |= ((1UL << BH_Mapped) | (1UL << BH_New));
  246. #else /* _JFS_4K */
  247. /*
  248.  * We need to do whatever it takes to keep all but the last buffers
  249.  * in 4K pages - see jfs_write.c
  250.  */
  251. BUG();
  252. #endif /* _JFS_4K */
  253.       unlock:
  254. /*
  255.  * Release lock on inode
  256.  */
  257. if (take_locks) {
  258. if (create)
  259. IWRITE_UNLOCK(ip);
  260. else
  261. IREAD_UNLOCK(ip);
  262. }
  263. return -rc;
  264. }
  265. static int jfs_writepage(struct page *page)
  266. {
  267. return block_write_full_page(page, jfs_get_block);
  268. }
  269. static int jfs_readpage(struct file *file, struct page *page)
  270. {
  271. return block_read_full_page(page, jfs_get_block);
  272. }
  273. static int jfs_prepare_write(struct file *file,
  274.      struct page *page, unsigned from, unsigned to)
  275. {
  276. return block_prepare_write(page, from, to, jfs_get_block);
  277. }
  278. static int jfs_bmap(struct address_space *mapping, long block)
  279. {
  280. return generic_block_bmap(mapping, block, jfs_get_block);
  281. }
  282. static int jfs_direct_IO(int rw, struct inode *inode, struct kiobuf *iobuf,
  283.  unsigned long blocknr, int blocksize)
  284. {
  285. return generic_direct_IO(rw, inode, iobuf, blocknr,
  286.  blocksize, jfs_get_block);
  287. }
  288. struct address_space_operations jfs_aops = {
  289. .readpage = jfs_readpage,
  290. .writepage = jfs_writepage,
  291. .sync_page = block_sync_page,
  292. .prepare_write = jfs_prepare_write,
  293. .commit_write = generic_commit_write,
  294. .bmap = jfs_bmap,
  295. .direct_IO = jfs_direct_IO,
  296. };