Changeset af953be


Ignore:
Timestamp:
03/21/14 12:19:17 (4 months ago)
Author:
Kris Moore <kris@…>
Branches:
master, releng/10.0.2
Children:
7083e069
Parents:
e8dac3f
Message:

Update pbifs, try to disable some cache options, keep file consistent with
whats on the main FS

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src-sh/pbi-manager/pbifs/main.c

    r6d736fb raf953be  
    66 */ 
    77 
    8 #define FUSE_USE_VERSION 26 
     8#define FUSE_USE_VERSION 30 
    99 
    1010#include <dirent.h> 
     
    2121#include <unistd.h> 
    2222 
    23  
    2423#define NOT_FOUND -1 
     24 
     25// Uncomment to enable debugging 
     26//#define DODEBUG       1 
    2527 
    2628// Set some globals 
     
    8385 
    8486        return buffer; 
     87} 
     88 
     89void do_debug_log(const char *func, const char *str) 
     90{ 
     91        char logcmd[MAXPATHLEN]; 
     92        strcpy(logcmd, "echo \""); 
     93        strcat(logcmd, func); 
     94        strcat(logcmd, "() "); 
     95        strcat(logcmd, str); 
     96        strcat(logcmd, "\" >> /usr/pbi/.pbifs-debug.log"); 
     97        system(logcmd); 
    8598} 
    8699 
     
    231244 
    232245int newfile_chown(const char *path) { 
     246 
    233247        struct fuse_context *ctx = fuse_get_context(); 
    234248        if (ctx->uid != 0 && ctx->gid != 0) { 
     
    242256int cp(const char *to, const char *from) 
    243257{ 
     258#ifdef DODEBUG 
     259        do_debug_log("cp", to); 
     260#endif 
    244261        int fd_to, fd_from; 
    245262        char buf[4096]; 
     
    284301                close(fd_from); 
    285302 
     303#ifdef DODEBUG 
     304        do_debug_log("cp", "DONE"); 
     305#endif 
     306 
    286307                /* Success! */ 
    287308                return 0; 
     
    315336        get_modified_path(newpath, path); 
    316337 
    317         /* 
    318         char testcmd[MAXPATHLEN]; 
    319         strcpy(testcmd, "echo \"getattr: "); 
    320         strcat(testcmd, newpath); 
    321         strcat(testcmd, "\" >> /tmp/newpath"); 
    322         system(testcmd); 
    323         */ 
    324  
    325338        int res = lstat(newpath, stbuf); 
    326339        if (res == -1) 
     
    335348        (void) offset; 
    336349        (void) fi; 
     350 
     351#ifdef DODEBUG 
     352        do_debug_log("readdir()", path); 
     353#endif 
    337354 
    338355        char newpath[MAXPATHLEN]; 
     
    344361 
    345362        DIR *openDir = opendir(newpath); 
     363        if ( openDir == NULL ) 
     364                return -errno; 
    346365 
    347366        struct dirent *de; 
     
    370389        if (fd == -1) 
    371390                return -errno; 
    372         fi->fh = (unsigned long)fd; 
    373  
     391 
     392        close(fd); 
    374393        return 0; 
    375394} 
     
    378397                      struct fuse_file_info *fi) 
    379398{ 
     399        char newpath[MAXPATHLEN]; 
     400        get_modified_path(newpath, path); 
     401 
    380402        (void) fi; 
    381403 
    382         int result = pread(fi->fh, buf, size, offset); 
    383         if (result == -1) 
    384                 return -errno; 
    385  
    386         return result; 
     404        int res; 
     405 
     406        (void) fi; 
     407        int fh = open(newpath, O_RDONLY); 
     408        if (fh == -1) 
     409                return -errno; 
     410 
     411        result = pread(fh, buf, size, offset); 
     412        if (result == -1) 
     413                result = -errno; 
     414 
     415        close(fh); 
     416        return result; 
    387417} 
    388418 
     
    391421        char newpath[MAXPATHLEN]; 
    392422        get_modified_path(newpath, path); 
    393  
    394423 
    395424        return statvfs(newpath, stbuf); 
     
    450479        fchmod(res, mode); 
    451480 
    452         fi->fh = res; 
     481        close(res); 
    453482        return 0; 
    454483} 
     
    456485static int pbi_flush(const char *path, struct fuse_file_info *fi) 
    457486{ 
    458         int fd = dup(fi->fh); 
    459         if (fd == -1) { 
    460                 if (fsync(fi->fh) == -1)  
    461                         return -EIO; 
    462                 return -errno; 
    463         } 
    464  
    465         int res = close(fd); 
    466         if (res == -1) 
    467                 return -errno; 
    468  
     487        // Doesn't really do anything 
     488        (void) path; 
     489        (void) fi; 
    469490        return 0; 
    470491} 
     
    472493static int pbi_fsync(const char *path, int isdatasync, struct fuse_file_info *fi) 
    473494{ 
    474         (void) isdatasync; 
    475         int res = fsync(fi->fh); 
    476         if (res == -1) 
    477                 return -errno; 
     495        // Doesn't really do anything 
     496        (void) path; 
     497        (void) isdatasync; 
     498        (void) fi; 
    478499        return 0; 
    479500} 
     
    507528static int pbi_mknod(const char *path, mode_t mode, dev_t rdev) 
    508529{ 
    509         int ftype = mode & S_IFMT; 
    510         int fpath = mode & (S_ISUID| S_ISGID | S_ISVTX | S_IRWXU | S_IRWXG | S_IRWXO); 
    511  
    512         char newpath[MAXPATHLEN]; 
    513         get_modified_path(newpath, path); 
    514  
    515         int res = mknod(newpath, ftype, rdev); 
    516         if (res == -1) 
    517                 return -errno; 
    518  
    519         newfile_chown(newpath); 
    520         chmod(newpath, fpath); 
    521  
    522         return 0; 
     530        int res; 
     531 
     532        char newpath[MAXPATHLEN]; 
     533        get_modified_path(newpath, path); 
     534 
     535        if (S_ISREG(mode)) { 
     536                res = open(newpath, O_CREAT | O_EXCL | O_WRONLY, mode); 
     537                if (res >= 0) 
     538                        res = close(res); 
     539        } else if (S_ISFIFO(mode)) 
     540                res = mkfifo(newpath, mode); 
     541        else 
     542                res = mknod(newpath, mode, rdev); 
     543        if (res == -1) 
     544                return -errno; 
     545 
     546        return 0; 
    523547} 
    524548 
     
    526550{ 
    527551        (void) path; 
    528  
    529         int res = close(fi->fh); 
    530         if (res == -1) 
    531                 return -errno; 
    532  
     552        (void) fi; 
     553 
     554        // Doesn't really do anything 
    533555        return 0; 
    534556} 
     
    622644        struct fuse_file_info *fi) 
    623645{ 
    624         (void) path; 
    625         int written = pwrite(fi->fh, buf, size, offset); 
    626         if (written == -1) 
    627                 return -errno; 
    628         return written; 
     646        (void) fi; 
     647        char newpath[MAXPATHLEN]; 
     648        get_modified_path(newpath, path); 
     649 
     650        int fd; 
     651        fd = open(newpath, O_WRONLY); 
     652        if (fd == -1) 
     653                return -errno; 
     654 
     655        int written = pwrite(fd, buf, size, offset); 
     656        if (written == -1) 
     657                written = -errno; 
     658 
     659        close(fd); 
     660        return written; 
    629661} 
    630662 
     
    725757        } 
    726758        fuse_opt_add_arg(&args, "-oallow_other"); 
     759        fuse_opt_add_arg(&args, "-odirect_io"); 
     760        fuse_opt_add_arg(&args, "-ouse_ino"); 
     761        fuse_opt_add_arg(&args, "-ohard_remove"); 
     762        fuse_opt_add_arg(&args, "-onoauto_cache"); 
     763        fuse_opt_add_arg(&args, "-oatomic_o_trunc"); 
     764        fuse_opt_add_arg(&args, "-obig_writes"); 
    727765        fuse_opt_add_arg(&args, "-s"); 
    728766 
    729         return fuse_main(args.argc, args.argv, &pbi_oper, NULL); 
    730 } 
    731  
     767        int exitcode = fuse_main(args.argc, args.argv, &pbi_oper, NULL); 
     768        return exitcode; 
     769} 
     770 
Note: See TracChangeset for help on using the changeset viewer.