Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse

Pull fuse updates from Miklos Szeredi:
"This fixes a regression (spotted by the Sandstorm.io folks) in the pid
namespace handling introduced in 4.12.

There's also a fix for honoring sync/dsync flags for pwritev2()"

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse:
fuse: getattr cleanup
fuse: honor iocb sync flags on write
fuse: allow server to run in different pid_ns

+53 -54
+2 -2
fs/fuse/cuse.c
··· 90 90 91 91 static ssize_t cuse_read_iter(struct kiocb *kiocb, struct iov_iter *to) 92 92 { 93 - struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(kiocb->ki_filp); 93 + struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(kiocb); 94 94 loff_t pos = 0; 95 95 96 96 return fuse_direct_io(&io, to, &pos, FUSE_DIO_CUSE); ··· 98 98 99 99 static ssize_t cuse_write_iter(struct kiocb *kiocb, struct iov_iter *from) 100 100 { 101 - struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(kiocb->ki_filp); 101 + struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(kiocb); 102 102 loff_t pos = 0; 103 103 /* 104 104 * No locking or generic_write_checks(), the server is
+7 -6
fs/fuse/dev.c
··· 1222 1222 struct fuse_in *in; 1223 1223 unsigned reqsize; 1224 1224 1225 - if (task_active_pid_ns(current) != fc->pid_ns) 1226 - return -EIO; 1227 - 1228 1225 restart: 1229 1226 spin_lock(&fiq->waitq.lock); 1230 1227 err = -EAGAIN; ··· 1259 1262 1260 1263 in = &req->in; 1261 1264 reqsize = in->h.len; 1265 + 1266 + if (task_active_pid_ns(current) != fc->pid_ns) { 1267 + rcu_read_lock(); 1268 + in->h.pid = pid_vnr(find_pid_ns(in->h.pid, fc->pid_ns)); 1269 + rcu_read_unlock(); 1270 + } 1271 + 1262 1272 /* If request is too large, reply with an error and restart the read */ 1263 1273 if (nbytes < reqsize) { 1264 1274 req->out.h.error = -EIO; ··· 1826 1822 struct fuse_pqueue *fpq = &fud->pq; 1827 1823 struct fuse_req *req; 1828 1824 struct fuse_out_header oh; 1829 - 1830 - if (task_active_pid_ns(current) != fc->pid_ns) 1831 - return -EIO; 1832 1825 1833 1826 if (nbytes < sizeof(struct fuse_out_header)) 1834 1827 return -EINVAL;
+13 -17
fs/fuse/dir.c
··· 923 923 return err; 924 924 } 925 925 926 - int fuse_update_attributes(struct inode *inode, struct kstat *stat, 927 - struct file *file, bool *refreshed) 926 + static int fuse_update_get_attr(struct inode *inode, struct file *file, 927 + struct kstat *stat) 928 928 { 929 929 struct fuse_inode *fi = get_fuse_inode(inode); 930 - int err; 931 - bool r; 930 + int err = 0; 932 931 933 932 if (time_before64(fi->i_time, get_jiffies_64())) { 934 - r = true; 935 933 forget_all_cached_acls(inode); 936 934 err = fuse_do_getattr(inode, stat, file); 937 - } else { 938 - r = false; 939 - err = 0; 940 - if (stat) { 941 - generic_fillattr(inode, stat); 942 - stat->mode = fi->orig_i_mode; 943 - stat->ino = fi->orig_ino; 944 - } 935 + } else if (stat) { 936 + generic_fillattr(inode, stat); 937 + stat->mode = fi->orig_i_mode; 938 + stat->ino = fi->orig_ino; 945 939 } 946 940 947 - if (refreshed != NULL) 948 - *refreshed = r; 949 - 950 941 return err; 942 + } 943 + 944 + int fuse_update_attributes(struct inode *inode, struct file *file) 945 + { 946 + return fuse_update_get_attr(inode, file, NULL); 951 947 } 952 948 953 949 int fuse_reverse_inval_entry(struct super_block *sb, u64 parent_nodeid, ··· 1782 1786 if (!fuse_allow_current_process(fc)) 1783 1787 return -EACCES; 1784 1788 1785 - return fuse_update_attributes(inode, stat, NULL, NULL); 1789 + return fuse_update_get_attr(inode, NULL, stat); 1786 1790 } 1787 1791 1788 1792 static const struct inode_operations fuse_dir_inode_operations = {
+28 -24
fs/fuse/file.c
··· 645 645 static size_t fuse_send_read(struct fuse_req *req, struct fuse_io_priv *io, 646 646 loff_t pos, size_t count, fl_owner_t owner) 647 647 { 648 - struct file *file = io->file; 648 + struct file *file = io->iocb->ki_filp; 649 649 struct fuse_file *ff = file->private_data; 650 650 struct fuse_conn *fc = ff->fc; 651 651 ··· 707 707 708 708 static int fuse_do_readpage(struct file *file, struct page *page) 709 709 { 710 - struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(file); 710 + struct kiocb iocb; 711 + struct fuse_io_priv io; 711 712 struct inode *inode = page->mapping->host; 712 713 struct fuse_conn *fc = get_fuse_conn(inode); 713 714 struct fuse_req *req; ··· 736 735 req->num_pages = 1; 737 736 req->pages[0] = page; 738 737 req->page_descs[0].length = count; 738 + init_sync_kiocb(&iocb, file); 739 + io = (struct fuse_io_priv) FUSE_IO_PRIV_SYNC(&iocb); 739 740 num_read = fuse_send_read(req, &io, pos, count, NULL); 740 741 err = req->out.h.error; 741 742 ··· 926 923 if (fc->auto_inval_data || 927 924 (iocb->ki_pos + iov_iter_count(to) > i_size_read(inode))) { 928 925 int err; 929 - err = fuse_update_attributes(inode, NULL, iocb->ki_filp, NULL); 926 + err = fuse_update_attributes(inode, iocb->ki_filp); 930 927 if (err) 931 928 return err; 932 929 } ··· 960 957 static size_t fuse_send_write(struct fuse_req *req, struct fuse_io_priv *io, 961 958 loff_t pos, size_t count, fl_owner_t owner) 962 959 { 963 - struct file *file = io->file; 960 + struct kiocb *iocb = io->iocb; 961 + struct file *file = iocb->ki_filp; 964 962 struct fuse_file *ff = file->private_data; 965 963 struct fuse_conn *fc = ff->fc; 966 964 struct fuse_write_in *inarg = &req->misc.write.in; 967 965 968 966 fuse_write_fill(req, ff, pos, count); 969 967 inarg->flags = file->f_flags; 968 + if (iocb->ki_flags & IOCB_DSYNC) 969 + inarg->flags |= O_DSYNC; 970 + if (iocb->ki_flags & IOCB_SYNC) 971 + inarg->flags |= O_SYNC; 970 972 if (owner != NULL) { 971 973 inarg->write_flags |= FUSE_WRITE_LOCKOWNER; 972 974 inarg->lock_owner = fuse_lock_owner_id(fc, owner); ··· 1001 993 return ret; 1002 994 } 1003 995 1004 - static size_t fuse_send_write_pages(struct fuse_req *req, struct file *file, 996 + static size_t fuse_send_write_pages(struct fuse_req *req, struct kiocb *iocb, 1005 997 struct inode *inode, loff_t pos, 1006 998 size_t count) 1007 999 { 1008 1000 size_t res; 1009 1001 unsigned offset; 1010 1002 unsigned i; 1011 - struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(file); 1003 + struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb); 1012 1004 1013 1005 for (i = 0; i < req->num_pages; i++) 1014 1006 fuse_wait_on_page_writeback(inode, req->pages[i]->index); ··· 1108 1100 FUSE_MAX_PAGES_PER_REQ); 1109 1101 } 1110 1102 1111 - static ssize_t fuse_perform_write(struct file *file, 1103 + static ssize_t fuse_perform_write(struct kiocb *iocb, 1112 1104 struct address_space *mapping, 1113 1105 struct iov_iter *ii, loff_t pos) 1114 1106 { ··· 1141 1133 } else { 1142 1134 size_t num_written; 1143 1135 1144 - num_written = fuse_send_write_pages(req, file, inode, 1136 + num_written = fuse_send_write_pages(req, iocb, inode, 1145 1137 pos, count); 1146 1138 err = req->out.h.error; 1147 1139 if (!err) { ··· 1177 1169 1178 1170 if (get_fuse_conn(inode)->writeback_cache) { 1179 1171 /* Update size (EOF optimization) and mode (SUID clearing) */ 1180 - err = fuse_update_attributes(mapping->host, NULL, file, NULL); 1172 + err = fuse_update_attributes(mapping->host, file); 1181 1173 if (err) 1182 1174 return err; 1183 1175 ··· 1209 1201 1210 1202 pos += written; 1211 1203 1212 - written_buffered = fuse_perform_write(file, mapping, from, pos); 1204 + written_buffered = fuse_perform_write(iocb, mapping, from, pos); 1213 1205 if (written_buffered < 0) { 1214 1206 err = written_buffered; 1215 1207 goto out; ··· 1228 1220 written += written_buffered; 1229 1221 iocb->ki_pos = pos + written_buffered; 1230 1222 } else { 1231 - written = fuse_perform_write(file, mapping, from, iocb->ki_pos); 1223 + written = fuse_perform_write(iocb, mapping, from, iocb->ki_pos); 1232 1224 if (written >= 0) 1233 1225 iocb->ki_pos += written; 1234 1226 } 1235 1227 out: 1236 1228 current->backing_dev_info = NULL; 1237 1229 inode_unlock(inode); 1230 + if (written > 0) 1231 + written = generic_write_sync(iocb, written); 1238 1232 1239 1233 return written ? written : err; 1240 1234 } ··· 1327 1317 { 1328 1318 int write = flags & FUSE_DIO_WRITE; 1329 1319 int cuse = flags & FUSE_DIO_CUSE; 1330 - struct file *file = io->file; 1320 + struct file *file = io->iocb->ki_filp; 1331 1321 struct inode *inode = file->f_mapping->host; 1332 1322 struct fuse_file *ff = file->private_data; 1333 1323 struct fuse_conn *fc = ff->fc; ··· 1409 1399 loff_t *ppos) 1410 1400 { 1411 1401 ssize_t res; 1412 - struct file *file = io->file; 1413 - struct inode *inode = file_inode(file); 1402 + struct inode *inode = file_inode(io->iocb->ki_filp); 1414 1403 1415 1404 if (is_bad_inode(inode)) 1416 1405 return -EIO; ··· 1423 1414 1424 1415 static ssize_t fuse_direct_read_iter(struct kiocb *iocb, struct iov_iter *to) 1425 1416 { 1426 - struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb->ki_filp); 1417 + struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb); 1427 1418 return __fuse_direct_read(&io, to, &iocb->ki_pos); 1428 1419 } 1429 1420 1430 1421 static ssize_t fuse_direct_write_iter(struct kiocb *iocb, struct iov_iter *from) 1431 1422 { 1432 - struct file *file = iocb->ki_filp; 1433 - struct inode *inode = file_inode(file); 1434 - struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(file); 1423 + struct inode *inode = file_inode(iocb->ki_filp); 1424 + struct fuse_io_priv io = FUSE_IO_PRIV_SYNC(iocb); 1435 1425 ssize_t res; 1436 1426 1437 1427 if (is_bad_inode(inode)) ··· 2189 2181 if ((fl->fl_flags & FL_CLOSE_POSIX) == FL_CLOSE_POSIX) 2190 2182 return 0; 2191 2183 2192 - if (pid && pid_nr == 0) 2193 - return -EOVERFLOW; 2194 - 2195 2184 fuse_lk_fill(&args, file, fl, opcode, pid_nr, flock, &inarg); 2196 2185 err = fuse_simple_request(fc, &args); 2197 2186 ··· 2308 2303 return vfs_setpos(file, outarg.offset, inode->i_sb->s_maxbytes); 2309 2304 2310 2305 fallback: 2311 - err = fuse_update_attributes(inode, NULL, file, NULL); 2306 + err = fuse_update_attributes(inode, file); 2312 2307 if (!err) 2313 2308 return generic_file_llseek(file, offset, whence); 2314 2309 else ··· 2328 2323 break; 2329 2324 case SEEK_END: 2330 2325 inode_lock(inode); 2331 - retval = fuse_update_attributes(inode, NULL, file, NULL); 2326 + retval = fuse_update_attributes(inode, file); 2332 2327 if (!retval) 2333 2328 retval = generic_file_llseek(file, offset, whence); 2334 2329 inode_unlock(inode); ··· 2879 2874 io->offset = offset; 2880 2875 io->write = (iov_iter_rw(iter) == WRITE); 2881 2876 io->err = 0; 2882 - io->file = file; 2883 2877 /* 2884 2878 * By default, we want to optimize all I/Os with async request 2885 2879 * submission to the client filesystem if supported.
+3 -5
fs/fuse/fuse_i.h
··· 252 252 bool should_dirty; 253 253 int err; 254 254 struct kiocb *iocb; 255 - struct file *file; 256 255 struct completion *done; 257 256 bool blocking; 258 257 }; 259 258 260 - #define FUSE_IO_PRIV_SYNC(f) \ 259 + #define FUSE_IO_PRIV_SYNC(i) \ 261 260 { \ 262 261 .refcnt = KREF_INIT(1), \ 263 262 .async = 0, \ 264 - .file = f, \ 263 + .iocb = i, \ 265 264 } 266 265 267 266 /** ··· 904 905 905 906 void fuse_update_ctime(struct inode *inode); 906 907 907 - int fuse_update_attributes(struct inode *inode, struct kstat *stat, 908 - struct file *file, bool *refreshed); 908 + int fuse_update_attributes(struct inode *inode, struct file *file); 909 909 910 910 void fuse_flush_writepages(struct inode *inode); 911 911