aboutsummaryrefslogtreecommitdiffstats
path: root/fs/libfs.c
diff options
context:
space:
mode:
authorDave Hansen <haveblue@us.ibm.com>2006-10-01 02:29:03 -0400
committerLinus Torvalds <torvalds@g5.osdl.org>2006-10-01 03:39:30 -0400
commit9a53c3a783c2fa9b969628e65695c11c3e51e673 (patch)
tree5a6115e18ee105246d46e3db3d5b07749d232f5b /fs/libfs.c
parentaab520e2f6c80160cabd187a8d0292d1cec8ff68 (diff)
[PATCH] r/o bind mounts: unlink: monitor i_nlink
When a filesystem decrements i_nlink to zero, it means that a write must be performed in order to drop the inode from the filesystem. We're shortly going to have keep filesystems from being remounted r/o between the time that this i_nlink decrement and that write occurs. So, add a little helper function to do the decrements. We'll tie into it in a bit to note when i_nlink hits zero. Signed-off-by: Dave Hansen <haveblue@us.ibm.com> Acked-by: Christoph Hellwig <hch@lst.de> Cc: Al Viro <viro@zeniv.linux.org.uk> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/libfs.c')
-rw-r--r--fs/libfs.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/fs/libfs.c b/fs/libfs.c
index 3793aaa14577..9204feba75ac 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -275,7 +275,7 @@ int simple_unlink(struct inode *dir, struct dentry *dentry)
275 struct inode *inode = dentry->d_inode; 275 struct inode *inode = dentry->d_inode;
276 276
277 inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME; 277 inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME;
278 inode->i_nlink--; 278 drop_nlink(inode);
279 dput(dentry); 279 dput(dentry);
280 return 0; 280 return 0;
281} 281}
@@ -285,9 +285,9 @@ int simple_rmdir(struct inode *dir, struct dentry *dentry)
285 if (!simple_empty(dentry)) 285 if (!simple_empty(dentry))
286 return -ENOTEMPTY; 286 return -ENOTEMPTY;
287 287
288 dentry->d_inode->i_nlink--; 288 drop_nlink(dentry->d_inode);
289 simple_unlink(dir, dentry); 289 simple_unlink(dir, dentry);
290 dir->i_nlink--; 290 drop_nlink(dir);
291 return 0; 291 return 0;
292} 292}
293 293
@@ -303,9 +303,9 @@ int simple_rename(struct inode *old_dir, struct dentry *old_dentry,
303 if (new_dentry->d_inode) { 303 if (new_dentry->d_inode) {
304 simple_unlink(new_dir, new_dentry); 304 simple_unlink(new_dir, new_dentry);
305 if (they_are_dirs) 305 if (they_are_dirs)
306 old_dir->i_nlink--; 306 drop_nlink(old_dir);
307 } else if (they_are_dirs) { 307 } else if (they_are_dirs) {
308 old_dir->i_nlink--; 308 drop_nlink(old_dir);
309 new_dir->i_nlink++; 309 new_dir->i_nlink++;
310 } 310 }
311 311