OSDN Git Service

btrfs: simplify generation check in btrfs_get_dentry
authorDavid Sterba <dsterba@suse.com>
Tue, 18 Oct 2022 14:06:38 +0000 (16:06 +0200)
committerDavid Sterba <dsterba@suse.com>
Mon, 5 Dec 2022 17:00:41 +0000 (18:00 +0100)
Callers that pass non-zero generation always want to perform the
generation check, we can simply encode that in one parameter and drop
check_generation. Add function documentation.

Reviewed-by: Josef Bacik <josef@toxicpanda.com>
Signed-off-by: David Sterba <dsterba@suse.com>
fs/btrfs/export.c
fs/btrfs/export.h
fs/btrfs/ioctl.c

index fab7eb7..a51a5df 100644 (file)
@@ -57,9 +57,20 @@ static int btrfs_encode_fh(struct inode *inode, u32 *fh, int *max_len,
        return type;
 }
 
+/*
+ * Read dentry of inode with @objectid from filesystem root @root_objectid.
+ *
+ * @sb:             the filesystem super block
+ * @objectid:       inode objectid
+ * @root_objectid:  object id of the subvolume root where to look up the inode
+ * @generation:     optional, if not zero, verify that the found inode
+ *                  generation matches
+ *
+ * Return dentry alias for the inode, otherwise an error. In case the
+ * generation does not match return ESTALE.
+ */
 struct dentry *btrfs_get_dentry(struct super_block *sb, u64 objectid,
-                               u64 root_objectid, u64 generation,
-                               int check_generation)
+                               u64 root_objectid, u64 generation)
 {
        struct btrfs_fs_info *fs_info = btrfs_sb(sb);
        struct btrfs_root *root;
@@ -77,7 +88,7 @@ struct dentry *btrfs_get_dentry(struct super_block *sb, u64 objectid,
        if (IS_ERR(inode))
                return ERR_CAST(inode);
 
-       if (check_generation && generation != inode->i_generation) {
+       if (generation != 0 && generation != inode->i_generation) {
                iput(inode);
                return ERR_PTR(-ESTALE);
        }
@@ -106,7 +117,7 @@ static struct dentry *btrfs_fh_to_parent(struct super_block *sb, struct fid *fh,
        objectid = fid->parent_objectid;
        generation = fid->parent_gen;
 
-       return btrfs_get_dentry(sb, objectid, root_objectid, generation, 1);
+       return btrfs_get_dentry(sb, objectid, root_objectid, generation);
 }
 
 static struct dentry *btrfs_fh_to_dentry(struct super_block *sb, struct fid *fh,
@@ -128,7 +139,7 @@ static struct dentry *btrfs_fh_to_dentry(struct super_block *sb, struct fid *fh,
        root_objectid = fid->root_objectid;
        generation = fid->gen;
 
-       return btrfs_get_dentry(sb, objectid, root_objectid, generation, 1);
+       return btrfs_get_dentry(sb, objectid, root_objectid, generation);
 }
 
 struct dentry *btrfs_get_parent(struct dentry *child)
@@ -188,7 +199,7 @@ struct dentry *btrfs_get_parent(struct dentry *child)
 
        if (found_key.type == BTRFS_ROOT_BACKREF_KEY) {
                return btrfs_get_dentry(fs_info->sb, key.objectid,
-                                       found_key.offset, 0, 0);
+                                       found_key.offset, 0);
        }
 
        return d_obtain_alias(btrfs_iget(fs_info->sb, key.objectid, root));
index 5afb7ca..eba6bc4 100644 (file)
@@ -19,8 +19,7 @@ struct btrfs_fid {
 } __attribute__ ((packed));
 
 struct dentry *btrfs_get_dentry(struct super_block *sb, u64 objectid,
-                               u64 root_objectid, u64 generation,
-                               int check_generation);
+                               u64 root_objectid, u64 generation);
 struct dentry *btrfs_get_parent(struct dentry *child);
 
 #endif
index 5ba2e81..a482739 100644 (file)
@@ -3274,7 +3274,7 @@ static noinline int btrfs_ioctl_snap_destroy(struct file *file,
 
                        dentry = btrfs_get_dentry(fs_info->sb,
                                        BTRFS_FIRST_FREE_OBJECTID,
-                                       vol_args2->subvolid, 0, 0);
+                                       vol_args2->subvolid, 0);
                        if (IS_ERR(dentry)) {
                                err = PTR_ERR(dentry);
                                goto out_drop_write;