Hi David,

As I said earlier the inode is not linked with itable, so similar to inode_path, inode_parent also won't work. We need to remember the parent inode during the worm_create. May be we can store it in the frame->local by creating a struct(if we have more than 2 elements to remember), or simply store it in the frame->local = inode_ref(loc->parent). Please make sure to unref/free the local.


Regards

Rafi KC

On 2/5/20 7:18 PM, David Spisla wrote:
Hello Rafi,
I understand. I first tried the way with the parent inode. I did it this way:

inode_t *parent_inode = NULL;
char *filepath = NULL;
parent_inode = inode_parent(inode, NULL, NULL); // also with fd->inode it didn't work
if (!parent_inode) {
  gf_log(this->name, GF_LOG_ERROR, "Can't get parent inode!");
}
inode_path(parent_inode, NULL, &filepath);
if (!filepath) {
   gf_log(this->name, GF_LOG_ERROR, "Can't get filepath!");
}

But it didn't work. See brick log:
[2020-02-05 13:39:56.408915] E [worm.c:489:worm_create_cbk] 0-repo2-worm: Can't get parent inode! [2020-02-05 13:39:56.408941] E [worm.c:495:worm_create_cbk] 0-repo2-worm: Can't get filepath!

What could be wrong? If this way promise no succeed I will try out the other approach you suggested.

Regards
David Spisla

Am Mi., 5. Feb. 2020 um 12:00 Uhr schrieb RAFI KC <rkavu...@redhat.com <mailto:rkavu...@redhat.com>>:


    On 2/5/20 4:15 PM, David Spisla wrote:
    Hello Amar,
    I do the following in worm_create_cbk:

    char *filepath = NULL;
    inode_path(inode, NULL, &filepath);
    if (!filepath) {
        gf_log(this->name, GF_LOG_ERROR, "Can't get filepath!");
    }

    Unfortunately I got this in the brick log:
    [2020-02-05 10:09:41.880522] E [inode.c:1498:__inode_path]
    (-->/usr/lib64/glusterfs/5.11/xlator/features/worm.so(+0xb129)
    [0x7f4657df7129] -->/usr/lib64/libglusterfs.so.0(inode_path+0x31)
    [0x7f4664e44961] -->/us
    r/lib64/libglusterfs.so.0(__inode_path+0x38b) [0x7f4664e448bb] )
    0-: Assertion failed: 0
    [2020-02-05 10:09:41.880580] W [inode.c:1500:__inode_path]
    (-->/usr/lib64/glusterfs/5.11/xlator/features/worm.so(+0xb129)
    [0x7f4657df7129] -->/usr/lib64/libglusterfs.so.0(inode_path+0x31)
    [0x7f4664e44961] -->/us
    r/lib64/libglusterfs.so.0(__inode_path+0x3d3) [0x7f4664e44903] )
    0-repo2-worm: invalid inode [Invalid argument]
    [2020-02-05 10:09:41.880594] E [worm.c:488:worm_create_cbk]
    0-repo2-worm: Can't get filepath!

    The inode I use seems to be not valid because inode_path()
    returns with error. The same with fd->inode. Is there a way to
    validate the inode before passing it to the function?

    This inode hasn't linked yet to the inode table(creation is still
    in progress), that will only happens at server4_post_create from
    the server xlator which is the last xlator in the cbk path. That
    is why the inode_path creation is failed. Why don't you use parent
    inode to create the path, I believe parent inode will work for you.


    If all the files and folders in the special directory follows the
    same property, An alternative approach is to use an inode type to
    distinguish this special directory and dentries on it. Something
    similar to snapview-client which uses virtual inode to distinguish
    the .snap folder.


    Regards

    Rafi KC




    Regards
    David



    Am Di., 4. Feb. 2020 um 17:57 Uhr schrieb Amar Tumballi
    <a...@kadalu.io <mailto:a...@kadalu.io>>:



        On Tue, Feb 4, 2020 at 7:16 PM David Spisla
        <spisl...@gmail.com <mailto:spisl...@gmail.com>> wrote:

            Dear Gluster Community,
            in worm_create_cbk a file gets the xattr
            "trusted.worm_file" and "trusted.start_time" if
            worm-file-level is enabled. Now I want to exclude some
            files in a special folder from the WORM function.
            Therefore I want to check in worm_create_cbk if the file
            is in this folder or not. But I don't find a parameter
            where the filepath is stored. So my alternative solution
            was, to check it in worm_create (via loc->path) and store
            a boolean value in frame->local. This boolean value will
            be used in worm_create_cbk later. But its not my
            favourite solution.

            Do you know how to get the filepath in the cbk function?


        As per FS guidelines, inside the filesystem, we need to
        handle inodes or parent-inode + basename. If you are looking
        at building a 'path' info in create_cbk, then i
        recommend using 'inode_path()' to build the path as per the
        latest inode table information.

        -Amar


-- https://kadalu.io
        Container Storage made easy!

_______________________________________________

Community Meeting Calendar:

APAC Schedule -
Every 2nd and 4th Tuesday at 11:30 AM IST
Bridge: https://bluejeans.com/441850968


NA/EMEA Schedule -
Every 1st and 3rd Tuesday at 01:00 PM EDT
Bridge: https://bluejeans.com/441850968

Gluster-devel mailing list
Gluster-devel@gluster.org
https://lists.gluster.org/mailman/listinfo/gluster-devel

Reply via email to