]> err.no Git - linux-2.6/blobdiff - fs/fuse/inode.c
Merge master.kernel.org:/pub/scm/linux/kernel/git/chrisw/lsm-2.6
[linux-2.6] / fs / fuse / inode.c
index 0b75c73386e9733b8e0182c4c76b8c94c31672f7..e69a546844d0f23770f3dd5e690f20284a27cd01 100644 (file)
@@ -31,6 +31,11 @@ struct fuse_mount_data {
        int fd;
        unsigned rootmode;
        unsigned user_id;
+       unsigned group_id;
+       unsigned fd_present : 1;
+       unsigned rootmode_present : 1;
+       unsigned user_id_present : 1;
+       unsigned group_id_present : 1;
        unsigned flags;
        unsigned max_read;
 };
@@ -168,6 +173,7 @@ struct inode *fuse_iget(struct super_block *sb, unsigned long nodeid,
                return NULL;
 
        if ((inode->i_state & I_NEW)) {
+               inode->i_flags |= S_NOATIME|S_NOCMTIME;
                inode->i_generation = generation;
                inode->i_data.backing_dev_info = &fc->bdi;
                fuse_init_inode(inode, attr);
@@ -199,6 +205,7 @@ static void fuse_put_super(struct super_block *sb)
        spin_lock(&fuse_lock);
        fc->mounted = 0;
        fc->user_id = 0;
+       fc->group_id = 0;
        fc->flags = 0;
        /* Flush all readers on this fs */
        wake_up_all(&fc->waitq);
@@ -229,7 +236,7 @@ static int fuse_statfs(struct super_block *sb, struct kstatfs *buf)
 
         req = fuse_get_request(fc);
        if (!req)
-               return -ERESTARTSYS;
+               return -EINTR;
 
        req->in.numargs = 0;
        req->in.h.opcode = FUSE_STATFS;
@@ -248,9 +255,9 @@ enum {
        OPT_FD,
        OPT_ROOTMODE,
        OPT_USER_ID,
+       OPT_GROUP_ID,
        OPT_DEFAULT_PERMISSIONS,
        OPT_ALLOW_OTHER,
-       OPT_KERNEL_CACHE,
        OPT_MAX_READ,
        OPT_ERR
 };
@@ -259,9 +266,9 @@ static match_table_t tokens = {
        {OPT_FD,                        "fd=%u"},
        {OPT_ROOTMODE,                  "rootmode=%o"},
        {OPT_USER_ID,                   "user_id=%u"},
+       {OPT_GROUP_ID,                  "group_id=%u"},
        {OPT_DEFAULT_PERMISSIONS,       "default_permissions"},
        {OPT_ALLOW_OTHER,               "allow_other"},
-       {OPT_KERNEL_CACHE,              "kernel_cache"},
        {OPT_MAX_READ,                  "max_read=%u"},
        {OPT_ERR,                       NULL}
 };
@@ -270,7 +277,6 @@ static int parse_fuse_opt(char *opt, struct fuse_mount_data *d)
 {
        char *p;
        memset(d, 0, sizeof(struct fuse_mount_data));
-       d->fd = -1;
        d->max_read = ~0;
 
        while ((p = strsep(&opt, ",")) != NULL) {
@@ -286,18 +292,28 @@ static int parse_fuse_opt(char *opt, struct fuse_mount_data *d)
                        if (match_int(&args[0], &value))
                                return 0;
                        d->fd = value;
+                       d->fd_present = 1;
                        break;
 
                case OPT_ROOTMODE:
                        if (match_octal(&args[0], &value))
                                return 0;
                        d->rootmode = value;
+                       d->rootmode_present = 1;
                        break;
 
                case OPT_USER_ID:
                        if (match_int(&args[0], &value))
                                return 0;
                        d->user_id = value;
+                       d->user_id_present = 1;
+                       break;
+
+               case OPT_GROUP_ID:
+                       if (match_int(&args[0], &value))
+                               return 0;
+                       d->group_id = value;
+                       d->group_id_present = 1;
                        break;
 
                case OPT_DEFAULT_PERMISSIONS:
@@ -308,10 +324,6 @@ static int parse_fuse_opt(char *opt, struct fuse_mount_data *d)
                        d->flags |= FUSE_ALLOW_OTHER;
                        break;
 
-               case OPT_KERNEL_CACHE:
-                       d->flags |= FUSE_KERNEL_CACHE;
-                       break;
-
                case OPT_MAX_READ:
                        if (match_int(&args[0], &value))
                                return 0;
@@ -322,7 +334,9 @@ static int parse_fuse_opt(char *opt, struct fuse_mount_data *d)
                        return 0;
                }
        }
-       if (d->fd == -1)
+
+       if (!d->fd_present || !d->rootmode_present ||
+           !d->user_id_present || !d->group_id_present)
                return 0;
 
        return 1;
@@ -333,12 +347,11 @@ static int fuse_show_options(struct seq_file *m, struct vfsmount *mnt)
        struct fuse_conn *fc = get_fuse_conn_super(mnt->mnt_sb);
 
        seq_printf(m, ",user_id=%u", fc->user_id);
+       seq_printf(m, ",group_id=%u", fc->group_id);
        if (fc->flags & FUSE_DEFAULT_PERMISSIONS)
                seq_puts(m, ",default_permissions");
        if (fc->flags & FUSE_ALLOW_OTHER)
                seq_puts(m, ",allow_other");
-       if (fc->flags & FUSE_KERNEL_CACHE)
-               seq_puts(m, ",kernel_cache");
        if (fc->max_read != ~0)
                seq_printf(m, ",max_read=%u", fc->max_read);
        return 0;
@@ -465,9 +478,11 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
 
        fc->flags = d.flags;
        fc->user_id = d.user_id;
+       fc->group_id = d.group_id;
        fc->max_read = d.max_read;
        if (fc->max_read / PAGE_CACHE_SIZE < fc->bdi.ra_pages)
                fc->bdi.ra_pages = fc->max_read / PAGE_CACHE_SIZE;
+       fc->max_write = FUSE_MAX_IN / 2;
 
        err = -ENOMEM;
        root = get_root_inode(sb, d.rootmode);