Skip to content
Snippets Groups Projects
Commit c130ceac authored by alex's avatar alex
Browse files

- ext3_del_dir_entry() should drop nlink if victim is a directory

- test 4a of sanity-lmv.sh to check this case
parent dc27efe0
No related branches found
No related tags found
No related merge requests found
Index: linux-2.4.24/fs/ext3/namei.c Index: linux-2.4.24/fs/ext3/namei.c
=================================================================== ===================================================================
--- linux-2.4.24.orig/fs/ext3/namei.c 2004-03-01 19:42:04.000000000 +0300 --- linux-2.4.24.orig/fs/ext3/namei.c 2004-06-23 08:31:23.000000000 +0400
+++ linux-2.4.24/fs/ext3/namei.c 2004-03-29 19:27:13.000000000 +0400 +++ linux-2.4.24/fs/ext3/namei.c 2004-06-23 08:32:59.000000000 +0400
@@ -1100,6 +1100,23 @@ @@ -1099,6 +1099,23 @@
inode = NULL; inode = NULL;
if (bh) { if (bh) {
unsigned long ino = le32_to_cpu(de->inode); unsigned long ino = le32_to_cpu(de->inode);
...@@ -26,16 +26,16 @@ Index: linux-2.4.24/fs/ext3/namei.c ...@@ -26,16 +26,16 @@ Index: linux-2.4.24/fs/ext3/namei.c
ext3_unlock_htree(dir, lock); ext3_unlock_htree(dir, lock);
brelse (bh); brelse (bh);
inode = iget(dir->i_sb, ino); inode = iget(dir->i_sb, ino);
@@ -1160,7 +1177,7 @@ @@ -1138,7 +1155,7 @@
while (count--) { while (count--) {
struct ext3_dir_entry_2 *de = struct ext3_dir_entry_2 *de =
(struct ext3_dir_entry_2 *) (from + map->offs); (struct ext3_dir_entry_2 *) (from + map->offs);
- rec_len = EXT3_DIR_REC_LEN(de->name_len); - rec_len = EXT3_DIR_REC_LEN(de->name_len);
+ rec_len = EXT3_DIR_REC_LEN_DE(de); + rec_len = EXT3_DIR_REC_LEN_DE(de);
memcpy (to, de, rec_len); memcpy (to, de, rec_len);
((struct ext3_dir_entry_2 *) to)->rec_len = rec_len; ((struct ext3_dir_entry_2 *)to)->rec_len = cpu_to_le16(rec_len);
de->inode = 0; de->inode = 0;
@@ -1181,7 +1198,7 @@ @@ -1159,7 +1176,7 @@
next = (struct ext3_dir_entry_2 *) ((char *) de + next = (struct ext3_dir_entry_2 *) ((char *) de +
le16_to_cpu(de->rec_len)); le16_to_cpu(de->rec_len));
if (de->inode && de->name_len) { if (de->inode && de->name_len) {
...@@ -43,8 +43,8 @@ Index: linux-2.4.24/fs/ext3/namei.c ...@@ -43,8 +43,8 @@ Index: linux-2.4.24/fs/ext3/namei.c
+ rec_len = EXT3_DIR_REC_LEN_DE(de); + rec_len = EXT3_DIR_REC_LEN_DE(de);
if (de > to) if (de > to)
memmove(to, de, rec_len); memmove(to, de, rec_len);
to->rec_len = rec_len; to->rec_len = cpu_to_le16(rec_len);
@@ -1297,6 +1314,7 @@ @@ -1275,6 +1292,7 @@
struct buffer_head * bh) struct buffer_head * bh)
{ {
struct inode *dir = dentry->d_parent->d_inode; struct inode *dir = dentry->d_parent->d_inode;
...@@ -52,7 +52,7 @@ Index: linux-2.4.24/fs/ext3/namei.c ...@@ -52,7 +52,7 @@ Index: linux-2.4.24/fs/ext3/namei.c
const char *name = dentry->d_name.name; const char *name = dentry->d_name.name;
int namelen = dentry->d_name.len; int namelen = dentry->d_name.len;
unsigned long offset = 0; unsigned long offset = 0;
@@ -1305,6 +1323,10 @@ @@ -1283,6 +1301,10 @@
char *top; char *top;
reclen = EXT3_DIR_REC_LEN(namelen); reclen = EXT3_DIR_REC_LEN(namelen);
...@@ -63,7 +63,7 @@ Index: linux-2.4.24/fs/ext3/namei.c ...@@ -63,7 +63,7 @@ Index: linux-2.4.24/fs/ext3/namei.c
if (!de) { if (!de) {
de = (struct ext3_dir_entry_2 *)bh->b_data; de = (struct ext3_dir_entry_2 *)bh->b_data;
top = bh->b_data + dir->i_sb->s_blocksize - reclen; top = bh->b_data + dir->i_sb->s_blocksize - reclen;
@@ -1318,7 +1340,7 @@ @@ -1296,7 +1318,7 @@
brelse (bh); brelse (bh);
return -EEXIST; return -EEXIST;
} }
...@@ -72,7 +72,7 @@ Index: linux-2.4.24/fs/ext3/namei.c ...@@ -72,7 +72,7 @@ Index: linux-2.4.24/fs/ext3/namei.c
rlen = le16_to_cpu(de->rec_len); rlen = le16_to_cpu(de->rec_len);
if ((de->inode? rlen - nlen: rlen) >= reclen) if ((de->inode? rlen - nlen: rlen) >= reclen)
break; break;
@@ -1337,7 +1359,7 @@ @@ -1315,7 +1337,7 @@
} }
/* By now the buffer is marked for journaling */ /* By now the buffer is marked for journaling */
...@@ -81,7 +81,7 @@ Index: linux-2.4.24/fs/ext3/namei.c ...@@ -81,7 +81,7 @@ Index: linux-2.4.24/fs/ext3/namei.c
rlen = le16_to_cpu(de->rec_len); rlen = le16_to_cpu(de->rec_len);
if (de->inode) { if (de->inode) {
struct ext3_dir_entry_2 *de1 = struct ext3_dir_entry_2 *de1 =
@@ -1349,8 +1371,20 @@ @@ -1327,8 +1349,20 @@
de->file_type = EXT3_FT_UNKNOWN; de->file_type = EXT3_FT_UNKNOWN;
if (inode) { if (inode) {
de->inode = cpu_to_le32(inode->i_ino); de->inode = cpu_to_le32(inode->i_ino);
...@@ -104,7 +104,7 @@ Index: linux-2.4.24/fs/ext3/namei.c ...@@ -104,7 +104,7 @@ Index: linux-2.4.24/fs/ext3/namei.c
de->inode = 0; de->inode = 0;
de->name_len = namelen; de->name_len = namelen;
memcpy (de->name, name, namelen); memcpy (de->name, name, namelen);
@@ -2662,6 +2696,77 @@ @@ -2662,6 +2696,79 @@
} }
/* /*
...@@ -166,11 +166,13 @@ Index: linux-2.4.24/fs/ext3/namei.c ...@@ -166,11 +166,13 @@ Index: linux-2.4.24/fs/ext3/namei.c
+ goto end_unlink; + goto end_unlink;
+ dir->i_ctime = dir->i_mtime = CURRENT_TIME; + dir->i_ctime = dir->i_mtime = CURRENT_TIME;
+ ext3_update_dx_flag(dir); + ext3_update_dx_flag(dir);
+ ext3_mark_inode_dirty(handle, dir);
+ if (inode) { + if (inode) {
+ inode->i_ctime = dir->i_ctime; + inode->i_ctime = dir->i_ctime;
+ ext3_mark_inode_dirty(handle, inode); + ext3_mark_inode_dirty(handle, inode);
+ if (S_ISDIR(inode->i_mode))
+ dir->i_nlink--;
+ } + }
+ ext3_mark_inode_dirty(handle, dir);
+ retval = 0; + retval = 0;
+ +
+end_unlink: +end_unlink:
...@@ -184,8 +186,8 @@ Index: linux-2.4.24/fs/ext3/namei.c ...@@ -184,8 +186,8 @@ Index: linux-2.4.24/fs/ext3/namei.c
struct inode_operations ext3_dir_inode_operations = { struct inode_operations ext3_dir_inode_operations = {
Index: linux-2.4.24/fs/ext3/dir.c Index: linux-2.4.24/fs/ext3/dir.c
=================================================================== ===================================================================
--- linux-2.4.24.orig/fs/ext3/dir.c 2004-03-01 19:20:49.000000000 +0300 --- linux-2.4.24.orig/fs/ext3/dir.c 2004-06-23 08:31:21.000000000 +0400
+++ linux-2.4.24/fs/ext3/dir.c 2004-03-01 19:42:15.000000000 +0300 +++ linux-2.4.24/fs/ext3/dir.c 2004-06-23 08:31:23.000000000 +0400
@@ -42,6 +42,9 @@ @@ -42,6 +42,9 @@
static unsigned char get_dtype(struct super_block *sb, int filetype) static unsigned char get_dtype(struct super_block *sb, int filetype)
...@@ -198,8 +200,8 @@ Index: linux-2.4.24/fs/ext3/dir.c ...@@ -198,8 +200,8 @@ Index: linux-2.4.24/fs/ext3/dir.c
return DT_UNKNOWN; return DT_UNKNOWN;
Index: linux-2.4.24/fs/ext3/ext3-exports.c Index: linux-2.4.24/fs/ext3/ext3-exports.c
=================================================================== ===================================================================
--- linux-2.4.24.orig/fs/ext3/ext3-exports.c 2004-03-01 19:20:50.000000000 +0300 --- linux-2.4.24.orig/fs/ext3/ext3-exports.c 2004-06-23 08:31:22.000000000 +0400
+++ linux-2.4.24/fs/ext3/ext3-exports.c 2004-03-11 23:40:49.000000000 +0300 +++ linux-2.4.24/fs/ext3/ext3-exports.c 2004-06-23 08:31:23.000000000 +0400
@@ -26,3 +26,10 @@ @@ -26,3 +26,10 @@
EXPORT_SYMBOL(ext3_decode_error); EXPORT_SYMBOL(ext3_decode_error);
EXPORT_SYMBOL(__ext3_std_error); EXPORT_SYMBOL(__ext3_std_error);
...@@ -213,9 +215,9 @@ Index: linux-2.4.24/fs/ext3/ext3-exports.c ...@@ -213,9 +215,9 @@ Index: linux-2.4.24/fs/ext3/ext3-exports.c
+ +
Index: linux-2.4.24/include/linux/ext3_fs.h Index: linux-2.4.24/include/linux/ext3_fs.h
=================================================================== ===================================================================
--- linux-2.4.24.orig/include/linux/ext3_fs.h 2004-03-01 19:42:04.000000000 +0300 --- linux-2.4.24.orig/include/linux/ext3_fs.h 2004-06-23 08:31:23.000000000 +0400
+++ linux-2.4.24/include/linux/ext3_fs.h 2004-03-01 19:42:15.000000000 +0300 +++ linux-2.4.24/include/linux/ext3_fs.h 2004-06-23 08:31:23.000000000 +0400
@@ -431,7 +431,8 @@ @@ -445,7 +445,8 @@
__u8 s_def_hash_version; /* Default hash version to use */ __u8 s_def_hash_version; /* Default hash version to use */
__u8 s_reserved_char_pad; __u8 s_reserved_char_pad;
__u16 s_reserved_word_pad; __u16 s_reserved_word_pad;
...@@ -225,7 +227,7 @@ Index: linux-2.4.24/include/linux/ext3_fs.h ...@@ -225,7 +227,7 @@ Index: linux-2.4.24/include/linux/ext3_fs.h
}; };
#ifdef __KERNEL__ #ifdef __KERNEL__
@@ -504,10 +505,12 @@ @@ -518,10 +519,12 @@
#define EXT3_FEATURE_INCOMPAT_FILETYPE 0x0002 #define EXT3_FEATURE_INCOMPAT_FILETYPE 0x0002
#define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */ #define EXT3_FEATURE_INCOMPAT_RECOVER 0x0004 /* Needs recovery */
#define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */ #define EXT3_FEATURE_INCOMPAT_JOURNAL_DEV 0x0008 /* Journal device */
...@@ -239,7 +241,7 @@ Index: linux-2.4.24/include/linux/ext3_fs.h ...@@ -239,7 +241,7 @@ Index: linux-2.4.24/include/linux/ext3_fs.h
#define EXT3_FEATURE_RO_COMPAT_SUPP (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \ #define EXT3_FEATURE_RO_COMPAT_SUPP (EXT3_FEATURE_RO_COMPAT_SPARSE_SUPER| \
EXT3_FEATURE_RO_COMPAT_LARGE_FILE| \ EXT3_FEATURE_RO_COMPAT_LARGE_FILE| \
EXT3_FEATURE_RO_COMPAT_BTREE_DIR) EXT3_FEATURE_RO_COMPAT_BTREE_DIR)
@@ -568,6 +571,9 @@ @@ -582,6 +585,9 @@
#define EXT3_DIR_ROUND (EXT3_DIR_PAD - 1) #define EXT3_DIR_ROUND (EXT3_DIR_PAD - 1)
#define EXT3_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT3_DIR_ROUND) & \ #define EXT3_DIR_REC_LEN(name_len) (((name_len) + 8 + EXT3_DIR_ROUND) & \
~EXT3_DIR_ROUND) ~EXT3_DIR_ROUND)
...@@ -251,8 +253,8 @@ Index: linux-2.4.24/include/linux/ext3_fs.h ...@@ -251,8 +253,8 @@ Index: linux-2.4.24/include/linux/ext3_fs.h
* (c) Daniel Phillips, 2001 * (c) Daniel Phillips, 2001
Index: linux-2.4.24/include/linux/ext3_fs_sb.h Index: linux-2.4.24/include/linux/ext3_fs_sb.h
=================================================================== ===================================================================
--- linux-2.4.24.orig/include/linux/ext3_fs_sb.h 2004-03-01 19:20:49.000000000 +0300 --- linux-2.4.24.orig/include/linux/ext3_fs_sb.h 2004-06-23 08:31:21.000000000 +0400
+++ linux-2.4.24/include/linux/ext3_fs_sb.h 2004-03-01 19:42:21.000000000 +0300 +++ linux-2.4.24/include/linux/ext3_fs_sb.h 2004-06-23 08:31:23.000000000 +0400
@@ -86,6 +86,7 @@ @@ -86,6 +86,7 @@
wait_queue_head_t s_delete_thread_queue; wait_queue_head_t s_delete_thread_queue;
wait_queue_head_t s_delete_waiter_queue; wait_queue_head_t s_delete_waiter_queue;
...@@ -263,9 +265,9 @@ Index: linux-2.4.24/include/linux/ext3_fs_sb.h ...@@ -263,9 +265,9 @@ Index: linux-2.4.24/include/linux/ext3_fs_sb.h
#endif /* _LINUX_EXT3_FS_SB */ #endif /* _LINUX_EXT3_FS_SB */
Index: linux-2.4.24/include/linux/dcache.h Index: linux-2.4.24/include/linux/dcache.h
=================================================================== ===================================================================
--- linux-2.4.24.orig/include/linux/dcache.h 2004-03-01 19:20:49.000000000 +0300 --- linux-2.4.24.orig/include/linux/dcache.h 2004-06-23 08:31:22.000000000 +0400
+++ linux-2.4.24/include/linux/dcache.h 2004-03-01 19:42:15.000000000 +0300 +++ linux-2.4.24/include/linux/dcache.h 2004-06-23 08:31:23.000000000 +0400
@@ -118,6 +118,9 @@ @@ -120,6 +120,9 @@
atomic_t d_count; atomic_t d_count;
unsigned int d_flags; unsigned int d_flags;
struct inode * d_inode; /* Where the name belongs to - NULL is negative */ struct inode * d_inode; /* Where the name belongs to - NULL is negative */
...@@ -275,7 +277,7 @@ Index: linux-2.4.24/include/linux/dcache.h ...@@ -275,7 +277,7 @@ Index: linux-2.4.24/include/linux/dcache.h
struct dentry * d_parent; /* parent directory */ struct dentry * d_parent; /* parent directory */
struct list_head d_hash; /* lookup hash list */ struct list_head d_hash; /* lookup hash list */
struct list_head d_lru; /* d_count = 0 LRU list */ struct list_head d_lru; /* d_count = 0 LRU list */
@@ -189,6 +192,7 @@ @@ -193,6 +196,7 @@
*/ */
#define DCACHE_REFERENCED 0x0008 /* Recently used, don't discard. */ #define DCACHE_REFERENCED 0x0008 /* Recently used, don't discard. */
#define DCACHE_LUSTRE_INVALID 0x0010 /* Lustre invalidated */ #define DCACHE_LUSTRE_INVALID 0x0010 /* Lustre invalidated */
......
...@@ -320,6 +320,22 @@ test_3c() { ...@@ -320,6 +320,22 @@ test_3c() {
run_test 3c " dir splitting via lfs stripe =============================" run_test 3c " dir splitting via lfs stripe ============================="
test_4a() {
let rr=0
while let "rr < 33000"; do
if let "rr % 2000 == 0"; then
echo "$rr"
fi
mkdir $DIR/4a1 || error
rm -rf $DIR/4a1
let "rr = rr + 1"
done
}
## this test is very time-consuming, don't run it by default
#run_test 4a " FIDS/ nlink overflow test ============================="
TMPDIR=$OLDTMPDIR TMPDIR=$OLDTMPDIR
TMP=$OLDTMP TMP=$OLDTMP
HOME=$OLDHOME HOME=$OLDHOME
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment