diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-01-25 20:11:13 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-01-25 20:11:13 -0500 |
| commit | 29bd17af7d8ffc16bb5eb286947495c166ea826e (patch) | |
| tree | 5c20c44b51bdb3573949d1dc23bc3d3927d759fa /fs/ocfs2/localalloc.c | |
| parent | 2ba14a017a4ba8d2266316f481d4ad7400073d18 (diff) | |
| parent | 2fe5c1d7eb88830b09c863a4b5b3279dc120f3af (diff) | |
Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfasheh/ocfs2
* 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfasheh/ocfs2: (31 commits)
ocfs2: clean up bh null checks
ocfs2: document access rules for blocked_lock_list
configfs: file.c fix possible recursive locking
configfs: dir.c fix possible recursive locking
configfs: Remove EXPERIMENTAL
ocfs2: bump version number
ocfs2/dlm: Clear joining_node on hearbeat node down
ocfs2: convert byte order of constant instead of variable
ocfs2: Update default cluster timeouts
ocfs2: printf fixes
ocfs2: Use generic_file_llseek
ocfs2: Safer read_inline_data()
ocfs2: Silence false lockdep warnings
[PATCH 2/2] ocfs2: cluster aware flock()
[PATCH 1/2] ocfs2: add flock lock type
ocfs2: Local alloc window size changeable via mount option
ocfs2: Support commit= mount option
ocfs2: Add missing permission checks
[PATCH 2/2] ocfs2: Implement group add for online resize
[PATCH 1/2] ocfs2: Add group extend for online resize
...
Diffstat (limited to 'fs/ocfs2/localalloc.c')
| -rw-r--r-- | fs/ocfs2/localalloc.c | 50 |
1 files changed, 34 insertions, 16 deletions
diff --git a/fs/ocfs2/localalloc.c b/fs/ocfs2/localalloc.c index 58ea88b5af36..add1ffdc5c6c 100644 --- a/fs/ocfs2/localalloc.c +++ b/fs/ocfs2/localalloc.c | |||
| @@ -75,18 +75,12 @@ static int ocfs2_local_alloc_new_window(struct ocfs2_super *osb, | |||
| 75 | static int ocfs2_local_alloc_slide_window(struct ocfs2_super *osb, | 75 | static int ocfs2_local_alloc_slide_window(struct ocfs2_super *osb, |
| 76 | struct inode *local_alloc_inode); | 76 | struct inode *local_alloc_inode); |
| 77 | 77 | ||
| 78 | /* | ||
| 79 | * Determine how large our local alloc window should be, in bits. | ||
| 80 | * | ||
| 81 | * These values (and the behavior in ocfs2_alloc_should_use_local) have | ||
| 82 | * been chosen so that most allocations, including new block groups go | ||
| 83 | * through local alloc. | ||
| 84 | */ | ||
| 85 | static inline int ocfs2_local_alloc_window_bits(struct ocfs2_super *osb) | 78 | static inline int ocfs2_local_alloc_window_bits(struct ocfs2_super *osb) |
| 86 | { | 79 | { |
| 87 | BUG_ON(osb->s_clustersize_bits < 12); | 80 | BUG_ON(osb->s_clustersize_bits > 20); |
| 88 | 81 | ||
| 89 | return 2048 >> (osb->s_clustersize_bits - 12); | 82 | /* Size local alloc windows by the megabyte */ |
| 83 | return osb->local_alloc_size << (20 - osb->s_clustersize_bits); | ||
| 90 | } | 84 | } |
| 91 | 85 | ||
| 92 | /* | 86 | /* |
| @@ -96,18 +90,23 @@ static inline int ocfs2_local_alloc_window_bits(struct ocfs2_super *osb) | |||
| 96 | int ocfs2_alloc_should_use_local(struct ocfs2_super *osb, u64 bits) | 90 | int ocfs2_alloc_should_use_local(struct ocfs2_super *osb, u64 bits) |
| 97 | { | 91 | { |
| 98 | int la_bits = ocfs2_local_alloc_window_bits(osb); | 92 | int la_bits = ocfs2_local_alloc_window_bits(osb); |
| 93 | int ret = 0; | ||
| 99 | 94 | ||
| 100 | if (osb->local_alloc_state != OCFS2_LA_ENABLED) | 95 | if (osb->local_alloc_state != OCFS2_LA_ENABLED) |
| 101 | return 0; | 96 | goto bail; |
| 102 | 97 | ||
| 103 | /* la_bits should be at least twice the size (in clusters) of | 98 | /* la_bits should be at least twice the size (in clusters) of |
| 104 | * a new block group. We want to be sure block group | 99 | * a new block group. We want to be sure block group |
| 105 | * allocations go through the local alloc, so allow an | 100 | * allocations go through the local alloc, so allow an |
| 106 | * allocation to take up to half the bitmap. */ | 101 | * allocation to take up to half the bitmap. */ |
| 107 | if (bits > (la_bits / 2)) | 102 | if (bits > (la_bits / 2)) |
| 108 | return 0; | 103 | goto bail; |
| 109 | 104 | ||
| 110 | return 1; | 105 | ret = 1; |
| 106 | bail: | ||
| 107 | mlog(0, "state=%d, bits=%llu, la_bits=%d, ret=%d\n", | ||
| 108 | osb->local_alloc_state, (unsigned long long)bits, la_bits, ret); | ||
| 109 | return ret; | ||
| 111 | } | 110 | } |
| 112 | 111 | ||
| 113 | int ocfs2_load_local_alloc(struct ocfs2_super *osb) | 112 | int ocfs2_load_local_alloc(struct ocfs2_super *osb) |
| @@ -121,6 +120,19 @@ int ocfs2_load_local_alloc(struct ocfs2_super *osb) | |||
| 121 | 120 | ||
| 122 | mlog_entry_void(); | 121 | mlog_entry_void(); |
| 123 | 122 | ||
| 123 | if (ocfs2_mount_local(osb)) | ||
| 124 | goto bail; | ||
| 125 | |||
| 126 | if (osb->local_alloc_size == 0) | ||
| 127 | goto bail; | ||
| 128 | |||
| 129 | if (ocfs2_local_alloc_window_bits(osb) >= osb->bitmap_cpg) { | ||
| 130 | mlog(ML_NOTICE, "Requested local alloc window %d is larger " | ||
| 131 | "than max possible %u. Using defaults.\n", | ||
| 132 | ocfs2_local_alloc_window_bits(osb), (osb->bitmap_cpg - 1)); | ||
| 133 | osb->local_alloc_size = OCFS2_DEFAULT_LOCAL_ALLOC_SIZE; | ||
| 134 | } | ||
| 135 | |||
| 124 | /* read the alloc off disk */ | 136 | /* read the alloc off disk */ |
| 125 | inode = ocfs2_get_system_file_inode(osb, LOCAL_ALLOC_SYSTEM_INODE, | 137 | inode = ocfs2_get_system_file_inode(osb, LOCAL_ALLOC_SYSTEM_INODE, |
| 126 | osb->slot_num); | 138 | osb->slot_num); |
| @@ -181,6 +193,9 @@ bail: | |||
| 181 | if (inode) | 193 | if (inode) |
| 182 | iput(inode); | 194 | iput(inode); |
| 183 | 195 | ||
| 196 | mlog(0, "Local alloc window bits = %d\n", | ||
| 197 | ocfs2_local_alloc_window_bits(osb)); | ||
| 198 | |||
| 184 | mlog_exit(status); | 199 | mlog_exit(status); |
| 185 | return status; | 200 | return status; |
| 186 | } | 201 | } |
| @@ -231,7 +246,7 @@ void ocfs2_shutdown_local_alloc(struct ocfs2_super *osb) | |||
| 231 | 246 | ||
| 232 | mutex_lock(&main_bm_inode->i_mutex); | 247 | mutex_lock(&main_bm_inode->i_mutex); |
| 233 | 248 | ||
| 234 | status = ocfs2_meta_lock(main_bm_inode, &main_bm_bh, 1); | 249 | status = ocfs2_inode_lock(main_bm_inode, &main_bm_bh, 1); |
| 235 | if (status < 0) { | 250 | if (status < 0) { |
| 236 | mlog_errno(status); | 251 | mlog_errno(status); |
| 237 | goto out_mutex; | 252 | goto out_mutex; |
| @@ -286,7 +301,7 @@ out_unlock: | |||
| 286 | if (main_bm_bh) | 301 | if (main_bm_bh) |
| 287 | brelse(main_bm_bh); | 302 | brelse(main_bm_bh); |
| 288 | 303 | ||
| 289 | ocfs2_meta_unlock(main_bm_inode, 1); | 304 | ocfs2_inode_unlock(main_bm_inode, 1); |
| 290 | 305 | ||
| 291 | out_mutex: | 306 | out_mutex: |
| 292 | mutex_unlock(&main_bm_inode->i_mutex); | 307 | mutex_unlock(&main_bm_inode->i_mutex); |
| @@ -399,7 +414,7 @@ int ocfs2_complete_local_alloc_recovery(struct ocfs2_super *osb, | |||
| 399 | 414 | ||
| 400 | mutex_lock(&main_bm_inode->i_mutex); | 415 | mutex_lock(&main_bm_inode->i_mutex); |
| 401 | 416 | ||
| 402 | status = ocfs2_meta_lock(main_bm_inode, &main_bm_bh, 1); | 417 | status = ocfs2_inode_lock(main_bm_inode, &main_bm_bh, 1); |
| 403 | if (status < 0) { | 418 | if (status < 0) { |
| 404 | mlog_errno(status); | 419 | mlog_errno(status); |
| 405 | goto out_mutex; | 420 | goto out_mutex; |
| @@ -424,7 +439,7 @@ int ocfs2_complete_local_alloc_recovery(struct ocfs2_super *osb, | |||
| 424 | ocfs2_commit_trans(osb, handle); | 439 | ocfs2_commit_trans(osb, handle); |
| 425 | 440 | ||
| 426 | out_unlock: | 441 | out_unlock: |
| 427 | ocfs2_meta_unlock(main_bm_inode, 1); | 442 | ocfs2_inode_unlock(main_bm_inode, 1); |
| 428 | 443 | ||
| 429 | out_mutex: | 444 | out_mutex: |
| 430 | mutex_unlock(&main_bm_inode->i_mutex); | 445 | mutex_unlock(&main_bm_inode->i_mutex); |
| @@ -521,6 +536,9 @@ bail: | |||
| 521 | iput(local_alloc_inode); | 536 | iput(local_alloc_inode); |
| 522 | } | 537 | } |
| 523 | 538 | ||
| 539 | mlog(0, "bits=%d, slot=%d, ret=%d\n", bits_wanted, osb->slot_num, | ||
| 540 | status); | ||
| 541 | |||
| 524 | mlog_exit(status); | 542 | mlog_exit(status); |
| 525 | return status; | 543 | return status; |
| 526 | } | 544 | } |
