diff options
-rw-r--r-- | fs/ocfs2/dir.c | 3 | ||||
-rw-r--r-- | fs/ocfs2/inode.c | 4 | ||||
-rw-r--r-- | fs/ocfs2/reservations.c | 8 | ||||
-rw-r--r-- | fs/ocfs2/reservations.h | 4 | ||||
-rw-r--r-- | fs/ocfs2/suballoc.c | 1 |
5 files changed, 17 insertions, 3 deletions
diff --git a/fs/ocfs2/dir.c b/fs/ocfs2/dir.c index 6d832487c187..8563f97c58af 100644 --- a/fs/ocfs2/dir.c +++ b/fs/ocfs2/dir.c | |||
@@ -2977,6 +2977,7 @@ static int ocfs2_expand_inline_dir(struct inode *dir, struct buffer_head *di_bh, | |||
2977 | * if we only get one now, that's enough to continue. The rest | 2977 | * if we only get one now, that's enough to continue. The rest |
2978 | * will be claimed after the conversion to extents. | 2978 | * will be claimed after the conversion to extents. |
2979 | */ | 2979 | */ |
2980 | data_ac->ac_resv = &oi->ip_la_data_resv; | ||
2980 | ret = ocfs2_claim_clusters(osb, handle, data_ac, 1, &bit_off, &len); | 2981 | ret = ocfs2_claim_clusters(osb, handle, data_ac, 1, &bit_off, &len); |
2981 | if (ret) { | 2982 | if (ret) { |
2982 | mlog_errno(ret); | 2983 | mlog_errno(ret); |
@@ -3347,6 +3348,8 @@ static int ocfs2_extend_dir(struct ocfs2_super *osb, | |||
3347 | goto bail; | 3348 | goto bail; |
3348 | } | 3349 | } |
3349 | 3350 | ||
3351 | data_ac->ac_resv = &OCFS2_I(dir)->ip_la_data_resv; | ||
3352 | |||
3350 | credits = ocfs2_calc_extend_credits(sb, el, 1); | 3353 | credits = ocfs2_calc_extend_credits(sb, el, 1); |
3351 | } else { | 3354 | } else { |
3352 | spin_unlock(&OCFS2_I(dir)->ip_lock); | 3355 | spin_unlock(&OCFS2_I(dir)->ip_lock); |
diff --git a/fs/ocfs2/inode.c b/fs/ocfs2/inode.c index 62b4743fb6f1..9ee13f70da57 100644 --- a/fs/ocfs2/inode.c +++ b/fs/ocfs2/inode.c | |||
@@ -377,6 +377,10 @@ void ocfs2_populate_inode(struct inode *inode, struct ocfs2_dinode *fe, | |||
377 | 377 | ||
378 | OCFS2_I(inode)->ip_last_used_slot = 0; | 378 | OCFS2_I(inode)->ip_last_used_slot = 0; |
379 | OCFS2_I(inode)->ip_last_used_group = 0; | 379 | OCFS2_I(inode)->ip_last_used_group = 0; |
380 | |||
381 | if (S_ISDIR(inode->i_mode)) | ||
382 | ocfs2_resv_set_type(&OCFS2_I(inode)->ip_la_data_resv, | ||
383 | OCFS2_RESV_FLAG_DIR); | ||
380 | mlog_exit_void(); | 384 | mlog_exit_void(); |
381 | } | 385 | } |
382 | 386 | ||
diff --git a/fs/ocfs2/reservations.c b/fs/ocfs2/reservations.c index 79642d608210..7fc6cfee95f1 100644 --- a/fs/ocfs2/reservations.c +++ b/fs/ocfs2/reservations.c | |||
@@ -44,6 +44,7 @@ DEFINE_SPINLOCK(resv_lock); | |||
44 | 44 | ||
45 | #define OCFS2_MIN_RESV_WINDOW_BITS 8 | 45 | #define OCFS2_MIN_RESV_WINDOW_BITS 8 |
46 | #define OCFS2_MAX_RESV_WINDOW_BITS 1024 | 46 | #define OCFS2_MAX_RESV_WINDOW_BITS 1024 |
47 | #define OCFS2_RESV_DIR_WINDOW_BITS OCFS2_MIN_RESV_WINDOW_BITS | ||
47 | 48 | ||
48 | static unsigned int ocfs2_resv_window_bits(struct ocfs2_reservation_map *resmap, | 49 | static unsigned int ocfs2_resv_window_bits(struct ocfs2_reservation_map *resmap, |
49 | struct ocfs2_alloc_reservation *resv) | 50 | struct ocfs2_alloc_reservation *resv) |
@@ -51,8 +52,11 @@ static unsigned int ocfs2_resv_window_bits(struct ocfs2_reservation_map *resmap, | |||
51 | struct ocfs2_super *osb = resmap->m_osb; | 52 | struct ocfs2_super *osb = resmap->m_osb; |
52 | unsigned int bits; | 53 | unsigned int bits; |
53 | 54 | ||
54 | /* 8, 16, 32, 64, 128, 256, 512, 1024 */ | 55 | if (!(resv->r_flags & OCFS2_RESV_FLAG_DIR)) { |
55 | bits = 4 << osb->osb_resv_level; | 56 | /* 8, 16, 32, 64, 128, 256, 512, 1024 */ |
57 | bits = 4 << osb->osb_resv_level; | ||
58 | } else | ||
59 | bits = OCFS2_RESV_DIR_WINDOW_BITS; | ||
56 | 60 | ||
57 | return bits; | 61 | return bits; |
58 | } | 62 | } |
diff --git a/fs/ocfs2/reservations.h b/fs/ocfs2/reservations.h index 8341cd0ef855..34bb308375c5 100644 --- a/fs/ocfs2/reservations.h +++ b/fs/ocfs2/reservations.h | |||
@@ -42,6 +42,8 @@ struct ocfs2_alloc_reservation { | |||
42 | #define OCFS2_RESV_FLAG_INUSE 0x01 /* Set when r_node is part of a btree */ | 42 | #define OCFS2_RESV_FLAG_INUSE 0x01 /* Set when r_node is part of a btree */ |
43 | #define OCFS2_RESV_FLAG_TMP 0x02 /* Temporary reservation, will be | 43 | #define OCFS2_RESV_FLAG_TMP 0x02 /* Temporary reservation, will be |
44 | * destroyed immedately after use */ | 44 | * destroyed immedately after use */ |
45 | #define OCFS2_RESV_FLAG_DIR 0x04 /* Reservation is for an unindexed | ||
46 | * directory btree */ | ||
45 | 47 | ||
46 | struct ocfs2_reservation_map { | 48 | struct ocfs2_reservation_map { |
47 | struct rb_root m_reservations; | 49 | struct rb_root m_reservations; |
@@ -61,7 +63,7 @@ struct ocfs2_reservation_map { | |||
61 | 63 | ||
62 | void ocfs2_resv_init_once(struct ocfs2_alloc_reservation *resv); | 64 | void ocfs2_resv_init_once(struct ocfs2_alloc_reservation *resv); |
63 | 65 | ||
64 | #define OCFS2_RESV_TYPES (OCFS2_RESV_FLAG_TMP) | 66 | #define OCFS2_RESV_TYPES (OCFS2_RESV_FLAG_TMP|OCFS2_RESV_FLAG_DIR) |
65 | void ocfs2_resv_set_type(struct ocfs2_alloc_reservation *resv, | 67 | void ocfs2_resv_set_type(struct ocfs2_alloc_reservation *resv, |
66 | unsigned int flags); | 68 | unsigned int flags); |
67 | 69 | ||
diff --git a/fs/ocfs2/suballoc.c b/fs/ocfs2/suballoc.c index d4babfba4f04..f20bcbf64ce0 100644 --- a/fs/ocfs2/suballoc.c +++ b/fs/ocfs2/suballoc.c | |||
@@ -130,6 +130,7 @@ void ocfs2_free_ac_resource(struct ocfs2_alloc_context *ac) | |||
130 | } | 130 | } |
131 | brelse(ac->ac_bh); | 131 | brelse(ac->ac_bh); |
132 | ac->ac_bh = NULL; | 132 | ac->ac_bh = NULL; |
133 | ac->ac_resv = NULL; | ||
133 | } | 134 | } |
134 | 135 | ||
135 | void ocfs2_free_alloc_context(struct ocfs2_alloc_context *ac) | 136 | void ocfs2_free_alloc_context(struct ocfs2_alloc_context *ac) |