• Vivek Goyal's avatar
    ovl: Check redirect on index as well · 0a2d0d3f
    Vivek Goyal authored
    Right now we seem to check redirect only if upperdentry is found.  But it
    is possible that there is no upperdentry but later we found an index.
    
    We need to check redirect on index as well and set it in
    ovl_inode->redirect.  Otherwise link code can assume that dentry does not
    have redirect and place a new one which breaks things.  In my testing
    overlay/033 test started failing in xfstests.  Following are the details.
    
    For example do following.
    
    $ mkdir lower upper work merged
    
     - Make lower dir with 4 links.
      $ echo "foo" > lower/l0.txt
      $ ln  lower/l0.txt lower/l1.txt
      $ ln  lower/l0.txt lower/l2.txt
      $ ln  lower/l0.txt lower/l3.txt
    
     - Mount with index on and metacopy on.
    
      $ mount -t overlay -o lowerdir=lower,upperdir=upper,workdir=work,\
                            index=on,metacopy=on none merged
    
     - Link lower
    
      $ ln merged/l0.txt merged/l4.txt
        (This will metadata copy up of l0.txt and put an absolute redirect
         /l0.txt)
    
      $ echo 2 > /proc/sys/vm/drop/caches
    
      $ ls merged/l1.txt
      (Now l1.txt will be looked up.  There is no upper dentry but there is
       lower dentry and index will be found.  We don't check for redirect on
       index, hence ovl_inode->redirect will be NULL.)
    
     - Link Upper
    
      $ ln merged/l4.txt merged/l5.txt
      (Lookup of l4.txt will use inode from l1.txt lookup which is still in
       cache.  It has ovl_inode->redirect NULL, hence link will put a new
       redirect and replace /l0.txt with /l4.txt
    
     - Drop caches.
      echo 2 > /proc/sys/vm/drop_caches
    
     - List l1.txt and it returns -ESTALE
    
      $ ls merged/l0.txt
    
      (It returns stale because, we found a metacopy of l0.txt in upper and it
       has redirect l4.txt but there is no file named l4.txt in lower layer.
       So lower data copy is not found and -ESTALE is returned.)
    
    So problem here is that we did not process redirect on index.  Check
    redirect on index as well and then problem is fixed.
    Signed-off-by: default avatarVivek Goyal <vgoyal@redhat.com>
    Reviewed-by: default avatarAmir Goldstein <amir73il@gmail.com>
    Signed-off-by: default avatarMiklos Szeredi <mszeredi@redhat.com>
    0a2d0d3f
util.c 21.5 KB