Commit 39d21233 authored by Hugh Dickins's avatar Hugh Dickins Committed by Linus Torvalds

[PATCH] shmem_rename() fixes

shmem_rename still didn't get parent directory link count quite right,
in the case where you rename a directory in place of an empty directory
(with rename syscall: doesn't happen like that with mv command); and it
forgot to update new directory's ctime and mtime.  (I'll be sending 2.4
version to Marcelo shortly.)
parent 6b5dbcf2
...@@ -1191,24 +1191,24 @@ static int shmem_rmdir(struct inode * dir, struct dentry *dentry) ...@@ -1191,24 +1191,24 @@ static int shmem_rmdir(struct inode * dir, struct dentry *dentry)
*/ */
static int shmem_rename(struct inode * old_dir, struct dentry *old_dentry, struct inode * new_dir,struct dentry *new_dentry) static int shmem_rename(struct inode * old_dir, struct dentry *old_dentry, struct inode * new_dir,struct dentry *new_dentry)
{ {
struct inode *inode; struct inode *inode = old_dentry->d_inode;
int they_are_dirs = S_ISDIR(inode->i_mode);
if (!shmem_empty(new_dentry)) if (!shmem_empty(new_dentry))
return -ENOTEMPTY; return -ENOTEMPTY;
inode = new_dentry->d_inode; if (new_dentry->d_inode) {
if (inode) { (void) shmem_unlink(new_dir, new_dentry);
inode->i_ctime = CURRENT_TIME; if (they_are_dirs)
inode->i_nlink--; old_dir->i_nlink--;
dput(new_dentry); } else if (they_are_dirs) {
}
inode = old_dentry->d_inode;
if (S_ISDIR(inode->i_mode)) {
old_dir->i_nlink--; old_dir->i_nlink--;
new_dir->i_nlink++; new_dir->i_nlink++;
} }
inode->i_ctime = old_dir->i_ctime = old_dir->i_mtime = CURRENT_TIME; old_dir->i_ctime = old_dir->i_mtime =
new_dir->i_ctime = new_dir->i_mtime =
inode->i_ctime = CURRENT_TIME;
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment