]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/fs-common.c
Update bcachefs sources to 50847e296b34 bcachefs: Check subvol <-> inode pointers...
[bcachefs-tools-debian] / libbcachefs / fs-common.c
index 1f2e1fc4f6b22292e4932b9f82a45767460647a4..523507e38887bf9fd4aaacf6ece326d04e6edd16 100644 (file)
@@ -51,7 +51,7 @@ int bch2_create_trans(struct btree_trans *trans,
                bch2_inode_init_late(new_inode, now, uid, gid, mode, rdev, dir_u);
 
                if (flags & BCH_CREATE_TMPFILE)
-                       new_inode->bi_flags |= BCH_INODE_UNLINKED;
+                       new_inode->bi_flags |= BCH_INODE_unlinked;
 
                ret = bch2_inode_create(trans, &inode_iter, new_inode, snapshot, cpu);
                if (ret)
@@ -166,10 +166,8 @@ int bch2_create_trans(struct btree_trans *trans,
                if (ret)
                        goto err;
 
-               if (c->sb.version >= bcachefs_metadata_version_inode_backpointers) {
-                       new_inode->bi_dir               = dir_u->bi_inum;
-                       new_inode->bi_dir_offset        = dir_offset;
-               }
+               new_inode->bi_dir               = dir_u->bi_inum;
+               new_inode->bi_dir_offset        = dir_offset;
        }
 
        inode_iter.flags &= ~BTREE_ITER_ALL_SNAPSHOTS;
@@ -228,10 +226,8 @@ int bch2_link_trans(struct btree_trans *trans,
        if (ret)
                goto err;
 
-       if (c->sb.version >= bcachefs_metadata_version_inode_backpointers) {
-               inode_u->bi_dir         = dir.inum;
-               inode_u->bi_dir_offset  = dir_offset;
-       }
+       inode_u->bi_dir         = dir.inum;
+       inode_u->bi_dir_offset  = dir_offset;
 
        ret =   bch2_inode_write(trans, &dir_iter, dir_u) ?:
                bch2_inode_write(trans, &inode_iter, inode_u);
@@ -264,8 +260,8 @@ int bch2_unlink_trans(struct btree_trans *trans,
 
        dir_hash = bch2_hash_info_init(c, dir_u);
 
-       ret = __bch2_dirent_lookup_trans(trans, &dirent_iter, dir, &dir_hash,
-                                        name, &inum, BTREE_ITER_INTENT);
+       ret = bch2_dirent_lookup_trans(trans, &dirent_iter, dir, &dir_hash,
+                                      name, &inum, BTREE_ITER_INTENT);
        if (ret)
                goto err;
 
@@ -281,7 +277,7 @@ int bch2_unlink_trans(struct btree_trans *trans,
        }
 
        if (deleting_snapshot && !inode_u->bi_subvol) {
-               ret = -ENOENT;
+               ret = -BCH_ERR_ENOENT_not_subvol;
                goto err;
        }
 
@@ -414,21 +410,34 @@ int bch2_rename_trans(struct btree_trans *trans,
                        goto err;
        }
 
-       if (c->sb.version >= bcachefs_metadata_version_inode_backpointers) {
-               src_inode_u->bi_dir             = dst_dir_u->bi_inum;
-               src_inode_u->bi_dir_offset      = dst_offset;
+       /* Can't move across subvolumes, unless it's a subvolume root: */
+       if (src_dir.subvol != dst_dir.subvol &&
+           (!src_inode_u->bi_subvol ||
+            (dst_inum.inum && !dst_inode_u->bi_subvol))) {
+               ret = -EXDEV;
+               goto err;
+       }
 
-               if (mode == BCH_RENAME_EXCHANGE) {
-                       dst_inode_u->bi_dir             = src_dir_u->bi_inum;
-                       dst_inode_u->bi_dir_offset      = src_offset;
-               }
+       if (src_inode_u->bi_parent_subvol)
+               src_inode_u->bi_parent_subvol = dst_dir.subvol;
 
-               if (mode == BCH_RENAME_OVERWRITE &&
-                   dst_inode_u->bi_dir         == dst_dir_u->bi_inum &&
-                   dst_inode_u->bi_dir_offset  == src_offset) {
-                       dst_inode_u->bi_dir             = 0;
-                       dst_inode_u->bi_dir_offset      = 0;
-               }
+       if ((mode == BCH_RENAME_EXCHANGE) &&
+           dst_inode_u->bi_parent_subvol)
+               dst_inode_u->bi_parent_subvol = src_dir.subvol;
+
+       src_inode_u->bi_dir             = dst_dir_u->bi_inum;
+       src_inode_u->bi_dir_offset      = dst_offset;
+
+       if (mode == BCH_RENAME_EXCHANGE) {
+               dst_inode_u->bi_dir             = src_dir_u->bi_inum;
+               dst_inode_u->bi_dir_offset      = src_offset;
+       }
+
+       if (mode == BCH_RENAME_OVERWRITE &&
+           dst_inode_u->bi_dir         == dst_dir_u->bi_inum &&
+           dst_inode_u->bi_dir_offset  == src_offset) {
+               dst_inode_u->bi_dir             = 0;
+               dst_inode_u->bi_dir_offset      = 0;
        }
 
        if (mode == BCH_RENAME_OVERWRITE) {