On Fri, Jun 9, 2017 at 3:24 PM, Amir Goldstein <amir73il@xxxxxxxxx> wrote: > On Fri, Jun 9, 2017 at 4:14 PM, Miklos Szeredi <miklos@xxxxxxxxxx> wrote: >> On Fri, Jun 9, 2017 at 1:49 PM, Miklos Szeredi <miklos@xxxxxxxxxx> wrote: >>> On Fri, Jun 9, 2017 at 11:38 AM, Amir Goldstein <amir73il@xxxxxxxxx> wrote: >> >>> The challenge is in accounting the number of link-ups atomically with >>> the link-up itself. No ideas off-hand. >> >> Following would work I think: >> >> - copy up to indexdir (it now has st_nlink == 1) >> - set overlay.nlinkup to "1-2" >> + the first number indicates the target number of linkups >> + the second indicates the target st_nlink on the file >> - fsync the file (hopefully this writes the xattrs as well as the data) >> - link the file from indexdir to upper >> - set overlay.nlinkup to "1" >> + this indicates that the linkup was finished and number of linkups is 1. >> >> There are 3 cases when we find a file with overlay.nlinkup: >> >> - just one number: nothing to do >> - two numbers and second number == st_nlink: replace with just the linkup value >> - two numbers and second number != st_nlink: replace with decremented >> linkup value >> >> So the atomicity is guaranteed by st_nlink becoming in sync with the >> target value. >> >> Would need to ensure that ovl_link() is not performed in parallel with >> the linkup procedure. >> > > Yep, I started to write you the same thing :) > I though of using a separate xattr for the transnational values, > and delete it after link up, but I guess single xattr is cleaner ?? > > I guess the new ovl_inode mutex could be used for blocking ovl_link(). > > Just to be clear: > - we are going to allocate ovl_inode from our own slab cache > - move from using the i_private inode fields to ovl_inode fields: > {realinode, originode, nlinkup, lock} > - use ovl_inode mutex instead of wait queue and for hardlink up > > Correct? Sounds good. Thanks, Miklos