fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / arch / sparc64 / solaris / fs.c
index a237c68..099f5a0 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/types.h>
 #include <linux/sched.h>
 #include <linux/slab.h>
+#include <linux/capability.h>
 #include <linux/fs.h>
 #include <linux/namei.h>
 #include <linux/mm.h>
@@ -81,12 +82,17 @@ struct sol_stat64 {
 
 static inline int putstat(struct sol_stat __user *ubuf, struct kstat *kbuf)
 {
+       u32 ino;
+
        if (kbuf->size > MAX_NON_LFS ||
            !sysv_valid_dev(kbuf->dev) ||
            !sysv_valid_dev(kbuf->rdev))
                return -EOVERFLOW;
+       ino = kbuf->ino;
+       if (sizeof(ino) < sizeof(kbuf->ino) && ino != kbuf->ino)
+               return -EOVERFLOW;
        if (put_user (sysv_encode_dev(kbuf->dev), &ubuf->st_dev)        ||
-           __put_user (kbuf->ino, &ubuf->st_ino)               ||
+           __put_user (ino, &ubuf->st_ino)                             ||
            __put_user (kbuf->mode, &ubuf->st_mode)             ||
            __put_user (kbuf->nlink, &ubuf->st_nlink)   ||
            __put_user (kbuf->uid, &ubuf->st_uid)               ||
@@ -355,14 +361,14 @@ static int report_statvfs(struct vfsmount *mnt, struct inode *inode, u32 buf)
        int error;
        struct sol_statvfs __user *ss = A(buf);
 
-       error = vfs_statfs(mnt->mnt_sb, &s);
+       error = vfs_statfs(mnt->mnt_root, &s);
        if (!error) {
                const char *p = mnt->mnt_sb->s_type->name;
                int i = 0;
                int j = strlen (p);
                
                if (j > 15) j = 15;
-               if (IS_RDONLY(inode)) i = 1;
+               if (IS_RDONLY(inode) || MNT_IS_RDONLY(mnt)) i = 1;
                if (mnt->mnt_flags & MNT_NOSUID) i |= 2;
                if (!sysv_valid_dev(inode->i_sb->s_dev))
                        return -EOVERFLOW;
@@ -391,14 +397,14 @@ static int report_statvfs64(struct vfsmount *mnt, struct inode *inode, u32 buf)
        int error;
        struct sol_statvfs64 __user *ss = A(buf);
                        
-       error = vfs_statfs(mnt->mnt_sb, &s);
+       error = vfs_statfs(mnt->mnt_root, &s);
        if (!error) {
                const char *p = mnt->mnt_sb->s_type->name;
                int i = 0;
                int j = strlen (p);
                
                if (j > 15) j = 15;
-               if (IS_RDONLY(inode)) i = 1;
+               if (IS_RDONLY(inode) || MNT_IS_RDONLY(mnt)) i = 1;
                if (mnt->mnt_flags & MNT_NOSUID) i |= 2;
                if (!sysv_valid_dev(inode->i_sb->s_dev))
                        return -EOVERFLOW;
@@ -443,7 +449,7 @@ asmlinkage int solaris_fstatvfs(unsigned int fd, u32 buf)
        error = -EBADF;
        file = fget(fd);
        if (file) {
-               error = report_statvfs(file->f_vfsmnt, file->f_dentry->d_inode, buf);
+               error = report_statvfs(file->f_path.mnt, file->f_path.dentry->d_inode, buf);
                fput(file);
        }
 
@@ -475,7 +481,7 @@ asmlinkage int solaris_fstatvfs64(unsigned int fd, u32 buf)
        file = fget(fd);
        if (file) {
                lock_kernel();
-               error = report_statvfs64(file->f_vfsmnt, file->f_dentry->d_inode, buf);
+               error = report_statvfs64(file->f_path.mnt, file->f_path.dentry->d_inode, buf);
                unlock_kernel();
                fput(file);
        }
@@ -600,23 +606,23 @@ asmlinkage int solaris_ulimit(int cmd, int val)
 {
        switch (cmd) {
        case 1: /* UL_GETFSIZE - in 512B chunks */
-               return current->rlim[RLIMIT_FSIZE].rlim_cur >> 9;
+               return current->signal->rlim[RLIMIT_FSIZE].rlim_cur >> 9;
        case 2: /* UL_SETFSIZE */
                if ((unsigned long)val > (LONG_MAX>>9)) return -ERANGE;
                val <<= 9;
-               lock_kernel();
-               if (val > current->rlim[RLIMIT_FSIZE].rlim_max) {
+               task_lock(current->group_leader);
+               if (val > current->signal->rlim[RLIMIT_FSIZE].rlim_max) {
                        if (!capable(CAP_SYS_RESOURCE)) {
-                               unlock_kernel();
+                               task_unlock(current->group_leader);
                                return -EPERM;
                        }
-                       current->rlim[RLIMIT_FSIZE].rlim_max = val;
+                       current->signal->rlim[RLIMIT_FSIZE].rlim_max = val;
                }
-               current->rlim[RLIMIT_FSIZE].rlim_cur = val;
-               unlock_kernel();
+               current->signal->rlim[RLIMIT_FSIZE].rlim_cur = val;
+               task_unlock(current->group_leader);
                return 0;
        case 3: /* UL_GMEMLIM */
-               return current->rlim[RLIMIT_DATA].rlim_cur;
+               return current->signal->rlim[RLIMIT_DATA].rlim_cur;
        case 4: /* UL_GDESLIM */
                return NR_OPEN;
        }