projects
/
powerpc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[PATCH] splice: fix smaller sized splice reads
[powerpc.git]
/
fs
/
jfs
/
jfs_txnmgr.c
diff --git
a/fs/jfs/jfs_txnmgr.c
b/fs/jfs/jfs_txnmgr.c
index
121c981
..
ac3d669
100644
(file)
--- a/
fs/jfs/jfs_txnmgr.c
+++ b/
fs/jfs/jfs_txnmgr.c
@@
-49,6
+49,7
@@
#include <linux/suspend.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/suspend.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
+#include <linux/kthread.h>
#include "jfs_incore.h"
#include "jfs_inode.h"
#include "jfs_filsys.h"
#include "jfs_incore.h"
#include "jfs_inode.h"
#include "jfs_filsys.h"
@@
-121,8
+122,7
@@
static DEFINE_SPINLOCK(jfsTxnLock);
#define LAZY_LOCK(flags) spin_lock_irqsave(&TxAnchor.LazyLock, flags)
#define LAZY_UNLOCK(flags) spin_unlock_irqrestore(&TxAnchor.LazyLock, flags)
#define LAZY_LOCK(flags) spin_lock_irqsave(&TxAnchor.LazyLock, flags)
#define LAZY_UNLOCK(flags) spin_unlock_irqrestore(&TxAnchor.LazyLock, flags)
-DECLARE_WAIT_QUEUE_HEAD(jfs_sync_thread_wait);
-DECLARE_WAIT_QUEUE_HEAD(jfs_commit_thread_wait);
+static DECLARE_WAIT_QUEUE_HEAD(jfs_commit_thread_wait);
static int jfs_commit_thread_waking;
/*
static int jfs_commit_thread_waking;
/*
@@
-207,7
+207,7
@@
static lid_t txLockAlloc(void)
if ((++TxAnchor.tlocksInUse > TxLockHWM) && (jfs_tlocks_low == 0)) {
jfs_info("txLockAlloc tlocks low");
jfs_tlocks_low = 1;
if ((++TxAnchor.tlocksInUse > TxLockHWM) && (jfs_tlocks_low == 0)) {
jfs_info("txLockAlloc tlocks low");
jfs_tlocks_low = 1;
- wake_up
(&jfs_sync_thread_wait
);
+ wake_up
_process(jfsSyncThread
);
}
return lid;
}
return lid;
@@
-552,6
+552,11
@@
void txEnd(tid_t tid)
* synchronize with logsync barrier
*/
if (test_bit(log_SYNCBARRIER, &log->flag)) {
* synchronize with logsync barrier
*/
if (test_bit(log_SYNCBARRIER, &log->flag)) {
+ TXN_UNLOCK();
+
+ /* write dirty metadata & forward log syncpt */
+ jfs_syncpt(log, 1);
+
jfs_info("log barrier off: 0x%x", log->lsn);
/* enable new transactions start */
jfs_info("log barrier off: 0x%x", log->lsn);
/* enable new transactions start */
@@
-560,11
+565,6
@@
void txEnd(tid_t tid)
/* wakeup all waitors for logsync barrier */
TXN_WAKEUP(&log->syncwait);
/* wakeup all waitors for logsync barrier */
TXN_WAKEUP(&log->syncwait);
- TXN_UNLOCK();
-
- /* forward log syncpt */
- jfs_syncpt(log);
-
goto wakeup;
}
}
goto wakeup;
}
}
@@
-657,7
+657,9
@@
struct tlock *txLock(tid_t tid, struct inode *ip, struct metapage * mp,
/* only anonymous txn.
* Remove from anon_list
*/
/* only anonymous txn.
* Remove from anon_list
*/
+ TXN_LOCK();
list_del_init(&jfs_ip->anon_inode_list);
list_del_init(&jfs_ip->anon_inode_list);
+ TXN_UNLOCK();
}
jfs_ip->atlhead = tlck->next;
} else {
}
jfs_ip->atlhead = tlck->next;
} else {
@@
-723,6
+725,9
@@
struct tlock *txLock(tid_t tid, struct inode *ip, struct metapage * mp,
else
tlck->flag = tlckINODELOCK;
else
tlck->flag = tlckINODELOCK;
+ if (S_ISDIR(ip->i_mode))
+ tlck->flag |= tlckDIRECTORY;
+
tlck->type = 0;
/* bind the tlock and the page */
tlck->type = 0;
/* bind the tlock and the page */
@@
-1007,6
+1012,8
@@
struct tlock *txMaplock(tid_t tid, struct inode *ip, int type)
/* bind the tlock and the object */
tlck->flag = tlckINODELOCK;
/* bind the tlock and the object */
tlck->flag = tlckINODELOCK;
+ if (S_ISDIR(ip->i_mode))
+ tlck->flag |= tlckDIRECTORY;
tlck->ip = ip;
tlck->mp = NULL;
tlck->ip = ip;
tlck->mp = NULL;
@@
-1075,6
+1082,8
@@
struct linelock *txLinelock(struct linelock * tlock)
linelock->flag = tlckLINELOCK;
linelock->maxcnt = TLOCKLONG;
linelock->index = 0;
linelock->flag = tlckLINELOCK;
linelock->maxcnt = TLOCKLONG;
linelock->index = 0;
+ if (tlck->flag & tlckDIRECTORY)
+ linelock->flag |= tlckDIRECTORY;
/* append linelock after tlock */
linelock->next = tlock->next;
/* append linelock after tlock */
linelock->next = tlock->next;
@@
-1222,10
+1231,8
@@
int txCommit(tid_t tid, /* transaction identifier */
* when we don't need to worry about it at all.
*
* if ((!S_ISDIR(ip->i_mode))
* when we don't need to worry about it at all.
*
* if ((!S_ISDIR(ip->i_mode))
- * && (tblk->flag & COMMIT_DELETE) == 0) {
- * filemap_fdatawrite(ip->i_mapping);
- * filemap_fdatawait(ip->i_mapping);
- * }
+ * && (tblk->flag & COMMIT_DELETE) == 0)
+ * filemap_write_and_wait(ip->i_mapping);
*/
/*
*/
/*
@@
-2068,8
+2075,8
@@
static void xtLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
*
* function: log from maplock of freed data extents;
*/
*
* function: log from maplock of freed data extents;
*/
-void mapLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
- struct tlock * tlck)
+
static
void mapLog(struct jfs_log * log, struct tblock * tblk, struct lrd * lrd,
+
struct tlock * tlck)
{
struct pxd_lock *pxdlock;
int i, nlock;
{
struct pxd_lock *pxdlock;
int i, nlock;
@@
-2207,7
+2214,7
@@
void txEA(tid_t tid, struct inode *ip, dxd_t * oldea, dxd_t * newea)
* function: synchronously write pages locked by transaction
* after txLog() but before txUpdateMap();
*/
* function: synchronously write pages locked by transaction
* after txLog() but before txUpdateMap();
*/
-void txForce(struct tblock * tblk)
+
static
void txForce(struct tblock * tblk)
{
struct tlock *tlck;
lid_t lid, next;
{
struct tlock *tlck;
lid_t lid, next;
@@
-2356,7
+2363,7
@@
static void txUpdateMap(struct tblock * tblk)
*/
else { /* (maplock->flag & mlckFREE) */
*/
else { /* (maplock->flag & mlckFREE) */
- if (
S_ISDIR(tlck->ip->i_mode)
)
+ if (
tlck->flag & tlckDIRECTORY
)
txFreeMap(ipimap, maplock,
tblk, COMMIT_PWMAP);
else
txFreeMap(ipimap, maplock,
tblk, COMMIT_PWMAP);
else
@@
-2387,7
+2394,6
@@
static void txUpdateMap(struct tblock * tblk)
*/
if (tblk->xflag & COMMIT_CREATE) {
diUpdatePMap(ipimap, tblk->ino, FALSE, tblk);
*/
if (tblk->xflag & COMMIT_CREATE) {
diUpdatePMap(ipimap, tblk->ino, FALSE, tblk);
- ipimap->i_state |= I_DIRTY;
/* update persistent block allocation map
* for the allocation of inode extent;
*/
/* update persistent block allocation map
* for the allocation of inode extent;
*/
@@
-2398,7
+2404,6
@@
static void txUpdateMap(struct tblock * tblk)
} else if (tblk->xflag & COMMIT_DELETE) {
ip = tblk->u.ip;
diUpdatePMap(ipimap, ip->i_ino, TRUE, tblk);
} else if (tblk->xflag & COMMIT_DELETE) {
ip = tblk->u.ip;
diUpdatePMap(ipimap, ip->i_ino, TRUE, tblk);
- ipimap->i_state |= I_DIRTY;
iput(ip);
}
}
iput(ip);
}
}
@@
-2738,10
+2743,6
@@
int jfs_lazycommit(void *arg)
unsigned long flags;
struct jfs_sb_info *sbi;
unsigned long flags;
struct jfs_sb_info *sbi;
- daemonize("jfsCommit");
-
- complete(&jfsIOwait);
-
do {
LAZY_LOCK(flags);
jfs_commit_thread_waking = 0; /* OK to wake another thread */
do {
LAZY_LOCK(flags);
jfs_commit_thread_waking = 0; /* OK to wake another thread */
@@
-2801,13
+2802,13
@@
int jfs_lazycommit(void *arg)
current->state = TASK_RUNNING;
remove_wait_queue(&jfs_commit_thread_wait, &wq);
}
current->state = TASK_RUNNING;
remove_wait_queue(&jfs_commit_thread_wait, &wq);
}
- } while (!
jfs_stop_threads
);
+ } while (!
kthread_should_stop()
);
if (!list_empty(&TxAnchor.unlock_queue))
jfs_err("jfs_lazycommit being killed w/pending transactions!");
else
jfs_info("jfs_lazycommit being killed\n");
if (!list_empty(&TxAnchor.unlock_queue))
jfs_err("jfs_lazycommit being killed w/pending transactions!");
else
jfs_info("jfs_lazycommit being killed\n");
-
complete_and_exit(&jfsIOwait, 0)
;
+
return 0
;
}
void txLazyUnlock(struct tblock * tblk)
}
void txLazyUnlock(struct tblock * tblk)
@@
-2871,10
+2872,10
@@
restart:
*/
TXN_UNLOCK();
tid = txBegin(ip->i_sb, COMMIT_INODE | COMMIT_FORCE);
*/
TXN_UNLOCK();
tid = txBegin(ip->i_sb, COMMIT_INODE | COMMIT_FORCE);
-
down(&jfs_ip->commit_sem
);
+
mutex_lock(&jfs_ip->commit_mutex
);
txCommit(tid, 1, &ip, 0);
txEnd(tid);
txCommit(tid, 1, &ip, 0);
txEnd(tid);
-
up(&jfs_ip->commit_sem
);
+
mutex_unlock(&jfs_ip->commit_mutex
);
/*
* Just to be safe. I don't know how
* long we can run without blocking
/*
* Just to be safe. I don't know how
* long we can run without blocking
@@
-2927,10
+2928,6
@@
int jfs_sync(void *arg)
int rc;
tid_t tid;
int rc;
tid_t tid;
- daemonize("jfsSync");
-
- complete(&jfsIOwait);
-
do {
/*
* write each inode on the anonymous inode list
do {
/*
* write each inode on the anonymous inode list
@@
-2947,7
+2944,7
@@
int jfs_sync(void *arg)
* Inode is being freed
*/
list_del_init(&jfs_ip->anon_inode_list);
* Inode is being freed
*/
list_del_init(&jfs_ip->anon_inode_list);
- } else if (!
down_trylock(&jfs_ip->commit_sem
)) {
+ } else if (!
!mutex_trylock(&jfs_ip->commit_mutex
)) {
/*
* inode will be removed from anonymous list
* when it is committed
/*
* inode will be removed from anonymous list
* when it is committed
@@
-2956,7
+2953,7
@@
int jfs_sync(void *arg)
tid = txBegin(ip->i_sb, COMMIT_INODE);
rc = txCommit(tid, 1, &ip, 0);
txEnd(tid);
tid = txBegin(ip->i_sb, COMMIT_INODE);
rc = txCommit(tid, 1, &ip, 0);
txEnd(tid);
-
up(&jfs_ip->commit_sem
);
+
mutex_unlock(&jfs_ip->commit_mutex
);
iput(ip);
/*
iput(ip);
/*
@@
-2966,7
+2963,7
@@
int jfs_sync(void *arg)
cond_resched();
TXN_LOCK();
} else {
cond_resched();
TXN_LOCK();
} else {
- /* We can't get the commit
semaphore
. It may
+ /* We can't get the commit
mutex
. It may
* be held by a thread waiting for tlock's
* so let's not block here. Save it to
* put back on the anon_list.
* be held by a thread waiting for tlock's
* so let's not block here. Save it to
* put back on the anon_list.
@@
-2991,19
+2988,15
@@
int jfs_sync(void *arg)
TXN_UNLOCK();
refrigerator();
} else {
TXN_UNLOCK();
refrigerator();
} else {
- DECLARE_WAITQUEUE(wq, current);
-
- add_wait_queue(&jfs_sync_thread_wait, &wq);
set_current_state(TASK_INTERRUPTIBLE);
TXN_UNLOCK();
schedule();
current->state = TASK_RUNNING;
set_current_state(TASK_INTERRUPTIBLE);
TXN_UNLOCK();
schedule();
current->state = TASK_RUNNING;
- remove_wait_queue(&jfs_sync_thread_wait, &wq);
}
}
- } while (!
jfs_stop_threads
);
+ } while (!
kthread_should_stop()
);
jfs_info("jfs_sync being killed");
jfs_info("jfs_sync being killed");
-
complete_and_exit(&jfsIOwait, 0)
;
+
return 0
;
}
#if defined(CONFIG_PROC_FS) && defined(CONFIG_JFS_DEBUG)
}
#if defined(CONFIG_PROC_FS) && defined(CONFIG_JFS_DEBUG)