nfsd4: fix do_probe_callback errors
[safe/jmp/linux-2.6] / fs / hugetlbfs / inode.c
index 61edc70..9b800d9 100644 (file)
@@ -108,7 +108,8 @@ static int hugetlbfs_file_mmap(struct file *file, struct vm_area_struct *vma)
 
        if (hugetlb_reserve_pages(inode,
                                vma->vm_pgoff >> huge_page_order(h),
-                               len >> huge_page_shift(h), vma))
+                               len >> huge_page_shift(h), vma,
+                               vma->vm_flags))
                goto out;
 
        ret = 0;
@@ -252,6 +253,7 @@ static ssize_t hugetlbfs_read(struct file *filp, char __user *buf,
        for (;;) {
                struct page *page;
                unsigned long nr, ret;
+               int ra;
 
                /* nr is the maximum number of bytes to copy from this page */
                nr = huge_page_size(h);
@@ -274,16 +276,19 @@ static ssize_t hugetlbfs_read(struct file *filp, char __user *buf,
                         */
                        ret = len < nr ? len : nr;
                        if (clear_user(buf, ret))
-                               ret = -EFAULT;
+                               ra = -EFAULT;
+                       else
+                               ra = 0;
                } else {
                        /*
                         * We have the page, copy it to user space buffer.
                         */
-                       ret = hugetlbfs_read_actor(page, offset, buf, len, nr);
+                       ra = hugetlbfs_read_actor(page, offset, buf, len, nr);
+                       ret = ra;
                }
-               if (ret < 0) {
+               if (ra < 0) {
                        if (retval == 0)
-                               retval = ret;
+                               retval = ra;
                        if (page)
                                page_cache_release(page);
                        goto out;
@@ -506,7 +511,6 @@ static struct inode *hugetlbfs_get_inode(struct super_block *sb, uid_t uid,
                inode->i_mode = mode;
                inode->i_uid = uid;
                inode->i_gid = gid;
-               inode->i_blocks = 0;
                inode->i_mapping->a_ops = &hugetlbfs_aops;
                inode->i_mapping->backing_dev_info =&hugetlbfs_backing_dev_info;
                inode->i_atime = inode->i_mtime = inode->i_ctime = CURRENT_TIME;
@@ -551,9 +555,9 @@ static int hugetlbfs_mknod(struct inode *dir,
                if (S_ISDIR(mode))
                        mode |= S_ISGID;
        } else {
-               gid = current->fsgid;
+               gid = current_fsgid();
        }
-       inode = hugetlbfs_get_inode(dir->i_sb, current->fsuid, gid, mode, dev);
+       inode = hugetlbfs_get_inode(dir->i_sb, current_fsuid(), gid, mode, dev);
        if (inode) {
                dir->i_ctime = dir->i_mtime = CURRENT_TIME;
                d_instantiate(dentry, inode);
@@ -586,9 +590,9 @@ static int hugetlbfs_symlink(struct inode *dir,
        if (dir->i_mode & S_ISGID)
                gid = dir->i_gid;
        else
-               gid = current->fsgid;
+               gid = current_fsgid();
 
-       inode = hugetlbfs_get_inode(dir->i_sb, current->fsuid,
+       inode = hugetlbfs_get_inode(dir->i_sb, current_fsuid(),
                                        gid, S_IFLNK|S_IRWXUGO, 0);
        if (inode) {
                int l = strlen(symname)+1;
@@ -854,8 +858,8 @@ hugetlbfs_fill_super(struct super_block *sb, void *data, int silent)
 
        config.nr_blocks = -1; /* No limit on size by default */
        config.nr_inodes = -1; /* No limit on number of inodes by default */
-       config.uid = current->fsuid;
-       config.gid = current->fsgid;
+       config.uid = current_fsuid();
+       config.gid = current_fsgid();
        config.mode = 0755;
        config.hstate = &default_hstate;
        ret = hugetlbfs_parse_options(data, &config);
@@ -944,13 +948,14 @@ static int can_do_hugetlb_shm(void)
                        can_do_mlock());
 }
 
-struct file *hugetlb_file_setup(const char *name, size_t size)
+struct file *hugetlb_file_setup(const char *name, size_t size, int acctflag)
 {
        int error = -ENOMEM;
        struct file *file;
        struct inode *inode;
        struct dentry *dentry, *root;
        struct qstr quick_string;
+       struct user_struct *user = current_user();
 
        if (!hugetlbfs_vfsmount)
                return ERR_PTR(-ENOENT);
@@ -958,7 +963,7 @@ struct file *hugetlb_file_setup(const char *name, size_t size)
        if (!can_do_hugetlb_shm())
                return ERR_PTR(-EPERM);
 
-       if (!user_shm_lock(size, current->user))
+       if (!user_shm_lock(size, user))
                return ERR_PTR(-ENOMEM);
 
        root = hugetlbfs_vfsmount->mnt_root;
@@ -970,14 +975,15 @@ struct file *hugetlb_file_setup(const char *name, size_t size)
                goto out_shm_unlock;
 
        error = -ENOSPC;
-       inode = hugetlbfs_get_inode(root->d_sb, current->fsuid,
-                               current->fsgid, S_IFREG | S_IRWXUGO, 0);
+       inode = hugetlbfs_get_inode(root->d_sb, current_fsuid(),
+                               current_fsgid(), S_IFREG | S_IRWXUGO, 0);
        if (!inode)
                goto out_dentry;
 
        error = -ENOMEM;
        if (hugetlb_reserve_pages(inode, 0,
-                       size >> huge_page_shift(hstate_inode(inode)), NULL))
+                       size >> huge_page_shift(hstate_inode(inode)), NULL,
+                       acctflag))
                goto out_inode;
 
        d_instantiate(dentry, inode);
@@ -998,7 +1004,7 @@ out_inode:
 out_dentry:
        dput(dentry);
 out_shm_unlock:
-       user_shm_unlock(size, current->user);
+       user_shm_unlock(size, user);
        return ERR_PTR(error);
 }