aboutsummaryrefslogtreecommitdiffstats
path: root/fs/minix/dir.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/minix/dir.c')
-rw-r--r--fs/minix/dir.c32
1 files changed, 9 insertions, 23 deletions
diff --git a/fs/minix/dir.c b/fs/minix/dir.c
index 6198731d7fcd..085a9262c692 100644
--- a/fs/minix/dir.c
+++ b/fs/minix/dir.c
@@ -22,7 +22,7 @@ const struct file_operations minix_dir_operations = {
22 .llseek = generic_file_llseek, 22 .llseek = generic_file_llseek,
23 .read = generic_read_dir, 23 .read = generic_read_dir,
24 .readdir = minix_readdir, 24 .readdir = minix_readdir,
25 .fsync = simple_fsync, 25 .fsync = generic_file_fsync,
26}; 26};
27 27
28static inline void dir_put_page(struct page *page) 28static inline void dir_put_page(struct page *page)
@@ -72,16 +72,9 @@ static struct page * dir_get_page(struct inode *dir, unsigned long n)
72{ 72{
73 struct address_space *mapping = dir->i_mapping; 73 struct address_space *mapping = dir->i_mapping;
74 struct page *page = read_mapping_page(mapping, n, NULL); 74 struct page *page = read_mapping_page(mapping, n, NULL);
75 if (!IS_ERR(page)) { 75 if (!IS_ERR(page))
76 kmap(page); 76 kmap(page);
77 if (!PageUptodate(page))
78 goto fail;
79 }
80 return page; 77 return page;
81
82fail:
83 dir_put_page(page);
84 return ERR_PTR(-EIO);
85} 78}
86 79
87static inline void *minix_next_entry(void *de, struct minix_sb_info *sbi) 80static inline void *minix_next_entry(void *de, struct minix_sb_info *sbi)
@@ -278,8 +271,7 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
278 271
279got_it: 272got_it:
280 pos = page_offset(page) + p - (char *)page_address(page); 273 pos = page_offset(page) + p - (char *)page_address(page);
281 err = __minix_write_begin(NULL, page->mapping, pos, sbi->s_dirsize, 274 err = minix_prepare_chunk(page, pos, sbi->s_dirsize);
282 AOP_FLAG_UNINTERRUPTIBLE, &page, NULL);
283 if (err) 275 if (err)
284 goto out_unlock; 276 goto out_unlock;
285 memcpy (namx, name, namelen); 277 memcpy (namx, name, namelen);
@@ -304,8 +296,7 @@ out_unlock:
304 296
305int minix_delete_entry(struct minix_dir_entry *de, struct page *page) 297int minix_delete_entry(struct minix_dir_entry *de, struct page *page)
306{ 298{
307 struct address_space *mapping = page->mapping; 299 struct inode *inode = page->mapping->host;
308 struct inode *inode = (struct inode*)mapping->host;
309 char *kaddr = page_address(page); 300 char *kaddr = page_address(page);
310 loff_t pos = page_offset(page) + (char*)de - kaddr; 301 loff_t pos = page_offset(page) + (char*)de - kaddr;
311 struct minix_sb_info *sbi = minix_sb(inode->i_sb); 302 struct minix_sb_info *sbi = minix_sb(inode->i_sb);
@@ -313,8 +304,7 @@ int minix_delete_entry(struct minix_dir_entry *de, struct page *page)
313 int err; 304 int err;
314 305
315 lock_page(page); 306 lock_page(page);
316 err = __minix_write_begin(NULL, mapping, pos, len, 307 err = minix_prepare_chunk(page, pos, len);
317 AOP_FLAG_UNINTERRUPTIBLE, &page, NULL);
318 if (err == 0) { 308 if (err == 0) {
319 if (sbi->s_version == MINIX_V3) 309 if (sbi->s_version == MINIX_V3)
320 ((minix3_dirent *) de)->inode = 0; 310 ((minix3_dirent *) de)->inode = 0;
@@ -332,16 +322,14 @@ int minix_delete_entry(struct minix_dir_entry *de, struct page *page)
332 322
333int minix_make_empty(struct inode *inode, struct inode *dir) 323int minix_make_empty(struct inode *inode, struct inode *dir)
334{ 324{
335 struct address_space *mapping = inode->i_mapping; 325 struct page *page = grab_cache_page(inode->i_mapping, 0);
336 struct page *page = grab_cache_page(mapping, 0);
337 struct minix_sb_info *sbi = minix_sb(inode->i_sb); 326 struct minix_sb_info *sbi = minix_sb(inode->i_sb);
338 char *kaddr; 327 char *kaddr;
339 int err; 328 int err;
340 329
341 if (!page) 330 if (!page)
342 return -ENOMEM; 331 return -ENOMEM;
343 err = __minix_write_begin(NULL, mapping, 0, 2 * sbi->s_dirsize, 332 err = minix_prepare_chunk(page, 0, 2 * sbi->s_dirsize);
344 AOP_FLAG_UNINTERRUPTIBLE, &page, NULL);
345 if (err) { 333 if (err) {
346 unlock_page(page); 334 unlock_page(page);
347 goto fail; 335 goto fail;
@@ -432,8 +420,7 @@ not_empty:
432void minix_set_link(struct minix_dir_entry *de, struct page *page, 420void minix_set_link(struct minix_dir_entry *de, struct page *page,
433 struct inode *inode) 421 struct inode *inode)
434{ 422{
435 struct address_space *mapping = page->mapping; 423 struct inode *dir = page->mapping->host;
436 struct inode *dir = mapping->host;
437 struct minix_sb_info *sbi = minix_sb(dir->i_sb); 424 struct minix_sb_info *sbi = minix_sb(dir->i_sb);
438 loff_t pos = page_offset(page) + 425 loff_t pos = page_offset(page) +
439 (char *)de-(char*)page_address(page); 426 (char *)de-(char*)page_address(page);
@@ -441,8 +428,7 @@ void minix_set_link(struct minix_dir_entry *de, struct page *page,
441 428
442 lock_page(page); 429 lock_page(page);
443 430
444 err = __minix_write_begin(NULL, mapping, pos, sbi->s_dirsize, 431 err = minix_prepare_chunk(page, pos, sbi->s_dirsize);
445 AOP_FLAG_UNINTERRUPTIBLE, &page, NULL);
446 if (err == 0) { 432 if (err == 0) {
447 if (sbi->s_version == MINIX_V3) 433 if (sbi->s_version == MINIX_V3)
448 ((minix3_dirent *) de)->inode = inode->i_ino; 434 ((minix3_dirent *) de)->inode = inode->i_ino;