Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
inode.c
Go to the documentation of this file.
1 /*
2  * linux/fs/hfs/inode.c
3  *
4  * Copyright (C) 1995-1997 Paul H. Hargrove
5  * (C) 2003 Ardis Technologies <[email protected]>
6  * This file may be distributed under the terms of the GNU General Public License.
7  *
8  * This file contains inode-related functions which do not depend on
9  * which scheme is being used to represent forks.
10  *
11  * Based on the minix file system code, (C) 1991, 1992 by Linus Torvalds
12  */
13 
14 #include <linux/pagemap.h>
15 #include <linux/mpage.h>
16 #include <linux/sched.h>
17 
18 #include "hfs_fs.h"
19 #include "btree.h"
20 
21 static const struct file_operations hfs_file_operations;
22 static const struct inode_operations hfs_file_inode_operations;
23 
24 /*================ Variable-like macros ================*/
25 
26 #define HFS_VALID_MODE_BITS (S_IFREG | S_IFDIR | S_IRWXUGO)
27 
28 static int hfs_writepage(struct page *page, struct writeback_control *wbc)
29 {
30  return block_write_full_page(page, hfs_get_block, wbc);
31 }
32 
33 static int hfs_readpage(struct file *file, struct page *page)
34 {
35  return block_read_full_page(page, hfs_get_block);
36 }
37 
38 static int hfs_write_begin(struct file *file, struct address_space *mapping,
39  loff_t pos, unsigned len, unsigned flags,
40  struct page **pagep, void **fsdata)
41 {
42  int ret;
43 
44  *pagep = NULL;
45  ret = cont_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
47  &HFS_I(mapping->host)->phys_size);
48  if (unlikely(ret)) {
49  loff_t isize = mapping->host->i_size;
50  if (pos + len > isize)
51  vmtruncate(mapping->host, isize);
52  }
53 
54  return ret;
55 }
56 
57 static sector_t hfs_bmap(struct address_space *mapping, sector_t block)
58 {
59  return generic_block_bmap(mapping, block, hfs_get_block);
60 }
61 
62 static int hfs_releasepage(struct page *page, gfp_t mask)
63 {
64  struct inode *inode = page->mapping->host;
65  struct super_block *sb = inode->i_sb;
66  struct hfs_btree *tree;
67  struct hfs_bnode *node;
68  u32 nidx;
69  int i, res = 1;
70 
71  switch (inode->i_ino) {
72  case HFS_EXT_CNID:
73  tree = HFS_SB(sb)->ext_tree;
74  break;
75  case HFS_CAT_CNID:
76  tree = HFS_SB(sb)->cat_tree;
77  break;
78  default:
79  BUG();
80  return 0;
81  }
82 
83  if (!tree)
84  return 0;
85 
86  if (tree->node_size >= PAGE_CACHE_SIZE) {
87  nidx = page->index >> (tree->node_size_shift - PAGE_CACHE_SHIFT);
88  spin_lock(&tree->hash_lock);
89  node = hfs_bnode_findhash(tree, nidx);
90  if (!node)
91  ;
92  else if (atomic_read(&node->refcnt))
93  res = 0;
94  if (res && node) {
95  hfs_bnode_unhash(node);
96  hfs_bnode_free(node);
97  }
98  spin_unlock(&tree->hash_lock);
99  } else {
100  nidx = page->index << (PAGE_CACHE_SHIFT - tree->node_size_shift);
101  i = 1 << (PAGE_CACHE_SHIFT - tree->node_size_shift);
102  spin_lock(&tree->hash_lock);
103  do {
104  node = hfs_bnode_findhash(tree, nidx++);
105  if (!node)
106  continue;
107  if (atomic_read(&node->refcnt)) {
108  res = 0;
109  break;
110  }
111  hfs_bnode_unhash(node);
112  hfs_bnode_free(node);
113  } while (--i && nidx < tree->node_count);
114  spin_unlock(&tree->hash_lock);
115  }
116  return res ? try_to_free_buffers(page) : 0;
117 }
118 
119 static ssize_t hfs_direct_IO(int rw, struct kiocb *iocb,
120  const struct iovec *iov, loff_t offset, unsigned long nr_segs)
121 {
122  struct file *file = iocb->ki_filp;
123  struct inode *inode = file->f_path.dentry->d_inode->i_mapping->host;
124  ssize_t ret;
125 
126  ret = blockdev_direct_IO(rw, iocb, inode, iov, offset, nr_segs,
127  hfs_get_block);
128 
129  /*
130  * In case of error extending write may have instantiated a few
131  * blocks outside i_size. Trim these off again.
132  */
133  if (unlikely((rw & WRITE) && ret < 0)) {
134  loff_t isize = i_size_read(inode);
135  loff_t end = offset + iov_length(iov, nr_segs);
136 
137  if (end > isize)
138  vmtruncate(inode, isize);
139  }
140 
141  return ret;
142 }
143 
144 static int hfs_writepages(struct address_space *mapping,
145  struct writeback_control *wbc)
146 {
147  return mpage_writepages(mapping, wbc, hfs_get_block);
148 }
149 
151  .readpage = hfs_readpage,
152  .writepage = hfs_writepage,
153  .write_begin = hfs_write_begin,
154  .write_end = generic_write_end,
155  .bmap = hfs_bmap,
156  .releasepage = hfs_releasepage,
157 };
158 
160  .readpage = hfs_readpage,
161  .writepage = hfs_writepage,
162  .write_begin = hfs_write_begin,
163  .write_end = generic_write_end,
164  .bmap = hfs_bmap,
165  .direct_IO = hfs_direct_IO,
166  .writepages = hfs_writepages,
167 };
168 
169 /*
170  * hfs_new_inode
171  */
172 struct inode *hfs_new_inode(struct inode *dir, struct qstr *name, umode_t mode)
173 {
174  struct super_block *sb = dir->i_sb;
175  struct inode *inode = new_inode(sb);
176  if (!inode)
177  return NULL;
178 
179  mutex_init(&HFS_I(inode)->extents_lock);
180  INIT_LIST_HEAD(&HFS_I(inode)->open_dir_list);
181  hfs_cat_build_key(sb, (btree_key *)&HFS_I(inode)->cat_key, dir->i_ino, name);
182  inode->i_ino = HFS_SB(sb)->next_id++;
183  inode->i_mode = mode;
184  inode->i_uid = current_fsuid();
185  inode->i_gid = current_fsgid();
186  set_nlink(inode, 1);
187  inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME_SEC;
188  HFS_I(inode)->flags = 0;
189  HFS_I(inode)->rsrc_inode = NULL;
190  HFS_I(inode)->fs_blocks = 0;
191  if (S_ISDIR(mode)) {
192  inode->i_size = 2;
193  HFS_SB(sb)->folder_count++;
194  if (dir->i_ino == HFS_ROOT_CNID)
195  HFS_SB(sb)->root_dirs++;
196  inode->i_op = &hfs_dir_inode_operations;
197  inode->i_fop = &hfs_dir_operations;
198  inode->i_mode |= S_IRWXUGO;
199  inode->i_mode &= ~HFS_SB(inode->i_sb)->s_dir_umask;
200  } else if (S_ISREG(mode)) {
201  HFS_I(inode)->clump_blocks = HFS_SB(sb)->clumpablks;
202  HFS_SB(sb)->file_count++;
203  if (dir->i_ino == HFS_ROOT_CNID)
204  HFS_SB(sb)->root_files++;
205  inode->i_op = &hfs_file_inode_operations;
206  inode->i_fop = &hfs_file_operations;
207  inode->i_mapping->a_ops = &hfs_aops;
208  inode->i_mode |= S_IRUGO|S_IXUGO;
209  if (mode & S_IWUSR)
210  inode->i_mode |= S_IWUGO;
211  inode->i_mode &= ~HFS_SB(inode->i_sb)->s_file_umask;
212  HFS_I(inode)->phys_size = 0;
213  HFS_I(inode)->alloc_blocks = 0;
214  HFS_I(inode)->first_blocks = 0;
215  HFS_I(inode)->cached_start = 0;
216  HFS_I(inode)->cached_blocks = 0;
217  memset(HFS_I(inode)->first_extents, 0, sizeof(hfs_extent_rec));
218  memset(HFS_I(inode)->cached_extents, 0, sizeof(hfs_extent_rec));
219  }
220  insert_inode_hash(inode);
221  mark_inode_dirty(inode);
222  set_bit(HFS_FLG_MDB_DIRTY, &HFS_SB(sb)->flags);
223  hfs_mark_mdb_dirty(sb);
224 
225  return inode;
226 }
227 
228 void hfs_delete_inode(struct inode *inode)
229 {
230  struct super_block *sb = inode->i_sb;
231 
232  dprint(DBG_INODE, "delete_inode: %lu\n", inode->i_ino);
233  if (S_ISDIR(inode->i_mode)) {
234  HFS_SB(sb)->folder_count--;
235  if (HFS_I(inode)->cat_key.ParID == cpu_to_be32(HFS_ROOT_CNID))
236  HFS_SB(sb)->root_dirs--;
237  set_bit(HFS_FLG_MDB_DIRTY, &HFS_SB(sb)->flags);
238  hfs_mark_mdb_dirty(sb);
239  return;
240  }
241  HFS_SB(sb)->file_count--;
242  if (HFS_I(inode)->cat_key.ParID == cpu_to_be32(HFS_ROOT_CNID))
243  HFS_SB(sb)->root_files--;
244  if (S_ISREG(inode->i_mode)) {
245  if (!inode->i_nlink) {
246  inode->i_size = 0;
247  hfs_file_truncate(inode);
248  }
249  }
250  set_bit(HFS_FLG_MDB_DIRTY, &HFS_SB(sb)->flags);
251  hfs_mark_mdb_dirty(sb);
252 }
253 
254 void hfs_inode_read_fork(struct inode *inode, struct hfs_extent *ext,
255  __be32 __log_size, __be32 phys_size, u32 clump_size)
256 {
257  struct super_block *sb = inode->i_sb;
258  u32 log_size = be32_to_cpu(__log_size);
259  u16 count;
260  int i;
261 
262  memcpy(HFS_I(inode)->first_extents, ext, sizeof(hfs_extent_rec));
263  for (count = 0, i = 0; i < 3; i++)
264  count += be16_to_cpu(ext[i].count);
265  HFS_I(inode)->first_blocks = count;
266 
267  inode->i_size = HFS_I(inode)->phys_size = log_size;
268  HFS_I(inode)->fs_blocks = (log_size + sb->s_blocksize - 1) >> sb->s_blocksize_bits;
269  inode_set_bytes(inode, HFS_I(inode)->fs_blocks << sb->s_blocksize_bits);
270  HFS_I(inode)->alloc_blocks = be32_to_cpu(phys_size) /
271  HFS_SB(sb)->alloc_blksz;
272  HFS_I(inode)->clump_blocks = clump_size / HFS_SB(sb)->alloc_blksz;
273  if (!HFS_I(inode)->clump_blocks)
274  HFS_I(inode)->clump_blocks = HFS_SB(sb)->clumpablks;
275 }
276 
278  struct hfs_cat_key *key;
280 };
281 
282 static int hfs_test_inode(struct inode *inode, void *data)
283 {
284  struct hfs_iget_data *idata = data;
285  hfs_cat_rec *rec;
286 
287  rec = idata->rec;
288  switch (rec->type) {
289  case HFS_CDR_DIR:
290  return inode->i_ino == be32_to_cpu(rec->dir.DirID);
291  case HFS_CDR_FIL:
292  return inode->i_ino == be32_to_cpu(rec->file.FlNum);
293  default:
294  BUG();
295  return 1;
296  }
297 }
298 
299 /*
300  * hfs_read_inode
301  */
302 static int hfs_read_inode(struct inode *inode, void *data)
303 {
304  struct hfs_iget_data *idata = data;
305  struct hfs_sb_info *hsb = HFS_SB(inode->i_sb);
306  hfs_cat_rec *rec;
307 
308  HFS_I(inode)->flags = 0;
309  HFS_I(inode)->rsrc_inode = NULL;
310  mutex_init(&HFS_I(inode)->extents_lock);
311  INIT_LIST_HEAD(&HFS_I(inode)->open_dir_list);
312 
313  /* Initialize the inode */
314  inode->i_uid = hsb->s_uid;
315  inode->i_gid = hsb->s_gid;
316  set_nlink(inode, 1);
317 
318  if (idata->key)
319  HFS_I(inode)->cat_key = *idata->key;
320  else
321  HFS_I(inode)->flags |= HFS_FLG_RSRC;
322  HFS_I(inode)->tz_secondswest = sys_tz.tz_minuteswest * 60;
323 
324  rec = idata->rec;
325  switch (rec->type) {
326  case HFS_CDR_FIL:
327  if (!HFS_IS_RSRC(inode)) {
328  hfs_inode_read_fork(inode, rec->file.ExtRec, rec->file.LgLen,
329  rec->file.PyLen, be16_to_cpu(rec->file.ClpSize));
330  } else {
331  hfs_inode_read_fork(inode, rec->file.RExtRec, rec->file.RLgLen,
332  rec->file.RPyLen, be16_to_cpu(rec->file.ClpSize));
333  }
334 
335  inode->i_ino = be32_to_cpu(rec->file.FlNum);
336  inode->i_mode = S_IRUGO | S_IXUGO;
337  if (!(rec->file.Flags & HFS_FIL_LOCK))
338  inode->i_mode |= S_IWUGO;
339  inode->i_mode &= ~hsb->s_file_umask;
340  inode->i_mode |= S_IFREG;
341  inode->i_ctime = inode->i_atime = inode->i_mtime =
342  hfs_m_to_utime(rec->file.MdDat);
343  inode->i_op = &hfs_file_inode_operations;
344  inode->i_fop = &hfs_file_operations;
345  inode->i_mapping->a_ops = &hfs_aops;
346  break;
347  case HFS_CDR_DIR:
348  inode->i_ino = be32_to_cpu(rec->dir.DirID);
349  inode->i_size = be16_to_cpu(rec->dir.Val) + 2;
350  HFS_I(inode)->fs_blocks = 0;
351  inode->i_mode = S_IFDIR | (S_IRWXUGO & ~hsb->s_dir_umask);
352  inode->i_ctime = inode->i_atime = inode->i_mtime =
353  hfs_m_to_utime(rec->dir.MdDat);
354  inode->i_op = &hfs_dir_inode_operations;
355  inode->i_fop = &hfs_dir_operations;
356  break;
357  default:
358  make_bad_inode(inode);
359  }
360  return 0;
361 }
362 
363 /*
364  * __hfs_iget()
365  *
366  * Given the MDB for a HFS filesystem, a 'key' and an 'entry' in
367  * the catalog B-tree and the 'type' of the desired file return the
368  * inode for that file/directory or NULL. Note that 'type' indicates
369  * whether we want the actual file or directory, or the corresponding
370  * metadata (AppleDouble header file or CAP metadata file).
371  */
372 struct inode *hfs_iget(struct super_block *sb, struct hfs_cat_key *key, hfs_cat_rec *rec)
373 {
374  struct hfs_iget_data data = { key, rec };
375  struct inode *inode;
376  u32 cnid;
377 
378  switch (rec->type) {
379  case HFS_CDR_DIR:
380  cnid = be32_to_cpu(rec->dir.DirID);
381  break;
382  case HFS_CDR_FIL:
383  cnid = be32_to_cpu(rec->file.FlNum);
384  break;
385  default:
386  return NULL;
387  }
388  inode = iget5_locked(sb, cnid, hfs_test_inode, hfs_read_inode, &data);
389  if (inode && (inode->i_state & I_NEW))
390  unlock_new_inode(inode);
391  return inode;
392 }
393 
394 void hfs_inode_write_fork(struct inode *inode, struct hfs_extent *ext,
395  __be32 *log_size, __be32 *phys_size)
396 {
397  memcpy(ext, HFS_I(inode)->first_extents, sizeof(hfs_extent_rec));
398 
399  if (log_size)
400  *log_size = cpu_to_be32(inode->i_size);
401  if (phys_size)
402  *phys_size = cpu_to_be32(HFS_I(inode)->alloc_blocks *
403  HFS_SB(inode->i_sb)->alloc_blksz);
404 }
405 
406 int hfs_write_inode(struct inode *inode, struct writeback_control *wbc)
407 {
408  struct inode *main_inode = inode;
409  struct hfs_find_data fd;
410  hfs_cat_rec rec;
411 
412  dprint(DBG_INODE, "hfs_write_inode: %lu\n", inode->i_ino);
413  hfs_ext_write_extent(inode);
414 
415  if (inode->i_ino < HFS_FIRSTUSER_CNID) {
416  switch (inode->i_ino) {
417  case HFS_ROOT_CNID:
418  break;
419  case HFS_EXT_CNID:
420  hfs_btree_write(HFS_SB(inode->i_sb)->ext_tree);
421  return 0;
422  case HFS_CAT_CNID:
423  hfs_btree_write(HFS_SB(inode->i_sb)->cat_tree);
424  return 0;
425  default:
426  BUG();
427  return -EIO;
428  }
429  }
430 
431  if (HFS_IS_RSRC(inode))
432  main_inode = HFS_I(inode)->rsrc_inode;
433 
434  if (!main_inode->i_nlink)
435  return 0;
436 
437  if (hfs_find_init(HFS_SB(main_inode->i_sb)->cat_tree, &fd))
438  /* panic? */
439  return -EIO;
440 
441  fd.search_key->cat = HFS_I(main_inode)->cat_key;
442  if (hfs_brec_find(&fd))
443  /* panic? */
444  goto out;
445 
446  if (S_ISDIR(main_inode->i_mode)) {
447  if (fd.entrylength < sizeof(struct hfs_cat_dir))
448  /* panic? */;
449  hfs_bnode_read(fd.bnode, &rec, fd.entryoffset,
450  sizeof(struct hfs_cat_dir));
451  if (rec.type != HFS_CDR_DIR ||
452  be32_to_cpu(rec.dir.DirID) != inode->i_ino) {
453  }
454 
455  rec.dir.MdDat = hfs_u_to_mtime(inode->i_mtime);
456  rec.dir.Val = cpu_to_be16(inode->i_size - 2);
457 
458  hfs_bnode_write(fd.bnode, &rec, fd.entryoffset,
459  sizeof(struct hfs_cat_dir));
460  } else if (HFS_IS_RSRC(inode)) {
461  hfs_bnode_read(fd.bnode, &rec, fd.entryoffset,
462  sizeof(struct hfs_cat_file));
463  hfs_inode_write_fork(inode, rec.file.RExtRec,
464  &rec.file.RLgLen, &rec.file.RPyLen);
465  hfs_bnode_write(fd.bnode, &rec, fd.entryoffset,
466  sizeof(struct hfs_cat_file));
467  } else {
468  if (fd.entrylength < sizeof(struct hfs_cat_file))
469  /* panic? */;
470  hfs_bnode_read(fd.bnode, &rec, fd.entryoffset,
471  sizeof(struct hfs_cat_file));
472  if (rec.type != HFS_CDR_FIL ||
473  be32_to_cpu(rec.file.FlNum) != inode->i_ino) {
474  }
475 
476  if (inode->i_mode & S_IWUSR)
477  rec.file.Flags &= ~HFS_FIL_LOCK;
478  else
479  rec.file.Flags |= HFS_FIL_LOCK;
480  hfs_inode_write_fork(inode, rec.file.ExtRec, &rec.file.LgLen, &rec.file.PyLen);
481  rec.file.MdDat = hfs_u_to_mtime(inode->i_mtime);
482 
483  hfs_bnode_write(fd.bnode, &rec, fd.entryoffset,
484  sizeof(struct hfs_cat_file));
485  }
486 out:
487  hfs_find_exit(&fd);
488  return 0;
489 }
490 
491 static struct dentry *hfs_file_lookup(struct inode *dir, struct dentry *dentry,
492  unsigned int flags)
493 {
494  struct inode *inode = NULL;
495  hfs_cat_rec rec;
496  struct hfs_find_data fd;
497  int res;
498 
499  if (HFS_IS_RSRC(dir) || strcmp(dentry->d_name.name, "rsrc"))
500  goto out;
501 
502  inode = HFS_I(dir)->rsrc_inode;
503  if (inode)
504  goto out;
505 
506  inode = new_inode(dir->i_sb);
507  if (!inode)
508  return ERR_PTR(-ENOMEM);
509 
510  hfs_find_init(HFS_SB(dir->i_sb)->cat_tree, &fd);
511  fd.search_key->cat = HFS_I(dir)->cat_key;
512  res = hfs_brec_read(&fd, &rec, sizeof(rec));
513  if (!res) {
514  struct hfs_iget_data idata = { NULL, &rec };
515  hfs_read_inode(inode, &idata);
516  }
517  hfs_find_exit(&fd);
518  if (res) {
519  iput(inode);
520  return ERR_PTR(res);
521  }
522  HFS_I(inode)->rsrc_inode = dir;
523  HFS_I(dir)->rsrc_inode = inode;
524  igrab(dir);
525  hlist_add_fake(&inode->i_hash);
526  mark_inode_dirty(inode);
527 out:
528  d_add(dentry, inode);
529  return NULL;
530 }
531 
532 void hfs_evict_inode(struct inode *inode)
533 {
534  truncate_inode_pages(&inode->i_data, 0);
535  clear_inode(inode);
536  if (HFS_IS_RSRC(inode) && HFS_I(inode)->rsrc_inode) {
537  HFS_I(HFS_I(inode)->rsrc_inode)->rsrc_inode = NULL;
538  iput(HFS_I(inode)->rsrc_inode);
539  }
540 }
541 
542 static int hfs_file_open(struct inode *inode, struct file *file)
543 {
544  if (HFS_IS_RSRC(inode))
545  inode = HFS_I(inode)->rsrc_inode;
546  atomic_inc(&HFS_I(inode)->opencnt);
547  return 0;
548 }
549 
550 static int hfs_file_release(struct inode *inode, struct file *file)
551 {
552  //struct super_block *sb = inode->i_sb;
553 
554  if (HFS_IS_RSRC(inode))
555  inode = HFS_I(inode)->rsrc_inode;
556  if (atomic_dec_and_test(&HFS_I(inode)->opencnt)) {
557  mutex_lock(&inode->i_mutex);
558  hfs_file_truncate(inode);
559  //if (inode->i_flags & S_DEAD) {
560  // hfs_delete_cat(inode->i_ino, HFSPLUS_SB(sb).hidden_dir, NULL);
561  // hfs_delete_inode(inode);
562  //}
563  mutex_unlock(&inode->i_mutex);
564  }
565  return 0;
566 }
567 
568 /*
569  * hfs_notify_change()
570  *
571  * Based very closely on fs/msdos/inode.c by Werner Almesberger
572  *
573  * This is the notify_change() field in the super_operations structure
574  * for HFS file systems. The purpose is to take that changes made to
575  * an inode and apply then in a filesystem-dependent manner. In this
576  * case the process has a few of tasks to do:
577  * 1) prevent changes to the i_uid and i_gid fields.
578  * 2) map file permissions to the closest allowable permissions
579  * 3) Since multiple Linux files can share the same on-disk inode under
580  * HFS (for instance the data and resource forks of a file) a change
581  * to permissions must be applied to all other in-core inodes which
582  * correspond to the same HFS file.
583  */
584 
585 int hfs_inode_setattr(struct dentry *dentry, struct iattr * attr)
586 {
587  struct inode *inode = dentry->d_inode;
588  struct hfs_sb_info *hsb = HFS_SB(inode->i_sb);
589  int error;
590 
591  error = inode_change_ok(inode, attr); /* basic permission checks */
592  if (error)
593  return error;
594 
595  /* no uig/gid changes and limit which mode bits can be set */
596  if (((attr->ia_valid & ATTR_UID) &&
597  (!uid_eq(attr->ia_uid, hsb->s_uid))) ||
598  ((attr->ia_valid & ATTR_GID) &&
599  (!gid_eq(attr->ia_gid, hsb->s_gid))) ||
600  ((attr->ia_valid & ATTR_MODE) &&
601  ((S_ISDIR(inode->i_mode) &&
602  (attr->ia_mode != inode->i_mode)) ||
603  (attr->ia_mode & ~HFS_VALID_MODE_BITS)))) {
604  return hsb->s_quiet ? 0 : error;
605  }
606 
607  if (attr->ia_valid & ATTR_MODE) {
608  /* Only the 'w' bits can ever change and only all together. */
609  if (attr->ia_mode & S_IWUSR)
610  attr->ia_mode = inode->i_mode | S_IWUGO;
611  else
612  attr->ia_mode = inode->i_mode & ~S_IWUGO;
613  attr->ia_mode &= S_ISDIR(inode->i_mode) ? ~hsb->s_dir_umask: ~hsb->s_file_umask;
614  }
615 
616  if ((attr->ia_valid & ATTR_SIZE) &&
617  attr->ia_size != i_size_read(inode)) {
618  inode_dio_wait(inode);
619 
620  error = vmtruncate(inode, attr->ia_size);
621  if (error)
622  return error;
623  }
624 
625  setattr_copy(inode, attr);
626  mark_inode_dirty(inode);
627  return 0;
628 }
629 
630 static int hfs_file_fsync(struct file *filp, loff_t start, loff_t end,
631  int datasync)
632 {
633  struct inode *inode = filp->f_mapping->host;
634  struct super_block * sb;
635  int ret, err;
636 
637  ret = filemap_write_and_wait_range(inode->i_mapping, start, end);
638  if (ret)
639  return ret;
640  mutex_lock(&inode->i_mutex);
641 
642  /* sync the inode to buffers */
643  ret = write_inode_now(inode, 0);
644 
645  /* sync the superblock to buffers */
646  sb = inode->i_sb;
647  flush_delayed_work(&HFS_SB(sb)->mdb_work);
648  /* .. finally sync the buffers to disk */
649  err = sync_blockdev(sb->s_bdev);
650  if (!ret)
651  ret = err;
652  mutex_unlock(&inode->i_mutex);
653  return ret;
654 }
655 
656 static const struct file_operations hfs_file_operations = {
657  .llseek = generic_file_llseek,
658  .read = do_sync_read,
659  .aio_read = generic_file_aio_read,
660  .write = do_sync_write,
661  .aio_write = generic_file_aio_write,
662  .mmap = generic_file_mmap,
663  .splice_read = generic_file_splice_read,
664  .fsync = hfs_file_fsync,
665  .open = hfs_file_open,
666  .release = hfs_file_release,
667 };
668 
669 static const struct inode_operations hfs_file_inode_operations = {
670  .lookup = hfs_file_lookup,
671  .truncate = hfs_file_truncate,
672  .setattr = hfs_inode_setattr,
673  .setxattr = hfs_setxattr,
674  .getxattr = hfs_getxattr,
675  .listxattr = hfs_listxattr,
676 };