/* * PTP 1588 clock support - support for timestamping in PHY devices * * Copyright (C) 2010 OMICRON electronics GmbH * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include static unsigned int classify(const struct sk_buff *skb) { if (likely(skb->dev && skb->dev->phydev && skb->dev->phydev->drv)) return ptp_classify_raw(skb); else return PTP_CLASS_NONE; } void skb_clone_tx_timestamp(struct sk_buff *skb) { struct phy_device *phydev; struct sk_buff *clone; unsigned int type; if (!skb->sk) return; type = classify(skb); if (type == PTP_CLASS_NONE) return; phydev = skb->dev->phydev; if (likely(phydev->drv->txtstamp)) { clone = skb_clone_sk(skb); if (!clone) return; phydev->drv->txtstamp(phydev, clone, type); } } EXPORT_SYMBOL_GPL(skb_clone_tx_timestamp); bool skb_defer_rx_timestamp(struct sk_buff *skb) { struct phy_device *phydev; unsigned int type; if (!skb->dev || !skb->dev->phydev || !skb->dev->phydev->drv) return false; if (skb_headroom(skb) < ETH_HLEN) return false; __skb_push(skb, ETH_HLEN); type = ptp_classify_raw(skb); __skb_pull(skb, ETH_HLEN); if (type == PTP_CLASS_NONE) return false; phydev = skb->dev->phydev; if (likely(phydev->drv->rxtstamp)) return phydev->drv->rxtstamp(phydev, skb, type); return false; } EXPORT_SYMBOL_GPL(skb_defer_rx_timestamp); value='1fdf41941b8010691679638f8d0c8d08cfee7726'/>
diff options
context:
space:
mode:
authorOmar Sandoval <osandov@fb.com>2017-01-25 17:06:39 -0800
committerChris Mason <clm@fb.com>2017-01-26 15:48:55 -0800
commit1fdf41941b8010691679638f8d0c8d08cfee7726 (patch)
treea30a3e78422bb68feae6e32ad13db1327bc95a67
parent67ade058ef2c65a3e56878af9c293ec76722a2e5 (diff)
Btrfs: disable xattr operations on subvolume directories
When you snapshot a subvolume containing a subvolume, you get a placeholder directory where the subvolume would be. These directory inodes have ->i_ops set to btrfs_dir_ro_inode_operations. Previously, these i_ops didn't include the xattr operation callbacks. The conversion to xattr_handlers missed this case, leading to bogus attempts to set xattrs on these inodes. This manifested itself as failures when running delayed inodes. To fix this, clear IOP_XATTR in ->i_opflags on these inodes. Fixes: 6c6ef9f26e59 ("xattr: Stop calling {get,set,remove}xattr inode operations") Cc: Andreas Gruenbacher <agruenba@redhat.com> Reported-by: Chris Murphy <lists@colorremedies.com> Tested-by: Chris Murphy <lists@colorremedies.com> Cc: <stable@vger.kernel.org> # 4.9.x Signed-off-by: Omar Sandoval <osandov@fb.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: Chris Mason <clm@fb.com>