Changeset d101368 in mainline for uspace/lib/fmgt/src


Ignore:
Timestamp:
2025-11-14T16:41:33Z (8 weeks ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
3a4c6d9
Parents:
4b2065a6
git-author:
Jiri Svoboda <jiri@…> (2025-11-14 16:32:57)
git-committer:
Jiri Svoboda <jiri@…> (2025-11-14 16:41:33)
Message:

Split new file creation into a separate fmgt module.

Location:
uspace/lib/fmgt/src
Files:
1 added
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/fmgt/src/fmgt.c

    r4b2065a6 rd101368  
    4444
    4545#include "fmgt.h"
    46 
    47 #define NEWNAME_LEN 64
    48 #define BUFFER_SIZE 16384
     46#include "../private/fmgt.h"
    4947
    5048/** Create file management library instance.
     
    106104}
    107105
    108 /** Suggest file name for new file.
    109  *
    110  * @param fmgt File management object
    111  * @param rstr Place to store pointer to newly allocated string
    112  * @return EOK on success or an error code
    113  */
    114 errno_t fmgt_new_file_suggest(char **rstr)
    115 {
    116         errno_t rc;
    117         vfs_stat_t stat;
    118         unsigned u;
    119         char name[NEWNAME_LEN];
    120 
    121         u = 0;
    122         while (true) {
    123                 snprintf(name, sizeof(name), "noname%02u.txt", u);
    124                 rc = vfs_stat_path(name, &stat);
    125                 if (rc != EOK)
    126                         break;
    127 
    128                 ++u;
    129         }
    130 
    131         *rstr = str_dup(name);
    132         if (*rstr == NULL)
    133                 return ENOMEM;
    134 
    135         return EOK;
    136 }
    137 
    138106/** Get progress update report.
    139107 *
     
    180148 * @param fmgt File management object
    181149 */
    182 static void fmgt_initial_progress_update(fmgt_t *fmgt)
     150void fmgt_initial_progress_update(fmgt_t *fmgt)
    183151{
    184152        if (fmgt->do_init_update)
     
    192160 * @param fmgt File management object
    193161 */
    194 static void fmgt_final_progress_update(fmgt_t *fmgt)
     162void fmgt_final_progress_update(fmgt_t *fmgt)
    195163{
    196164        if (fmgt->curf_progr)
     
    216184 * @param fmgt File management object
    217185 */
    218 static void fmgt_timer_start(fmgt_t *fmgt)
     186void fmgt_timer_start(fmgt_t *fmgt)
    219187{
    220188        fibril_timer_set(fmgt->timer, 500000, fmgt_timer_fun, (void *)fmgt);
     
    225193 * @param fmgt File management object
    226194 */
    227 static void fmgt_timer_stop(fmgt_t *fmgt)
     195void fmgt_timer_stop(fmgt_t *fmgt)
    228196{
    229197        (void)fibril_timer_clear(fmgt->timer);
     
    235203 * @return @c true iff operation should be aborted
    236204 */
    237 static bool fmgt_abort_query(fmgt_t *fmgt)
     205bool fmgt_abort_query(fmgt_t *fmgt)
    238206{
    239207        if (fmgt->cb != NULL && fmgt->cb->abort_query != NULL)
     
    249217 * @return What error recovery action should be taken.
    250218 */
    251 static fmgt_error_action_t fmgt_io_error_query(fmgt_t *fmgt,
     219fmgt_error_action_t fmgt_io_error_query(fmgt_t *fmgt,
    252220    fmgt_io_error_t *err)
    253221{
     
    258226}
    259227
    260 /** Create new file.
    261  *
    262  * @param fmgt File management object
    263  * @param fname File name
    264  * @param fsize Size of new file (number of zero bytes to fill in)
    265  * @param flags New file flags
    266  * @return EOK on success or an error code
    267  */
    268 errno_t fmgt_new_file(fmgt_t *fmgt, const char *fname, uint64_t fsize,
    269     fmgt_nf_flags_t flags)
    270 {
    271         int fd;
    272         size_t nw;
    273         aoff64_t pos = 0;
    274         uint64_t now;
    275         char *buffer;
    276         fmgt_io_error_t err;
    277         fmgt_error_action_t action;
    278         errno_t rc;
    279 
    280         buffer = calloc(BUFFER_SIZE, 1);
    281         if (buffer == NULL)
    282                 return ENOMEM;
    283 
    284         rc = vfs_lookup_open(fname, WALK_REGULAR | WALK_MUST_CREATE,
    285             MODE_WRITE, &fd);
    286         if (rc != EOK) {
    287                 free(buffer);
    288                 return rc;
    289         }
    290 
    291         fmgt->curf_procb = 0;
    292         fmgt->curf_totalb = fsize;
    293         fmgt->curf_progr = false;
    294         fmgt_timer_start(fmgt);
    295 
    296         fmgt_initial_progress_update(fmgt);
    297 
    298         /* Create sparse file? */
    299         if ((flags & nf_sparse) != 0) {
    300                 fmgt->curf_procb = fsize - 1;
    301                 pos = fsize - 1;
    302         }
    303 
    304         while (fmgt->curf_procb < fsize) {
    305                 now = fsize - fmgt->curf_procb;
    306                 if (now > BUFFER_SIZE)
    307                         now = BUFFER_SIZE;
    308 
    309                 do {
    310                         rc = vfs_write(fd, &pos, buffer, now, &nw);
    311                         if (rc == EOK)
    312                                 break;
    313 
    314                         /* I/O error */
    315                         err.fname = fname;
    316                         err.optype = fmgt_io_write;
    317                         err.rc = rc;
    318                         fmgt_timer_stop(fmgt);
    319                         action = fmgt_io_error_query(fmgt, &err);
    320                         fmgt_timer_start(fmgt);
    321                 } while (action == fmgt_er_retry);
    322 
    323                 /* Not recovered? */
    324                 if (rc != EOK) {
    325                         free(buffer);
    326                         vfs_put(fd);
    327                         fmgt_final_progress_update(fmgt);
    328                         return rc;
    329                 }
    330 
    331                 fmgt->curf_procb += nw;
    332 
    333                 /* User requested abort? */
    334                 if (fmgt_abort_query(fmgt)) {
    335                         free(buffer);
    336                         vfs_put(fd);
    337                         fmgt_final_progress_update(fmgt);
    338                         return EINTR;
    339                 }
    340         }
    341 
    342         free(buffer);
    343         vfs_put(fd);
    344         fmgt_final_progress_update(fmgt);
    345         return EOK;
    346 }
    347 
    348228/** @}
    349229 */
Note: See TracChangeset for help on using the changeset viewer.