dir.c (2106cb18930312af9325d3418e138569c5b903cc) | dir.c (c7b7143c6342b8751d47b03a025ac5c0ac1ae809) |
---|---|
1/* 2 FUSE: Filesystem in Userspace 3 Copyright (C) 2001-2008 Miklos Szeredi <miklos@szeredi.hu> 4 5 This program can be distributed under the terms of the GNU GPL. 6 See the file COPYING. 7*/ 8 --- 351 unchanged lines hidden (view full) --- 360 out_err: 361 return ERR_PTR(err); 362} 363 364/* 365 * Synchronous release for the case when something goes wrong in CREATE_OPEN 366 */ 367static void fuse_sync_release(struct fuse_conn *fc, struct fuse_file *ff, | 1/* 2 FUSE: Filesystem in Userspace 3 Copyright (C) 2001-2008 Miklos Szeredi <miklos@szeredi.hu> 4 5 This program can be distributed under the terms of the GNU GPL. 6 See the file COPYING. 7*/ 8 --- 351 unchanged lines hidden (view full) --- 360 out_err: 361 return ERR_PTR(err); 362} 363 364/* 365 * Synchronous release for the case when something goes wrong in CREATE_OPEN 366 */ 367static void fuse_sync_release(struct fuse_conn *fc, struct fuse_file *ff, |
368 u64 nodeid, int flags) | 368 int flags) |
369{ | 369{ |
370 fuse_release_fill(ff, nodeid, flags, FUSE_RELEASE); | 370 fuse_release_fill(ff, flags, FUSE_RELEASE); |
371 ff->reserved_req->force = 1; 372 fuse_request_send(fc, ff->reserved_req); 373 fuse_put_request(fc, ff->reserved_req); 374 kfree(ff); 375} 376 377/* 378 * Atomic create+open operation --- 61 unchanged lines hidden (view full) --- 440 goto out_free_ff; 441 } 442 443 err = -EIO; 444 if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid)) 445 goto out_free_ff; 446 447 fuse_put_request(fc, req); | 371 ff->reserved_req->force = 1; 372 fuse_request_send(fc, ff->reserved_req); 373 fuse_put_request(fc, ff->reserved_req); 374 kfree(ff); 375} 376 377/* 378 * Atomic create+open operation --- 61 unchanged lines hidden (view full) --- 440 goto out_free_ff; 441 } 442 443 err = -EIO; 444 if (!S_ISREG(outentry.attr.mode) || invalid_nodeid(outentry.nodeid)) 445 goto out_free_ff; 446 447 fuse_put_request(fc, req); |
448 ff->fh = outopen.fh; 449 ff->nodeid = outentry.nodeid; 450 ff->open_flags = outopen.open_flags; |
|
448 inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation, 449 &outentry.attr, entry_attr_timeout(&outentry), 0); 450 if (!inode) { 451 flags &= ~(O_CREAT | O_EXCL | O_TRUNC); | 451 inode = fuse_iget(dir->i_sb, outentry.nodeid, outentry.generation, 452 &outentry.attr, entry_attr_timeout(&outentry), 0); 453 if (!inode) { 454 flags &= ~(O_CREAT | O_EXCL | O_TRUNC); |
452 ff->fh = outopen.fh; 453 fuse_sync_release(fc, ff, outentry.nodeid, flags); | 455 fuse_sync_release(fc, ff, flags); |
454 fuse_send_forget(fc, forget_req, outentry.nodeid, 1); 455 return -ENOMEM; 456 } 457 fuse_put_request(fc, forget_req); 458 d_instantiate(entry, inode); 459 fuse_change_entry_timeout(entry, &outentry); 460 fuse_invalidate_attr(dir); 461 file = lookup_instantiate_filp(nd, entry, generic_file_open); 462 if (IS_ERR(file)) { | 456 fuse_send_forget(fc, forget_req, outentry.nodeid, 1); 457 return -ENOMEM; 458 } 459 fuse_put_request(fc, forget_req); 460 d_instantiate(entry, inode); 461 fuse_change_entry_timeout(entry, &outentry); 462 fuse_invalidate_attr(dir); 463 file = lookup_instantiate_filp(nd, entry, generic_file_open); 464 if (IS_ERR(file)) { |
463 ff->fh = outopen.fh; 464 fuse_sync_release(fc, ff, outentry.nodeid, flags); | 465 fuse_sync_release(fc, ff, flags); |
465 return PTR_ERR(file); 466 } | 466 return PTR_ERR(file); 467 } |
467 fuse_finish_open(inode, file, ff, &outopen); | 468 file->private_data = fuse_file_get(ff); 469 fuse_finish_open(inode, file); |
468 return 0; 469 470 out_free_ff: 471 fuse_file_free(ff); 472 out_put_request: 473 fuse_put_request(fc, req); 474 out_put_forget_req: 475 fuse_put_request(fc, forget_req); --- 1101 unchanged lines hidden --- | 470 return 0; 471 472 out_free_ff: 473 fuse_file_free(ff); 474 out_put_request: 475 fuse_put_request(fc, req); 476 out_put_forget_req: 477 fuse_put_request(fc, forget_req); --- 1101 unchanged lines hidden --- |