Commit d3426a6e authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'xfs-6.11-fixes-1' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux

Pull xfs fixes from Chandan Babu:

 - Fix memory leak when corruption is detected during scrubbing parent
   pointers

 - Allow SECURE namespace xattrs to use reserved block pool to in order
   to prevent ENOSPC

 - Save stack space by passing tracepoint's char array to file_path()
   instead of another stack variable

 - Remove unused parameter in macro XFS_DQUOT_LOGRES

 - Replace comma with semicolon in a couple of places

* tag 'xfs-6.11-fixes-1' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux:
  xfs: convert comma to semicolon
  xfs: convert comma to semicolon
  xfs: remove unused parameter in macro XFS_DQUOT_LOGRES
  xfs: fix file_path handling in tracepoints
  xfs: allow SECURE namespace xattrs to use reserved block pool
  xfs: fix a memory leak
parents 1dd950f2 7bf888fa
...@@ -56,7 +56,7 @@ typedef uint8_t xfs_dqtype_t; ...@@ -56,7 +56,7 @@ typedef uint8_t xfs_dqtype_t;
* And, of course, we also need to take into account the dquot log format item * And, of course, we also need to take into account the dquot log format item
* used to describe each dquot. * used to describe each dquot.
*/ */
#define XFS_DQUOT_LOGRES(mp) \ #define XFS_DQUOT_LOGRES \
((sizeof(struct xfs_dq_logformat) + sizeof(struct xfs_disk_dquot)) * 6) ((sizeof(struct xfs_dq_logformat) + sizeof(struct xfs_disk_dquot)) * 6)
#define XFS_IS_QUOTA_ON(mp) ((mp)->m_qflags & XFS_ALL_QUOTA_ACCT) #define XFS_IS_QUOTA_ON(mp) ((mp)->m_qflags & XFS_ALL_QUOTA_ACCT)
......
...@@ -338,11 +338,11 @@ xfs_calc_write_reservation( ...@@ -338,11 +338,11 @@ xfs_calc_write_reservation(
blksz); blksz);
t1 += adj; t1 += adj;
t3 += adj; t3 += adj;
return XFS_DQUOT_LOGRES(mp) + max3(t1, t2, t3); return XFS_DQUOT_LOGRES + max3(t1, t2, t3);
} }
t4 = xfs_calc_refcountbt_reservation(mp, 1); t4 = xfs_calc_refcountbt_reservation(mp, 1);
return XFS_DQUOT_LOGRES(mp) + max(t4, max3(t1, t2, t3)); return XFS_DQUOT_LOGRES + max(t4, max3(t1, t2, t3));
} }
unsigned int unsigned int
...@@ -410,11 +410,11 @@ xfs_calc_itruncate_reservation( ...@@ -410,11 +410,11 @@ xfs_calc_itruncate_reservation(
xfs_refcountbt_block_count(mp, 4), xfs_refcountbt_block_count(mp, 4),
blksz); blksz);
return XFS_DQUOT_LOGRES(mp) + max3(t1, t2, t3); return XFS_DQUOT_LOGRES + max3(t1, t2, t3);
} }
t4 = xfs_calc_refcountbt_reservation(mp, 2); t4 = xfs_calc_refcountbt_reservation(mp, 2);
return XFS_DQUOT_LOGRES(mp) + max(t4, max3(t1, t2, t3)); return XFS_DQUOT_LOGRES + max(t4, max3(t1, t2, t3));
} }
unsigned int unsigned int
...@@ -466,7 +466,7 @@ STATIC uint ...@@ -466,7 +466,7 @@ STATIC uint
xfs_calc_rename_reservation( xfs_calc_rename_reservation(
struct xfs_mount *mp) struct xfs_mount *mp)
{ {
unsigned int overhead = XFS_DQUOT_LOGRES(mp); unsigned int overhead = XFS_DQUOT_LOGRES;
struct xfs_trans_resv *resp = M_RES(mp); struct xfs_trans_resv *resp = M_RES(mp);
unsigned int t1, t2, t3 = 0; unsigned int t1, t2, t3 = 0;
...@@ -577,7 +577,7 @@ STATIC uint ...@@ -577,7 +577,7 @@ STATIC uint
xfs_calc_link_reservation( xfs_calc_link_reservation(
struct xfs_mount *mp) struct xfs_mount *mp)
{ {
unsigned int overhead = XFS_DQUOT_LOGRES(mp); unsigned int overhead = XFS_DQUOT_LOGRES;
struct xfs_trans_resv *resp = M_RES(mp); struct xfs_trans_resv *resp = M_RES(mp);
unsigned int t1, t2, t3 = 0; unsigned int t1, t2, t3 = 0;
...@@ -641,7 +641,7 @@ STATIC uint ...@@ -641,7 +641,7 @@ STATIC uint
xfs_calc_remove_reservation( xfs_calc_remove_reservation(
struct xfs_mount *mp) struct xfs_mount *mp)
{ {
unsigned int overhead = XFS_DQUOT_LOGRES(mp); unsigned int overhead = XFS_DQUOT_LOGRES;
struct xfs_trans_resv *resp = M_RES(mp); struct xfs_trans_resv *resp = M_RES(mp);
unsigned int t1, t2, t3 = 0; unsigned int t1, t2, t3 = 0;
...@@ -729,7 +729,7 @@ xfs_calc_icreate_reservation( ...@@ -729,7 +729,7 @@ xfs_calc_icreate_reservation(
struct xfs_mount *mp) struct xfs_mount *mp)
{ {
struct xfs_trans_resv *resp = M_RES(mp); struct xfs_trans_resv *resp = M_RES(mp);
unsigned int overhead = XFS_DQUOT_LOGRES(mp); unsigned int overhead = XFS_DQUOT_LOGRES;
unsigned int t1, t2, t3 = 0; unsigned int t1, t2, t3 = 0;
t1 = xfs_calc_icreate_resv_alloc(mp); t1 = xfs_calc_icreate_resv_alloc(mp);
...@@ -747,7 +747,7 @@ STATIC uint ...@@ -747,7 +747,7 @@ STATIC uint
xfs_calc_create_tmpfile_reservation( xfs_calc_create_tmpfile_reservation(
struct xfs_mount *mp) struct xfs_mount *mp)
{ {
uint res = XFS_DQUOT_LOGRES(mp); uint res = XFS_DQUOT_LOGRES;
res += xfs_calc_icreate_resv_alloc(mp); res += xfs_calc_icreate_resv_alloc(mp);
return res + xfs_calc_iunlink_add_reservation(mp); return res + xfs_calc_iunlink_add_reservation(mp);
...@@ -829,7 +829,7 @@ STATIC uint ...@@ -829,7 +829,7 @@ STATIC uint
xfs_calc_ifree_reservation( xfs_calc_ifree_reservation(
struct xfs_mount *mp) struct xfs_mount *mp)
{ {
return XFS_DQUOT_LOGRES(mp) + return XFS_DQUOT_LOGRES +
xfs_calc_inode_res(mp, 1) + xfs_calc_inode_res(mp, 1) +
xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) + xfs_calc_buf_res(3, mp->m_sb.sb_sectsize) +
xfs_calc_iunlink_remove_reservation(mp) + xfs_calc_iunlink_remove_reservation(mp) +
...@@ -846,7 +846,7 @@ STATIC uint ...@@ -846,7 +846,7 @@ STATIC uint
xfs_calc_ichange_reservation( xfs_calc_ichange_reservation(
struct xfs_mount *mp) struct xfs_mount *mp)
{ {
return XFS_DQUOT_LOGRES(mp) + return XFS_DQUOT_LOGRES +
xfs_calc_inode_res(mp, 1) + xfs_calc_inode_res(mp, 1) +
xfs_calc_buf_res(1, mp->m_sb.sb_sectsize); xfs_calc_buf_res(1, mp->m_sb.sb_sectsize);
...@@ -955,7 +955,7 @@ STATIC uint ...@@ -955,7 +955,7 @@ STATIC uint
xfs_calc_addafork_reservation( xfs_calc_addafork_reservation(
struct xfs_mount *mp) struct xfs_mount *mp)
{ {
return XFS_DQUOT_LOGRES(mp) + return XFS_DQUOT_LOGRES +
xfs_calc_inode_res(mp, 1) + xfs_calc_inode_res(mp, 1) +
xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) + xfs_calc_buf_res(2, mp->m_sb.sb_sectsize) +
xfs_calc_buf_res(1, mp->m_dir_geo->blksize) + xfs_calc_buf_res(1, mp->m_dir_geo->blksize) +
...@@ -1003,7 +1003,7 @@ STATIC uint ...@@ -1003,7 +1003,7 @@ STATIC uint
xfs_calc_attrsetm_reservation( xfs_calc_attrsetm_reservation(
struct xfs_mount *mp) struct xfs_mount *mp)
{ {
return XFS_DQUOT_LOGRES(mp) + return XFS_DQUOT_LOGRES +
xfs_calc_inode_res(mp, 1) + xfs_calc_inode_res(mp, 1) +
xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) + xfs_calc_buf_res(1, mp->m_sb.sb_sectsize) +
xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, XFS_FSB_TO_B(mp, 1)); xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, XFS_FSB_TO_B(mp, 1));
...@@ -1043,7 +1043,7 @@ STATIC uint ...@@ -1043,7 +1043,7 @@ STATIC uint
xfs_calc_attrrm_reservation( xfs_calc_attrrm_reservation(
struct xfs_mount *mp) struct xfs_mount *mp)
{ {
return XFS_DQUOT_LOGRES(mp) + return XFS_DQUOT_LOGRES +
max((xfs_calc_inode_res(mp, 1) + max((xfs_calc_inode_res(mp, 1) +
xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH, xfs_calc_buf_res(XFS_DA_NODE_MAXDEPTH,
XFS_FSB_TO_B(mp, 1)) + XFS_FSB_TO_B(mp, 1)) +
......
...@@ -696,7 +696,7 @@ xrep_agfl_init_header( ...@@ -696,7 +696,7 @@ xrep_agfl_init_header(
* step. * step.
*/ */
xagb_bitmap_init(&af.used_extents); xagb_bitmap_init(&af.used_extents);
af.agfl_bno = xfs_buf_to_agfl_bno(agfl_bp), af.agfl_bno = xfs_buf_to_agfl_bno(agfl_bp);
xagb_bitmap_walk(agfl_extents, xrep_agfl_fill, &af); xagb_bitmap_walk(agfl_extents, xrep_agfl_fill, &af);
error = xagb_bitmap_disunion(agfl_extents, &af.used_extents); error = xagb_bitmap_disunion(agfl_extents, &af.used_extents);
if (error) if (error)
......
...@@ -799,7 +799,7 @@ xchk_parent_pptr( ...@@ -799,7 +799,7 @@ xchk_parent_pptr(
} }
if (pp->sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT) if (pp->sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT)
goto out_pp; goto out_names;
/* /*
* Complain if the number of parent pointers doesn't match the link * Complain if the number of parent pointers doesn't match the link
......
...@@ -959,18 +959,16 @@ TRACE_EVENT(xfile_create, ...@@ -959,18 +959,16 @@ TRACE_EVENT(xfile_create,
TP_STRUCT__entry( TP_STRUCT__entry(
__field(dev_t, dev) __field(dev_t, dev)
__field(unsigned long, ino) __field(unsigned long, ino)
__array(char, pathname, 256) __array(char, pathname, MAXNAMELEN)
), ),
TP_fast_assign( TP_fast_assign(
char pathname[257];
char *path; char *path;
__entry->ino = file_inode(xf->file)->i_ino; __entry->ino = file_inode(xf->file)->i_ino;
memset(pathname, 0, sizeof(pathname)); path = file_path(xf->file, __entry->pathname, MAXNAMELEN);
path = file_path(xf->file, pathname, sizeof(pathname) - 1);
if (IS_ERR(path)) if (IS_ERR(path))
path = "(unknown)"; strncpy(__entry->pathname, "(unknown)",
strncpy(__entry->pathname, path, sizeof(__entry->pathname)); sizeof(__entry->pathname));
), ),
TP_printk("xfino 0x%lx path '%s'", TP_printk("xfino 0x%lx path '%s'",
__entry->ino, __entry->ino,
......
...@@ -139,7 +139,7 @@ xfs_attr_shortform_list( ...@@ -139,7 +139,7 @@ xfs_attr_shortform_list(
sbp->name = sfe->nameval; sbp->name = sfe->nameval;
sbp->namelen = sfe->namelen; sbp->namelen = sfe->namelen;
/* These are bytes, and both on-disk, don't endian-flip */ /* These are bytes, and both on-disk, don't endian-flip */
sbp->value = &sfe->nameval[sfe->namelen], sbp->value = &sfe->nameval[sfe->namelen];
sbp->valuelen = sfe->valuelen; sbp->valuelen = sfe->valuelen;
sbp->flags = sfe->flags; sbp->flags = sfe->flags;
sbp->hash = xfs_attr_hashval(dp->i_mount, sfe->flags, sbp->hash = xfs_attr_hashval(dp->i_mount, sfe->flags,
......
...@@ -4715,20 +4715,18 @@ TRACE_EVENT(xmbuf_create, ...@@ -4715,20 +4715,18 @@ TRACE_EVENT(xmbuf_create,
TP_STRUCT__entry( TP_STRUCT__entry(
__field(dev_t, dev) __field(dev_t, dev)
__field(unsigned long, ino) __field(unsigned long, ino)
__array(char, pathname, 256) __array(char, pathname, MAXNAMELEN)
), ),
TP_fast_assign( TP_fast_assign(
char pathname[257];
char *path; char *path;
struct file *file = btp->bt_file; struct file *file = btp->bt_file;
__entry->dev = btp->bt_mount->m_super->s_dev; __entry->dev = btp->bt_mount->m_super->s_dev;
__entry->ino = file_inode(file)->i_ino; __entry->ino = file_inode(file)->i_ino;
memset(pathname, 0, sizeof(pathname)); path = file_path(file, __entry->pathname, MAXNAMELEN);
path = file_path(file, pathname, sizeof(pathname) - 1);
if (IS_ERR(path)) if (IS_ERR(path))
path = "(unknown)"; strncpy(__entry->pathname, "(unknown)",
strncpy(__entry->pathname, path, sizeof(__entry->pathname)); sizeof(__entry->pathname));
), ),
TP_printk("dev %d:%d xmino 0x%lx path '%s'", TP_printk("dev %d:%d xmino 0x%lx path '%s'",
MAJOR(__entry->dev), MINOR(__entry->dev), MAJOR(__entry->dev), MINOR(__entry->dev),
......
...@@ -110,7 +110,24 @@ xfs_attr_change( ...@@ -110,7 +110,24 @@ xfs_attr_change(
args->whichfork = XFS_ATTR_FORK; args->whichfork = XFS_ATTR_FORK;
xfs_attr_sethash(args); xfs_attr_sethash(args);
return xfs_attr_set(args, op, args->attr_filter & XFS_ATTR_ROOT); /*
* Some xattrs must be resistant to allocation failure at ENOSPC, e.g.
* creating an inode with ACLs or security attributes requires the
* allocation of the xattr holding that information to succeed. Hence
* we allow xattrs in the VFS TRUSTED, SYSTEM, POSIX_ACL and SECURITY
* (LSM xattr) namespaces to dip into the reserve block pool to allow
* manipulation of these xattrs when at ENOSPC. These VFS xattr
* namespaces translate to the XFS_ATTR_ROOT and XFS_ATTR_SECURE on-disk
* namespaces.
*
* For most of these cases, these special xattrs will fit in the inode
* itself and so consume no extra space or only require temporary extra
* space while an overwrite is being made. Hence the use of the reserved
* pool is largely to avoid the worst case reservation from preventing
* the xattr from being created at ENOSPC.
*/
return xfs_attr_set(args, op,
args->attr_filter & (XFS_ATTR_ROOT | XFS_ATTR_SECURE));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment