diff options
author | Ingo Molnar <mingo@elte.hu> | 2009-02-13 03:34:07 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2009-02-13 03:34:07 -0500 |
commit | e9c4ffb11f0b19005b5b9dc8481687a3637e5887 (patch) | |
tree | 7007f2ff846b9b057c5cd7c25e8b82e49f9b4b63 /fs | |
parent | 4bcf349a0f90d1e69eb35c6df0fa285c886c1cd6 (diff) | |
parent | 071a0bc2ceace31266836801510879407a3701fa (diff) |
Merge branch 'linus' into perfcounters/core
Conflicts:
arch/x86/kernel/acpi/boot.c
Diffstat (limited to 'fs')
-rw-r--r-- | fs/btrfs/ctree.c | 3 | ||||
-rw-r--r-- | fs/btrfs/locking.c | 22 | ||||
-rw-r--r-- | fs/btrfs/locking.h | 2 | ||||
-rw-r--r-- | fs/ext2/super.c | 9 | ||||
-rw-r--r-- | fs/ext3/super.c | 11 | ||||
-rw-r--r-- | fs/hugetlbfs/inode.c | 8 | ||||
-rw-r--r-- | fs/jbd/journal.c | 17 | ||||
-rw-r--r-- | fs/lockd/svclock.c | 6 |
8 files changed, 34 insertions, 44 deletions
diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c index 551177c0011a..35443cc4b9a9 100644 --- a/fs/btrfs/ctree.c +++ b/fs/btrfs/ctree.c | |||
@@ -1530,8 +1530,7 @@ again: | |||
1530 | * for higher level blocks, try not to allocate blocks | 1530 | * for higher level blocks, try not to allocate blocks |
1531 | * with the block and the parent locks held. | 1531 | * with the block and the parent locks held. |
1532 | */ | 1532 | */ |
1533 | if (level > 0 && !prealloc_block.objectid && | 1533 | if (level > 0 && !prealloc_block.objectid) { |
1534 | btrfs_path_lock_waiting(p, level)) { | ||
1535 | u32 size = b->len; | 1534 | u32 size = b->len; |
1536 | u64 hint = b->start; | 1535 | u64 hint = b->start; |
1537 | 1536 | ||
diff --git a/fs/btrfs/locking.c b/fs/btrfs/locking.c index 68fd9ccf1805..9ebe9385129b 100644 --- a/fs/btrfs/locking.c +++ b/fs/btrfs/locking.c | |||
@@ -236,25 +236,3 @@ int btrfs_tree_locked(struct extent_buffer *eb) | |||
236 | return test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags) || | 236 | return test_bit(EXTENT_BUFFER_BLOCKING, &eb->bflags) || |
237 | spin_is_locked(&eb->lock); | 237 | spin_is_locked(&eb->lock); |
238 | } | 238 | } |
239 | |||
240 | /* | ||
241 | * btrfs_search_slot uses this to decide if it should drop its locks | ||
242 | * before doing something expensive like allocating free blocks for cow. | ||
243 | */ | ||
244 | int btrfs_path_lock_waiting(struct btrfs_path *path, int level) | ||
245 | { | ||
246 | int i; | ||
247 | struct extent_buffer *eb; | ||
248 | |||
249 | for (i = level; i <= level + 1 && i < BTRFS_MAX_LEVEL; i++) { | ||
250 | eb = path->nodes[i]; | ||
251 | if (!eb) | ||
252 | break; | ||
253 | smp_mb(); | ||
254 | if (spin_is_contended(&eb->lock) || | ||
255 | waitqueue_active(&eb->lock_wq)) | ||
256 | return 1; | ||
257 | } | ||
258 | return 0; | ||
259 | } | ||
260 | |||
diff --git a/fs/btrfs/locking.h b/fs/btrfs/locking.h index d92e707f5870..6bb0afbff928 100644 --- a/fs/btrfs/locking.h +++ b/fs/btrfs/locking.h | |||
@@ -26,8 +26,6 @@ int btrfs_tree_locked(struct extent_buffer *eb); | |||
26 | int btrfs_try_tree_lock(struct extent_buffer *eb); | 26 | int btrfs_try_tree_lock(struct extent_buffer *eb); |
27 | int btrfs_try_spin_lock(struct extent_buffer *eb); | 27 | int btrfs_try_spin_lock(struct extent_buffer *eb); |
28 | 28 | ||
29 | int btrfs_path_lock_waiting(struct btrfs_path *path, int level); | ||
30 | |||
31 | void btrfs_set_lock_blocking(struct extent_buffer *eb); | 29 | void btrfs_set_lock_blocking(struct extent_buffer *eb); |
32 | void btrfs_clear_lock_blocking(struct extent_buffer *eb); | 30 | void btrfs_clear_lock_blocking(struct extent_buffer *eb); |
33 | #endif | 31 | #endif |
diff --git a/fs/ext2/super.c b/fs/ext2/super.c index da8bdeaa2e6d..7c6e3606f0ec 100644 --- a/fs/ext2/super.c +++ b/fs/ext2/super.c | |||
@@ -1185,9 +1185,12 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data) | |||
1185 | es = sbi->s_es; | 1185 | es = sbi->s_es; |
1186 | if (((sbi->s_mount_opt & EXT2_MOUNT_XIP) != | 1186 | if (((sbi->s_mount_opt & EXT2_MOUNT_XIP) != |
1187 | (old_mount_opt & EXT2_MOUNT_XIP)) && | 1187 | (old_mount_opt & EXT2_MOUNT_XIP)) && |
1188 | invalidate_inodes(sb)) | 1188 | invalidate_inodes(sb)) { |
1189 | ext2_warning(sb, __func__, "busy inodes while remounting "\ | 1189 | ext2_warning(sb, __func__, "refusing change of xip flag " |
1190 | "xip remain in cache (no functional problem)"); | 1190 | "with busy inodes while remounting"); |
1191 | sbi->s_mount_opt &= ~EXT2_MOUNT_XIP; | ||
1192 | sbi->s_mount_opt |= old_mount_opt & EXT2_MOUNT_XIP; | ||
1193 | } | ||
1191 | if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) | 1194 | if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY)) |
1192 | return 0; | 1195 | return 0; |
1193 | if (*flags & MS_RDONLY) { | 1196 | if (*flags & MS_RDONLY) { |
diff --git a/fs/ext3/super.c b/fs/ext3/super.c index b70d90e08a3c..4a970411a458 100644 --- a/fs/ext3/super.c +++ b/fs/ext3/super.c | |||
@@ -2428,12 +2428,13 @@ static void ext3_write_super (struct super_block * sb) | |||
2428 | 2428 | ||
2429 | static int ext3_sync_fs(struct super_block *sb, int wait) | 2429 | static int ext3_sync_fs(struct super_block *sb, int wait) |
2430 | { | 2430 | { |
2431 | sb->s_dirt = 0; | 2431 | tid_t target; |
2432 | if (wait) | ||
2433 | ext3_force_commit(sb); | ||
2434 | else | ||
2435 | journal_start_commit(EXT3_SB(sb)->s_journal, NULL); | ||
2436 | 2432 | ||
2433 | sb->s_dirt = 0; | ||
2434 | if (journal_start_commit(EXT3_SB(sb)->s_journal, &target)) { | ||
2435 | if (wait) | ||
2436 | log_wait_commit(EXT3_SB(sb)->s_journal, target); | ||
2437 | } | ||
2437 | return 0; | 2438 | return 0; |
2438 | } | 2439 | } |
2439 | 2440 | ||
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c index 6903d37af037..9b800d97a687 100644 --- a/fs/hugetlbfs/inode.c +++ b/fs/hugetlbfs/inode.c | |||
@@ -108,7 +108,8 @@ static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma) | |||
108 | 108 | ||
109 | if (hugetlb_reserve_pages(inode, | 109 | if (hugetlb_reserve_pages(inode, |
110 | vma->vm_pgoff >> huge_page_order(h), | 110 | vma->vm_pgoff >> huge_page_order(h), |
111 | len >> huge_page_shift(h), vma)) | 111 | len >> huge_page_shift(h), vma, |
112 | vma->vm_flags)) | ||
112 | goto out; | 113 | goto out; |
113 | 114 | ||
114 | ret = 0; | 115 | ret = 0; |
@@ -947,7 +948,7 @@ static int can_do_hugetlb_shm(void) | |||
947 | can_do_mlock()); | 948 | can_do_mlock()); |
948 | } | 949 | } |
949 | 950 | ||
950 | struct file *hugetlb_file_setup(const char *name, size_t size) | 951 | struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag) |
951 | { | 952 | { |
952 | int error = -ENOMEM; | 953 | int error = -ENOMEM; |
953 | struct file *file; | 954 | struct file *file; |
@@ -981,7 +982,8 @@ struct file *hugetlb_file_setup(const char *name, size_t size) | |||
981 | 982 | ||
982 | error = -ENOMEM; | 983 | error = -ENOMEM; |
983 | if (hugetlb_reserve_pages(inode, 0, | 984 | if (hugetlb_reserve_pages(inode, 0, |
984 | size >> huge_page_shift(hstate_inode(inode)), NULL)) | 985 | size >> huge_page_shift(hstate_inode(inode)), NULL, |
986 | acctflag)) | ||
985 | goto out_inode; | 987 | goto out_inode; |
986 | 988 | ||
987 | d_instantiate(dentry, inode); | 989 | d_instantiate(dentry, inode); |
diff --git a/fs/jbd/journal.c b/fs/jbd/journal.c index 9e4fa52d7dc8..e79c07812afa 100644 --- a/fs/jbd/journal.c +++ b/fs/jbd/journal.c | |||
@@ -427,7 +427,7 @@ int __log_space_left(journal_t *journal) | |||
427 | } | 427 | } |
428 | 428 | ||
429 | /* | 429 | /* |
430 | * Called under j_state_lock. Returns true if a transaction was started. | 430 | * Called under j_state_lock. Returns true if a transaction commit was started. |
431 | */ | 431 | */ |
432 | int __log_start_commit(journal_t *journal, tid_t target) | 432 | int __log_start_commit(journal_t *journal, tid_t target) |
433 | { | 433 | { |
@@ -495,7 +495,8 @@ int journal_force_commit_nested(journal_t *journal) | |||
495 | 495 | ||
496 | /* | 496 | /* |
497 | * Start a commit of the current running transaction (if any). Returns true | 497 | * Start a commit of the current running transaction (if any). Returns true |
498 | * if a transaction was started, and fills its tid in at *ptid | 498 | * if a transaction is going to be committed (or is currently already |
499 | * committing), and fills its tid in at *ptid | ||
499 | */ | 500 | */ |
500 | int journal_start_commit(journal_t *journal, tid_t *ptid) | 501 | int journal_start_commit(journal_t *journal, tid_t *ptid) |
501 | { | 502 | { |
@@ -505,15 +506,19 @@ int journal_start_commit(journal_t *journal, tid_t *ptid) | |||
505 | if (journal->j_running_transaction) { | 506 | if (journal->j_running_transaction) { |
506 | tid_t tid = journal->j_running_transaction->t_tid; | 507 | tid_t tid = journal->j_running_transaction->t_tid; |
507 | 508 | ||
508 | ret = __log_start_commit(journal, tid); | 509 | __log_start_commit(journal, tid); |
509 | if (ret && ptid) | 510 | /* There's a running transaction and we've just made sure |
511 | * it's commit has been scheduled. */ | ||
512 | if (ptid) | ||
510 | *ptid = tid; | 513 | *ptid = tid; |
511 | } else if (journal->j_committing_transaction && ptid) { | 514 | ret = 1; |
515 | } else if (journal->j_committing_transaction) { | ||
512 | /* | 516 | /* |
513 | * If ext3_write_super() recently started a commit, then we | 517 | * If ext3_write_super() recently started a commit, then we |
514 | * have to wait for completion of that transaction | 518 | * have to wait for completion of that transaction |
515 | */ | 519 | */ |
516 | *ptid = journal->j_committing_transaction->t_tid; | 520 | if (ptid) |
521 | *ptid = journal->j_committing_transaction->t_tid; | ||
517 | ret = 1; | 522 | ret = 1; |
518 | } | 523 | } |
519 | spin_unlock(&journal->j_state_lock); | 524 | spin_unlock(&journal->j_state_lock); |
diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c index 6063a8e4b9f3..763b78a6e9de 100644 --- a/fs/lockd/svclock.c +++ b/fs/lockd/svclock.c | |||
@@ -427,7 +427,7 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file, | |||
427 | goto out; | 427 | goto out; |
428 | case -EAGAIN: | 428 | case -EAGAIN: |
429 | ret = nlm_lck_denied; | 429 | ret = nlm_lck_denied; |
430 | goto out; | 430 | break; |
431 | case FILE_LOCK_DEFERRED: | 431 | case FILE_LOCK_DEFERRED: |
432 | if (wait) | 432 | if (wait) |
433 | break; | 433 | break; |
@@ -443,6 +443,10 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file, | |||
443 | goto out; | 443 | goto out; |
444 | } | 444 | } |
445 | 445 | ||
446 | ret = nlm_lck_denied; | ||
447 | if (!wait) | ||
448 | goto out; | ||
449 | |||
446 | ret = nlm_lck_blocked; | 450 | ret = nlm_lck_blocked; |
447 | 451 | ||
448 | /* Append to list of blocked */ | 452 | /* Append to list of blocked */ |