root/branches/Orange-Elaine-Distr-Dir-Branch/src/server/mkdir.sm @ 8648

Revision 8648, 19.9 KB (checked in by shuangy, 2 years ago)

1. add >InitNumDirdataHandles?< field to fs_config and default value set to 2. 2. add command line options >-n, --init-num-dirdata< to pvfs2-mkdir to set initial number of dirdata handles for a directory. (not yet applied to kernel module.)

Line 
1/*
2 * (C) 2001 Clemson University and The University of Chicago
3 *
4 * See COPYING in top-level directory.
5 */
6
7
8#include <string.h>
9#include <assert.h>
10
11#include "server-config.h"
12#include "pvfs2-server.h"
13#include "pvfs2-attr.h"
14#include "pvfs2-util.h"
15#include "pvfs2-internal.h"
16#include "pint-util.h"
17#include "pint-cached-config.h"
18#include "pvfs2-dist-basic.h"
19#include "dist-dir-utils.h"
20
21%%
22
23nested machine pvfs2_mkdir_work_sm
24{
25    state create
26    {
27        run mkdir_create;
28        success => set_attrib;
29        default => err_msg;
30    }
31
32    state set_attrib
33    {
34        run mkdir_setattrib;
35        success => create_dist_dir_struct;
36        default => err_msg;
37    }
38
39/* 1. now use err_msg as the error handling, will change if necessary */
40
41    state create_dist_dir_struct
42    {
43        run mkdir_create_dist_dir_struct;
44        success => select_dirdata_servers;
45        default => err_msg;
46    }
47
48    state select_dirdata_servers
49    {
50        run mkdir_select_dirdata_servers;
51        success => create_local_dirdata_dspace;
52        default => err_msg;
53    }
54
55    state create_local_dirdata_dspace
56    {
57        run mkdir_create_local_dirdata_dspace;
58        success => request_remote_dirdata_dspace;
59        default => err_msg;
60    }
61
62    state request_remote_dirdata_dspace
63    {
64        run mkdir_request_remote_dirdata_dspace;
65        success => fill_handles_to_dist_dir_struct;
66        default => err_msg;
67    }
68
69    state fill_handles_to_dist_dir_struct
70    {
71        run mkdir_fill_handles_to_dist_dir_struct;
72        default => write_keyval_to_meta_handle;
73/*
74        default => remote_dirdata_attr_and_keyval_setup_msgpair;
75*/
76    }
77
78/*
79    state remote_dirdata_attr_and_keyval_setup_msgpair
80    {
81        run mkdir_remote_dirdata_attr_and_keyval_setup_msgpair;
82        success => remote_dirdata_attr_and_keyval_xfer_msgpair;
83        default => err_msg;
84    }
85
86    state remote_dirdata_attr_and_keyval_xfer_msgpair
87    {
88        jump pvfs2_msgpairarray_sm;
89        success => write_keyval_to_meta_handle;
90        default => err_msg;
91    }
92*/
93   
94    state write_keyval_to_meta_handle
95    {
96        run mkdir_write_keyval_to_meta_handle;
97        success => return;
98        default => err_msg;
99    }
100
101    state err_msg
102    {
103        run mkdir_error;
104        default => return;
105    }
106}
107
108machine pvfs2_mkdir_sm
109{
110    state prelude
111    {
112        jump pvfs2_prelude_sm;
113        success => prep_sm;
114        default => final_response;
115    }
116
117    state prep_sm
118    {
119        run mkdir_prep_sm;
120        default => work;
121    }
122
123    state work
124    {
125        jump pvfs2_mkdir_work_sm;
126        default => final_response;
127    }
128
129    state final_response
130    {
131        jump pvfs2_final_response_sm;
132        default => cleanup;
133    }
134
135    state cleanup
136    {
137        run mkdir_cleanup;
138        default => terminate;
139    }
140}
141
142%%
143
144/*
145 * Function: mkdir_create
146 *
147 * Params:   server_op *s_op,
148 *           job_status_s *js_p
149 *
150 * Returns:  int
151 *
152 * Synopsis:
153 *
154 * NOTE: returned handle will pop out in js_p->handle (the job status
155 * struct).
156 */
157static PINT_sm_action mkdir_create(
158        struct PINT_smcb *smcb, job_status_s *js_p)
159{
160    struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
161    int ret;
162    job_id_t i;
163
164    gossip_debug(GOSSIP_MKDIR_DEBUG, " creating dspace on coll_id %d\n",
165                 s_op->u.mkdir.fs_id);
166
167    gossip_debug(
168        GOSSIP_MKDIR_DEBUG, " directory handle will "
169        "be in starting hrange[0] %llu-%llu\n",
170        llu(s_op->u.mkdir.handle_extent_array.extent_array[0].first),
171        llu(s_op->u.mkdir.handle_extent_array.extent_array[0].last));
172
173    ret = job_trove_dspace_create(
174        s_op->u.mkdir.fs_id, &s_op->u.mkdir.handle_extent_array,
175        PVFS_TYPE_DIRECTORY, NULL,
176        TROVE_SYNC,
177        smcb, 0, js_p, &i,
178        server_job_context, s_op->req->hints);
179
180    return ret;
181}
182
183/*
184 * Function: mkdir_setattrib
185 *
186 * Params:   server_op *s_op,
187 *           job_status_s *js_p
188 *
189 * Returns:  int
190 *
191 * Synopsis:
192 *           
193 */
194static PINT_sm_action mkdir_setattrib(
195        struct PINT_smcb *smcb, job_status_s *js_p)
196{
197    struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
198    int ret = -1;
199    job_id_t j_id;
200    PVFS_ds_attributes *ds_attr = NULL;
201
202    /* save the handle from the mkdir in the response */
203    s_op->resp.u.mkdir.handle = js_p->handle;
204
205    gossip_debug(GOSSIP_MKDIR_DEBUG, " *** new directory has handle %llu\n",
206                 llu(js_p->handle));
207
208    ds_attr = (&s_op->ds_attr);
209    PVFS_ds_init_time(ds_attr);
210
211    gossip_debug(GOSSIP_MKDIR_DEBUG, " setting directory version to "
212                 "%llu\n\tmtime is %llu\n", llu(ds_attr->mtime),
213                 llu(PINT_util_mkversion_time(ds_attr->mtime)));
214
215    ret = job_trove_dspace_setattr(
216        s_op->u.mkdir.fs_id, s_op->resp.u.mkdir.handle,
217        ds_attr,
218        TROVE_SYNC,
219        smcb, 0, js_p, &j_id, server_job_context, s_op->req->hints);
220
221    return ret;
222}
223
224
225/* init dist_dir_struct in s_op->attr.u.dir and s_op->u.mkdir */
226static PINT_sm_action mkdir_create_dist_dir_struct(
227        struct PINT_smcb *smcb, job_status_s *js_p)
228{
229    struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
230    PVFS_object_attr *attr;
231    int num_total_dirdata_servers, num_initial_dirdata_servers;
232    server_configuration_s *user_opts = get_server_config_struct();
233    int ret = -1;
234    unsigned char *c;
235    int i;
236
237    attr = (&s_op->attr);
238
239    /* use total # of meta servers as the num_total_dirdata_servers */
240    ret = PINT_cached_config_get_num_meta(s_op->u.mkdir.fs_id,
241                                            &num_total_dirdata_servers);
242    if(ret < 0)
243    {
244        gossip_err("Error: failed to get number of metadata servers\n");
245        js_p->error_code = ret;
246        return SM_ACTION_COMPLETE;
247    }
248
249    /* set num_dirdata_servers for pre-allocation of dirdata handles */
250    s_op->u.mkdir.num_dirdata_servers =
251        num_total_dirdata_servers;
252
253    /* TODO: if received >0, use; else use config_file value,*/
254    if(s_op->req->u.mkdir.num_dirent_files_req > 0)
255    {
256        num_initial_dirdata_servers = s_op->req->u.mkdir.num_dirent_files_req;
257    }
258    else
259    {
260        num_initial_dirdata_servers = user_opts->init_num_dirdata_handles;
261    }
262
263    /* will do the same check in PINT_init_dist_dir_state,
264     * but can also add here */
265    if(num_initial_dirdata_servers > num_total_dirdata_servers)
266    {
267        num_initial_dirdata_servers = num_total_dirdata_servers;
268    }
269
270    /* init meta handle dist_dir_struct */
271    ret = PINT_init_dist_dir_state(&attr->u.dir.dist_dir_attr,
272            &attr->u.dir.dist_dir_bitmap,
273            num_total_dirdata_servers,
274            0,
275            num_initial_dirdata_servers);
276
277    assert(ret == 0);
278
279    gossip_debug(GOSSIP_MKDIR_DEBUG,
280            "mkdir: Init dist-dir-attr for dir meta handle %llu "
281            "with tree_height=%d, num_servers=%d, bitmap_size=%d, "
282            "split_size=%d, server_no=%d and branch_level=%d\n",
283            llu(s_op->resp.u.mkdir.handle),
284            attr->u.dir.dist_dir_attr.tree_height,
285            attr->u.dir.dist_dir_attr.num_servers,
286            attr->u.dir.dist_dir_attr.bitmap_size,
287            attr->u.dir.dist_dir_attr.split_size,
288            attr->u.dir.dist_dir_attr.server_no,
289            attr->u.dir.dist_dir_attr.branch_level);
290
291    /* gossip bitmap, may adjust later */
292    gossip_debug(GOSSIP_MKDIR_DEBUG,
293            "mkdir: Init dist_dir_bitmap as:\n");
294    for(i = attr->u.dir.dist_dir_attr.bitmap_size - 1;
295            i >= 0 ; i--)
296    {
297        c = (unsigned char *)(attr->u.dir.dist_dir_bitmap + i);
298        gossip_debug(GOSSIP_MKDIR_DEBUG,
299                " i=%d : %02x %02x %02x %02x\n",
300                i, c[3], c[2], c[1], c[0]);
301    }
302    gossip_debug(GOSSIP_MKDIR_DEBUG, "\n");
303
304    /* allocate dirdata handle space, similar to create.sm */
305    attr->u.dir.dirdata_handles = malloc(
306            sizeof(*attr->u.dir.dirdata_handles) *
307            num_total_dirdata_servers);
308    s_op->u.mkdir.handle_array_local = malloc(
309            sizeof(*s_op->u.mkdir.handle_array_local) *
310            num_total_dirdata_servers);
311    s_op->u.mkdir.handle_array_remote = malloc(
312            sizeof(*s_op->u.mkdir.handle_array_remote) *
313            num_total_dirdata_servers);
314
315    if(!attr->u.dir.dirdata_handles ||
316            !s_op->u.mkdir.handle_array_local ||
317            !s_op->u.mkdir.handle_array_remote )
318    {
319        js_p->error_code = -PVFS_ENOMEM;
320        return SM_ACTION_COMPLETE;
321    }
322
323    return SM_ACTION_COMPLETE;
324}
325
326
327static PINT_sm_action mkdir_select_dirdata_servers(
328        struct PINT_smcb *smcb, job_status_s *js_p)
329{
330    /*
331    struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
332    PVFS_object_attr *attr;
333    */
334
335/* not selecting servers now, suppose has dirdata on every metadata server */
336
337        /******** if use the function in create.sm to get server list:
338*
339int PINT_cached_config_get_server_list(
340    PVFS_fs_id fs_id,
341    PINT_dist *dist,
342    int num_dfiles_req,
343    PVFS_sys_layout *layout,
344    const char ***server_names,
345    int *server_count)
346
3471. need to provide dist & layout
3482. server_count might be different from num_dfiles_req, then better put create dist-dir-struct after the servers selection function.
349
350****************/
351
352
353        return SM_ACTION_COMPLETE;
354
355}
356
357
358
359static PINT_sm_action mkdir_create_local_dirdata_dspace(
360        struct PINT_smcb *smcb, job_status_s *js_p)
361{
362    struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
363    PVFS_object_attr *attr;
364    int ret = -PVFS_ENOMEM;
365    job_id_t tmp_id;
366    PVFS_handle_extent_array extent_array;
367    server_configuration_s *user_opts = get_server_config_struct();
368
369    attr = (&s_op->attr);
370
371    assert(s_op->u.mkdir.num_dirdata_servers > 0);
372
373    /* dirdata on every meta server */
374    s_op->u.mkdir.handle_array_local_count = 1;
375    s_op->u.mkdir.handle_array_remote_count =
376        s_op->u.mkdir.num_dirdata_servers - 1;
377
378    gossip_debug(GOSSIP_MKDIR_DEBUG, "creating %d local dirdata files\n",
379        s_op->u.mkdir.handle_array_local_count);
380    gossip_debug(GOSSIP_MKDIR_DEBUG, "creating %d remote dirdata files\n",
381        s_op->u.mkdir.handle_array_remote_count);
382
383    if(s_op->u.mkdir.handle_array_local_count == 0)
384    {
385        /* no local work to do */
386        js_p->error_code = 0;
387        return(SM_ACTION_COMPLETE);
388    }
389
390    ret = PINT_config_get_meta_handle_extent_array(
391        user_opts, s_op->u.mkdir.fs_id, &extent_array);
392    assert(ret == 0);
393    assert(extent_array.extent_count > 0);
394
395    gossip_debug(GOSSIP_MKDIR_DEBUG, " local dirdata handle(s) will "
396                 "be in starting hrange[0] %llu-%llu\n",
397                 llu(extent_array.extent_array[0].first),
398                 llu(extent_array.extent_array[0].last));
399
400    ret = job_trove_dspace_create_list(
401        s_op->req->u.mkdir.fs_id,
402        &extent_array,
403        s_op->u.mkdir.handle_array_local,
404        s_op->u.mkdir.handle_array_local_count,
405        PVFS_TYPE_DIRDATA,
406        NULL,
407        TROVE_SYNC,
408        smcb,
409        0,
410        js_p,
411        &tmp_id,
412        server_job_context,
413        s_op->req->hints);
414
415    return(ret);
416}
417
418
419static PINT_sm_action mkdir_request_remote_dirdata_dspace(
420        struct PINT_smcb *smcb, job_status_s *js_p)
421{
422    struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
423    int ret = -1;
424    job_id_t j_id;
425
426    gossip_debug(
427        GOSSIP_MKDIR_DEBUG, "  local dirdata handle (%llu)\n",
428        llu(s_op->u.mkdir.handle_array_local[0]));
429
430    if(s_op->u.mkdir.handle_array_remote_count == 0)
431    {
432        js_p->error_code = 0;
433        return(SM_ACTION_COMPLETE);
434    }
435
436    ret = job_precreate_pool_get_handles(
437        s_op->req->u.mkdir.fs_id,
438        s_op->u.mkdir.handle_array_remote_count,
439        PVFS_TYPE_DIRDATA,
440        NULL, /* server string set to NULL for now */
441        s_op->u.mkdir.handle_array_remote,
442        0,
443        smcb,
444        0,
445        js_p,
446        &j_id,
447        server_job_context,
448        s_op->req->hints);
449
450    return ret;
451
452}
453
454
455static PINT_sm_action mkdir_fill_handles_to_dist_dir_struct(
456        struct PINT_smcb *smcb, job_status_s *js_p)
457{
458    struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
459    PVFS_object_attr *attr;
460    int i;
461
462    attr = &s_op->attr;
463
464    /* fill dirdata_handles array */
465    attr->u.dir.dirdata_handles[0] =
466        s_op->u.mkdir.handle_array_local[0];
467
468    for(i = 0; i < s_op->u.mkdir.num_dirdata_servers - 1; i++)
469    {
470        attr->u.dir.dirdata_handles[i+1] =
471            s_op->u.mkdir.handle_array_remote[i];
472    }
473
474    gossip_debug(GOSSIP_MKDIR_DEBUG,
475            "\t mkdir: dirdata handles array of directory %llu.\n",
476            llu(s_op->resp.u.mkdir.handle));
477
478    for(i=0; i<s_op->u.mkdir.num_dirdata_servers; i++)
479    {
480        gossip_debug(GOSSIP_MKDIR_DEBUG,
481                "\t\tdirdata server %d: %llu.\n",
482                i, llu(attr->u.dir.dirdata_handles[i]));
483    }
484
485    return SM_ACTION_COMPLETE;
486}
487
488#if 0
489static int mkdir_remote_dirdata_attr_and_keyval_setup_msgpair(struct PINT_smcb *smcb, job_status_s *js_p)
490{
491    struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
492    PINT_sm_msgpair_state *msg_p = NULL;
493    PVFS_object_attr attr;
494    int ret;
495
496    gossip_debug(GOSSIP_MKDIR_DEBUG, "mkdir state: send_remote_dir_data\n");
497
498    /* !!! set dirdata attr, set all the static component */
499    memcpy(&attr, &s_op->req->u.mkdir.attr, sizeof(attr));
500    attr.objtype = PVFS_TYPE_DIRDATA;
501    PINT_dist_dir_attr_copyto(attr.u.dir.dist_dir_attr,
502                              s_op->attr.u.dir.dist_dir_attr);
503    attr.u.dir.dirdata_handles = s_op->attr.u.dir.dirdata_handles;
504    attr.u.dir.dist_dir_bitmap = s_op->attr.u.dir.dist_dir_bitmap;
505    attr.mask = PVFS_ATTR_COMMON_ALL;
506    /* not writing DISTDIR_ATTR */
507    /*
508       attr.mask |= PVFS_ATTR_DIR_DISTDIR_ATTR;
509     */
510
511    gossip_debug(
512        GOSSIP_MKDIR_DEBUG,
513        "  SENDING attrs: [owner = %d, group = %d\n\t"
514        "perms = %o, type = %d, atime = %llu, mtime = %llu\n\t"
515        "ctime = %llu ]\n",
516        attr.owner, attr.group, attr.perms,
517        attr.objtype, llu(attr.atime),
518        llu(PINT_util_mkversion_time(attr.mtime)), llu(attr.ctime));
519
520    PINT_msgpair_init(&s_op->msgarray_op);
521    msg_p = &s_op->msgarray_op.msgpair;
522    PINT_serv_init_msgarray_params(s_op, s_op->u.mkdir.fs_id);
523
524    PINT_SERVREQ_TREE_SETATTR_FILL(
525        msg_p->req,
526        s_op->req->credentials,
527        s_op->u.mkdir.fs_id,
528        PVFS_TYPE_DIRDATA,
529        attr,
530        s_op->attr.u.dir.dist_dir_attr.num_servers,
531        s_op->attr.u.dir.dirdata_handles,
532        NULL);
533
534    msg_p->fs_id = s_op->u.mkdir.fs_id;
535    msg_p->handle = s_op->attr.u.dir.dirdata_handles[0];
536    msg_p->retry_flag = PVFS_MSGPAIR_RETRY;
537    msg_p->comp_fn = NULL;
538
539    ret = PINT_cached_config_map_to_server(
540        &msg_p->svr_addr, msg_p->handle, msg_p->fs_id);
541
542    if (ret)
543    {
544        gossip_err("Failed to map dirdata server address\n");
545        js_p->error_code = ret;
546    }
547
548    PINT_sm_push_frame(smcb, 0, &s_op->msgarray_op);
549    js_p->error_code = 0;
550    return SM_ACTION_COMPLETE;
551}
552#endif
553
554static PINT_sm_action mkdir_write_keyval_to_meta_handle(
555        struct PINT_smcb *smcb, job_status_s *js_p)
556{
557    struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
558    PVFS_object_attr *attr;
559    int ret = -1;
560    job_id_t j_id;
561
562    /* total 3 keyvals, PVFS_DIST_DIR_ATTR, PVFS_DIRDATA_BITMAP, PVFS_DIRDATA_HANDLES */
563    int keyval_count = 3;
564
565    /* !!!! this is to set meta handle keyval,
566     * use dist_dir_attr in s_op->attr
567     */
568    attr = &s_op->attr;
569
570    s_op->key_a = malloc(sizeof(PVFS_ds_keyval) * keyval_count);
571    if(!s_op->key_a)
572    {
573        js_p->error_code = -PVFS_ENOMEM;
574        return SM_ACTION_COMPLETE;
575    }
576
577    s_op->val_a = malloc(sizeof(PVFS_ds_keyval) * keyval_count);
578    if(!s_op->val_a)
579    {
580        free(s_op->key_a);
581        js_p->error_code = -PVFS_ENOMEM;
582        return SM_ACTION_COMPLETE;
583    }
584    memset(s_op->val_a, 0, sizeof(PVFS_ds_keyval) * keyval_count);
585
586    s_op->key_a[0].buffer = Trove_Common_Keys[DIST_DIR_ATTR_KEY].key;
587    s_op->key_a[0].buffer_sz = Trove_Common_Keys[DIST_DIR_ATTR_KEY].size;
588
589    s_op->val_a[0].buffer = &attr->u.dir.dist_dir_attr;
590    s_op->val_a[0].buffer_sz =
591         sizeof(attr->u.dir.dist_dir_attr);
592
593    s_op->key_a[1].buffer = Trove_Common_Keys[DIST_DIRDATA_BITMAP_KEY].key;
594    s_op->key_a[1].buffer_sz = Trove_Common_Keys[DIST_DIRDATA_BITMAP_KEY].size;
595
596    s_op->val_a[1].buffer_sz =
597        attr->u.dir.dist_dir_attr.bitmap_size *
598        sizeof(PVFS_dist_dir_bitmap_basetype);
599    s_op->val_a[1].buffer = attr->u.dir.dist_dir_bitmap;
600
601    s_op->key_a[2].buffer = Trove_Common_Keys[DIST_DIRDATA_HANDLES_KEY].key;
602    s_op->key_a[2].buffer_sz = Trove_Common_Keys[DIST_DIRDATA_HANDLES_KEY].size;
603
604    s_op->val_a[2].buffer = attr->u.dir.dirdata_handles;
605    s_op->val_a[2].buffer_sz = attr->u.dir.dist_dir_attr.num_servers *
606        sizeof(*attr->u.dir.dirdata_handles);
607
608    gossip_debug(GOSSIP_MKDIR_DEBUG,
609            "  writing dist-dir-struct keyvals for meta handle: %llu "
610            "\t with server_no=%d and branch_level=%d \n",
611            llu(s_op->resp.u.mkdir.handle),
612            attr->u.dir.dist_dir_attr.server_no,
613            attr->u.dir.dist_dir_attr.branch_level);
614
615
616    ret = job_trove_keyval_write_list(
617            s_op->req->u.mkdir.fs_id,
618            s_op->resp.u.mkdir.handle, /* meta handle */
619            s_op->key_a, s_op->val_a,
620            keyval_count, TROVE_SYNC, NULL, smcb,
621            0, js_p, &j_id, server_job_context,
622            s_op->req->hints);
623
624    return ret;
625}
626
627static int mkdir_error(struct PINT_smcb *smcb, job_status_s *js_p)
628{
629    struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
630    s_op->resp.u.mkdir.handle = 0;
631
632    gossip_debug(
633        GOSSIP_MKDIR_DEBUG, "  mkdir_error: error_code = %d\n",
634        js_p->error_code);
635
636    if (js_p->error_code > -1)
637    {
638        js_p->error_code = -PVFS_EINVAL;
639    }
640    return 1;
641}
642
643
644/*
645 * Function: mkdir_cleanup
646 *
647 * Params:   server_op *b,
648 *           job_status_s *js_p
649 *
650 * Returns:  int
651 *
652 * Synopsis: free memory and return
653 *           
654 */
655static PINT_sm_action mkdir_cleanup(
656        struct PINT_smcb *smcb, job_status_s *js_p)
657{
658    struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
659
660    if(s_op->key_a)
661    {
662        free(s_op->key_a);
663    }
664
665    if(s_op->val_a)
666    {
667        free(s_op->val_a);
668    }
669
670    PINT_free_object_attr(&s_op->attr);
671
672    if(s_op->u.mkdir.handle_array_local)
673    {
674        free(s_op->u.mkdir.handle_array_local);
675    }
676
677    if(s_op->u.mkdir.handle_array_remote)
678    {
679        free(s_op->u.mkdir.handle_array_remote);
680    }
681
682    return(server_state_machine_complete(smcb));
683}
684
685static PINT_sm_action mkdir_prep_sm(
686        struct PINT_smcb *smcb, job_status_s *js_p)
687{
688    struct PINT_server_op *s_op = PINT_sm_frame(smcb, PINT_FRAME_CURRENT);
689    PVFS_object_attr *a_p = NULL;
690    PVFS_ds_attributes *ds_attr = NULL;
691
692    s_op->u.mkdir.fs_id = s_op->req->u.mkdir.fs_id;
693    s_op->u.mkdir.handle_extent_array =
694        s_op->req->u.mkdir.handle_extent_array;
695
696    a_p = &(s_op->req->u.mkdir.attr);
697
698    if (a_p->objtype != PVFS_TYPE_DIRECTORY)
699    {
700        js_p->error_code = -PVFS_EINVAL;
701        return SM_ACTION_COMPLETE;
702    }
703
704    gossip_debug(GOSSIP_MKDIR_DEBUG, " attrs to write: [owner = %d, "
705                 "group = %d, perms = %o]\n", a_p->owner, a_p->group,
706                 a_p->perms);
707
708    /* translate attrs to storage attr format */
709    ds_attr = (&s_op->ds_attr);
710    PVFS_object_attr_to_ds_attr(a_p, ds_attr);
711
712    js_p->error_code = 0;
713    return SM_ACTION_COMPLETE;
714}
715
716static inline int PINT_get_object_ref_mkdir(
717    struct PVFS_server_req *req, PVFS_fs_id *fs_id, PVFS_handle *handle)
718{
719    *fs_id = req->u.mkdir.fs_id;
720    *handle = PVFS_HANDLE_NULL;
721    return 0;
722};
723
724struct PINT_server_req_params pvfs2_mkdir_params =
725{
726    .string_name = "mkdir",
727    .perm = PINT_SERVER_CHECK_NONE,
728    .access_type = PINT_server_req_modify,
729    .state_machine = &pvfs2_mkdir_sm
730};
731
732/*
733 * Local variables:
734 *  mode: c
735 *  c-indent-level: 4
736 *  c-basic-offset: 4
737 * End:
738 *
739 * vim: ft=c ts=8 sts=4 sw=4 expandtab
740 */
Note: See TracBrowser for help on using the browser.