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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  * linux/fs/hfs/sysdep.c
  3.  *
  4.  * Copyright (C) 1996  Paul H. Hargrove
  5.  * This file may be distributed under the terms of the GNU General Public License.
  6.  *
  7.  * This file contains the code to do various system dependent things.
  8.  *
  9.  * "XXX" in a comment is a note to myself to consider changing something.
  10.  *
  11.  * In function preconditions the term "valid" applied to a pointer to
  12.  * a structure means that the pointer is non-NULL and the structure it
  13.  * points to has all fields initialized to consistent values.
  14.  */
  15. #include "hfs.h"
  16. #include <linux/hfs_fs_sb.h>
  17. #include <linux/hfs_fs_i.h>
  18. #include <linux/hfs_fs.h>
  19. #include <linux/smp_lock.h>
  20. static int hfs_revalidate_dentry(struct dentry *, int);
  21. static int hfs_hash_dentry(struct dentry *, struct qstr *);
  22. static int hfs_compare_dentry(struct dentry *, struct qstr *, struct qstr *);
  23. static void hfs_dentry_iput(struct dentry *, struct inode *);
  24. struct dentry_operations hfs_dentry_operations =
  25. {
  26. d_revalidate: hfs_revalidate_dentry,
  27. d_hash: hfs_hash_dentry,
  28. d_compare: hfs_compare_dentry,
  29. d_iput: hfs_dentry_iput,
  30. };
  31. /*
  32.  * hfs_buffer_get()
  33.  *
  34.  * Return a buffer for the 'block'th block of the media.
  35.  * If ('read'==0) then the buffer is not read from disk.
  36.  */
  37. hfs_buffer hfs_buffer_get(hfs_sysmdb sys_mdb, int block, int read) {
  38. hfs_buffer tmp = HFS_BAD_BUFFER;
  39. if (read) {
  40. tmp = sb_bread(sys_mdb, block);
  41. } else {
  42. tmp = sb_getblk(sys_mdb, block);
  43. if (tmp) {
  44. mark_buffer_uptodate(tmp, 1);
  45. }
  46. }
  47. if (!tmp) {
  48. hfs_error("hfs_fs: unable to read block 0x%08x from dev %sn",
  49.   block, hfs_mdb_name(sys_mdb));
  50. }
  51. return tmp;
  52. }
  53. /* dentry case-handling: just lowercase everything */
  54. /* hfs_strhash now uses the same hashing function as the dcache. */
  55. static int hfs_hash_dentry(struct dentry *dentry, struct qstr *this)
  56. {
  57. if (this->len > HFS_NAMELEN)
  58.         return 0;
  59. this->hash = hfs_strhash(this->name, this->len);
  60. return 0;
  61. }
  62. /* return 1 on failure and 0 on success */
  63. static int hfs_compare_dentry(struct dentry *dentry, struct qstr *a, 
  64.       struct qstr *b)
  65. {
  66. if (a->len != b->len) return 1;
  67. if (a->len > HFS_NAMELEN)
  68.   return 1;
  69. return !hfs_streq(a->name, a->len, b->name, b->len);
  70. }
  71. static void hfs_dentry_iput(struct dentry *dentry, struct inode *inode)
  72. {
  73. struct hfs_cat_entry *entry = HFS_I(inode)->entry;
  74. lock_kernel();
  75. entry->sys_entry[HFS_ITYPE_TO_INT(HFS_ITYPE(inode->i_ino))] = NULL;
  76. unlock_kernel();
  77. iput(inode);
  78. }
  79. static int hfs_revalidate_dentry(struct dentry *dentry, int flags)
  80. {
  81. struct inode *inode = dentry->d_inode;
  82. int diff;
  83. /* fix up inode on a timezone change */
  84. lock_kernel();
  85. if (inode && 
  86.     (diff = (hfs_to_utc(0) - HFS_I(inode)->tz_secondswest))) {
  87. inode->i_ctime += diff;
  88. inode->i_atime += diff;
  89. inode->i_mtime += diff;
  90. HFS_I(inode)->tz_secondswest += diff;
  91. }
  92. unlock_kernel();
  93. return 1;
  94. }