|
@@ -1905,6 +1905,9 @@ extern bool fs_fully_visible(struct file_system_type *);
|
|
|
|
|
|
extern int current_umask(void);
|
|
|
|
|
|
+extern void ihold(struct inode * inode);
|
|
|
+extern void iput(struct inode *);
|
|
|
+
|
|
|
/* /sys/fs */
|
|
|
extern struct kobject *fs_kobj;
|
|
|
|
|
@@ -1972,6 +1975,28 @@ static inline int break_deleg(struct inode *inode, unsigned int mode)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static inline int try_break_deleg(struct inode *inode, struct inode **delegated_inode)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = break_deleg(inode, O_WRONLY|O_NONBLOCK);
|
|
|
+ if (ret == -EWOULDBLOCK && delegated_inode) {
|
|
|
+ *delegated_inode = inode;
|
|
|
+ ihold(inode);
|
|
|
+ }
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
+static inline int break_deleg_wait(struct inode **delegated_inode)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = break_deleg(*delegated_inode, O_WRONLY);
|
|
|
+ iput(*delegated_inode);
|
|
|
+ *delegated_inode = NULL;
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+
|
|
|
#else /* !CONFIG_FILE_LOCKING */
|
|
|
static inline int locks_mandatory_locked(struct inode *inode)
|
|
|
{
|
|
@@ -2015,6 +2040,18 @@ static inline int break_deleg(struct inode *inode, unsigned int mode)
|
|
|
{
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+static inline int try_break_deleg(struct inode *inode, struct inode **delegated_inode)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static inline int break_deleg_wait(struct inode **delegated_inode)
|
|
|
+{
|
|
|
+ BUG();
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
#endif /* CONFIG_FILE_LOCKING */
|
|
|
|
|
|
/* fs/open.c */
|
|
@@ -2350,8 +2387,6 @@ extern loff_t vfs_llseek(struct file *file, loff_t offset, int whence);
|
|
|
extern int inode_init_always(struct super_block *, struct inode *);
|
|
|
extern void inode_init_once(struct inode *);
|
|
|
extern void address_space_init_once(struct address_space *mapping);
|
|
|
-extern void ihold(struct inode * inode);
|
|
|
-extern void iput(struct inode *);
|
|
|
extern struct inode * igrab(struct inode *);
|
|
|
extern ino_t iunique(struct super_block *, ino_t);
|
|
|
extern int inode_needs_sync(struct inode *inode);
|