* version 2.0.0
* Support for kernels:
2.6.16.60-0.37 (SLES 10),
- 2.6.18-128.1.1.el5 (RHEL 5),
+ 2.6.18-128.1.6.el5 (RHEL 5),
2.6.22.14 vanilla (kernel.org).
* Client support for unpatched kernels:
(see http://wiki.lustre.org/index.php?title=Patchless_Client)
* File join has been disabled in this release, refer to Bugzilla 16929.
Severity : enhancement
+Bugzilla : 19024
+Description: Update kernel to RHEL5.3 2.6.18-128.1.6.el5.
+
+Severity : enhancement
Bugzilla : 19212
Description: Update kernel to SLES10 SP2 2.6.16.60-0.37.
-Index: linux-2.6.18.8/fs/jbd/commit.c
+Index: linux-2.6.18-128.1.6/fs/jbd/commit.c
===================================================================
---- linux-2.6.18.8.orig/fs/jbd/commit.c
-+++ linux-2.6.18.8/fs/jbd/commit.c
+--- linux-2.6.18-128.1.6.orig/fs/jbd/commit.c 2009-06-02 23:24:00.000000000 -0600
++++ linux-2.6.18-128.1.6/fs/jbd/commit.c 2009-06-02 23:26:07.000000000 -0600
@@ -22,6 +22,7 @@
#include <linux/mm.h>
#include <linux/pagemap.h>
/*
-@@ -95,19 +96,23 @@ static int inverted_lock(journal_t *jour
+@@ -95,19 +96,23 @@
return 1;
}
int barrier_done = 0;
if (is_journal_aborted(journal))
-@@ -119,21 +124,34 @@ static int journal_write_commit_record(j
+@@ -119,21 +124,34 @@
bh = jh2bh(descriptor);
/* is it possible for another commit to fail at roughly
* the same time as this one? If so, we don't want to
* trust the barrier flag in the super, but instead want
-@@ -154,12 +173,70 @@ static int journal_write_commit_record(j
+@@ -154,12 +172,70 @@
clear_buffer_ordered(bh);
set_buffer_uptodate(bh);
set_buffer_dirty(bh);
}
void journal_do_submit_data(struct buffer_head **wbuf, int bufs)
-@@ -273,6 +350,20 @@ write_out_data:
- journal_do_submit_data(wbuf, bufs);
+@@ -282,6 +358,20 @@
+ return err;
}
+static inline __u32 jbd_checksum_data(__u32 crc32_sum, struct buffer_head *bh)
/*
* journal_commit_transaction
*
-@@ -296,6 +387,8 @@ void journal_commit_transaction(journal_
+@@ -305,6 +395,8 @@
int first_tag = 0;
int tag_flag;
int i;
/*
* First job: lock down the current transaction and wait for
-@@ -439,39 +532,14 @@ void journal_commit_transaction(journal_
- journal_submit_data_buffers(journal, commit_transaction);
+@@ -431,39 +523,14 @@
+ err = journal_submit_data_buffers(journal, commit_transaction);
/*
- * Wait for all previously submitted IO to complete.
spin_unlock(&journal->j_list_lock);
if (err)
-@@ -643,6 +712,16 @@ void journal_commit_transaction(journal_
+@@ -642,6 +709,16 @@
start_journal_io:
for (i = 0; i < bufs; i++) {
struct buffer_head *bh = wbuf[i];
lock_buffer(bh);
clear_buffer_dirty(bh);
set_buffer_uptodate(bh);
-@@ -659,6 +738,23 @@ start_journal_io:
+@@ -658,6 +735,23 @@
}
}
/* Lo and behold: we have just managed to send a transaction to
the log. Before we can commit it, wait for the IO so far to
complete. Control buffers being written are on the
-@@ -757,9 +853,15 @@ wait_for_iobuf:
- }
+@@ -759,9 +853,15 @@
+ journal_abort(journal, err);
jbd_debug(3, "JBD: commit phase 6\n");
-
+ err = journal_wait_on_commit_record(cbh);
if (err)
- __journal_abort_hard(journal);
-Index: linux-2.6.18.8/include/linux/jbd.h
-===================================================================
---- linux-2.6.18.8.orig/include/linux/jbd.h
-+++ linux-2.6.18.8/include/linux/jbd.h
-@@ -148,6 +148,29 @@ typedef struct journal_header_s
- __be32 h_sequence;
- } journal_header_t;
-
-+/*
-+ * Checksum types.
-+ */
-+#define JFS_CRC32_CHKSUM 1
-+#define JFS_MD5_CHKSUM 2
-+#define JFS_SHA1_CHKSUM 3
-+
-+#define JFS_CRC32_CHKSUM_SIZE 4
-+
-+#define JFS_CHECKSUM_BYTES (32 / sizeof(u32))
-+/*
-+ * Commit block header for storing transactional checksums:
-+ */
-+struct commit_header
-+{
-+ __be32 h_magic;
-+ __be32 h_blocktype;
-+ __be32 h_sequence;
-+ unsigned char h_chksum_type;
-+ unsigned char h_chksum_size;
-+ unsigned char h_padding[2];
-+ __be32 h_chksum[JFS_CHECKSUM_BYTES];
-+};
-
- /*
- * The block tag: used to describe a single buffer in the journal
-@@ -234,12 +257,16 @@ typedef struct journal_superblock_s
- ((j)->j_format_version >= 2 && \
- ((j)->j_superblock->s_feature_incompat & cpu_to_be32((mask))))
-
--#define JFS_FEATURE_INCOMPAT_REVOKE 0x00000001
-+#define JFS_FEATURE_COMPAT_CHECKSUM 0x00000001
-+
-+#define JFS_FEATURE_INCOMPAT_REVOKE 0x00000001
-+#define JFS_FEATURE_INCOMPAT_ASYNC_COMMIT 0x00000004
-
- /* Features known to this kernel version: */
--#define JFS_KNOWN_COMPAT_FEATURES 0
-+#define JFS_KNOWN_COMPAT_FEATURES JFS_FEATURE_COMPAT_CHECKSUM
- #define JFS_KNOWN_ROCOMPAT_FEATURES 0
--#define JFS_KNOWN_INCOMPAT_FEATURES JFS_FEATURE_INCOMPAT_REVOKE
-+#define JFS_KNOWN_INCOMPAT_FEATURES (JFS_FEATURE_INCOMPAT_REVOKE | \
-+ JFS_FEATURE_INCOMPAT_ASYNC_COMMIT)
-
- #ifdef __KERNEL__
-
-@@ -1053,6 +1080,8 @@ extern int journal_check_available_fe
- (journal_t *, unsigned long, unsigned long, unsigned long);
- extern int journal_set_features
- (journal_t *, unsigned long, unsigned long, unsigned long);
-+extern int journal_clear_features
-+ (journal_t *, unsigned long, unsigned long, unsigned long);
- extern int journal_create (journal_t *);
- extern int journal_load (journal_t *journal);
- extern void journal_destroy (journal_t *);
-Index: linux-2.6.18.8/fs/jbd/recovery.c
+ journal_abort(journal, err);
+Index: linux-2.6.18-128.1.6/fs/jbd/recovery.c
===================================================================
---- linux-2.6.18.8.orig/fs/jbd/recovery.c
-+++ linux-2.6.18.8/fs/jbd/recovery.c
+--- linux-2.6.18-128.1.6.orig/fs/jbd/recovery.c 2009-04-14 21:05:39.000000000 -0600
++++ linux-2.6.18-128.1.6/fs/jbd/recovery.c 2009-06-02 23:26:07.000000000 -0600
@@ -21,6 +21,7 @@
#include <linux/jbd.h>
#include <linux/errno.h>
#endif
/*
-@@ -307,6 +308,38 @@ int journal_skip_recovery(journal_t *jou
+@@ -310,6 +311,38 @@
return err;
}
static int do_one_pass(journal_t *journal,
struct recovery_info *info, enum passtype pass)
{
-@@ -318,6 +351,7 @@ static int do_one_pass(journal_t *journa
+@@ -321,6 +354,7 @@
struct buffer_head * bh;
unsigned int sequence;
int blocktype;
/* Precompute the maximum metadata descriptors in a descriptor block */
int MAX_BLOCKS_PER_DESC;
-@@ -409,9 +443,24 @@ static int do_one_pass(journal_t *journa
+@@ -412,9 +446,24 @@
switch(blocktype) {
case JFS_DESCRIPTOR_BLOCK:
/* If it is a valid descriptor block, replay it
next_log_block +=
count_tags(bh, journal->j_blocksize);
wrap(journal, next_log_block);
-@@ -506,9 +555,97 @@ static int do_one_pass(journal_t *journa
+@@ -509,9 +558,97 @@
continue;
case JFS_COMMIT_BLOCK:
brelse(bh);
next_commit_ID++;
continue;
-@@ -544,9 +681,10 @@ static int do_one_pass(journal_t *journa
+@@ -547,9 +684,10 @@
* transaction marks the end of the valid log.
*/
/* It's really bad news if different passes end up at
* different places (but possible due to IO errors). */
if (info->end_transaction != next_commit_ID) {
-Index: linux-2.6.18.8/fs/jbd/journal.c
+Index: linux-2.6.18-128.1.6/fs/jbd/journal.c
===================================================================
---- linux-2.6.18.8.orig/fs/jbd/journal.c
-+++ linux-2.6.18.8/fs/jbd/journal.c
-@@ -67,6 +67,7 @@ EXPORT_SYMBOL(journal_update_format);
+--- linux-2.6.18-128.1.6.orig/fs/jbd/journal.c 2009-06-02 23:24:00.000000000 -0600
++++ linux-2.6.18-128.1.6/fs/jbd/journal.c 2009-06-02 23:26:07.000000000 -0600
+@@ -67,6 +67,7 @@
EXPORT_SYMBOL(journal_check_used_features);
EXPORT_SYMBOL(journal_check_available_features);
EXPORT_SYMBOL(journal_set_features);
EXPORT_SYMBOL(journal_create);
EXPORT_SYMBOL(journal_load);
EXPORT_SYMBOL(journal_destroy);
-@@ -1573,6 +1574,33 @@ int journal_set_features (journal_t *jou
+@@ -1583,6 +1584,33 @@
return 1;
}
/**
* int journal_update_format () - Update on-disk journal structure.
-Index: linux-2.6.18.8/fs/Kconfig
+Index: linux-2.6.18-128.1.6/fs/Kconfig
===================================================================
---- linux-2.6.18.8.orig/fs/Kconfig
-+++ linux-2.6.18.8/fs/Kconfig
-@@ -140,6 +140,7 @@ config EXT3_FS_SECURITY
+--- linux-2.6.18-128.1.6.orig/fs/Kconfig 2009-04-14 21:05:39.000000000 -0600
++++ linux-2.6.18-128.1.6/fs/Kconfig 2009-06-02 23:26:07.000000000 -0600
+@@ -206,6 +206,7 @@
config JBD
tristate
help
This is a generic journaling layer for block devices. It is
currently used by the ext3 and OCFS2 file systems, but it could
-Index: linux-2.6.18.8/Documentation/filesystems/ext3.txt
+Index: linux-2.6.18-128.1.6/include/linux/jbd.h
+===================================================================
+--- linux-2.6.18-128.1.6.orig/include/linux/jbd.h 2009-06-02 23:24:00.000000000 -0600
++++ linux-2.6.18-128.1.6/include/linux/jbd.h 2009-06-02 23:26:07.000000000 -0600
+@@ -148,6 +148,29 @@
+ __be32 h_sequence;
+ } journal_header_t;
+
++/*
++ * Checksum types.
++ */
++#define JFS_CRC32_CHKSUM 1
++#define JFS_MD5_CHKSUM 2
++#define JFS_SHA1_CHKSUM 3
++
++#define JFS_CRC32_CHKSUM_SIZE 4
++
++#define JFS_CHECKSUM_BYTES (32 / sizeof(u32))
++/*
++ * Commit block header for storing transactional checksums:
++ */
++struct commit_header
++{
++ __be32 h_magic;
++ __be32 h_blocktype;
++ __be32 h_sequence;
++ unsigned char h_chksum_type;
++ unsigned char h_chksum_size;
++ unsigned char h_padding[2];
++ __be32 h_chksum[JFS_CHECKSUM_BYTES];
++};
+
+ /*
+ * The block tag: used to describe a single buffer in the journal
+@@ -234,12 +257,16 @@
+ ((j)->j_format_version >= 2 && \
+ ((j)->j_superblock->s_feature_incompat & cpu_to_be32((mask))))
+
+-#define JFS_FEATURE_INCOMPAT_REVOKE 0x00000001
++#define JFS_FEATURE_COMPAT_CHECKSUM 0x00000001
++
++#define JFS_FEATURE_INCOMPAT_REVOKE 0x00000001
++#define JFS_FEATURE_INCOMPAT_ASYNC_COMMIT 0x00000004
+
+ /* Features known to this kernel version: */
+-#define JFS_KNOWN_COMPAT_FEATURES 0
++#define JFS_KNOWN_COMPAT_FEATURES JFS_FEATURE_COMPAT_CHECKSUM
+ #define JFS_KNOWN_ROCOMPAT_FEATURES 0
+-#define JFS_KNOWN_INCOMPAT_FEATURES JFS_FEATURE_INCOMPAT_REVOKE
++#define JFS_KNOWN_INCOMPAT_FEATURES (JFS_FEATURE_INCOMPAT_REVOKE | \
++ JFS_FEATURE_INCOMPAT_ASYNC_COMMIT)
+
+ #ifdef __KERNEL__
+
+@@ -1053,6 +1080,8 @@
+ (journal_t *, unsigned long, unsigned long, unsigned long);
+ extern int journal_set_features
+ (journal_t *, unsigned long, unsigned long, unsigned long);
++extern int journal_clear_features
++ (journal_t *, unsigned long, unsigned long, unsigned long);
+ extern int journal_create (journal_t *);
+ extern int journal_load (journal_t *journal);
+ #ifndef __GENKSYMS__
+Index: linux-2.6.18-128.1.6/Documentation/filesystems/ext3.txt
===================================================================
---- linux-2.6.18.8.orig/Documentation/filesystems/ext3.txt
-+++ linux-2.6.18.8/Documentation/filesystems/ext3.txt
-@@ -14,6 +14,16 @@ Options
+--- linux-2.6.18-128.1.6.orig/Documentation/filesystems/ext3.txt 2006-09-19 21:42:06.000000000 -0600
++++ linux-2.6.18-128.1.6/Documentation/filesystems/ext3.txt 2009-06-02 23:26:07.000000000 -0600
+@@ -14,6 +14,16 @@
When mounting an ext3 filesystem, the following option are accepted:
(*) == default
-Index: linux-2.6.18-8.1.8/include/linux/jbd.h
+Index: linux-2.6.18-128.1.6/include/linux/jbd.h
===================================================================
---- linux-2.6.18-8.1.8.orig/include/linux/jbd.h 2007-08-28 22:22:10.000000000 +0200
-+++ linux-2.6.18-8.1.8/include/linux/jbd.h 2007-08-28 22:22:29.000000000 +0200
-@@ -455,6 +455,16 @@ struct handle_s
+--- linux-2.6.18-128.1.6.orig/include/linux/jbd.h 2009-06-02 23:22:50.000000000 -0600
++++ linux-2.6.18-128.1.6/include/linux/jbd.h 2009-06-02 23:24:00.000000000 -0600
+@@ -428,6 +428,16 @@
};
/* The transaction_t type is the guts of the journaling mechanism. It
* tracks a compound transaction through its various states:
*
-@@ -592,6 +602,21 @@ struct transaction_s
+@@ -565,6 +575,21 @@
spinlock_t t_handle_lock;
/*
* Number of outstanding updates running on this transaction
* [t_handle_lock]
*/
-@@ -631,6 +656,57 @@ struct transaction_s
+@@ -604,6 +629,57 @@
struct list_head t_jcb;
};
/**
* struct journal_s - The journal_s type is the concrete type associated with
* journal_t.
-@@ -884,6 +960,16 @@ struct journal_s
+@@ -857,6 +933,16 @@
pid_t j_last_sync_writer;
/*
* An opaque pointer to fs-private information. ext3 puts its
* superblock pointer here
*/
-Index: linux-2.6.18-8.1.8/fs/jbd/transaction.c
+Index: linux-2.6.18-128.1.6/fs/jbd/transaction.c
===================================================================
---- linux-2.6.18-8.1.8.orig/fs/jbd/transaction.c 2007-08-28 22:22:10.000000000 +0200
-+++ linux-2.6.18-8.1.8/fs/jbd/transaction.c 2007-08-28 22:22:29.000000000 +0200
-@@ -60,6 +60,8 @@ get_transaction(journal_t *journal, tran
+--- linux-2.6.18-128.1.6.orig/fs/jbd/transaction.c 2009-06-02 23:22:50.000000000 -0600
++++ linux-2.6.18-128.1.6/fs/jbd/transaction.c 2009-06-02 23:24:00.000000000 -0600
+@@ -60,6 +60,8 @@
J_ASSERT(journal->j_running_transaction == NULL);
journal->j_running_transaction = transaction;
return transaction;
}
-@@ -86,6 +88,7 @@ static int start_this_handle(journal_t *
+@@ -86,6 +88,7 @@
int nblocks = handle->h_buffer_credits;
transaction_t *new_transaction = NULL;
int ret = 0;
if (nblocks > journal->j_max_transaction_buffers) {
printk(KERN_ERR "JBD: %s wants too many credits (%d > %d)\n",
-@@ -219,6 +222,12 @@ repeat_locked:
+@@ -219,6 +222,12 @@
/* OK, account for the buffers that this operation expects to
* use and add the handle to the running transaction. */
handle->h_transaction = transaction;
transaction->t_outstanding_credits += nblocks;
transaction->t_updates++;
-Index: linux-2.6.18-8.1.8/fs/jbd/journal.c
+Index: linux-2.6.18-128.1.6/fs/jbd/journal.c
===================================================================
---- linux-2.6.18-8.1.8.orig/fs/jbd/journal.c 2007-08-28 22:22:10.000000000 +0200
-+++ linux-2.6.18-8.1.8/fs/jbd/journal.c 2007-08-28 22:22:29.000000000 +0200
+--- linux-2.6.18-128.1.6.orig/fs/jbd/journal.c 2009-06-02 23:23:03.000000000 -0600
++++ linux-2.6.18-128.1.6/fs/jbd/journal.c 2009-06-02 23:24:00.000000000 -0600
@@ -36,6 +36,7 @@
#include <linux/kthread.h>
#include <linux/poison.h>
#include <asm/uaccess.h>
#include <asm/page.h>
-@@ -639,6 +640,300 @@ struct journal_head *journal_get_descrip
+@@ -638,6 +639,300 @@
return journal_add_journal_head(bh);
}
/*
* Management for journal control blocks: functions to create and
* destroy journal_t structures, and to initialise and read existing
-@@ -681,6 +976,9 @@ static journal_t * journal_init_common (
+@@ -680,6 +975,9 @@
kfree(journal);
goto fail;
}
return journal;
fail:
return NULL;
-@@ -724,6 +1022,7 @@ journal_t * journal_init_dev(struct bloc
+@@ -723,6 +1021,7 @@
journal->j_blk_offset = start;
journal->j_maxlen = len;
journal->j_blocksize = blocksize;
bh = __getblk(journal->j_dev, start, journal->j_blocksize);
J_ASSERT(bh != NULL);
-@@ -773,6 +1072,7 @@ journal_t * journal_init_inode (struct i
+@@ -772,6 +1071,7 @@
journal->j_maxlen = inode->i_size >> inode->i_sb->s_blocksize_bits;
journal->j_blocksize = inode->i_sb->s_blocksize;
/* journal descriptor can store up to n blocks -bzzz */
n = journal->j_blocksize / sizeof(journal_block_tag_t);
-@@ -1161,6 +1461,8 @@ void journal_destroy(journal_t *journal)
+@@ -1168,6 +1468,8 @@
brelse(journal->j_sb_buffer);
}
if (journal->j_inode)
iput(journal->j_inode);
if (journal->j_revoke)
-@@ -2027,6 +2329,28 @@ static void __exit remove_jbd_proc_entry
+@@ -2015,6 +2317,28 @@
#endif
kmem_cache_t *jbd_handle_cache;
static int __init journal_init_handle_cache(void)
-@@ -2090,6 +2414,7 @@ static int __init journal_init(void)
+@@ -2078,6 +2402,7 @@
if (ret != 0)
journal_destroy_caches();
create_jbd_proc_entry();
return ret;
}
-@@ -2101,6 +2426,7 @@ static void __exit journal_exit(void)
+@@ -2089,6 +2414,7 @@
printk(KERN_EMERG "JBD: leaked %d journal_heads!\n", n);
#endif
remove_jbd_proc_entry();
journal_destroy_caches();
}
-Index: linux-2.6.18-8.1.8/fs/jbd/checkpoint.c
+Index: linux-2.6.18-128.1.6/fs/jbd/checkpoint.c
===================================================================
---- linux-2.6.18-8.1.8.orig/fs/jbd/checkpoint.c 2007-08-28 22:22:10.000000000 +0200
-+++ linux-2.6.18-8.1.8/fs/jbd/checkpoint.c 2007-08-28 22:23:23.000000000 +0200
-@@ -231,7 +231,7 @@ __flush_batch(journal_t *journal, struct
+--- linux-2.6.18-128.1.6.orig/fs/jbd/checkpoint.c 2009-06-02 23:22:50.000000000 -0600
++++ linux-2.6.18-128.1.6/fs/jbd/checkpoint.c 2009-06-02 23:24:00.000000000 -0600
+@@ -242,7 +242,7 @@
* Called under jbd_lock_bh_state(jh2bh(jh)), and drops it
*/
static int __process_buffer(journal_t *journal, struct journal_head *jh,
{
struct buffer_head *bh = jh2bh(jh);
int ret = 0;
-@@ -249,6 +249,7 @@ static int __process_buffer(journal_t *j
+@@ -260,6 +260,7 @@
transaction_t *t = jh->b_transaction;
tid_t tid = t->t_tid;
spin_unlock(&journal->j_list_lock);
jbd_unlock_bh_state(bh);
log_start_commit(journal, tid);
-@@ -278,6 +279,7 @@ static int __process_buffer(journal_t *j
+@@ -291,6 +292,7 @@
bhs[*batch_count] = bh;
__buffer_relink_io(jh);
jbd_unlock_bh_state(bh);
(*batch_count)++;
if (*batch_count == NR_BATCH) {
spin_unlock(&journal->j_list_lock);
-@@ -321,6 +323,8 @@ int log_do_checkpoint(journal_t *journal
+@@ -336,6 +338,8 @@
if (!journal->j_checkpoint_transactions)
goto out;
transaction = journal->j_checkpoint_transactions;
this_tid = transaction->t_tid;
restart:
/*
-@@ -345,7 +349,8 @@ restart:
+@@ -360,7 +364,8 @@
retry = 1;
break;
}
- retry = __process_buffer(journal, jh, bhs,&batch_count);
+ retry = __process_buffer(journal, jh, bhs,&batch_count,
+ transaction);
- if (retry < 0 && !result)
- result = retry;
- if (!retry && lock_need_resched(&journal->j_list_lock)){
-@@ -667,6 +672,8 @@ void __journal_insert_checkpoint(struct
+ if (retry < 0 && !result)
+ result = retry;
+ if (!retry && lock_need_resched(&journal->j_list_lock)){
+@@ -692,6 +697,8 @@
void __journal_drop_transaction(journal_t *journal, transaction_t *transaction)
{
assert_spin_locked(&journal->j_list_lock);
if (transaction->t_cpnext) {
transaction->t_cpnext->t_cpprev = transaction->t_cpprev;
-@@ -693,5 +700,25 @@ void __journal_drop_transaction(journal_
+@@ -718,5 +725,25 @@
J_ASSERT(journal->j_running_transaction != transaction);
jbd_debug(1, "Dropping transaction %d, all done\n", transaction->t_tid);
+
kfree(transaction);
}
-Index: linux-2.6.18-8.1.8/fs/jbd/commit.c
+Index: linux-2.6.18-128.1.6/fs/jbd/commit.c
===================================================================
---- linux-2.6.18-8.1.8.orig/fs/jbd/commit.c 2007-08-28 22:22:10.000000000 +0200
-+++ linux-2.6.18-8.1.8/fs/jbd/commit.c 2007-08-28 22:22:29.000000000 +0200
+--- linux-2.6.18-128.1.6.orig/fs/jbd/commit.c 2009-06-02 23:22:50.000000000 -0600
++++ linux-2.6.18-128.1.6/fs/jbd/commit.c 2009-06-02 23:24:00.000000000 -0600
@@ -13,6 +13,7 @@
* part of the ext2fs journaling system.
*/
#include <linux/time.h>
#include <linux/fs.h>
#include <linux/jbd.h>
-@@ -23,6 +24,7 @@
+@@ -22,6 +23,7 @@
+ #include <linux/pagemap.h>
#include <linux/smp_lock.h>
- #include <linux/crc32.h>
+
/*
* Default IO end handler for temporary BJ_IO buffer_heads.
*/
-@@ -355,6 +357,7 @@ write_out_data:
+@@ -288,6 +290,7 @@
*/
void journal_commit_transaction(journal_t *journal)
{
transaction_t *commit_transaction;
struct journal_head *jh, *new_jh, *descriptor;
struct buffer_head **wbuf = journal->j_wbuf;
-@@ -403,6 +406,11 @@ void journal_commit_transaction(journal_
+@@ -334,6 +337,11 @@
spin_lock(&journal->j_state_lock);
commit_transaction->t_state = T_LOCKED;
spin_lock(&commit_transaction->t_handle_lock);
while (commit_transaction->t_updates) {
DEFINE_WAIT(wait);
-@@ -473,6 +481,9 @@ void journal_commit_transaction(journal_
+@@ -404,6 +412,9 @@
*/
journal_switch_revoke_table(journal);
commit_transaction->t_state = T_FLUSH;
journal->j_committing_transaction = commit_transaction;
journal->j_running_transaction = NULL;
-@@ -540,6 +551,11 @@ void journal_commit_transaction(journal_
- */
- commit_transaction->t_state = T_COMMIT;
+@@ -484,6 +495,11 @@
+ J_ASSERT(commit_transaction->t_nr_buffers <=
+ commit_transaction->t_outstanding_credits);
+ stats.ts_logging = CURRENT_MSECS;
+ stats.ts_flushing = jbd_time_diff(stats.ts_flushing, stats.ts_logging);
descriptor = NULL;
bufs = 0;
while (commit_transaction->t_buffers) {
-@@ -698,6 +714,7 @@ start_journal_io:
+@@ -633,6 +649,7 @@
submit_bh(WRITE, bh);
}
cond_resched();
/* Force a new descriptor to be generated next
time round the loop. */
-@@ -915,6 +932,7 @@ restart_loop:
+@@ -832,6 +849,7 @@
cp_transaction = jh->b_cp_transaction;
if (cp_transaction) {
JBUFFER_TRACE(jh, "remove from old cp transaction");
__journal_remove_checkpoint(jh);
}
-@@ -989,6 +1007,36 @@ restart_loop:
+@@ -908,6 +926,36 @@
J_ASSERT(commit_transaction->t_state == T_COMMIT);
commit_transaction->t_state = T_FINISHED;
J_ASSERT(commit_transaction == journal->j_committing_transaction);
journal->j_commit_sequence = commit_transaction->t_tid;
-
-diff -pur linux-2.6.18-53.orig/drivers/md/md.c linux-2.6.18-53/drivers/md/md.c
---- linux-2.6.18-53.orig/drivers/md/md.c 2008-02-13 17:34:25.000000000 +0800
-+++ linux-2.6.18-53/drivers/md/md.c 2008-02-13 17:39:28.000000000 +0800
-@@ -90,6 +90,8 @@ static void md_print_devices(void);
+Index: linux-2.6.18-128.1.6/drivers/md/md.c
+===================================================================
+--- linux-2.6.18-128.1.6.orig/drivers/md/md.c 2009-04-14 21:05:26.000000000 -0600
++++ linux-2.6.18-128.1.6/drivers/md/md.c 2009-06-02 23:25:31.000000000 -0600
+@@ -90,6 +90,8 @@
static int sysctl_speed_limit_min = 1000;
static int sysctl_speed_limit_max = 200000;
static inline int speed_min(mddev_t *mddev)
{
return mddev->sync_speed_min ?
-@@ -121,6 +123,22 @@ static ctl_table raid_table[] = {
+@@ -121,6 +123,22 @@
.mode = S_IRUGO|S_IWUSR,
.proc_handler = &proc_dointvec,
},
{ .ctl_name = 0 }
};
-@@ -4980,15 +4998,16 @@ static int is_mddev_idle(mddev_t *mddev)
+@@ -5009,15 +5027,16 @@
{
mdk_rdev_t * rdev;
int idle;
+ unsigned long rw, sync;
idle = 1;
- rcu_read_lock();
- rdev_for_each_rcu(rdev, mddev) {
+ rcu_read_lock();
+ rdev_for_each_rcu(rdev, mddev) {
struct gendisk *disk = rdev->bdev->bd_contains->bd_disk;
- curr_events = disk_stat_read(disk, sectors[0]) +
- disk_stat_read(disk, sectors[1]) -
/* The difference between curr_events and last_events
* will be affected by any new non-sync IO (making
* curr_events bigger) and any difference in the amount of
-@@ -5001,9 +5020,9 @@ static int is_mddev_idle(mddev_t *mddev)
+@@ -5031,9 +5050,9 @@
*
* Note: the following is an unsigned comparison.
*/
+ rdev->last_events = rw - sync;
}
}
- return idle;
-@@ -5069,8 +5088,7 @@ static DECLARE_WAIT_QUEUE_HEAD(resync_wa
+ rcu_read_unlock();
+@@ -5100,8 +5119,7 @@
void md_do_sync(mddev_t *mddev)
{
mddev_t *mddev2;
sector_t max_sectors,j, io_sectors;
unsigned long mark[SYNC_MARKS];
sector_t mark_cnt[SYNC_MARKS];
-@@ -5190,9 +5208,8 @@ void md_do_sync(mddev_t *mddev)
+@@ -5221,9 +5239,8 @@
/*
* Tune reconstruction:
*/
atomic_set(&mddev->recovery_active, 0);
init_waitqueue_head(&mddev->recovery_wait);
-@@ -5230,7 +5247,7 @@ void md_do_sync(mddev_t *mddev)
+@@ -5261,7 +5278,7 @@
*/
md_new_event(mddev);
continue;
last_check = io_sectors;
-@@ -5251,7 +5268,6 @@ void md_do_sync(mddev_t *mddev)
+@@ -5282,7 +5299,6 @@
last_mark = next;
}
if (kthread_should_stop()) {
/*
* got a signal, exit.
-@@ -5275,10 +5291,16 @@ void md_do_sync(mddev_t *mddev)
+@@ -5306,10 +5322,16 @@
currspeed = ((unsigned long)(io_sectors-mddev->resync_mark_cnt))/2
/((jiffies-mddev->resync_mark)/HZ +1) +1;
msleep(500);
goto repeat;
}
-diff -pur linux-2.6.18-53.orig/include/linux/sysctl.h linux-2.6.18-53/include/linux/sysctl.h
---- linux-2.6.18-53.orig/include/linux/sysctl.h 2008-02-13 17:35:25.000000000 +0800
-+++ linux-2.6.18-53/include/linux/sysctl.h 2008-02-13 17:36:22.000000000 +0800
-@@ -903,7 +903,9 @@ enum {
+Index: linux-2.6.18-128.1.6/include/linux/sysctl.h
+===================================================================
+--- linux-2.6.18-128.1.6.orig/include/linux/sysctl.h 2009-04-14 21:05:41.000000000 -0600
++++ linux-2.6.18-128.1.6/include/linux/sysctl.h 2009-06-02 23:25:31.000000000 -0600
+@@ -928,7 +928,9 @@
/* /proc/sys/dev/raid */
enum {
DEV_RAID_SPEED_LIMIT_MIN=1,
-diff -rNpu linux-2.6.16.54-0.2.5/fs/dquot.c linux-2.6.16.54-0.2.5-quota/fs/dquot.c
---- linux-2.6.16.54-0.2.5/fs/dquot.c 2008-03-18 15:48:26.000000000 +0300
-+++ linux-2.6.16.54-0.2.5-quota/fs/dquot.c 2008-03-17 22:43:11.000000000 +0300
-@@ -1588,10 +1588,19 @@ int vfs_get_dqblk(struct super_block *sb
+Index: linux-2.6.18-128.1.6/fs/dquot.c
+===================================================================
+--- linux-2.6.18-128.1.6.orig/fs/dquot.c 2009-04-14 21:04:50.000000000 -0600
++++ linux-2.6.18-128.1.6/fs/dquot.c 2009-06-02 23:26:36.000000000 -0600
+@@ -1592,10 +1592,19 @@
}
/* Generic routine for setting common part of quota structure */
spin_lock(&dq_data_lock);
if (di->dqb_valid & QIF_SPACE) {
-@@ -1623,7 +1632,7 @@ static void do_set_dqblk(struct dquot *d
+@@ -1627,7 +1636,7 @@
clear_bit(DQ_BLKS_B, &dquot->dq_flags);
}
else if (!(di->dqb_valid & QIF_BTIME)) /* Set grace only if user hasn't provided his own... */
}
if (check_ilim) {
if (!dm->dqb_isoftlimit || dm->dqb_curinodes < dm->dqb_isoftlimit) {
-@@ -1631,7 +1640,7 @@ static void do_set_dqblk(struct dquot *d
+@@ -1635,7 +1644,7 @@
clear_bit(DQ_INODES_B, &dquot->dq_flags);
}
else if (!(di->dqb_valid & QIF_ITIME)) /* Set grace only if user hasn't provided his own... */
}
if (dm->dqb_bhardlimit || dm->dqb_bsoftlimit || dm->dqb_ihardlimit || dm->dqb_isoftlimit)
clear_bit(DQ_FAKE_B, &dquot->dq_flags);
-@@ -1639,21 +1648,24 @@ static void do_set_dqblk(struct dquot *d
+@@ -1643,21 +1652,24 @@
set_bit(DQ_FAKE_B, &dquot->dq_flags);
spin_unlock(&dq_data_lock);
mark_dquot_dirty(dquot);
}
/* Generic routine for getting common part of quota file information */
-diff -rNpu linux-2.6.16.54-0.2.5/fs/quota_v1.c linux-2.6.16.54-0.2.5-quota/fs/quota_v1.c
---- linux-2.6.16.54-0.2.5/fs/quota_v1.c 2006-03-20 08:53:29.000000000 +0300
-+++ linux-2.6.16.54-0.2.5-quota/fs/quota_v1.c 2008-03-17 22:42:47.000000000 +0300
-@@ -139,6 +139,9 @@ static int v1_read_file_info(struct supe
+Index: linux-2.6.18-128.1.6/fs/quota_v1.c
+===================================================================
+--- linux-2.6.18-128.1.6.orig/fs/quota_v1.c 2006-09-19 21:42:06.000000000 -0600
++++ linux-2.6.18-128.1.6/fs/quota_v1.c 2009-06-02 23:26:36.000000000 -0600
+@@ -139,6 +139,9 @@
goto out;
}
ret = 0;
dqopt->info[type].dqi_igrace = dqblk.dqb_itime ? dqblk.dqb_itime : MAX_IQ_TIME;
dqopt->info[type].dqi_bgrace = dqblk.dqb_btime ? dqblk.dqb_btime : MAX_DQ_TIME;
out:
-diff -rNpu linux-2.6.16.54-0.2.5/fs/quota_v2.c linux-2.6.16.54-0.2.5-quota/fs/quota_v2.c
---- linux-2.6.16.54-0.2.5/fs/quota_v2.c 2006-03-20 08:53:29.000000000 +0300
-+++ linux-2.6.16.54-0.2.5-quota/fs/quota_v2.c 2008-03-18 11:58:02.000000000 +0300
-@@ -23,26 +23,64 @@ MODULE_LICENSE("GPL");
+Index: linux-2.6.18-128.1.6/fs/quota_v2.c
+===================================================================
+--- linux-2.6.18-128.1.6.orig/fs/quota_v2.c 2006-09-19 21:42:06.000000000 -0600
++++ linux-2.6.18-128.1.6/fs/quota_v2.c 2009-06-02 23:26:36.000000000 -0600
+@@ -23,26 +23,64 @@
typedef char *dqbuf_t;
#define GETIDINDEX(id, depth) (((id) >> ((V2_DQTREEDEPTH-(depth)-1)*8)) & 0xff)
}
/* Read information header from quota file */
-@@ -51,6 +89,13 @@ static int v2_read_file_info(struct supe
+@@ -51,6 +89,13 @@
struct v2_disk_dqinfo dinfo;
struct mem_dqinfo *info = sb_dqopt(sb)->info+type;
ssize_t size;
size = sb->s_op->quota_read(sb, type, (char *)&dinfo,
sizeof(struct v2_disk_dqinfo), V2_DQINFOOFF);
-@@ -65,6 +110,16 @@ static int v2_read_file_info(struct supe
+@@ -65,6 +110,16 @@
info->u.v2_i.dqi_blocks = le32_to_cpu(dinfo.dqi_blocks);
info->u.v2_i.dqi_free_blk = le32_to_cpu(dinfo.dqi_free_blk);
info->u.v2_i.dqi_free_entry = le32_to_cpu(dinfo.dqi_free_entry);
return 0;
}
-@@ -94,29 +149,61 @@ static int v2_write_file_info(struct sup
+@@ -94,29 +149,61 @@
return 0;
}
}
static dqbuf_t getdqbuf(void)
-@@ -268,10 +355,10 @@ static uint find_free_dqentry(struct dqu
+@@ -268,10 +355,10 @@
{
struct super_block *sb = dquot->dq_sb;
struct mem_dqinfo *info = sb_dqopt(sb)->info+dquot->dq_type;
dqbuf_t buf;
*err = 0;
-@@ -298,17 +385,18 @@ static uint find_free_dqentry(struct dqu
+@@ -298,17 +385,18 @@
info->u.v2_i.dqi_free_entry = blk;
mark_info_dirty(sb, dquot->dq_type);
}
printk(KERN_ERR "VFS: find_free_dqentry(): Data block full but it shouldn't.\n");
*err = -EIO;
goto out_buf;
-@@ -318,7 +406,8 @@ static uint find_free_dqentry(struct dqu
+@@ -318,7 +406,8 @@
printk(KERN_ERR "VFS: find_free_dqentry(): Can't write quota data block %u.\n", blk);
goto out_buf;
}
freedqbuf(buf);
return blk;
out_buf:
-@@ -392,7 +481,9 @@ static int v2_write_dquot(struct dquot *
+@@ -392,7 +481,9 @@
{
int type = dquot->dq_type;
ssize_t ret;
+ uint rev = sb_dqopt(dquot->dq_sb)->info[type].u.v2_i.dqi_revision;
+ uint dqblksz = v2_dqblksz(rev);
- /* dq_off is guarded by dqio_sem */
+ /* dq_off is guarded by dqio_mutex */
if (!dquot->dq_off)
-@@ -401,18 +492,22 @@ static int v2_write_dquot(struct dquot *
+@@ -401,18 +492,22 @@
return ret;
}
spin_lock(&dq_data_lock);
if (ret >= 0)
ret = -ENOSPC;
}
-@@ -431,6 +526,7 @@ static int free_dqentry(struct dquot *dq
+@@ -431,6 +526,7 @@
struct v2_disk_dqdbheader *dh;
dqbuf_t buf = getdqbuf();
int ret = 0;
if (!buf)
return -ENOMEM;
-@@ -456,8 +552,8 @@ static int free_dqentry(struct dquot *dq
+@@ -456,8 +552,8 @@
}
else {
memset(buf+(dquot->dq_off & ((1 << V2_DQBLKSIZE_BITS)-1)), 0,
/* Insert will write block itself */
if ((ret = insert_free_dqentry(sb, type, buf, blk)) < 0) {
printk(KERN_ERR "VFS: Can't insert quota data block (%u) to free entry list.\n", blk);
-@@ -529,41 +625,56 @@ static int v2_delete_dquot(struct dquot
+@@ -529,41 +625,56 @@
return remove_tree(dquot, &tmp, 0);
}
out_buf:
freedqbuf(buf);
return ret;
-@@ -605,7 +716,7 @@ static int v2_read_dquot(struct dquot *d
+@@ -605,7 +716,7 @@
{
int type = dquot->dq_type;
loff_t offset;
int ret = 0;
#ifdef __QUOTA_V2_PARANOIA
-@@ -626,25 +737,30 @@ static int v2_read_dquot(struct dquot *d
+@@ -626,25 +737,30 @@
ret = offset;
}
else {
if (!dquot->dq_dqb.dqb_bhardlimit &&
!dquot->dq_dqb.dqb_bsoftlimit &&
!dquot->dq_dqb.dqb_ihardlimit &&
-diff -rNpu linux-2.6.16.54-0.2.5/include/linux/dqblk_v2.h linux-2.6.16.54-0.2.5-quota/include/linux/dqblk_v2.h
---- linux-2.6.16.54-0.2.5/include/linux/dqblk_v2.h 2006-03-20 08:53:29.000000000 +0300
-+++ linux-2.6.16.54-0.2.5-quota/include/linux/dqblk_v2.h 2008-03-17 23:39:54.000000000 +0300
-@@ -21,6 +21,7 @@ struct v2_mem_dqinfo {
+Index: linux-2.6.18-128.1.6/include/linux/dqblk_v2.h
+===================================================================
+--- linux-2.6.18-128.1.6.orig/include/linux/dqblk_v2.h 2006-09-19 21:42:06.000000000 -0600
++++ linux-2.6.18-128.1.6/include/linux/dqblk_v2.h 2009-06-02 23:26:36.000000000 -0600
+@@ -21,6 +21,7 @@
unsigned int dqi_blocks;
unsigned int dqi_free_blk;
unsigned int dqi_free_entry;
};
#endif /* _LINUX_DQBLK_V2_H */
-diff -rNpu linux-2.6.16.54-0.2.5/include/linux/quota.h linux-2.6.16.54-0.2.5-quota/include/linux/quota.h
---- linux-2.6.16.54-0.2.5/include/linux/quota.h 2006-03-20 08:53:29.000000000 +0300
-+++ linux-2.6.16.54-0.2.5-quota/include/linux/quota.h 2008-03-17 23:39:54.000000000 +0300
-@@ -148,12 +148,12 @@ struct if_dqinfo {
+Index: linux-2.6.18-128.1.6/include/linux/quota.h
+===================================================================
+--- linux-2.6.18-128.1.6.orig/include/linux/quota.h 2006-09-19 21:42:06.000000000 -0600
++++ linux-2.6.18-128.1.6/include/linux/quota.h 2009-06-02 23:26:36.000000000 -0600
+@@ -149,12 +149,12 @@
* Data for one user/group kept in memory
*/
struct mem_dqblk {
time_t dqb_btime; /* time limit for excessive disk use */
time_t dqb_itime; /* time limit for excessive inode use */
};
-@@ -169,6 +169,8 @@ struct mem_dqinfo {
+@@ -170,6 +170,8 @@
unsigned long dqi_flags;
unsigned int dqi_bgrace;
unsigned int dqi_igrace;
union {
struct v1_mem_dqinfo v1_i;
struct v2_mem_dqinfo v2_i;
-diff -rNpu linux-2.6.16.54-0.2.5/include/linux/quotaio_v2.h linux-2.6.16.54-0.2.5-quota/include/linux/quotaio_v2.h
---- linux-2.6.16.54-0.2.5/include/linux/quotaio_v2.h 2006-03-20 08:53:29.000000000 +0300
-+++ linux-2.6.16.54-0.2.5-quota/include/linux/quotaio_v2.h 2008-03-17 23:39:54.000000000 +0300
+Index: linux-2.6.18-128.1.6/include/linux/quotaio_v2.h
+===================================================================
+--- linux-2.6.18-128.1.6.orig/include/linux/quotaio_v2.h 2006-09-19 21:42:06.000000000 -0600
++++ linux-2.6.18-128.1.6/include/linux/quotaio_v2.h 2009-06-02 23:26:36.000000000 -0600
@@ -16,28 +16,51 @@
0xd9c01927 /* GRPQUOTA */\
}
/*
* Here are header structures as written on disk and their in-memory copies
*/
-@@ -59,7 +82,7 @@ struct v2_disk_dqinfo {
+@@ -59,7 +82,7 @@
/*
* Structure of header of block with quota structures. It is padded to 16 bytes so
*/
struct v2_disk_dqdbheader {
__le32 dqdh_next_free; /* Number of next block with free entry */
-@@ -74,6 +97,5 @@ struct v2_disk_dqdbheader {
+@@ -74,6 +97,5 @@
#define V2_DQBLKSIZE (1 << V2_DQBLKSIZE_BITS) /* Size of block with quota structures */
#define V2_DQTREEOFF 1 /* Offset of tree in file in blocks */
#define V2_DQTREEDEPTH 4 /* Depth of quota tree */
-Index: linux-2.6.22.14/drivers/md/raid5.c
+Index: linux-2.6.18-128.1.6/drivers/md/raid5.c
===================================================================
---- linux-2.6.22.14.orig/drivers/md/raid5.c
-+++ linux-2.6.22.14/drivers/md/raid5.c
-@@ -1268,6 +1268,8 @@ static int add_stripe_bio(struct stripe_
+--- linux-2.6.18-128.1.6.orig/drivers/md/raid5.c 2009-06-02 23:24:55.000000000 -0600
++++ linux-2.6.18-128.1.6/drivers/md/raid5.c 2009-06-02 23:27:21.000000000 -0600
+@@ -1456,6 +1456,8 @@
bi->bi_next = *bip;
*bip = bi;
bi->bi_phys_segments ++;
spin_unlock_irq(&conf->device_lock);
spin_unlock(&sh->lock);
-@@ -2972,6 +2974,8 @@ static int make_request(request_queue_t
- test_bit(BIO_UPTODATE, &bi->bi_flags)
- ? 0 : -EIO);
+@@ -3012,6 +3014,8 @@
+ bi->bi_size = 0;
+ bi->bi_end_io(bi, bytes, 0);
}
+ if (bio_sync(bi))
+ raid5_unplug_device(q);
-diff -pur linux-2.6.18-92.1.22.orig/drivers/md/raid5.c linux-2.6.18-92.1.22/drivers/md/raid5.c
---- linux-2.6.18-92.1.22.orig/drivers/md/raid5.c 2009-02-10 13:47:54.000000000 +0800
-+++ linux-2.6.18-92.1.22/drivers/md/raid5.c 2009-02-10 14:44:24.000000000 +0800
-@@ -633,6 +633,9 @@ static int raid5_end_read_request(struct
+Index: linux-2.6.18-128.1.6/drivers/md/raid5.c
+===================================================================
+--- linux-2.6.18-128.1.6.orig/drivers/md/raid5.c 2009-06-02 23:24:52.000000000 -0600
++++ linux-2.6.18-128.1.6/drivers/md/raid5.c 2009-06-02 23:24:55.000000000 -0600
+@@ -633,6 +633,9 @@
clear_buffer_uptodate(bh);
}
#endif
clear_bit(R5_LOCKED, &sh->dev[i].flags);
set_bit(STRIPE_HANDLE, &sh->state);
release_stripe(sh);
-@@ -671,6 +674,10 @@ static int raid5_end_write_request (stru
+@@ -669,6 +672,10 @@
rdev_dec_pending(conf->disks[i].rdev, conf->mddev);
+ }
clear_bit(R5_LOCKED, &sh->dev[i].flags);
set_bit(STRIPE_HANDLE, &sh->state);
- __release_stripe(conf, sh);
-@@ -911,7 +918,27 @@ static sector_t compute_blocknr(struct s
+ release_stripe(sh);
+@@ -910,7 +917,27 @@
return r_sector;
}
/*
* Copy data between a page in the stripe cache, and one or more bion
-@@ -1003,8 +1030,9 @@ static void compute_parity5(struct strip
+@@ -1002,8 +1029,9 @@
{
raid5_conf_t *conf = sh->raid_conf;
int i, pd_idx = sh->pd_idx, disks = sh->disks, count;
PRINTK("compute_parity5, stripe %llu, method %d\n",
(unsigned long long)sh->sector, method);
-@@ -1054,34 +1082,92 @@ static void compute_parity5(struct strip
+@@ -1053,34 +1081,92 @@
count = 1;
}
}
if (count != 1)
xor_block(count, STRIPE_SIZE, ptr);
-@@ -1098,6 +1184,7 @@ static void compute_parity6(struct strip
+@@ -1097,6 +1183,7 @@
raid6_conf_t *conf = sh->raid_conf;
int i, pd_idx = sh->pd_idx, qd_idx, d0_idx, disks = conf->raid_disks, count;
struct bio *chosen;
/**** FIX THIS: This could be very bad if disks is close to 256 ****/
void *ptrs[disks];
-@@ -1127,18 +1214,49 @@ static void compute_parity6(struct strip
+@@ -1126,18 +1213,49 @@
BUG(); /* Not implemented yet */
}
// switch(method) {
// case RECONSTRUCT_WRITE:
-@@ -1149,8 +1267,12 @@ static void compute_parity6(struct strip
+@@ -1148,8 +1266,12 @@
count = 0;
i = d0_idx;
do {
printk("block %d/%d not uptodate on parity calc\n", i,count);
i = raid6_next_disk(i, disks);
} while ( i != d0_idx );
-@@ -1599,7 +1721,8 @@ static void handle_stripe5(struct stripe
+@@ -1596,7 +1718,8 @@
if (sh->dev[i].written) {
dev = &sh->dev[i];
if (!test_bit(R5_LOCKED, &dev->flags) &&
/* We can return any write requests */
struct bio *wbi, *wbi2;
int bitmap_end = 0;
-@@ -1607,6 +1730,7 @@ static void handle_stripe5(struct stripe
+@@ -1604,6 +1727,7 @@
spin_lock_irq(&conf->device_lock);
wbi = dev->written;
dev->written = NULL;
while (wbi && wbi->bi_sector < dev->sector + STRIPE_SECTORS) {
wbi2 = r5_next_bio(wbi, dev->sector);
if (--wbi->bi_phys_segments == 0) {
-@@ -1970,6 +2094,15 @@ static void handle_stripe5(struct stripe
+@@ -1967,6 +2091,15 @@
set_bit(STRIPE_DEGRADED, &sh->state);
PRINTK("skip op %ld on disc %d for sector %llu\n",
bi->bi_rw, i, (unsigned long long)sh->sector);
clear_bit(R5_LOCKED, &sh->dev[i].flags);
set_bit(STRIPE_HANDLE, &sh->state);
}
-@@ -2175,7 +2308,8 @@ static void handle_stripe6(struct stripe
+@@ -2172,7 +2305,8 @@
if (sh->dev[i].written) {
dev = &sh->dev[i];
if (!test_bit(R5_LOCKED, &dev->flags) &&
/* We can return any write requests */
int bitmap_end = 0;
struct bio *wbi, *wbi2;
-@@ -2184,6 +2318,7 @@ static void handle_stripe6(struct stripe
+@@ -2181,6 +2315,7 @@
spin_lock_irq(&conf->device_lock);
wbi = dev->written;
dev->written = NULL;
while (wbi && wbi->bi_sector < dev->sector + STRIPE_SECTORS) {
wbi2 = r5_next_bio(wbi, dev->sector);
if (--wbi->bi_phys_segments == 0) {
-@@ -2535,6 +2670,15 @@ static void handle_stripe6(struct stripe
+@@ -2532,6 +2667,15 @@
set_bit(STRIPE_DEGRADED, &sh->state);
PRINTK("skip op %ld on disc %d for sector %llu\n",
bi->bi_rw, i, (unsigned long long)sh->sector);
clear_bit(R5_LOCKED, &sh->dev[i].flags);
set_bit(STRIPE_HANDLE, &sh->state);
}
-@@ -3456,6 +3600,9 @@ static int run(mddev_t *mddev)
+@@ -3451,6 +3595,9 @@
mddev->queue->max_phys_segments = conf->chunk_size * conf->previous_raid_disks >> PAGE_SHIFT;
mddev->queue->max_hw_segments = conf->chunk_size * conf->previous_raid_disks >> PAGE_SHIFT;;
return 0;
abort:
if (conf) {
-@@ -3542,9 +3689,11 @@ static void status (struct seq_file *seq
+@@ -3537,9 +3684,11 @@
atomic_read(&conf->handled_in_raid5d),
atomic_read(&conf->out_of_stripes),
atomic_read(&conf->handle_called));
seq_printf (seq, "\n\t\t%u delayed, %u bit delayed, %u active, queues: %u in, %u out\n",
atomic_read(&conf->delayed), atomic_read(&conf->bit_delayed),
atomic_read(&conf->active_stripes),
-diff -pur linux-2.6.18-92.1.22.orig/include/linux/backing-dev.h linux-2.6.18-92.1.22/include/linux/backing-dev.h
---- linux-2.6.18-92.1.22.orig/include/linux/backing-dev.h 2009-02-10 13:47:54.000000000 +0800
-+++ linux-2.6.18-92.1.22/include/linux/backing-dev.h 2009-02-10 14:44:14.000000000 +0800
-@@ -48,6 +48,7 @@ struct backing_dev_info {
+Index: linux-2.6.18-128.1.6/include/linux/backing-dev.h
+===================================================================
+--- linux-2.6.18-128.1.6.orig/include/linux/backing-dev.h 2006-09-19 21:42:06.000000000 -0600
++++ linux-2.6.18-128.1.6/include/linux/backing-dev.h 2009-06-02 23:24:55.000000000 -0600
+@@ -48,6 +48,7 @@
#define BDI_CAP_READ_MAP 0x00000010 /* Can be mapped for reading */
#define BDI_CAP_WRITE_MAP 0x00000020 /* Can be mapped for writing */
#define BDI_CAP_EXEC_MAP 0x00000040 /* Can be mapped for execution */
#define BDI_CAP_VMFLAGS \
(BDI_CAP_READ_MAP | BDI_CAP_WRITE_MAP | BDI_CAP_EXEC_MAP)
-@@ -94,11 +95,18 @@ static inline int bdi_rw_congested(struc
+@@ -94,11 +95,18 @@
#define bdi_cap_account_dirty(bdi) \
(!((bdi)->capabilities & BDI_CAP_NO_ACCT_DIRTY))
+
#endif /* _LINUX_BACKING_DEV_H */
-diff -pur linux-2.6.18-92.1.22.orig/include/linux/page-flags.h linux-2.6.18-92.1.22/include/linux/page-flags.h
---- linux-2.6.18-92.1.22.orig/include/linux/page-flags.h 2009-02-10 13:47:54.000000000 +0800
-+++ linux-2.6.18-92.1.22/include/linux/page-flags.h 2009-02-10 14:44:14.000000000 +0800
+Index: linux-2.6.18-128.1.6/include/linux/page-flags.h
+===================================================================
+--- linux-2.6.18-128.1.6.orig/include/linux/page-flags.h 2009-04-14 21:05:24.000000000 -0600
++++ linux-2.6.18-128.1.6/include/linux/page-flags.h 2009-06-02 23:24:55.000000000 -0600
@@ -86,6 +86,7 @@
#define PG_reclaim 17 /* To be reclaimed asap */
#define PG_nosave_free 18 /* Free, should not be written */
int test_clear_page_dirty(struct page *page);
int test_clear_page_writeback(struct page *page);
int test_set_page_writeback(struct page *page);
-diff -pur linux-2.6.18-92.1.22.orig/include/linux/raid/raid5.h linux-2.6.18-92.1.22/include/linux/raid/raid5.h
---- linux-2.6.18-92.1.22.orig/include/linux/raid/raid5.h 2009-02-10 13:47:54.000000000 +0800
-+++ linux-2.6.18-92.1.22/include/linux/raid/raid5.h 2009-02-10 14:44:14.000000000 +0800
-@@ -156,8 +156,9 @@ struct stripe_head {
+Index: linux-2.6.18-128.1.6/include/linux/raid/raid5.h
+===================================================================
+--- linux-2.6.18-128.1.6.orig/include/linux/raid/raid5.h 2009-06-02 23:24:50.000000000 -0600
++++ linux-2.6.18-128.1.6/include/linux/raid/raid5.h 2009-06-02 23:24:55.000000000 -0600
+@@ -156,8 +156,9 @@
#define R5_Overlap 7 /* There is a pending overlapping request on this block */
#define R5_ReadError 8 /* seen a read error here recently */
#define R5_ReWrite 9 /* have tried to over-write the readerror */
/*
* Write method
*/
-diff -pur linux-2.6.18-92.1.22.orig/mm/filemap.c linux-2.6.18-92.1.22/mm/filemap.c
---- linux-2.6.18-92.1.22.orig/mm/filemap.c 2009-02-10 13:47:54.000000000 +0800
-+++ linux-2.6.18-92.1.22/mm/filemap.c 2009-02-10 14:44:14.000000000 +0800
+Index: linux-2.6.18-128.1.6/mm/filemap.c
+===================================================================
+--- linux-2.6.18-128.1.6.orig/mm/filemap.c 2009-04-14 21:05:46.000000000 -0600
++++ linux-2.6.18-128.1.6/mm/filemap.c 2009-06-02 23:24:55.000000000 -0600
@@ -30,6 +30,7 @@
#include <linux/security.h>
#include <linux/syscalls.h>
#include "filemap.h"
#include "internal.h"
-@@ -566,11 +567,55 @@ void end_page_writeback(struct page *pag
+@@ -567,11 +568,55 @@
if (!test_clear_page_writeback(page))
BUG();
}
lnxmaj="2.6.18"
-lnxrel="128.1.1.el5"
+lnxrel="128.1.6.el5"
KERNEL_SRPM=kernel-$lnxmaj-$lnxrel.src.rpm
SERIES=2.6-rhel5.series
SUPPORTED KERNELS:
2.6-rhel4 RHEL4: 2.6.9-67.0.20.EL
2.6-sles10 SLES10: 2.6.16.60-0.37
-2.6-rhel5 RHEL5: 2.6.18-128.1.1.el5
+2.6-rhel5 RHEL5: 2.6.18-128.1.6.el5
2.6.18-vanilla kernel.org: 2.6.18.8
2.6.22-vanilla kernel.org: 2.6.22.14