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 ---