diff options
author | Hugh Dickins <hugh@veritas.com> | 2008-11-19 18:36:38 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-11-19 21:49:59 -0500 |
commit | f9454548e17cd56bad081bd7d55a09b001950cbb (patch) | |
tree | dd1d2000dbdae6d9baa638d5166b268ec40e8445 /fs/namei.c | |
parent | 63eb6b93ce725e4c5f38fc85dd703d49465b03cb (diff) |
don't unlink an active swapfile
Peter Cordes is sorry that he rm'ed his swapfiles while they were in use,
he then had no pathname to swapoff. It's a curious little oversight, but
not one worth a lot of hackery. Kudos to Willy Tarreau for turning this
around from a discussion of synthetic pathnames to how to prevent unlink.
Mimic immutable: prohibit unlinking an active swapfile in may_delete()
(and don't worry my little head over the tiny race window).
Signed-off-by: Hugh Dickins <hugh@veritas.com>
Cc: Willy Tarreau <w@1wt.eu>
Acked-by: Christoph Hellwig <hch@infradead.org>
Cc: Peter Cordes <peter@cordes.ca>
Cc: Bodo Eggert <7eggert@gmx.de>
Cc: David Newall <davidn@davidnewall.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/namei.c')
-rw-r--r-- | fs/namei.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/fs/namei.c b/fs/namei.c index 09ce58e49e72..d34e0f9681c6 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -1378,7 +1378,7 @@ static int may_delete(struct inode *dir,struct dentry *victim,int isdir) | |||
1378 | if (IS_APPEND(dir)) | 1378 | if (IS_APPEND(dir)) |
1379 | return -EPERM; | 1379 | return -EPERM; |
1380 | if (check_sticky(dir, victim->d_inode)||IS_APPEND(victim->d_inode)|| | 1380 | if (check_sticky(dir, victim->d_inode)||IS_APPEND(victim->d_inode)|| |
1381 | IS_IMMUTABLE(victim->d_inode)) | 1381 | IS_IMMUTABLE(victim->d_inode) || IS_SWAPFILE(victim->d_inode)) |
1382 | return -EPERM; | 1382 | return -EPERM; |
1383 | if (isdir) { | 1383 | if (isdir) { |
1384 | if (!S_ISDIR(victim->d_inode->i_mode)) | 1384 | if (!S_ISDIR(victim->d_inode->i_mode)) |