Pass credentials down to the ext2 block allocator.

Signed-off-by: David Howells <[EMAIL PROTECTED]>
---

 fs/ext2/balloc.c |   11 ++++++-----
 fs/ext2/ext2.h   |    2 +-
 fs/ext2/inode.c  |   18 +++++++++++-------
 3 files changed, 18 insertions(+), 13 deletions(-)

diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c
index ca88579..6ec7e47 100644
--- a/fs/ext2/balloc.c
+++ b/fs/ext2/balloc.c
@@ -98,7 +98,7 @@ error_out:
  * Set sb->s_dirt here because the superblock was "logically" altered.  We
  * need to recalculate its free blocks count and flush it out.
  */
-static int reserve_blocks(struct super_block *sb, int count)
+static int reserve_blocks(struct super_block *sb, int count, struct cred *cred)
 {
        struct ext2_sb_info *sbi = EXT2_SB(sb);
        struct ext2_super_block *es = sbi->s_es;
@@ -112,9 +112,9 @@ static int reserve_blocks(struct super_block *sb, int count)
                count = free_blocks;
 
        if (free_blocks < root_blocks + count && !capable(CAP_SYS_RESOURCE) &&
-           sbi->s_resuid != current->cred->uid &&
+           sbi->s_resuid != cred->uid &&
            (sbi->s_resgid == 0 ||
-            !in_group_p (current->cred, sbi->s_resgid))) {
+            !in_group_p (cred, sbi->s_resgid))) {
                /*
                 * We are too close to reserve and we are not privileged.
                 * Can we allocate anything at all?
@@ -325,7 +325,8 @@ got_it:
  * This function also updates quota and i_blocks field.
  */
 int ext2_new_block(struct inode *inode, unsigned long goal,
-                       u32 *prealloc_count, u32 *prealloc_block, int *err)
+                       u32 *prealloc_count, u32 *prealloc_block, int *err,
+                       struct cred *cred)
 {
        struct buffer_head *bitmap_bh = NULL;
        struct buffer_head *gdp_bh;     /* bh2 */
@@ -357,7 +358,7 @@ int ext2_new_block(struct inode *inode, unsigned long goal,
                prealloc_goal--;
 
        dq_alloc = prealloc_goal + 1;
-       es_alloc = reserve_blocks(sb, dq_alloc);
+       es_alloc = reserve_blocks(sb, dq_alloc, cred);
        if (!es_alloc) {
                *err = -ENOSPC;
                goto out_dquot;
diff --git a/fs/ext2/ext2.h b/fs/ext2/ext2.h
index 85ca3de..47d68aa 100644
--- a/fs/ext2/ext2.h
+++ b/fs/ext2/ext2.h
@@ -92,7 +92,7 @@ static inline struct ext2_inode_info *EXT2_I(struct inode 
*inode)
 extern int ext2_bg_has_super(struct super_block *sb, int group);
 extern unsigned long ext2_bg_num_gdb(struct super_block *sb, int group);
 extern int ext2_new_block (struct inode *, unsigned long,
-                          __u32 *, __u32 *, int *);
+                          __u32 *, __u32 *, int *, struct cred *);
 extern void ext2_free_blocks (struct inode *, unsigned long,
                              unsigned long);
 extern unsigned long ext2_count_free_blocks (struct super_block *);
diff --git a/fs/ext2/inode.c b/fs/ext2/inode.c
index fa5e115..a5a6bb4 100644
--- a/fs/ext2/inode.c
+++ b/fs/ext2/inode.c
@@ -107,7 +107,8 @@ void ext2_discard_prealloc (struct inode * inode)
 #endif
 }
 
-static int ext2_alloc_block (struct inode * inode, unsigned long goal, int 
*err)
+static int ext2_alloc_block (struct inode * inode, unsigned long goal, int 
*err,
+                            struct cred *cred)
 {
 #ifdef EXT2FS_DEBUG
        static unsigned long alloc_hits, alloc_attempts;
@@ -134,9 +135,10 @@ static int ext2_alloc_block (struct inode * inode, 
unsigned long goal, int *err)
                if (S_ISREG(inode->i_mode))
                        result = ext2_new_block (inode, goal, 
                                 &ei->i_prealloc_count,
-                                &ei->i_prealloc_block, err);
+                                &ei->i_prealloc_block, err, cred);
                else
-                       result = ext2_new_block(inode, goal, NULL, NULL, err);
+                       result = ext2_new_block(inode, goal, NULL, NULL, err,
+                                               cred);
        }
 #else
        result = ext2_new_block (inode, goal, 0, 0, err);
@@ -419,19 +421,20 @@ static int ext2_alloc_branch(struct inode *inode,
                             int num,
                             unsigned long goal,
                             int *offsets,
-                            Indirect *branch)
+                            Indirect *branch,
+                            struct cred *cred)
 {
        int blocksize = inode->i_sb->s_blocksize;
        int n = 0;
        int err;
        int i;
-       int parent = ext2_alloc_block(inode, goal, &err);
+       int parent = ext2_alloc_block(inode, goal, &err, cred);
 
        branch[0].key = cpu_to_le32(parent);
        if (parent) for (n = 1; n < num; n++) {
                struct buffer_head *bh;
                /* Allocate the next block */
-               int nr = ext2_alloc_block(inode, parent, &err);
+               int nr = ext2_alloc_block(inode, parent, &err, cred);
                if (!nr)
                        break;
                branch[n].key = cpu_to_le32(nr);
@@ -546,6 +549,7 @@ changed:
 
 int ext2_get_block(struct inode *inode, sector_t iblock, struct buffer_head 
*bh_result, int create)
 {
+       struct cred *cred = current->cred;
        int err = -EIO;
        int offsets[4];
        Indirect chain[4];
@@ -597,7 +601,7 @@ out:
 
        left = (chain + depth) - partial;
        err = ext2_alloc_branch(inode, left, goal,
-                                       offsets+(partial-chain), partial);
+                                       offsets+(partial-chain), partial, cred);
        if (err)
                goto cleanup;
 

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to