diff --git a/fs/jfs/jfs_imap.c b/fs/jfs/jfs_imap.c index ecb8e05b8b84..7f93150d319f 100644 --- a/fs/jfs/jfs_imap.c +++ b/fs/jfs/jfs_imap.c @@ -762,6 +762,8 @@ int diWrite(tid_t tid, struct inode *ip) * copy inline symlink from in-memory inode to on-disk inode */ if (S_ISLNK(ip->i_mode) && ip->i_size < IDATASIZE) { + if (unlikely(dilinelock->index >= dilinelock->maxcnt)) + dilinelock = txLinelock(dilinelock); lv = & dilinelock->lv[dilinelock->index]; lv->offset = (dioffset + 2 * 128) >> L2INODESLOTSIZE; lv->length = 2; @@ -773,6 +775,8 @@ int diWrite(tid_t tid, struct inode *ip) * 128 byte slot granularity */ if (test_cflag(COMMIT_Inlineea, ip)) { + if (unlikely(dilinelock->index >= dilinelock->maxcnt)) + dilinelock = txLinelock(dilinelock); lv = & dilinelock->lv[dilinelock->index]; lv->offset = (dioffset + 3 * 128) >> L2INODESLOTSIZE; lv->length = 1; @@ -785,6 +789,8 @@ int diWrite(tid_t tid, struct inode *ip) /* * lock/copy inode base: 128 byte slot granularity */ + if (unlikely(dilinelock->index >= dilinelock->maxcnt)) + dilinelock = txLinelock(dilinelock); lv = & dilinelock->lv[dilinelock->index]; lv->offset = dioffset >> L2INODESLOTSIZE; copy_to_dinode(dp, ip);