Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/libfs/libfs.c

    red903174 r1313ee9  
    3737#include "libfs.h"
    3838#include "../../srv/vfs/vfs.h"
    39 #include <macros.h>
    4039#include <errno.h>
    4140#include <async.h>
     
    162161        /* Accept the phone */
    163162        callid = async_get_call(&call);
    164         int mountee_phone = (int) IPC_GET_ARG1(call);
     163        int mountee_phone = (int)IPC_GET_ARG1(call);
    165164        if ((IPC_GET_METHOD(call) != IPC_M_CONNECTION_CLONE) ||
    166165            (mountee_phone < 0)) {
     
    173172        ipc_answer_0(callid, EOK);
    174173       
     174        res = async_data_write_receive(&callid, NULL);
     175        if (!res) {
     176                ipc_hangup(mountee_phone);
     177                ipc_answer_0(callid, EINVAL);
     178                ipc_answer_0(rid, EINVAL);
     179                return;
     180        }
     181       
    175182        fs_node_t *fn;
    176183        res = ops->node_get(&fn, mp_dev_handle, mp_fs_index);
    177184        if ((res != EOK) || (!fn)) {
    178185                ipc_hangup(mountee_phone);
    179                 async_data_write_void(combine_rc(res, ENOENT));
     186                ipc_answer_0(callid, combine_rc(res, ENOENT));
    180187                ipc_answer_0(rid, combine_rc(res, ENOENT));
    181188                return;
     
    185192                ipc_hangup(mountee_phone);
    186193                (void) ops->node_put(fn);
    187                 async_data_write_void(EBUSY);
     194                ipc_answer_0(callid, EBUSY);
    188195                ipc_answer_0(rid, EBUSY);
    189196                return;
     
    194201                ipc_hangup(mountee_phone);
    195202                (void) ops->node_put(fn);
    196                 async_data_write_void(rc);
     203                ipc_answer_0(callid, rc);
    197204                ipc_answer_0(rid, rc);
    198205                return;
     
    200207       
    201208        ipc_call_t answer;
    202         rc = async_data_write_forward_1_1(mountee_phone, VFS_OUT_MOUNTED,
    203             mr_dev_handle, &answer);
     209        aid_t msg = async_send_1(mountee_phone, VFS_OUT_MOUNTED, mr_dev_handle,
     210            &answer);
     211        ipc_forward_fast(callid, mountee_phone, 0, 0, 0, IPC_FF_ROUTE_FROM_ME);
     212        async_wait_for(msg, &rc);
    204213       
    205214        if (rc == EOK) {
     
    215224        ipc_answer_3(rid, rc, IPC_GET_ARG1(answer), IPC_GET_ARG2(answer),
    216225            IPC_GET_ARG3(answer));
    217 }
    218 
    219 void libfs_unmount(libfs_ops_t *ops, ipc_callid_t rid, ipc_call_t *request)
    220 {
    221         dev_handle_t mp_dev_handle = (dev_handle_t) IPC_GET_ARG1(*request);
    222         fs_index_t mp_fs_index = (fs_index_t) IPC_GET_ARG2(*request);
    223         fs_node_t *fn;
    224         int res;
    225 
    226         res = ops->node_get(&fn, mp_dev_handle, mp_fs_index);
    227         if ((res != EOK) || (!fn)) {
    228                 ipc_answer_0(rid, combine_rc(res, ENOENT));
    229                 return;
    230         }
    231 
    232         /*
    233          * We are clearly expecting to find the mount point active.
    234          */
    235         if (!fn->mp_data.mp_active) {
    236                 (void) ops->node_put(fn);
    237                 ipc_answer_0(rid, EINVAL);
    238                 return;
    239         }
    240 
    241         /*
    242          * Tell the mounted file system to unmount.
    243          */
    244         res = async_req_1_0(fn->mp_data.phone, VFS_OUT_UNMOUNTED,
    245             fn->mp_data.dev_handle);
    246 
    247         /*
    248          * If everything went well, perform the clean-up on our side.
    249          */
    250         if (res == EOK) {
    251                 ipc_hangup(fn->mp_data.phone);
    252                 fn->mp_data.mp_active = false;
    253                 fn->mp_data.fs_handle = 0;
    254                 fn->mp_data.dev_handle = 0;
    255                 fn->mp_data.phone = 0;
    256                 /* Drop the reference created in libfs_mount(). */
    257                 (void) ops->node_put(fn);
    258         }
    259 
    260         (void) ops->node_put(fn);
    261         ipc_answer_0(rid, res);
    262226}
    263227
     
    340304                on_error(rc, goto out_with_answer);
    341305               
    342                 /*
    343                  * If the matching component is a mount point, there are two
    344                  * legitimate semantics of the lookup operation. The first is
    345                  * the commonly used one in which the lookup crosses each mount
    346                  * point into the mounted file system. The second semantics is
    347                  * used mostly during unmount() and differs from the first one
    348                  * only in that the last mount point in the looked up path,
    349                  * which is also its last component, is not crossed.
    350                  */
    351 
    352                 if ((tmp) && (tmp->mp_data.mp_active) &&
    353                     (!(lflag & L_MP) || (next <= last))) {
     306                if ((tmp) && (tmp->mp_data.mp_active)) {
    354307                        if (next > last)
    355308                                next = last = first;
     
    399352                                                ipc_answer_0(rid, rc);
    400353                                        } else {
    401                                                 aoff64_t size = ops->size_get(fn);
    402                                                 ipc_answer_5(rid, fs_handle,
    403                                                     dev_handle,
     354                                                ipc_answer_5(rid, EOK,
     355                                                    fs_handle, dev_handle,
    404356                                                    ops->index_get(fn),
    405                                                     LOWER32(size),
    406                                                     UPPER32(size),
     357                                                    ops->size_get(fn),
    407358                                                    ops->lnkcnt_get(fn));
    408359                                                (void) ops->node_put(fn);
     
    481432                                        ipc_answer_0(rid, rc);
    482433                                } else {
    483                                         aoff64_t size = ops->size_get(fn);
    484                                         ipc_answer_5(rid, fs_handle,
    485                                             dev_handle,
     434                                        ipc_answer_5(rid, EOK,
     435                                            fs_handle, dev_handle,
    486436                                            ops->index_get(fn),
    487                                             LOWER32(size),
    488                                             UPPER32(size),
     437                                            ops->size_get(fn),
    489438                                            ops->lnkcnt_get(fn));
    490439                                        (void) ops->node_put(fn);
     
    506455                unsigned int old_lnkcnt = ops->lnkcnt_get(cur);
    507456                rc = ops->unlink(par, cur, component);
    508                
    509                 if (rc == EOK) {
    510                         aoff64_t size = ops->size_get(cur);
    511                         ipc_answer_5(rid, fs_handle, dev_handle,
    512                             ops->index_get(cur), LOWER32(size), UPPER32(size),
    513                             old_lnkcnt);
    514                 } else
    515                         ipc_answer_0(rid, rc);
    516                
     457                ipc_answer_5(rid, (ipcarg_t) rc, fs_handle, dev_handle,
     458                    ops->index_get(cur), ops->size_get(cur), old_lnkcnt);
    517459                goto out;
    518460        }
     
    533475                goto out;
    534476        }
    535 
    536         if ((lflag & L_ROOT) && par) {
    537                 ipc_answer_0(rid, EINVAL);
    538                 goto out;
    539         }
    540477       
    541478out_with_answer:
     
    545482                        rc = ops->node_open(cur);
    546483               
    547                 if (rc == EOK) {
    548                         aoff64_t size = ops->size_get(cur);
    549                         ipc_answer_5(rid, fs_handle, dev_handle,
    550                             ops->index_get(cur), LOWER32(size), UPPER32(size),
    551                             ops->lnkcnt_get(cur));
    552                 } else
    553                         ipc_answer_0(rid, rc);
    554                
     484                ipc_answer_5(rid, rc, fs_handle, dev_handle,
     485                    ops->index_get(cur), ops->size_get(cur),
     486                    ops->lnkcnt_get(cur));
    555487        } else
    556488                ipc_answer_0(rid, rc);
     
    619551        dev_handle_t dev_handle = IPC_GET_ARG1(*request);
    620552        fs_index_t index = IPC_GET_ARG2(*request);
    621        
    622553        fs_node_t *fn;
    623         int rc = ops->node_get(&fn, dev_handle, index);
     554        int rc;
     555       
     556        rc = ops->node_get(&fn, dev_handle, index);
    624557        on_error(rc, answer_and_return(rid, rc));
    625558       
     
    630563       
    631564        rc = ops->node_open(fn);
    632         aoff64_t size = ops->size_get(fn);
    633         ipc_answer_4(rid, rc, LOWER32(size), UPPER32(size), ops->lnkcnt_get(fn),
     565        ipc_answer_3(rid, rc, ops->size_get(fn), ops->lnkcnt_get(fn),
    634566            (ops->is_file(fn) ? L_FILE : 0) | (ops->is_directory(fn) ? L_DIRECTORY : 0));
    635567       
Note: See TracChangeset for help on using the changeset viewer.