This replaces the usage of inode->i_writecount as a flag marking keys busy with a boolean flag field in struct htlbpagekey, and removes the last dependency of alloc_shared_hugetlb_pages() on struct inode. hugetlbpage.c | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 40 insertions(+), 3 deletions(-) diff -urpN htlb-2.5.47-4/arch/i386/mm/hugetlbpage.c htlb-2.5.47-5/arch/i386/mm/hugetlbpage.c --- htlb-2.5.47-4/arch/i386/mm/hugetlbpage.c 2002-11-11 21:30:36.000000000 -0800 +++ htlb-2.5.47-5/arch/i386/mm/hugetlbpage.c 2002-11-11 21:49:53.000000000 -0800 @@ -31,10 +31,47 @@ static spinlock_t htlbpage_lock = SPIN_L static struct htlbpagekey { struct inode *in; int key; + int busy; } htlbpagek[MAX_ID]; struct hugetlb_key; +static void mark_key_busy(struct hugetlb_key *hugetlb_key) +{ + struct inode *inode = (struct inode *)hugetlb_key; + int i, key = inode->i_ino; + + for (i = 0; i < MAX_ID; ++i) + if (htlbpagek[i].key != key) + continue; + BUG_ON(i >= MAX_ID); + htlbpagek[i].busy = 1; +} + +static void clear_key_busy(struct hugetlb_key *hugetlb_key) +{ + struct inode *inode = (struct inode *)hugetlb_key; + int i, key = inode->i_ino; + + for (i = 0; i < MAX_ID; ++i) + if (htlbpagek[i].key != key) + continue; + BUG_ON(i >= MAX_ID); + htlbpagek[i].busy = 0; +} + +static int key_busy(struct hugetlb_key *hugetlb_key) +{ + struct inode *inode = (struct inode *)hugetlb_key; + int i, key = inode->i_ino; + + for (i = 0; i < MAX_ID; ++i) + if (htlbpagek[i].key != key) + continue; + BUG_ON(i >= MAX_ID); + return htlbpagek[i].busy; +} + static struct inode *find_key_inode(int key) { int i; @@ -76,7 +113,7 @@ struct hugetlb_key *alloc_key(int key, u inode = ERR_PTR(-ENOMEM); } else { inode_init_once(inode); - atomic_inc(&inode->i_writecount); + mark_key_busy((struct hugetlb_key *)inode); inode->i_mapping = &inode->i_data; inode->i_mapping->host = inode; inode->i_ino = (unsigned long)key; @@ -90,7 +127,7 @@ struct hugetlb_key *alloc_key(int key, u } } } - } else if (atomic_read(&inode->i_writecount)) { + } else if (key_busy((struct hugetlb_key *)inode)) { inode = ERR_PTR(-EAGAIN); spin_unlock(&htlbpage_lock); } else if (check_size_prot(inode, len, prot, flag) < 0) @@ -392,7 +429,7 @@ static int alloc_shared_hugetlb_pages(in vma->vm_ops = &hugetlb_vm_ops; spin_unlock(&mm->page_table_lock); spin_lock(&htlbpage_lock); - atomic_set(&inode->i_writecount, 0); + clear_key_busy((struct hugetlb_key *)inode); spin_unlock(&htlbpage_lock); return retval; out: