[Gluster-devel] WORM-Xlator: How to get filepath in worm_create_cbk?
RAFI KC
rkavunga at redhat.com
Wed Feb 5 19:51:20 UTC 2020
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 <rkavunga at redhat.com
> <mailto:rkavunga at 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
>> <amar at kadalu.io <mailto:amar at kadalu.io>>:
>>
>>
>>
>> On Tue, Feb 4, 2020 at 7:16 PM David Spisla
>> <spisla80 at gmail.com <mailto:spisla80 at 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!
>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.gluster.org/pipermail/gluster-devel/attachments/20200206/1b7c584f/attachment-0001.html>
More information about the Gluster-devel
mailing list