ocfs2: Add a missing journal credit in ocfs2_link_credits() -v2
PATCH 1/1 ocfs2: Add a missing journal credit in ocfs2_link_credits() -v2
From: Xiaowei.Hu <[email protected]>
With indexed_dir enabled, ocfs2 maintains a list of dirblocks having space.
The credit calculation in ocfs2_link_credits() did not correctly account for adding an entry that exactly fills a dirblock that triggers removing that dirblock by changing the pointer in the previous block in the list. The credit calculation did not account for that previous block.
To expose, do:
mkfs.ocfs2 -b 512 -M local /dev/sdX
mount /dev/sdX /ocfs2
mkdir /ocfs2/linkdir
touch /ocfs2/linkdir/file1
for i in seq 1 29 ; do link /ocfs2/linkdir/file1 /ocfs2/linkdir/linklinklinklinklinklink$i; done
rm -f /ocfs2/linkdir/linklinklinklinklinklink10
sleep 8
link /ocfs2/linkdir/file1 /ocfs2/linkdir/linklinklinklinklinklinkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Note:
The link names have been crafted for a 512 byte blocksize. Reproducing with a larger blocksize will require longer (or more) links. The sleep is important. We want jbd2 to commit the transaction so that the missing block does not piggy back on account of the previous transaction.
--- fs/ocfs2/journal.h | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-)
fs/ocfs2/journal.h +3 -2
@@ -441,10 +441,11 @@ static inline int ocfs2_mknod_credits(struct super_block *sb, int is_dir,#define OCFS2_SIMPLE_DIR_EXTEND_CREDITS (2)/* file update (nlink, etc) + directory mtime/ctime + dir entry block + quota -* update on dir + index leaf + dx root update for free list */ +* update on dir + index leaf + dx root update for free list + +* previous dirblock update in the free list */ static inline int ocfs2_link_credits (struct super_block *sb) { -return 2 *OCFS2_INODE_UPDATE_CREDITS +3 + +return 2 *OCFS2_INODE_UPDATE_CREDITS +4 +ocfs2_quota_trans_credits (sb); }
Signature · 1 line
1.7.4.4
Joel Becker
maintainerPATCH 1/1 ocfs2: Add a missing journal credit in ocfs2_link_credits() -v2
Quoted 29 lines · xiaowei.hu at oracle.com
From: Xiaowei.Hu <[email protected]>
With
indexed_direnabled, ocfs2 maintains a list of dirblocks having space.The credit calculation in
ocfs2_link_credits()did not correctly account for adding an entry that exactly fills a dirblock that triggers removing that dirblock by changing the pointer in the previous block in the list. The credit calculation did not account for that previous block.To expose, do:
mkfs.ocfs2 -b 512 -M local
/dev/sdX
mount/dev/sdX/ocfs2
mkdir /ocfs2/linkdir
touch /ocfs2/linkdir/file1
for i inseq 1 29; do link /ocfs2/linkdir/file1 /ocfs2/linkdir/linklinklinklinklinklink$i; done
rm -f /ocfs2/linkdir/linklinklinklinklinklink10
sleep 8
link /ocfs2/linkdir/file1 /ocfs2/linkdir/linklinklinklinklinklinkaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaNote:
The link names have been crafted for a 512 byte blocksize. Reproducing with a larger blocksize will require longer (or more) links. The sleep is important. We want jbd2 to commit the transaction so that the missing block does not piggy back on account of the previous transaction.
Quoted 3 lines
Signed-off-by XiaoweiHu <[email protected]>Reviewed-by WengangWang <[email protected]>Reviewed-by Sunil.Mushran <[email protected]>
This patch is now in the 'fixes' branch of ocfs2.git.
Joel
Quoted 30 lines
--- fs/ocfs2/journal.h | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-)fs/ocfs2/journal.h +3
-2@@ -441,10 +441,11 @@ static inline int ocfs2_mknod_credits(struct super_block *sb, int is_dir,#define OCFS2_SIMPLE_DIR_EXTEND_CREDITS (2)/* file update (nlink, etc) + directory mtime/ctime + dir entry block + quota -* update on dir + index leaf + dx root update for free list */ +* update on dir + index leaf + dx root update for free list + +* previous dirblock update in the free list */ static inline int ocfs2_link_credits (struct super_block *sb) { -return 2 *OCFS2_INODE_UPDATE_CREDITS +3 + +return 2 *OCFS2_INODE_UPDATE_CREDITS +4 +ocfs2_quota_trans_credits (sb); }Signature · 7 lines
1.7.4.4 _______________________________________________ Ocfs2-devel mailing list Ocfs2-devel at oss.oracle.com http://oss.oracle.com/mailman/listinfo/ocfs2-devel
Signature · 5 lines
"I inject pure kryptonite into my brain. It improves my kung fu, and it eases the pain." http://www.jlbec.org/ jlbec at evilplan.org