Changeset f15cf1a6 in mainline for uspace/srv


Ignore:
Timestamp:
2008-02-17T16:22:10Z (17 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
cf19ab5
Parents:
e704503
Message:

Support for rmdir(), unlink() and the respective VFS operations.

Location:
uspace/srv
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/tmpfs/tmpfs_ops.c

    re704503 rf15cf1a6  
    331331        /* handle hit */
    332332        if (lflag & L_DESTROY) {
     333                unsigned old_lnkcnt = TMPFS_GET_LNKCNT(dcur);
    333334                int res = destroy_component(dcur);
    334                 unsigned lnkcnt = (res == EOK) ? 0 : TMPFS_GET_LNKCNT(dcur);
    335335                ipc_answer_5(rid, (ipcarg_t)res, tmpfs_reg.fs_handle,
    336                     dev_handle, dcur->index, dcur->size, lnkcnt);
     336                    dev_handle, dcur->index, dcur->size, old_lnkcnt);
    337337                return;
    338338        }
  • uspace/srv/vfs/vfs.c

    re704503 rf15cf1a6  
    112112                        vfs_mkdir(callid, &call);
    113113                        break;
     114                case VFS_UNLINK:
     115                        vfs_unlink(callid, &call);
     116                        break;
    114117                default:
    115118                        ipc_answer_0(callid, ENOTSUP);
  • uspace/srv/vfs/vfs.h

    re704503 rf15cf1a6  
    142142 */
    143143/**
     144 * No lookup flags used.
     145 */
     146#define L_NONE          0
     147/**
    144148 * Lookup will succeed only if the object is a regular file.  If L_CREATE is
    145149 * specified, an empty file will be created. This flag is mutually exclusive
     
    276280extern void vfs_truncate(ipc_callid_t, ipc_call_t *);
    277281extern void vfs_mkdir(ipc_callid_t, ipc_call_t *);
     282extern void vfs_unlink(ipc_callid_t, ipc_call_t *);
    278283
    279284#endif
  • uspace/srv/vfs/vfs_ops.c

    re704503 rf15cf1a6  
    591591{
    592592        int mode = IPC_GET_ARG1(*request);
     593
    593594        size_t len;
    594 
    595595        ipc_callid_t callid;
    596596
     
    630630}
    631631
     632void vfs_unlink(ipc_callid_t rid, ipc_call_t *request)
     633{
     634        int lflag = IPC_GET_ARG1(*request);
     635
     636        size_t len;
     637        ipc_callid_t callid;
     638
     639        if (!ipc_data_write_receive(&callid, &len)) {
     640                ipc_answer_0(callid, EINVAL);
     641                ipc_answer_0(rid, EINVAL);
     642                return;
     643        }
     644
     645        /*
     646         * Now we are on the verge of accepting the path.
     647         *
     648         * There is one optimization we could do in the future: copy the path
     649         * directly into the PLB using some kind of a callback.
     650         */
     651        char *path = malloc(len);
     652       
     653        if (!path) {
     654                ipc_answer_0(callid, ENOMEM);
     655                ipc_answer_0(rid, ENOMEM);
     656                return;
     657        }
     658
     659        int rc;
     660        if ((rc = ipc_data_write_finalize(callid, path, len))) {
     661                ipc_answer_0(rid, rc);
     662                free(path);
     663                return;
     664        }
     665       
     666        rwlock_write_lock(&namespace_rwlock);
     667        lflag &= L_DIRECTORY;   /* sanitize lflag */
     668        vfs_lookup_res_t lr;
     669        rc = vfs_lookup_internal(path, len, lflag | L_DESTROY, &lr, NULL);
     670        free(path);
     671        if (rc != EOK) {
     672                rwlock_write_unlock(&namespace_rwlock);
     673                ipc_answer_0(rid, rc);
     674                return;
     675        }
     676
     677        /*
     678         * The name has already been unlinked by vfs_lookup_internal().
     679         * We have to get and put the VFS node to ensure that it is
     680         * VFS_FREE'd after the last reference to it is dropped.
     681         */
     682        vfs_node_t *node = vfs_node_get(&lr);
     683        node->lnkcnt--;
     684        rwlock_write_unlock(&namespace_rwlock);
     685        vfs_node_put(node);
     686        ipc_answer_0(rid, EOK);
     687}
     688
    632689/**
    633690 * @}
Note: See TracChangeset for help on using the changeset viewer.