Skip to content

Commit f556e77

Browse files
Christoph HellwigAl Viro
authored andcommitted
minix: don't flush page immediately for DIRSYNC directories
We do not need to writeout modified directory blocks immediately when modifying them while the page is locked. It is enough to do the flush somewhat later which has the added benefit that inode times can be flushed as well. It also allows us to stop depending on write_one_page() function. Ported from an ext2 patch by Jan Kara. Signed-off-by: Christoph Hellwig <[email protected]> Signed-off-by: Al Viro <[email protected]>
1 parent 2d1a9d5 commit f556e77

File tree

1 file changed

+20
-16
lines changed

1 file changed

+20
-16
lines changed

fs/minix/dir.c

Lines changed: 20 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -46,21 +46,27 @@ minix_last_byte(struct inode *inode, unsigned long page_nr)
4646
return last_byte;
4747
}
4848

49-
static int dir_commit_chunk(struct page *page, loff_t pos, unsigned len)
49+
static void dir_commit_chunk(struct page *page, loff_t pos, unsigned len)
5050
{
5151
struct address_space *mapping = page->mapping;
5252
struct inode *dir = mapping->host;
53-
int err = 0;
53+
5454
block_write_end(NULL, mapping, pos, len, len, page, NULL);
5555

5656
if (pos+len > dir->i_size) {
5757
i_size_write(dir, pos+len);
5858
mark_inode_dirty(dir);
5959
}
60-
if (IS_DIRSYNC(dir))
61-
err = write_one_page(page);
62-
else
63-
unlock_page(page);
60+
unlock_page(page);
61+
}
62+
63+
static int minix_handle_dirsync(struct inode *dir)
64+
{
65+
int err;
66+
67+
err = filemap_write_and_wait(dir->i_mapping);
68+
if (!err)
69+
err = sync_inode_metadata(dir, 1);
6470
return err;
6571
}
6672

@@ -274,9 +280,10 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
274280
memset (namx + namelen, 0, sbi->s_dirsize - namelen - 2);
275281
de->inode = inode->i_ino;
276282
}
277-
err = dir_commit_chunk(page, pos, sbi->s_dirsize);
283+
dir_commit_chunk(page, pos, sbi->s_dirsize);
278284
dir->i_mtime = dir->i_ctime = current_time(dir);
279285
mark_inode_dirty(dir);
286+
err = minix_handle_dirsync(dir);
280287
out_put:
281288
dir_put_page(page);
282289
out:
@@ -305,12 +312,10 @@ int minix_delete_entry(struct minix_dir_entry *de, struct page *page)
305312
((minix3_dirent *)de)->inode = 0;
306313
else
307314
de->inode = 0;
308-
err = dir_commit_chunk(page, pos, len);
309-
if (err)
310-
return err;
315+
dir_commit_chunk(page, pos, len);
311316
inode->i_ctime = inode->i_mtime = current_time(inode);
312317
mark_inode_dirty(inode);
313-
return 0;
318+
return minix_handle_dirsync(inode);
314319
}
315320

316321
int minix_make_empty(struct inode *inode, struct inode *dir)
@@ -350,7 +355,8 @@ int minix_make_empty(struct inode *inode, struct inode *dir)
350355
}
351356
kunmap_atomic(kaddr);
352357

353-
err = dir_commit_chunk(page, 0, 2 * sbi->s_dirsize);
358+
dir_commit_chunk(page, 0, 2 * sbi->s_dirsize);
359+
err = minix_handle_dirsync(inode);
354360
fail:
355361
put_page(page);
356362
return err;
@@ -429,12 +435,10 @@ int minix_set_link(struct minix_dir_entry *de, struct page *page,
429435
((minix3_dirent *)de)->inode = inode->i_ino;
430436
else
431437
de->inode = inode->i_ino;
432-
err = dir_commit_chunk(page, pos, sbi->s_dirsize);
433-
if (err)
434-
return err;
438+
dir_commit_chunk(page, pos, sbi->s_dirsize);
435439
dir->i_mtime = dir->i_ctime = current_time(dir);
436440
mark_inode_dirty(dir);
437-
return 0;
441+
return minix_handle_dirsync(dir);
438442
}
439443

440444
struct minix_dir_entry * minix_dotdot (struct inode *dir, struct page **p)

0 commit comments

Comments
 (0)