[<prev] [next>] [day] [month] [year] [list]
Message-ID: <4E4B721D.9020009@sx.jp.nec.com>
Date: Wed, 17 Aug 2011 16:47:41 +0900
From: Kazuya Mio <k-mio@...jp.nec.com>
To: ext4 <linux-ext4@...r.kernel.org>, Theodore Tso <tytso@....edu>
Subject: [PATCH v2 07/12] e4defrag: Allow user who can use reserved blocks
to defrag
Fix free blocks check for general users to use the reserved blocks because
they can use reserved blocks in the following cases:
- the users are specified by mount option resuid/resgid
- e4defrag has CAP_SYS_RESOURCE capability
Signed-off-by: Kazuya Mio <k-mio@...jp.nec.com>
---
misc/e4defrag.c | 37 +++++++------------------------------
1 file changed, 7 insertions(+), 30 deletions(-)
diff --git a/misc/e4defrag.c b/misc/e4defrag.c
index 2c998fd..3f39528 100644
--- a/misc/e4defrag.c
+++ b/misc/e4defrag.c
@@ -467,12 +467,15 @@ static int defrag_fadvise(int fd, struct move_extent defrag_data,
* @fd: defrag target file's descriptor.
* @file: file name.
* @blk_count: file blocks.
+ *
+ * Note that the users who cannot use the reserved blocks might pass this
+ * free space check though there is no free blocks except for reserved blocks.
+ * In this case, they can catch ENOSPC when donor file is created by fallocate
+ * in file_defrag(). So, it's no problem.
*/
static int check_free_size(int fd, const char *file, ext4_fsblk_t blk_count)
{
- ext4_fsblk_t free_blk_count;
struct statfs64 fsbuf;
- uid_t current_uid = getuid();
if (fstatfs64(fd, &fsbuf) < 0) {
if (mode_flag & DETAIL) {
@@ -483,16 +486,7 @@ static int check_free_size(int fd, const char *file, ext4_fsblk_t blk_count)
return -1;
}
- /* Compute free space for root and normal user separately */
- if (current_uid == ROOT_UID)
- free_blk_count = fsbuf.f_bfree;
- else
- free_blk_count = fsbuf.f_bavail;
-
- if (free_blk_count >= blk_count)
- return 0;
-
- return -ENOSPC;
+ return (fsbuf.f_bfree >= blk_count) ? 0 : -ENOSPC;
}
/*
@@ -764,23 +758,6 @@ static int get_exts_count(struct fiemap_extent_list *ext_list_head)
return ret;
}
-/* get_file_blocks() - Get total file blocks.
- *
- * @ext_list_head: the extent list head of the target file
- */
-static ext4_fsblk_t get_file_blocks(struct fiemap_extent_list *ext_list_head)
-{
- ext4_fsblk_t blk_count = 0;
- struct fiemap_extent_list *ext_list_tmp = ext_list_head;
-
- do {
- blk_count += ext_list_tmp->data.len;
- ext_list_tmp = ext_list_tmp->next;
- } while (ext_list_tmp != ext_list_head);
-
- return blk_count;
-}
-
/*
* free_ext() - Free the extent list.
*
@@ -1031,7 +1008,7 @@ static int file_defrag(const char *file, const struct stat64 *buf,
/* Count file fragments before defrag */
file_frags_start = get_exts_count(orig_list);
- blk_count = get_file_blocks(orig_list);
+ blk_count = buf->st_blocks / (block_size / 512);
if (file_check(fd, file, file_frags_start, blk_count) < 0)
goto out;
--
To unsubscribe from this list: send the line "unsubscribe linux-ext4" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists