]> git.proxmox.com Git - mirror_ubuntu-zesty-kernel.git/blobdiff - fs/fuse/file.c
clk-bcm2835: Read max core clock from firmware
[mirror_ubuntu-zesty-kernel.git] / fs / fuse / file.c
index 2401c5dabb2a227b6511be01b1589ffa5180e636..ff5ed824effb4e95ce15dd79e6f0726e93980d91 100644 (file)
@@ -100,6 +100,7 @@ static void fuse_file_put(struct fuse_file *ff, bool sync)
                        iput(req->misc.release.inode);
                        fuse_put_request(ff->fc, req);
                } else if (sync) {
+                       __set_bit(FR_FORCE, &req->flags);
                        __clear_bit(FR_BACKGROUND, &req->flags);
                        fuse_request_send(ff->fc, req);
                        iput(req->misc.release.inode);
@@ -2087,7 +2088,8 @@ static int fuse_direct_mmap(struct file *file, struct vm_area_struct *vma)
        return generic_file_mmap(file, vma);
 }
 
-static int convert_fuse_file_lock(const struct fuse_file_lock *ffl,
+static int convert_fuse_file_lock(struct fuse_conn *fc,
+                                 const struct fuse_file_lock *ffl,
                                  struct file_lock *fl)
 {
        switch (ffl->type) {
@@ -2102,7 +2104,14 @@ static int convert_fuse_file_lock(const struct fuse_file_lock *ffl,
 
                fl->fl_start = ffl->start;
                fl->fl_end = ffl->end;
-               fl->fl_pid = ffl->pid;
+
+               /*
+                * Convert pid into the caller's pid namespace. If the pid
+                * does not map into the namespace fl_pid will get set to 0.
+                */
+               rcu_read_lock();
+               fl->fl_pid = pid_vnr(find_pid_ns(ffl->pid, fc->pid_ns));
+               rcu_read_unlock();
                break;
 
        default:
@@ -2151,7 +2160,7 @@ static int fuse_getlk(struct file *file, struct file_lock *fl)
        args.out.args[0].value = &outarg;
        err = fuse_simple_request(fc, &args);
        if (!err)
-               err = convert_fuse_file_lock(&outarg.lk, fl);
+               err = convert_fuse_file_lock(fc, &outarg.lk, fl);
 
        return err;
 }
@@ -2163,7 +2172,8 @@ static int fuse_setlk(struct file *file, struct file_lock *fl, int flock)
        FUSE_ARGS(args);
        struct fuse_lk_in inarg;
        int opcode = (fl->fl_flags & FL_SLEEP) ? FUSE_SETLKW : FUSE_SETLK;
-       pid_t pid = fl->fl_type != F_UNLCK ? current->tgid : 0;
+       struct pid *pid = fl->fl_type != F_UNLCK ? task_tgid(current) : NULL;
+       pid_t pid_nr = pid_nr_ns(pid, fc->pid_ns);
        int err;
 
        if (fl->fl_lmops && fl->fl_lmops->lm_grant) {
@@ -2175,7 +2185,10 @@ static int fuse_setlk(struct file *file, struct file_lock *fl, int flock)
        if (fl->fl_flags & FL_CLOSE)
                return 0;
 
-       fuse_lk_fill(&args, file, fl, opcode, pid, flock, &inarg);
+       if (pid && pid_nr == 0)
+               return -EOVERFLOW;
+
+       fuse_lk_fill(&args, file, fl, opcode, pid_nr, flock, &inarg);
        err = fuse_simple_request(fc, &args);
 
        /* locking is restartable */