patch-2.4.22 linux-2.4.22/fs/reiserfs/namei.c
Next file: linux-2.4.22/fs/reiserfs/objectid.c
Previous file: linux-2.4.22/fs/reiserfs/lbalance.c
Back to the patch index
Back to the overall index
- Lines: 171
- Date:
2003-08-25 04:44:43.000000000 -0700
- Orig file:
linux-2.4.21/fs/reiserfs/namei.c
- Orig date:
2003-06-13 07:51:37.000000000 -0700
diff -urN linux-2.4.21/fs/reiserfs/namei.c linux-2.4.22/fs/reiserfs/namei.c
@@ -114,7 +114,7 @@
switch (retval) {
case ITEM_NOT_FOUND:
if (!PATH_LAST_POSITION (path)) {
- reiserfs_warning ("vs-7000: search_by_entry_key: search_by_key returned item position == 0");
+ reiserfs_warning (sb, "vs-7000: search_by_entry_key: search_by_key returned item position == 0\n");
pathrelse(path) ;
return IO_ERROR ;
}
@@ -128,7 +128,7 @@
default:
pathrelse (path);
- reiserfs_warning ("vs-7002: search_by_entry_key: no path to here");
+ reiserfs_warning (sb, "vs-7002: search_by_entry_key: no path to here\n ");
return IO_ERROR;
}
@@ -287,7 +287,7 @@
while (1) {
retval = search_by_entry_key (dir->i_sb, &key_to_search, path_to_entry, de);
if (retval == IO_ERROR) {
- reiserfs_warning ("zam-7001: io error in %s\n", __FUNCTION__);
+ reiserfs_warning (dir->i_sb, "zam-7001: io error in %s\n", __FUNCTION__);
return IO_ERROR;
}
@@ -413,7 +413,7 @@
}
if (retval != NAME_FOUND) {
- reiserfs_warning ("zam-7002:%s: \"reiserfs_find_entry\" has returned"
+ reiserfs_warning (dir->i_sb, "zam-7002:%s: \"reiserfs_find_entry\" has returned"
" unexpected value (%d)\n", __FUNCTION__, retval);
}
@@ -423,7 +423,7 @@
gen_number = find_first_zero_bit ((unsigned long *)bit_string, MAX_GENERATION_NUMBER + 1);
if (gen_number > MAX_GENERATION_NUMBER) {
/* there is no free generation number */
- reiserfs_warning ("reiserfs_add_entry: Congratulations! we have got hash function screwed up\n");
+ reiserfs_warning (dir->i_sb, "reiserfs_add_entry: Congratulations! we have got hash function screwed up\n");
if (buffer != small_buf)
reiserfs_kfree (buffer, buflen, dir->i_sb);
pathrelse (&path);
@@ -453,7 +453,7 @@
if (gen_number != 0) { /* we need to re-search for the insertion point */
if (search_by_entry_key (dir->i_sb, &entry_key, &path, &de) != NAME_NOT_FOUND) {
- reiserfs_warning ("vs-7032: reiserfs_add_entry: "
+ reiserfs_warning (dir->i_sb, "vs-7032: reiserfs_add_entry: "
"entry with this key (%K) already exists\n", &entry_key);
if (buffer != small_buf)
@@ -742,7 +742,7 @@
goto end_rmdir;
if ( inode->i_nlink != 2 && inode->i_nlink != 1 )
- printk ("reiserfs_rmdir: empty directory has nlink != 2 (%d)\n", inode->i_nlink);
+ reiserfs_warning ( inode->i_sb, "reiserfs_rmdir: empty directory has nlink != 2 (%d)\n", inode->i_nlink);
inode->i_nlink = 0;
inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
@@ -781,6 +781,7 @@
int windex ;
struct reiserfs_transaction_handle th ;
int jbegin_count;
+ unsigned long savelink;
inode = dentry->d_inode;
@@ -811,16 +812,25 @@
}
if (!inode->i_nlink) {
- printk("reiserfs_unlink: deleting nonexistent file (%s:%lu), %d\n",
+ reiserfs_warning(inode->i_sb, "reiserfs_unlink: deleting nonexistent file (%s:%lu), %d\n",
kdevname(inode->i_dev), inode->i_ino, inode->i_nlink);
inode->i_nlink = 1;
}
+ inode->i_nlink--;
+
+ /*
+ * we schedule before doing the add_save_link call, save the link
+ * count so we don't race
+ */
+ savelink = inode->i_nlink;
+
+
retval = reiserfs_cut_from_item (&th, &path, &(de.de_entry_key), dir, NULL, 0);
- if (retval < 0)
+ if (retval < 0) {
+ inode->i_nlink++;
goto end_unlink;
-
- inode->i_nlink--;
+ }
inode->i_ctime = CURRENT_TIME;
reiserfs_update_sd (&th, inode);
@@ -829,7 +839,7 @@
dir->i_ctime = dir->i_mtime = CURRENT_TIME;
reiserfs_update_sd (&th, dir);
- if (!inode->i_nlink)
+ if (!savelink)
/* prevent file from getting lost */
add_save_link (&th, inode, 0/* not truncate */);
@@ -937,6 +947,12 @@
//FIXME: sd_nlink is 32 bit for new files
return -EMLINK;
}
+ if (inode->i_nlink == 0) {
+ return -ENOENT;
+ }
+
+ /* inc before scheduling so reiserfs_unlink knows we are here */
+ inode->i_nlink++;
journal_begin(&th, dir->i_sb, jbegin_count) ;
windex = push_journal_writer("reiserfs_link") ;
@@ -949,12 +965,12 @@
reiserfs_update_inode_transaction(dir) ;
if (retval) {
+ inode->i_nlink--;
pop_journal_writer(windex) ;
journal_end(&th, dir->i_sb, jbegin_count) ;
return retval;
}
- inode->i_nlink++;
ctime = CURRENT_TIME;
inode->i_ctime = ctime;
reiserfs_update_sd (&th, inode);
@@ -1029,6 +1045,7 @@
int jbegin_count ;
umode_t old_inode_mode;
time_t ctime;
+ unsigned long savelink = 1;
/* two balancings: old name removal, new name insertion or "save" link,
@@ -1200,6 +1217,7 @@
}
ctime = CURRENT_TIME;
new_dentry_inode->i_ctime = ctime;
+ savelink = new_dentry_inode->i_nlink;
}
if (S_ISDIR(old_inode_mode)) {
@@ -1224,7 +1242,7 @@
// anybody, but it will panic if will not be able to find the
// entry. This needs one more clean up
if (reiserfs_cut_from_item (&th, &old_entry_path, &(old_de.de_entry_key), old_dir, NULL, 0) < 0)
- reiserfs_warning ("vs-7060: reiserfs_rename: couldn't not cut old name. Fsck later?\n");
+ reiserfs_warning ((&th)->t_super, "vs-7060: reiserfs_rename: couldn't not cut old name. Fsck later?\n");
old_dir->i_size -= DEH_SIZE + old_de.de_entrylen;
old_dir->i_blocks = ((old_dir->i_size + 511) >> 9);
@@ -1233,7 +1251,7 @@
reiserfs_update_sd (&th, new_dir);
if (new_dentry_inode) {
- if (new_dentry_inode->i_nlink == 0)
+ if (savelink == 0)
add_save_link (&th, new_dentry_inode, 0/* not truncate */);
reiserfs_update_sd (&th, new_dentry_inode);
}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)