|
@@ -1899,3 +1899,34 @@ void inode_dio_done(struct inode *inode)
|
|
wake_up_bit(&inode->i_state, __I_DIO_WAKEUP);
|
|
wake_up_bit(&inode->i_state, __I_DIO_WAKEUP);
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(inode_dio_done);
|
|
EXPORT_SYMBOL(inode_dio_done);
|
|
|
|
+
|
|
|
|
+/*
|
|
|
|
+ * inode_set_flags - atomically set some inode flags
|
|
|
|
+ *
|
|
|
|
+ * Note: the caller should be holding i_mutex, or else be sure that
|
|
|
|
+ * they have exclusive access to the inode structure (i.e., while the
|
|
|
|
+ * inode is being instantiated). The reason for the cmpxchg() loop
|
|
|
|
+ * --- which wouldn't be necessary if all code paths which modify
|
|
|
|
+ * i_flags actually followed this rule, is that there is at least one
|
|
|
|
+ * code path which doesn't today --- for example,
|
|
|
|
+ * __generic_file_aio_write() calls file_remove_suid() without holding
|
|
|
|
+ * i_mutex --- so we use cmpxchg() out of an abundance of caution.
|
|
|
|
+ *
|
|
|
|
+ * In the long run, i_mutex is overkill, and we should probably look
|
|
|
|
+ * at using the i_lock spinlock to protect i_flags, and then make sure
|
|
|
|
+ * it is so documented in include/linux/fs.h and that all code follows
|
|
|
|
+ * the locking convention!!
|
|
|
|
+ */
|
|
|
|
+void inode_set_flags(struct inode *inode, unsigned int flags,
|
|
|
|
+ unsigned int mask)
|
|
|
|
+{
|
|
|
|
+ unsigned int old_flags, new_flags;
|
|
|
|
+
|
|
|
|
+ WARN_ON_ONCE(flags & ~mask);
|
|
|
|
+ do {
|
|
|
|
+ old_flags = ACCESS_ONCE(inode->i_flags);
|
|
|
|
+ new_flags = (old_flags & ~mask) | flags;
|
|
|
|
+ } while (unlikely(cmpxchg(&inode->i_flags, old_flags,
|
|
|
|
+ new_flags) != old_flags));
|
|
|
|
+}
|
|
|
|
+EXPORT_SYMBOL(inode_set_flags);
|