diff options
Diffstat (limited to 'fs/xfs')
-rw-r--r-- | fs/xfs/xfs_fs.h | 3 | ||||
-rw-r--r-- | fs/xfs/xfs_icache.c | 31 |
2 files changed, 33 insertions, 1 deletions
diff --git a/fs/xfs/xfs_fs.h b/fs/xfs/xfs_fs.h index d34703dbcb42..ffdabc687852 100644 --- a/fs/xfs/xfs_fs.h +++ b/fs/xfs/xfs_fs.h | |||
@@ -375,6 +375,9 @@ struct xfs_fs_eofblocks { | |||
375 | #define XFS_EOF_FLAGS_GID (1 << 2) /* filter by gid */ | 375 | #define XFS_EOF_FLAGS_GID (1 << 2) /* filter by gid */ |
376 | #define XFS_EOF_FLAGS_PRID (1 << 3) /* filter by project id */ | 376 | #define XFS_EOF_FLAGS_PRID (1 << 3) /* filter by project id */ |
377 | #define XFS_EOF_FLAGS_MINFILESIZE (1 << 4) /* filter by min file size */ | 377 | #define XFS_EOF_FLAGS_MINFILESIZE (1 << 4) /* filter by min file size */ |
378 | #define XFS_EOF_FLAGS_UNION (1 << 5) /* union filter algorithm; | ||
379 | * kernel only, not included in | ||
380 | * valid mask */ | ||
378 | #define XFS_EOF_FLAGS_VALID \ | 381 | #define XFS_EOF_FLAGS_VALID \ |
379 | (XFS_EOF_FLAGS_SYNC | \ | 382 | (XFS_EOF_FLAGS_SYNC | \ |
380 | XFS_EOF_FLAGS_UID | \ | 383 | XFS_EOF_FLAGS_UID | \ |
diff --git a/fs/xfs/xfs_icache.c b/fs/xfs/xfs_icache.c index 6e522ff5a006..43452081b705 100644 --- a/fs/xfs/xfs_icache.c +++ b/fs/xfs/xfs_icache.c | |||
@@ -1203,6 +1203,30 @@ xfs_inode_match_id( | |||
1203 | return 1; | 1203 | return 1; |
1204 | } | 1204 | } |
1205 | 1205 | ||
1206 | /* | ||
1207 | * A union-based inode filtering algorithm. Process the inode if any of the | ||
1208 | * criteria match. This is for global/internal scans only. | ||
1209 | */ | ||
1210 | STATIC int | ||
1211 | xfs_inode_match_id_union( | ||
1212 | struct xfs_inode *ip, | ||
1213 | struct xfs_eofblocks *eofb) | ||
1214 | { | ||
1215 | if ((eofb->eof_flags & XFS_EOF_FLAGS_UID) && | ||
1216 | uid_eq(VFS_I(ip)->i_uid, eofb->eof_uid)) | ||
1217 | return 1; | ||
1218 | |||
1219 | if ((eofb->eof_flags & XFS_EOF_FLAGS_GID) && | ||
1220 | gid_eq(VFS_I(ip)->i_gid, eofb->eof_gid)) | ||
1221 | return 1; | ||
1222 | |||
1223 | if ((eofb->eof_flags & XFS_EOF_FLAGS_PRID) && | ||
1224 | xfs_get_projid(ip) == eofb->eof_prid) | ||
1225 | return 1; | ||
1226 | |||
1227 | return 0; | ||
1228 | } | ||
1229 | |||
1206 | STATIC int | 1230 | STATIC int |
1207 | xfs_inode_free_eofblocks( | 1231 | xfs_inode_free_eofblocks( |
1208 | struct xfs_inode *ip, | 1232 | struct xfs_inode *ip, |
@@ -1212,6 +1236,7 @@ xfs_inode_free_eofblocks( | |||
1212 | int ret; | 1236 | int ret; |
1213 | struct xfs_eofblocks *eofb = args; | 1237 | struct xfs_eofblocks *eofb = args; |
1214 | bool need_iolock = true; | 1238 | bool need_iolock = true; |
1239 | int match; | ||
1215 | 1240 | ||
1216 | ASSERT(!eofb || (eofb && eofb->eof_scan_owner != 0)); | 1241 | ASSERT(!eofb || (eofb && eofb->eof_scan_owner != 0)); |
1217 | 1242 | ||
@@ -1231,7 +1256,11 @@ xfs_inode_free_eofblocks( | |||
1231 | return 0; | 1256 | return 0; |
1232 | 1257 | ||
1233 | if (eofb) { | 1258 | if (eofb) { |
1234 | if (!xfs_inode_match_id(ip, eofb)) | 1259 | if (eofb->eof_flags & XFS_EOF_FLAGS_UNION) |
1260 | match = xfs_inode_match_id_union(ip, eofb); | ||
1261 | else | ||
1262 | match = xfs_inode_match_id(ip, eofb); | ||
1263 | if (!match) | ||
1235 | return 0; | 1264 | return 0; |
1236 | 1265 | ||
1237 | /* skip the inode if the file size is too small */ | 1266 | /* skip the inode if the file size is too small */ |